#793 Tessellate PolySets before rendering to properly support concave polygons

master
Marius Kintel 2015-02-02 18:57:21 -05:00
parent 384c6af273
commit 707103b606
7 changed files with 23 additions and 2 deletions

View File

@ -32,6 +32,7 @@
// dxfdata.h must come first for Eigen SIMD alignment issues
#include "dxfdata.h"
#include "polyset.h"
#include "polyset-utils.h"
#include "printutils.h"
#include "CGALRenderer.h"
@ -44,7 +45,13 @@
CGALRenderer::CGALRenderer(shared_ptr<const class Geometry> geom)
{
if (shared_ptr<const PolySet> ps = dynamic_pointer_cast<const PolySet>(geom)) {
this->polyset = ps;
assert(ps->getDimension() == 3);
// We need to tessellate here, in case the generated PolySet contains concave polygons
// See testdata/scad/3D/features/polyhedron-concave-test.scad
PolySet *ps_tri = new PolySet(3, ps->convexValue());
ps_tri->setConvexity(ps->getConvexity());
PolysetUtils::tessellate_faces(*ps, *ps_tri);
this->polyset.reset(ps_tri);
}
else if (shared_ptr<const Polygon2d> poly = dynamic_pointer_cast<const Polygon2d>(geom)) {
this->polyset.reset(poly->tessellate());

View File

@ -11,6 +11,7 @@
#include "printutils.h"
#include "GeometryEvaluator.h"
#include "polyset.h"
#include "polyset-utils.h"
#include <string>
#include <map>
@ -99,7 +100,20 @@ static shared_ptr<CSGTerm> evaluate_csg_term_from_geometry(const State &state,
// We cannot render Polygon2d directly, so we preprocess (tessellate) it here
shared_ptr<const Geometry> g = geom;
shared_ptr<const Polygon2d> p2d = dynamic_pointer_cast<const Polygon2d>(geom);
if (p2d) g.reset(p2d->tessellate());
if (p2d) {
g.reset(p2d->tessellate());
}
else {
// We cannot render concave polygons, so tessellate any 3D PolySets
shared_ptr<const PolySet> ps = dynamic_pointer_cast<const PolySet>(geom);
if (ps) {
assert(ps->getDimension() == 3);
PolySet *ps_tri = new PolySet(3, ps->convexValue());
ps_tri->setConvexity(ps->getConvexity());
PolysetUtils::tessellate_faces(*ps, *ps_tri);
g.reset(ps_tri);
}
}
shared_ptr<CSGTerm> t(new CSGTerm(g, state.matrix(), state.color(), stream.str()));
if (modinst->isHighlight()) {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB