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
This commit is contained in:
Josh Holtrop 2010-09-29 19:30:14 +00:00
parent 20017370f0
commit 2f825f29f9
2 changed files with 113 additions and 91 deletions

View File

@ -46,28 +46,60 @@ class IntegerNode : public Node
class NumberNode : public Node class NumberNode : public Node
{ {
public: public:
NumberNode(double number) { m_number = number; } NumberNode(double number)
double getNumber() { return m_number; } {
m_number = number;
m_direct = true;
}
NumberNode(refptr<Node> expr)
{
addChild(expr);
m_direct = false;
}
double getNumber()
{
return m_direct ? m_number : m_children[0]->getNumber();
}
protected: protected:
double m_number; double m_number;
bool m_direct;
}; };
class VectorNode : public Node class VectorNode : public Node
{ {
public: public:
VectorNode(refptr<Vector> vector) { m_vector = vector; } VectorNode(refptr<Node> a, refptr<Node> b, refptr<Node> c)
refptr<Vector> getVector() { return m_vector; } {
addChild(a);
protected: addChild(b);
refptr<Vector> m_vector; addChild(c);
}
VectorNode(refptr<Node> node)
{
addChild(node);
}
refptr<Vector> 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 class AmbientNode : public VectorNode
{ {
public: public:
AmbientNode(refptr<Vector> vector) : VectorNode(vector) {} AmbientNode(refptr<Node> vector) : VectorNode(vector) {}
}; };
class AmbientOcclusionNode : public IntegerNode class AmbientOcclusionNode : public IntegerNode
@ -89,7 +121,7 @@ class CameraNode : public Node
class ColorNode : public VectorNode class ColorNode : public VectorNode
{ {
public: public:
ColorNode(refptr<Vector> vector) : VectorNode(vector) {} ColorNode(refptr<Node> vector) : VectorNode(vector) {}
}; };
class CylNode : public Node class CylNode : public Node
@ -101,13 +133,13 @@ class CylNode : public Node
class DiffuseNode : public VectorNode class DiffuseNode : public VectorNode
{ {
public: public:
DiffuseNode(refptr<Vector> vector) : VectorNode(vector) {} DiffuseNode(refptr<Node> vector) : VectorNode(vector) {}
}; };
class ExposureNode : public NumberNode class ExposureNode : public NumberNode
{ {
public: public:
ExposureNode(double d) : NumberNode(d) {} ExposureNode(refptr<Node> e) : NumberNode(e) {}
}; };
class ExtrudeNode : public Node class ExtrudeNode : public Node
@ -144,10 +176,10 @@ class ItemsNode : public Node
{ {
}; };
class JitterNode : public IntegerNode class JitterNode : public NumberNode
{ {
public: public:
JitterNode(int i) : IntegerNode(i) {} JitterNode(refptr<Node> e) : NumberNode(e) {}
}; };
class LightNode : public Node class LightNode : public Node
@ -157,7 +189,7 @@ class LightNode : public Node
class LookAtNode : public VectorNode class LookAtNode : public VectorNode
{ {
public: public:
LookAtNode(refptr<Vector> vector) : VectorNode(vector) {} LookAtNode(refptr<Node> vector) : VectorNode(vector) {}
}; };
class MaterialNode : public Node class MaterialNode : public Node
@ -191,16 +223,16 @@ class MultisampleNode : public IntegerNode
MultisampleNode(int i) : IntegerNode(i) {} MultisampleNode(int i) : IntegerNode(i) {}
}; };
class NGonNode : public IntegerNode class NGonNode : public NumberNode
{ {
public: public:
NGonNode(int i) : IntegerNode(i) {} NGonNode(refptr<Node> e) : NumberNode(e) {}
}; };
class OffsetNode : public NumberNode class OffsetNode : public NumberNode
{ {
public: public:
OffsetNode(double d) : NumberNode(d) {} OffsetNode(refptr<Node> e) : NumberNode(e) {}
}; };
class OptionsNode : public Node class OptionsNode : public Node
@ -213,20 +245,18 @@ class PlaneNode : public Node
bool isShape() { return true; } bool isShape() { return true; }
}; };
class PlanePositionNode : public Node class PlanePositionNode : public VectorNode
{ {
public: public:
PlanePositionNode(refptr<Vector> vec, double dist) PlanePositionNode(refptr<Node> vec_node, refptr<Node> dist)
: VectorNode(vec_node)
{ {
m_vector = vec;
m_dist = dist; m_dist = dist;
} }
refptr<Vector> getVector() { return m_vector; } double getNumber() { return m_dist->getNumber(); }
double getNumber() { return m_dist; }
protected: protected:
refptr<Vector> m_vector; refptr<Node> m_dist;
double m_dist;
}; };
class PolygonNode : public Node class PolygonNode : public Node
@ -236,53 +266,53 @@ class PolygonNode : public Node
class PositionNode : public VectorNode class PositionNode : public VectorNode
{ {
public: public:
PositionNode(refptr<Vector> vector) : VectorNode(vector) {} PositionNode(refptr<Node> vector) : VectorNode(vector) {}
}; };
class RadiusNode : public NumberNode class RadiusNode : public NumberNode
{ {
public: public:
RadiusNode(double d) : NumberNode(d) {} RadiusNode(refptr<Node> e) : NumberNode(e) {}
}; };
class ReflectanceNode : public NumberNode class ReflectanceNode : public NumberNode
{ {
public: public:
ReflectanceNode(double d) : NumberNode(d) {} ReflectanceNode(refptr<Node> e) : NumberNode(e) {}
}; };
class RotateNode : public VectorNode class RotateNode : public VectorNode
{ {
public: public:
RotateNode(double angle, refptr<Vector> vector) RotateNode(refptr<Node> angle, refptr<Node> vec_node)
: VectorNode(vector) : VectorNode(vec_node)
{ {
m_angle = angle; m_angle = angle;
} }
double getNumber() { return m_angle; } double getNumber() { return m_angle->getNumber(); }
protected: protected:
double m_angle; refptr<Node> m_angle;
}; };
class RotateBlockNode : public RotateNode class RotateBlockNode : public RotateNode
{ {
public: public:
RotateBlockNode(double angle, refptr<Vector> vector) RotateBlockNode(refptr<Node> angle, refptr<Node> vec_node)
: RotateNode(angle, vector) {} : RotateNode(angle, vec_node) {}
bool isTransformBlock() { return true; } bool isTransformBlock() { return true; }
}; };
class ScaleNode : public VectorNode class ScaleNode : public VectorNode
{ {
public: public:
ScaleNode(refptr<Vector> vector) : VectorNode(vector) {} ScaleNode(refptr<Node> vector) : VectorNode(vector) {}
}; };
class ScaleBlockNode : public ScaleNode class ScaleBlockNode : public ScaleNode
{ {
public: public:
ScaleBlockNode(refptr<Vector> vector) : ScaleNode(vector) {} ScaleBlockNode(refptr<Node> vector) : ScaleNode(vector) {}
bool isTransformBlock() { return true; } bool isTransformBlock() { return true; }
}; };
@ -306,19 +336,19 @@ class ShapeRefNode : public IdentifierNode
class ShininessNode : public NumberNode class ShininessNode : public NumberNode
{ {
public: public:
ShininessNode(double d) : NumberNode(d) {} ShininessNode(refptr<Node> e) : NumberNode(e) {}
}; };
class SizeNode : public VectorNode class SizeNode : public VectorNode
{ {
public: public:
SizeNode(refptr<Vector> vector) : VectorNode(vector) {} SizeNode(refptr<Node> vector) : VectorNode(vector) {}
}; };
class SpecularNode : public VectorNode class SpecularNode : public VectorNode
{ {
public: public:
SpecularNode(refptr<Vector> vector) : VectorNode(vector) {} SpecularNode(refptr<Node> vector) : VectorNode(vector) {}
}; };
class SphereNode : public Node class SphereNode : public Node
@ -336,20 +366,20 @@ class SubtractNode : public Node
class TranslateNode : public VectorNode class TranslateNode : public VectorNode
{ {
public: public:
TranslateNode(refptr<Vector> vector) : VectorNode(vector) {} TranslateNode(refptr<Node> vector) : VectorNode(vector) {}
}; };
class TranslateBlockNode : public TranslateNode class TranslateBlockNode : public TranslateNode
{ {
public: public:
TranslateBlockNode(refptr<Vector> vector) : TranslateNode(vector) {} TranslateBlockNode(refptr<Node> vector) : TranslateNode(vector) {}
bool isTransformBlock() { return true; } bool isTransformBlock() { return true; }
}; };
class TransparencyNode : public NumberNode class TransparencyNode : public NumberNode
{ {
public: public:
TransparencyNode(double d) : NumberNode(d) {} TransparencyNode(refptr<Node> e) : NumberNode(e) {}
}; };
class UnionNode : public Node class UnionNode : public Node
@ -361,13 +391,13 @@ class UnionNode : public Node
class UpNode : public VectorNode class UpNode : public VectorNode
{ {
public: public:
UpNode(refptr<Vector> vector) : VectorNode(vector) {} UpNode(refptr<Node> vector) : VectorNode(vector) {}
}; };
class VFOVNode : public NumberNode class VFOVNode : public NumberNode
{ {
public: public:
VFOVNode(double d) : NumberNode(d) {} VFOVNode(refptr<Node> e) : NumberNode(e) {}
}; };
class WidthNode : public IntegerNode class WidthNode : public IntegerNode

