Starbound/attic/unneeded/StarCoordSys.hpp
2025-03-21 22:23:30 +11:00

68 lines
1.8 KiB
C++

#ifndef STAR_COORD_SYS_H
#define STAR_COORD_SYS_H
#include "StarMathCommon.hpp"
#include "StarVector3.hpp"
namespace Star {
class CoordinateSystem3 {
public:
static inline CoordinateSystem3 opengl() {
return CoordinateSystem3(-3, 1, -2);
}
static inline CoordinateSystem3 northEastDown() {
return CoordinateSystem3(1, 2, 3);
}
static inline CoordinateSystem3 eastNorthUp() {
return CoordinateSystem3(2, 1, -3);
}
static inline Vec3D getDirection(int v) {
Vec3D dir(0, 0, 0);
if(v < 0)
dir[-v - 1] = -1.0f;
else
dir[v - 1] = 1.0f;
return dir;
}
inline CoordinateSystem3(int forward, int right, int down) {
if((forward < -3 || forward > 3 || forward == 0) ||
(right < -3 || right > 3 || right == 0) ||
(down < -3 || down > 3 || down == 0)) {
throw MathException("Value out of range [-3, -1], [1, -3] on "
"CoordinateSystem3 constructor");
}
m_forward = forward;
m_right = right;
m_down = down;
}
inline Vec3D getForward() const { return getDirection(m_forward); }
inline Vec3D getRight() const { return getDirection(m_right); }
inline Vec3D getDown() const { return getDirection(m_down); }
size_t getForwardIndex() const { return abs(m_forward) - 1; }
size_t getRightIndex() const { return abs(m_right) - 1; }
size_t getDownIndex() const { return abs(m_down) - 1; }
int getForwardSign() const { return m_forward / abs(m_forward); }
int getRightSign() const { return m_right / abs(m_right); }
int getDownSign() const { return m_down / abs(m_down); }
bool operator==(CoordinateSystem3 const& ref) const {
return m_forward == ref.m_forward &&
m_right == ref.m_right &&
m_down == ref.m_down;
}
private:
int m_forward;
int m_right;
int m_down;
};
}
#endif