summaryrefslogtreecommitdiff
path: root/src/CSGTermEvaluator.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/CSGTermEvaluator.h')
-rw-r--r--src/CSGTermEvaluator.h53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/CSGTermEvaluator.h b/src/CSGTermEvaluator.h
new file mode 100644
index 0000000..d1ea28e
--- /dev/null
+++ b/src/CSGTermEvaluator.h
@@ -0,0 +1,53 @@
+#ifndef CSGTERMEVALUATOR_H_
+#define CSGTERMEVALUATOR_H_
+
+#include <string>
+#include <map>
+#include <list>
+#include <vector>
+#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<CSGTerm*> *highlights, vector<CSGTerm*> *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<const AbstractNode *> ChildList;
+ map<int, ChildList> visitedchildren;
+
+public:
+ map<int, class CSGTerm*> stored_term; // The term evaluated from each node index
+
+ vector<CSGTerm*> *highlights;
+ vector<CSGTerm*> *background;
+ const Tree &tree;
+ class PolySetEvaluator *psevaluator;
+};
+
+#endif
contact: Jan Huwald // Impressum