📄 be_aas_reach.c
字号:
} //end if
// if no maximum fall height set or less than the max
if (!aassettings.rs_maxfallheight || fabs(ground_bestdist) < aassettings.rs_maxfallheight) {
//trace a bounding box vertically to check for solids
VectorMA(ground_bestend, INSIDEUNITS, ground_bestnormal, ground_bestend);
VectorCopy(ground_bestend, start);
start[2] = ground_beststart[2];
VectorCopy(ground_bestend, end);
end[2] += 4;
trace = AAS_TraceClientBBox(start, end, PRESENCE_NORMAL, -1);
//if no solids were found
if (!trace.startsolid && trace.fraction >= 1.0)
{
//the trace end point must be in the goal area
trace.endpos[2] += 1;
if (AAS_PointAreaNum(trace.endpos) == area2num)
{
//if not going through a cluster portal
numareas = AAS_TraceAreas(start, end, areas, NULL, sizeof(areas) / sizeof(int));
for (i = 0; i < numareas; i++)
if (AAS_AreaClusterPortal(areas[i]))
break;
if (i >= numareas)
{
//create a walk off ledge reachability from area1 to area2
lreach = AAS_AllocReachability();
if (!lreach) return qfalse;
lreach->areanum = area2num;
lreach->facenum = 0;
lreach->edgenum = ground_bestarea2groundedgenum;
VectorCopy(ground_beststart, lreach->start);
VectorCopy(ground_bestend, lreach->end);
lreach->traveltype = TRAVEL_WALKOFFLEDGE;
lreach->traveltime = aassettings.rs_startwalkoffledge + fabs(ground_bestdist) * 50 / aassettings.phys_gravity;
//if falling from too high and not falling into water
if (!AAS_AreaSwim(area2num) && !AAS_AreaJumpPad(area2num))
{
if (AAS_FallDelta(ground_bestdist) > aassettings.phys_falldelta5)
{
lreach->traveltime += aassettings.rs_falldamage5;
} //end if
if (AAS_FallDelta(ground_bestdist) > aassettings.phys_falldelta10)
{
lreach->traveltime += aassettings.rs_falldamage10;
} //end if
} //end if
lreach->next = areareachability[area1num];
areareachability[area1num] = lreach;
//
reach_walkoffledge++;
//NOTE: don't create a weapon (rl, bfg) jump reachability here
//because it interferes with other reachabilities
//like the ladder reachability
return qtrue;
} //end if
} //end if
} //end if
} //end if
} //end else
} //end if
return qfalse;
} //end of the function AAS_Reachability_Step_Barrier_WaterJump_WalkOffLedge
//===========================================================================
// returns the distance between the two vectors
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
float VectorDistance(vec3_t v1, vec3_t v2)
{
vec3_t dir;
VectorSubtract(v2, v1, dir);
return VectorLength(dir);
} //end of the function VectorDistance
//===========================================================================
// returns true if the first vector is between the last two vectors
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
int VectorBetweenVectors(vec3_t v, vec3_t v1, vec3_t v2)
{
vec3_t dir1, dir2;
VectorSubtract(v, v1, dir1);
VectorSubtract(v, v2, dir2);
return (DotProduct(dir1, dir2) <= 0);
} //end of the function VectorBetweenVectors
//===========================================================================
// returns the mid point between the two vectors
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
void VectorMiddle(vec3_t v1, vec3_t v2, vec3_t middle)
{
VectorAdd(v1, v2, middle);
VectorScale(middle, 0.5, middle);
} //end of the function VectorMiddle
//===========================================================================
// calculate a range of points closest to each other on both edges
//
// Parameter: beststart1 start of the range of points on edge v1-v2
// beststart2 end of the range of points on edge v1-v2
// bestend1 start of the range of points on edge v3-v4
// bestend2 end of the range of points on edge v3-v4
// bestdist best distance so far
// Returns: -
// Changes Globals: -
//===========================================================================
/*
float AAS_ClosestEdgePoints(vec3_t v1, vec3_t v2, vec3_t v3, vec3_t v4,
aas_plane_t *plane1, aas_plane_t *plane2,
vec3_t beststart, vec3_t bestend, float bestdist)
{
vec3_t dir1, dir2, p1, p2, p3, p4;
float a1, a2, b1, b2, dist;
int founddist;
//edge vectors
VectorSubtract(v2, v1, dir1);
VectorSubtract(v4, v3, dir2);
//get the horizontal directions
dir1[2] = 0;
dir2[2] = 0;
//
// p1 = point on an edge vector of area2 closest to v1
// p2 = point on an edge vector of area2 closest to v2
// p3 = point on an edge vector of area1 closest to v3
// p4 = point on an edge vector of area1 closest to v4
//
if (dir2[0])
{
a2 = dir2[1] / dir2[0];
b2 = v3[1] - a2 * v3[0];
//point on the edge vector of area2 closest to v1
p1[0] = (DotProduct(v1, dir2) - (a2 * dir2[0] + b2 * dir2[1])) / dir2[0];
p1[1] = a2 * p1[0] + b2;
//point on the edge vector of area2 closest to v2
p2[0] = (DotProduct(v2, dir2) - (a2 * dir2[0] + b2 * dir2[1])) / dir2[0];
p2[1] = a2 * p2[0] + b2;
} //end if
else
{
//point on the edge vector of area2 closest to v1
p1[0] = v3[0];
p1[1] = v1[1];
//point on the edge vector of area2 closest to v2
p2[0] = v3[0];
p2[1] = v2[1];
} //end else
//
if (dir1[0])
{
//
a1 = dir1[1] / dir1[0];
b1 = v1[1] - a1 * v1[0];
//point on the edge vector of area1 closest to v3
p3[0] = (DotProduct(v3, dir1) - (a1 * dir1[0] + b1 * dir1[1])) / dir1[0];
p3[1] = a1 * p3[0] + b1;
//point on the edge vector of area1 closest to v4
p4[0] = (DotProduct(v4, dir1) - (a1 * dir1[0] + b1 * dir1[1])) / dir1[0];
p4[1] = a1 * p4[0] + b1;
} //end if
else
{
//point on the edge vector of area1 closest to v3
p3[0] = v1[0];
p3[1] = v3[1];
//point on the edge vector of area1 closest to v4
p4[0] = v1[0];
p4[1] = v4[1];
} //end else
//start with zero z-coordinates
p1[2] = 0;
p2[2] = 0;
p3[2] = 0;
p4[2] = 0;
//calculate the z-coordinates from the ground planes
p1[2] = (plane2->dist - DotProduct(plane2->normal, p1)) / plane2->normal[2];
p2[2] = (plane2->dist - DotProduct(plane2->normal, p2)) / plane2->normal[2];
p3[2] = (plane1->dist - DotProduct(plane1->normal, p3)) / plane1->normal[2];
p4[2] = (plane1->dist - DotProduct(plane1->normal, p4)) / plane1->normal[2];
//
founddist = qfalse;
//
if (VectorBetweenVectors(p1, v3, v4))
{
dist = VectorDistance(v1, p1);
if (dist > bestdist - 0.5 && dist < bestdist + 0.5)
{
VectorMiddle(beststart, v1, beststart);
VectorMiddle(bestend, p1, bestend);
} //end if
else if (dist < bestdist)
{
bestdist = dist;
VectorCopy(v1, beststart);
VectorCopy(p1, bestend);
} //end if
founddist = qtrue;
} //end if
if (VectorBetweenVectors(p2, v3, v4))
{
dist = VectorDistance(v2, p2);
if (dist > bestdist - 0.5 && dist < bestdist + 0.5)
{
VectorMiddle(beststart, v2, beststart);
VectorMiddle(bestend, p2, bestend);
} //end if
else if (dist < bestdist)
{
bestdist = dist;
VectorCopy(v2, beststart);
VectorCopy(p2, bestend);
} //end if
founddist = qtrue;
} //end else if
if (VectorBetweenVectors(p3, v1, v2))
{
dist = VectorDistance(v3, p3);
if (dist > bestdist - 0.5 && dist < bestdist + 0.5)
{
VectorMiddle(beststart, p3, beststart);
VectorMiddle(bestend, v3, bestend);
} //end if
else if (dist < bestdist)
{
bestdist = dist;
VectorCopy(p3, beststart);
VectorCopy(v3, bestend);
} //end if
founddist = qtrue;
} //end else if
if (VectorBetweenVectors(p4, v1, v2))
{
dist = VectorDistance(v4, p4);
if (dist > bestdist - 0.5 && dist < bestdist + 0.5)
{
VectorMiddle(beststart, p4, beststart);
VectorMiddle(bestend, v4, bestend);
} //end if
else if (dist < bestdist)
{
bestdist = dist;
VectorCopy(p4, beststart);
VectorCopy(v4, bestend);
} //end if
founddist = qtrue;
} //end else if
//if no shortest distance was found the shortest distance
//is between one of the vertexes of edge1 and one of edge2
if (!founddist)
{
dist = VectorDistance(v1, v3);
if (dist < bestdist)
{
bestdist = dist;
VectorCopy(v1, beststart);
VectorCopy(v3, bestend);
} //end if
dist = VectorDistance(v1, v4);
if (dist < bestdist)
{
bestdist = dist;
VectorCopy(v1, beststart);
VectorCopy(v4, bestend);
} //end if
dist = VectorDistance(v2, v3);
if (dist < bestdist)
{
bestdist = dist;
VectorCopy(v2, beststart);
VectorCopy(v3, bestend);
} //end if
dist = VectorDistance(v2, v4);
if (dist < bestdist)
{
bestdist = dist;
VectorCopy(v2, beststart);
VectorCopy(v4, bestend);
} //end if
} //end if
return bestdist;
} //end of the function AAS_ClosestEdgePoints*/
float AAS_ClosestEdgePoints(vec3_t v1, vec3_t v2, vec3_t v3, vec3_t v4,
aas_plane_t *plane1, aas_plane_t *plane2,
vec3_t beststart1, vec3_t bestend1,
vec3_t beststart2, vec3_t bestend2, float bestdist)
{
vec3_t dir1, dir2, p1, p2, p3, p4;
float a1, a2, b1, b2, dist, dist1, dist2;
int founddist;
//edge vectors
VectorSubtract(v2, v1, dir1);
VectorSubtract(v4, v3, dir2);
//get the horizontal directions
dir1[2] = 0;
dir2[2] = 0;
//
// p1 = point on an edge vector of area2 closest to v1
// p2 = point on an edge vector of area2 closest to v2
// p3 = point on an edge vector of area1 closest to v3
// p4 = point on an edge vector of area1 closest to v4
//
if (dir2[0])
{
a2 = dir2[1] / dir2[0];
b2 = v3[1] - a2 * v3[0];
//point on the edge vector of area2 closest to v1
p1[0] = (DotProduct(v1, dir2) - (a2 * dir2[0] + b2 * dir2[1])) / dir2[0];
p1[1] = a2 * p1[0] + b2;
//point on the edge vector of area2 closest to v2
p2[0] = (DotProduct(v2, dir2) - (a2 * dir2[0] + b2 * dir2[1])) / dir2[0];
p2[1] = a2 * p2[0] + b2;
} //end if
else
{
//point on the edge vector of area2 closest to v1
p1[0] = v3[0];
p1[1] = v1[1];
//point on the edge vector of area2 closest to v2
p2[0] = v3[0];
p2[1] = v2[1];
} //end else
//
if (dir1[0])
{
//
a1 = dir1[1] / dir1[0];
b1 = v1[1] - a1 * v1[0];
//point on the edge vector of area1 closest to v3
p3[0] = (DotProduct(v3, dir1) - (a1 * dir1[0] + b1 * dir1[1])) / dir1[0];
p3[1] = a1 * p3[0] + b1;
//point on the edge vector of area1 closest to v4
p4[0] = (DotProduct(v4, dir1) - (a1 * dir1[0] + b1 * dir1[1])) / dir1[0];
p4[1] = a1 * p4[0] + b1;
} //end if
else
{
//point on the edge vector of area1 closest to v3
p3[0] = v1[0];
p3[1] = v3[1];
//point on the edge vector of area1 closest to v4
p4[0] = v1[0];
p4[1] = v4[1];
} //end else
//start with zero z-coordinates
p1[2] = 0;
p2[2] = 0;
p3[2] = 0;
p4[2] = 0;
//calculate the z-coordinates from the ground planes
p1[2] = (plane2->dist - DotProduct(plane2->normal, p1)) / plane2->normal[2];
p2[2] = (plane2->dist - DotProduct(plane2->normal, p2)) / plane2->normal[2];
p3[2] = (plane1->dist - DotProduct(plane1->normal, p3)) / plane1->normal[2];
p4[2] = (plane1->dist - DotProduct(plane1->normal, p4)) / plane1->normal[2];
//
founddist = qfalse;
//
if (VectorBetweenVectors(p1, v3, v4))
{
dist = VectorDistance(v1, p1);
if (dist > bestdist - 0.5 && dist < bestdist + 0.5)
{
dist1 = VectorDistance(beststart1, v1);
dist2 = VectorDistance(beststart2, v1);
if (dist1 > dist2)
{
if (dist1 > VectorDistance(beststart1, beststart2)) VectorCopy(v1, beststart2);
} //end if
else
{
if (dist2 > VectorDistance(beststart1, beststart2)) VectorCopy(v1, beststart1);
} //end else
dist1 = VectorDistance(bestend1, p1);
dist2 = VectorDistance(bestend2, p1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -