diff --git a/include/QF/mathlib.h b/include/QF/mathlib.h index 746b40499..2057b9797 100644 --- a/include/QF/mathlib.h +++ b/include/QF/mathlib.h @@ -39,6 +39,9 @@ extern int nanmask; extern const vec3_t vec3_origin; +#define EQUAL_EPSILON 0.001 +#define RINT(x) (floor ((x) + 0.5)) + #define IS_NAN(x) (((*(int *)&x)&nanmask)==nanmask) #define DotProduct(a,b) ((a)[0]*(b)[0]+(a)[1]*(b)[1]+(a)[2]*(b)[2]) @@ -84,7 +87,7 @@ extern const vec3_t vec3_origin; vec_t _DotProduct (const vec3_t v1, const vec3_t v2); void _VectorAdd (const vec3_t veca, const vec3_t vecb, vec3_t out); void _VectorCopy (const vec3_t in, vec3_t out); -int _VectorCompare (const vec3_t v1, const vec3_t v2); +int _VectorCompare (const vec3_t v1, const vec3_t v2); // uses EQUAL_EPSILON //vec_t _VectorLength (vec3_t v); void _VectorMA (const vec3_t veca, float scale, const vec3_t vecb, vec3_t vecc); diff --git a/libs/util/mathlib.c b/libs/util/mathlib.c index 74b08e408..44db925a9 100644 --- a/libs/util/mathlib.c +++ b/libs/util/mathlib.c @@ -337,7 +337,7 @@ _VectorCompare (const vec3_t v1, const vec3_t v2) int i; for (i = 0; i < 3; i++) - if (v1[i] != v2[i]) + if (fabs (v1[i] - v2[i]) > EQUAL_EPSILON) return 0; return 1; diff --git a/tools/qfbsp/include/bsp5.h b/tools/qfbsp/include/bsp5.h index b355d030e..fa317fcd9 100644 --- a/tools/qfbsp/include/bsp5.h +++ b/tools/qfbsp/include/bsp5.h @@ -285,5 +285,3 @@ struct brush_s *AllocBrush (void); //============================================================================= extern bsp_t *bsp; - -#define EQUAL_EPSILON 0.001 diff --git a/tools/qfbsp/source/brush.c b/tools/qfbsp/source/brush.c index 67e5d6819..1fde9714e 100644 --- a/tools/qfbsp/source/brush.c +++ b/tools/qfbsp/source/brush.c @@ -391,7 +391,7 @@ CreateBrushFaces (void) for (j = 0; j < w->numpoints; j++) { for (k = 0; k < 3; k++) { - r = (int) (w->points[j][k] + 0.5); + r = RINT (w->points[j][k]); if (fabs (w->points[j][k] - r) < ZERO_EPSILON) f->pts[j][k] = r; else @@ -453,7 +453,7 @@ AddBrushPlane (plane_t *plane) for (i = 0; i < numbrushfaces; i++) { pl = &faces[i].plane; - if (VectorCompare (pl->normal, plane->normal) + if (_VectorCompare (pl->normal, plane->normal) && fabs (pl->dist - plane->dist) < ON_EPSILON) return; } @@ -484,11 +484,11 @@ TestAddPlane (plane_t *plane) // see if the plane has allready been added for (i = 0; i < numbrushfaces; i++) { pl = &faces[i].plane; - if (VectorCompare (plane->normal, pl->normal) + if (_VectorCompare (plane->normal, pl->normal) && fabs (plane->dist - pl->dist) < ON_EPSILON) return; VectorSubtract (vec3_origin, plane->normal, inv); - if (VectorCompare (inv, pl->normal) + if (_VectorCompare (inv, pl->normal) && fabs (plane->dist + pl->dist) < ON_EPSILON) return; } @@ -536,7 +536,7 @@ AddHullPoint (vec3_t p, int hullnum) vec_t *c; for (i = 0; i < num_hull_points; i++) - if (VectorCompare (p, hull_points[i])) + if (_VectorCompare (p, hull_points[i])) return i; VectorCopy (p, hull_points[num_hull_points]); diff --git a/tools/qfbsp/source/map.c b/tools/qfbsp/source/map.c index fc3c55740..b0dc0a6c6 100644 --- a/tools/qfbsp/source/map.c +++ b/tools/qfbsp/source/map.c @@ -327,7 +327,7 @@ ParseBrush (void) } CrossProduct (t1, t2, f->plane.normal); - if (VectorCompare (f->plane.normal, vec3_origin)) { + if (_VectorCompare (f->plane.normal, vec3_origin)) { printf ("WARNING: brush plane with no normal\n"); b->faces = f->next; free (f); diff --git a/tools/qfbsp/source/merge.c b/tools/qfbsp/source/merge.c index c9039d75e..5ab5ee32f 100644 --- a/tools/qfbsp/source/merge.c +++ b/tools/qfbsp/source/merge.c @@ -48,7 +48,7 @@ CheckColinear (face_t *f) VectorSubtract (f->pts[j], f->pts[i], v2); VectorNormalize (v2); - if (VectorCompare (v1, v2)) + if (_VectorCompare (v1, v2)) Sys_Error ("Colinear edge"); } diff --git a/tools/qfbsp/source/outside.c b/tools/qfbsp/source/outside.c index 67d4f5fb8..b38027d38 100644 --- a/tools/qfbsp/source/outside.c +++ b/tools/qfbsp/source/outside.c @@ -116,6 +116,7 @@ RecursiveFillOutside (node_t *l, qboolean fill) { portal_t *p; int s; + qboolean res = false; if (l->contents == CONTENTS_SOLID || l->contents == CONTENTS_SKY) return false; @@ -124,8 +125,12 @@ RecursiveFillOutside (node_t *l, qboolean fill) return false; if (l->occupied) { + vec_t *v; hit_occupied = l->occupied; - return true; + v = entities[hit_occupied].origin; + qprintf ("reached occupant at: (%4.0f,%4.0f,%4.0f) %s\n", v[0], v[1], + v[2], ValueForKey (&entities[hit_occupied], "classname")); + res = true; } l->valid = valid; @@ -144,12 +149,12 @@ RecursiveFillOutside (node_t *l, qboolean fill) MarkLeakTrail (p); DrawLeaf (l, 2); } - return true; + res = true; } p = p->next[!s]; } - return false; + return res; } void @@ -190,7 +195,7 @@ FillOutside (node_t *node) inside = false; for (i = 1; i < num_entities; i++) { - if (!VectorCompare (entities[i].origin, vec3_origin)) { + if (!_VectorCompare (entities[i].origin, vec3_origin)) { if (PlaceOccupant (i, entities[i].origin, node)) inside = true; } diff --git a/tools/qfbsp/source/portals.c b/tools/qfbsp/source/portals.c index b68a1f529..20c81ee54 100644 --- a/tools/qfbsp/source/portals.c +++ b/tools/qfbsp/source/portals.c @@ -403,8 +403,8 @@ int num_visportals; void WriteFloat (FILE *f, vec_t v) { - if (fabs (v - (int) (v + 0.5)) < 0.001) - fprintf (f, "%i ", (int) (v + 0.5)); + if (fabs (v - RINT (v)) < 0.001) + fprintf (f, "%i ", (int) RINT (v)); else fprintf (f, "%f ", v); } diff --git a/tools/qfbsp/source/region.c b/tools/qfbsp/source/region.c index b831d3df9..3da840464 100644 --- a/tools/qfbsp/source/region.c +++ b/tools/qfbsp/source/region.c @@ -265,7 +265,7 @@ HealEdges (int e1, int e2) bsp->vertexes[ed->v[0]].point, v2); VectorNormalize (v2); - if (!VectorCompare (v1, v2)) + if (!_VectorCompare (v1, v2)) Sys_Error ("HealEdges: edges not colinear"); edgemapping[e2] = e1; diff --git a/tools/qfbsp/source/solidbsp.c b/tools/qfbsp/source/solidbsp.c index d611c47a2..382843ecc 100644 --- a/tools/qfbsp/source/solidbsp.c +++ b/tools/qfbsp/source/solidbsp.c @@ -343,7 +343,7 @@ DividePlane (surface_t *in, plane_t *split, surface_t **front, inplane = &planes[in->planenum]; // parallel case is easy - if (VectorCompare (inplane->normal, split->normal)) { + if (_VectorCompare (inplane->normal, split->normal)) { // check for exactly on node if (inplane->dist == split->dist) { // divide the facets to the front // and back sides diff --git a/tools/qfbsp/source/surfaces.c b/tools/qfbsp/source/surfaces.c index 093c6a605..6bb6d188a 100644 --- a/tools/qfbsp/source/surfaces.c +++ b/tools/qfbsp/source/surfaces.c @@ -251,8 +251,8 @@ GetVertex (vec3_t in, int planenum) dvertex_t v; for (i = 0; i < 3; i++) { - if (fabs (in[i] - (int) (in[i] + 0.5)) < 0.001) - vert[i] = (int) (in[i] + 0.5); + if (fabs (in[i] - RINT (in[i])) < 0.001) + vert[i] = RINT (in[i]); else vert[i] = in[i]; } diff --git a/tools/qfmodelgen/source/modelgen.c b/tools/qfmodelgen/source/modelgen.c index f7fe84f63..ed8b6beb9 100644 --- a/tools/qfmodelgen/source/modelgen.c +++ b/tools/qfmodelgen/source/modelgen.c @@ -515,9 +515,9 @@ Cmd_Base (void) // run through all the base triangles, storing each unique vertex in the base // vertex list and setting the indirect triangles to point to the base vertices for (i = 0; i < model.numtris; i++) { - if (VectorCompare (ptri[i].verts[0], ptri[i].verts[1]) - || VectorCompare (ptri[i].verts[1], ptri[i].verts[2]) - || VectorCompare (ptri[i].verts[2], ptri[i].verts[0])) { + if (_VectorCompare (ptri[i].verts[0], ptri[i].verts[1]) + || _VectorCompare (ptri[i].verts[1], ptri[i].verts[2]) + || _VectorCompare (ptri[i].verts[2], ptri[i].verts[0])) { degeneratetris++; degenerate[i] = 1; } else { @@ -526,7 +526,7 @@ Cmd_Base (void) for (j = 0; j < 3; j++) { for (k=0 ; kplane.normal, backplane.normal); backplane.dist = -p->plane.dist; - if (VectorCompare (prevstack->portalplane.normal, backplane.normal)) + if (_VectorCompare (prevstack->portalplane.normal, backplane.normal)) continue; // can't go out a coplanar face c_portalcheck++;