]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_collision.c
changed sbar stats (Monsters/Secrets/Time/map title) around a bit, inspired by a...
[xonotic/darkplaces.git] / cl_collision.c
index 81cc2a38e3f543814b4fd8c6f712a9211a745187..92d5b8dea32d782695c3324cf261ab843d6c91e4 100644 (file)
@@ -35,27 +35,22 @@ trace_t CL_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co
        entity_render_t *ent;
        vec3_t tracemins, tracemaxs;
        trace_t cliptrace, trace;
-       vec3_t starttransformed, endtransformed, starttransformedmins, endtransformedmins, starttransformedmaxs, endtransformedmaxs;
-       vec3_t startmins, startmaxs, endmins, endmaxs, entmins, entmaxs;
+       vec3_t origin;
+       vec3_t starttransformed, endtransformed;
+       vec3_t entmins, entmaxs;
        vec_t *playermins, *playermaxs;
 
-       VectorAdd(start, mins, startmins);
-       VectorAdd(start, maxs, startmaxs);
-       VectorAdd(end, mins, endmins);
-       VectorAdd(end, maxs, endmaxs);
-
        memset (&cliptrace, 0 , sizeof(trace_t));
        cliptrace.fraction = 1;
        cliptrace.realfraction = 1;
 
-       Mod_CheckLoaded(cl.worldmodel);
        if (cl.worldmodel && cl.worldmodel->TraceBox)
-               cl.worldmodel->TraceBox(cl.worldmodel, 0, &cliptrace, startmins, startmaxs, endmins, endmaxs, hitsupercontentsmask);
+               cl.worldmodel->TraceBox(cl.worldmodel, 0, &cliptrace, start, mins, maxs, end, hitsupercontentsmask);
 
        if (hitent)
                *hitent = 0;
 
-       if (hitbmodels && cl_num_brushmodel_entities)
+       if (hitbmodels && cl.num_brushmodel_entities)
        {
                tracemins[0] = min(start[0], end[0]) + mins[0];
                tracemaxs[0] = max(start[0], end[0]) + maxs[0];
@@ -65,25 +60,21 @@ trace_t CL_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co
                tracemaxs[2] = max(start[2], end[2]) + maxs[2];
 
                // look for embedded bmodels
-               for (n = 0;n < cl_num_brushmodel_entities;n++)
+               for (n = 0;n < cl.num_brushmodel_entities;n++)
                {
-                       ent = &cl_entities[cl_brushmodel_entities[n]].render;
+                       ent = &cl.entities[cl.brushmodel_entities[n]].render;
                        if (!BoxesOverlap(tracemins, tracemaxs, ent->mins, ent->maxs))
                                continue;
 
                        Matrix4x4_Transform(&ent->inversematrix, start, starttransformed);
                        Matrix4x4_Transform(&ent->inversematrix, end, endtransformed);
-                       VectorAdd(starttransformed, mins, starttransformedmins);
-                       VectorAdd(starttransformed, maxs, starttransformedmaxs);
-                       VectorAdd(endtransformed, mins, endtransformedmins);
-                       VectorAdd(endtransformed, maxs, endtransformedmaxs);
 
                        memset (&trace, 0 , sizeof(trace_t));
                        trace.fraction = 1;
                        trace.realfraction = 1;
 
                        if (ent->model && ent->model->TraceBox)
-                               ent->model->TraceBox(ent->model, 0, &trace, starttransformedmins, starttransformedmaxs, endtransformedmins, endtransformedmaxs, hitsupercontentsmask);
+                               ent->model->TraceBox(ent->model, 0, &trace, starttransformed, mins, maxs, endtransformed, hitsupercontentsmask);
 
                        // LordHavoc: take the 'best' answers from the new trace and combine with existing data
                        if (trace.allsolid)
@@ -93,7 +84,7 @@ trace_t CL_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co
                                cliptrace.startsolid = true;
                                if (cliptrace.realfraction == 1)
                                        if (hitent)
-                                               *hitent = cl_brushmodel_entities[n];
+                                               *hitent = cl.brushmodel_entities[n];
                        }
                        // don't set this except on the world, because it can easily confuse
                        // monsters underwater if there's a bmodel involved in the trace
@@ -108,8 +99,11 @@ trace_t CL_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co
                                cliptrace.realfraction = trace.realfraction;
                                cliptrace.plane = trace.plane;
                                if (hitent)
-                                       *hitent = cl_brushmodel_entities[n];
+                                       *hitent = cl.brushmodel_entities[n];
                                Matrix4x4_Transform3x3(&ent->matrix, trace.plane.normal, cliptrace.plane.normal);
+                               cliptrace.hitsupercontents = trace.hitsupercontents;
+                               cliptrace.hitq3surfaceflags = trace.hitq3surfaceflags;
+                               cliptrace.hittexture = trace.hittexture;
                        }
                        cliptrace.startsupercontents |= trace.startsupercontents;
                }
