rodecomp/Source/Utility/ClientAngles.cpp
2026-10-24 00:35:19 +00:00

65 lines
1.7 KiB
C++

#include "Utility/AffineMatrix.h"
#include <bit>
#include <cmath>
float ClientSin(float radians) {
return std::sin(radians);
}
float ClientCos(float radians) {
return std::cos(radians);
}
namespace {
// OFFSET: 0x00554280
// FUNCTION: fn_02021
// The six adjacent arrays are one contiguous addressing domain: negative lookup indices intentionally reach
// the preceding array's tail, not abs(index) in the negative array.
struct AngleTables {
float radians[361];
float negativeRadians[361];
float sine[361];
float negativeSine[361];
float cosine[361];
float negativeCosine[361];
AngleTables() {
for (int index = 0; index <= 360; ++index) {
const float angle = (static_cast<float>(index) / 180.0f) * 3.141592f;
radians[index] = angle;
sine[index] = ClientSin(angle);
cosine[index] = ClientCos(angle);
negativeRadians[index] = -angle;
negativeSine[index] = -sine[index];
negativeCosine[index] = -cosine[index];
}
}
};
const AngleTables tables;
int Wrapped(int degrees) {
return degrees > 360 || degrees < -360 ? degrees % 360 : degrees;
}
}
// OFFSET: 0x00554420
// FUNCTION: fn_02024
float ClientRadians(int degrees) {
const int index = Wrapped(degrees);
return tables.radians[index >= 0 ? index : 361 + index];
}
// OFFSET: 0x00554470
// FUNCTION: fn_02025
float ClientSine(int degrees) {
const int index = Wrapped(degrees);
return tables.sine[index >= 0 ? index : 361 + index];
}
// OFFSET: 0x005543D0
// FUNCTION: fn_02023
float ClientCosine(int degrees) {
const int index = Wrapped(degrees);
return tables.cosine[index >= 0 ? index : 361 + index];
}