From ad017df3b54f6495335c6cfcde352470ff6f9539 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Thu, 1 Jul 2010 15:14:59 +0000 Subject: [PATCH] added extrude, offset, polygon, ngon to parser; changed items accepting SCALE vector to also accept SCALE number (ex: "scale 3.2" instead of "scale <3.2, 3.2, 3.2>") git-svn-id: svn://anubis/fart/trunk@268 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- parser/nodes.h | 22 +++++++++ parser/parser.lex | 4 ++ parser/parser.yy | 114 +++++++++++++++++++++++++++++++++++----------- 3 files changed, 114 insertions(+), 26 deletions(-) diff --git a/parser/nodes.h b/parser/nodes.h index 4144f4c..67d802c 100644 --- a/parser/nodes.h +++ b/parser/nodes.h @@ -108,6 +108,12 @@ class ExposureNode : public NumberNode ExposureNode(double d) : NumberNode(d) {} }; +class ExtrudeNode : public Node +{ + public: + bool isShape() { return true; } +}; + class HeightNode : public IntegerNode { public: @@ -183,6 +189,18 @@ class MultisampleNode : public IntegerNode MultisampleNode(int i) : IntegerNode(i) {} }; +class NGonNode : public IntegerNode +{ + public: + NGonNode(int i) : IntegerNode(i) {} +}; + +class OffsetNode : public NumberNode +{ + public: + OffsetNode(double d) : NumberNode(d) {} +}; + class OptionsNode : public Node { }; @@ -209,6 +227,10 @@ class PlanePositionNode : public Node double m_dist; }; +class PolygonNode : public Node +{ +}; + class PositionNode : public VectorNode { public: diff --git a/parser/parser.lex b/parser/parser.lex index 5ed4437..0b7130a 100644 --- a/parser/parser.lex +++ b/parser/parser.lex @@ -48,6 +48,7 @@ cyl return CYL; define return DEFINE; diffuse return DIFFUSE; exposure return EXPOSURE; +extrude return EXTRUDE; height return HEIGHT; intersect return INTERSECT; jitter return JITTER; @@ -56,8 +57,11 @@ look_at return LOOKAT; material return MATERIAL; max_depth return MAXDEPTH; multisample return MULTISAMPLE; +ngon return NGON; +offset return OFFSET; options return OPTIONS; plane return PLANE; +polygon return POLYGON; position return POSITION; radius return RADIUS; reflectance return REFLECTANCE; diff --git a/parser/parser.yy b/parser/parser.yy index ee42281..0cc1ebc 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -67,6 +67,7 @@ static refptr parsed_scene_node; %token DEFINE; %token DIFFUSE; %token EXPOSURE; +%token EXTRUDE; %token HEIGHT; %token INTERSECT; %token JITTER; @@ -75,8 +76,11 @@ static refptr parsed_scene_node; %token MATERIAL; %token MAXDEPTH; %token MULTISAMPLE; +%token NGON; +%token OFFSET; %token OPTIONS; %token PLANE; +%token POLYGON; %token POSITION; %token RADIUS; %token REFLECTANCE; @@ -132,7 +136,7 @@ box_items: /* empty */ } ; -box_item: SIZE vector { +box_item: SIZE vector3 { $$ = new SizeNode($2->getVector()); } | shape_item { $$ = $1; } @@ -152,13 +156,13 @@ camera_items: /* empty */ } ; -camera_item: POSITION vector { +camera_item: POSITION vector3 { $$ = new PositionNode($2->getVector()); } - | LOOKAT vector { + | LOOKAT vector3 { $$ = new LookAtNode($2->getVector()); } - | UP vector { + | UP vector3 { $$ = new UpNode($2->getVector()); } | VFOV number { @@ -180,12 +184,31 @@ cyl_items: /* empty */ } ; -cyl_item: SIZE vector { +cyl_item: SIZE vector3 { $$ = new SizeNode($2->getVector()); } | shape_item { $$ = $1; } ; +extrude: EXTRUDE LCURLY extrude_items RCURLY { + $$ = new ExtrudeNode(); + $$->addChildren($3); + } + ; + +extrude_items: /* empty */ + | extrude_item extrude_items { + $$ = new ItemsNode(); + $$->addChild($1); + $$->addChildren($2); + } + ; + +extrude_item: polygon { $$ = $1; } + | ngon { $$ = $1; } + | offset { $$ = $1; } + ; + intersect: INTERSECT LCURLY bool_items RCURLY { $$ = new IntersectNode(); $$->addChildren($3); @@ -211,16 +234,16 @@ light_items: /* empty */ } ; -light_item: POSITION vector { +light_item: POSITION vector3 { $$ = new PositionNode($2->getVector()); } - | DIFFUSE vector { + | DIFFUSE vector3 { $$ = new DiffuseNode($2->getVector()); } - | SPECULAR vector { + | SPECULAR vector3 { $$ = new SpecularNode($2->getVector()); } - | COLOR vector { + | COLOR vector3 { $$ = new ColorNode($2->getVector()); } | radius { @@ -245,16 +268,16 @@ material_items: /* empty */ } ; -material_item: COLOR vector { +material_item: COLOR vector3 { $$ = new ColorNode($2->getVector()); } - | AMBIENT vector { + | AMBIENT vector3 { $$ = new AmbientNode($2->getVector()); } - | DIFFUSE vector { + | DIFFUSE vector3 { $$ = new DiffuseNode($2->getVector()); } - | SPECULAR vector { + | SPECULAR vector3 { $$ = new SpecularNode($2->getVector()); } | REFLECTANCE number { @@ -283,6 +306,12 @@ number: DEC_NUMBER { $$ = $1; } | REAL_NUMBER { $$ = $1; } ; +ngon: NGON DEC_NUMBER { $$ = new NGonNode($2->getInteger()); } + ; + +offset: OFFSET number { $$ = new OffsetNode($2->getNumber()); } + ; + options: OPTIONS LCURLY options_items RCURLY { $$ = new OptionsNode(); $$->addChildren($3); @@ -312,7 +341,7 @@ options_item: WIDTH DEC_NUMBER { | EXPOSURE number { $$ = new ExposureNode($2->getNumber()); } - | AMBIENT vector { + | AMBIENT vector3 { $$ = new AmbientNode($2->getVector()); } | AMBIENT_OCCLUSION DEC_NUMBER { @@ -334,12 +363,29 @@ plane_items: /* empty */ } ; -plane_item: POSITION vector COMMA number { +plane_item: POSITION vector3 COMMA number { $$ = new PlanePositionNode($2->getVector(), $4->getNumber()); } | shape_item { $$ = $1; } ; +polygon: POLYGON LCURLY polygon_items RCURLY { + $$ = new PolygonNode(); + $$->addChildren($3); + } + ; + +polygon_items: /* empty */ + | polygon_item polygon_items { + $$ = new ItemsNode(); + $$->addChild($1); + $$->addChildren($2); + } + ; + +polygon_item: vector2 { $$ = $1; } + ; + radius: RADIUS number { $$ = new RadiusNode($2->getNumber()); } @@ -368,6 +414,7 @@ shape: plane { $$ = $1; } | union { $$ = $1; } | intersect { $$ = $1; } | subtract { $$ = $1; } + | extrude { $$ = $1; } ; shape_item: material { $$ = $1; } @@ -399,29 +446,39 @@ subtract: SUBTRACT LCURLY bool_items RCURLY { } ; -transform: TRANSLATE vector { +transform: TRANSLATE vector3 { $$ = new TranslateNode($2->getVector()); } - | ROTATE number COMMA vector { + | ROTATE number COMMA vector3 { $$ = new RotateNode($2->getNumber(), $4->getVector()); } - | SCALE vector { + | SCALE vector3 { $$ = new ScaleNode($2->getVector()); } + | SCALE number { + $$ = new ScaleNode(new Vector($2->getNumber(), + $2->getNumber(), $2->getNumber())); + } ; -transform_block: TRANSLATE vector LCURLY transform_block_items RCURLY { +transform_block: TRANSLATE vector3 LCURLY transform_block_items RCURLY { $$ = new TranslateBlockNode($2->getVector()); $$->addChildren($4); } - | ROTATE number COMMA vector LCURLY transform_block_items RCURLY { + | ROTATE number COMMA vector3 LCURLY transform_block_items RCURLY { $$ = new RotateBlockNode($2->getNumber(), $4->getVector()); $$->addChildren($6); } - | SCALE vector LCURLY transform_block_items RCURLY { + | SCALE vector3 LCURLY transform_block_items RCURLY { $$ = new ScaleBlockNode($2->getVector()); $$->addChildren($4); } + | SCALE number LCURLY transform_block_items RCURLY { + $$ = new ScaleBlockNode( + new Vector($2->getNumber(), $2->getNumber(), + $2->getNumber())); + $$->addChildren($4); + } ; transform_block_items: /* empty */ @@ -443,11 +500,16 @@ union: UNION LCURLY bool_items RCURLY { } ; -vector: LESS number COMMA number COMMA number GREATER { - refptr vec = new Vector(); - (*vec)[0] = $2->getNumber(); - (*vec)[1] = $4->getNumber(); - (*vec)[2] = $6->getNumber(); +vector2: LESS number COMMA number GREATER { + refptr vec = + new Vector($2->getNumber(), $4->getNumber(), 0.0); + $$ = new VectorNode(vec); + } + ; + +vector3: LESS number COMMA number COMMA number GREATER { + refptr vec = + new Vector($2->getNumber(), $4->getNumber(), $6->getNumber()); $$ = new VectorNode(vec); } ;