X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=cl_collision.c;h=3ade5bcf15d54dce4f11fe733af0ed9e0e87aefd;hb=9d92b5ea2e94eb7772405186dd70b2dbbdfc96bb;hp=ce613001f3e9f066bdc680a70aca4c402eeff878;hpb=0db6270f9fdf1da680391fe0389d7ad6cfc48517;p=xonotic%2Fdarkplaces.git diff --git a/cl_collision.c b/cl_collision.c index ce613001..3ade5bcf 100644 --- a/cl_collision.c +++ b/cl_collision.c @@ -33,7 +33,7 @@ int cl_traceline_startsupercontents; float CL_TraceLine(const vec3_t start, const vec3_t end, vec3_t impact, vec3_t normal, int hitbmodels, entity_render_t **hitent, int hitsupercontentsmask) { - float maxfrac; + float maxfrac, maxrealfrac; int n; entity_render_t *ent; float tracemins[3], tracemaxs[3]; @@ -41,18 +41,22 @@ float CL_TraceLine(const vec3_t start, const vec3_t end, vec3_t impact, vec3_t n matrix4x4_t matrix, imatrix; float tempnormal[3], starttransformed[3], endtransformed[3]; + memset (&trace, 0 , sizeof(trace_t)); + trace.fraction = 1; + trace.realfraction = 1; + VectorCopy (end, trace.endpos); + if (hitent) *hitent = &cl_entities[0].render; Mod_CheckLoaded(cl.worldmodel); - if (cl.worldmodel && cl.worldmodel->brush.TraceBox) - cl.worldmodel->brush.TraceBox(cl.worldmodel, &trace, start, start, end, end, hitsupercontentsmask); + if (cl.worldmodel && cl.worldmodel->TraceBox) + cl.worldmodel->TraceBox(cl.worldmodel, 0, &trace, start, start, end, end, hitsupercontentsmask); - if (impact) - VectorLerp(start, trace.fraction, end, impact); if (normal) VectorCopy(trace.plane.normal, normal); cl_traceline_startsupercontents = trace.startsupercontents; maxfrac = trace.fraction; + maxrealfrac = trace.realfraction; if (hitbmodels && cl_num_brushmodel_entities) { @@ -77,17 +81,16 @@ float CL_TraceLine(const vec3_t start, const vec3_t end, vec3_t impact, vec3_t n Matrix4x4_Transform(&imatrix, start, starttransformed); Matrix4x4_Transform(&imatrix, end, endtransformed); - if (ent->model && ent->model->brush.TraceBox) - ent->model->brush.TraceBox(ent->model, &trace, starttransformed, starttransformed, endtransformed, endtransformed, hitsupercontentsmask); + if (ent->model && ent->model->TraceBox) + ent->model->TraceBox(ent->model, 0, &trace, starttransformed, starttransformed, endtransformed, endtransformed, hitsupercontentsmask); cl_traceline_startsupercontents |= trace.startsupercontents; - if (maxfrac > trace.fraction) + if (maxrealfrac > trace.realfraction) { if (hitent) *hitent = ent; maxfrac = trace.fraction; - if (impact) - VectorLerp(start, trace.fraction, end, impact); + maxrealfrac = trace.realfraction; if (normal) { VectorCopy(trace.plane.normal, tempnormal); @@ -96,7 +99,9 @@ float CL_TraceLine(const vec3_t start, const vec3_t end, vec3_t impact, vec3_t n } } } - if (maxfrac < 0 || maxfrac > 1) Con_Printf("fraction out of bounds %f %s:%d\n", maxfrac, __LINE__, __FILE__); + if (maxfrac < 0 || maxfrac > 1) Con_Printf("fraction out of bounds %f %s:%d\n", maxfrac, __FILE__, __LINE__); + if (impact) + VectorLerp(start, maxfrac, end, impact); return maxfrac; }