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