Twilight Princess
Decompilation of The Legend of Zelda: Twilight Princess
Loading...
Searching...
No Matches
JMATrigonometric.h
Go to the documentation of this file.
1#ifndef JMATRIGONOMETRIC_H
2#define JMATRIGONOMETRIC_H
3
4#include <dolphin/types.h>
5#include <cmath>
6#include <utility>
7
8#ifdef __cplusplus
9extern "C" {
10#endif
11 extern double asin(double);
12 extern double atan(double);
13#ifdef __cplusplus
14}
15#endif
16
17namespace JMath {
18template<typename T>
20
25template<>
27 static f32 RADIAN_DEG090() { return 1.5707964f; }
28 static f32 RADIAN_DEG180() { return 3.1415927f; }
29 static f32 RADIAN_DEG360() { return 6.2831855f; }
30 static f32 RADIAN_TO_DEGREE_FACTOR() { return 180.0f / RADIAN_DEG180(); }
31};
32
37template<int N, typename T>
39 std::pair<T, T> table[1 << N];
40
42 init();
43 }
44 void init() {
45 for (int i = 0; i < 1 << N; i++) {
46 table[i].first = sin((i * f64(TAngleConstant_<f32>::RADIAN_DEG360())) / (1 << N));
47 table[i].second = cos((i * f64(TAngleConstant_<f32>::RADIAN_DEG360())) / (1 << N));
48 }
49 }
50
51 T sinShort(s16 v) const { return table[(u16)v >> (16U - N)].first; }
52 T cosShort(s16 v) const { return table[(u16)v >> (16U - N)].second; }
53
54 inline T sinLap(T v) const {
55 if (v < (T)0.0) {
56 return -table[(u16)(-(T)(1 << N) * v) & ((1 << N) - 1)].first;
57 }
58 return table[(u16)((T)(1 << N) * v) & ((1 << N) - 1)].first;
59 }
60
61 inline T sinDegree(T degree) const {
62 if (degree < (T)0.0) {
63 return -table[(u16)(-((T)(1 << N) / (T)360.0) * degree) & ((1 << N) - 1)].first;
64 }
65 return table[(u16)(((T)(1 << N) / (T)360.0) * degree) & ((1 << N) - 1)].first;
66 }
67
68 inline T cosDegree(T degree) const {
69 if (degree < (T)0.0) {
70 degree = -degree;
71 }
72 return table[(u16)(((T)(1 << N) / (T)360.0) * degree) & ((1 << N) - 1)].second;
73 }
74
75 inline T sinRadian(T radian) const {
76 if (radian < (T)0.0) {
77 return -table[(u16)(-(T)(1 << N) / TAngleConstant_<T>::RADIAN_DEG360() * radian) & ((1 << N) - 1)].first;
78 }
79 return table[(u16)((T)(1 << N) / TAngleConstant_<T>::RADIAN_DEG360() * radian) & ((1 << N) - 1)].first;
80 }
81};
82
87template<int N, typename T>
88struct TAtanTable {
89 T table[N + 1];
90 u8 pad[0x1C];
91
93 init();
94 }
95
96 void init() {
97 // u32 cast needed for cmplwi instead of cmpwi
98 for (int i = 0; i < (u32)N; i++) {
99 table[i] = atan(i / (f64)N);
100 }
101 table[0] = 0.0f;
103 }
104};
105
110template<int N, typename T>
112 T table[N + 1];
113 u8 pad[0x1C];
114
116 init();
117 }
118
119 void init() {
120 for (int i = 0; i < 1024; i++) {
121 table[i] = asin(i / (f64)N);
122 }
123 table[0] = 0.0f;
125 }
126
127 T acos_(T x) const {
128 if (x >= 1.0f) {
129 return 0.0f;
130 } else if (x <= -1.0f) {
132 } else if (x < 0.0f) {
133 return table[(u32)(-x * 1023.5f)] + TAngleConstant_<T>::RADIAN_DEG090();
134 } else {
135 return TAngleConstant_<T>::RADIAN_DEG090() - table[(u32)(x * 1023.5f)];
136 }
137 }
138
142};
143
144extern TSinCosTable<13, f32> sincosTable_;
145extern TAtanTable<1024, f32> atanTable_;
146extern TAsinAcosTable<1024, f32> asinAcosTable_;
147
149 return asinAcosTable_.acosDegree(x);
150}
151}; // namespace JMath
152
154 return JMath::sincosTable_.cosShort(v);
155}
157 return JMath::sincosTable_.sinShort(v);
158}
159
160inline f32 JMASCos(s16 v) {
161 return JMACosShort(v);
162}
163inline f32 JMASSin(s16 v) {
164 return JMASinShort(v);
165}
166
168 return JMath::sincosTable_.sinLap(v);
169}
170
171inline f32 JMASinDegree(f32 degree) {
172 return JMath::sincosTable_.sinDegree(degree);
173}
174
175inline f32 JMACosDegree(f32 degree) {
176 return JMath::sincosTable_.cosDegree(degree);
177}
178
179inline f32 JMASinRadian(f32 radian) {
180 return JMath::sincosTable_.sinRadian(radian);
181}
182
183#endif /* JMATRIGONOMETRIC_H */
f32 JMASinShort(s16 v)
Definition JMATrigonometric.h:156
f32 JMASinLap(f32 v)
Definition JMATrigonometric.h:167
f32 JMASinDegree(f32 degree)
Definition JMATrigonometric.h:171
f32 JMASSin(s16 v)
Definition JMATrigonometric.h:163
f32 JMACosShort(s16 v)
Definition JMATrigonometric.h:153
f32 JMACosDegree(f32 degree)
Definition JMATrigonometric.h:175
f32 JMASinRadian(f32 radian)
Definition JMATrigonometric.h:179
double atan(double)
f32 JMASCos(s16 v)
Definition JMATrigonometric.h:160
double asin(double)
Definition w_asin.c:3
double x double x
Definition e_atan2.c:58
int i
Definition e_log.c:92
double v
Definition e_pow.c:114
unsigned long u32
Definition types.h:12
signed short int s16
Definition types.h:9
float f32
Definition types.h:25
double f64
Definition types.h:26
unsigned short int u16
Definition types.h:10
unsigned char u8
Definition types.h:8
Definition JMATrigonometric.cpp:11
TAtanTable< 1024, f32 > atanTable_
TSinCosTable< 13, f32 > sincosTable_
f32 acosDegree(f32 x)
Definition JMATrigonometric.h:148
TAsinAcosTable< 1024, f32 > asinAcosTable_
double cos(double x) double cos(x) double x
double sin(double x) double sin(x) double x
static f32 RADIAN_TO_DEGREE_FACTOR()
Definition JMATrigonometric.h:30
static f32 RADIAN_DEG180()
Definition JMATrigonometric.h:28
static f32 RADIAN_DEG360()
Definition JMATrigonometric.h:29
static f32 RADIAN_DEG090()
Definition JMATrigonometric.h:27
Definition JMATrigonometric.h:19
Definition JMATrigonometric.h:111
void init()
Definition JMATrigonometric.h:119
TAsinAcosTable()
Definition JMATrigonometric.h:115
T acosDegree(T x) const
Definition JMATrigonometric.h:139
T table[N+1]
Definition JMATrigonometric.h:112
T acos_(T x) const
Definition JMATrigonometric.h:127
u8 pad[0x1C]
Definition JMATrigonometric.h:113
Definition JMATrigonometric.h:88
T table[N+1]
Definition JMATrigonometric.h:89
u8 pad[0x1C]
Definition JMATrigonometric.h:90
TAtanTable()
Definition JMATrigonometric.h:92
void init()
Definition JMATrigonometric.h:96
Definition JMATrigonometric.h:38
T sinDegree(T degree) const
Definition JMATrigonometric.h:61
T cosShort(s16 v) const
Definition JMATrigonometric.h:52
T cosDegree(T degree) const
Definition JMATrigonometric.h:68
T sinShort(s16 v) const
Definition JMATrigonometric.h:51
T sinLap(T v) const
Definition JMATrigonometric.h:54
T sinRadian(T radian) const
Definition JMATrigonometric.h:75
std::pair< T, T > table[1<< N]
Definition JMATrigonometric.h:39
TSinCosTable()
Definition JMATrigonometric.h:41
void init()
Definition JMATrigonometric.h:44
double asin(double x)
Definition w_asin.c:3