Documentation for tjunc.

This commit is contained in:
Bill Currie 2010-08-30 23:19:42 +09:00
parent f758cacc69
commit a8bd522ca1
2 changed files with 71 additions and 5 deletions

View file

@ -25,6 +25,10 @@
struct node_s;
/** Add the edges from the faces in the bsp tree.
\param headnode The current node in the bsp tree.
*/
void tjunc (struct node_s *headnode);
#endif//qfbsp_tjunc_h

View file

@ -67,6 +67,11 @@ wedge_t *wedge_hash[NUM_HASH];
static vec3_t hash_min, hash_scale;
/** Initialize the edge hash table.
\param mins The minimum of the bounding box in which the edges reside.
\param maxs The maximum of the bounding box in which the edges reside.
*/
static void
InitHash (vec3_t mins, vec3_t maxs)
{
@ -91,6 +96,11 @@ InitHash (vec3_t mins, vec3_t maxs)
hash_scale[2] = newsize[1];
}
/** Calulate the hash value of a vector.
\param vec The vector for which to calculate the hash value.
\return The hash value of the vector.
*/
static unsigned
HashVec (vec3_t vec)
{
@ -103,6 +113,14 @@ HashVec (vec3_t vec)
return h;
}
/** Make the vector canonical.
A canonical vector is a unit vector with the first non-zero axis
positive.
\param vec The vector to make canonical.
\return false is the vector is (0, 0, 0), otherwise true.
*/
static qboolean
CanonicalVector (vec3_t vec)
{
@ -140,6 +158,21 @@ CanonicalVector (vec3_t vec)
return false;
}
/** Find a wedge for the two points.
A wedge is an infinitely long line passing through the two points with
an "origin" at t=0.
\param p1 The first point.
\param p2 The second point.
\param t1 The "time" of one of the points.
\param t2 The "time" of the other point.
\return Pointer to the wedge, or NULL for a degenerate edge
(zero length).
\note t2 will always be greater than t1, so there's no guarantee which
point is represented by t1 and t2.
*/
static wedge_t *
FindEdge (vec3_t p1, vec3_t p2, vec_t *t1, vec_t *t2)
{
@ -161,6 +194,7 @@ FindEdge (vec3_t p1, vec3_t p2, vec_t *t1, vec_t *t2)
VectorMultSub (p1, *t1, dir, origin);
if (*t1 > *t2) {
// swap t1 and t2
temp = *t1;
*t1 = *t2;
*t2 = temp;
@ -176,6 +210,7 @@ FindEdge (vec3_t p1, vec3_t p2, vec_t *t1, vec_t *t2)
return w;
}
// create a new wedge
if (numwedges == MAXWEDGES)
Sys_Error ("FindEdge: numwedges == MAXWEDGES");
w = &wedges[numwedges];
@ -193,6 +228,16 @@ FindEdge (vec3_t p1, vec3_t p2, vec_t *t1, vec_t *t2)
#define T_EPSILON 0.01
/** Add a wvert to the wedge.
A wvert is a vertex on the wedge and is specified by the time along the
wedge from the wedge's origin.
If a wvert with the same time already exists, a new one will not be added.
\param w The wedge to which the wvert will be added.
\param t The "time" of the wvert.
*/
static void
AddVert (wedge_t *w, vec_t t)
{
@ -221,6 +266,11 @@ AddVert (wedge_t *w, vec_t t)
v->prev = newv;
}
/** Add a faces edge to the wedge system.
\param p1 The first point of the face's edge.
\param p2 The second point of the face's edge.
*/
static void
AddEdge (vec3_t p1, vec3_t p2)
{
@ -233,6 +283,10 @@ AddEdge (vec3_t p1, vec3_t p2)
}
}
/** Add the edges from the face.
\param f The face from which to add the faces.
*/
static void
AddFaceEdges (face_t *f)
{
@ -246,6 +300,13 @@ AddFaceEdges (face_t *f)
face_t *newlist;
/** Check and fix the edges of the face.
If any vertices from other faces lie on an edge of the face between the
edge's end points, add matching vertices along that edge.
\param f The face of which the edges will be checked.
*/
static void
FixFaceEdges (face_t *f)
{
@ -284,8 +345,6 @@ FixFaceEdges (face_t *f)
newlist = f;
}
//============================================================================
static void
tjunc_find_r (node_t *node)
{
@ -302,6 +361,10 @@ tjunc_find_r (node_t *node)
tjunc_find_r (node->children[1]);
}
/** Check and fix the edges from the faces in the bsp tree.
\param node The current node in the bsp tree.
*/
static void
tjunc_fix_r (node_t *node)
{
@ -336,9 +399,7 @@ tjunc (node_t *headnode)
if (options.notjunc)
return;
// identify all points on common edges
// origin points won't allways be inside the map, so extend the hash area
// origin points won't allways be inside the map, so extend the hash area
for (i = 0; i < 3; i++) {
if (fabs (brushset->maxs[i]) > fabs (brushset->mins[i]))
maxs[i] = fabs (brushset->maxs[i]);
@ -351,6 +412,7 @@ tjunc (node_t *headnode)
numwedges = numwverts = 0;
// identify all points on common edges
tjunc_find_r (headnode);
qprintf ("%i world edges %i edge points\n", numwedges, numwverts);