index 002c3f1..ba362ce 100644 (file)
--- a/mathlib.h
+++ b/mathlib.h
@@ -94,6 +94,38 @@ extern vec3_t vec3_origin;
#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))

#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,
// need to add conversion to/from matrices
/*
// LordHavoc: quaternion math, untested, don't know if these are correct,
// need to add conversion to/from matrices
@@ -191,6 +223,7 @@ float RadiusFromBoundsAndOrigin (const vec3_t mins, const vec3_t maxs, const vec
// print a matrix to the console
struct matrix4x4_s;
void Matrix4x4_Print(const struct matrix4x4_s *in);
// 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

#endif