git-svn-id: http://bladebattles.com/kurok/SVN@11 20cd92bb-ff49-0410-b73e-96a06e42c3b9
[kurok.git] / mathlib.h
blob3c20bf099630e2d5a31fce7f6738e7e9e4a3e576
1 /*
2 Copyright (C) 1996-1997 Id Software, Inc.
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 See the GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 // mathlib.h
21 #include <pspgu.h>
23 typedef float vec_t;
24 typedef vec_t vec3_t[3];
25 typedef vec_t vec5_t[5];
27 typedef int fixed4_t;
28 typedef int fixed8_t;
29 typedef int fixed16_t;
31 //#ifdef PSP_SOFTWARE_VIDEO
33 #ifndef M_PI
34 #define M_PI 3.14159265358979323846 // matches value in gcc v2 math.h
35 #endif
37 #define M_PI_DIV_180 (M_PI / 180.0) //johnfitz
38 //#define DEG2RAD( a ) ( a * M_PI ) / 180.0F
39 #define DEG2RAD( a ) ( (a) * M_PI_DIV_180 ) //johnfitz
41 //#else
43 #ifndef M_PI
44 #define M_PI = GU_PI // matches value in gcc v2 math.h
45 #endif
47 #define M_PI_DIV_180 (M_PI / 180.0) //johnfitz
48 //#define DEG2RAD( a ) ( a * M_PI ) / 180.0F
49 #define DEG2RAD( a ) ( (a) * M_PI_DIV_180 ) //johnfitz
50 //#endif
52 struct mplane_s;
54 extern vec3_t vec3_origin;
55 extern int nanmask;
57 #define CLAMP(min, x, max) ((x) < (min) ? (min) : (x) > (max) ? (max) : (x)) //johnfitz
59 #define IS_NAN(x) (((*(int *)&x)&nanmask)==nanmask)
61 #define DotProduct(x,y) (x[0]*y[0]+x[1]*y[1]+x[2]*y[2])
62 #define VectorSubtract(a,b,c) {(c)[0]=(a)[0]-(b)[0];(c)[1]=(a)[1]-(b)[1];(c)[2]=(a)[2]-(b)[2];}
63 #define VectorAdd(a,b,c) {c[0]=a[0]+b[0];c[1]=a[1]+b[1];c[2]=a[2]+b[2];}
64 #define VectorCopy(a,b) {b[0]=a[0];b[1]=a[1];b[2]=a[2];}
65 #define VectorClear(a) ((a)[0] = (a)[1] = (a)[2] = 0)
67 // MDave -- courtesy of johnfitz, lordhavoc
68 #define VectorNormalizeFast(_v)\
70 float _y, _number;\
71 _number = DotProduct(_v, _v);\
72 if (_number != 0.0)\
74 *((long *)&_y) = 0x5f3759df - ((* (long *) &_number) >> 1);\
75 _y = _y * (1.5f - (_number * 0.5f * _y * _y));\
76 VectorScale(_v, _y, _v);\
80 void VectorMA (vec3_t veca, float scale, vec3_t vecb, vec3_t vecc);
82 vec_t _DotProduct (vec3_t v1, vec3_t v2);
83 void _VectorSubtract (vec3_t veca, vec3_t vecb, vec3_t out);
84 void _VectorAdd (vec3_t veca, vec3_t vecb, vec3_t out);
85 void _VectorCopy (vec3_t in, vec3_t out);
87 int VectorCompare (vec3_t v1, vec3_t v2);
88 vec_t Length (vec3_t v);
89 void CrossProduct (vec3_t v1, vec3_t v2, vec3_t cross);
90 float VectorNormalize (vec3_t v); // returns vector length
91 void VectorInverse (vec3_t v);
92 void VectorScale (vec3_t in, vec_t scale, vec3_t out);
93 int Q_log2(int val);
95 void R_ConcatRotations (float in1[3][3], float in2[3][3], float out[3][3]);
96 void R_ConcatTransforms (float in1[3][4], float in2[3][4], float out[3][4]);
98 void FloorDivMod (float numer, float denom, int *quotient,
99 int *rem);
100 fixed16_t Invert24To16(fixed16_t val);
101 int GreatestCommonDivisor (int i1, int i2);
103 void vectoangles (vec3_t vec, vec3_t ang);
104 void AngleVectors (vec3_t angles, vec3_t forward, vec3_t right, vec3_t up);
105 int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct mplane_s *plane);
106 float anglemod(float a);
110 #define BOX_ON_PLANE_SIDE(emins, emaxs, p) \
111 (((p)->type < 3)? \
113 ((p)->dist <= (emins)[(p)->type])? \
117 ((p)->dist >= (emaxs)[(p)->type])?\
124 BoxOnPlaneSide( (emins), (emaxs), (p)))
126 // Prototypes added by PM.
127 void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, float degrees );
128 void VectorVectors (vec3_t forward, vec3_t right, vec3_t up);