Path: blob/master/RSDKv5/RSDK/Core/Math.hpp
1162 views
#ifndef MATH_H1#define MATH_H23namespace RSDK4{56// not "math" but works best here7#define INT_TO_VOID(x) (void *)(size_t)(x)8#define VOID_TO_INT(x) (int32)(size_t)(x)910#define MIN(a, b) ((a) < (b) ? (a) : (b))11#define MAX(a, b) ((a) > (b) ? (a) : (b))12#define CLAMP(value, minimum, maximum) (((value) < (minimum)) ? (minimum) : (((value) > (maximum)) ? (maximum) : (value)))1314#define TO_FIXED(x) ((x) << 16)15#define FROM_FIXED(x) ((x) >> 16)1617// M_PI is *too* accurate, so use this instead18#define RSDK_PI (3.1415927f)1920struct Vector2 {21int32 x;22int32 y;23};2425#define MEM_ZERO(x) memset(&(x), 0, sizeof((x)))2627extern int32 sin1024LookupTable[0x400];28extern int32 cos1024LookupTable[0x400];29extern int32 tan1024LookupTable[0x400];30extern int32 asin1024LookupTable[0x400];31extern int32 acos1024LookupTable[0x400];3233extern int32 sin512LookupTable[0x200];34extern int32 cos512LookupTable[0x200];35extern int32 tan512LookupTable[0x200];36extern int32 asin512LookupTable[0x200];37extern int32 acos512LookupTable[0x200];3839extern int32 sin256LookupTable[0x100];40extern int32 cos256LookupTable[0x100];41extern int32 tan256LookupTable[0x100];42extern int32 asin256LookupTable[0x100];43extern int32 acos256LookupTable[0x100];4445extern uint8 arcTan256LookupTable[0x100 * 0x100];4647// Setup angles48void ClearTrigLookupTables();49void CalculateTrigAngles();5051inline int32 Sin1024(int32 angle) { return sin1024LookupTable[angle & 0x3FF]; }52inline int32 Cos1024(int32 angle) { return cos1024LookupTable[angle & 0x3FF]; }53inline int32 Tan1024(int32 angle) { return tan1024LookupTable[angle & 0x3FF]; }54inline int32 ASin1024(int32 angle)55{56if (angle > 0x3FF)57return 0;58if (angle < 0)59return -asin1024LookupTable[-angle];60return asin1024LookupTable[angle];61}62inline int32 ACos1024(int32 angle)63{64if (angle > 0x3FF)65return 0;66if (angle < 0)67return -acos1024LookupTable[-angle];68return acos1024LookupTable[angle];69}7071inline int32 Sin512(int32 angle) { return sin512LookupTable[angle & 0x1FF]; }72inline int32 Cos512(int32 angle) { return cos512LookupTable[angle & 0x1FF]; }73inline int32 Tan512(int32 angle) { return tan512LookupTable[angle & 0x1FF]; }74inline int32 ASin512(int32 angle)75{76if (angle > 0x1FF)77return 0;78if (angle < 0)79return -asin512LookupTable[-angle];80return asin512LookupTable[angle];81}82inline int32 ACos512(int32 angle)83{84if (angle > 0x1FF)85return 0;86if (angle < 0)87return -acos512LookupTable[-angle];88return acos512LookupTable[angle];89}9091inline int32 Sin256(int32 angle) { return sin256LookupTable[angle & 0xFF]; }92inline int32 Cos256(int32 angle) { return cos256LookupTable[angle & 0xFF]; }93inline int32 Tan256(int32 angle) { return tan256LookupTable[angle & 0xFF]; }94inline int32 ASin256(int32 angle)95{96if (angle > 0xFF)97return 0;98if (angle < 0)99return -asin256LookupTable[-angle];100return asin256LookupTable[angle];101}102inline int32 ACos256(int32 angle)103{104if (angle > 0xFF)105return 0;106if (angle < 0)107return -acos256LookupTable[-angle];108return acos256LookupTable[angle];109}110111// Get Arc Tan value112uint8 ArcTanLookup(int32 x, int32 y);113114extern uint32 randSeed;115116inline void SetRandSeed(int32 key) { randSeed = key; }117inline int32 Rand(int32 min, int32 max)118{119uint32 seed1 = randSeed * 0x41c64e6d + 0x3039;120uint32 seed2 = seed1 * 0x41c64e6d + 0x3039;121randSeed = seed2 * 0x41c64e6d + 0x3039;122int32 res = ((seed1 >> 0x10 & 0x7ff) << 10 ^ seed2 >> 0x10 & 0x7ff) << 10 ^ randSeed >> 0x10 & 0x7ff;123if (min < max) {124return min + res % (max - min);125}126return max + res % (min - max);127}128inline int32 RandSeeded(int32 min, int32 max, int32 *randSeed)129{130if (!randSeed)131return 0;132133uint32 seed1 = *randSeed * 0x41c64e6d + 0x3039;134uint32 seed2 = seed1 * 0x41c64e6d + 0x3039;135*randSeed = seed2 * 0x41c64e6d + 0x3039;136int32 res = ((seed1 >> 0x10 & 0x7ff) << 10 ^ seed2 >> 0x10 & 0x7ff) << 10 ^ *randSeed >> 0x10 & 0x7ff;137if (min < max) {138return min + res % (max - min);139}140return max + res % (min - max);141}142143} // namespace RSDK144145#endif // !MATH_H146147148