Make some improvements to the leak files.

smart leak files now produce many points, not just one per portal. Normal
leak files now center the trail on the portal (instead of some weird
weighted average).
This commit is contained in:
Bill Currie 2012-09-16 12:38:55 +09:00
parent 709da6e7d7
commit d6476d4f93

View file

@ -111,6 +111,25 @@ PlaceOccupant (int num, const vec3_t point, node_t *headnode)
const portal_t *prevleaknode;
FILE *leakfile;
static void
write_points (const vec3_t p1, const vec3_t p2)
{
vec3_t p, dir;
float len;
VectorSubtract (p2, p1, dir);
len = VectorLength (dir);
_VectorNormalize (dir);
VectorCopy (p1, p);
while (len > 2) {
fprintf (leakfile, "%f %f %f\n", p[0], p[1], p[2]);
VectorMultAdd(p, 2, dir, p);
len -= 2;
}
}
/** Write the coords for points joining two portals to the point file.
\param n2 The second portal.
@ -119,10 +138,9 @@ FILE *leakfile;
static void
MarkLeakTrail (const portal_t *n2)
{
float len;
int i, j;
int i;
const portal_t *n1;
vec3_t p1, p2, dir;
vec3_t p1, p2;
n1 = prevleaknode;
prevleaknode = n2;
@ -130,33 +148,22 @@ MarkLeakTrail (const portal_t *n2)
if (!n1)
return;
VectorCopy (n2->winding->points[0], p1);
for (i = 1; i < n2->winding->numpoints; i++) {
for (j = 0; j < 3; j++)
p1[j] = (p1[j] + n2->winding->points[i][j]) / 2;
}
VectorZero (p1);
for (i = 0; i < n2->winding->numpoints; i++)
VectorAdd (p1, n2->winding->points[i], p1);
VectorScale (p1, 1.0 / i, p1);
VectorCopy (n1->winding->points[0], p2);
for (i = 1; i < n1->winding->numpoints; i++) {
for (j = 0; j < 3; j++)
p2[j] = (p2[j] + n1->winding->points[i][j]) / 2;
}
VectorSubtract (p2, p1, dir);
len = VectorLength (dir);
_VectorNormalize (dir);
VectorZero (p2);
for (i = 0; i < n1->winding->numpoints; i++)
VectorAdd (p2, n1->winding->points[i], p2);
VectorScale (p2, 1.0 / i, p2);
if (!leakfile)
leakfile = fopen (options.pointfile, "w");
if (!leakfile)
Sys_Error ("Couldn't open %s\n", options.pointfile);
while (len > 2) {
fprintf (leakfile, "%f %f %f\n", p1[0], p1[1], p1[2]);
for (i = 0; i < 3; i++)
p1[i] += dir[i] * 2;
len -= 2;
}
write_points (p1, p2);
}
/** Mark the trail from outside to the entity.
@ -166,11 +173,11 @@ MarkLeakTrail (const portal_t *n2)
static void
MarkLeakTrail2 (void)
{
int i;
int i, first;
int next, side;
const node_t *n, *nextnode;
const portal_t *p, *p2;
vec3_t wc;
vec3_t wc, pwc;
const vec_t *v;
leakfile = fopen (options.pointfile, "w");
@ -180,6 +187,7 @@ MarkLeakTrail2 (void)
n = &outside_node;
next = -1;
first = 1;
while ((n->o_dist > 1) || (next == -1)) {
nextnode = 0;
p2 = 0;
@ -201,10 +209,14 @@ MarkLeakTrail2 (void)
for (i = 0; i < p2->winding->numpoints; i++)
VectorAdd (wc, p2->winding->points[i], wc);
VectorScale (wc, 1.0 / i, wc);
fprintf (leakfile, "%g %g %g", wc[0], wc[1], wc[2]);
if (first) {
first = 0;
write_points(pwc, wc);
}
VectorCopy(wc, pwc);
}
v = entities[n->occupied].origin;
fprintf (leakfile, "%g %g %g\n", v[0], v[1], v[2]);
write_points(wc, v);
fclose (leakfile);
}