View File

@ -144,7 +144,7 @@ box_items: /* empty */
; ;
box_item: SIZE vector3 { box_item: SIZE vector3 {
$$ = new SizeNode($2->getVector()); $$ = new SizeNode($2);
} }
| shape_item { $$ = $1; } | shape_item { $$ = $1; }
; ;
@ -164,16 +164,16 @@ camera_items: /* empty */
; ;
camera_item: POSITION vector3 { camera_item: POSITION vector3 {
$$ = new PositionNode($2->getVector()); $$ = new PositionNode($2);
} }
| LOOKAT vector3 { | LOOKAT vector3 {
$$ = new LookAtNode($2->getVector()); $$ = new LookAtNode($2);
} }
| UP vector3 { | UP vector3 {
$$ = new UpNode($2->getVector()); $$ = new UpNode($2);
} }
| VFOV expression { | VFOV expression {
$$ = new VFOVNode($2->getNumber()); $$ = new VFOVNode($2);
} }
; ;
@ -192,7 +192,7 @@ cyl_items: /* empty */
; ;
cyl_item: SIZE vector3 { cyl_item: SIZE vector3 {
$$ = new SizeNode($2->getVector()); $$ = new SizeNode($2);
} }
| shape_item { $$ = $1; } | shape_item { $$ = $1; }
; ;
@ -224,7 +224,7 @@ intersect: INTERSECT LCURLY bool_items RCURLY {
; ;
jitter: JITTER expression { jitter: JITTER expression {
$$ = new JitterNode($2->getInteger()); $$ = new JitterNode($2);
} }
; ;
@ -243,16 +243,16 @@ light_items: /* empty */
; ;
light_item: POSITION vector3 { light_item: POSITION vector3 {
$$ = new PositionNode($2->getVector()); $$ = new PositionNode($2);
} }
| DIFFUSE vector3 { | DIFFUSE vector3 {
$$ = new DiffuseNode($2->getVector()); $$ = new DiffuseNode($2);
} }
| SPECULAR vector3 { | SPECULAR vector3 {
$$ = new SpecularNode($2->getVector()); $$ = new SpecularNode($2);
} }
| COLOR vector3 { | COLOR vector3 {
$$ = new ColorNode($2->getVector()); $$ = new ColorNode($2);
} }
| radius { | radius {
$$ = $1; $$ = $1;
@ -277,25 +277,25 @@ material_items: /* empty */
; ;
material_item: COLOR vector3 { material_item: COLOR vector3 {
$$ = new ColorNode($2->getVector()); $$ = new ColorNode($2);
} }
| AMBIENT vector3 { | AMBIENT vector3 {
$$ = new AmbientNode($2->getVector()); $$ = new AmbientNode($2);
} }
| DIFFUSE vector3 { | DIFFUSE vector3 {
$$ = new DiffuseNode($2->getVector()); $$ = new DiffuseNode($2);
} }
| SPECULAR vector3 { | SPECULAR vector3 {
$$ = new SpecularNode($2->getVector()); $$ = new SpecularNode($2);
} }
| REFLECTANCE expression { | REFLECTANCE expression {
$$ = new ReflectanceNode($2->getNumber()); $$ = new ReflectanceNode($2);
} }
| SHININESS expression { | SHININESS expression {
$$ = new ShininessNode($2->getNumber()); $$ = new ShininessNode($2);
} }
| TRANSPARENCY expression { | TRANSPARENCY expression {
$$ = new TransparencyNode($2->getNumber()); $$ = new TransparencyNode($2);
} }
; ;
@ -315,16 +315,16 @@ number: DEC_NUMBER { $$ = $1; }
; ;
ngon: NGON DEC_NUMBER COMMA expression { ngon: NGON DEC_NUMBER COMMA expression {
$$ = new NGonNode($2->getInteger()); $$ = new NGonNode($2);
$$->addChild(new RadiusNode($4->getNumber())); $$->addChild(new RadiusNode($4));
} }
; ;
offset: OFFSET expression { offset: OFFSET expression {
$$ = new OffsetNode($2->getNumber()); $$ = new OffsetNode($2);
} }
| OFFSET expression LCURLY offset_items RCURLY { | OFFSET expression LCURLY offset_items RCURLY {
$$ = new OffsetNode($2->getNumber()); $$ = new OffsetNode($2);
$$->addChildren($4); $$->addChildren($4);
} }
; ;
@ -338,14 +338,13 @@ offset_items: /* empty */
; ;
offset_item: SCALE expression { offset_item: SCALE expression {
$$ = new ScaleNode(new Vector($2->getNumber(), $2->getNumber(), $$ = new ScaleNode(new VectorNode($2, $2, $2));
$2->getNumber()));
} }
| SCALE vector2 { | SCALE vector2 {
$$ = new ScaleNode($2->getVector()); $$ = new ScaleNode($2);
} }
| POSITION vector2 { | POSITION vector2 {
$$ = new PositionNode($2->getVector()); $$ = new PositionNode($2);
} }
; ;
@ -376,10 +375,10 @@ options_item: WIDTH DEC_NUMBER {
$$ = new MaxDepthNode($2->getInteger()); $$ = new MaxDepthNode($2->getInteger());
} }
| EXPOSURE expression { | EXPOSURE expression {
$$ = new ExposureNode($2->getNumber()); $$ = new ExposureNode($2);
} }
| AMBIENT vector3 { | AMBIENT vector3 {
$$ = new AmbientNode($2->getVector()); $$ = new AmbientNode($2);
} }
| AMBIENT_OCCLUSION DEC_NUMBER { | AMBIENT_OCCLUSION DEC_NUMBER {
$$ = new AmbientOcclusionNode($2->getInteger()); $$ = new AmbientOcclusionNode($2->getInteger());
@ -401,7 +400,7 @@ plane_items: /* empty */
; ;
plane_item: POSITION vector3 COMMA expression { plane_item: POSITION vector3 COMMA expression {
$$ = new PlanePositionNode($2->getVector(), $4->getNumber()); $$ = new PlanePositionNode($2, $4);
} }
| shape_item { $$ = $1; } | shape_item { $$ = $1; }
; ;
@ -424,7 +423,7 @@ polygon_item: vector2 { $$ = $1; }
; ;
radius: RADIUS expression { radius: RADIUS expression {
$$ = new RadiusNode($2->getNumber()); $$ = new RadiusNode($2);
} }
; ;
@ -510,36 +509,33 @@ subtract: SUBTRACT LCURLY bool_items RCURLY {
; ;
transform: TRANSLATE vector3 { transform: TRANSLATE vector3 {
$$ = new TranslateNode($2->getVector()); $$ = new TranslateNode($2);
} }
| ROTATE expression COMMA vector3 { | ROTATE expression COMMA vector3 {
$$ = new RotateNode($2->getNumber(), $4->getVector()); $$ = new RotateNode($2, $4);
} }
| SCALE vector3 { | SCALE vector3 {
$$ = new ScaleNode($2->getVector()); $$ = new ScaleNode($2);
} }
| SCALE expression { | SCALE expression {
$$ = new ScaleNode(new Vector($2->getNumber(), $$ = new ScaleNode(new VectorNode($2, $2, $2));
$2->getNumber(), $2->getNumber()));
} }
; ;
transform_block: TRANSLATE vector3 LCURLY transform_block_items RCURLY { transform_block: TRANSLATE vector3 LCURLY transform_block_items RCURLY {
$$ = new TranslateBlockNode($2->getVector()); $$ = new TranslateBlockNode($2);
$$->addChildren($4); $$->addChildren($4);
} }
| ROTATE expression COMMA vector3 LCURLY transform_block_items RCURLY { | ROTATE expression COMMA vector3 LCURLY transform_block_items RCURLY {
$$ = new RotateBlockNode($2->getNumber(), $4->getVector()); $$ = new RotateBlockNode($2, $4);
$$->addChildren($6); $$->addChildren($6);
} }
| SCALE vector3 LCURLY transform_block_items RCURLY { | SCALE vector3 LCURLY transform_block_items RCURLY {
$$ = new ScaleBlockNode($2->getVector()); $$ = new ScaleBlockNode($2);
$$->addChildren($4); $$->addChildren($4);
} }
| SCALE expression LCURLY transform_block_items RCURLY { | SCALE expression LCURLY transform_block_items RCURLY {
$$ = new ScaleBlockNode( $$ = new ScaleBlockNode(new VectorNode($2, $2, $2));
new Vector($2->getNumber(), $2->getNumber(),
$2->getNumber()));
$$->addChildren($4); $$->addChildren($4);
} }
; ;
@ -564,16 +560,12 @@ union: UNION LCURLY bool_items RCURLY {
; ;
vector2: LESS expression COMMA expression GREATER { vector2: LESS expression COMMA expression GREATER {
refptr<Vector> vec = $$ = new VectorNode($2, $4, new NumberNode(0.0));
new Vector($2->getNumber(), $4->getNumber(), 0.0);
$$ = new VectorNode(vec);
} }
; ;
vector3: LESS expression COMMA expression COMMA expression GREATER { vector3: LESS expression COMMA expression COMMA expression GREATER {
refptr<Vector> vec = $$ = new VectorNode($2, $4, $6);
new Vector($2->getNumber(), $4->getNumber(), $6->getNumber());
$$ = new VectorNode(vec);
} }
; ;