diff --git a/parser/nodes.cc b/parser/nodes.cc index e940673..ba934b9 100644 --- a/parser/nodes.cc +++ b/parser/nodes.cc @@ -9,6 +9,35 @@ using namespace std; +void Node::evaluateChildren(refptr parent) +{ + /* recursively evaluate all children nodes */ + for (std::vector< refptr >::iterator it = m_children.begin(); + it != m_children.end(); + it++) + { + refptr evaluated = (*it)->evaluate(); + if ( ! evaluated.isNull() ) + { + if (typeid(*evaluated) == typeid(EvaluatePropagateNode)) + { + for (vector::iterator it2 + = evaluated->getChildren().begin(); + it2 != evaluated->getChildren().end(); + it2++) + { + parent->addChild(*it2); + } + } + else + { + (*it)->evaluateChildren(evaluated); + parent->addChild(evaluated); + } + } + } +} + void Node::addChildren(NodeRef other) { if (other.isNull()) diff --git a/parser/nodes.h b/parser/nodes.h index fa2716c..aed4e41 100644 --- a/parser/nodes.h +++ b/parser/nodes.h @@ -44,21 +44,7 @@ class Node std::cerr << "Warning: Node::evaluate() called!" << std::endl; return NULL; } - virtual void evaluateChildren(refptr parent) - { - /* recursively evaluate all children nodes */ - for (std::vector< refptr >::iterator it = m_children.begin(); - it != m_children.end(); - it++) - { - refptr evaluated = (*it)->evaluate(); - if ( ! evaluated.isNull() ) - { - (*it)->evaluateChildren(evaluated); - parent->addChild(evaluated); - } - } - } + virtual void evaluateChildren(refptr parent); virtual bool isShape() { return false; } virtual bool isMaterial() { return false; }