mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-07 08:21:59 +00:00
some serious speedups. that memset was fiendishly expensive (oops:) and
redundant anyway (d'oh, paranoia bit me in the bum).
This commit is contained in:
parent
1ed772a933
commit
0c1655ac00
3 changed files with 81 additions and 63 deletions
|
@ -110,7 +110,7 @@ CalcFaceVectors (lightinfo_t *l, vec3_t faceorg)
|
||||||
tex->vecs[1][0] * tex->vecs[0][2];
|
tex->vecs[1][0] * tex->vecs[0][2];
|
||||||
texnormal[2] = tex->vecs[1][0] * tex->vecs[0][1] -
|
texnormal[2] = tex->vecs[1][0] * tex->vecs[0][1] -
|
||||||
tex->vecs[1][1] * tex->vecs[0][0];
|
tex->vecs[1][1] * tex->vecs[0][0];
|
||||||
_VectorNormalize (texnormal);
|
VectorNormalize (texnormal);
|
||||||
|
|
||||||
// flip it towards plane normal
|
// flip it towards plane normal
|
||||||
distscale = DotProduct (texnormal, l->facenormal);
|
distscale = DotProduct (texnormal, l->facenormal);
|
||||||
|
@ -415,8 +415,6 @@ LightFace (lightinfo_t *l, int surfnum)
|
||||||
lightchain_t *lightchain;
|
lightchain_t *lightchain;
|
||||||
lightsample_t *sample;
|
lightsample_t *sample;
|
||||||
|
|
||||||
memset (l, 0, sizeof(lightinfo_t));
|
|
||||||
|
|
||||||
f = bsp->faces + surfnum;
|
f = bsp->faces + surfnum;
|
||||||
|
|
||||||
l->face = f;
|
l->face = f;
|
||||||
|
|
|
@ -138,66 +138,86 @@ MakeTnodes (dmodel_t *bm)
|
||||||
#define TESTLINESTATE_EMPTY 1
|
#define TESTLINESTATE_EMPTY 1
|
||||||
#define TESTLINESTATE_SOLID 2
|
#define TESTLINESTATE_SOLID 2
|
||||||
|
|
||||||
static qboolean
|
|
||||||
RecursiveTestLine (lightinfo_t *l, int num, vec3_t p1, vec3_t p2)
|
|
||||||
{
|
|
||||||
int side, ret;
|
|
||||||
vec_t t1, t2, frac;
|
|
||||||
vec3_t mid;
|
|
||||||
tnode_t *tnode;
|
|
||||||
|
|
||||||
// check for empty
|
|
||||||
loc0:
|
|
||||||
if (num < 0) {
|
|
||||||
if (num == CONTENTS_SOLID)
|
|
||||||
return TESTLINESTATE_SOLID;
|
|
||||||
else
|
|
||||||
return TESTLINESTATE_EMPTY;
|
|
||||||
}
|
|
||||||
|
|
||||||
// find the point distances
|
|
||||||
tnode = tnodes + num;
|
|
||||||
|
|
||||||
if (tnode->type < 3) {
|
|
||||||
t1 = p1[tnode->type] - tnode->dist;
|
|
||||||
t2 = p2[tnode->type] - tnode->dist;
|
|
||||||
} else {
|
|
||||||
t1 = DotProduct (tnode->normal, p1) - tnode->dist;
|
|
||||||
t2 = DotProduct (tnode->normal, p2) - tnode->dist;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (t1 >= 0) {
|
|
||||||
if (t2 >= 0) {
|
|
||||||
num = tnode->children[0];
|
|
||||||
goto loc0;
|
|
||||||
}
|
|
||||||
side = 0;
|
|
||||||
} else {
|
|
||||||
if (t2 < 0) {
|
|
||||||
num = tnode->children[1];
|
|
||||||
goto loc0;
|
|
||||||
}
|
|
||||||
side = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
frac = t1 / (t1 - t2);
|
|
||||||
mid[0] = p1[0] + frac * (p2[0] - p1[0]);
|
|
||||||
mid[1] = p1[1] + frac * (p2[1] - p1[1]);
|
|
||||||
mid[2] = p1[2] + frac * (p2[2] - p1[2]);
|
|
||||||
|
|
||||||
// front side first
|
|
||||||
ret = RecursiveTestLine (l, tnode->children[side], p1, mid);
|
|
||||||
if (ret != TESTLINESTATE_EMPTY)
|
|
||||||
return ret; // solid or blocked
|
|
||||||
ret = RecursiveTestLine (l, tnode->children[!side], mid, p2);
|
|
||||||
if (ret != TESTLINESTATE_SOLID)
|
|
||||||
return ret; // empty or blocked
|
|
||||||
VectorCopy (mid, l->testlineimpact);
|
|
||||||
return TESTLINESTATE_BLOCKED;
|
|
||||||
}
|
|
||||||
|
|
||||||
qboolean
|
qboolean
|
||||||
TestLine (lightinfo_t *l, vec3_t start, vec3_t end)
|
TestLine (lightinfo_t *l, vec3_t start, vec3_t end)
|
||||||
{
|
{
|
||||||
return RecursiveTestLine (l, 0, start, end) != TESTLINESTATE_BLOCKED;
|
vec_t front, back;
|
||||||
|
vec3_t frontpt, backpt;
|
||||||
|
int node, side, empty;
|
||||||
|
tracestack_t *tstack;
|
||||||
|
tracestack_t tracestack[64];
|
||||||
|
tnode_t *tnode;
|
||||||
|
|
||||||
|
VectorCopy (start, frontpt);
|
||||||
|
VectorCopy (end, backpt);
|
||||||
|
|
||||||
|
tstack = tracestack;
|
||||||
|
node = 0;
|
||||||
|
empty = 0;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
while (node < 0) {
|
||||||
|
if (node != CONTENTS_SOLID)
|
||||||
|
empty = 1;
|
||||||
|
else if (empty) {
|
||||||
|
// DONE!
|
||||||
|
VectorCopy (backpt, l->testlineimpact);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// pop up the stack for a back side
|
||||||
|
if (tstack-- == tracestack)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// set the hit point for this plane
|
||||||
|
VectorCopy (backpt, frontpt);
|
||||||
|
|
||||||
|
// go down the back side
|
||||||
|
VectorCopy (tstack->backpt, backpt);
|
||||||
|
|
||||||
|
node = tnodes[tstack->node].children[!tstack->side];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node == CONTENTS_SOLID && empty) {
|
||||||
|
// DONE!
|
||||||
|
VectorCopy (backpt, l->testlineimpact);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
tnode = &tnodes[node];
|
||||||
|
|
||||||
|
if (tnode->type < 3) {
|
||||||
|
front = frontpt[tnode->type] - tnode->dist;
|
||||||
|
back = backpt[tnode->type] - tnode->dist;
|
||||||
|
} else {
|
||||||
|
front = DotProduct (tnode->normal, frontpt) - tnode->dist;
|
||||||
|
back = DotProduct (tnode->normal, backpt) - tnode->dist;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (front >= 0 && back >= 0) {
|
||||||
|
node = tnode->children[0];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (front < 0 && back < 0) {
|
||||||
|
node = tnode->children[1];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
side = front < 0;
|
||||||
|
|
||||||
|
front = front / (front - back);
|
||||||
|
|
||||||
|
tstack->node = node;
|
||||||
|
tstack->side = side;
|
||||||
|
VectorCopy (backpt, tstack->backpt);
|
||||||
|
|
||||||
|
tstack++;
|
||||||
|
|
||||||
|
backpt[0] = frontpt[0] + front * (backpt[0] - frontpt[0]);
|
||||||
|
backpt[1] = frontpt[1] + front * (backpt[1] - frontpt[1]);
|
||||||
|
backpt[2] = frontpt[2] + front * (backpt[2] - frontpt[2]);
|
||||||
|
|
||||||
|
node = tnode->children[side];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -235,6 +235,6 @@ VisStats (void)
|
||||||
"out of the solid or sky to accelerate compiling\n",
|
"out of the solid or sky to accelerate compiling\n",
|
||||||
counts.solid + counts.sky, counts.lights,
|
counts.solid + counts.sky, counts.lights,
|
||||||
(counts.solid + counts.sky) * 100 / counts.lights);
|
(counts.solid + counts.sky) * 100 / counts.lights);
|
||||||
printf ("%i lights will be cast onto %i surfaces, %i casts will\n"
|
printf ("%i lights will be cast onto %i surfaces, %i casts will "
|
||||||
"be performed\n", counts.lights, bsp->numfaces, counts.cast);
|
"be performed\n", counts.lights, bsp->numfaces, counts.cast);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue