mirror of
https://github.com/zeldaret/ss
synced 2026-06-25 01:32:01 -04:00
88 lines
2.5 KiB
C++
88 lines
2.5 KiB
C++
#include "d/lyt/d_lyt_map_global.h"
|
|
|
|
#include "m/m_vec.h"
|
|
|
|
dLytMapGlobal_c *dLytMapGlobal_c::sInstance;
|
|
|
|
dLytMapGlobal_c::dLytMapGlobal_c()
|
|
: mMapScroll(0.0f, 0.0f, 0.0f),
|
|
field_0x0C(0.0f, 0.0f),
|
|
mMapRotationCenter(0.0f, 0.0f, 0.0f),
|
|
field_0x20(0.0f, 0.0f),
|
|
field_0x28(0.0f, 0.0f),
|
|
mMapRotation(0),
|
|
field_0x40(1.0f),
|
|
field_0x44(1.0f),
|
|
mFloor(0),
|
|
field_0x4C(0),
|
|
field_0x4D(0),
|
|
mAlpha(0),
|
|
field_0x4F(0),
|
|
mMapEvent(0) {
|
|
sInstance = this;
|
|
}
|
|
|
|
void dLytMapGlobal_c::projectOntoMap(
|
|
mVec2_c &result, const mVec3_c &position, const mVec3_c &mapScroll, const mVec3_c &mapRotationCenter, const mAng &rot,
|
|
f32 f1, f32 f2
|
|
) const {
|
|
// Initializing like this fixes regswaps, even if it's not needed...
|
|
mVec3_c work(0.0f, 0.0f, 0.0f);
|
|
|
|
work.x = position.x - mapRotationCenter.x;
|
|
work.z = position.z - mapRotationCenter.z;
|
|
work.y = 0.0f;
|
|
work.rotY(-rot);
|
|
|
|
work.x += mapRotationCenter.x - mapScroll.x;
|
|
work.z += mapRotationCenter.z - mapScroll.z;
|
|
|
|
work.x *= f2 * f1;
|
|
work.z *= f2 * f1;
|
|
work.x *= field_0x28.x;
|
|
|
|
result.x = work.x;
|
|
result.y = -work.z;
|
|
}
|
|
|
|
void dLytMapGlobal_c::projectOntoMap(mVec2_c &result, const mVec3_c &position) const {
|
|
projectOntoMap(result, position, mMapScroll, mMapRotationCenter, mMapRotation, field_0x44, field_0x40);
|
|
}
|
|
|
|
void dLytMapGlobal_c::unprojectFromMap(mVec3_c &result, const mVec2_c &position) const {
|
|
unprojectFromMap(
|
|
result, position, field_0x20, mMapScroll, mMapRotationCenter, mMapRotation, field_0x44, field_0x40
|
|
);
|
|
}
|
|
|
|
void dLytMapGlobal_c::unprojectFromMap(mVec3_c &result, const mVec2_c &position, const mAng &rot) const {
|
|
unprojectFromMap(result, position, field_0x20, mMapScroll, mMapRotationCenter, rot, field_0x44, field_0x40);
|
|
}
|
|
|
|
void dLytMapGlobal_c::unprojectFromMap(mVec3_c &result, const mVec2_c &position, const mVec3_c &v2, const mAng &rot)
|
|
const {
|
|
unprojectFromMap(result, position, field_0x20, v2, mMapRotationCenter, rot, field_0x44, field_0x40);
|
|
}
|
|
|
|
void dLytMapGlobal_c::unprojectFromMap(
|
|
mVec3_c &result, const mVec2_c &position, const mVec2_c &v1, const mVec3_c &mapScroll, const mVec3_c &mapRotationCenter,
|
|
const mAng &rot, f32 f1, f32 f2
|
|
) const {
|
|
mVec3_c work(0.0f, 0.0f, 0.0f);
|
|
|
|
f1 *= f2;
|
|
f32 tmp = 1.0f / f1;
|
|
mVec2_c diff = position - v1;
|
|
|
|
work.x = diff.x * tmp * (1.0f / field_0x28.x);
|
|
work.z = -diff.y * tmp;
|
|
|
|
work = work + mapScroll;
|
|
|
|
work = work - mapRotationCenter;
|
|
work.rotY(rot);
|
|
work += mapRotationCenter;
|
|
|
|
result = work;
|
|
}
|