From 6575732286d3f8909972d3705b748c6cfc02f8a8 Mon Sep 17 00:00:00 2001 From: clifford Date: Wed, 6 Jan 2010 09:21:40 +0000 Subject: Clifford Wolf: Fixed inner-borders-bug in 2d visualization (symptom: rendering artefacts even with higher convexity setting as it should be needed) git-svn-id: http://svn.clifford.at/openscad/trunk@214 b57f626f-c46c-0410-a088-ec61d464b74c diff --git a/dxftess.cc b/dxftess.cc index 3a567fa..bf89557 100644 --- a/dxftess.cc +++ b/dxftess.cc @@ -341,3 +341,23 @@ void dxf_tesselate(PolySet *ps, DxfData *dxf, double rot, bool up, double h) tess_tri.clear(); } + +void dxf_border_to_ps(PolySet *ps, DxfData *dxf) +{ + for (int i = 0; i < dxf->paths.count(); i++) { + DxfData::Path *pt = &dxf->paths[i]; + if (!pt->is_closed) + continue; + ps->borders.append(PolySet::Polygon()); + for (int j = 1; j < pt->points.count(); j++) { + double x = pt->points[j]->x, y = pt->points[j]->y, z = 0.0; + ps->grid.align(x, y, z); + if (pt->is_inner) { + ps->borders.last().append(PolySet::Point(x, y, z)); + } else { + ps->borders.last().insert(0, PolySet::Point(x, y, z)); + } + } + } +} + diff --git a/examples/example015.scad b/examples/example015.scad index ce89404..22a2ad0 100644 --- a/examples/example015.scad +++ b/examples/example015.scad @@ -18,4 +18,4 @@ difference() } import_dxf(filename = "example009.dxf", - layername = "body", convexity = 10, scale=2); + layername = "body", convexity = 6, scale=2); diff --git a/import.cc b/import.cc index 1703cdb..03780e4 100644 --- a/import.cc +++ b/import.cc @@ -181,6 +181,7 @@ PolySet *ImportNode::render_polyset(render_mode_e) const DxfData dd(fn, fs, fa, filename, layername, origin_x, origin_y, scale); p->is2d = true; dxf_tesselate(p, &dd, 0, true, 0); + dxf_border_to_ps(p, &dd); } return p; diff --git a/openscad.h b/openscad.h index d78453b..50f5bf7 100644 --- a/openscad.h +++ b/openscad.h @@ -521,6 +521,7 @@ public: }; typedef QList Polygon; QVector polygons; + QVector borders; Grid3d grid; bool is2d; @@ -688,6 +689,7 @@ void progress_report_prep(AbstractNode *root, void (*f)(const class AbstractNode void progress_report_fin(); void dxf_tesselate(PolySet *ps, DxfData *dxf, double rot, bool up, double h); +void dxf_border_to_ps(PolySet *ps, DxfData *dxf); #endif /* INCLUDE_ABSTRACT_NODE_DETAILS */ diff --git a/polyset.cc b/polyset.cc index 56c90b9..38e1026 100644 --- a/polyset.cc +++ b/polyset.cc @@ -151,11 +151,11 @@ void PolySet::render_surface(colormode_e colormode, csgmode_e csgmode, GLint *sh #endif /* ENABLE_OPENCSG */ if (this->is2d) { double zbase = csgmode; + glBegin(GL_TRIANGLES); for (double z = -zbase/2; z < zbase; z += zbase) { for (int i = 0; i < polygons.size(); i++) { const Polygon *poly = &polygons[i]; - glBegin(GL_TRIANGLES); if (poly->size() == 3) { if (z < 0) { gl_draw_triangle(shaderinfo, &poly->at(0), &poly->at(2), &poly->at(1), true, true, true, z); @@ -190,19 +190,23 @@ void PolySet::render_surface(colormode_e colormode, csgmode_e csgmode, GLint *sh } } } - if (z < 0) { - for (int j = 1; j <= poly->size(); j++) { - Point p1 = poly->at(j - 1), p2 = poly->at(j - 1); - Point p3 = poly->at(j % poly->size()), p4 = poly->at(j % poly->size()); - p1.z -= zbase/2, p2.z += zbase/2; - p3.z -= zbase/2, p4.z += zbase/2; - gl_draw_triangle(shaderinfo, &p2, &p1, &p3, true, true, false, 0); - gl_draw_triangle(shaderinfo, &p2, &p3, &p4, false, true, true, 0); - } - } - glEnd(); } } + const QVector *borders_p = &borders; + if (borders_p->size() == 0) + borders_p = &polygons; + for (int i = 0; i < borders_p->size(); i++) { + const Polygon *poly = &borders_p->at(i); + for (int j = 1; j <= poly->size(); j++) { + Point p1 = poly->at(j - 1), p2 = poly->at(j - 1); + Point p3 = poly->at(j % poly->size()), p4 = poly->at(j % poly->size()); + p1.z -= zbase/2, p2.z += zbase/2; + p3.z -= zbase/2, p4.z += zbase/2; + gl_draw_triangle(shaderinfo, &p2, &p1, &p3, true, true, false, 0); + gl_draw_triangle(shaderinfo, &p2, &p3, &p4, false, true, true, 0); + } + } + glEnd(); } else { for (int i = 0; i < polygons.size(); i++) { const Polygon *poly = &polygons[i]; @@ -247,8 +251,8 @@ void PolySet::render_edges(colormode_e colormode, csgmode_e csgmode) const double zbase = csgmode; for (double z = -zbase/2; z < zbase; z += zbase) { - for (int i = 0; i < polygons.size(); i++) { - const Polygon *poly = &polygons[i]; + for (int i = 0; i < borders.size(); i++) { + const Polygon *poly = &borders[i]; glBegin(GL_LINE_LOOP); for (int j = 0; j < poly->size(); j++) { const Point *p = &poly->at(j); @@ -257,8 +261,8 @@ void PolySet::render_edges(colormode_e colormode, csgmode_e csgmode) const glEnd(); } } - for (int i = 0; i < polygons.size(); i++) { - const Polygon *poly = &polygons[i]; + for (int i = 0; i < borders.size(); i++) { + const Polygon *poly = &borders[i]; glBegin(GL_LINES); for (int j = 0; j < poly->size(); j++) { const Point *p = &poly->at(j); diff --git a/render.cc b/render.cc index a554f6a..23f7352 100644 --- a/render.cc +++ b/render.cc @@ -164,6 +164,7 @@ CSGTerm *RenderNode::render_csg_term(double m[16], QVector *highlights ps = new PolySet(); ps->is2d = true; dxf_tesselate(ps, &dd, 0, true, 0); + dxf_border_to_ps(ps, &dd); } if (N.dim == 3) -- cgit v0.10.1