summaryrefslogtreecommitdiff
path: root/csgops.cc
diff options
context:
space:
mode:
authorclifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c>2009-07-03 07:51:22 (GMT)
committerclifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c>2009-07-03 07:51:22 (GMT)
commitcb6dbb3a37602a9113b970477fdffc827e239baa (patch)
treed1df82ebfa09ed529de1e1a6abb336586f008160 /csgops.cc
parent5c239e7868842195189c9c5782ba8a07c948f1e5 (diff)
Clifford Wolf:
Added caching of cgal nef polyhydrons git-svn-id: http://svn.clifford.at/openscad/trunk@49 b57f626f-c46c-0410-a088-ec61d464b74c
Diffstat (limited to 'csgops.cc')
-rw-r--r--csgops.cc31
1 files changed, 21 insertions, 10 deletions
diff --git a/csgops.cc b/csgops.cc
index 6f047f0..d2b3706 100644
--- a/csgops.cc
+++ b/csgops.cc
@@ -63,6 +63,12 @@ AbstractNode *CsgModule::evaluate(const Context*, const ModuleInstanciation *ins
CGAL_Nef_polyhedron CsgNode::render_cgal_nef_polyhedron() const
{
+ QString cache_id = cgal_nef_cache_id();
+ if (cgal_nef_cache.contains(cache_id)) {
+ progress_report();
+ return *cgal_nef_cache[cache_id];
+ }
+
bool first = true;
CGAL_Nef_polyhedron N;
foreach (AbstractNode *v, children) {
@@ -77,6 +83,8 @@ CGAL_Nef_polyhedron CsgNode::render_cgal_nef_polyhedron() const
N *= v->render_cgal_nef_polyhedron();
}
}
+
+ cgal_nef_cache.insert(cache_id, new CGAL_Nef_polyhedron(N), N.number_of_vertices());
progress_report();
return N;
}
@@ -107,16 +115,19 @@ CSGTerm *CsgNode::render_csg_term(double m[16], QVector<CSGTerm*> *highlights) c
QString CsgNode::dump(QString indent) const
{
- QString text = indent + QString("n%1: ").arg(idx);
- if (type == UNION)
- text += "union() {\n";
- if (type == DIFFERENCE)
- text += "difference() {\n";
- if (type == INTERSECTION)
- text += "intersection() {\n";
- foreach (AbstractNode *v, children)
- text += v->dump(indent + QString("\t"));
- return text + indent + "}\n";
+ if (dump_cache.isEmpty()) {
+ QString text = indent + QString("n%1: ").arg(idx);
+ if (type == UNION)
+ text += "union() {\n";
+ if (type == DIFFERENCE)
+ text += "difference() {\n";
+ if (type == INTERSECTION)
+ text += "intersection() {\n";
+ foreach (AbstractNode *v, children)
+ text += v->dump(indent + QString("\t"));
+ ((AbstractNode*)this)->dump_cache = text + indent + "}\n";
+ }
+ return dump_cache;
}
void register_builtin_csgops()
contact: Jan Huwald // Impressum