diff options
Diffstat (limited to 'src/cgaladv.cc')
-rw-r--r-- | src/cgaladv.cc | 179 |
1 files changed, 48 insertions, 131 deletions
diff --git a/src/cgaladv.cc b/src/cgaladv.cc index dd797fd..50d2a15 100644 --- a/src/cgaladv.cc +++ b/src/cgaladv.cc @@ -30,6 +30,9 @@ #include "builtin.h" #include "printutils.h" #include "cgal.h" +#include "visitor.h" +#include <sstream> +#include <assert.h> #ifdef ENABLE_CGAL extern CGAL_Nef_polyhedron3 minkowski3(CGAL_Nef_polyhedron3 a, CGAL_Nef_polyhedron3 b); @@ -55,18 +58,34 @@ public: class CgaladvNode : public AbstractNode { public: - Value path; - QString subdiv_type; - int convexity, level; - cgaladv_type_e type; CgaladvNode(const ModuleInstantiation *mi, cgaladv_type_e type) : AbstractNode(mi), type(type) { convexity = 1; } -#ifdef ENABLE_CGAL - virtual CGAL_Nef_polyhedron render_cgal_nef_polyhedron() const; -#endif - virtual CSGTerm *render_csg_term(double m[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const; - virtual QString dump(QString indent) const; + virtual ~CgaladvNode() { } + virtual Response accept(class State &state, Visitor &visitor) const { + return visitor.visit(state, *this); + } + virtual std::string toString() const; + virtual std::string name() const { + switch (this->type) { + case MINKOWSKI: + return "minkowski"; + break; + case GLIDE: + return "glide"; + break; + case SUBDIV: + return "subdiv"; + break; + default: + assert(false); + } + } + + Value path; + std::string subdiv_type; + int convexity, level; + cgaladv_type_e type; }; AbstractNode *CgaladvModule::evaluate(const Context *ctx, const ModuleInstantiation *inst) const @@ -130,129 +149,27 @@ void register_builtin_cgaladv() builtin_modules["hull"] = new CgaladvModule(HULL); } -#ifdef ENABLE_CGAL - -CGAL_Nef_polyhedron CgaladvNode::render_cgal_nef_polyhedron() const +std::string CgaladvNode::toString() const { - QString cache_id = mk_cache_id(); - if (cgal_nef_cache.contains(cache_id)) { - progress_report(); - PRINT(cgal_nef_cache[cache_id]->msg); - return cgal_nef_cache[cache_id]->N; + std::stringstream stream; + + stream << this->name(); + switch (type) { + case MINKOWSKI: + stream << "(convexity = " << this->convexity << ")"; + break; + case GLIDE: + stream << "(path = " << this->path << ", convexity = " << this->convexity << ")"; + break; + case SUBDIV: + stream << "(level = " << this->level << ", convexity = " << this->convexity << ")"; + break; + case HULL: + stream << "()"; + break; + default: + assert(false); } - print_messages_push(); - CGAL_Nef_polyhedron N; - - if (type == MINKOWSKI) - { - bool first = true; - foreach(AbstractNode * v, children) { - if (v->modinst->tag_background) - continue; - if (first) { - N = v->render_cgal_nef_polyhedron(); - if (N.dim != 0) - first = false; - } else { - CGAL_Nef_polyhedron tmp = v->render_cgal_nef_polyhedron(); - if (N.dim == 3 && tmp.dim == 3) { - N.p3 = minkowski3(N.p3, tmp.p3); - } - if (N.dim == 2 && tmp.dim == 2) { - N.p2 = minkowski2(N.p2, tmp.p2); - } - } - v->progress_report(); - } - } - - if (type == GLIDE) - { - PRINT("WARNING: subdiv() is not implemented yet!"); - } - - if (type == SUBDIV) - { - PRINT("WARNING: subdiv() is not implemented yet!"); - } - - if (type == HULL) - { - std::list<CGAL_Nef_polyhedron2> polys; - bool all2d = true; - foreach(AbstractNode * v, children) { - if (v->modinst->tag_background) - continue; - N = v->render_cgal_nef_polyhedron(); - if (N.dim == 3) { - //polys.push_back(tmp.p3); - PRINT("WARNING: hull() is not implemented yet for 3D objects!"); - all2d=false; - } - if (N.dim == 2) { - polys.push_back(N.p2); - } - v->progress_report(); - } - - if (all2d) - N.p2 = convexhull2(polys); - } - - cgal_nef_cache.insert(cache_id, new cgal_nef_cache_entry(N), N.weight()); - print_messages_pop(); - progress_report(); - - return N; + return stream.str(); } - -CSGTerm *CgaladvNode::render_csg_term(double m[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const -{ - if (type == MINKOWSKI) - return render_csg_term_from_nef(m, highlights, background, "minkowski", this->convexity); - - if (type == GLIDE) - return render_csg_term_from_nef(m, highlights, background, "glide", this->convexity); - - if (type == SUBDIV) - return render_csg_term_from_nef(m, highlights, background, "subdiv", this->convexity); - - if (type == HULL) - return render_csg_term_from_nef(m, highlights, background, "hull", this->convexity); - - return NULL; -} - -#else // ENABLE_CGAL - -CSGTerm *CgaladvNode::render_csg_term(double m[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const -{ - PRINT("WARNING: Found minkowski(), glide(), subdiv() or hull() statement but compiled without CGAL support!"); - return NULL; -} - -#endif // ENABLE_CGAL - -QString CgaladvNode::dump(QString indent) const -{ - if (dump_cache.isEmpty()) { - QString text; - if (type == MINKOWSKI) - text.sprintf("minkowski(convexity = %d) {\n", this->convexity); - if (type == GLIDE) { - text.sprintf(", convexity = %d) {\n", this->convexity); - text = QString("glide(path = ") + this->path.dump() + text; - } - if (type == SUBDIV) - text.sprintf("subdiv(level = %d, convexity = %d) {\n", this->level, this->convexity); - if (type == HULL) - text.sprintf("hull() {\n"); - foreach (AbstractNode *v, this->children) - text += v->dump(indent + QString("\t")); - text += indent + "}\n"; - ((AbstractNode*)this)->dump_cache = indent + QString("n%1: ").arg(idx) + text; - } - return dump_cache; -} - |