From 2f825f29f911750d7aaf038657c9bf407a6bbd3a Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 29 Sep 2010 19:30:14 +0000 Subject: [PATCH] moved computation of numbers and vectors from parser.yy to Scene-load.cc git-svn-id: svn://anubis/fart/branches/scene-file-scripting@318 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- parser/nodes.h | 118 +++++++++++++++++++++++++++++------------------ parser/parser.yy | 86 ++++++++++++++++------------------ 2 files changed, 113 insertions(+), 91 deletions(-) diff --git a/parser/nodes.h b/parser/nodes.h index edca3b4..cd1662a 100644 --- a/parser/nodes.h +++ b/parser/nodes.h @@ -46,28 +46,60 @@ class IntegerNode : public Node class NumberNode : public Node { public: - NumberNode(double number) { m_number = number; } - double getNumber() { return m_number; } + NumberNode(double number) + { + m_number = number; + m_direct = true; + } + NumberNode(refptr expr) + { + addChild(expr); + m_direct = false; + } + double getNumber() + { + return m_direct ? m_number : m_children[0]->getNumber(); + } protected: double m_number; + bool m_direct; }; class VectorNode : public Node { public: - VectorNode(refptr vector) { m_vector = vector; } - refptr getVector() { return m_vector; } - - protected: - refptr m_vector; + VectorNode(refptr a, refptr b, refptr c) + { + addChild(a); + addChild(b); + addChild(c); + } + VectorNode(refptr node) + { + addChild(node); + } + refptr getVector() + { + if (m_children.size() == 1) + { + return m_children[0]->getVector(); + } + else if (m_children.size() == 3) + { + return new Vector( + m_children[0]->getNumber(), + m_children[1]->getNumber(), + m_children[2]->getNumber()); + } + return NULL; + } }; - class AmbientNode : public VectorNode { public: - AmbientNode(refptr vector) : VectorNode(vector) {} + AmbientNode(refptr vector) : VectorNode(vector) {} }; class AmbientOcclusionNode : public IntegerNode @@ -89,7 +121,7 @@ class CameraNode : public Node class ColorNode : public VectorNode { public: - ColorNode(refptr vector) : VectorNode(vector) {} + ColorNode(refptr vector) : VectorNode(vector) {} }; class CylNode : public Node @@ -101,13 +133,13 @@ class CylNode : public Node class DiffuseNode : public VectorNode { public: - DiffuseNode(refptr vector) : VectorNode(vector) {} + DiffuseNode(refptr vector) : VectorNode(vector) {} }; class ExposureNode : public NumberNode { public: - ExposureNode(double d) : NumberNode(d) {} + ExposureNode(refptr e) : NumberNode(e) {} }; class ExtrudeNode : public Node @@ -144,10 +176,10 @@ class ItemsNode : public Node { }; -class JitterNode : public IntegerNode +class JitterNode : public NumberNode { public: - JitterNode(int i) : IntegerNode(i) {} + JitterNode(refptr e) : NumberNode(e) {} }; class LightNode : public Node @@ -157,7 +189,7 @@ class LightNode : public Node class LookAtNode : public VectorNode { public: - LookAtNode(refptr vector) : VectorNode(vector) {} + LookAtNode(refptr vector) : VectorNode(vector) {} }; class MaterialNode : public Node @@ -191,16 +223,16 @@ class MultisampleNode : public IntegerNode MultisampleNode(int i) : IntegerNode(i) {} }; -class NGonNode : public IntegerNode +class NGonNode : public NumberNode { public: - NGonNode(int i) : IntegerNode(i) {} + NGonNode(refptr e) : NumberNode(e) {} }; class OffsetNode : public NumberNode { public: - OffsetNode(double d) : NumberNode(d) {} + OffsetNode(refptr e) : NumberNode(e) {} }; class OptionsNode : public Node @@ -213,20 +245,18 @@ class PlaneNode : public Node bool isShape() { return true; } }; -class PlanePositionNode : public Node +class PlanePositionNode : public VectorNode { public: - PlanePositionNode(refptr vec, double dist) + PlanePositionNode(refptr vec_node, refptr dist) + : VectorNode(vec_node) { - m_vector = vec; m_dist = dist; } - refptr getVector() { return m_vector; } - double getNumber() { return m_dist; } + double getNumber() { return m_dist->getNumber(); } protected: - refptr m_vector; - double m_dist; + refptr m_dist; }; class PolygonNode : public Node @@ -236,53 +266,53 @@ class PolygonNode : public Node class PositionNode : public VectorNode { public: - PositionNode(refptr vector) : VectorNode(vector) {} + PositionNode(refptr vector) : VectorNode(vector) {} }; class RadiusNode : public NumberNode { public: - RadiusNode(double d) : NumberNode(d) {} + RadiusNode(refptr e) : NumberNode(e) {} }; class ReflectanceNode : public NumberNode { public: - ReflectanceNode(double d) : NumberNode(d) {} + ReflectanceNode(refptr e) : NumberNode(e) {} }; class RotateNode : public VectorNode { public: - RotateNode(double angle, refptr vector) - : VectorNode(vector) + RotateNode(refptr angle, refptr vec_node) + : VectorNode(vec_node) { m_angle = angle; } - double getNumber() { return m_angle; } + double getNumber() { return m_angle->getNumber(); } protected: - double m_angle; + refptr m_angle; }; class RotateBlockNode : public RotateNode { public: - RotateBlockNode(double angle, refptr vector) - : RotateNode(angle, vector) {} + RotateBlockNode(refptr angle, refptr vec_node) + : RotateNode(angle, vec_node) {} bool isTransformBlock() { return true; } }; class ScaleNode : public VectorNode { public: - ScaleNode(refptr vector) : VectorNode(vector) {} + ScaleNode(refptr vector) : VectorNode(vector) {} }; class ScaleBlockNode : public ScaleNode { public: - ScaleBlockNode(refptr vector) : ScaleNode(vector) {} + ScaleBlockNode(refptr vector) : ScaleNode(vector) {} bool isTransformBlock() { return true; } }; @@ -306,19 +336,19 @@ class ShapeRefNode : public IdentifierNode class ShininessNode : public NumberNode { public: - ShininessNode(double d) : NumberNode(d) {} + ShininessNode(refptr e) : NumberNode(e) {} }; class SizeNode : public VectorNode { public: - SizeNode(refptr vector) : VectorNode(vector) {} + SizeNode(refptr vector) : VectorNode(vector) {} }; class SpecularNode : public VectorNode { public: - SpecularNode(refptr vector) : VectorNode(vector) {} + SpecularNode(refptr vector) : VectorNode(vector) {} }; class SphereNode : public Node @@ -336,20 +366,20 @@ class SubtractNode : public Node class TranslateNode : public VectorNode { public: - TranslateNode(refptr vector) : VectorNode(vector) {} + TranslateNode(refptr vector) : VectorNode(vector) {} }; class TranslateBlockNode : public TranslateNode { public: - TranslateBlockNode(refptr vector) : TranslateNode(vector) {} + TranslateBlockNode(refptr vector) : TranslateNode(vector) {} bool isTransformBlock() { return true; } }; class TransparencyNode : public NumberNode { public: - TransparencyNode(double d) : NumberNode(d) {} + TransparencyNode(refptr e) : NumberNode(e) {} }; class UnionNode : public Node @@ -361,13 +391,13 @@ class UnionNode : public Node class UpNode : public VectorNode { public: - UpNode(refptr vector) : VectorNode(vector) {} + UpNode(refptr vector) : VectorNode(vector) {} }; class VFOVNode : public NumberNode { public: - VFOVNode(double d) : NumberNode(d) {} + VFOVNode(refptr e) : NumberNode(e) {} }; class WidthNode : public IntegerNode diff --git a/parser/parser.yy b/parser/parser.yy index 9be6450..657ff98 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -144,7 +144,7 @@ box_items: /* empty */ ; box_item: SIZE vector3 { - $$ = new SizeNode($2->getVector()); + $$ = new SizeNode($2); } | shape_item { $$ = $1; } ; @@ -164,16 +164,16 @@ camera_items: /* empty */ ; camera_item: POSITION vector3 { - $$ = new PositionNode($2->getVector()); + $$ = new PositionNode($2); } | LOOKAT vector3 { - $$ = new LookAtNode($2->getVector()); + $$ = new LookAtNode($2); } | UP vector3 { - $$ = new UpNode($2->getVector()); + $$ = new UpNode($2); } | VFOV expression { - $$ = new VFOVNode($2->getNumber()); + $$ = new VFOVNode($2); } ; @@ -192,7 +192,7 @@ cyl_items: /* empty */ ; cyl_item: SIZE vector3 { - $$ = new SizeNode($2->getVector()); + $$ = new SizeNode($2); } | shape_item { $$ = $1; } ; @@ -224,7 +224,7 @@ intersect: INTERSECT LCURLY bool_items RCURLY { ; jitter: JITTER expression { - $$ = new JitterNode($2->getInteger()); + $$ = new JitterNode($2); } ; @@ -243,16 +243,16 @@ light_items: /* empty */ ; light_item: POSITION vector3 { - $$ = new PositionNode($2->getVector()); + $$ = new PositionNode($2); } | DIFFUSE vector3 { - $$ = new DiffuseNode($2->getVector()); + $$ = new DiffuseNode($2); } | SPECULAR vector3 { - $$ = new SpecularNode($2->getVector()); + $$ = new SpecularNode($2); } | COLOR vector3 { - $$ = new ColorNode($2->getVector()); + $$ = new ColorNode($2); } | radius { $$ = $1; @@ -277,25 +277,25 @@ material_items: /* empty */ ; material_item: COLOR vector3 { - $$ = new ColorNode($2->getVector()); + $$ = new ColorNode($2); } | AMBIENT vector3 { - $$ = new AmbientNode($2->getVector()); + $$ = new AmbientNode($2); } | DIFFUSE vector3 { - $$ = new DiffuseNode($2->getVector()); + $$ = new DiffuseNode($2); } | SPECULAR vector3 { - $$ = new SpecularNode($2->getVector()); + $$ = new SpecularNode($2); } | REFLECTANCE expression { - $$ = new ReflectanceNode($2->getNumber()); + $$ = new ReflectanceNode($2); } | SHININESS expression { - $$ = new ShininessNode($2->getNumber()); + $$ = new ShininessNode($2); } | TRANSPARENCY expression { - $$ = new TransparencyNode($2->getNumber()); + $$ = new TransparencyNode($2); } ; @@ -315,16 +315,16 @@ number: DEC_NUMBER { $$ = $1; } ; ngon: NGON DEC_NUMBER COMMA expression { - $$ = new NGonNode($2->getInteger()); - $$->addChild(new RadiusNode($4->getNumber())); + $$ = new NGonNode($2); + $$->addChild(new RadiusNode($4)); } ; offset: OFFSET expression { - $$ = new OffsetNode($2->getNumber()); + $$ = new OffsetNode($2); } | OFFSET expression LCURLY offset_items RCURLY { - $$ = new OffsetNode($2->getNumber()); + $$ = new OffsetNode($2); $$->addChildren($4); } ; @@ -338,14 +338,13 @@ offset_items: /* empty */ ; offset_item: SCALE expression { - $$ = new ScaleNode(new Vector($2->getNumber(), $2->getNumber(), - $2->getNumber())); + $$ = new ScaleNode(new VectorNode($2, $2, $2)); } | SCALE vector2 { - $$ = new ScaleNode($2->getVector()); + $$ = new ScaleNode($2); } | POSITION vector2 { - $$ = new PositionNode($2->getVector()); + $$ = new PositionNode($2); } ; @@ -376,10 +375,10 @@ options_item: WIDTH DEC_NUMBER { $$ = new MaxDepthNode($2->getInteger()); } | EXPOSURE expression { - $$ = new ExposureNode($2->getNumber()); + $$ = new ExposureNode($2); } | AMBIENT vector3 { - $$ = new AmbientNode($2->getVector()); + $$ = new AmbientNode($2); } | AMBIENT_OCCLUSION DEC_NUMBER { $$ = new AmbientOcclusionNode($2->getInteger()); @@ -401,7 +400,7 @@ plane_items: /* empty */ ; plane_item: POSITION vector3 COMMA expression { - $$ = new PlanePositionNode($2->getVector(), $4->getNumber()); + $$ = new PlanePositionNode($2, $4); } | shape_item { $$ = $1; } ; @@ -424,7 +423,7 @@ polygon_item: vector2 { $$ = $1; } ; radius: RADIUS expression { - $$ = new RadiusNode($2->getNumber()); + $$ = new RadiusNode($2); } ; @@ -510,36 +509,33 @@ subtract: SUBTRACT LCURLY bool_items RCURLY { ; transform: TRANSLATE vector3 { - $$ = new TranslateNode($2->getVector()); + $$ = new TranslateNode($2); } | ROTATE expression COMMA vector3 { - $$ = new RotateNode($2->getNumber(), $4->getVector()); + $$ = new RotateNode($2, $4); } | SCALE vector3 { - $$ = new ScaleNode($2->getVector()); + $$ = new ScaleNode($2); } | SCALE expression { - $$ = new ScaleNode(new Vector($2->getNumber(), - $2->getNumber(), $2->getNumber())); + $$ = new ScaleNode(new VectorNode($2, $2, $2)); } ; transform_block: TRANSLATE vector3 LCURLY transform_block_items RCURLY { - $$ = new TranslateBlockNode($2->getVector()); + $$ = new TranslateBlockNode($2); $$->addChildren($4); } | ROTATE expression COMMA vector3 LCURLY transform_block_items RCURLY { - $$ = new RotateBlockNode($2->getNumber(), $4->getVector()); + $$ = new RotateBlockNode($2, $4); $$->addChildren($6); } | SCALE vector3 LCURLY transform_block_items RCURLY { - $$ = new ScaleBlockNode($2->getVector()); + $$ = new ScaleBlockNode($2); $$->addChildren($4); } | SCALE expression LCURLY transform_block_items RCURLY { - $$ = new ScaleBlockNode( - new Vector($2->getNumber(), $2->getNumber(), - $2->getNumber())); + $$ = new ScaleBlockNode(new VectorNode($2, $2, $2)); $$->addChildren($4); } ; @@ -564,16 +560,12 @@ union: UNION LCURLY bool_items RCURLY { ; vector2: LESS expression COMMA expression GREATER { - refptr vec = - new Vector($2->getNumber(), $4->getNumber(), 0.0); - $$ = new VectorNode(vec); + $$ = new VectorNode($2, $4, new NumberNode(0.0)); } ; vector3: LESS expression COMMA expression COMMA expression GREATER { - refptr vec = - new Vector($2->getNumber(), $4->getNumber(), $6->getNumber()); - $$ = new VectorNode(vec); + $$ = new VectorNode($2, $4, $6); } ;