index d99a2d4..ba362ce 100644 (file)
--- a/mathlib.h
+++ b/mathlib.h
@@ -51,6 +51,8 @@ extern vec3_t vec3_origin;

#define lhrandom(MIN,MAX) ((rand() & 32767) * (((MAX)-(MIN)) * (1.0f / 32767.0f)) + (MIN))

+#define invpow(base,number) (log(number) / log(base))
+
#define DEG2RAD(a) ((a) * ((float) M_PI / 180.0f))
#define RAD2DEG(a) ((a) * (180.0f / (float) M_PI))
#define ANGLEMOD(a) (((int) ((a) * (65536.0f / 360.0f)) & 65535) * (360.0f / 65536.0f))
@@ -90,6 +92,39 @@ extern vec3_t vec3_origin;
}
#define VectorRandom(v) do{(v) = lhrandom(-1, 1);(v) = lhrandom(-1, 1);(v) = lhrandom(-1, 1);}while(DotProduct(v, v) > 1)
#define VectorBlend(b1, b2, blend, c) do{float iblend = 1 - (blend);VectorMAM(iblend, b1, blend, b2, c);}while(0)
+#define BoxesOverlap(a,b,c,d) ((a) <= (d) && (b) >= (c) && (a) <= (d) && (b) >= (c) && (a) <= (d) && (b) >= (c))
+
+// fast PointInfrontOfTriangle
+// subtracts v1 from v0 and v2, combined into a crossproduct, combined with a
+// dotproduct of the light location relative to the first point of the
+// triangle (any point works, since any triangle is obviously flat), and
+// finally a comparison to determine if the light is infront of the triangle
+// (the goal of this statement) we do not need to normalize the surface
+// normal because both sides of the comparison use it, therefore they are
+// both multiplied the same amount...  furthermore the subtract can be done
+// on the vectors, saving a little bit of math in the dotproducts
+#define PointInfrontOfTriangle(p,a,b,c) (((p) - (a)) * (((a) - (b)) * ((c) - (b)) - ((a) - (b)) * ((c) - (b))) + ((p) - (a)) * (((a) - (b)) * ((c) - (b)) - ((a) - (b)) * ((c) - (b))) + ((p) - (a)) * (((a) - (b)) * ((c) - (b)) - ((a) - (b)) * ((c) - (b))) > 0)
+#if 0
+// readable version, kept only for explanatory reasons
+int PointInfrontOfTriangle(const float *p, const float *a, const float *b, const float *c)
+{
+       float dir0, dir1, normal;
+
+       // calculate two mostly perpendicular edge directions
+       VectorSubtract(a, b, dir0);
+       VectorSubtract(c, b, dir1);
+
+       // we have two edge directions, we can calculate a third vector from
+       // them, which is the direction of the surface normal (it's magnitude
+       // is not 1 however)
+       CrossProduct(dir0, dir1, normal);
+
+       // compare distance of light along normal, with distance of any point
+       // of the triangle along the same normal (the triangle is planar,
+       // I.E. flat, so all points give the same answer)
+       return DotProduct(p, normal) > DotProduct(a, normal);
+}
+#endif

/*
// LordHavoc: quaternion math, untested, don't know if these are correct,
@@ -182,9 +217,13 @@ tinydoubleplane_t;

void RotatePointAroundVector(vec3_t dst, const vec3_t dir, const vec3_t point, float degrees);

+float RadiusFromBounds (const vec3_t mins, const vec3_t maxs);
+float RadiusFromBoundsAndOrigin (const vec3_t mins, const vec3_t maxs, const vec3_t origin);
+
// print a matrix to the console
struct matrix4x4_s;
void Matrix4x4_Print(const struct matrix4x4_s *in);
+int Math_atov(const char *s, vec3_t out);

#endif