summaryrefslogtreecommitdiff
path: root/apps/plugins/sdl/progs/quake/mathlib.h
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2018-02-11 15:34:30 -0500
committerFranklin Wei <git@fwei.tk>2019-07-19 22:37:40 -0400
commit5d05b9d3e920a6aa5fcb553758e98ed0da8c91e4 (patch)
tree84406e21639529a185556a33e5de7f43cffc277b /apps/plugins/sdl/progs/quake/mathlib.h
parentb70fecf21ddc21877ec1ae7888d9c18a979e37ad (diff)
downloadrockbox-5d05b9d3e920a6aa5fcb553758e98ed0da8c91e4.tar.gz
rockbox-5d05b9d3e920a6aa5fcb553758e98ed0da8c91e4.zip
Quake!
This ports id Software's Quake to run on the SDL plugin runtime. The source code originated from id under the GPLv2 license. I used https://github.com/ahefner/sdlquake as the base of my port. Performance is, unsurprisingly, not on par with what you're probably used to on PC. I average about 10FPS on ipod6g, but it's still playable. Sound works well enough, but in-game music is not supported. I've written ARM assembly routines for the inner sound loop. Make sure you turn the "brightness" all the way down, or colors will look funky. To run, extract Quake's data files to /.rockbox/quake. Have fun! Change-Id: I4285036e967d7f0722802d43cf2096c808ca5799
Diffstat (limited to 'apps/plugins/sdl/progs/quake/mathlib.h')
-rw-r--r--apps/plugins/sdl/progs/quake/mathlib.h154
1 files changed, 154 insertions, 0 deletions
diff --git a/apps/plugins/sdl/progs/quake/mathlib.h b/apps/plugins/sdl/progs/quake/mathlib.h
new file mode 100644
index 0000000000..b754966802
--- /dev/null
+++ b/apps/plugins/sdl/progs/quake/mathlib.h
@@ -0,0 +1,154 @@
1/*
2Copyright (C) 1996-1997 Id Software, Inc.
3
4This program is free software; you can redistribute it and/or
5modify it under the terms of the GNU General Public License
6as published by the Free Software Foundation; either version 2
7of the License, or (at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13See the GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program; if not, write to the Free Software
17Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
19*/
20// mathlib.h
21
22typedef float vec_t;
23typedef vec_t vec3_t[3];
24typedef vec_t vec5_t[5];
25
26typedef int fixed4_t;
27typedef int fixed8_t;
28typedef int fixed16_t;
29
30#ifndef M_PI
31#define M_PI 3.14159265358979323846 // matches value in gcc v2 math.h
32#endif
33
34struct mplane_s;
35
36extern vec3_t vec3_origin;
37extern int nanmask;
38
39#define IS_NAN(x) (((*(int *)&x)&nanmask)==nanmask)
40
41#define DotProduct(x,y) (x[0]*y[0]+x[1]*y[1]+x[2]*y[2])
42#define VectorSubtract(a,b,c) {c[0]=a[0]-b[0];c[1]=a[1]-b[1];c[2]=a[2]-b[2];}
43#define VectorAdd(a,b,c) {c[0]=a[0]+b[0];c[1]=a[1]+b[1];c[2]=a[2]+b[2];}
44#define VectorCopy(a,b) {b[0]=a[0];b[1]=a[1];b[2]=a[2];}
45
46void VectorMA (vec3_t veca, float scale, vec3_t vecb, vec3_t vecc);
47
48vec_t _DotProduct (vec3_t v1, vec3_t v2);
49void _VectorSubtract (vec3_t veca, vec3_t vecb, vec3_t out);
50void _VectorAdd (vec3_t veca, vec3_t vecb, vec3_t out);
51void _VectorCopy (vec3_t in, vec3_t out);
52
53int VectorCompare (vec3_t v1, vec3_t v2);
54vec_t Length (vec3_t v);
55void CrossProduct (vec3_t v1, vec3_t v2, vec3_t cross);
56//void VectorNormalizeNoRet (vec3_t v); // uses finvsqrt
57//float VectorNormalize (vec3_t v); // returns vector length
58
59static inline float InvSqrt( float number ) {
60 long i;
61 float x2, y;
62 const float threehalfs = 1.5F;
63
64 x2 = number * 0.5F;
65 y = number;
66 i = * ( long * ) &y; // evil floating point bit level hacking
67 i = 0x5f3759df - ( i >> 1 ); // what the fuck?
68 y = * ( float * ) &i;
69 y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
70// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
71
72 return y;
73}
74
75static inline void VectorNormalizeNoRet (vec3_t v)
76{
77 float length, ilength;
78
79 ilength = InvSqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
80
81 v[0] *= ilength;
82 v[1] *= ilength;
83 v[2] *= ilength;
84}
85
86static inline float VectorNormalize (vec3_t v)
87{
88 float length, ilength;
89
90 length = v[0]*v[0] + v[1]*v[1] + v[2]*v[2];
91 length = sqrt (length); // FIXME
92
93 if (length)
94 {
95 ilength = 1/length;
96 v[0] *= ilength;
97 v[1] *= ilength;
98 v[2] *= ilength;
99 }
100
101 return length;
102
103}
104
105//void VectorInverse (vec3_t v);
106//void VectorScale (vec3_t in, vec_t scale, vec3_t out);
107
108
109static inline void VectorInverse (vec3_t v)
110{
111 v[0] = -v[0];
112 v[1] = -v[1];
113 v[2] = -v[2];
114}
115
116static inline void VectorScale (vec3_t in, vec_t scale, vec3_t out)
117{
118 out[0] = in[0]*scale;
119 out[1] = in[1]*scale;
120 out[2] = in[2]*scale;
121}
122
123
124int Q_log2(int val);
125
126void R_ConcatRotations (float in1[3][3], float in2[3][3], float out[3][3]);
127void R_ConcatTransforms (float in1[3][4], float in2[3][4], float out[3][4]);
128
129void FloorDivMod (double numer, double denom, int *quotient,
130 int *rem);
131fixed16_t Invert24To16(fixed16_t val);
132int GreatestCommonDivisor (int i1, int i2);
133
134void AngleVectors (vec3_t angles, vec3_t forward, vec3_t right, vec3_t up);
135int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct mplane_s *plane);
136float anglemod(float a);
137
138
139
140#define BOX_ON_PLANE_SIDE(emins, emaxs, p) \
141 (((p)->type < 3)? \
142 ( \
143 ((p)->dist <= (emins)[(p)->type])? \
144 1 \
145 : \
146 ( \
147 ((p)->dist >= (emaxs)[(p)->type])?\
148 2 \
149 : \
150 3 \
151 ) \
152 ) \
153 : \
154 BoxOnPlaneSide( (emins), (emaxs), (p)))