diff options
Diffstat (limited to 'polyset.cc')
-rw-r--r-- | polyset.cc | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/polyset.cc b/polyset.cc new file mode 100644 index 0000000..f4304e3 --- /dev/null +++ b/polyset.cc @@ -0,0 +1,154 @@ +/* + * OpenSCAD (www.openscad.at) + * Copyright (C) 2009 Clifford Wolf <clifford@clifford.at> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#define INCLUDE_ABSTRACT_NODE_DETAILS + +#include "openscad.h" + +PolySet::PolySet() +{ +} + +void PolySet::append_poly() +{ + polygons.append(Polygon()); +} + +void PolySet::append_vertex(double x, double y, double z) +{ + polygons.last().append(Point(x, y, z)); +} + +void PolySet::insert_vertex(double x, double y, double z) +{ + polygons.last().insert(0, Point(x, y, z)); +} + +void PolySet::render_opengl() const +{ + for (int i = 0; i < polygons.size(); i++) { + const Polygon *poly = &polygons[i]; + glBegin(GL_POLYGON); + for (int j = 0; j < poly->size(); j++) { + const Point *p = &poly->at(j); + glVertex3d(p->x, p->y, p->z); + } + glEnd(); + } +} + +#ifdef ENABLE_CGAL + +class CGAL_Build_PolySet : public CGAL::Modifier_base<CGAL_HDS> +{ +public: + typedef CGAL_HDS::Vertex::Point Point; + + const PolySet *ps; + CGAL_Build_PolySet(const PolySet *ps) : ps(ps) { } + + void operator()(CGAL_HDS& hds) + { + CGAL_Polybuilder B(hds, true); + + typedef QPair<QPair<double,double>,double> PointKey_t; + #define PointKey(_x,_y,_z) PointKey_t(QPair<double,double>(_x,_y),_z) + + QVector<PolySet::Point> vertices; + QHash<PointKey_t,int> vertices_idx; + + for (int i = 0; i < ps->polygons.size(); i++) { + const PolySet::Polygon *poly = &ps->polygons[i]; + for (int j = 0; j < poly->size(); j++) { + const PolySet::Point *p = &poly->at(j); + PointKey_t pk = PointKey(p->x, p->y, p->z); + if (!vertices_idx.contains(pk)) { + vertices_idx[pk] = vertices.size(); + vertices.append(*p); + } + } + } + + B.begin_surface(vertices.size(), ps->polygons.size()); + + for (int i = 0; i < vertices.size(); i++) { + const PolySet::Point *p = &vertices[i]; + B.add_vertex(Point(p->x, p->y, p->z)); + } + + for (int i = 0; i < ps->polygons.size(); i++) { + const PolySet::Polygon *poly = &ps->polygons[i]; + B.begin_facet(); + for (int j = 0; j < poly->size(); j++) { + const PolySet::Point *p = &poly->at(j); + PointKey_t pk = PointKey(p->x, p->y, p->z); + B.add_vertex_to_facet(vertices_idx[pk]); + } + B.end_facet(); + } + + B.end_surface(); + + #undef PointKey + } +}; + +CGAL_Nef_polyhedron PolySet::render_cgal_nef_polyhedron() const +{ + CGAL_Polyhedron P; + CGAL_Build_PolySet builder(this); + P.delegate(builder); +#if 0 + std::cout << P; +#endif + CGAL_Nef_polyhedron N(P); + return N; +} + +#endif /* ENABLE_CGAL */ + +PolySet *AbstractPolyNode::render_polyset(render_mode_e) const +{ + return NULL; +} + +#ifdef ENABLE_CGAL + +CGAL_Nef_polyhedron AbstractPolyNode::render_cgal_nef_polyhedron() const +{ + PolySet *ps = render_polyset(RENDER_CGAL); + CGAL_Nef_polyhedron N = ps->render_cgal_nef_polyhedron(); + progress_report(); + delete ps; + return N; +} + +#endif /* ENABLE_CGAL */ + +#ifdef ENABLE_OPENCSG + +CSGTerm *AbstractPolyNode::render_csg_term(double m[16]) const +{ + PolySet *ps = render_polyset(RENDER_OPENCSG); + return new CSGTerm(ps, m); +} + +#endif /* ENABLE_OPENCSG */ + |