mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-26 14:20:59 +00:00
Add support for ellipsoids.
Not that boxes work yet, but the fix is the same.
This commit is contained in:
parent
b4da9241f6
commit
03abb3b27d
5 changed files with 35 additions and 14 deletions
|
@ -39,13 +39,19 @@ typedef struct
|
|||
vec_t dist;
|
||||
} plane_t;
|
||||
|
||||
typedef enum {
|
||||
tr_point,
|
||||
tr_box,
|
||||
tr_ellipsoid,
|
||||
} trace_e;
|
||||
|
||||
typedef struct trace_s {
|
||||
qboolean allsolid; // if true, plane is not valid
|
||||
qboolean startsolid; // if true, the initial point was in a solid area
|
||||
qboolean inopen, inwater;
|
||||
float fraction; // time completed, 1.0 = didn't hit anything
|
||||
vec3_t extents; // 1/2 size of traced box
|
||||
qboolean isbox; // box or point
|
||||
trace_e type; // type of trace to perform
|
||||
vec3_t endpos; // final position
|
||||
plane_t plane; // surface normal at impact
|
||||
struct edict_s *ent; // entity the surface is on
|
||||
|
|
|
@ -228,7 +228,7 @@ do_trace (box_t *box, hull_t *hull, vec3_t start, vec3_t end)
|
|||
trace.inwater = false;
|
||||
trace.fraction = 1;
|
||||
VectorCopy (box->extents, trace.extents);
|
||||
trace.isbox = true;
|
||||
trace.type = tr_box;
|
||||
VectorCopy (end, trace.endpos);
|
||||
MOD_TraceLine (hull, 0, start, end, &trace);
|
||||
return trace;
|
||||
|
|
|
@ -64,15 +64,28 @@ typedef struct {
|
|||
static inline float
|
||||
calc_offset (trace_t *trace, mplane_t *plane)
|
||||
{
|
||||
if (trace->isbox) {
|
||||
if (plane->type < 3)
|
||||
return trace->extents[plane->type];
|
||||
else
|
||||
return (fabs (trace->extents[0] * plane->normal[0])
|
||||
+ fabs (trace->extents[1] * plane->normal[1])
|
||||
+ fabs (trace->extents[2] * plane->normal[2]));
|
||||
vec_t d = 0;
|
||||
vec3_t Rn;
|
||||
|
||||
switch (trace->type) {
|
||||
case tr_point:
|
||||
break;
|
||||
case tr_box:
|
||||
if (plane->type < 3)
|
||||
d = trace->extents[plane->type];
|
||||
else
|
||||
d = (fabs (trace->extents[0] * plane->normal[0])
|
||||
+ fabs (trace->extents[1] * plane->normal[1])
|
||||
+ fabs (trace->extents[2] * plane->normal[2]));
|
||||
break;
|
||||
case tr_ellipsoid:
|
||||
VectorSet (trace->extents[0] * plane->normal[0],
|
||||
trace->extents[1] * plane->normal[1],
|
||||
trace->extents[2] * plane->normal[2], Rn);
|
||||
d = sqrt(DotProduct (Rn, Rn)); //FIXME no sqrt
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
return d;
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
|
|
@ -614,12 +614,13 @@ SV_ClipMoveToEntity (edict_t *touched, const vec3_t start,
|
|||
|
||||
trace.fraction = 1;
|
||||
trace.allsolid = true;
|
||||
trace.isbox = 0;
|
||||
trace.type = tr_point;
|
||||
VectorCopy (end, trace.endpos);
|
||||
|
||||
// get the clipping hull
|
||||
hull = SV_HullForEntity (touched, mins, maxs,
|
||||
trace.isbox ? trace.extents : 0, offset);
|
||||
trace.type != tr_point ? trace.extents : 0,
|
||||
offset);
|
||||
|
||||
VectorSubtract (start, offset, start_l);
|
||||
VectorSubtract (end, offset, end_l);
|
||||
|
|
|
@ -614,12 +614,13 @@ SV_ClipMoveToEntity (edict_t *touched, const vec3_t start,
|
|||
|
||||
trace.fraction = 1;
|
||||
trace.allsolid = true;
|
||||
trace.isbox = 0;
|
||||
trace.type = tr_point;
|
||||
VectorCopy (end, trace.endpos);
|
||||
|
||||
// get the clipping hull
|
||||
hull = SV_HullForEntity (touched, mins, maxs,
|
||||
trace.isbox ? trace.extents : 0, offset);
|
||||
trace.type != tr_point ? trace.extents : 0,
|
||||
offset);
|
||||
|
||||
VectorSubtract (start, offset, start_l);
|
||||
VectorSubtract (end, offset, end_l);
|
||||
|
|
Loading…
Reference in a new issue