Get rid of if(!this).

According to the C++ standard, "this" is never NULL, so checks
of the form "if(!this)" can be legally optimized out. This
breaks SolveSpace on GCC 6, and probably on other compilers and
configurations.
pull/4/head
EvilSpirit 2016-03-25 20:16:58 +06:00 committed by whitequark
parent 11565e081d
commit 09f59ddbc0
8 changed files with 83 additions and 74 deletions

View File

@ -29,7 +29,7 @@ SBsp3 *SBsp3::FromMesh(SMesh *m) {
} }
for(i = 0; i < mc.l.n; i++) { for(i = 0; i < mc.l.n; i++) {
bsp3 = bsp3->Insert(&(mc.l.elem[i]), NULL); bsp3 = InsertOrCreate(bsp3, &(mc.l.elem[i]), NULL);
} }
mc.Clear(); mc.Clear();
@ -86,12 +86,12 @@ void SBsp3::InsertHow(int how, STriangle *tr, SMesh *instead) {
switch(how) { switch(how) {
case POS: case POS:
if(instead && !pos) goto alt; if(instead && !pos) goto alt;
pos = pos->Insert(tr, instead); pos = InsertOrCreate(pos, tr, instead);
break; break;
case NEG: case NEG:
if(instead && !neg) goto alt; if(instead && !neg) goto alt;
neg = neg->Insert(tr, instead); neg = InsertOrCreate(neg, tr, instead);
break; break;
case COPLANAR: { case COPLANAR: {
@ -192,7 +192,7 @@ SBsp3 *SBsp3::InsertConvex(STriMeta meta, Vector *vertex, int cnt,
if(onc == 2) { if(onc == 2) {
if(!instead) { if(!instead) {
SEdge se = SEdge::From(on[0], on[1]); SEdge se = SEdge::From(on[0], on[1]);
edges = edges->InsertEdge(&se, n, out); edges = SBsp2::InsertOrCreateEdge(edges, &se, n, out);
} }
} }
@ -239,10 +239,10 @@ SBsp3 *SBsp3::InsertConvex(STriMeta meta, Vector *vertex, int cnt,
if(!instead) { if(!instead) {
if(inters == 2) { if(inters == 2) {
SEdge se = SEdge::From(inter[0], inter[1]); SEdge se = SEdge::From(inter[0], inter[1]);
edges = edges->InsertEdge(&se, n, out); edges = SBsp2::InsertOrCreateEdge(edges, &se, n, out);
} else if(inters == 1 && onc == 1) { } else if(inters == 1 && onc == 1) {
SEdge se = SEdge::From(inter[0], on[0]); SEdge se = SEdge::From(inter[0], on[0]);
edges = edges->InsertEdge(&se, n, out); edges = SBsp2::InsertOrCreateEdge(edges, &se, n, out);
} else if(inters == 0 && onc == 2) { } else if(inters == 0 && onc == 2) {
// We already handled this on-plane existing edge // We already handled this on-plane existing edge
} else { } else {
@ -261,13 +261,13 @@ triangulate:
for(i = 0; i < cnt - 2; i++) { for(i = 0; i < cnt - 2; i++) {
STriangle tr = STriangle::From(meta, STriangle tr = STriangle::From(meta,
vertex[0], vertex[i+1], vertex[i+2]); vertex[0], vertex[i+1], vertex[i+2]);
r = r->Insert(&tr, instead); r = InsertOrCreate(r, &tr, instead);
} }
return r; return r;
} }
SBsp3 *SBsp3::Insert(STriangle *tr, SMesh *instead) { SBsp3 *SBsp3::InsertOrCreate(SBsp3 *where, STriangle *tr, SMesh *instead) {
if(!this) { if(where == NULL) {
if(instead) { if(instead) {
if(instead->flipNormal) { if(instead->flipNormal) {
instead->atLeastOneDiscarded = true; instead->atLeastOneDiscarded = true;
@ -284,7 +284,11 @@ SBsp3 *SBsp3::Insert(STriangle *tr, SMesh *instead) {
r->tri = *tr; r->tri = *tr;
return r; return r;
} }
where->Insert(tr, instead);
return where;
}
void SBsp3::Insert(STriangle *tr, SMesh *instead) {
double dt[3] = { (tr->a).Dot(n), (tr->b).Dot(n), (tr->c).Dot(n) }; double dt[3] = { (tr->a).Dot(n), (tr->b).Dot(n), (tr->c).Dot(n) };
int inc = 0, posc = 0, negc = 0; int inc = 0, posc = 0, negc = 0;
@ -306,7 +310,7 @@ SBsp3 *SBsp3::Insert(STriangle *tr, SMesh *instead) {
// All vertices in-plane // All vertices in-plane
if(inc == 3) { if(inc == 3) {
InsertHow(COPLANAR, tr, instead); InsertHow(COPLANAR, tr, instead);
return this; return;
} }
// No split required // No split required
@ -319,7 +323,7 @@ SBsp3 *SBsp3::Insert(STriangle *tr, SMesh *instead) {
else oops(); else oops();
if(!instead) { if(!instead) {
SEdge se = SEdge::From(a, b); SEdge se = SEdge::From(a, b);
edges = edges->InsertEdge(&se, n, tr->Normal()); edges = SBsp2::InsertOrCreateEdge(edges, &se, n, tr->Normal());
} }
} }
@ -328,7 +332,7 @@ SBsp3 *SBsp3::Insert(STriangle *tr, SMesh *instead) {
} else { } else {
InsertHow(NEG, tr, instead); InsertHow(NEG, tr, instead);
} }
return this; return;
} }
// The polygon must be split into two pieces, one above, one below. // The polygon must be split into two pieces, one above, one below.
@ -356,10 +360,10 @@ SBsp3 *SBsp3::Insert(STriangle *tr, SMesh *instead) {
if(!instead) { if(!instead) {
SEdge se = SEdge::From(a, bPc); SEdge se = SEdge::From(a, bPc);
edges = edges->InsertEdge(&se, n, tr->Normal()); edges = SBsp2::InsertOrCreateEdge(edges, &se, n, tr->Normal());
} }
return this; return;
} }
if(posc == 2 && negc == 1) { if(posc == 2 && negc == 1) {
@ -391,21 +395,20 @@ SBsp3 *SBsp3::Insert(STriangle *tr, SMesh *instead) {
} }
if(!instead) { if(!instead) {
SEdge se = SEdge::From(aPb, cPa); SEdge se = SEdge::From(aPb, cPa);
edges = edges->InsertEdge(&se, n, alone.Normal()); edges = SBsp2::InsertOrCreateEdge(edges, &se, n, alone.Normal());
} }
return this; return;
} }
void SBsp3::GenerateInPaintOrder(SMesh *m) { void SBsp3::GenerateInPaintOrder(SMesh *m) {
if(!this) return;
// Doesn't matter which branch we take if the normal has zero z // Doesn't matter which branch we take if the normal has zero z
// component, so don't need a separate case for that. // component, so don't need a separate case for that.
if(n.z < 0) { if(n.z < 0) {
pos->GenerateInPaintOrder(m); if(pos) pos->GenerateInPaintOrder(m);
} else { } else {
neg->GenerateInPaintOrder(m); if(neg) neg->GenerateInPaintOrder(m);
} }
SBsp3 *flip = this; SBsp3 *flip = this;
@ -415,16 +418,15 @@ void SBsp3::GenerateInPaintOrder(SMesh *m) {
} }
if(n.z < 0) { if(n.z < 0) {
neg->GenerateInPaintOrder(m); if(neg) neg->GenerateInPaintOrder(m);
} else { } else {
pos->GenerateInPaintOrder(m); if(pos) pos->GenerateInPaintOrder(m);
} }
} }
void SBsp3::DebugDraw(void) { void SBsp3::DebugDraw(void) {
if(!this) return;
pos->DebugDraw(); if(pos) pos->DebugDraw();
Vector norm = tri.Normal(); Vector norm = tri.Normal();
glNormal3d(norm.x, norm.y, norm.z); glNormal3d(norm.x, norm.y, norm.z);
@ -458,10 +460,10 @@ void SBsp3::DebugDraw(void) {
ssglDepthRangeOffset(0); ssglDepthRangeOffset(0);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
more->DebugDraw(); if(more) more->DebugDraw();
neg->DebugDraw(); if(neg) neg->DebugDraw();
edges->DebugDraw(n, d); if(edges) edges->DebugDraw(n, d);
} }
///////////////////////////////// /////////////////////////////////
@ -475,8 +477,8 @@ Vector SBsp2::IntersectionWith(Vector a, Vector b) {
return (a.ScaledBy(db/dab)).Plus(b.ScaledBy(-da/dab)); return (a.ScaledBy(db/dab)).Plus(b.ScaledBy(-da/dab));
} }
SBsp2 *SBsp2::InsertEdge(SEdge *nedge, Vector nnp, Vector out) { SBsp2 *SBsp2::InsertOrCreateEdge(SBsp2 *where, SEdge *nedge, Vector nnp, Vector out) {
if(!this) { if(where == NULL) {
// Brand new node; so allocate for it, and fill us in. // Brand new node; so allocate for it, and fill us in.
SBsp2 *r = Alloc(); SBsp2 *r = Alloc();
r->np = nnp; r->np = nnp;
@ -488,6 +490,11 @@ SBsp2 *SBsp2::InsertEdge(SEdge *nedge, Vector nnp, Vector out) {
r->edge = *nedge; r->edge = *nedge;
return r; return r;
} }
where->InsertEdge(nedge, nnp, out);
return where;
}
void SBsp2::InsertEdge(SEdge *nedge, Vector nnp, Vector out) {
double dt[2] = { (nedge->a).Dot(no), (nedge->b).Dot(no) }; double dt[2] = { (nedge->a).Dot(no), (nedge->b).Dot(no) };
@ -503,12 +510,12 @@ SBsp2 *SBsp2::InsertEdge(SEdge *nedge, Vector nnp, Vector out) {
} }
if((isPos[0] && isPos[1])||(isPos[0] && isOn[1])||(isOn[0] && isPos[1])) { if((isPos[0] && isPos[1])||(isPos[0] && isOn[1])||(isOn[0] && isPos[1])) {
pos = pos->InsertEdge(nedge, nnp, out); pos = InsertOrCreateEdge(pos, nedge, nnp, out);
return this; return;
} }
if((isNeg[0] && isNeg[1])||(isNeg[0] && isOn[1])||(isOn[0] && isNeg[1])) { if((isNeg[0] && isNeg[1])||(isNeg[0] && isOn[1])||(isOn[0] && isNeg[1])) {
neg = neg->InsertEdge(nedge, nnp, out); neg = InsertOrCreateEdge(neg, nedge, nnp, out);
return this; return;
} }
if(isOn[0] && isOn[1]) { if(isOn[0] && isOn[1]) {
SBsp2 *m = Alloc(); SBsp2 *m = Alloc();
@ -523,7 +530,7 @@ SBsp2 *SBsp2::InsertEdge(SEdge *nedge, Vector nnp, Vector out) {
m->more = more; m->more = more;
more = m; more = m;
return this; return;
} }
if((isPos[0] && isNeg[1]) || (isNeg[0] && isPos[1])) { if((isPos[0] && isNeg[1]) || (isNeg[0] && isPos[1])) {
Vector aPb = IntersectionWith(nedge->a, nedge->b); Vector aPb = IntersectionWith(nedge->a, nedge->b);
@ -532,13 +539,13 @@ SBsp2 *SBsp2::InsertEdge(SEdge *nedge, Vector nnp, Vector out) {
SEdge eb = SEdge::From(aPb, nedge->b); SEdge eb = SEdge::From(aPb, nedge->b);
if(isPos[0]) { if(isPos[0]) {
pos = pos->InsertEdge(&ea, nnp, out); pos = InsertOrCreateEdge(pos, &ea, nnp, out);
neg = neg->InsertEdge(&eb, nnp, out); neg = InsertOrCreateEdge(neg, &eb, nnp, out);
} else { } else {
neg = neg->InsertEdge(&ea, nnp, out); neg = InsertOrCreateEdge(neg, &ea, nnp, out);
pos = pos->InsertEdge(&eb, nnp, out); pos = InsertOrCreateEdge(pos, &eb, nnp, out);
} }
return this; return;
} }
oops(); oops();
} }
@ -659,8 +666,6 @@ void SBsp2::InsertTriangle(STriangle *tr, SMesh *m, SBsp3 *bsp3) {
} }
void SBsp2::DebugDraw(Vector n, double d) { void SBsp2::DebugDraw(Vector n, double d) {
if(!this) return;
if(fabs((edge.a).Dot(n) - d) > LENGTH_EPS) oops(); if(fabs((edge.a).Dot(n) - d) > LENGTH_EPS) oops();
if(fabs((edge.b).Dot(n) - d) > LENGTH_EPS) oops(); if(fabs((edge.b).Dot(n) - d) > LENGTH_EPS) oops();
@ -669,9 +674,9 @@ void SBsp2::DebugDraw(Vector n, double d) {
ssglVertex3v(edge.a); ssglVertex3v(edge.a);
ssglVertex3v(edge.b); ssglVertex3v(edge.b);
glEnd(); glEnd();
pos->DebugDraw(n, d); if(pos) pos->DebugDraw(n, d);
neg->DebugDraw(n, d); if(neg) neg->DebugDraw(n, d);
more->DebugDraw(n, d); if(more) more->DebugDraw(n, d);
ssglLineWidth(1); ssglLineWidth(1);
} }

View File

@ -308,7 +308,7 @@ void SolveSpaceUI::ExportLinesAndMesh(SEdgeList *sel, SBezierList *sbl, SMesh *s
// Use the BSP routines to generate the split triangles in paint order. // Use the BSP routines to generate the split triangles in paint order.
SBsp3 *bsp = SBsp3::FromMesh(&smp); SBsp3 *bsp = SBsp3::FromMesh(&smp);
SMesh sms = {}; SMesh sms = {};
bsp->GenerateInPaintOrder(&sms); if(bsp) bsp->GenerateInPaintOrder(&sms);
// And cull the back-facing triangles // And cull the back-facing triangles
STriangle *tr; STriangle *tr;
sms.l.ClearTags(); sms.l.ClearTags();

View File

@ -547,7 +547,6 @@ hParam Expr::ReferencedParams(ParamList *pl) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
std::string Expr::Print(void) { std::string Expr::Print(void) {
if(!this) return "0";
char c; char c;
switch(op) { switch(op) {

View File

@ -247,7 +247,7 @@ void SMesh::AddAgainstBsp(SMesh *srcm, SBsp3 *bsp3) {
STriangle *st = &(srcm->l.elem[i]); STriangle *st = &(srcm->l.elem[i]);
int pn = l.n; int pn = l.n;
atLeastOneDiscarded = false; atLeastOneDiscarded = false;
bsp3->Insert(st, this); SBsp3::InsertOrCreate(NULL, st, this);
if(!atLeastOneDiscarded && (l.n != (pn+1))) { if(!atLeastOneDiscarded && (l.n != (pn+1))) {
l.n = pn; l.n = pn;
if(flipNormal) { if(flipNormal) {

View File

@ -180,7 +180,8 @@ public:
void InsertTriangleHow(int how, STriangle *tr, SMesh *m, SBsp3 *bsp3); void InsertTriangleHow(int how, STriangle *tr, SMesh *m, SBsp3 *bsp3);
void InsertTriangle(STriangle *tr, SMesh *m, SBsp3 *bsp3); void InsertTriangle(STriangle *tr, SMesh *m, SBsp3 *bsp3);
Vector IntersectionWith(Vector a, Vector b); Vector IntersectionWith(Vector a, Vector b);
SBsp2 *InsertEdge(SEdge *nedge, Vector nnp, Vector out); void InsertEdge(SEdge *nedge, Vector nnp, Vector out);
static SBsp2 *InsertOrCreateEdge(SBsp2 *where, SEdge *nedge, Vector nnp, Vector out);
static SBsp2 *Alloc(void); static SBsp2 *Alloc(void);
void DebugDraw(Vector n, double d); void DebugDraw(Vector n, double d);
@ -206,7 +207,8 @@ public:
enum { POS = 100, NEG = 101, COPLANAR = 200 }; enum { POS = 100, NEG = 101, COPLANAR = 200 };
void InsertHow(int how, STriangle *str, SMesh *instead); void InsertHow(int how, STriangle *str, SMesh *instead);
SBsp3 *Insert(STriangle *str, SMesh *instead); void Insert(STriangle *str, SMesh *instead);
static SBsp3 *InsertOrCreate(SBsp3 *where, STriangle *str, SMesh *instead);
void InsertConvexHow(int how, STriMeta meta, Vector *vertex, int n, void InsertConvexHow(int how, STriMeta meta, Vector *vertex, int n,
SMesh *instead); SMesh *instead);

View File

@ -83,10 +83,10 @@ SCurve SCurve::MakeCopySplitAgainst(SShell *agnstA, SShell *agnstB,
// some slop if points are close to edge and pwl is too coarse, // some slop if points are close to edge and pwl is too coarse,
// and it doesn't hurt to split unnecessarily. // and it doesn't hurt to split unnecessarily.
Point2d dummy = { 0, 0 }; Point2d dummy = { 0, 0 };
int c = pi->srf->bsp->ClassifyPoint(puv, dummy, pi->srf); int c = (pi->srf->bsp) ? pi->srf->bsp->ClassifyPoint(puv, dummy, pi->srf) : SBspUv::OUTSIDE;
if(c == SBspUv::OUTSIDE) { if(c == SBspUv::OUTSIDE) {
double d; double d = VERY_POSITIVE;
d = pi->srf->bsp->MinimumDistanceToEdge(puv, pi->srf); if(pi->srf->bsp) d = pi->srf->bsp->MinimumDistanceToEdge(puv, pi->srf);
if(d > SS.ChordTolMm()) { if(d > SS.ChordTolMm()) {
pi->tag = 1; pi->tag = 1;
continue; continue;
@ -467,7 +467,7 @@ SSurface SSurface::MakeCopyTrimAgainst(SShell *parent,
ss->ClosestPointTo(a, &(auv.x), &(auv.y)); ss->ClosestPointTo(a, &(auv.x), &(auv.y));
ss->ClosestPointTo(b, &(buv.x), &(buv.y)); ss->ClosestPointTo(b, &(buv.x), &(buv.y));
int c = ss->bsp->ClassifyEdge(auv, buv, ss); int c = (ss->bsp) ? ss->bsp->ClassifyEdge(auv, buv, ss) : SBspUv::OUTSIDE;
if(c != SBspUv::OUTSIDE) { if(c != SBspUv::OUTSIDE) {
Vector ta = Vector::From(0, 0, 0); Vector ta = Vector::From(0, 0, 0);
Vector tb = Vector::From(0, 0, 0); Vector tb = Vector::From(0, 0, 0);
@ -571,7 +571,7 @@ SSurface SSurface::MakeCopyTrimAgainst(SShell *parent,
int indir_shell, outdir_shell, indir_orig, outdir_orig; int indir_shell, outdir_shell, indir_orig, outdir_orig;
int c_this = origBsp->ClassifyEdge(auv, buv, &ret); int c_this = (origBsp) ? origBsp->ClassifyEdge(auv, buv, &ret) : SBspUv::OUTSIDE;
TagByClassifiedEdge(c_this, &indir_orig, &outdir_orig); TagByClassifiedEdge(c_this, &indir_orig, &outdir_orig);
agnst->ClassifyEdge(&indir_shell, &outdir_shell, agnst->ClassifyEdge(&indir_shell, &outdir_shell,
@ -807,7 +807,7 @@ SBspUv *SBspUv::From(SEdgeList *el, SSurface *srf) {
SBspUv *bsp = NULL; SBspUv *bsp = NULL;
for(se = work.l.First(); se; se = work.l.NextAfter(se)) { for(se = work.l.First(); se; se = work.l.NextAfter(se)) {
bsp = bsp->InsertEdge((se->a).ProjectXy(), (se->b).ProjectXy(), srf); bsp = InsertOrCreateEdge(bsp, (se->a).ProjectXy(), (se->b).ProjectXy(), srf);
} }
work.Clear(); work.Clear();
@ -850,14 +850,18 @@ double SBspUv::ScaledDistanceToLine(Point2d pt, Point2d a, Point2d b, bool seg,
return pt.DistanceToLine(a, b, seg); return pt.DistanceToLine(a, b, seg);
} }
SBspUv *SBspUv::InsertEdge(Point2d ea, Point2d eb, SSurface *srf) { SBspUv *SBspUv::InsertOrCreateEdge(SBspUv *where, const Point2d &ea, const Point2d &eb, SSurface *srf) {
if(!this) { if(where == NULL) {
SBspUv *ret = Alloc(); SBspUv *ret = Alloc();
ret->a = ea; ret->a = ea;
ret->b = eb; ret->b = eb;
return ret; return ret;
} }
where->InsertEdge(ea, eb, srf);
return where;
}
void SBspUv::InsertEdge(Point2d ea, Point2d eb, SSurface *srf) {
double dea = ScaledSignedDistanceToLine(ea, a, b, srf), double dea = ScaledSignedDistanceToLine(ea, a, b, srf),
deb = ScaledSignedDistanceToLine(eb, a, b, srf); deb = ScaledSignedDistanceToLine(eb, a, b, srf);
@ -871,21 +875,21 @@ SBspUv *SBspUv::InsertEdge(Point2d ea, Point2d eb, SSurface *srf) {
} else if(fabs(dea) < LENGTH_EPS) { } else if(fabs(dea) < LENGTH_EPS) {
// Point A lies on this lie, but point B does not // Point A lies on this lie, but point B does not
if(deb > 0) { if(deb > 0) {
pos = pos->InsertEdge(ea, eb, srf); pos = InsertOrCreateEdge(pos, ea, eb, srf);
} else { } else {
neg = neg->InsertEdge(ea, eb, srf); neg = InsertOrCreateEdge(neg, ea, eb, srf);
} }
} else if(fabs(deb) < LENGTH_EPS) { } else if(fabs(deb) < LENGTH_EPS) {
// Point B lies on this lie, but point A does not // Point B lies on this lie, but point A does not
if(dea > 0) { if(dea > 0) {
pos = pos->InsertEdge(ea, eb, srf); pos = InsertOrCreateEdge(pos, ea, eb, srf);
} else { } else {
neg = neg->InsertEdge(ea, eb, srf); neg = InsertOrCreateEdge(neg, ea, eb, srf);
} }
} else if(dea > 0 && deb > 0) { } else if(dea > 0 && deb > 0) {
pos = pos->InsertEdge(ea, eb, srf); pos = InsertOrCreateEdge(pos, ea, eb, srf);
} else if(dea < 0 && deb < 0) { } else if(dea < 0 && deb < 0) {
neg = neg->InsertEdge(ea, eb, srf); neg = InsertOrCreateEdge(neg, ea, eb, srf);
} else { } else {
// New edge crosses this one; we need to split. // New edge crosses this one; we need to split.
Point2d n = ((b.Minus(a)).Normal()).WithMagnitude(1); Point2d n = ((b.Minus(a)).Normal()).WithMagnitude(1);
@ -893,18 +897,17 @@ SBspUv *SBspUv::InsertEdge(Point2d ea, Point2d eb, SSurface *srf) {
double t = (d - n.Dot(ea)) / (n.Dot(eb.Minus(ea))); double t = (d - n.Dot(ea)) / (n.Dot(eb.Minus(ea)));
Point2d pi = ea.Plus((eb.Minus(ea)).ScaledBy(t)); Point2d pi = ea.Plus((eb.Minus(ea)).ScaledBy(t));
if(dea > 0) { if(dea > 0) {
pos = pos->InsertEdge(ea, pi, srf); pos = InsertOrCreateEdge(pos, ea, pi, srf);
neg = neg->InsertEdge(pi, eb, srf); neg = InsertOrCreateEdge(neg, pi, eb, srf);
} else { } else {
neg = neg->InsertEdge(ea, pi, srf); neg = InsertOrCreateEdge(neg, ea, pi, srf);
pos = pos->InsertEdge(pi, eb, srf); pos = InsertOrCreateEdge(pos, pi, eb, srf);
} }
} }
return this; return;
} }
int SBspUv::ClassifyPoint(Point2d p, Point2d eb, SSurface *srf) { int SBspUv::ClassifyPoint(Point2d p, Point2d eb, SSurface *srf) {
if(!this) return OUTSIDE;
double dp = ScaledSignedDistanceToLine(p, a, b, srf); double dp = ScaledSignedDistanceToLine(p, a, b, srf);
@ -951,10 +954,9 @@ int SBspUv::ClassifyEdge(Point2d ea, Point2d eb, SSurface *srf) {
} }
double SBspUv::MinimumDistanceToEdge(Point2d p, SSurface *srf) { double SBspUv::MinimumDistanceToEdge(Point2d p, SSurface *srf) {
if(!this) return VERY_POSITIVE;
double dn = neg->MinimumDistanceToEdge(p, srf), double dn = (neg) ? neg->MinimumDistanceToEdge(p, srf) : VERY_POSITIVE;
dp = pos->MinimumDistanceToEdge(p, srf); double dp = (pos) ? pos->MinimumDistanceToEdge(p, srf) : VERY_POSITIVE;
Point2d as = a, bs = b; Point2d as = a, bs = b;
ScalePoints(&p, &as, &bs, srf); ScalePoints(&p, &as, &bs, srf);

View File

@ -361,7 +361,7 @@ void SSurface::AllPointsIntersecting(Vector a, Vector b,
// And that it lies inside our trim region // And that it lies inside our trim region
Point2d dummy = { 0, 0 }; Point2d dummy = { 0, 0 };
int c = bsp->ClassifyPoint(puv, dummy, this); int c = (bsp) ? bsp->ClassifyPoint(puv, dummy, this) : SBspUv::OUTSIDE;
if(trimmed && c == SBspUv::OUTSIDE) { if(trimmed && c == SBspUv::OUTSIDE) {
continue; continue;
} }
@ -527,7 +527,7 @@ bool SShell::ClassifyEdge(int *indir, int *outdir,
if((pp.Minus(p)).Magnitude() > LENGTH_EPS) continue; if((pp.Minus(p)).Magnitude() > LENGTH_EPS) continue;
Point2d dummy = { 0, 0 }; Point2d dummy = { 0, 0 };
int c = srf->bsp->ClassifyPoint(puv, dummy, srf); int c = (srf->bsp) ? srf->bsp->ClassifyPoint(puv, dummy, srf) : SBspUv::OUTSIDE;
if(c == SBspUv::OUTSIDE) continue; if(c == SBspUv::OUTSIDE) continue;
// Edge-on-face (unless edge-on-edge above superceded) // Edge-on-face (unless edge-on-edge above superceded)

View File

@ -45,7 +45,8 @@ public:
double ScaledDistanceToLine(Point2d pt, Point2d a, Point2d b, bool seg, double ScaledDistanceToLine(Point2d pt, Point2d a, Point2d b, bool seg,
SSurface *srf); SSurface *srf);
SBspUv *InsertEdge(Point2d a, Point2d b, SSurface *srf); void InsertEdge(Point2d a, Point2d b, SSurface *srf);
static SBspUv *InsertOrCreateEdge(SBspUv *where, const Point2d &ea, const Point2d &eb, SSurface *srf);
int ClassifyPoint(Point2d p, Point2d eb, SSurface *srf); int ClassifyPoint(Point2d p, Point2d eb, SSurface *srf);
int ClassifyEdge(Point2d ea, Point2d eb, SSurface *srf); int ClassifyEdge(Point2d ea, Point2d eb, SSurface *srf);
double MinimumDistanceToEdge(Point2d p, SSurface *srf); double MinimumDistanceToEdge(Point2d p, SSurface *srf);