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
This commit is contained in:
Josh Holtrop 2010-07-01 15:14:59 +00:00
parent d6c0bf7a25
commit ad017df3b5
3 changed files with 114 additions and 26 deletions

View File

@ -108,6 +108,12 @@ class ExposureNode : public NumberNode
ExposureNode(double d) : NumberNode(d) {} ExposureNode(double d) : NumberNode(d) {}
}; };
class ExtrudeNode : public Node
{
public:
bool isShape() { return true; }
};
class HeightNode : public IntegerNode class HeightNode : public IntegerNode
{ {
public: public:
@ -183,6 +189,18 @@ class MultisampleNode : public IntegerNode
MultisampleNode(int i) : IntegerNode(i) {} 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 class OptionsNode : public Node
{ {
}; };
@ -209,6 +227,10 @@ class PlanePositionNode : public Node
double m_dist; double m_dist;
}; };
class PolygonNode : public Node
{
};
class PositionNode : public VectorNode class PositionNode : public VectorNode
{ {
public: public:

View File

@ -48,6 +48,7 @@ cyl return CYL;
define return DEFINE; define return DEFINE;
diffuse return DIFFUSE; diffuse return DIFFUSE;
exposure return EXPOSURE; exposure return EXPOSURE;
extrude return EXTRUDE;
height return HEIGHT; height return HEIGHT;
intersect return INTERSECT; intersect return INTERSECT;
jitter return JITTER; jitter return JITTER;
@ -56,8 +57,11 @@ look_at return LOOKAT;
material return MATERIAL; material return MATERIAL;
max_depth return MAXDEPTH; max_depth return MAXDEPTH;
multisample return MULTISAMPLE; multisample return MULTISAMPLE;
ngon return NGON;
offset return OFFSET;
options return OPTIONS; options return OPTIONS;
plane return PLANE; plane return PLANE;
polygon return POLYGON;
position return POSITION; position return POSITION;
radius return RADIUS; radius return RADIUS;
reflectance return REFLECTANCE; reflectance return REFLECTANCE;

View File

@ -67,6 +67,7 @@ static refptr<Node> parsed_scene_node;
%token DEFINE; %token DEFINE;
%token DIFFUSE; %token DIFFUSE;
%token EXPOSURE; %token EXPOSURE;
%token EXTRUDE;
%token HEIGHT; %token HEIGHT;
%token INTERSECT; %token INTERSECT;
%token JITTER; %token JITTER;
@ -75,8 +76,11 @@ static refptr<Node> parsed_scene_node;
%token MATERIAL; %token MATERIAL;
%token MAXDEPTH; %token MAXDEPTH;
%token MULTISAMPLE; %token MULTISAMPLE;
%token NGON;
%token OFFSET;
%token OPTIONS; %token OPTIONS;
%token PLANE; %token PLANE;
%token POLYGON;
%token POSITION; %token POSITION;
%token RADIUS; %token RADIUS;
%token REFLECTANCE; %token REFLECTANCE;
@ -132,7 +136,7 @@ box_items: /* empty */
} }
; ;
box_item: SIZE vector { box_item: SIZE vector3 {
$$ = new SizeNode($2->getVector()); $$ = new SizeNode($2->getVector());
} }
| shape_item { $$ = $1; } | shape_item { $$ = $1; }
@ -152,13 +156,13 @@ camera_items: /* empty */
} }
; ;
camera_item: POSITION vector { camera_item: POSITION vector3 {
$$ = new PositionNode($2->getVector()); $$ = new PositionNode($2->getVector());
} }
| LOOKAT vector { | LOOKAT vector3 {
$$ = new LookAtNode($2->getVector()); $$ = new LookAtNode($2->getVector());
} }
| UP vector { | UP vector3 {
$$ = new UpNode($2->getVector()); $$ = new UpNode($2->getVector());
} }
| VFOV number { | VFOV number {
@ -180,12 +184,31 @@ cyl_items: /* empty */
} }
; ;
cyl_item: SIZE vector { cyl_item: SIZE vector3 {
$$ = new SizeNode($2->getVector()); $$ = new SizeNode($2->getVector());
} }
| shape_item { $$ = $1; } | 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 { intersect: INTERSECT LCURLY bool_items RCURLY {
$$ = new IntersectNode(); $$ = new IntersectNode();
$$->addChildren($3); $$->addChildren($3);
@ -211,16 +234,16 @@ light_items: /* empty */
} }
; ;
light_item: POSITION vector { light_item: POSITION vector3 {
$$ = new PositionNode($2->getVector()); $$ = new PositionNode($2->getVector());
} }
| DIFFUSE vector { | DIFFUSE vector3 {
$$ = new DiffuseNode($2->getVector()); $$ = new DiffuseNode($2->getVector());
} }
| SPECULAR vector { | SPECULAR vector3 {
$$ = new SpecularNode($2->getVector()); $$ = new SpecularNode($2->getVector());
} }
| COLOR vector { | COLOR vector3 {
$$ = new ColorNode($2->getVector()); $$ = new ColorNode($2->getVector());
} }
| radius { | radius {
@ -245,16 +268,16 @@ material_items: /* empty */
} }
; ;
material_item: COLOR vector { material_item: COLOR vector3 {
$$ = new ColorNode($2->getVector()); $$ = new ColorNode($2->getVector());
} }
| AMBIENT vector { | AMBIENT vector3 {
$$ = new AmbientNode($2->getVector()); $$ = new AmbientNode($2->getVector());
} }
| DIFFUSE vector { | DIFFUSE vector3 {
$$ = new DiffuseNode($2->getVector()); $$ = new DiffuseNode($2->getVector());
} }
| SPECULAR vector { | SPECULAR vector3 {
$$ = new SpecularNode($2->getVector()); $$ = new SpecularNode($2->getVector());
} }
| REFLECTANCE number { | REFLECTANCE number {
@ -283,6 +306,12 @@ number: DEC_NUMBER { $$ = $1; }
| REAL_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 { options: OPTIONS LCURLY options_items RCURLY {
$$ = new OptionsNode(); $$ = new OptionsNode();
$$->addChildren($3); $$->addChildren($3);
@ -312,7 +341,7 @@ options_item: WIDTH DEC_NUMBER {
| EXPOSURE number { | EXPOSURE number {
$$ = new ExposureNode($2->getNumber()); $$ = new ExposureNode($2->getNumber());
} }
| AMBIENT vector { | AMBIENT vector3 {
$$ = new AmbientNode($2->getVector()); $$ = new AmbientNode($2->getVector());
} }
| AMBIENT_OCCLUSION DEC_NUMBER { | 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()); $$ = new PlanePositionNode($2->getVector(), $4->getNumber());
} }
| shape_item { $$ = $1; } | 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 { radius: RADIUS number {
$$ = new RadiusNode($2->getNumber()); $$ = new RadiusNode($2->getNumber());
} }
@ -368,6 +414,7 @@ shape: plane { $$ = $1; }
| union { $$ = $1; } | union { $$ = $1; }
| intersect { $$ = $1; } | intersect { $$ = $1; }
| subtract { $$ = $1; } | subtract { $$ = $1; }
| extrude { $$ = $1; }
; ;
shape_item: material { $$ = $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()); $$ = new TranslateNode($2->getVector());
} }
| ROTATE number COMMA vector { | ROTATE number COMMA vector3 {
$$ = new RotateNode($2->getNumber(), $4->getVector()); $$ = new RotateNode($2->getNumber(), $4->getVector());
} }
| SCALE vector { | SCALE vector3 {
$$ = new ScaleNode($2->getVector()); $$ = 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()); $$ = new TranslateBlockNode($2->getVector());
$$->addChildren($4); $$->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()); $$ = new RotateBlockNode($2->getNumber(), $4->getVector());
$$->addChildren($6); $$->addChildren($6);
} }
| SCALE vector LCURLY transform_block_items RCURLY { | SCALE vector3 LCURLY transform_block_items RCURLY {
$$ = new ScaleBlockNode($2->getVector()); $$ = new ScaleBlockNode($2->getVector());
$$->addChildren($4); $$->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 */ transform_block_items: /* empty */
@ -443,11 +500,16 @@ union: UNION LCURLY bool_items RCURLY {
} }
; ;
vector: LESS number COMMA number COMMA number GREATER { vector2: LESS number COMMA number GREATER {
refptr<Vector> vec = new Vector(); refptr<Vector> vec =
(*vec)[0] = $2->getNumber(); new Vector($2->getNumber(), $4->getNumber(), 0.0);
(*vec)[1] = $4->getNumber(); $$ = new VectorNode(vec);
(*vec)[2] = $6->getNumber(); }
;
vector3: LESS number COMMA number COMMA number GREATER {
refptr<Vector> vec =
new Vector($2->getNumber(), $4->getNumber(), $6->getNumber());
$$ = new VectorNode(vec); $$ = new VectorNode(vec);
} }
; ;