@@ -127,12 +121,13 @@ trace_t CL_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co
                {
                        if (n != cl.playerentity)
                        {
-                               ent = &cl_entities[n].render;
+                               ent = &cl.entities[n].render;
                                // FIXME: crouch
-                               playermins = cl_playerstandmins;
-                               playermaxs = cl_playerstandmaxs;
-                               VectorAdd(ent->origin, playermins, entmins);
-                               VectorAdd(ent->origin, playermaxs, entmaxs);
+                               playermins = cl.playerstandmins;
+                               playermaxs = cl.playerstandmaxs;
+                               Matrix4x4_OriginFromMatrix(&ent->matrix, origin);
+                               VectorAdd(origin, playermins, entmins);
+                               VectorAdd(origin, playermaxs, entmaxs);
                                if (!BoxesOverlap(tracemins, tracemaxs, entmins, entmaxs))
                                        continue;
 
@@ -142,7 +137,7 @@ trace_t CL_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co
 
                                Matrix4x4_Transform(&ent->inversematrix, start, starttransformed);
                                Matrix4x4_Transform(&ent->inversematrix, end, endtransformed);
-                               Collision_ClipTrace_Box(&trace, playermins, playermaxs, starttransformed, mins, maxs, endtransformed, hitsupercontentsmask, SUPERCONTENTS_SOLID);
+                               Collision_ClipTrace_Box(&trace, playermins, playermaxs, starttransformed, mins, maxs, endtransformed, hitsupercontentsmask, SUPERCONTENTS_BODY, 0, NULL);
 
                                // LordHavoc: take the 'best' answers from the new trace and combine with existing data
                                if (trace.allsolid)
@@ -169,6 +164,9 @@ trace_t CL_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co
                                        if (hitent)
                                                *hitent = n;
                                        Matrix4x4_Transform3x3(&ent->matrix, trace.plane.normal, cliptrace.plane.normal);
+                                       cliptrace.hitsupercontents = trace.hitsupercontents;
+                                       cliptrace.hitq3surfaceflags = trace.hitq3surfaceflags;
+                                       cliptrace.hittexture = trace.hittexture;
                                }
                                cliptrace.startsupercontents |= trace.startsupercontents;
                        }
@@ -196,13 +194,11 @@ float CL_SelectTraceLine(const vec3_t start, const vec3_t end, vec3_t impact, ve
 
        if (hitent)
                *hitent = 0;
-       Mod_CheckLoaded(cl.worldmodel);
        if (cl.worldmodel && cl.worldmodel->TraceBox)
-               cl.worldmodel->TraceBox(cl.worldmodel, 0, &trace, start, start, end, end, SUPERCONTENTS_SOLID);
+               cl.worldmodel->TraceBox(cl.worldmodel, 0, &trace, start, vec3_origin, vec3_origin, end, SUPERCONTENTS_SOLID);
 
        if (normal)
                VectorCopy(trace.plane.normal, normal);
-       //cl_traceline_startsupercontents = trace.startsupercontents;
        maxfrac = trace.fraction;
        maxrealfrac = trace.realfraction;
 
@@ -214,11 +210,11 @@ float CL_SelectTraceLine(const vec3_t start, const vec3_t end, vec3_t impact, ve
        tracemaxs[2] = max(start[2], end[2]);
 
        // look for embedded bmodels
-       for (n = 0;n < cl_num_entities;n++)
+       for (n = 0;n < cl.num_entities;n++)
        {
-               if (!cl_entities_active[n])
+               if (!cl.entities_active[n])
                        continue;
-               ent = &cl_entities[n].render;
+               ent = &cl.entities[n].render;
                if (!BoxesOverlap(ent->mins, ent->maxs, tracemins, tracemaxs))
                        continue;
                if (!ent->model || !ent->model->TraceBox)
@@ -226,17 +222,16 @@ float CL_SelectTraceLine(const vec3_t start, const vec3_t end, vec3_t impact, ve
                if ((ent->flags & RENDER_EXTERIORMODEL) && !chase_active.integer)
                        continue;
                // if transparent and not selectable, skip entity
-               if (!(cl_entities[n].state_current.effects & EF_SELECTABLE) && (ent->alpha < 1 || (ent->effects & (EF_ADDITIVE | EF_NODEPTHTEST))))
+               if (!(cl.entities[n].state_current.effects & EF_SELECTABLE) && (ent->alpha < 1 || (ent->effects & (EF_ADDITIVE | EF_NODEPTHTEST))))
                        continue;
                if (ent == ignoreent)
                        continue;
                Matrix4x4_Transform(&ent->inversematrix, start, starttransformed);
                Matrix4x4_Transform(&ent->inversematrix, end, endtransformed);
 
-               if (ent->model && ent->model->TraceBox)
-                       ent->model->TraceBox(ent->model, ent->frameblend[0].frame, &trace, starttransformed, starttransformed, endtransformed, endtransformed, SUPERCONTENTS_SOLID);
+               //if (ent->model && ent->model->TraceBox)
+                       ent->model->TraceBox(ent->model, ent->frameblend[0].frame, &trace, starttransformed, vec3_origin, vec3_origin, endtransformed, SUPERCONTENTS_SOLID);
 
-               //cl_traceline_startsupercontents |= trace.startsupercontents;
                if (maxrealfrac > trace.realfraction)
                {
                        if (hitent)
@@ -265,25 +260,8 @@ void CL_FindNonSolidLocation(const vec3_t in, vec3_t out, vec_t radius)
                cl.worldmodel->brush.FindNonSolidLocation(cl.worldmodel, in, out, radius);
 }
 
-int CL_PointQ1Contents(const vec3_t p)
-{
-       return Mod_Q1BSP_NativeContentsFromSuperContents(NULL, CL_TraceBox(p, vec3_origin, vec3_origin, p, true, NULL, 0, false).startsupercontents);
-       /*
-       // FIXME: check multiple brush models
-       if (cl.worldmodel && cl.worldmodel->brush.PointContentsQ1)
-               return cl.worldmodel->brush.PointContentsQ1(cl.worldmodel, p);
-       return 0;
-       */
-}
-
 int CL_PointSuperContents(const vec3_t p)
 {
        return CL_TraceBox(p, vec3_origin, vec3_origin, p, true, NULL, 0, false).startsupercontents;
-       /*
-       // FIXME: check multiple brush models
-       if (cl.worldmodel && cl.worldmodel->brush.PointContentsQ1)
-               return cl.worldmodel->brush.PointContentsQ1(cl.worldmodel, p);
-       return 0;
-       */
 }