diff --git a/panda/src/mathutil/triangulator.cxx b/panda/src/mathutil/triangulator.cxx index 18f235997d..76a5bb9d64 100644 --- a/panda/src/mathutil/triangulator.cxx +++ b/panda/src/mathutil/triangulator.cxx @@ -1744,6 +1744,12 @@ int Triangulator:: traverse_polygon(int mcur, int trnum, int from, int dir) { // printf("traverse_polygon(%d, %d, %d, %d)\n", mcur, trnum, from, dir); + if (mcur < 0 || trnum <= 0) + return 0; + + if (visited[trnum]) + return 0; + trap_t *t = &tr[trnum]; // int howsplit; int mnew; @@ -1751,14 +1757,8 @@ traverse_polygon(int mcur, int trnum, int from, int dir) { int retval = 0; //, tmp; int do_switch = false; - if (mcur < 0 || trnum <= 0) - return 0; - // printf("visited size = %d, visited[trnum] = %d\n", visited.size(), visited[trnum]); - if (visited[trnum]) - return 0; - visited[trnum] = true; /* We have much more information available here. */ @@ -2169,24 +2169,27 @@ triangulate_single_polygon(int nvert, int posmax, int side) { return; } if (ri > 0) /* reflex chain is non-empty */ - { - if (CROSS(vert[v].pt, vert[rc[ri - 1]].pt, - vert[rc[ri]].pt) > 0) - { /* convex corner: cut if off */ - _result.push_back(Triangle(this, rc[ri - 1], rc[ri], v)); - ri--; + { + float crossResult = CROSS(vert[v].pt, vert[rc[ri - 1]].pt, + vert[rc[ri]].pt); + if ( crossResult >= 0 ) /* could be convex corner or straight */ + { + if ( crossResult > 0) /* convex corner: cut it off */ + _result.push_back(Triangle(this, rc[ri - 1], rc[ri], v)); + /* else : perfectly straight, will be abandoned anyway */ + ri--; rc.pop_back(); nassertv(ri + 1 == (int)rc.size()); - } - else /* non-convex */ - { /* add v to the chain */ - ri++; + } + else /* concave, add v to the chain */ + { + ri++; rc.push_back(v); nassertv(ri + 1 == (int)rc.size()); - vpos = mchain[vpos].next; - v = mchain[vpos].vnum; - } - } + vpos = mchain[vpos].next; + v = mchain[vpos].vnum; + } + } else /* reflex-chain empty: add v to the */ { /* reflex chain and advance it */ ri++;