mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-10 15:22:04 +00:00
Finish the port of smart leak files.
This comes from the OpenQuartz version of qbsp.
This commit is contained in:
parent
142defe9c0
commit
93517d40d8
3 changed files with 56 additions and 0 deletions
|
@ -43,6 +43,7 @@ typedef struct {
|
||||||
qboolean extract_textures;
|
qboolean extract_textures;
|
||||||
qboolean extract_entities;
|
qboolean extract_entities;
|
||||||
qboolean extract_hull;
|
qboolean extract_hull;
|
||||||
|
qboolean smart_leak;
|
||||||
qboolean usehulls;
|
qboolean usehulls;
|
||||||
qboolean watervis;
|
qboolean watervis;
|
||||||
int hullnum;
|
int hullnum;
|
||||||
|
|
|
@ -61,6 +61,7 @@ static struct option const long_options[] = {
|
||||||
{"extract-textures", no_argument, 0, 256},
|
{"extract-textures", no_argument, 0, 256},
|
||||||
{"extract-entities", no_argument, 0, 257},
|
{"extract-entities", no_argument, 0, 257},
|
||||||
{"extract-hull", no_argument, 0, 258},
|
{"extract-hull", no_argument, 0, 258},
|
||||||
|
{"smart-leak", no_argument, 0, 259},
|
||||||
{"usehulls", no_argument, 0, 'u'},
|
{"usehulls", no_argument, 0, 'u'},
|
||||||
{"hullnum", required_argument, 0, 'H'},
|
{"hullnum", required_argument, 0, 'H'},
|
||||||
{"subdivide", required_argument, 0, 's'},
|
{"subdivide", required_argument, 0, 's'},
|
||||||
|
@ -176,6 +177,9 @@ DecodeArgs (int argc, char **argv)
|
||||||
options.extract = true;
|
options.extract = true;
|
||||||
options.extract_hull = true;
|
options.extract_hull = true;
|
||||||
break;
|
break;
|
||||||
|
case 259: // smart-leak
|
||||||
|
options.smart_leak = true;
|
||||||
|
break;
|
||||||
case 'u': // usehulls
|
case 'u': // usehulls
|
||||||
options.usehulls = true;
|
options.usehulls = true;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -161,6 +161,52 @@ MarkLeakTrail (portal_t *n2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
MarkLeakTrail2 (void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int next, side;
|
||||||
|
node_t *n, *nextnode;
|
||||||
|
portal_t *p, *p2;
|
||||||
|
vec3_t wc;
|
||||||
|
vec_t *v;
|
||||||
|
|
||||||
|
leakfile = fopen (options.pointfile, "w");
|
||||||
|
if (!leakfile)
|
||||||
|
Sys_Error ("Couldn't open %s\n", options.pointfile);
|
||||||
|
|
||||||
|
n = &outside_node;
|
||||||
|
next = -1;
|
||||||
|
|
||||||
|
while ((n->o_dist > 1) || (next == -1)) {
|
||||||
|
nextnode = 0;
|
||||||
|
p2 = 0;
|
||||||
|
for (p = n->portals; p; p = p->next[side]) {
|
||||||
|
side = (p->nodes[1] == n);
|
||||||
|
if ((next == -1)
|
||||||
|
|| ((p->nodes[!side]->o_dist < next)
|
||||||
|
&& p->nodes[!side]->o_dist)) {
|
||||||
|
nextnode = p->nodes[!side];
|
||||||
|
next = nextnode->o_dist;
|
||||||
|
p2 = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!nextnode)
|
||||||
|
break;
|
||||||
|
n = nextnode;
|
||||||
|
|
||||||
|
VectorZero (wc);
|
||||||
|
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]);
|
||||||
|
}
|
||||||
|
v = entities[n->occupied].origin;
|
||||||
|
fprintf (leakfile, "%g %g %g\n", v[0], v[1], v[2]);
|
||||||
|
|
||||||
|
fclose (leakfile);
|
||||||
|
}
|
||||||
|
|
||||||
int hit_occupied;
|
int hit_occupied;
|
||||||
|
|
||||||
/** Recurse through the map setting the outside nodes to solid.
|
/** Recurse through the map setting the outside nodes to solid.
|
||||||
|
@ -206,6 +252,8 @@ RecursiveFillOutside (node_t *l, qboolean fill)
|
||||||
|
|
||||||
if (RecursiveFillOutside (p->nodes[s], fill)) {
|
if (RecursiveFillOutside (p->nodes[s], fill)) {
|
||||||
// leaked, so stop filling
|
// leaked, so stop filling
|
||||||
|
if (options.smart_leak)
|
||||||
|
return true;
|
||||||
if (!options.hullnum) {
|
if (!options.hullnum) {
|
||||||
MarkLeakTrail (p);
|
MarkLeakTrail (p);
|
||||||
DrawLeaf (l, 2);
|
DrawLeaf (l, 2);
|
||||||
|
@ -297,6 +345,9 @@ FillOutside (node_t *node)
|
||||||
printf ("leak file written to %s\n", options.pointfile);
|
printf ("leak file written to %s\n", options.pointfile);
|
||||||
printf ("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
|
printf ("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
|
||||||
}
|
}
|
||||||
|
if (options.smart_leak)
|
||||||
|
MarkLeakTrail2 ();
|
||||||
|
|
||||||
// remove faces from filled in leafs
|
// remove faces from filled in leafs
|
||||||
ClearOutFaces (node);
|
ClearOutFaces (node);
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in a new issue