]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - world.c
The "position" field of the "qfile_t" structure was (correctly) used for 2 differents...
[xonotic/darkplaces.git] / world.c
diff --git a/world.c b/world.c
index 8e3d3a4fe4b06a42d548955e32cb361acfbf7e7d..7310d90db1a947dd6451fbb27ac7b2d5e41ce9a6 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();
@@ -55,9 +53,6 @@ typedef struct
        // size when clipping against monsters
        vec3_t mins2, maxs2;
 
-       // size when clipping against brush models
-       vec3_t hullmins, hullmaxs;
-
        // start and end origin of move
        vec3_t start, end;
 
@@ -347,7 +342,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 +467,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);
@@ -486,25 +481,28 @@ trace_t SV_ClipMoveToEntity(edict_t *ent, const vec3_t start, const vec3_t mins,
        Matrix4x4_Invert_Simple(&imatrix, &matrix);
        Matrix4x4_Transform(&imatrix, start, starttransformed);
        Matrix4x4_Transform(&imatrix, end, endtransformed);
-       VectorAdd(starttransformed, maxs, starttransformedmaxs);
-       VectorAdd(endtransformed, maxs, endtransformedmaxs);
-       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)
+       {
+               VectorAdd(starttransformed, maxs, starttransformedmaxs);
+               VectorAdd(endtransformed, maxs, endtransformedmaxs);
+               VectorAdd(starttransformed, mins, starttransformedmins);
+               VectorAdd(endtransformed, mins, endtransformedmins);
+               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;
-       VectorLerp(start, trace.fraction, end, trace.endpos);
-       VectorCopy(trace.plane.normal, tempnormal);
-       Matrix4x4_Transform3x3(&matrix, tempnormal, trace.plane.normal);
-       // FIXME: should recalc trace.plane.dist
+               VectorLerp(start, trace.fraction, end, trace.endpos);
+               VectorCopy(trace.plane.normal, tempnormal);
+               Matrix4x4_Transform3x3(&matrix, tempnormal, trace.plane.normal);
+               // FIXME: should recalc trace.plane.dist
+       }
+       else
+               VectorCopy(end, trace.endpos);
 
        return trace;
 }
@@ -566,7 +564,7 @@ void SV_ClipToNode(moveclip_t *clip, link_t *list)
 
                // might interact, so do an exact clip
                if (touch->v->solid == SOLID_BSP)
-                       trace = SV_ClipMoveToEntity (touch, clip->start, clip->hullmins, clip->hullmaxs, clip->end);
+                       trace = SV_ClipMoveToEntity (touch, clip->start, clip->mins, clip->maxs, clip->end);
                else if ((int)touch->v->flags & FL_MONSTER)
                        trace = SV_ClipMoveToEntity (touch, clip->start, clip->mins2, clip->maxs2, clip->end);
                else
@@ -589,17 +587,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;
        }
@@ -613,7 +603,7 @@ SV_Move
 trace_t SV_Move(const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int type, edict_t *passedict)
 {
        moveclip_t clip;
-       vec3_t bigmins, bigmaxs;
+       vec3_t hullmins, hullmaxs;
        areagrid_t *grid;
        int i, igrid[3], igridmins[3], igridmaxs[3];
 
@@ -623,60 +613,46 @@ trace_t SV_Move(const vec3_t start, const vec3_t mins, const vec3_t maxs, const
        VectorCopy(end, clip.end);
        VectorCopy(mins, clip.mins);
        VectorCopy(maxs, clip.maxs);
+       VectorCopy(mins, clip.mins2);
+       VectorCopy(maxs, clip.maxs2);
        clip.type = type;
        clip.passedict = passedict;
 
-       Collision_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);
+       clip.trace = SV_ClipMoveToEntity(sv.edicts, clip.start, clip.mins, clip.maxs, clip.end);
+       if (clip.type == MOVE_WORLDONLY)
        //if (clip.trace.allsolid)
-       //      return clip.trace;
+               return clip.trace;
 
        if (clip.type == MOVE_MISSILE)
        {
-               // LordHavoc: modified this, was = -15, now = clip.mins[i] - 15
-               for (i=0 ; i<3 ; i++)
+               // LordHavoc: modified this, was = -15, now -= 15
+               for (i = 0;i < 3;i++)
                {
-                       clip.mins2[i] = clip.mins[i] - 15;
-                       clip.maxs2[i] = clip.maxs[i] + 15;
+                       clip.mins2[i] -= 15;
+                       clip.maxs2[i] += 15;
                }
        }
+
+       // get adjusted box for bmodel collisions if the world is q1bsp or hlbsp
+       if (sv.worldmodel && sv.worldmodel->brush.RoundUpToHullSize)
+               sv.worldmodel->brush.RoundUpToHullSize(sv.worldmodel, clip.mins, clip.maxs, hullmins, hullmaxs);
        else
        {
-               VectorCopy (clip.mins, clip.mins2);
-               VectorCopy (clip.maxs, clip.maxs2);
+               VectorCopy(clip.mins, hullmins);
+               VectorCopy(clip.maxs, hullmaxs);
        }
 
-       bigmins[0] = min(clip.mins2[0], clip.hullmins[0]);
-       bigmaxs[0] = max(clip.maxs2[0], clip.hullmaxs[0]);
-       bigmins[1] = min(clip.mins2[1], clip.hullmins[1]);
-       bigmaxs[1] = max(clip.maxs2[1], clip.hullmaxs[1]);
-       bigmins[2] = min(clip.mins2[2], clip.hullmins[2]);
-       bigmaxs[2] = max(clip.maxs2[2], clip.hullmaxs[2]);
-
        // create the bounding box of the entire move
-       if (!sv_debugmove.integer)
+       for (i = 0;i < 3;i++)
        {
-               int i;
-
-               for (i=0 ; i<3 ; i++)
-               {
-                       if (clip.trace.endpos[i] > clip.start[i])
-                       {
-                               clip.boxmins[i] = clip.start[i] + bigmins[i] - 1;
-                               clip.boxmaxs[i] = clip.trace.endpos[i] + bigmaxs[i] + 1;
-                       }
-                       else
-                       {
-                               clip.boxmins[i] = clip.trace.endpos[i] + bigmins[i] - 1;
-                               clip.boxmaxs[i] = clip.start[i] + bigmaxs[i] + 1;
-                       }
-               }
+               clip.boxmins[i] = min(clip.start[i], clip.trace.endpos[i]) + min(hullmins[i], clip.mins2[i]) - 1;
+               clip.boxmaxs[i] = max(clip.start[i], clip.trace.endpos[i]) + max(hullmaxs[i], clip.maxs2[i]) + 1;
        }
-       else
+
+       // debug override to test against everything
+       if (sv_debugmove.integer)
        {
-               // debug to test against everything
                clip.boxmins[0] = clip.boxmins[1] = clip.boxmins[2] = -999999999;
                clip.boxmaxs[0] = clip.boxmaxs[1] = clip.boxmaxs[2] =  999999999;
        }
@@ -708,10 +684,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);