diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2014-05-22 17:37:35 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2014-05-22 18:18:47 +0400 |
commit | 97d047a3e9a52d9e2d8c0eee6932ab9ab9199ab9 (patch) | |
tree | 5eb2a0155474121a60387cdb02c1434a1cfbd2a5 /source/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.cpp | |
parent | 7a8676509505bf5fbf50943f3bcc561bf95fabef (diff) |
Fix T40307: Crash with freestyle and particle hair.
The scene file provided by the problem report has many degenerate faces coming from
a particle system. These zero-area faces were not expected in the ray-casting line visibility
algorithms of Freestyle. Now degenerate faces are properly excluded from the imported
mesh data and not fed to the line visibility algorithms.
Diffstat (limited to 'source/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.cpp')
-rw-r--r-- | source/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/source/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.cpp b/source/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.cpp index c83abe85318..c9f2f3badab 100644 --- a/source/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.cpp +++ b/source/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.cpp @@ -43,7 +43,10 @@ void WingedEdgeBuilder::visitIndexedFaceSet(IndexedFaceSet& ifs) if (_pRenderMonitor && _pRenderMonitor->testBreak()) return; WShape *shape = new WShape; - buildWShape(*shape, ifs); + if (!buildWShape(*shape, ifs)) { + delete shape; + return; + } shape->setId(ifs.getId().getFirst()); //ifs.setId(shape->GetId()); } @@ -80,7 +83,7 @@ void WingedEdgeBuilder::visitNodeTransformAfter(NodeTransform&) _matrices_stack.pop_back(); } -void WingedEdgeBuilder::buildWShape(WShape& shape, IndexedFaceSet& ifs) +bool WingedEdgeBuilder::buildWShape(WShape& shape, IndexedFaceSet& ifs) { unsigned int vsize = ifs.vsize(); unsigned int nsize = ifs.nsize(); @@ -171,6 +174,9 @@ void WingedEdgeBuilder::buildWShape(WShape& shape, IndexedFaceSet& ifs) delete[] new_vertices; delete[] new_normals; + if (shape.GetFaceList().size() == 0) // this may happen due to degenerate triangles + return false; + // compute bbox shape.ComputeBBox(); // compute mean edge size: @@ -198,8 +204,11 @@ void WingedEdgeBuilder::buildWShape(WShape& shape, IndexedFaceSet& ifs) (*wv)->setSmooth(false); } } + // Adds the new WShape to the WingedEdge structure _winged_edge->addWShape(&shape); + + return true; } void WingedEdgeBuilder::buildWVertices(WShape& shape, const real *vertices, unsigned vsize) |