]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - mathlib.c
use dynamic eye position-centered bouncegrid when rendering in dynamic
[xonotic/darkplaces.git] / mathlib.c
index cdbe036466888fe9746ffbe5c5c311a485de6f62..d6170d28977c27645f71b9987887854670d34916 100644 (file)
--- a/mathlib.c
+++ b/mathlib.c
@@ -19,9 +19,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
 // mathlib.c -- math primitives
 
 */
 // mathlib.c -- math primitives
 
-#include <math.h>
 #include "quakedef.h"
 
 #include "quakedef.h"
 
+#include <math.h>
+
 vec3_t vec3_origin = {0,0,0};
 float ixtable[4096];
 
 vec3_t vec3_origin = {0,0,0};
 float ixtable[4096];
 
@@ -113,7 +114,7 @@ float m_bytenormals[NUMVERTEXNORMALS][3] =
 };
 
 #if 0
 };
 
 #if 0
-qbyte NormalToByte(const vec3_t n)
+unsigned char NormalToByte(const vec3_t n)
 {
        int i, best;
        float bestdistance, distance;
 {
        int i, best;
        float bestdistance, distance;
@@ -133,7 +134,7 @@ qbyte NormalToByte(const vec3_t n)
 }
 
 // note: uses byte partly to force unsigned for the validity check
 }
 
 // note: uses byte partly to force unsigned for the validity check
-void ByteToNormal(qbyte num, vec3_t n)
+void ByteToNormal(unsigned char num, vec3_t n)
 {
        if (num < NUMVERTEXNORMALS)
                VectorCopy(m_bytenormals[num], n);
 {
        if (num < NUMVERTEXNORMALS)
                VectorCopy(m_bytenormals[num], n);
@@ -254,6 +255,24 @@ void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point,
               + (t0 * vr[2] + t1 * vu[2] + vf[2] * vf[2]) * point[2];
 }
 
               + (t0 * vr[2] + t1 * vu[2] + vf[2] * vf[2]) * point[2];
 }
 
+/*-----------------------------------------------------------------*/
+
+// returns the smallest integer greater than or equal to "value", or 0 if "value" is too big
+unsigned int CeilPowerOf2(unsigned int value)
+{
+       unsigned int ceilvalue;
+
+       if (value > (1U << (sizeof(int) * 8 - 1)))
+               return 0;
+
+       ceilvalue = 1;
+       while (ceilvalue < value)
+               ceilvalue <<= 1;
+
+       return ceilvalue;
+}
+
+
 /*-----------------------------------------------------------------*/
 
 
 /*-----------------------------------------------------------------*/
 
 
@@ -296,6 +315,7 @@ int BoxOnPlaneSide(const vec3_t emins, const vec3_t emaxs, const mplane_t *p)
        }
 }
 
        }
 }
 
+#if 0
 int BoxOnPlaneSide_Separate(const vec3_t emins, const vec3_t emaxs, const vec3_t normal, const vec_t dist)
 {
        switch((normal[0] < 0) | ((normal[1] < 0) << 1) | ((normal[2] < 0) << 2))
 int BoxOnPlaneSide_Separate(const vec3_t emins, const vec3_t emaxs, const vec3_t normal, const vec_t dist)
 {
        switch((normal[0] < 0) | ((normal[1] < 0) << 1) | ((normal[2] < 0) << 2))
@@ -311,6 +331,7 @@ int BoxOnPlaneSide_Separate(const vec3_t emins, const vec3_t emaxs, const vec3_t
        case 7: return (((normal[0] * emins[0] + normal[1] * emins[1] + normal[2] * emins[2]) >= dist) | (((normal[0] * emaxs[0] + normal[1] * emaxs[1] + normal[2] * emaxs[2]) < dist) << 1));
        }
 }
        case 7: return (((normal[0] * emins[0] + normal[1] * emins[1] + normal[2] * emins[2]) >= dist) | (((normal[0] * emaxs[0] + normal[1] * emaxs[1] + normal[2] * emaxs[2]) < dist) << 1));
        }
 }
