From 46e95ff8a80f668796b5e751a98900aa197fd32e Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Mon, 22 May 2017 21:40:25 +0700 Subject: [PATCH] fix #259: 'Cannot allocate memory' when exporting mesh --- src/mesh.cpp | 12 ++++++++---- src/polygon.cpp | 6 ++++++ src/polygon.h | 1 + 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/mesh.cpp b/src/mesh.cpp index aaa066190..d64144155 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -601,6 +601,10 @@ void SKdNode::SnapToVertex(Vector v, SMesh *extras) { if(tr->b.Equals(v)) { tr->b = v; continue; } if(tr->c.Equals(v)) { tr->c = v; continue; } + if(tr->IsDegenerate()) { + continue; + } + if(v.OnLineSegment(tr->a, tr->b)) { STriangle nt = STriangle::From(tr->meta, tr->a, v, tr->c); extras->AddTriangle(&nt); @@ -632,6 +636,9 @@ void SKdNode::SnapToMesh(SMesh *m) { int i, j, k; for(i = 0; i < m->l.n; i++) { STriangle *tr = &(m->l.elem[i]); + if(tr->IsDegenerate()) { + continue; + } for(j = 0; j < 3; j++) { Vector v = tr->vertices[j]; @@ -1117,10 +1124,7 @@ void SMesh::PrecomputeTransparency() { void SMesh::RemoveDegenerateTriangles() { for(auto &tr : l) { - bool isDegenerate = tr.a.OnLineSegment(tr.b, tr.c) || - tr.b.OnLineSegment(tr.a, tr.c) || - tr.c.OnLineSegment(tr.a, tr.b); - tr.tag = (int)isDegenerate; + tr.tag = (int)tr.IsDegenerate(); } l.RemoveTagged(); } diff --git a/src/polygon.cpp b/src/polygon.cpp index 9fc8be690..aeca21c5d 100644 --- a/src/polygon.cpp +++ b/src/polygon.cpp @@ -87,6 +87,12 @@ double STriangle::SignedVolume() const { return a.Dot(b.Cross(c)) / 6.0; } +bool STriangle::IsDegenerate() const { + return a.OnLineSegment(b, c) || + b.OnLineSegment(a, c) || + c.OnLineSegment(a, b); +} + void STriangle::FlipNormal() { swap(a, b); swap(an, bn); diff --git a/src/polygon.h b/src/polygon.h index 5767dc035..e813ad96c 100644 --- a/src/polygon.h +++ b/src/polygon.h @@ -191,6 +191,7 @@ class STriangle { bool Raytrace(const Vector &rayPoint, const Vector &rayDir, double *t, Vector *inters) const; double SignedVolume() const; + bool IsDegenerate() const; }; class SBsp2 {