Trying to get better doom clipping - still doesn't work right.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@162 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
3577d534b6
commit
011366be8e
1 changed files with 111 additions and 30 deletions
|
@ -1636,18 +1636,15 @@ qboolean Doom_RecursiveHullCheck (hull_t *hull, int num, float p1f, float p2f, v
|
||||||
int bmi, obmi;
|
int bmi, obmi;
|
||||||
vec3_t delta;
|
vec3_t delta;
|
||||||
int sec1 = Doom_SectorNearPoint(start);
|
int sec1 = Doom_SectorNearPoint(start);
|
||||||
vec3_t p1, pointonplane;
|
vec3_t p1, pointonplane, ofs;
|
||||||
float d1, d2, c1, c2;
|
float d1, d2, c1, c2, planedist;
|
||||||
plane_t *lp;
|
plane_t *lp;
|
||||||
mdoomvertex_t *v1, *v2;
|
mdoomvertex_t *v1, *v2;
|
||||||
|
int j;
|
||||||
|
|
||||||
float clipfrac;
|
float clipfrac;
|
||||||
#define DIST_EPSILON (0.03125)
|
#define DIST_EPSILON (0.03125)
|
||||||
|
|
||||||
float cylinder = 0;//hull->clip_maxs[0]; //FIXME: //lines and gravity cause major problems. the player is only ever in one sector at a time but should be in multiple.
|
|
||||||
// hull->clip_mins[2]=0;
|
|
||||||
// hull->clip_maxs[2]=0;
|
|
||||||
|
|
||||||
// Con_Printf("%i\n", sec1);
|
// Con_Printf("%i\n", sec1);
|
||||||
|
|
||||||
if (start[2] < sectorm[sec1].floorheight-hull->clip_mins[2]) //whoops, started outside... ?
|
if (start[2] < sectorm[sec1].floorheight-hull->clip_mins[2]) //whoops, started outside... ?
|
||||||
|
@ -1656,7 +1653,7 @@ qboolean Doom_RecursiveHullCheck (hull_t *hull, int num, float p1f, float p2f, v
|
||||||
trace->allsolid = trace->startsolid = true;
|
trace->allsolid = trace->startsolid = true;
|
||||||
trace->endpos[0] = start[0];
|
trace->endpos[0] = start[0];
|
||||||
trace->endpos[1] = start[1];
|
trace->endpos[1] = start[1];
|
||||||
trace->endpos[2] = start[2];
|
trace->endpos[2] = start[2]; //yeah, we do mean this - startsolid
|
||||||
// if (IS_NAN(trace->endpos[2]))
|
// if (IS_NAN(trace->endpos[2]))
|
||||||
// Con_Printf("Nanny\n");
|
// Con_Printf("Nanny\n");
|
||||||
trace->plane.normal[0] = 0;
|
trace->plane.normal[0] = 0;
|
||||||
|
@ -1684,7 +1681,7 @@ qboolean Doom_RecursiveHullCheck (hull_t *hull, int num, float p1f, float p2f, v
|
||||||
obmi = -1;
|
obmi = -1;
|
||||||
VectorSubtract(p2, p1, delta);
|
VectorSubtract(p2, p1, delta);
|
||||||
p2f = Length(delta)+DIST_EPSILON;
|
p2f = Length(delta)+DIST_EPSILON;
|
||||||
if (IS_NAN(p2f))
|
if (IS_NAN(p2f) || p2f > 100000)
|
||||||
p2f = 100000;
|
p2f = 100000;
|
||||||
VectorNormalize(delta);
|
VectorNormalize(delta);
|
||||||
|
|
||||||
|
@ -1717,36 +1714,119 @@ qboolean Doom_RecursiveHullCheck (hull_t *hull, int num, float p1f, float p2f, v
|
||||||
}
|
}
|
||||||
|
|
||||||
lp = lineplanes + *linedefs;
|
lp = lineplanes + *linedefs;
|
||||||
d1 = DotProduct(lp->normal, start) - (lp->dist);
|
|
||||||
d2 = DotProduct(lp->normal, p2) - (lp->dist);
|
if (1)
|
||||||
if (d1 >= cylinder && d2 >= cylinder)
|
{ //figure out how far to move the plane out by
|
||||||
|
for (j=0 ; j<2 ; j++)
|
||||||
|
{
|
||||||
|
if (lp->normal[j] < 0)
|
||||||
|
ofs[j] = hull->clip_maxs[j];
|
||||||
|
else
|
||||||
|
ofs[j] = hull->clip_mins[j];
|
||||||
|
}
|
||||||
|
ofs[2] = 0;
|
||||||
|
planedist = lp->dist - DotProduct (ofs, lp->normal);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
planedist = lp->dist;
|
||||||
|
|
||||||
|
d1 = DotProduct(lp->normal, start) - (planedist);
|
||||||
|
d2 = DotProduct(lp->normal, p2) - (planedist);
|
||||||
|
if (d1 > 0 && d2 > 0)
|
||||||
continue; //both points on the front side.
|
continue; //both points on the front side.
|
||||||
if (d1 <= cylinder && d2 <= cylinder)
|
if (d1 < 0) //start on back side
|
||||||
|
{
|
||||||
|
if (ld->sidedef[1] != 0xffff) //two sided (optimisation)
|
||||||
|
{
|
||||||
|
planedist = -planedist+lp->dist;
|
||||||
|
if (/*d1 < planedist*-1 &&*/ d1 > planedist*2)
|
||||||
|
{ //right, we managed to end up just on the other side of a wall's plane.
|
||||||
|
v1 = &vertexesl[ld->vert[0]];
|
||||||
|
v2 = &vertexesl[ld->vert[1]];
|
||||||
|
if (!(d1 - d2))
|
||||||
|
continue;
|
||||||
|
if (d1<0) //back to front.
|
||||||
|
c1 = (d1+DIST_EPSILON) / (d1 - d2);
|
||||||
|
else
|
||||||
|
c1 = (d1-DIST_EPSILON) / (d1 - d2);
|
||||||
|
c2 = 1-c1;
|
||||||
|
pointonplane[0] = start[0]*c2 + p2[0]*c1;
|
||||||
|
/* if (pointonplane[0] > v1->xpos+DIST_EPSILON*2+hull->clip_maxs[0] && pointonplane[0] > v2->xpos+DIST_EPSILON*2+hull->clip_maxs[0])
|
||||||
|
continue;
|
||||||
|
if (pointonplane[0] < v1->xpos-DIST_EPSILON*2+hull->clip_mins[0] && pointonplane[0] < v2->xpos-DIST_EPSILON*2+hull->clip_mins[0])
|
||||||
|
continue;
|
||||||
|
*/ pointonplane[1] = start[1]*c2 + p2[1]*c1;
|
||||||
|
/* if (pointonplane[1] > v1->ypos+DIST_EPSILON*2+hull->clip_maxs[1] && pointonplane[1] > v2->ypos+DIST_EPSILON*2+hull->clip_maxs[1])
|
||||||
|
continue;
|
||||||
|
if (pointonplane[1] < v1->ypos-DIST_EPSILON*2+hull->clip_mins[1] && pointonplane[1] < v2->ypos-DIST_EPSILON*2+hull->clip_mins[1])
|
||||||
|
continue;
|
||||||
|
*/
|
||||||
|
pointonplane[2] = start[2]*c2 + p2[2]*c1;
|
||||||
|
|
||||||
|
Con_Printf("Started in wall\n");
|
||||||
|
j = sidedefsm[ld->sidedef[d1 < planedist]].sector;
|
||||||
|
//yup, we are in the thing
|
||||||
|
//prevent ourselves from entering the back-sector's floor/ceiling
|
||||||
|
if (pointonplane[2] < sectorm[j].floorheight-hull->clip_mins[2]) //whoops, started outside... ?
|
||||||
|
{
|
||||||
|
Con_Printf("Started in floor\n");
|
||||||
|
trace->allsolid = trace->startsolid = false;
|
||||||
|
trace->endpos[2] = sectorm[j].floorheight-hull->clip_mins[2];
|
||||||
|
trace->fraction = fabs(trace->endpos[2] - start[2]) / fabs(p2[2] - start[2]);
|
||||||
|
trace->endpos[0] = start[0]+delta[0]*trace->fraction*p2f;
|
||||||
|
trace->endpos[1] = start[1]+delta[1]*trace->fraction*p2f;
|
||||||
|
// if (IS_NAN(trace->endpos[2]))
|
||||||
|
// Con_Printf("Nanny\n");
|
||||||
|
trace->plane.normal[0] = 0;
|
||||||
|
trace->plane.normal[1] = 0;
|
||||||
|
trace->plane.normal[2] = 1;
|
||||||
|
trace->plane.dist = sectorm[j].floorheight-hull->clip_mins[2];
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (pointonplane[2] > sectorm[j].ceilingheight-hull->clip_maxs[2]) //whoops, started outside... ?
|
||||||
|
{
|
||||||
|
Con_Printf("Started in ceiling\n");
|
||||||
|
trace->allsolid = trace->startsolid = false;
|
||||||
|
trace->endpos[0] = pointonplane[0];
|
||||||
|
trace->endpos[1] = pointonplane[1];
|
||||||
|
trace->endpos[2] = sectorm[j].ceilingheight-hull->clip_maxs[2];
|
||||||
|
trace->fraction = fabs(trace->endpos[2] - start[2]) / fabs(p2[2] - start[2]);
|
||||||
|
trace->plane.normal[0] = 0;
|
||||||
|
trace->plane.normal[1] = 0;
|
||||||
|
trace->plane.normal[2] = -1;
|
||||||
|
trace->plane.dist = -(sectorm[j].ceilingheight-hull->clip_maxs[2]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (d2 < 0)
|
||||||
continue; //both points on the reverse side.
|
continue; //both points on the reverse side.
|
||||||
|
}
|
||||||
|
|
||||||
//line crosses plane.
|
//line crosses plane.
|
||||||
|
|
||||||
v1 = &vertexesl[ld->vert[0]];
|
v1 = &vertexesl[ld->vert[0]];
|
||||||
v2 = &vertexesl[ld->vert[1]];
|
v2 = &vertexesl[ld->vert[1]];
|
||||||
|
|
||||||
if (d1<cylinder) //back to front.
|
if (d1<0) //back to front.
|
||||||
{
|
{
|
||||||
if (ld->sidedef[1] == 0xffff)
|
if (ld->sidedef[1] == 0xffff)
|
||||||
continue; //allow them to pass
|
continue; //hack to allow them to pass
|
||||||
c1 = (d1+DIST_EPSILON) / (d1 - d2);
|
c1 = (d1+DIST_EPSILON) / (d1 - d2);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
c1 = (d1-DIST_EPSILON) / (d1 - d2);
|
c1 = (d1-DIST_EPSILON) / (d1 - d2);
|
||||||
c2 = 1-c1;
|
c2 = 1-c1;
|
||||||
pointonplane[0] = start[0]*c2 + p2[0]*c1;
|
pointonplane[0] = start[0]*c2 + p2[0]*c1;
|
||||||
if (pointonplane[0] > v1->xpos+DIST_EPSILON*2+cylinder && pointonplane[0] > v2->xpos+DIST_EPSILON*2+cylinder)
|
if (pointonplane[0] > v1->xpos+DIST_EPSILON*2+hull->clip_maxs[0] && pointonplane[0] > v2->xpos+DIST_EPSILON*2+hull->clip_maxs[0])
|
||||||
continue;
|
continue;
|
||||||
if (pointonplane[0] < v1->xpos-DIST_EPSILON*2-cylinder && pointonplane[0] < v2->xpos-DIST_EPSILON*2-cylinder)
|
if (pointonplane[0] < v1->xpos-DIST_EPSILON*2+hull->clip_mins[0] && pointonplane[0] < v2->xpos-DIST_EPSILON*2+hull->clip_mins[0])
|
||||||
continue;
|
continue;
|
||||||
pointonplane[1] = start[1]*c2 + p2[1]*c1;
|
pointonplane[1] = start[1]*c2 + p2[1]*c1;
|
||||||
if (pointonplane[1] > v1->ypos+DIST_EPSILON*2+cylinder && pointonplane[1] > v2->ypos+DIST_EPSILON*2+cylinder)
|
if (pointonplane[1] > v1->ypos+DIST_EPSILON*2+hull->clip_maxs[1] && pointonplane[1] > v2->ypos+DIST_EPSILON*2+hull->clip_maxs[1])
|
||||||
continue;
|
continue;
|
||||||
if (pointonplane[1] < v1->ypos-DIST_EPSILON*2-cylinder && pointonplane[1] < v2->ypos-DIST_EPSILON*2-cylinder)
|
if (pointonplane[1] < v1->ypos-DIST_EPSILON*2+hull->clip_mins[1] && pointonplane[1] < v2->ypos-DIST_EPSILON*2+hull->clip_mins[1])
|
||||||
continue;
|
continue;
|
||||||
pointonplane[2] = start[2]*c2 + p2[2]*c1;
|
pointonplane[2] = start[2]*c2 + p2[2]*c1;
|
||||||
|
|
||||||
|
@ -1754,10 +1834,10 @@ qboolean Doom_RecursiveHullCheck (hull_t *hull, int num, float p1f, float p2f, v
|
||||||
{ //unconditionally clipped.
|
{ //unconditionally clipped.
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ //ensure that the side we are passing on to passes the clip
|
{ //ensure that the side we are passing on to passes the clip (no ceiling/floor clips happened first)
|
||||||
msector_t *sec2;
|
msector_t *sec2;
|
||||||
|
|
||||||
if (d1<cylinder)
|
if (d1<0)
|
||||||
sec2 = §orm[sidedefsm[ld->sidedef[1]].sector];
|
sec2 = §orm[sidedefsm[ld->sidedef[1]].sector];
|
||||||
else
|
else
|
||||||
sec2 = §orm[sidedefsm[ld->sidedef[0]].sector];
|
sec2 = §orm[sidedefsm[ld->sidedef[0]].sector];
|
||||||
|
@ -1812,7 +1892,7 @@ qboolean Doom_RecursiveHullCheck (hull_t *hull, int num, float p1f, float p2f, v
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d1<cylinder)
|
if (d1<0)
|
||||||
sec2 = §orm[sidedefsm[ld->sidedef[0]].sector];
|
sec2 = §orm[sidedefsm[ld->sidedef[0]].sector];
|
||||||
else
|
else
|
||||||
sec2 = §orm[sidedefsm[ld->sidedef[1]].sector];
|
sec2 = §orm[sidedefsm[ld->sidedef[1]].sector];
|
||||||
|
@ -1823,7 +1903,7 @@ qboolean Doom_RecursiveHullCheck (hull_t *hull, int num, float p1f, float p2f, v
|
||||||
if (pointonplane[2] > sec2->floorheight-hull->clip_mins[2] &&
|
if (pointonplane[2] > sec2->floorheight-hull->clip_mins[2] &&
|
||||||
pointonplane[2] < sec2->ceilingheight-hull->clip_maxs[2])
|
pointonplane[2] < sec2->ceilingheight-hull->clip_maxs[2])
|
||||||
{
|
{
|
||||||
// Con_Printf("Two sided passed\n");
|
Con_Printf("Two sided passed\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1831,10 +1911,10 @@ qboolean Doom_RecursiveHullCheck (hull_t *hull, int num, float p1f, float p2f, v
|
||||||
// sec2->floorheight--;
|
// sec2->floorheight--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d1<cylinder) //back to front.
|
if (d1<0) //back to front.
|
||||||
c1 = (d1-cylinder+DIST_EPSILON) / (d1 - d2);
|
c1 = (d1+DIST_EPSILON) / (d1 - d2);
|
||||||
else
|
else
|
||||||
c1 = (d1-cylinder-DIST_EPSILON) / (d1 - d2);
|
c1 = (d1-DIST_EPSILON) / (d1 - d2);
|
||||||
|
|
||||||
|
|
||||||
clipfrac = c1;
|
clipfrac = c1;
|
||||||
|
@ -1847,16 +1927,17 @@ qboolean Doom_RecursiveHullCheck (hull_t *hull, int num, float p1f, float p2f, v
|
||||||
if (trace->fraction > clipfrac)
|
if (trace->fraction > clipfrac)
|
||||||
{
|
{
|
||||||
trace->fraction = clipfrac;
|
trace->fraction = clipfrac;
|
||||||
VectorMA(pointonplane, cylinder, lp->normal, trace->endpos);
|
VectorMA(pointonplane, 0, lp->normal, trace->endpos);
|
||||||
|
VectorMA(trace->endpos, -0.1, delta, trace->endpos);
|
||||||
// if (IS_NAN(trace->endpos[2]))
|
// if (IS_NAN(trace->endpos[2]))
|
||||||
// Con_Printf("Buggy clipping\n");
|
// Con_Printf("Buggy clipping\n");
|
||||||
VectorCopy(lp->normal, trace->plane.normal);
|
VectorCopy(lp->normal, trace->plane.normal);
|
||||||
trace->plane.dist = lp->dist-cylinder;
|
trace->plane.dist = planedist;
|
||||||
// if (IS_NAN(trace->plane.normal[2]))
|
// if (IS_NAN(trace->plane.normal[2]))
|
||||||
// Con_Printf("Buggy clipping\n");
|
// Con_Printf("Buggy clipping\n");
|
||||||
|
|
||||||
// if (clipfrac)
|
if (clipfrac)
|
||||||
// Con_Printf("Clip Wall %f\n", clipfrac);
|
Con_Printf("Clip Wall %f\n", clipfrac);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue