Path: blob/master/RSDKv5/RSDK/Core/Math.cpp
1162 views
#include "RSDK/Core/RetroEngine.hpp"1#include <math.h>23using namespace RSDK;45int32 RSDK::sin1024LookupTable[0x400];6int32 RSDK::cos1024LookupTable[0x400];7int32 RSDK::tan1024LookupTable[0x400];8int32 RSDK::asin1024LookupTable[0x400];9int32 RSDK::acos1024LookupTable[0x400];1011int32 RSDK::sin512LookupTable[0x200];12int32 RSDK::cos512LookupTable[0x200];13int32 RSDK::tan512LookupTable[0x200];14int32 RSDK::asin512LookupTable[0x200];15int32 RSDK::acos512LookupTable[0x200];1617int32 RSDK::sin256LookupTable[0x100];18int32 RSDK::cos256LookupTable[0x100];19int32 RSDK::tan256LookupTable[0x100];20int32 RSDK::asin256LookupTable[0x100];21int32 RSDK::acos256LookupTable[0x100];2223uint8 RSDK::arcTan256LookupTable[0x100 * 0x100];2425uint32 RSDK::randSeed = 0;2627void RSDK::ClearTrigLookupTables()28{29memset(sin256LookupTable, 0, sizeof(sin256LookupTable));30memset(cos256LookupTable, 0, sizeof(cos256LookupTable));31memset(tan256LookupTable, 0, sizeof(tan256LookupTable));32memset(asin256LookupTable, 0, sizeof(asin256LookupTable));33memset(acos256LookupTable, 0, sizeof(acos256LookupTable));34memset(sin512LookupTable, 0, sizeof(sin512LookupTable));35memset(cos512LookupTable, 0, sizeof(cos512LookupTable));36memset(tan512LookupTable, 0, sizeof(tan512LookupTable));37memset(asin512LookupTable, 0, sizeof(asin512LookupTable));38memset(acos512LookupTable, 0, sizeof(acos512LookupTable));39memset(sin1024LookupTable, 0, sizeof(sin1024LookupTable));40memset(cos1024LookupTable, 0, sizeof(cos1024LookupTable));41memset(tan1024LookupTable, 0, sizeof(tan1024LookupTable));42memset(asin1024LookupTable, 0, sizeof(asin1024LookupTable));43memset(acos1024LookupTable, 0, sizeof(acos1024LookupTable));44memset(arcTan256LookupTable, 0, sizeof(arcTan256LookupTable));45randSeed = 0;46}4748void RSDK::CalculateTrigAngles()49{50srand((uint32)time(NULL));51randSeed = rand();5253for (int32 i = 0; i < 0x400; ++i) {54sin1024LookupTable[i] = (int32)(sinf((i / 512.f) * RSDK_PI) * 1024.f);55cos1024LookupTable[i] = (int32)(cosf((i / 512.f) * RSDK_PI) * 1024.f);56tan1024LookupTable[i] = (int32)(tanf((i / 512.f) * RSDK_PI) * 1024.f);57asin1024LookupTable[i] = (int32)((asinf(i / 1023.f) * 512.f) / RSDK_PI);58acos1024LookupTable[i] = (int32)((acosf(i / 1023.f) * 512.f) / RSDK_PI);59}6061cos1024LookupTable[0x000] = 0x400;62cos1024LookupTable[0x100] = 0;63cos1024LookupTable[0x200] = -0x400;64cos1024LookupTable[0x300] = 0;6566sin1024LookupTable[0x000] = 0;67sin1024LookupTable[0x100] = 0x400;68sin1024LookupTable[0x200] = 0;69sin1024LookupTable[0x300] = -0x400;7071for (int32 i = 0; i < 0x200; ++i) {72sin512LookupTable[i] = (int32)(sinf((i / 256.f) * RSDK_PI) * 512.f);73cos512LookupTable[i] = (int32)(cosf((i / 256.f) * RSDK_PI) * 512.f);74tan512LookupTable[i] = (int32)(tanf((i / 256.f) * RSDK_PI) * 512.f);75asin512LookupTable[i] = (int32)((asinf(i / 511.f) * 256.f) / RSDK_PI);76acos512LookupTable[i] = (int32)((acosf(i / 511.f) * 256.f) / RSDK_PI);77}7879cos512LookupTable[0x00] = 0x200;80cos512LookupTable[0x80] = 0;81cos512LookupTable[0x100] = -0x200;82cos512LookupTable[0x180] = 0;8384sin512LookupTable[0x00] = 0;85sin512LookupTable[0x80] = 0x200;86sin512LookupTable[0x100] = 0;87sin512LookupTable[0x180] = -0x200;8889for (int32 i = 0; i < 0x100; i++) {90sin256LookupTable[i] = (int32)((sin512LookupTable[i * 2] >> 1));91cos256LookupTable[i] = (int32)((cos512LookupTable[i * 2] >> 1));92tan256LookupTable[i] = (int32)((tan512LookupTable[i * 2] >> 1));93asin256LookupTable[i] = (int32)((asinf(i / 255.f) * 128.f) / RSDK_PI);94acos256LookupTable[i] = (int32)((acosf(i / 255.f) * 128.f) / RSDK_PI);95}9697for (int32 y = 0; y < 0x100; ++y) {98uint8 *arcTan = (uint8 *)&arcTan256LookupTable[y];99100for (int32 x = 0; x < 0x100; ++x) {101// 40.743664 = 0x100 / (2 * M_PI) (roughly)102*arcTan = (int32)(float)((float)atan2((float)y, x) * 40.743664f);103arcTan += 0x100;104}105}106}107108uint8 RSDK::ArcTanLookup(int32 X, int32 Y)109{110int32 x = abs(X);111int32 y = abs(Y);112113if (x <= y) {114while (y > 0xFF) {115x >>= 4;116y >>= 4;117}118}119else {120while (x > 0xFF) {121x >>= 4;122y >>= 4;123}124}125if (X <= 0) {126if (Y <= 0)127return arcTan256LookupTable[(x << 8) + y] + 0x80;128else129return 0x80 - arcTan256LookupTable[(x << 8) + y];130}131else if (Y <= 0)132return -arcTan256LookupTable[(x << 8) + y];133else134return arcTan256LookupTable[(x << 8) + y];135}136137138