#ifndef CSGTERMEVALUATOR_H_ #define CSGTERMEVALUATOR_H_ #include #include #include #include #include "Tree.h" #include "visitor.h" #include "node.h" using std::string; using std::map; using std::list; using std::vector; class CSGTermEvaluator : public Visitor { public: CSGTermEvaluator(const Tree &tree, class PolySetEvaluator *psevaluator = NULL) : highlights(NULL), background(NULL), tree(tree), psevaluator(psevaluator) { } virtual ~CSGTermEvaluator() {} virtual Response visit(State &state, const AbstractNode &node); virtual Response visit(State &state, const AbstractIntersectionNode &node); virtual Response visit(State &state, const AbstractPolyNode &node); virtual Response visit(State &state, const CsgNode &node); virtual Response visit(State &state, const TransformNode &node); virtual Response visit(State &state, const RenderNode &node); class CSGTerm *evaluateCSGTerm(const AbstractNode &node, vector *highlights, vector *background); private: enum CsgOp {UNION, INTERSECTION, DIFFERENCE, MINKOWSKI}; void addToParent(const State &state, const AbstractNode &node); void applyToChildren(const AbstractNode &node, CSGTermEvaluator::CsgOp op); const AbstractNode *root; typedef list ChildList; map visitedchildren; public: map stored_term; // The term evaluated from each node index vector *highlights; vector *background; const Tree &tree; class PolySetEvaluator *psevaluator; }; #endif