diff --git a/parser/nodes.h b/parser/nodes.h index 855ced6..523e3cb 100644 --- a/parser/nodes.h +++ b/parser/nodes.h @@ -166,12 +166,27 @@ class RotateNode : public VectorNode double m_angle; }; +class RotateBlockNode : public RotateNode +{ + public: + RotateBlockNode(double angle, refptr vector) + : RotateNode(angle, vector) + { + } +}; + class ScaleNode : public VectorNode { public: ScaleNode(refptr vector) : VectorNode(vector) {} }; +class ScaleBlockNode : public ScaleNode +{ + public: + ScaleBlockNode(refptr vector) : ScaleNode(vector) {} +}; + class SceneNode : public Node { }; @@ -210,6 +225,12 @@ class TranslateNode : public VectorNode TranslateNode(refptr vector) : VectorNode(vector) {} }; +class TranslateBlockNode : public TranslateNode +{ + public: + TranslateBlockNode(refptr vector) : TranslateNode(vector) {} +}; + class UnionNode : public Node { }; diff --git a/parser/parser.yy b/parser/parser.yy index 0c96045..149c0da 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -283,6 +283,7 @@ scene_item: camera { $$ = $1; } | shape { $$ = $1; } | options { $$ = $1; } | light { $$ = $1; } + | transform_block { $$ = $1; } ; shape: plane { $$ = $1; } @@ -342,6 +343,33 @@ transform: TRANSLATE vector { } ; +transform_block: TRANSLATE vector LCURLY transform_block_items RCURLY { + $$ = new TranslateBlockNode($2->getVector()); + $$->addChildren($4); + } + | ROTATE number COMMA vector LCURLY transform_block_items RCURLY { + $$ = new RotateBlockNode($2->getNumber(), $4->getVector()); + $$->addChildren($6); + } + | SCALE vector LCURLY transform_block_items RCURLY { + $$ = new ScaleBlockNode($2->getVector()); + $$->addChildren($4); + } + ; + +transform_block_items: /* empty */ + | transform_block_item transform_block_items { + $$ = new ItemsNode(); + $$->addChild($1); + $$->addChildren($2); + } + ; + +transform_block_item: transform_block { $$ = $1; } + | light { $$ = $1; } + | shape { $$ = $1; } + ; + union: UNION LCURLY shape shape shape_items RCURLY { $$ = new UnionNode(); $$->addChild($3);