diff --git a/parser/nodes.h b/parser/nodes.h index f93ba5f..855ced6 100644 --- a/parser/nodes.h +++ b/parser/nodes.h @@ -152,6 +152,26 @@ class ReflectanceNode : public NumberNode ReflectanceNode(double d) : NumberNode(d) {} }; +class RotateNode : public VectorNode +{ + public: + RotateNode(double angle, refptr vector) + : VectorNode(vector) + { + m_angle = angle; + } + double getNumber() { return m_angle; } + + protected: + double m_angle; +}; + +class ScaleNode : public VectorNode +{ + public: + ScaleNode(refptr vector) : VectorNode(vector) {} +}; + class SceneNode : public Node { }; @@ -184,6 +204,12 @@ class SubtractNode : public Node { }; +class TranslateNode : public VectorNode +{ + public: + TranslateNode(refptr vector) : VectorNode(vector) {} +}; + class UnionNode : public Node { }; diff --git a/parser/parser.lex b/parser/parser.lex index 73ca8a7..7c7e7c4 100644 --- a/parser/parser.lex +++ b/parser/parser.lex @@ -53,12 +53,15 @@ plane return PLANE; position return POSITION; radius return RADIUS; reflectance return REFLECTANCE; +rotate return ROTATE; +scale return SCALE; scene return SCENE; shininess return SHININESS; size return SIZE; specular return SPECULAR; sphere return SPHERE; subtract return SUBTRACT; +translate return TRANSLATE; union return UNION; up return UP; vfov return VFOV; diff --git a/parser/parser.yy b/parser/parser.yy index e6537a5..0c96045 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -26,7 +26,6 @@ int yywrap() return 1; } - static Scene * g_scene; %} @@ -73,12 +72,15 @@ static Scene * g_scene; %token POSITION; %token RADIUS; %token REFLECTANCE; +%token ROTATE; +%token SCALE; %token SCENE; %token SHININESS; %token SIZE; %token SPECULAR; %token SPHERE; %token SUBTRACT; +%token TRANSLATE; %token UNION; %token UP; %token VFOV; @@ -300,6 +302,7 @@ shape_items: /* empty */ ; shape_item: material { $$ = $1; } + | transform { $$ = $1; } ; sphere: SPHERE LCURLY sphere_items RCURLY { @@ -328,6 +331,17 @@ subtract: SUBTRACT LCURLY shape shape shape_items RCURLY { } ; +transform: TRANSLATE vector { + $$ = new TranslateNode($2->getVector()); + } + | ROTATE number COMMA vector { + $$ = new RotateNode($2->getNumber(), $4->getVector()); + } + | SCALE vector { + $$ = new ScaleNode($2->getVector()); + } + ; + union: UNION LCURLY shape shape shape_items RCURLY { $$ = new UnionNode(); $$->addChild($3);