X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=cl_collision.c;h=ea3c666d63228517b0fa35930e4679c7f05297e4;hb=a26c29e7adac278a87059324e40868823c752680;hp=8f38186079b12b8b94d74a75af540f36ee64e723;hpb=0cc298d3c03cc31166905b782f9f6545f8eee742;p=xonotic%2Fdarkplaces.git diff --git a/cl_collision.c b/cl_collision.c index 8f381860..ea3c666d 100644 --- a/cl_collision.c +++ b/cl_collision.c @@ -35,26 +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; 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]; @@ -64,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) @@ -92,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 @@ -107,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; } @@ -126,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; @@ -141,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) @@ -168,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; } @@ -179,7 +178,7 @@ trace_t CL_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co return cliptrace; } -float CL_SelectTraceLine(const vec3_t start, const vec3_t end, vec3_t impact, vec3_t normal, int *hitent, entity_render_t *ignoreent) +float CL_SelectTraceLine(const vec3_t start, const vec3_t end, vec3_t impact, vec3_t normal, int *hitent, entity_render_t *ignoreent, qboolean csqcents) { float maxfrac, maxrealfrac; int n; @@ -196,11 +195,10 @@ float CL_SelectTraceLine(const vec3_t start, const vec3_t end, vec3_t impact, ve if (hitent) *hitent = 0; 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; @@ -211,12 +209,18 @@ float CL_SelectTraceLine(const vec3_t start, const vec3_t end, vec3_t impact, ve tracemins[2] = min(start[2], end[2]); tracemaxs[2] = max(start[2], end[2]); + if (csqcents) + { + Con_Printf("CL_SelectTraceline: csqc entity collisions in this function are broken and this function will be removed in the future (it is not part of the csqc spec).\n"); + return maxfrac; + } + // 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) @@ -224,17 +228,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) @@ -263,25 +266,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; - */ }