10 vec_t tracemins[3], tracemaxs[3];
12 vec_t tempnormal[3], starttransformed[3], endtransformed[3];
14 memset (&trace, 0 ,
sizeof(
trace_t));
27 tracemins[0] =
min(start[0], end[0]);
28 tracemaxs[0] =
max(start[0], end[0]);
29 tracemins[1] =
min(start[1], end[1]);
30 tracemaxs[1] =
max(start[1], end[1]);
31 tracemins[2] =
min(start[2], end[2]);
32 tracemaxs[2] =
max(start[2], end[2]);
53 Collision_ClipTrace_Box(&trace, ent->
model->
normalmins, ent->
model->
normalmaxs, starttransformed,
vec3_origin,
vec3_origin, endtransformed,
SUPERCONTENTS_SOLID, 0, 0,
SUPERCONTENTS_SOLID, 0,
NULL);
71 maxfrac =
bound(0, maxfrac, 1);
137 if (!
model->TraceBox)
209 int i, bodysupercontents;
214 vec3_t touchmins, touchmaxs;
216 vec3_t clipboxmins, clipboxmaxs;
218 vec3_t clipmins2, clipmaxs2;
232 if (hitnetworkentity)
233 *hitnetworkentity = 0;
238#if COLLISIONPARANOID >= 3
239 Con_Printf(
"move(%f %f %f)", clipstart[0], clipstart[1], clipstart[2]);
253 for (
i = 0;
i < 3;
i++)
261 for (
i = 0;
i < 3;
i++)
263 clipboxmins[
i] = clipstart[
i] - 1;
264 clipboxmaxs[
i] = clipstart[
i] + 1;
270 clipboxmins[0] = clipboxmins[1] = clipboxmins[2] = (
vec_t)-999999999;
271 clipboxmaxs[0] = clipboxmaxs[1] = clipboxmaxs[2] = (
vec_t)999999999;
277 if (prog ==
NULL || passedict == prog->
edicts)
287 if (hitnetworkbrushmodels)
294 Collision_ClipPointToGenericEntity(&trace, ent->
model, ent->
frameblend, ent->
skeleton,
vec3_origin,
vec3_origin, 0, &ent->
matrix, &ent->
inversematrix, start, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask);
302 if (hitnetworkplayers)
311 goto skipnetworkplayers;
338 if (!
BoxesOverlap(clipboxmins, clipboxmaxs, entmins, entmaxs))
342 Collision_ClipPointToGenericEntity(&trace,
NULL,
NULL,
NULL,
cl.
playerstandmins,
cl.
playerstandmaxs,
SUPERCONTENTS_BODY, &entmatrix, &entinversematrix, start, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask);
344 *hitnetworkentity =
i;
357 if (hitcsqcentities && prog !=
NULL)
367 for (
i = 0;
i < numtouchedicts;
i++)
369 touch = touchedicts[
i];
379 if (passedict == touch)
382 if (traceowner == touch)
402 Matrix4x4_CreateFromQuakeEntity(&matrix,
PRVM_clientedictvector(touch,
origin)[0],
PRVM_clientedictvector(touch,
origin)[1],
PRVM_clientedictvector(touch,
origin)[2],
PRVM_clientedictvector(touch,
angles)[0],
PRVM_clientedictvector(touch,
angles)[1],
PRVM_clientedictvector(touch,
angles)[2], 1);
409 Collision_ClipToGenericEntity(&trace,
model, touch->
priv.
server->frameblend, &touch->
priv.
server->skeleton, touchmins, touchmaxs, bodysupercontents, &matrix, &imatrix, clipstart, clipmins2, clipmaxs2, clipstart, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, 0.0f);
411 Collision_ClipPointToGenericEntity(&trace,
model, touch->
priv.
server->frameblend, &touch->
priv.
server->skeleton, touchmins, touchmaxs, bodysupercontents, &matrix, &imatrix, clipstart, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask);
414 *hitnetworkentity = 0;
427trace_t CL_TraceLine(
const vec3_t start,
const vec3_t end,
int type,
prvm_edict_t *passedict,
int hitsupercontentsmask,
int skipsupercontentsmask,
int skipmaterialflagsmask,
float extend,
qbool hitnetworkbrushmodels,
qbool hitnetworkplayers,
int *hitnetworkentity,
qbool hitcsqcentities,
qbool hitsurfaces)
430 int i, bodysupercontents;
435 vec3_t touchmins, touchmaxs;
437 vec3_t clipboxmins, clipboxmaxs;
439 vec3_t clipmins2, clipmaxs2;
441 vec3_t clipstart, clipend;
453 return CL_TracePoint(start,
type, passedict, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, hitnetworkbrushmodels, hitnetworkplayers, hitnetworkentity, hitcsqcentities);
455 if (hitnetworkentity)
456 *hitnetworkentity = 0;
462#if COLLISIONPARANOID >= 3
463 Con_Printf(
"move(%f %f %f,%f %f %f)", clipstart[0], clipstart[1], clipstart[2], clipend[0], clipend[1], clipend[2]);
477 for (
i = 0;
i < 3;
i++)
485 for (
i = 0;
i < 3;
i++)
487 clipboxmins[
i] =
min(clipstart[
i], cliptrace.
endpos[
i]) + clipmins2[
i] - 1;
488 clipboxmaxs[
i] =
max(clipstart[
i], cliptrace.
endpos[
i]) + clipmaxs2[
i] + 1;
494 clipboxmins[0] = clipboxmins[1] = clipboxmins[2] = (
vec_t)-999999999;
495 clipboxmaxs[0] = clipboxmaxs[1] = clipboxmaxs[2] = (
vec_t)999999999;
501 if (prog ==
NULL || passedict == prog->
edicts)
511 if (hitnetworkbrushmodels)
518 Collision_ClipLineToGenericEntity(&trace, ent->
model, ent->
frameblend, ent->
skeleton,
vec3_origin,
vec3_origin, 0, &ent->
matrix, &ent->
inversematrix, start, end, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, extend, hitsurfaces);
526 if (hitnetworkplayers)
535 goto skipnetworkplayers;
562 if (!
BoxesOverlap(clipboxmins, clipboxmaxs, entmins, entmaxs))
566 Collision_ClipLineToGenericEntity(&trace,
NULL,
NULL,
NULL,
cl.
playerstandmins,
cl.
playerstandmaxs,
SUPERCONTENTS_BODY, &entmatrix, &entinversematrix, start, end, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, extend, hitsurfaces);
568 *hitnetworkentity =
i;
581 if (hitcsqcentities && prog !=
NULL)
591 for (
i = 0;
i < numtouchedicts;
i++)
593 touch = touchedicts[
i];
603 if (passedict == touch)
606 if (traceowner == touch)
626 Matrix4x4_CreateFromQuakeEntity(&matrix,
PRVM_clientedictvector(touch,
origin)[0],
PRVM_clientedictvector(touch,
origin)[1],
PRVM_clientedictvector(touch,
origin)[2],
PRVM_clientedictvector(touch,
angles)[0],
PRVM_clientedictvector(touch,
angles)[1],
PRVM_clientedictvector(touch,
angles)[2], 1);
633 Collision_ClipToGenericEntity(&trace,
model, touch->
priv.
server->frameblend, &touch->
priv.
server->skeleton, touchmins, touchmaxs, bodysupercontents, &matrix, &imatrix, clipstart, clipmins2, clipmaxs2, clipend, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, extend);
635 Collision_ClipLineToGenericEntity(&trace,
model, touch->
priv.
server->frameblend, &touch->
priv.
server->skeleton, touchmins, touchmaxs, bodysupercontents, &matrix, &imatrix, clipstart, clipend, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, extend, hitsurfaces);
638 *hitnetworkentity = 0;
427trace_t CL_TraceLine(
const vec3_t start,
const vec3_t end,
int type,
prvm_edict_t *passedict,
int hitsupercontentsmask,
int skipsupercontentsmask,
int skipmaterialflagsmask,
float extend,
qbool hitnetworkbrushmodels,
qbool hitnetworkplayers,
int *hitnetworkentity,
qbool hitcsqcentities,
qbool hitsurfaces) {
…}
651trace_t CL_TraceBox(
const vec3_t start,
const vec3_t mins,
const vec3_t maxs,
const vec3_t end,
int type,
prvm_edict_t *passedict,
int hitsupercontentsmask,
int skipsupercontentsmask,
int skipmaterialflagsmask,
float extend,
qbool hitnetworkbrushmodels,
qbool hitnetworkplayers,
int *hitnetworkentity,
qbool hitcsqcentities)
654 vec3_t hullmins, hullmaxs;
655 int i, bodysupercontents;
661 vec3_t touchmins, touchmaxs;
663 vec3_t clipboxmins, clipboxmaxs;
665 vec3_t clipmins, clipmaxs;
667 vec3_t clipmins2, clipmaxs2;
669 vec3_t clipstart, clipend;
682 vec3_t shiftstart, shiftend;
686 trace =
CL_TracePoint(shiftstart,
type, passedict, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, hitnetworkbrushmodels, hitnetworkplayers, hitnetworkentity, hitcsqcentities);
688 trace =
CL_TraceLine(shiftstart, shiftend,
type, passedict, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, extend, hitnetworkbrushmodels, hitnetworkplayers, hitnetworkentity, hitcsqcentities,
false);
693 if (hitnetworkentity)
694 *hitnetworkentity = 0;
702#if COLLISIONPARANOID >= 3
703 Con_Printf(
"move(%f %f %f,%f %f %f)", clipstart[0], clipstart[1], clipstart[2], clipend[0], clipend[1], clipend[2]);
707 Collision_ClipToWorld(&cliptrace,
cl.
worldmodel, clipstart, clipmins, clipmaxs, clipend, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, extend);
717 for (
i = 0;
i < 3;
i++)
734 for (
i = 0;
i < 3;
i++)
736 clipboxmins[
i] =
min(clipstart[
i], cliptrace.
endpos[
i]) +
min(hullmins[
i], clipmins2[
i]) - 1;
737 clipboxmaxs[
i] =
max(clipstart[
i], cliptrace.
endpos[
i]) +
max(hullmaxs[
i], clipmaxs2[
i]) + 1;
743 clipboxmins[0] = clipboxmins[1] = clipboxmins[2] = (
vec_t)-999999999;
744 clipboxmaxs[0] = clipboxmaxs[1] = clipboxmaxs[2] = (
vec_t)999999999;
750 if (prog ==
NULL || passedict == prog->
edicts)
762 if (hitnetworkbrushmodels)
769 Collision_ClipToGenericEntity(&trace, ent->
model, ent->
frameblend, ent->
skeleton,
vec3_origin,
vec3_origin, 0, &ent->
matrix, &ent->
inversematrix, start,
mins,
maxs, end, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, extend);
777 if (hitnetworkplayers)
786 goto skipnetworkplayers;
813 if (!
BoxesOverlap(clipboxmins, clipboxmaxs, entmins, entmaxs))
817 Collision_ClipToGenericEntity(&trace,
NULL,
NULL,
NULL,
cl.
playerstandmins,
cl.
playerstandmaxs,
SUPERCONTENTS_BODY, &entmatrix, &entinversematrix, start,
mins,
maxs, end, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, extend);
819 *hitnetworkentity =
i;
832 if (hitcsqcentities && prog !=
NULL)
842 for (
i = 0;
i < numtouchedicts;
i++)
844 touch = touchedicts[
i];
854 if (passedict == touch)
857 if (traceowner == touch)
877 Matrix4x4_CreateFromQuakeEntity(&matrix,
PRVM_clientedictvector(touch,
origin)[0],
PRVM_clientedictvector(touch,
origin)[1],
PRVM_clientedictvector(touch,
origin)[2],
PRVM_clientedictvector(touch,
angles)[0],
PRVM_clientedictvector(touch,
angles)[1],
PRVM_clientedictvector(touch,
angles)[2], 1);
884 Collision_ClipToGenericEntity(&trace,
model, touch->
priv.
server->frameblend, &touch->
priv.
server->skeleton, touchmins, touchmaxs, bodysupercontents, &matrix, &imatrix, clipstart, clipmins2, clipmaxs2, clipend, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, extend);
886 Collision_ClipToGenericEntity(&trace,
model, touch->
priv.
server->frameblend, &touch->
priv.
server->skeleton, touchmins, touchmaxs, bodysupercontents, &matrix, &imatrix, clipstart, clipmins, clipmaxs, clipend, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, extend);
889 *hitnetworkentity = 0;
651trace_t CL_TraceBox(
const vec3_t start,
const vec3_t mins,
const vec3_t maxs,
const vec3_t end,
int type,
prvm_edict_t *passedict,
int hitsupercontentsmask,
int skipsupercontentsmask,
int skipmaterialflagsmask,
float extend,
qbool hitnetworkbrushmodels,
qbool hitnetworkplayers,
int *hitnetworkentity,
qbool hitcsqcentities) {
…}
909 vec3_t clipboxmins, clipboxmaxs;
911 vec3_t clipstart, clipend;
924#if COLLISIONPARANOID >= 3
925 Con_Printf(
"move(%f %f %f,%f %f %f)", clipstart[0], clipstart[1], clipstart[2], clipend[0], clipend[1], clipend[2]);
937 for (
i = 0;
i < 3;
i++)
939 clipboxmins[
i] =
min(clipstart[
i], cliptrace.
endpos[
i]) - 1;
940 clipboxmaxs[
i] =
max(clipstart[
i], cliptrace.
endpos[
i]) + 1;
972 for (
i = 0;
i < numtouchedicts;
i++)
974 touch = touchedicts[
i];
981 if ((touch->
priv.
server->frameblend[0].lerp != 1.0 || touch->
priv.
server->frameblend[0].subframe != 0) || touch->
priv.
server->skeleton.relativetransforms)
985 Matrix4x4_CreateFromQuakeEntity(&matrix,
PRVM_clientedictvector(touch,
origin)[0],
PRVM_clientedictvector(touch,
origin)[1],
PRVM_clientedictvector(touch,
origin)[2],
PRVM_clientedictvector(touch,
angles)[0],
PRVM_clientedictvector(touch,
angles)[1],
PRVM_clientedictvector(touch,
angles)[2], 1);
#define SUPERCONTENTS_BODY
#define SUPERCONTENTS_MONSTERCLIP
#define SUPERCONTENTS_SOLID
#define SUPERCONTENTS_CORPSE
#define SUPERCONTENTS_PLAYERCLIP
int CL_GenericHitSuperContentsMask(const prvm_edict_t *passedict)
trace_t CL_TraceLine(const vec3_t start, const vec3_t end, int type, prvm_edict_t *passedict, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend, qbool hitnetworkbrushmodels, qbool hitnetworkplayers, int *hitnetworkentity, qbool hitcsqcentities, qbool hitsurfaces)
trace_t CL_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int type, prvm_edict_t *passedict, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend, qbool hitnetworkbrushmodels, qbool hitnetworkplayers, int *hitnetworkentity, qbool hitcsqcentities)
trace_t CL_TracePoint(const vec3_t start, int type, prvm_edict_t *passedict, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, qbool hitnetworkbrushmodels, qbool hitnetworkplayers, int *hitnetworkentity, qbool hitcsqcentities)
model_t * CL_GetModelFromEdict(prvm_edict_t *ed)
void CL_LinkEdict(prvm_edict_t *ent)
void CL_FindNonSolidLocation(const vec3_t in, vec3_t out, vec_t radius)
float CL_SelectTraceLine(const vec3_t start, const vec3_t end, vec3_t impact, vec3_t normal, int *hitent, entity_render_t *ignoreent)
model_t * CL_GetModelByIndex(int modelindex)
trace_t CL_Cache_TraceLineSurfaces(const vec3_t start, const vec3_t end, int type, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask)
cvar_t cl_areagrid_link_SOLID_NOT
void Collision_ClipToWorld(trace_t *trace, model_t *model, const vec3_t tstart, const vec3_t mins, const vec3_t maxs, const vec3_t tend, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend)
void Collision_ClipLineToWorld(trace_t *trace, model_t *model, const vec3_t tstart, const vec3_t tend, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend, qbool hitsurfaces)
void Collision_CombineTraces(trace_t *cliptrace, const trace_t *trace, void *touch, qbool isbmodel)
void Collision_ClipLineToGenericEntity(trace_t *trace, model_t *model, const frameblend_t *frameblend, const skeleton_t *skeleton, const vec3_t bodymins, const vec3_t bodymaxs, int bodysupercontents, matrix4x4_t *matrix, matrix4x4_t *inversematrix, const vec3_t tstart, const vec3_t tend, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend, qbool hitsurfaces)
void Collision_ClipToGenericEntity(trace_t *trace, model_t *model, const frameblend_t *frameblend, const skeleton_t *skeleton, const vec3_t bodymins, const vec3_t bodymaxs, int bodysupercontents, matrix4x4_t *matrix, matrix4x4_t *inversematrix, const vec3_t tstart, const vec3_t mins, const vec3_t maxs, const vec3_t tend, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend)
void Collision_Cache_ClipLineToWorldSurfaces(trace_t *trace, model_t *model, const vec3_t start, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask)
void Collision_Cache_ClipLineToGenericEntitySurfaces(trace_t *trace, model_t *model, matrix4x4_t *matrix, matrix4x4_t *inversematrix, const vec3_t start, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask)
void Collision_ClipPointToWorld(trace_t *trace, model_t *model, const vec3_t start, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask)
void Collision_ClipPointToGenericEntity(trace_t *trace, model_t *model, const frameblend_t *frameblend, const skeleton_t *skeleton, const vec3_t bodymins, const vec3_t bodymaxs, int bodysupercontents, matrix4x4_t *matrix, matrix4x4_t *inversematrix, const vec3_t start, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask)
void Collision_ClipTrace_Box(trace_t *trace, const vec3_t cmins, const vec3_t cmaxs, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, int boxsupercontents, int boxq3surfaceflags, const texture_t *boxtexture)
#define IS_OLDNEXUIZ_DERIVED(g)
void Con_DPrintf(const char *fmt,...)
A Con_Printf that only shows up if the "developer" cvar is set.
void Con_Printf(const char *fmt,...)
Prints to all appropriate console targets.
static int(ZEXPORT *qz_inflate)(z_stream *strm
#define VectorLerp(v1, lerp, v2, out)
#define BoxesOverlap(a, b, c, d)
#define bound(min, num, max)
#define VectorSubtract(a, b, out)
#define VectorCompare(a, b)
#define VectorCopy(in, out)
#define VectorAdd(a, b, out)
void Matrix4x4_Transform(const matrix4x4_t *in, const float v[3], float out[3])
void Matrix4x4_CreateTranslate(matrix4x4_t *out, double x, double y, double z)
void Matrix4x4_Transform3x3(const matrix4x4_t *in, const float v[3], float out[3])
void Matrix4x4_CreateFromQuakeEntity(matrix4x4_t *out, double x, double y, double z, double pitch, double yaw, double roll, double scale)
void Matrix4x4_Invert_Simple(matrix4x4_t *out, const matrix4x4_t *in1)
void Matrix4x4_OriginFromMatrix(const matrix4x4_t *in, float *out)
#define PRVM_clientedictedict(ed, fieldname)
#define PRVM_EDICT_TO_PROG(e)
#define PRVM_NUM_FOR_EDICT(e)
#define PRVM_PROG_TO_EDICT(n)
#define PRVM_clientedictvector(ed, fieldname)
#define PRVM_clientedictfloat(ed, fieldname)
#define RENDER_EXTERIORMODEL
#define MAX_EDICTS
max number of objects in game world at once (32768 protocol limit)
#define MAX_MODELS
max number of models loaded at once (including during level transitions)
#define FL_MONSTER
movement is smoothed on the client side by step based interpolation
#define SOLID_BBOX
touch on edge, block
#define SOLID_SLIDEBOX
touch on edge, but not an onground
#define SOLID_CORPSE
same as SOLID_BBOX, except it behaves as SOLID_NOT against SOLID_SLIDEBOX objects (players/monsters)
#define SOLID_TRIGGER
touch on edge, but not blocking
#define SOLID_BSP
bsp clip, touch on edge, block
int num_brushmodel_entities
unsigned char * entities_active
int * brushmodel_entities
struct model_s * worldmodel
struct model_s * model_precache[MAX_MODELS]
struct model_s * csqc_model_precache[MAX_MODELS]
frameblend_t frameblend[MAX_FRAMEBLENDS]
matrix4x4_t inversematrix
entity_state_t state_current
void(* TraceLine)(struct model_s *model, const struct frameblend_s *frameblend, const struct skeleton_s *skeleton, struct trace_s *trace, const vec3_t start, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask)
qbool free
true if this edict is unused
union prvm_edict_t::@29 priv
struct edict_engineprivate_s * server
FIXME: this server pointer really means world, not server (it is used by both server qc and client qc...
char name[MAX_SCOREBOARDNAME]
int World_EntitiesInBox(world_t *world, const vec3_t requestmins, const vec3_t requestmaxs, int maxlist, prvm_edict_t **list)
void World_LinkEdict(world_t *world, prvm_edict_t *ent, const vec3_t mins, const vec3_t maxs, qbool link_solid_not)