X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=world.c;h=a2cc7e488d1161936ca80dace52313237822e6f0;hb=88f96a36fee75d104250fefb0502bb850438377e;hp=0519bd85e0f6a80961fc7417ee8264e2a18b020a;hpb=855932aeb5707c5efb2858c3e51b913d8203ebbe;p=xonotic%2Fdarkplaces.git diff --git a/world.c b/world.c index 0519bd85..a2cc7e48 100644 --- a/world.c +++ b/world.c @@ -325,7 +325,7 @@ loc0: pr_global_struct->self = EDICT_TO_PROG(touch); pr_global_struct->other = EDICT_TO_PROG(ent); pr_global_struct->time = sv.time; - PR_ExecuteProgram (touch->v.touch); + PR_ExecuteProgram (touch->v.touch, ""); pr_global_struct->self = old_self; pr_global_struct->other = old_other; @@ -378,7 +378,10 @@ loc0: if ( node->contents < 0) { if (ent->num_leafs == MAX_ENT_LEAFS) + { + Con_DPrintf("FindTouchedLeafs overflow\n"); return; + } leaf = (mleaf_t *)node; leafnum = leaf - sv.worldmodel->leafs - 1; @@ -435,21 +438,28 @@ void SV_LinkEdict (edict_t *ent, qboolean touch_triggers) // set the abs box // LordHavoc: enabling rotating bmodels - if (ent->v.solid == SOLID_BSP && (ent->v.angles[0] || ent->v.angles[1] || ent->v.angles[2]) ) + if (ent->v.solid == SOLID_BSP && (ent->v.angles[0] || ent->v.angles[1] || ent->v.angles[2])) { // expand for rotation float max, v; int i; + max = DotProduct(ent->v.mins, ent->v.mins); + v = DotProduct(ent->v.maxs, ent->v.maxs); + if (max < v) + max = v; + max = sqrt(max); + /* max = 0; for (i=0 ; i<3 ; i++) { - v =fabs( ent->v.mins[i]); - if (v > max) + v = fabs(ent->v.mins[i]); + if (max < v) max = v; - v =fabs( ent->v.maxs[i]); - if (v > max) + v = fabs(ent->v.maxs[i]); + if (max < v) max = v; } + */ for (i=0 ; i<3 ; i++) { ent->v.absmin[i] = ent->v.origin[i] - max; @@ -483,7 +493,7 @@ void SV_LinkEdict (edict_t *ent, qboolean touch_triggers) ent->v.absmax[1] += 1; ent->v.absmax[2] += 1; } - + // link to PVS leafs ent->num_leafs = 0; if (ent->v.modelindex) @@ -505,7 +515,7 @@ void SV_LinkEdict (edict_t *ent, qboolean touch_triggers) else break; // crosses the node } - + // link it in if (ent->v.solid == SOLID_TRIGGER) @@ -567,6 +577,7 @@ SV_RecursiveHullCheck ================== */ +/* qboolean SV_RecursiveHullCheck (hull_t *hull, int num, float p1f, float p2f, vec3_t p1, vec3_t p2, trace_t *trace) { dclipnode_t *node; @@ -652,11 +663,12 @@ loc0: return false; } #endif - + if (SV_HullPointContents (hull, node->children[side^1], mid) != CONTENTS_SOLID) // go past the node return SV_RecursiveHullCheck (hull, node->children[side^1], midf, p2f, mid, p2, trace); // mid would need to be duplicated during recursion... +*/ /* { p1f = midf; @@ -665,6 +677,7 @@ loc0: goto loc0; } */ +/* if (trace->allsolid) return false; // never got out of the solid area @@ -679,11 +692,131 @@ loc0: } else { - // LordHavoc: unrolled vector operation because the compiler can't be sure vec3_origin is 0 -// VectorSubtract (vec3_origin, plane->normal, trace->plane.normal); - trace->plane.normal[0] = -plane->normal[0]; - trace->plane.normal[1] = -plane->normal[1]; - trace->plane.normal[2] = -plane->normal[2]; + VectorNegate (plane->normal, trace->plane.normal); + trace->plane.dist = -plane->dist; + } + + while (SV_HullPointContents (hull, hull->firstclipnode, mid) == CONTENTS_SOLID) + { // shouldn't really happen, but does occasionally + frac -= 0.1; + if (frac < 0) + { + trace->fraction = midf; + VectorCopy (mid, trace->endpos); + Con_DPrintf ("backup past 0\n"); + return false; + } + midf = p1f + (p2f - p1f)*frac; + for (i=0 ; i<3 ; i++) + mid[i] = p1[i] + frac*(p2[i] - p1[i]); + } + + trace->fraction = midf; + VectorCopy (mid, trace->endpos); + + return false; +} +*/ + +// LordHavoc: backported from my optimizations to PM_RecursiveHullCheck in QuakeForge newtree (QW) +qboolean SV_RecursiveHullCheck (hull_t *hull, int num, float p1f, float p2f, vec3_t p1, vec3_t p2, trace_t *trace) +{ + dclipnode_t *node; + mplane_t *plane; + float t1, t2; + float frac; + int i; + vec3_t mid; + int side; + float midf; + + // LordHavoc: a goto! everyone flee in terror... :) +loc0: +// check for empty + if (num < 0) + { + if (num != CONTENTS_SOLID) + { + trace->allsolid = false; + if (num == CONTENTS_EMPTY) + trace->inopen = true; + else + trace->inwater = true; + } + else + trace->startsolid = true; + return true; // empty + } + +// find the point distances + node = hull->clipnodes + num; + plane = hull->planes + node->planenum; + + if (plane->type < 3) + { + t1 = p1[plane->type] - plane->dist; + t2 = p2[plane->type] - plane->dist; + } + else + { + t1 = DotProduct (plane->normal, p1) - plane->dist; + t2 = DotProduct (plane->normal, p2) - plane->dist; + } + + // LordHavoc: recursion optimization + if (t1 >= 0 && t2 >= 0) + { + num = node->children[0]; + goto loc0; + } + if (t1 < 0 && t2 < 0) + { + num = node->children[1]; + goto loc0; + } + +// put the crosspoint DIST_EPSILON pixels on the near side + side = (t1 < 0); + if (side) + frac = bound(0, (t1 + DIST_EPSILON) / (t1 - t2), 1); + else + frac = bound(0, (t1 - DIST_EPSILON) / (t1 - t2), 1); + + midf = p1f + (p2f - p1f)*frac; + for (i=0 ; i<3 ; i++) + mid[i] = p1[i] + frac*(p2[i] - p1[i]); + +// move up to the node + if (!SV_RecursiveHullCheck (hull, node->children[side], p1f, midf, p1, mid, trace) ) + return false; + +#ifdef PARANOID + if (SV_HullPointContents (pm_hullmodel, mid, node->children[side]) == CONTENTS_SOLID) + { + Con_Printf ("mid PointInHullSolid\n"); + return false; + } +#endif + + // LordHavoc: warning to the clumsy, this recursion can not be optimized because mid would need to be duplicated on a stack + if (SV_HullPointContents (hull, node->children[side^1], mid) != CONTENTS_SOLID) +// go past the node + return SV_RecursiveHullCheck (hull, node->children[side^1], midf, p2f, mid, p2, trace); + + if (trace->allsolid) + return false; // never got out of the solid area + +//================== +// the other side of the node is solid, this is the impact point +//================== + if (!side) + { + VectorCopy (plane->normal, trace->plane.normal); + trace->plane.dist = plane->dist; + } + else + { + VectorNegate (plane->normal, trace->plane.normal); trace->plane.dist = -plane->dist; } @@ -761,17 +894,9 @@ loc0: if (node->children[side] == CONTENTS_SOLID) return false; return SV_TestLine(hull, node->children[!side], mid, p2); -// num = node->children[!side]; -// VectorCopy(mid, p1); -// goto loc0; } else if (SV_TestLine(hull, node->children[side], p1, mid)) - { return SV_TestLine(hull, node->children[!side], mid, p2); -// num = node->children[!side]; -// VectorCopy(mid, p1); -// goto loc0; - } else return false; } @@ -806,8 +931,7 @@ trace_t SV_ClipMoveToEntity (edict_t *ent, vec3_t start, vec3_t mins, vec3_t max // LordHavoc: enabling rotating bmodels // rotate start and end into the models frame of reference - if (ent->v.solid == SOLID_BSP && - (ent->v.angles[0] || ent->v.angles[1] || ent->v.angles[2]) ) + if (ent->v.solid == SOLID_BSP && (ent->v.angles[0] || ent->v.angles[1] || ent->v.angles[2])) { vec3_t forward, right, up; vec3_t temp; @@ -830,8 +954,7 @@ trace_t SV_ClipMoveToEntity (edict_t *ent, vec3_t start, vec3_t mins, vec3_t max // LordHavoc: enabling rotating bmodels // rotate endpos back to world frame of reference - if (ent->v.solid == SOLID_BSP && - (ent->v.angles[0] || ent->v.angles[1] || ent->v.angles[2]) ) + if (ent->v.solid == SOLID_BSP && (ent->v.angles[0] || ent->v.angles[1] || ent->v.angles[2])) { vec3_t a; vec3_t forward, right, up; @@ -839,7 +962,7 @@ trace_t SV_ClipMoveToEntity (edict_t *ent, vec3_t start, vec3_t mins, vec3_t max if (trace.fraction != 1) { - VectorSubtract (vec3_origin, ent->v.angles, a); + VectorNegate (ent->v.angles, a); AngleVectors (a, forward, right, up); VectorCopy (trace.endpos, temp);