static void EmitFaceVertexes (node_t* node, face_t* f) { if (f->merged || f->split[0] || f->split[1]) return; winding_t* w = f->w; for (int i = 0; i < w->numpoints; i++) { /* make every point unique */ if (config.noweld) { if (curTile->numvertexes == MAX_MAP_VERTS) Sys_Error("MAX_MAP_VERTS (%i)", curTile->numvertexes); superverts[i] = curTile->numvertexes; VectorCopy(w->p[i], curTile->vertexes[curTile->numvertexes].point); curTile->numvertexes++; curTile->numnormals++; c_uniqueverts++; c_totalverts++; } else superverts[i] = GetVertexnum(w->p[i]); } numsuperverts = w->numpoints; /* this may fragment the face if > MAXEDGES */ FaceFromSuperverts(node, f, 0); }
/* * @brief */ static void EmitFaceVertexes(node_t *node, face_t *f) { winding_t *w; int32_t i; if (f->merged || f->split[0] || f->split[1]) return; w = f->w; for (i = 0; i < w->num_points; i++) { if (noweld) { // make every point unique if (d_bsp.num_vertexes == MAX_BSP_VERTS) Com_Error(ERR_FATAL, "MAX_BSP_VERTS\n"); superverts[i] = d_bsp.num_vertexes; VectorCopy(w->points[i], d_bsp.vertexes[d_bsp.num_vertexes].point); d_bsp.num_vertexes++; c_uniqueverts++; c_totalverts++; } else superverts[i] = GetVertexNum(w->points[i]); } num_superverts = w->num_points; // this may fragment the face if > MAXEDGES FaceFromSuperverts(node, f, 0); }
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); }