+#endif
 
 void BoxPlaneCorners(const vec3_t emins, const vec3_t emaxs, const mplane_t *p, vec3_t outnear, vec3_t outfar)
 {
 
 void BoxPlaneCorners(const vec3_t emins, const vec3_t emaxs, const mplane_t *p, vec3_t outnear, vec3_t outfar)
 {
@@ -497,6 +518,82 @@ void AngleVectorsFLU (const vec3_t angles, vec3_t forward, vec3_t left, vec3_t u
        }
 }
 
        }
 }
 
+// LordHavoc: calculates pitch/yaw/roll angles from forward and up vectors
+void AnglesFromVectors (vec3_t angles, const vec3_t forward, const vec3_t up, qboolean flippitch)
+{
+       if (forward[0] == 0 && forward[1] == 0)
+       {
+               if(forward[2] > 0)
+               {
+                       angles[PITCH] = -M_PI * 0.5;
+                       angles[YAW] = up ? atan2(-up[1], -up[0]) : 0;
+               }
+               else
+               {
+                       angles[PITCH] = M_PI * 0.5;
+                       angles[YAW] = up ? atan2(up[1], up[0]) : 0;
+               }
+               angles[ROLL] = 0;
+       }
+       else
+       {
+               angles[YAW] = atan2(forward[1], forward[0]);
+               angles[PITCH] = -atan2(forward[2], sqrt(forward[0]*forward[0] + forward[1]*forward[1]));
+               if (up)
+               {
+                       vec_t cp = cos(angles[PITCH]), sp = sin(angles[PITCH]);
+                       vec_t cy = cos(angles[YAW]), sy = sin(angles[YAW]);
+                       vec3_t tleft, tup;
+                       tleft[0] = -sy;
+                       tleft[1] = cy;
+                       tleft[2] = 0;
+                       tup[0] = sp*cy;
+                       tup[1] = sp*sy;
+                       tup[2] = cp;
+                       angles[ROLL] = -atan2(DotProduct(up, tleft), DotProduct(up, tup));
+               }
+               else
+                       angles[ROLL] = 0;
+       }
+
+       // now convert radians to degrees, and make all values positive
+       VectorScale(angles, 180.0 / M_PI, angles);
+       if (flippitch)
+               angles[PITCH] *= -1;
+       if (angles[PITCH] < 0) angles[PITCH] += 360;
+       if (angles[YAW] < 0) angles[YAW] += 360;
+       if (angles[ROLL] < 0) angles[ROLL] += 360;
+
+#if 0
+{
+       // debugging code
+       vec3_t tforward, tleft, tup, nforward, nup;
+       VectorCopy(forward, nforward);
+       VectorNormalize(nforward);
+       if (up)
+       {
+               VectorCopy(up, nup);
+               VectorNormalize(nup);
+               AngleVectors(angles, tforward, tleft, tup);
+               if (VectorDistance(tforward, nforward) > 0.01 || VectorDistance(tup, nup) > 0.01)
+               {
+                       Con_Printf("vectoangles('%f %f %f', '%f %f %f') = %f %f %f\n", nforward[0], nforward[1], nforward[2], nup[0], nup[1], nup[2], angles[0], angles[1], angles[2]);
+                       Con_Printf("^3But that is '%f %f %f', '%f %f %f'\n", tforward[0], tforward[1], tforward[2], tup[0], tup[1], tup[2]);
+               }
+       }
+       else
+       {
+               AngleVectors(angles, tforward, tleft, tup);
+               if (VectorDistance(tforward, nforward) > 0.01)
+               {
+                       Con_Printf("vectoangles('%f %f %f') = %f %f %f\n", nforward[0], nforward[1], nforward[2], angles[0], angles[1], angles[2]);
+                       Con_Printf("^3But that is '%f %f %f'\n", tforward[0], tforward[1], tforward[2]);
+               }
+       }
+}
+#endif
+}
+
 #if 0
 void AngleMatrix (const vec3_t angles, const vec3_t translate, vec_t matrix[][4])
 {
 #if 0
 void AngleMatrix (const vec3_t angles, const vec3_t translate, vec_t matrix[][4])
 {