added evaluate() method for all non-scripting nodes, made evaluateChildren() recursive

git-svn-id: svn://anubis/fart/branches/scene-file-scripting@338 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
Josh Holtrop 2010-10-06 16:32:27 +00:00
parent 793c7afb2d
commit f36c1fa60f
2 changed files with 197 additions and 17 deletions

View File

@ -21,12 +21,12 @@ void Scene::load(const char * filename)
refptr<Node> node = parse(filename, scope); refptr<Node> node = parse(filename, scope);
if ( ! node.isNull() ) if ( ! node.isNull() )
{ {
refptr<Node> dummy = new Node();
/* evaluate any scripting nodes in the node tree */ /* evaluate any scripting nodes in the node tree */
node->evaluate(dummy); refptr<Node> processed_scene = node->evaluate();
node->evaluateChildren(processed_scene);
/* now we have a new node tree under 'dummy' with no scripting nodes */ /* now we have a new node tree under 'dummy' with no scripting nodes */
processScene(dummy->getChildren()[0]); processScene(processed_scene);
} }
} }

View File

@ -44,17 +44,24 @@ class Node
std::cerr << "Warning: Node::getNode() called!" << std::endl; std::cerr << "Warning: Node::getNode() called!" << std::endl;
return NULL; return NULL;
} }
virtual void evaluate(refptr<Node> parent) virtual refptr<Node> evaluate()
{ {
std::cerr << "Warning: Node::evaluate() called!" << std::endl; std::cerr << "Warning: Node::evaluate() called!" << std::endl;
return NULL;
} }
virtual void evaluateChildren(refptr<Node> parent) virtual void evaluateChildren(refptr<Node> parent)
{ {
/* recursively evaluate all children nodes */
for (std::vector< refptr<Node> >::iterator it = m_children.begin(); for (std::vector< refptr<Node> >::iterator it = m_children.begin();
it != m_children.end(); it != m_children.end();
it++) it++)
{ {
(*it)->evaluate(parent); refptr<Node> evaluated = (*it)->evaluate();
if ( ! evaluated.isNull() )
{
(*it)->evaluateChildren(evaluated);
parent->addChild(evaluated);
}
} }
} }
@ -76,22 +83,23 @@ class NumberNode : public Node
NumberNode(double number) NumberNode(double number)
{ {
m_number = number; m_number = number;
m_direct = true;
} }
NumberNode(NodeRef expr) NumberNode(NodeRef expr)
{ {
m_expr = expr; m_expr = expr;
m_direct = false;
} }
virtual double getNumber() virtual double getNumber()
{ {
return m_direct ? m_number : m_expr->getNumber(); return m_number;
}
virtual refptr<Node> evaluate()
{
return new NumberNode(m_number);
} }
protected: protected:
double m_number; double m_number;
NodeRef m_expr; NodeRef m_expr;
bool m_direct;
}; };
class VectorNode : public Node class VectorNode : public Node
@ -102,7 +110,7 @@ class VectorNode : public Node
{ {
} }
VectorNode(NodeRef node) VectorNode(NodeRef node)
: m_a(node), m_direct(false) : m_vector(node), m_direct(false)
{ {
} }
refptr<Vector> getVector() refptr<Vector> getVector()
@ -113,8 +121,16 @@ class VectorNode : public Node
m_c->getNumber()) m_c->getNumber())
: m_a->getVector(); : m_a->getVector();
} }
virtual NodeRef evaluate()
{
return m_direct
? new VectorNode(m_a->evaluate(),
m_b->evaluate(),
m_c->evaluate())
: m_a->evaluate();
}
protected: protected:
NodeRef m_a, m_b, m_c; NodeRef m_a, m_b, m_c, m_vector;
bool m_direct; bool m_direct;
}; };
@ -123,58 +139,99 @@ class AmbientNode : public VectorNode
{ {
public: public:
AmbientNode(NodeRef vector) : VectorNode(vector) {} AmbientNode(NodeRef vector) : VectorNode(vector) {}
virtual NodeRef evaluate()
{
return new AmbientNode(m_vector->evaluate());
}
}; };
class AmbientOcclusionNode : public NumberNode class AmbientOcclusionNode : public NumberNode
{ {
public: public:
AmbientOcclusionNode(NodeRef e) : NumberNode(e) {} AmbientOcclusionNode(NodeRef e) : NumberNode(e) {}
virtual NodeRef evaluate()
{
return new AmbientOcclusionNode(m_expr->evaluate());
}
}; };
class BoxNode : public Node class BoxNode : public Node
{ {
public: public:
bool isShape() { return true; } bool isShape() { return true; }
virtual NodeRef evaluate()
{
return new BoxNode();
}
}; };
class CameraNode : public Node class CameraNode : public Node
{ {
public:
virtual NodeRef evaluate()
{
return new CameraNode();
}
}; };
class ColorNode : public VectorNode class ColorNode : public VectorNode
{ {
public: public:
ColorNode(NodeRef vector) : VectorNode(vector) {} ColorNode(NodeRef vector) : VectorNode(vector) {}
virtual NodeRef evaluate()
{
return new ColorNode(m_vector->evaluate());
}
}; };
class CylNode : public Node class CylNode : public Node
{ {
public: public:
bool isShape() { return true; } bool isShape() { return true; }
virtual NodeRef evaluate()
{
return new CylNode();
}
}; };
class DiffuseNode : public VectorNode class DiffuseNode : public VectorNode
{ {
public: public:
DiffuseNode(NodeRef vector) : VectorNode(vector) {} DiffuseNode(NodeRef vector) : VectorNode(vector) {}
virtual NodeRef evaluate()
{
return new DiffuseNode(m_vector->evaluate());
}
}; };
class ExposureNode : public NumberNode class ExposureNode : public NumberNode
{ {
public: public:
ExposureNode(NodeRef e) : NumberNode(e) {} ExposureNode(NodeRef e) : NumberNode(e) {}
virtual NodeRef evaluate()
{
return new ExposureNode(m_expr->evaluate());
}
}; };
class ExtrudeNode : public Node class ExtrudeNode : public Node
{ {
public: public:
bool isShape() { return true; } bool isShape() { return true; }
virtual NodeRef evaluate()
{
return new ExtrudeNode();
}
}; };
class HeightNode : public NumberNode class HeightNode : public NumberNode
{ {
public: public:
HeightNode(NodeRef e) : NumberNode(e) {} HeightNode(NodeRef e) : NumberNode(e) {}
virtual NodeRef evaluate()
{
return new HeightNode(m_expr->evaluate());
}
}; };
class IdentifierNode : public Node class IdentifierNode : public Node
@ -182,6 +239,10 @@ class IdentifierNode : public Node
public: public:
IdentifierNode(const std::string & str) { m_string = str; } IdentifierNode(const std::string & str) { m_string = str; }
std::string getString() { return m_string; } std::string getString() { return m_string; }
virtual NodeRef evaluate()
{
return new IdentifierNode(m_string);
}
protected: protected:
std::string m_string; std::string m_string;
}; };
@ -190,39 +251,62 @@ class IntersectNode : public Node
{ {
public: public:
bool isShape() { return true; } bool isShape() { return true; }
virtual NodeRef evaluate()
{
return new IntersectNode();
}
}; };
class ItemsNode : public Node class ItemsNode : public Node
{ {
public:
virtual NodeRef evaluate()
{
return new ItemsNode();
}
}; };
class JitterNode : public NumberNode class JitterNode : public NumberNode
{ {
public: public:
JitterNode(NodeRef e) : NumberNode(e) {} JitterNode(NodeRef e) : NumberNode(e) {}
int getInteger() { return getNumber(); } virtual NodeRef evaluate()
{
return new JitterNode(m_expr->evaluate());
}
}; };
class LightNode : public Node class LightNode : public Node
{ {
public:
virtual NodeRef evaluate() { return new LightNode(); }
}; };
class LookAtNode : public VectorNode class LookAtNode : public VectorNode
{ {
public: public:
LookAtNode(NodeRef vector) : VectorNode(vector) {} LookAtNode(NodeRef vector) : VectorNode(vector) {}
virtual NodeRef evaluate()
{
return new LookAtNode(m_vector->evaluate());
}
}; };
class MaterialNode : public Node class MaterialNode : public Node
{ {
public: public:
bool isMaterial() { return true; } bool isMaterial() { return true; }
virtual NodeRef evaluate() { return new MaterialNode(); }
}; };
class MaterialDefinitionNode : public IdentifierNode class MaterialDefinitionNode : public IdentifierNode
{ {
public: public:
MaterialDefinitionNode(const std::string & str) : IdentifierNode(str) {} MaterialDefinitionNode(const std::string & str) : IdentifierNode(str) {}
virtual NodeRef evaluate()
{
return new MaterialDefinitionNode(m_string);
}
}; };
class MaterialRefNode : public IdentifierNode class MaterialRefNode : public IdentifierNode
@ -230,41 +314,60 @@ class MaterialRefNode : public IdentifierNode
public: public:
MaterialRefNode(const std::string & str) : IdentifierNode(str) {} MaterialRefNode(const std::string & str) : IdentifierNode(str) {}
bool isMaterial() { return true; } bool isMaterial() { return true; }
virtual NodeRef evaluate() { return new MaterialRefNode(m_string); }
}; };
class MaxDepthNode : public NumberNode class MaxDepthNode : public NumberNode
{ {
public: public:
MaxDepthNode(NodeRef e) : NumberNode(e) {} MaxDepthNode(NodeRef e) : NumberNode(e) {}
virtual NodeRef evaluate()
{
return new MaxDepthNode(m_expr->evaluate());
}
}; };
class MultisampleNode : public NumberNode class MultisampleNode : public NumberNode
{ {
public: public:
MultisampleNode(NodeRef e) : NumberNode(e) {} MultisampleNode(NodeRef e) : NumberNode(e) {}
virtual NodeRef evaluate()
{
return new MultisampleNode(m_expr->evaluate());
}
}; };
class NGonNode : public NumberNode class NGonNode : public NumberNode
{ {
public: public:
NGonNode(NodeRef e) : NumberNode(e) {} NGonNode(NodeRef e) : NumberNode(e) {}
int getInteger() { return getNumber(); } virtual NodeRef evaluate()
{
return new NGonNode(m_expr->evaluate());
}
}; };
class OffsetNode : public NumberNode class OffsetNode : public NumberNode
{ {
public: public:
OffsetNode(NodeRef e) : NumberNode(e) {} OffsetNode(NodeRef e) : NumberNode(e) {}
virtual NodeRef evaluate()
{
return new OffsetNode(m_expr->evaluate());
}
}; };
class OptionsNode : public Node class OptionsNode : public Node
{ {
public:
virtual NodeRef evaluate() { return new OptionsNode(); }
}; };
class PlaneNode : public Node class PlaneNode : public Node
{ {
public: public:
bool isShape() { return true; } bool isShape() { return true; }
virtual NodeRef evaluate() { return new PlaneNode(); }
}; };
class PlanePositionNode : public VectorNode class PlanePositionNode : public VectorNode
@ -276,6 +379,11 @@ class PlanePositionNode : public VectorNode
m_dist = dist; m_dist = dist;
} }
double getNumber() { return m_dist->getNumber(); } double getNumber() { return m_dist->getNumber(); }
virtual NodeRef evaluate()
{
return new PlanePositionNode(m_vector->evaluate(),
m_dist->evaluate());
}
protected: protected:
NodeRef m_dist; NodeRef m_dist;
@ -283,24 +391,38 @@ class PlanePositionNode : public VectorNode
class PolygonNode : public Node class PolygonNode : public Node
{ {
public:
virtual NodeRef evaluate() { return new PolygonNode(); }
}; };
class PositionNode : public VectorNode class PositionNode : public VectorNode
{ {
public: public:
PositionNode(NodeRef vector) : VectorNode(vector) {} PositionNode(NodeRef vector) : VectorNode(vector) {}
virtual NodeRef evaluate()
{
return new PositionNode(m_vector->evaluate());
}
}; };
class RadiusNode : public NumberNode class RadiusNode : public NumberNode
{ {
public: public:
RadiusNode(NodeRef e) : NumberNode(e) {} RadiusNode(NodeRef e) : NumberNode(e) {}
virtual NodeRef evaluate()
{
return new RadiusNode(m_expr->evaluate());
}
}; };
class ReflectanceNode : public NumberNode class ReflectanceNode : public NumberNode
{ {
public: public:
ReflectanceNode(NodeRef e) : NumberNode(e) {} ReflectanceNode(NodeRef e) : NumberNode(e) {}
virtual NodeRef evaluate()
{
return new ReflectanceNode(m_expr->evaluate());
}
}; };
class RotateNode : public VectorNode class RotateNode : public VectorNode
@ -312,6 +434,10 @@ class RotateNode : public VectorNode
m_angle = angle; m_angle = angle;
} }
double getNumber() { return m_angle->getNumber(); } double getNumber() { return m_angle->getNumber(); }
virtual NodeRef evaluate()
{
return new RotateNode(m_angle->evaluate(), m_vector->evaluate());
}
protected: protected:
NodeRef m_angle; NodeRef m_angle;
@ -323,12 +449,20 @@ class RotateBlockNode : public RotateNode
RotateBlockNode(NodeRef angle, NodeRef vec_node) RotateBlockNode(NodeRef angle, NodeRef vec_node)
: RotateNode(angle, vec_node) {} : RotateNode(angle, vec_node) {}
bool isTransformBlock() { return true; } bool isTransformBlock() { return true; }
virtual NodeRef evaluate()
{
return new RotateBlockNode(m_angle->evaluate(), m_vector->evaluate());
}
}; };
class ScaleNode : public VectorNode class ScaleNode : public VectorNode
{ {
public: public:
ScaleNode(NodeRef vector) : VectorNode(vector) {} ScaleNode(NodeRef vector) : VectorNode(vector) {}
virtual NodeRef evaluate()
{
return new ScaleNode(m_vector->evaluate());
}
}; };
class ScaleBlockNode : public ScaleNode class ScaleBlockNode : public ScaleNode
@ -336,6 +470,10 @@ class ScaleBlockNode : public ScaleNode
public: public:
ScaleBlockNode(NodeRef vector) : ScaleNode(vector) {} ScaleBlockNode(NodeRef vector) : ScaleNode(vector) {}
bool isTransformBlock() { return true; } bool isTransformBlock() { return true; }
virtual NodeRef evaluate()
{
return new ScaleBlockNode(m_vector->evaluate());
}
}; };
class ScaleScalarNode : public Node class ScaleScalarNode : public Node
@ -345,10 +483,10 @@ class ScaleScalarNode : public Node
: m_expr(expr) : m_expr(expr)
{ {
} }
refptr<Vector> getVector() virtual NodeRef evaluate()
{ {
double x = m_expr->getNumber(); NodeRef n = m_expr->evaluate();
return new Vector(x, x, x); return new VectorNode(n, n, n);
} }
protected: protected:
NodeRef m_expr; NodeRef m_expr;
@ -356,12 +494,15 @@ class ScaleScalarNode : public Node
class SceneNode : public Node class SceneNode : public Node
{ {
public:
virtual NodeRef evaluate() { return new SceneNode(); }
}; };
class ShapeDefinitionNode : public IdentifierNode class ShapeDefinitionNode : public IdentifierNode
{ {
public: public:
ShapeDefinitionNode(const std::string & str) : IdentifierNode(str) {} ShapeDefinitionNode(const std::string & str) : IdentifierNode(str) {}
virtual NodeRef evaluate() { return new ShapeDefinitionNode(m_string); }
}; };
class ShapeRefNode : public IdentifierNode class ShapeRefNode : public IdentifierNode
@ -369,42 +510,61 @@ class ShapeRefNode : public IdentifierNode
public: public:
ShapeRefNode(const std::string & str) : IdentifierNode(str) {} ShapeRefNode(const std::string & str) : IdentifierNode(str) {}
bool isShape() { return true; } bool isShape() { return true; }
virtual NodeRef evaluate() { return new ShapeRefNode(m_string); }
}; };
class ShininessNode : public NumberNode class ShininessNode : public NumberNode
{ {
public: public:
ShininessNode(NodeRef e) : NumberNode(e) {} ShininessNode(NodeRef e) : NumberNode(e) {}
virtual NodeRef evaluate()
{
return new ShininessNode(m_expr->evaluate());
}
}; };
class SizeNode : public VectorNode class SizeNode : public VectorNode
{ {
public: public:
SizeNode(NodeRef vector) : VectorNode(vector) {} SizeNode(NodeRef vector) : VectorNode(vector) {}
virtual NodeRef evaluate()
{
return new SizeNode(m_vector->evaluate());
}
}; };
class SpecularNode : public VectorNode class SpecularNode : public VectorNode
{ {
public: public:
SpecularNode(NodeRef vector) : VectorNode(vector) {} SpecularNode(NodeRef vector) : VectorNode(vector) {}
virtual NodeRef evaluate()
{
return new SpecularNode(m_vector->evaluate());
}
}; };
class SphereNode : public Node class SphereNode : public Node
{ {
public: public:
bool isShape() { return true; } bool isShape() { return true; }
virtual NodeRef evaluate() { return new SphereNode(); }
}; };
class SubtractNode : public Node class SubtractNode : public Node
{ {
public: public:
bool isShape() { return true; } bool isShape() { return true; }
virtual NodeRef evaluate() { return new SubtractNode(); }
}; };
class TranslateNode : public VectorNode class TranslateNode : public VectorNode
{ {
public: public:
TranslateNode(NodeRef vector) : VectorNode(vector) {} TranslateNode(NodeRef vector) : VectorNode(vector) {}
virtual NodeRef evaluate()
{
return new TranslateNode(m_vector->evaluate());
}
}; };
class TranslateBlockNode : public TranslateNode class TranslateBlockNode : public TranslateNode
@ -412,36 +572,57 @@ class TranslateBlockNode : public TranslateNode
public: public:
TranslateBlockNode(NodeRef vector) : TranslateNode(vector) {} TranslateBlockNode(NodeRef vector) : TranslateNode(vector) {}
bool isTransformBlock() { return true; } bool isTransformBlock() { return true; }
virtual NodeRef evaluate()
{
return new TranslateBlockNode(m_vector->evaluate());
}
}; };
class TransparencyNode : public NumberNode class TransparencyNode : public NumberNode
{ {
public: public:
TransparencyNode(NodeRef e) : NumberNode(e) {} TransparencyNode(NodeRef e) : NumberNode(e) {}
virtual NodeRef evaluate()
{
return new TransparencyNode(m_expr->evaluate());
}
}; };
class UnionNode : public Node class UnionNode : public Node
{ {
public: public:
bool isShape() { return true; } bool isShape() { return true; }
virtual NodeRef evaluate() { return new UnionNode(); }
}; };
class UpNode : public VectorNode class UpNode : public VectorNode
{ {
public: public:
UpNode(NodeRef vector) : VectorNode(vector) {} UpNode(NodeRef vector) : VectorNode(vector) {}
virtual NodeRef evaluate()
{
return new UpNode(m_vector->evaluate());
}
}; };
class VFOVNode : public NumberNode class VFOVNode : public NumberNode
{ {
public: public:
VFOVNode(NodeRef e) : NumberNode(e) {} VFOVNode(NodeRef e) : NumberNode(e) {}
virtual NodeRef evaluate()
{
return new VFOVNode(m_expr->evaluate());
}
}; };
class WidthNode : public NumberNode class WidthNode : public NumberNode
{ {
public: public:
WidthNode(NodeRef e) : NumberNode(e) {} WidthNode(NodeRef e) : NumberNode(e) {}
virtual NodeRef evaluate()
{
return new WidthNode(m_expr->evaluate());
}
}; };
/******** scripting nodes ********/ /******** scripting nodes ********/
@ -451,7 +632,6 @@ class ExpressionNode : public Node
public: public:
bool isExpression() { return true; } bool isExpression() { return true; }
virtual double getNumber() = 0; virtual double getNumber() = 0;
virtual int getInteger() { return getNumber(); }
}; };
class AssignmentNode : public ExpressionNode class AssignmentNode : public ExpressionNode