diff options
author | Marius Kintel <marius@kintel.net> | 2011-09-11 08:51:55 (GMT) |
---|---|---|
committer | Marius Kintel <marius@kintel.net> | 2011-09-11 08:51:55 (GMT) |
commit | 95949cf961d84f65ad9bfb9f2dec7361059ca515 (patch) | |
tree | b5d50e381362d013d8cce12c524571f013a990a2 | |
parent | 18e97e0bd3f6bda4fdcd17de2a85173ba59b6b00 (diff) |
Implemented CGAL caching
-rw-r--r-- | openscad.pro | 2 | ||||
-rw-r--r-- | src/CGALEvaluator.cc | 92 | ||||
-rw-r--r-- | src/CGALEvaluator.h | 8 | ||||
-rw-r--r-- | src/CGAL_Nef_polyhedron.cc | 4 | ||||
-rw-r--r-- | src/CGAL_Nef_polyhedron.h | 12 | ||||
-rw-r--r-- | src/PolySetCGALEvaluator.cc | 2 | ||||
-rw-r--r-- | src/PolySetEvaluator.cc | 8 | ||||
-rw-r--r-- | src/Tree.cc | 24 | ||||
-rw-r--r-- | src/Tree.h | 2 | ||||
-rw-r--r-- | src/mainwin.cc | 11 | ||||
-rw-r--r-- | src/nodecache.h | 5 | ||||
-rw-r--r-- | src/openscad.cc | 4 | ||||
-rw-r--r-- | tests/CMakeLists.txt | 6 | ||||
-rw-r--r-- | tests/cgalpngtest.cc | 8 | ||||
-rw-r--r-- | tests/cgaltest.cc | 8 | ||||
-rw-r--r-- | tests/opencsgtest.cc | 3 |
16 files changed, 92 insertions, 107 deletions
diff --git a/openscad.pro b/openscad.pro index baa9899..1abca19 100644 --- a/openscad.pro +++ b/openscad.pro @@ -217,6 +217,7 @@ HEADERS += src/cgal.h \ src/cgalfwd.h \ src/cgalutils.h \ src/CGALEvaluator.h \ + src/CGALCache.h \ src/PolySetCGALEvaluator.h \ src/CGALRenderer.h \ src/CGAL_Nef_polyhedron.h @@ -224,6 +225,7 @@ HEADERS += src/cgal.h \ SOURCES += src/cgalutils.cc \ src/CGALEvaluator.cc \ src/PolySetCGALEvaluator.cc \ + src/CGALCache.cc \ src/CGALRenderer.cc \ src/CGAL_Nef_polyhedron.cc \ src/CGAL_Nef_polyhedron_DxfData.cc \ diff --git a/src/CGALEvaluator.cc b/src/CGALEvaluator.cc index 51fe41a..d950cb8 100644 --- a/src/CGALEvaluator.cc +++ b/src/CGALEvaluator.cc @@ -1,3 +1,4 @@ +#include "CGALCache.h" #include "CGALEvaluator.h" #include "visitor.h" #include "state.h" @@ -11,6 +12,7 @@ #include "dxfdata.h" #include "dxftess.h" +#include "CGALCache.h" #include "cgal.h" #include "cgalutils.h" #include <CGAL/assertions_behaviour.h> @@ -31,12 +33,12 @@ CGAL_Nef_polyhedron CGALEvaluator::evaluateCGALMesh(const AbstractNode &node) evaluate.execute(); assert(isCached(node)); } - return this->cache[this->tree.getString(node)]; + return CGALCache::instance()->get(this->tree.getIdString(node)); } bool CGALEvaluator::isCached(const AbstractNode &node) const { - return this->cache.contains(this->tree.getString(node)); + return CGALCache::instance()->contains(this->tree.getIdString(node)); } /*! @@ -68,10 +70,8 @@ void CGALEvaluator::process(CGAL_Nef_polyhedron &target, const CGAL_Nef_polyhedr } /*! - FIXME: Let caller insert into the cache since caller might modify the result - (e.g. transform) */ -void CGALEvaluator::applyToChildren(const AbstractNode &node, CGALEvaluator::CsgOp op) +CGAL_Nef_polyhedron CGALEvaluator::applyToChildren(const AbstractNode &node, CGALEvaluator::CsgOp op) { CGAL_Nef_polyhedron N; if (this->visitedchildren[node.index()].size() > 0) { @@ -84,20 +84,21 @@ void CGALEvaluator::applyToChildren(const AbstractNode &node, CGALEvaluator::Csg if (chnode->modinst->tag_background) continue; assert(isCached(*chnode)); if (N.empty()) { - N = this->cache[chcacheid].copy(); + N = CGALCache::instance()->get(chcacheid).copy(); } else { - process(N, this->cache[chcacheid], op); + process(N, CGALCache::instance()->get(chcacheid), op); } chnode->progress_report(); } } - this->cache.insert(this->tree.getString(node), N); + return N; } extern CGAL_Nef_polyhedron2 *convexhull2(std::list<CGAL_Nef_polyhedron2*> a); -void CGALEvaluator::applyHull(const CgaladvNode &node) +CGAL_Nef_polyhedron CGALEvaluator::applyHull(const CgaladvNode &node) { + CGAL_Nef_polyhedron N; if (this->visitedchildren[node.index()].size() > 0) { std::list<CGAL_Nef_polyhedron2*> polys; bool all2d = true; @@ -109,9 +110,9 @@ void CGALEvaluator::applyHull(const CgaladvNode &node) // FIXME: Don't use deep access to modinst members if (chnode->modinst->tag_background) continue; assert(isCached(*chnode)); - const CGAL_Nef_polyhedron &ch = this->cache[chcacheid]; + const CGAL_Nef_polyhedron &ch = CGALCache::instance()->get(chcacheid); if (ch.dim == 2) { - polys.push_back(ch.p2); + polys.push_back(ch.p2.get()); } else if (ch.dim == 3) { PRINT("WARNING: hull() is not implemented yet for 3D objects!"); @@ -121,10 +122,10 @@ void CGALEvaluator::applyHull(const CgaladvNode &node) } if (all2d) { - CGAL_Nef_polyhedron N(convexhull2(polys)); - this->cache.insert(this->tree.getString(node), N); + N = CGAL_Nef_polyhedron(convexhull2(polys)); } } + return N; } /* @@ -138,7 +139,10 @@ Response CGALEvaluator::visit(State &state, const AbstractNode &node) { if (state.isPrefix() && isCached(node)) return PruneTraversal; if (state.isPostfix()) { - if (!isCached(node)) applyToChildren(node, CGE_UNION); + if (!isCached(node)) { + CGAL_Nef_polyhedron N = applyToChildren(node, CGE_UNION); + CGALCache::instance()->insert(this->tree.getIdString(node), N); + } addToParent(state, node); } return ContinueTraversal; @@ -148,7 +152,10 @@ Response CGALEvaluator::visit(State &state, const AbstractIntersectionNode &node { if (state.isPrefix() && isCached(node)) return PruneTraversal; if (state.isPostfix()) { - if (!isCached(node)) applyToChildren(node, CGE_INTERSECTION); + if (!isCached(node)) { + CGAL_Nef_polyhedron N = applyToChildren(node, CGE_INTERSECTION); + CGALCache::instance()->insert(this->tree.getIdString(node), N); + } addToParent(state, node); } return ContinueTraversal; @@ -173,7 +180,8 @@ Response CGALEvaluator::visit(State &state, const CsgNode &node) default: assert(false); } - applyToChildren(node, op); + CGAL_Nef_polyhedron N = applyToChildren(node, op); + CGALCache::instance()->insert(this->tree.getIdString(node), N); } addToParent(state, node); } @@ -186,10 +194,9 @@ Response CGALEvaluator::visit(State &state, const TransformNode &node) if (state.isPostfix()) { if (!isCached(node)) { // First union all children - applyToChildren(node, CGE_UNION); + CGAL_Nef_polyhedron N = applyToChildren(node, CGE_UNION); // Then apply transform - CGAL_Nef_polyhedron N = this->cache[this->tree.getString(node)]; // If there is no geometry under the transform, N will be empty and of dim 0, // just just silently ignore such nodes if (N.dim == 2) { @@ -223,7 +230,7 @@ Response CGALEvaluator::visit(State &state, const TransformNode &node) node.matrix[2], node.matrix[6], node.matrix[10], node.matrix[14], node.matrix[15]); N.p3->transform(t); } - this->cache.insert(this->tree.getString(node), N); + CGALCache::instance()->insert(this->tree.getIdString(node), N); } addToParent(state, node); } @@ -239,16 +246,11 @@ Response CGALEvaluator::visit(State &state, const AbstractPolyNode &node) shared_ptr<PolySet> ps = this->psevaluator.getPolySet(node, false); CGAL_Nef_polyhedron N; if (ps) { - try { - N = evaluateCGALMesh(*ps); + N = evaluateCGALMesh(*ps); // print_messages_pop(); - node.progress_report(); - } - catch (...) { - throw; - } + node.progress_report(); } - this->cache.insert(this->tree.getString(node), N); + CGALCache::instance()->insert(this->tree.getIdString(node), N); } addToParent(state, node); } @@ -260,11 +262,12 @@ Response CGALEvaluator::visit(State &state, const CgaladvNode &node) if (state.isPrefix() && isCached(node)) return PruneTraversal; if (state.isPostfix()) { if (!isCached(node)) { + CGAL_Nef_polyhedron N; CGALEvaluator::CsgOp op; switch (node.type) { case MINKOWSKI: op = CGE_MINKOWSKI; - applyToChildren(node, op); + N = applyToChildren(node, op); break; case GLIDE: PRINT("WARNING: glide() is not implemented yet!"); @@ -275,9 +278,10 @@ Response CGALEvaluator::visit(State &state, const CgaladvNode &node) return PruneTraversal; break; case HULL: - applyHull(node); + N = applyHull(node); break; } + CGALCache::instance()->insert(this->tree.getIdString(node), N); } addToParent(state, node); } @@ -293,37 +297,9 @@ void CGALEvaluator::addToParent(const State &state, const AbstractNode &node) assert(state.isPostfix()); this->visitedchildren.erase(node.index()); if (state.parent()) { - this->visitedchildren[state.parent()->index()].push_back(std::make_pair(&node, this->tree.getString(node))); - } -} - -#if 0 -/*! - Static function to evaluate CGAL meshes. - NB! This is just a support function used for development and debugging -*/ -CGAL_Nef_polyhedron CGALEvaluator::evaluateCGALMesh(const AbstractPolyNode &node) -{ - // FIXME: Lookup Nef polyhedron in cache. - - // print_messages_push(); - - shared_ptr<PolySet> ps = this->psevaluator->getPolySet(node, false); - if (ps) { - try { - CGAL_Nef_polyhedron N = ps->evaluateCSGMesh(); - // FIXME: Insert into cache - // print_messages_pop(); - node.progress_report(); - - return N; - } - catch (...) { // Don't leak the PolySet on ProgressCancelException - throw; - } + this->visitedchildren[state.parent()->index()].push_back(std::make_pair(&node, this->tree.getIdString(node))); } } -#endif CGAL_Nef_polyhedron CGALEvaluator::evaluateCGALMesh(const PolySet &ps) { diff --git a/src/CGALEvaluator.h b/src/CGALEvaluator.h index a8e9844..c1b5ae8 100644 --- a/src/CGALEvaluator.h +++ b/src/CGALEvaluator.h @@ -20,8 +20,7 @@ class CGALEvaluator : public Visitor { public: enum CsgOp {CGE_UNION, CGE_INTERSECTION, CGE_DIFFERENCE, CGE_MINKOWSKI}; - // FIXME: If a cache is not given, we need to fix this ourselves - CGALEvaluator(QHash<string, CGAL_Nef_polyhedron> &cache, const Tree &tree) : cache(cache), tree(tree), psevaluator(*this) {} + CGALEvaluator(const Tree &tree) : tree(tree), psevaluator(*this) {} virtual ~CGALEvaluator() {} virtual Response visit(State &state, const AbstractNode &node); @@ -40,14 +39,13 @@ private: void addToParent(const State &state, const AbstractNode &node); bool isCached(const AbstractNode &node) const; void process(CGAL_Nef_polyhedron &target, const CGAL_Nef_polyhedron &src, CGALEvaluator::CsgOp op); - void applyToChildren(const AbstractNode &node, CGALEvaluator::CsgOp op); - void applyHull(const CgaladvNode &node); + CGAL_Nef_polyhedron applyToChildren(const AbstractNode &node, CGALEvaluator::CsgOp op); + CGAL_Nef_polyhedron applyHull(const CgaladvNode &node); string currindent; typedef list<pair<const AbstractNode *, string> > ChildList; map<int, ChildList> visitedchildren; - QHash<string, CGAL_Nef_polyhedron> &cache; const Tree &tree; public: // FIXME: Do we need to make this visible? Used for cache management diff --git a/src/CGAL_Nef_polyhedron.cc b/src/CGAL_Nef_polyhedron.cc index ea08ca1..975c9a4 100644 --- a/src/CGAL_Nef_polyhedron.cc +++ b/src/CGAL_Nef_polyhedron.cc @@ -85,7 +85,7 @@ PolySet *CGAL_Nef_polyhedron::convertToPolyset() CGAL_Nef_polyhedron CGAL_Nef_polyhedron::copy() const { CGAL_Nef_polyhedron copy = *this; - if (copy.p2) copy.p2 = new CGAL_Nef_polyhedron2(*copy.p2); - else if (copy.p3) copy.p3 = new CGAL_Nef_polyhedron3(*copy.p3); + if (copy.p2) copy.p2.reset(new CGAL_Nef_polyhedron2(*copy.p2)); + else if (copy.p3) copy.p3.reset(new CGAL_Nef_polyhedron3(*copy.p3)); return copy; } diff --git a/src/CGAL_Nef_polyhedron.h b/src/CGAL_Nef_polyhedron.h index 616ba23..a2eedaf 100644 --- a/src/CGAL_Nef_polyhedron.h +++ b/src/CGAL_Nef_polyhedron.h @@ -4,13 +4,14 @@ #ifdef ENABLE_CGAL #include "cgalfwd.h" +#include "memory.h" class CGAL_Nef_polyhedron { public: - CGAL_Nef_polyhedron() : dim(0), p2(0), p3(0) {} - CGAL_Nef_polyhedron(CGAL_Nef_polyhedron2 *p) : dim(2), p2(p), p3(0) {} - CGAL_Nef_polyhedron(CGAL_Nef_polyhedron3 *p) : dim(3), p2(0), p3(p) {} + CGAL_Nef_polyhedron() : dim(0) {} + CGAL_Nef_polyhedron(CGAL_Nef_polyhedron2 *p) : dim(2), p2(p) {} + CGAL_Nef_polyhedron(CGAL_Nef_polyhedron3 *p) : dim(3), p3(p) {} ~CGAL_Nef_polyhedron() {} bool empty() const { return (dim == 0 || !p2 && !p3); } @@ -24,9 +25,8 @@ public: class DxfData *convertToDxfData() const; int dim; - // FIXME: Define ownership of the CGAL objects, e.g. use reference-counted smart pointers - CGAL_Nef_polyhedron2 *p2; - CGAL_Nef_polyhedron3 *p3; + shared_ptr<CGAL_Nef_polyhedron2> p2; + shared_ptr<CGAL_Nef_polyhedron3> p3; }; #endif /* ENABLE_CGAL */ diff --git a/src/PolySetCGALEvaluator.cc b/src/PolySetCGALEvaluator.cc index 9f9ab6e..b019ad5 100644 --- a/src/PolySetCGALEvaluator.cc +++ b/src/PolySetCGALEvaluator.cc @@ -162,7 +162,7 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const ProjectionNode &node) // FIXME: Should the CGAL_Nef_polyhedron2 be cached? if (np.empty()) { np.dim = 2; - np.p2 = new CGAL_Nef_polyhedron2(plist.begin(), plist.end(), CGAL_Nef_polyhedron2::INCLUDED); + np.p2.reset(new CGAL_Nef_polyhedron2(plist.begin(), plist.end(), CGAL_Nef_polyhedron2::INCLUDED)); } else { (*np.p2) += CGAL_Nef_polyhedron2(plist.begin(), plist.end(), CGAL_Nef_polyhedron2::INCLUDED); diff --git a/src/PolySetEvaluator.cc b/src/PolySetEvaluator.cc index e46ae59..1f09127 100644 --- a/src/PolySetEvaluator.cc +++ b/src/PolySetEvaluator.cc @@ -10,11 +10,6 @@ class. */ -static bool filter(char c) -{ - return c == ' ' || c == '\n' || c == '\t' || c == '\r'; -} - /*! Factory method returning a PolySet from the given node. If the node is already cached, the cached PolySet will be returned @@ -23,8 +18,7 @@ static bool filter(char c) */ shared_ptr<PolySet> PolySetEvaluator::getPolySet(const AbstractNode &node, bool cache) { - std::string cacheid = this->tree.getString(node); - cacheid.erase(std::remove_if(cacheid.begin(), cacheid.end(), filter), cacheid.end()); + std::string cacheid = this->tree.getIdString(node); if (PolySetCache::instance()->contains(cacheid)) { // For cache debugging diff --git a/src/Tree.cc b/src/Tree.cc index e791e12..68cb2bf 100644 --- a/src/Tree.cc +++ b/src/Tree.cc @@ -21,6 +21,30 @@ const std::string &Tree::getString(const AbstractNode &node) const return this->nodecache[node]; } +static bool filter(char c) +{ + return c == ' ' || c == '\n' || c == '\t' || c == '\r'; +} + +/*! + Returns the cached ID string representation of the subtree rooted by \a node. + If node is not cached, the cache will be rebuilt. + + The difference between this method and getString() is that the ID string + is stripped for whitespace. Especially indentation whitespace is important to + strip to enable cache hits for equivalent nodes from different scopes. +*/ +const std::string &Tree::getIdString(const AbstractNode &node) const +{ + assert(this->root_node); + if (!this->nodeidcache.contains(node)) { + std::string str = getString(node); + str.erase(std::remove_if(str.begin(), str.end(), filter), str.end()); + return this->nodeidcache.insert(node, str); + } + return this->nodeidcache[node]; +} + /*! Sets a new root. Will clear the existing cache. */ @@ -21,10 +21,12 @@ public: const AbstractNode *root() const { return this->root_node; } const string &getString(const AbstractNode &node) const; + const string &getIdString(const AbstractNode &node) const; private: const AbstractNode *root_node; mutable NodeCache nodecache; + mutable NodeCache nodeidcache; }; #endif diff --git a/src/mainwin.cc b/src/mainwin.cc index 130e237..f9b60a6 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -86,6 +86,7 @@ using namespace boost::lambda; #ifdef ENABLE_CGAL +#include "CGALCache.h" #include "CGALEvaluator.h" #include "PolySetCGALEvaluator.h" #include "CGALRenderer.h" @@ -780,9 +781,7 @@ void MainWindow::compileCSG(bool procevents) progress_report_prep(root_node, report_func, pd); try { - // FIXME: put cache somewhere else as it's pretty useless now - QHash<std::string, CGAL_Nef_polyhedron> cache; - CGALEvaluator cgalevaluator(cache, this->tree); + CGALEvaluator cgalevaluator(this->tree); PolySetCGALEvaluator psevaluator(cgalevaluator); CSGTermEvaluator csgrenderer(this->tree, &psevaluator); root_raw_term = csgrenderer.evaluateCSGTerm(*root_node, highlight_terms, background_terms); @@ -792,6 +791,7 @@ void MainWindow::compileCSG(bool procevents) QApplication::processEvents(); } PolySetCache::instance()->print(); + CGALCache::instance()->print(); } catch (ProgressCancelException e) { PRINT("CSG generation cancelled."); @@ -1223,11 +1223,10 @@ void MainWindow::actionRenderCGAL() progress_report_prep(this->root_node, report_func, pd); try { - // FIXME: put cache somewhere else as it's pretty useless now - QHash<std::string, CGAL_Nef_polyhedron> cache; - CGALEvaluator evaluator(cache, this->tree); + CGALEvaluator evaluator(this->tree); this->root_N = new CGAL_Nef_polyhedron(evaluator.evaluateCGALMesh(*this->root_node)); PolySetCache::instance()->print(); + CGALCache::instance()->print(); } catch (ProgressCancelException e) { PRINT("Rendering cancelled."); diff --git a/src/nodecache.h b/src/nodecache.h index cc3355e..61afe3e 100644 --- a/src/nodecache.h +++ b/src/nodecache.h @@ -25,9 +25,10 @@ public: else return this->nullvalue; } - void insert(const class AbstractNode &node, const std::string & value) { + /*! Returns a reference to the cached string copy */ + const std::string &insert(const class AbstractNode &node, const std::string & value) { if (this->cache.size() <= node.index()) this->cache.resize(node.index() + 1); - this->cache[node.index()] = value; + return this->cache[node.index()] = value; } void remove(const class AbstractNode &node) { diff --git a/src/openscad.cc b/src/openscad.cc index c3ee389..fd74de4 100644 --- a/src/openscad.cc +++ b/src/openscad.cc @@ -249,9 +249,7 @@ int main(int argc, char **argv) NodeDumper dumper(nodecache); Tree tree; #ifdef ENABLE_CGAL - // FIXME: enforce some maximum cache size (old version had 100K vertices as limit) - QHash<std::string, CGAL_Nef_polyhedron> cache; - CGALEvaluator cgalevaluator(cache, tree); + CGALEvaluator cgalevaluator(tree); PolySetCGALEvaluator psevaluator(cgalevaluator); #endif diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 08ae030..509180e 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -144,7 +144,7 @@ include_directories(${CGAL_INCLUDE_DIRS}) # cgaltest # add_executable(cgaltest cgaltest.cc ../src/CGAL_Nef_polyhedron.cc ../src/cgalutils.cc ../src/CSGTermEvaluator.cc - ../src/CGALEvaluator.cc ../src/PolySetCGALEvaluator.cc ../src/qhash.cc + ../src/CGALEvaluator.cc ../src/CGALCache.cc ../src/PolySetCGALEvaluator.cc ../src/qhash.cc ../src/CGAL_Nef_polyhedron_DxfData.cc ../src/cgaladv_minkowski2.cc ../src/cgaladv_convexhull2.cc ${COMMON_SOURCES}) set_target_properties(cgaltest PROPERTIES COMPILE_FLAGS "-DENABLE_CGAL ${CGAL_CXX_FLAGS_INIT}") @@ -155,7 +155,7 @@ target_link_libraries(cgaltest ${CGAL_LIBRARY} ${CGAL_3RD_PARTY_LIBRARIES} ${QT_ # add_executable(cgalpngtest cgalpngtest.cc OffscreenView.cc OffscreenContext.mm ../src/CGALRenderer.cc ../src/CGAL_Nef_polyhedron.cc ../src/cgalutils.cc - ../src/CSGTermEvaluator.cc ../src/CGALEvaluator.cc + ../src/CSGTermEvaluator.cc ../src/CGALEvaluator.cc ../src/CGALCache.cc ../src/PolySetCGALEvaluator.cc ../src/qhash.cc ../src/CGAL_Nef_polyhedron_DxfData.cc ../src/cgaladv_minkowski2.cc ../src/cgaladv_convexhull2.cc ${COMMON_SOURCES}) @@ -168,7 +168,7 @@ target_link_libraries(cgalpngtest ${CGAL_LIBRARY} ${CGAL_3RD_PARTY_LIBRARIES} ${ add_executable(opencsgtest opencsgtest.cc OffscreenView.cc OffscreenContext.mm ../src/OpenCSGRenderer.cc ../src/ThrownTogetherRenderer.cc ../src/CSGTermEvaluator.cc ../src/CGAL_Nef_polyhedron.cc ../src/cgalutils.cc - ../src/CGALEvaluator.cc ../src/PolySetCGALEvaluator.cc ../src/qhash.cc + ../src/CGALEvaluator.cc ../src/CGALCache.cc ../src/PolySetCGALEvaluator.cc ../src/qhash.cc ../src/CGAL_Nef_polyhedron_DxfData.cc ../src/cgaladv_minkowski2.cc ../src/cgaladv_convexhull2.cc ${COMMON_SOURCES}) set_target_properties(opencsgtest PROPERTIES COMPILE_FLAGS "-DENABLE_OPENCSG -DENABLE_CGAL ${CGAL_CXX_FLAGS_INIT}") diff --git a/tests/cgalpngtest.cc b/tests/cgalpngtest.cc index 8e3859b..4c5c914 100644 --- a/tests/cgalpngtest.cc +++ b/tests/cgalpngtest.cc @@ -59,14 +59,11 @@ QString librarydir; using std::string; -// FIXME: enforce some maximum cache size (old version had 100K vertices as limit) -QHash<std::string, CGAL_Nef_polyhedron> cache; - void cgalTree(Tree &tree) { assert(tree.root()); - CGALEvaluator evaluator(cache, tree); + CGALEvaluator evaluator(tree); Traverser evaluate(evaluator, *tree.root(), Traverser::PRE_AND_POSTFIX); evaluate.execute(); } @@ -174,8 +171,7 @@ int main(int argc, char **argv) Tree tree(root_node); CsgInfo csgInfo; - QHash<std::string, CGAL_Nef_polyhedron> cache; - CGALEvaluator cgalevaluator(cache, tree); + CGALEvaluator cgalevaluator(tree); PolySetCGALEvaluator psevaluator(cgalevaluator); CGAL_Nef_polyhedron N = cgalevaluator.evaluateCGALMesh(*root_node); diff --git a/tests/cgaltest.cc b/tests/cgaltest.cc index 029fcfc..8dfb63c 100644 --- a/tests/cgaltest.cc +++ b/tests/cgaltest.cc @@ -54,14 +54,11 @@ QString librarydir; using std::string; -// FIXME: enforce some maximum cache size (old version had 100K vertices as limit) -QHash<std::string, CGAL_Nef_polyhedron> cache; - void cgalTree(Tree &tree) { assert(tree.root()); - CGALEvaluator evaluator(cache, tree); + CGALEvaluator evaluator(tree); Traverser evaluate(evaluator, *tree.root(), Traverser::PRE_AND_POSTFIX); evaluate.execute(); } @@ -163,8 +160,7 @@ int main(int argc, char **argv) Tree tree(root_node); - QHash<std::string, CGAL_Nef_polyhedron> cache; - CGALEvaluator cgalevaluator(cache, tree); + CGALEvaluator cgalevaluator(tree); PolySetCGALEvaluator psevaluator(cgalevaluator); CGAL_Nef_polyhedron N = cgalevaluator.evaluateCGALMesh(*root_node); diff --git a/tests/opencsgtest.cc b/tests/opencsgtest.cc index 28c0daa..59501a0 100644 --- a/tests/opencsgtest.cc +++ b/tests/opencsgtest.cc @@ -142,8 +142,7 @@ int main(int argc, char *argv[]) Tree tree(root_node); CsgInfo csgInfo; - QHash<std::string, CGAL_Nef_polyhedron> cache; - CGALEvaluator cgalevaluator(cache, tree); + CGALEvaluator cgalevaluator(tree); CSGTermEvaluator evaluator(tree, &cgalevaluator.psevaluator); CSGTerm *root_raw_term = evaluator.evaluateCSGTerm(*root_node, csgInfo.highlight_terms, |