*/
cvar_t sv_debugmove = {CVAR_NOTIFY, "sv_debugmove", "0"};
-cvar_t sv_polygoncollisions = {CVAR_NOTIFY, "sv_polygoncollisions", "0"};
cvar_t sv_areagrid_mingridsize = {CVAR_NOTIFY, "sv_areagrid_mingridsize", "64"};
void SV_AreaStats_f(void);
void SV_World_Init(void)
{
Cvar_RegisterVariable(&sv_debugmove);
- Cvar_RegisterVariable(&sv_polygoncollisions);
Cvar_RegisterVariable(&sv_areagrid_mingridsize);
Cmd_AddCommand("sv_areastats", SV_AreaStats_f);
Collision_Init();
if (model != NULL)
{
Mod_CheckLoaded(model);
- if (model->type != mod_brush)
+ if (!model->brush.TraceBox)
Host_Error("SOLID_BSP with non-BSP model\n");
if (ent->v->angles[0] || ent->v->angles[2] || ent->v->avelocity[0] || ent->v->avelocity[2])
Host_Error("SV_ClipMoveToEntity: invalid modelindex\n");
Mod_CheckLoaded(model);
- if (model->type != mod_brush)
+ if (!model->brush.TraceBox)
{
Con_Printf ("SV_ClipMoveToEntity: SOLID_BSP with a non bsp model, entity dump:\n");
ED_Print (ent);
VectorAdd(starttransformed, mins, starttransformedmins);
VectorAdd(endtransformed, mins, endtransformedmins);
- // FIXME: the PolygonClipTrace should go away (should all be done in model code)
- if (sv_polygoncollisions.integer == 1)
- Collision_PolygonClipTrace(&trace, ent, model, vec3_origin, vec3_origin, ent->v->mins, ent->v->maxs, starttransformed, mins, maxs, endtransformed);
- else if (model && model->brush.TraceBox)
- model->brush.TraceBox(model, &trace, starttransformedmins, starttransformedmaxs, endtransformedmins, endtransformedmaxs);
+ if (model && model->brush.TraceBox)
+ model->brush.TraceBox(model, &trace, starttransformedmins, starttransformedmaxs, endtransformedmins, endtransformedmaxs, SUPERCONTENTS_SOLID);
else
- Collision_ClipTrace_Box(&trace, ent->v->mins, ent->v->maxs, starttransformed, mins, maxs, endtransformed);
+ Collision_ClipTrace_Box(&trace, ent->v->mins, ent->v->maxs, starttransformed, mins, maxs, endtransformed, SUPERCONTENTS_SOLID, SUPERCONTENTS_SOLID);
if (trace.fraction < 1 || trace.startsolid)
trace.ent = ent;
clip->trace.fraction = trace.fraction;
VectorCopy(trace.endpos, clip->trace.endpos);
clip->trace.plane = trace.plane;
- //clip->trace.endcontents = trace.endcontents;
clip->trace.ent = touch;
}
- // FIXME: the handling of endcontents is really broken but works well enough for point checks
- if (trace.endcontents < clip->trace.endcontents || trace.endcontents == CONTENTS_SOLID)
- {
- // lower numbered (lava is lower than water, for example)
- // contents override higher numbered contents, except for
- // CONTENTS_SOLID which overrides everything
- clip->trace.endcontents = trace.endcontents;
- }
+ clip->trace.startsupercontents |= trace.startsupercontents;
if (clip->trace.allsolid)
return;
}
clip.type = type;
clip.passedict = passedict;
- Collision_RoundUpToHullSize(sv.worldmodel, clip.mins, clip.maxs, clip.hullmins, clip.hullmaxs);
+ if (sv.worldmodel && sv.worldmodel->brush.RoundUpToHullSize)
+ sv.worldmodel->brush.RoundUpToHullSize(sv.worldmodel, clip.mins, clip.maxs, clip.hullmins, clip.hullmaxs);
// clip to world
clip.trace = SV_ClipMoveToEntity(sv.edicts, clip.start, clip.hullmins, clip.hullmaxs, clip.end);
+ if (clip.type == MOVE_WORLDONLY)
//if (clip.trace.allsolid)
- // return clip.trace;
+ return clip.trace;
if (clip.type == MOVE_MISSILE)
{
return clip.trace;
}
-int SV_PointContents(const vec3_t point)
+int SV_PointQ1Contents(const vec3_t point)
+{
+#if 1
+ return Mod_Q1BSP_NativeContentsFromSuperContents(NULL, SV_Move(point, vec3_origin, vec3_origin, point, MOVE_NOMONSTERS, NULL).startsupercontents);
+#else
+ if (sv.worldmodel && sv.worldmodel->brush.PointContents)
+ return sv.worldmodel->brush.PointContents(sv.worldmodel, point);
+ return CONTENTS_SOLID;
+#endif
+}
+
+int SV_PointSuperContents(const vec3_t point)
{
#if 1
- return SV_Move(point, vec3_origin, vec3_origin, point, MOVE_NOMONSTERS, NULL).endcontents;
+ return SV_Move(point, vec3_origin, vec3_origin, point, MOVE_NOMONSTERS, NULL).startsupercontents;
#else
if (sv.worldmodel && sv.worldmodel->brush.PointContents)
return sv.worldmodel->brush.PointContents(sv.worldmodel, point);