Beispiel #1
0
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);
}
Beispiel #2
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);
}
Beispiel #3
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);
}