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) {}
};
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:

View File

@ -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;

View File

@ -67,6 +67,7 @@ static refptr<Node> parsed_scene_node;
%token DEFINE;
%token DIFFUSE;
%token EXPOSURE;
%token EXTRUDE;
%token HEIGHT;
%token INTERSECT;
%token JITTER;
@ -75,8 +76,11 @@ static refptr<Node> 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<Vector> vec = new Vector();
(*vec)[0] = $2->getNumber();
(*vec)[1] = $4->getNumber();
(*vec)[2] = $6->getNumber();
vector2: LESS number COMMA number GREATER {
refptr<Vector> vec =
new Vector($2->getNumber(), $4->getNumber(), 0.0);
$$ = new VectorNode(vec);
}
;
vector3: LESS number COMMA number COMMA number GREATER {
refptr<Vector> vec =
new Vector($2->getNumber(), $4->getNumber(), $6->getNumber());
$$ = new VectorNode(vec);
}
;