summaryrefslogtreecommitdiff
path: root/src/d/lyt/d_lyt_map_global.cpp
blob: 405f9d159a894676099d63730f12f70a4775ccd6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#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;
}