]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - world.c
more q3bsp work (and no it still doesn't work right)
[xonotic/darkplaces.git] / world.c
diff --git a/world.c b/world.c
index 8e3d3a4fe4b06a42d548955e32cb361acfbf7e7d..3856598764747f08fe78f00bb97cc8cc17ce34e6 100644 (file)
--- a/world.c
+++ b/world.c
@@ -30,7 +30,6 @@ line of sight checks trace->inopen and trace->inwater, but bullets don't
 */
 
 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);
@@ -38,7 +37,6 @@ 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();
@@ -347,7 +345,7 @@ void SV_LinkEdict (edict_t *ent, qboolean touch_triggers)
                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])
@@ -472,7 +470,7 @@ trace_t SV_ClipMoveToEntity(edict_t *ent, const vec3_t start, const vec3_t mins,
                        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);
@@ -491,13 +489,10 @@ trace_t SV_ClipMoveToEntity(edict_t *ent, const vec3_t start, const vec3_t mins,
        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;
@@ -589,17 +584,9 @@ void SV_ClipToNode(moveclip_t *clip, link_t *list)
                        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;
        }
@@ -626,12 +613,14 @@ trace_t SV_Move(const vec3_t start, const vec3_t mins, const vec3_t maxs, const
        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)
        {
@@ -708,10 +697,21 @@ trace_t SV_Move(const vec3_t start, const vec3_t mins, const vec3_t maxs, const
        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);