Пример #1
0
void test_CheckHashingLabel(void)
{
    unsigned int Id;

    Id = HashVertex(V);

    TEST_ASSERT_EQUAL(625126715, Id);
}
Пример #2
0
/*
 * @brief Snaps the vertex to integer coordinates if it is already very close,
 * then hashes it and searches for an existing vertex to reuse.
 */
static int32_t FindVertex(const vec3_t in) {
	int32_t i, vnum;
	vec3_t vert;

	c_totalverts++;

	for (i = 0; i < 3; i++) {
		const vec_t v = floor(in[i] + 0.5);

		if (fabs(in[i] - v) < INTEGRAL_EPSILON)
			vert[i] = v;
		else
			vert[i] = in[i];
	}

	const int32_t h = HashVertex(vert);

	for (vnum = hash_verts[h]; vnum; vnum = vertex_chain[vnum]) {
		vec3_t delta;

		// compare the points; we go out of our way to avoid using VectorLength
		VectorSubtract(d_bsp.vertexes[vnum].point, vert, delta);

		if (delta[0] < POINT_EPSILON && delta[0] > -POINT_EPSILON) {
			if (delta[1] < POINT_EPSILON && delta[1] > -POINT_EPSILON) {
				if (delta[2] < POINT_EPSILON && delta[2] > -POINT_EPSILON) {
					return vnum;
				}
			}
		}
	}

	// emit a vertex
	if (d_bsp.num_vertexes == MAX_BSP_VERTS)
		Com_Error(ERR_FATAL, "MAX_BSP_VERTS\n");

	VectorCopy(vert, d_bsp.vertexes[d_bsp.num_vertexes].point);

	vertex_chain[d_bsp.num_vertexes] = hash_verts[h];
	hash_verts[h] = d_bsp.num_vertexes;

	c_uniqueverts++;

	d_bsp.num_vertexes++;

	return d_bsp.num_vertexes - 1;
}