Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Rubberduckycooly
GitHub Repository: Rubberduckycooly/RSDKv5-Decompilation
Path: blob/master/RSDKv5/RSDK/Core/Math.hpp
1162 views
1
#ifndef MATH_H
2
#define MATH_H
3
4
namespace RSDK
5
{
6
7
// not "math" but works best here
8
#define INT_TO_VOID(x) (void *)(size_t)(x)
9
#define VOID_TO_INT(x) (int32)(size_t)(x)
10
11
#define MIN(a, b) ((a) < (b) ? (a) : (b))
12
#define MAX(a, b) ((a) > (b) ? (a) : (b))
13
#define CLAMP(value, minimum, maximum) (((value) < (minimum)) ? (minimum) : (((value) > (maximum)) ? (maximum) : (value)))
14
15
#define TO_FIXED(x) ((x) << 16)
16
#define FROM_FIXED(x) ((x) >> 16)
17
18
// M_PI is *too* accurate, so use this instead
19
#define RSDK_PI (3.1415927f)
20
21
struct Vector2 {
22
int32 x;
23
int32 y;
24
};
25
26
#define MEM_ZERO(x) memset(&(x), 0, sizeof((x)))
27
28
extern int32 sin1024LookupTable[0x400];
29
extern int32 cos1024LookupTable[0x400];
30
extern int32 tan1024LookupTable[0x400];
31
extern int32 asin1024LookupTable[0x400];
32
extern int32 acos1024LookupTable[0x400];
33
34
extern int32 sin512LookupTable[0x200];
35
extern int32 cos512LookupTable[0x200];
36
extern int32 tan512LookupTable[0x200];
37
extern int32 asin512LookupTable[0x200];
38
extern int32 acos512LookupTable[0x200];
39
40
extern int32 sin256LookupTable[0x100];
41
extern int32 cos256LookupTable[0x100];
42
extern int32 tan256LookupTable[0x100];
43
extern int32 asin256LookupTable[0x100];
44
extern int32 acos256LookupTable[0x100];
45
46
extern uint8 arcTan256LookupTable[0x100 * 0x100];
47
48
// Setup angles
49
void ClearTrigLookupTables();
50
void CalculateTrigAngles();
51
52
inline int32 Sin1024(int32 angle) { return sin1024LookupTable[angle & 0x3FF]; }
53
inline int32 Cos1024(int32 angle) { return cos1024LookupTable[angle & 0x3FF]; }
54
inline int32 Tan1024(int32 angle) { return tan1024LookupTable[angle & 0x3FF]; }
55
inline int32 ASin1024(int32 angle)
56
{
57
if (angle > 0x3FF)
58
return 0;
59
if (angle < 0)
60
return -asin1024LookupTable[-angle];
61
return asin1024LookupTable[angle];
62
}
63
inline int32 ACos1024(int32 angle)
64
{
65
if (angle > 0x3FF)
66
return 0;
67
if (angle < 0)
68
return -acos1024LookupTable[-angle];
69
return acos1024LookupTable[angle];
70
}
71
72
inline int32 Sin512(int32 angle) { return sin512LookupTable[angle & 0x1FF]; }
73
inline int32 Cos512(int32 angle) { return cos512LookupTable[angle & 0x1FF]; }
74
inline int32 Tan512(int32 angle) { return tan512LookupTable[angle & 0x1FF]; }
75
inline int32 ASin512(int32 angle)
76
{
77
if (angle > 0x1FF)
78
return 0;
79
if (angle < 0)
80
return -asin512LookupTable[-angle];
81
return asin512LookupTable[angle];
82
}
83
inline int32 ACos512(int32 angle)
84
{
85
if (angle > 0x1FF)
86
return 0;
87
if (angle < 0)
88
return -acos512LookupTable[-angle];
89
return acos512LookupTable[angle];
90
}
91
92
inline int32 Sin256(int32 angle) { return sin256LookupTable[angle & 0xFF]; }
93
inline int32 Cos256(int32 angle) { return cos256LookupTable[angle & 0xFF]; }
94
inline int32 Tan256(int32 angle) { return tan256LookupTable[angle & 0xFF]; }
95
inline int32 ASin256(int32 angle)
96
{
97
if (angle > 0xFF)
98
return 0;
99
if (angle < 0)
100
return -asin256LookupTable[-angle];
101
return asin256LookupTable[angle];
102
}
103
inline int32 ACos256(int32 angle)
104
{
105
if (angle > 0xFF)
106
return 0;
107
if (angle < 0)
108
return -acos256LookupTable[-angle];
109
return acos256LookupTable[angle];
110
}
111
112
// Get Arc Tan value
113
uint8 ArcTanLookup(int32 x, int32 y);
114
115
extern uint32 randSeed;
116
117
inline void SetRandSeed(int32 key) { randSeed = key; }
118
inline int32 Rand(int32 min, int32 max)
119
{
120
uint32 seed1 = randSeed * 0x41c64e6d + 0x3039;
121
uint32 seed2 = seed1 * 0x41c64e6d + 0x3039;
122
randSeed = seed2 * 0x41c64e6d + 0x3039;
123
int32 res = ((seed1 >> 0x10 & 0x7ff) << 10 ^ seed2 >> 0x10 & 0x7ff) << 10 ^ randSeed >> 0x10 & 0x7ff;
124
if (min < max) {
125
return min + res % (max - min);
126
}
127
return max + res % (min - max);
128
}
129
inline int32 RandSeeded(int32 min, int32 max, int32 *randSeed)
130
{
131
if (!randSeed)
132
return 0;
133
134
uint32 seed1 = *randSeed * 0x41c64e6d + 0x3039;
135
uint32 seed2 = seed1 * 0x41c64e6d + 0x3039;
136
*randSeed = seed2 * 0x41c64e6d + 0x3039;
137
int32 res = ((seed1 >> 0x10 & 0x7ff) << 10 ^ seed2 >> 0x10 & 0x7ff) << 10 ^ *randSeed >> 0x10 & 0x7ff;
138
if (min < max) {
139
return min + res % (max - min);
140
}
141
return max + res % (min - max);
142
}
143
144
} // namespace RSDK
145
146
#endif // !MATH_H
147
148