27var vector g_vectorCacheLast;
28var vector g_vectorCacheForward;
29var vector g_vectorCacheRight;
30var vector g_vectorCacheUp;
32void AngleVectors ( vector angles )
35 float sr, sp, sy, cr, cp, cy;
37 angle = angles[1] * (M_PI*2 / 360);
40 angle = angles[0] * (M_PI*2 / 360);
43 angle = angles[2] * (M_PI*2 / 360);
51 v_right[0] = (-1*sr*sp*cy+-1*cr*-sy);
52 v_right[1] = (-1*sr*sp*sy+-1*cr*cy);
53 v_right[2] = -1*sr*cp;
55 v_up[0] = (cr*sp*cy+-sr*-sy);
56 v_up[1] = (cr*sp*sy+-sr*cy);
61anglesMake(vector targetAngle)
63 AngleVectors(targetAngle);
64 g_vectorCacheLast = targetAngle;
65 g_vectorCacheForward = v_forward;
66 g_vectorCacheRight = v_right;
67 g_vectorCacheUp = v_up;
76anglesToForward(vector targetAngle)
78 if (targetAngle != g_vectorCacheLast) {
79 anglesMake(targetAngle);
82 return (g_vectorCacheForward);
91anglesToRight(vector targetAngle)
93 if (targetAngle != g_vectorCacheLast) {
94 anglesMake(targetAngle);
97 return (g_vectorCacheRight);
106anglesToUp(vector targetAngle)
108 if (targetAngle != g_vectorCacheLast) {
109 anglesMake(targetAngle);
112 return (g_vectorCacheUp);
121distanceSquared(vector pointA, vector pointB)
123 float diffX = pointA[0] - pointB[0];
124 float diffY = pointA[1] - pointB[1];
125 float diffZ = pointA[2] - pointB[2];
126 return (diffX * diffX) + (diffY * diffY) + (diffZ * diffZ);
135distance(vector pointA, vector pointB)
137 return sqrt(distanceSquared(pointA, pointB));
146distance2D(vector pointA, vector pointB)
148 float diffX = pointA[0] - pointB[0];
149 float diffY = pointA[1] - pointB[1];
150 return sqrt((diffX * diffX) + (diffY * diffY));
160closer(vector referencePoint, vector pointA, vector pointB)
162 float distanceA = distanceSquared(referencePoint, pointA);
163 float distanceB = distanceSquared(referencePoint, pointA);
164 return (distanceA < distanceB) ? true :
false;
172combineAngles(vector angleA, vector angleB)
175 rotatevectorsbyangle(angleB);
176 return vectoangles(v_forward, v_up);
184length(vector toCalculate)
186 static vector lastInput = g_vec_null;
187 static float lastOutput = 0.0f;
189 if (toCalculate == lastInput) {
193 lastInput = toCalculate;
194 lastOutput = vlen(toCalculate);
203lengthSquared(vector target)
205 return (target[0] * target[0]) + (target[1] * target[1]) + (target[2] * target[2]);
214vectorDot(vector vectorA, vector vectorB)
216 return dotproduct(vectorA, vectorB);
226vectorLerp(vector fromVector, vector toVector,
float lerpFraction)
228 static float vectorLerp_Lerp(
float fA,
float fB,
float fPercent) {
229 return (fA * (1 - fPercent)) + (fB * fPercent);
232 vector outputVector = g_vec_null;
233 outputVector[0] = vectorLerp_Lerp(fromVector[0], toVector[0], lerpFraction);
234 outputVector[1] = vectorLerp_Lerp(fromVector[1], toVector[1], lerpFraction);
235 outputVector[2] = vectorLerp_Lerp(fromVector[2], toVector[2], lerpFraction);
244vectorNormalize(vector toNormalize)
246 static vector lastInput = g_vec_null;
247 static vector lastOutput = g_vec_null;
249 if (toNormalize == lastInput) {
253 lastInput = toNormalize;
254 lastOutput = normalize(toNormalize);
263vectorToAngles(vector toAngles)
265 static vector lastInput = g_vec_null;
266 static vector lastOutput = g_vec_null;
268 if (toAngles == lastInput) {
272 lastInput = toAngles;
273 lastOutput = fixAngle(vectoangles(toAngles));
283vectorToAnglesRoll(vector forwardDir, vector rollDir)
285 static vector lastInput = g_vec_null;
286 static vector lastInput2 = g_vec_null;
287 static vector lastOutput = g_vec_null;
289 if (forwardDir == lastInput && rollDir == lastInput2) {
293 lastInput = forwardDir;
294 lastInput2 = rollDir;
295 lastOutput = fixAngle(vectoangles(forwardDir, rollDir));
306lerpAngleVector(vector inputAngle, vector endAngle,
float lerpAmount)
308 vector currentDir = anglesToForward(inputAngle);
309 vector desiredDir = anglesToForward(endAngle);
310 return vectorToAngles(vectorLerp(currentDir, desiredDir, lerpAmount));
319dirFromTarget(vector lookingEnt, vector targetEnt)
321 return anglesToForward(vectorToAngles(targetEnt - lookingEnt));