1 //////////////////////////////////////////////////////////////////////////
2 //
3 //  Fixed Point Math Class
4 //
5 //////////////////////////////////////////////////////////////////////////
6 //
7 //  Released under GNU license
8 //		Erik H Gawtry
9 //			July, 2005	Version 1.0
10 //		Altered G Camp
11 //			Aug, 2007 Version 1.1
12 //
13 //
14 //  Algorythms borrowed from:
15 //		Andrew Ryder, 11 September 2001
16 //      Joseph Hall, Unknown Date
17 //
18 //
19 //////////////////////////////////////////////////////////////////////////
20 //
21 // Written for doing fixed point math on DSP processors
22 //
23 //////////////////////////////////////////////////////////////////////////
24 
25 #ifndef _FIXED_H
26 #define _FIXED_H
27 
28 #include <SDL/SDL.h>
29 
30 #ifndef SDL_HAS_64BIT_TYPE
31 #error 64 bit type has not been found for this system
32 #endif
33 
34 class fixed
35 {
36 private:
37 	Sint64 m_nVal;
38 public:
fixed()39 	fixed()
40 	{
41 		m_nVal = 0;
42 	}
43 
fixed(const fixed & fixedVal)44 	fixed(const fixed& fixedVal)
45 	{
46 		m_nVal = fixedVal.m_nVal;
47 	}
48 
fixed(bool bInternal,Sint64 nVal)49 	fixed(bool bInternal, Sint64 nVal)
50 	{
51 		m_nVal = nVal;
52 	}
53 
fixed(unsigned int nVal)54 	fixed(unsigned int nVal)
55 	{
56 		m_nVal = Sint64(nVal)*FIXED_RESOLUTION;
57 	}
58 
fixed(int nVal)59 	fixed(int nVal)
60 	{
61 		m_nVal = Sint64(nVal)*FIXED_RESOLUTION;
62 	}
63 
fixed(Sint64 nVal)64 	fixed(Sint64 nVal)
65 	{
66 		m_nVal = nVal*FIXED_RESOLUTION;
67 	}
68 
69 	fixed(const char *nVal);
70 
~fixed()71 	~fixed()
72 	{
73 	}
74 
75 	fixed operator++()
76 	{
77 		m_nVal += FIXED_RESOLUTION;
78 		return *this;
79 	}
80 
81 	fixed operator--()
82 	{
83 		m_nVal -= FIXED_RESOLUTION;
84 		return *this;
85 	}
86 
87 	fixed operator-()
88 	{
89 		return fixed(0) - *this;
90 	}
91 
92 	fixed& operator=(fixed fixedVal)
93 	{
94 		m_nVal = fixedVal.m_nVal;
95 		return *this;
96 	}
97 
98 	bool operator==(fixed fixedVal)
99 	{
100 		return (m_nVal == fixedVal.m_nVal);
101 	}
102 
103 	bool operator!=(fixed fixedVal)
104 	{
105 		return (m_nVal != fixedVal.m_nVal);
106 	}
107 
108 	bool operator<(fixed fixedVal)
109 	{
110 		return (m_nVal < fixedVal.m_nVal);
111 	}
112 
113 	bool operator<=(fixed fixedVal)
114 	{
115 		return (m_nVal <= fixedVal.m_nVal);
116 	}
117 
118 	bool operator>(fixed fixedVal)
119 	{
120 		return (m_nVal > fixedVal.m_nVal);
121 	}
122 
123 	bool operator>=(fixed fixedVal)
124 	{
125 		return (m_nVal >= fixedVal.m_nVal);
126 	}
127 
128 	const char *asString();
129 	const char *asQuickString();
130 
asFloat()131 	float asFloat()
132 	{
133 		return m_nVal/FIXED_RESOLUTION_FLOAT;
134 	}
135 
asInt()136 	int asInt()
137 	{
138 		return (int)(m_nVal/FIXED_RESOLUTION);
139 	}
140 
getInternalData()141 	Sint64 getInternalData()
142 	{
143 		return m_nVal;
144 	}
145 
floor()146 	fixed floor()
147 	{
148 		return fixed(m_nVal/FIXED_RESOLUTION);
149 	}
150 
ceil()151 	fixed ceil()
152 	{
153 		return fixed(m_nVal/FIXED_RESOLUTION+Sint64(1));
154 	}
155 
156 	fixed operator+(fixed b)
157 	{
158 		fixed a;
159 		a.m_nVal = m_nVal+b.m_nVal;
160 		return a;
161 	}
162 
163 	fixed operator-(fixed b)
164 	{
165 		fixed a;
166 		a.m_nVal = m_nVal-b.m_nVal;
167 		return a;
168 	}
169 
170 	fixed operator*(fixed b);
171 	fixed operator/(fixed b);
172 	fixed sqrt();
173 	fixed pow(fixed fixedPower);
174 	fixed log10();
175 	fixed log();
176 	fixed exp();
177 	fixed cos();
178 	fixed sin();
179 	fixed tan();
180 	fixed asin();
181 	fixed acos();
182 	fixed atan();
183 
abs()184 	fixed abs()
185 	{
186 		if (m_nVal > Sint64(0)) return fixed(*this);
187 		else return fixed(true, -m_nVal);
188 	}
189 
190 	fixed operator%(fixed fixedVal)
191 	{
192 		fixed a;
193 		a.m_nVal = m_nVal%fixedVal.m_nVal;
194 		return a;
195 	}
196 
197 	fixed operator*=(fixed val);
198 	fixed operator/=(fixed val);
199 
200 	fixed operator-=(fixed val)
201 	{
202 		m_nVal -= val.m_nVal;
203 		return *this;
204 	}
205 
206 	fixed operator+=(fixed val)
207 	{
208 		m_nVal += val.m_nVal;
209 		return *this;
210 	}
211 
212 	static fixed MAX_FIXED;
213 	static fixed MIN_FIXED;
214 	static fixed XPI;
215 	static fixed X2PI;
216 	static fixed XPIO2;
217 
218 	static fixed fromFloat(float flt);
219 
220 	static Sint64 FIXED_RESOLUTION;
221 	static float FIXED_RESOLUTION_FLOAT;
222 };
223 
224 fixed absx( fixed p_Base );
225 fixed floorx(fixed fixedVal);
226 fixed ceilx(fixed fixedVal);
227 fixed sqrtx(fixed fixedVal);
228 fixed powx(fixed fixedVal, fixed fixedPower);
229 fixed log10x(fixed fixedVal);
230 fixed logx(fixed fixedVal);
231 fixed expx(fixed fixedVal);
232 fixed sinx(fixed x);
233 fixed asinx(fixed x);
234 fixed cosx(fixed x);
235 fixed acosx(fixed x);
236 fixed tanx(fixed x);
237 fixed atanx(fixed x);
238 fixed atan2x(fixed x, fixed y);
239 
240 #endif // _FIXED_H
241 
242