//===================================================================================== // FixFaceTJunctions //===================================================================================== geBoolean FixFaceTJunctions(GBSP_Node *Node, GBSP_Face *Face) { int32 i, P1, P2; int32 Start[MAX_TEMP_INDEX_VERTS]; int32 Count[MAX_TEMP_INDEX_VERTS]; geVec3d Edge2; geFloat Len; int32 Base; NumTempIndexVerts = 0; for (i=0; i< Face->NumIndexVerts; i++) { P1 = Face->IndexVerts[i]; P2 = Face->IndexVerts[(i+1)%Face->NumIndexVerts]; EdgeStart = WeldedVerts[P1]; Edge2 = WeldedVerts[P2]; FindEdgeVerts(&EdgeStart, &Edge2); geVec3d_Subtract(&Edge2, &EdgeStart, &EdgeDir); Len = geVec3d_Normalize(&EdgeDir); Start[i] = NumTempIndexVerts; TestEdge_r(0.0f, Len, P1, P2, 0); Count[i] = NumTempIndexVerts - Start[i]; } if (NumTempIndexVerts < 3) { Face->NumIndexVerts = 0; //GHook.Printf("FixFaceTJunctions: Face collapsed.\n"); return GE_TRUE; } for (i=0 ; i<Face->NumIndexVerts; i++) { if (Count[i] == 1 && Count[(i+Face->NumIndexVerts-1)%Face->NumIndexVerts] == 1) break; } if (i == Face->NumIndexVerts) { Base = 0; } else { // rotate the vertex order Base = Start[i]; } if (!FinalizeFace(Face, Base)) return GE_FALSE; return GE_TRUE; }
static void FixFaceEdges (node_t* node, face_t* f) { int i, base; vec3_t e2; int count[MAX_SUPERVERTS], start[MAX_SUPERVERTS]; if (f->merged || f->split[0] || f->split[1]) return; numsuperverts = 0; for (i = 0; i < f->numpoints; i++) { const int p1 = f->vertexnums[i]; const int p2 = f->vertexnums[(i + 1) % f->numpoints]; VectorCopy(curTile->vertexes[p1].point, edge_start); VectorCopy(curTile->vertexes[p2].point, e2); FindEdgeVerts(edge_start, e2); VectorSubtract(e2, edge_start, edge_dir); vec_t len = VectorNormalize(edge_dir); start[i] = numsuperverts; TestEdge(0, len, p1, p2, 0); count[i] = numsuperverts - start[i]; } /* entire face collapsed */ if (numsuperverts < 3) { f->numpoints = 0; c_facecollapse++; return; } /* we want to pick a vertex that doesn't have tjunctions * on either side, which can cause artifacts on trifans, * especially underwater */ for (i = 0; i < f->numpoints; i++) { if (count[i] == 1 && count[(i + f->numpoints - 1) % f->numpoints] == 1) break; } if (i == f->numpoints) { c_badstartverts++; base = 0; } else { /* rotate the vertex order */ base = start[i]; } /* this may fragment the face if > MAXEDGES */ FaceFromSuperverts(node, f, base); }