summaryrefslogtreecommitdiff
path: root/src/d/bg/d_bg_w_sv.cpp
blob: 207d5193d32b6ac6b5459c27b353b15ff49947d2 (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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
/**
 * d_bg_w_sv.cpp
 *
 */

#include "d/bg/d_bg_w_sv.h"
#include "SSystem/SComponent/c_bg_s_chk.h"

/* 80082F98-80083020 07D8D8 0088+00 0/0 0/0 2/2 .text            Set__6dBgWSvFP6cBgD_tUl */
u8 dBgWSv::Set(cBgD_t* pbgd, u32 param_1) {
    if (cBgW::Set(pbgd, 99, NULL)) {
        return 1;
    }

    field_0xc4 = param_1;
    if (field_0xc4 & 1) {
        return 0;
    }

    field_0xc0 = new Vec[pm_bgd->m_v_num];
    return field_0xc0 == NULL;
}

/* 80083020-8008308C 07D960 006C+00 0/0 0/0 3/3 .text            CopyBackVtx__6dBgWSvFv */
void dBgWSv::CopyBackVtx() {
    if (field_0xc0 == NULL || pm_vtx_tbl == NULL) {
        return;
    }

    for (int i = 0; i < pm_bgd->m_v_num; i++) {
        field_0xc0[i] = pm_vtx_tbl[i];
    }
}

/* 8008308C-80083244 07D9CC 01B8+00 1/1 0/0 0/0 .text            CrrPosWork__6dBgWSvFP4cXyziii */
bool dBgWSv::CrrPosWork(cXyz* i_pos, int i_vtx0, int i_vtx1, int i_vtx2) {
    cXyz sp34;
    cXyz sp28;

    sp34.x = field_0xc0[i_vtx1].x - field_0xc0[i_vtx0].x;
    sp34.y = field_0xc0[i_vtx1].y - field_0xc0[i_vtx0].y;
    sp34.z = field_0xc0[i_vtx1].z - field_0xc0[i_vtx0].z;

    sp28.x = field_0xc0[i_vtx2].x - field_0xc0[i_vtx0].x;
    sp28.y = field_0xc0[i_vtx2].y - field_0xc0[i_vtx0].y;
    sp28.z = field_0xc0[i_vtx2].z - field_0xc0[i_vtx0].z;

    if (cM3d_IsZero(sp34.z) || cM3d_IsZero(sp28.z)) {
        return 1;
    }

    f32 temp_f8 = sp34.x - (sp34.z * (sp28.x / sp28.z));
    f32 temp_f5_2 = sp28.x - (sp28.z * (sp34.x / sp34.z));

    if (cM3d_IsZero(temp_f8) || cM3d_IsZero(temp_f5_2)) {
        return 1;
    }

    i_pos->x -= field_0xc0[i_vtx0].x;
    i_pos->z -= field_0xc0[i_vtx0].z;

    cXyz sp14;
    cXyz sp8;

    f32 temp_f6_2 = (i_pos->x - (i_pos->z * (sp28.x / sp28.z))) / temp_f8;
    f32 temp_f7_2 = (i_pos->x - (i_pos->z * (sp34.x / sp34.z))) / temp_f5_2;

    sp14.x = pm_vtx_tbl[i_vtx1].x - pm_vtx_tbl[i_vtx0].x;
    sp14.z = pm_vtx_tbl[i_vtx1].z - pm_vtx_tbl[i_vtx0].z;

    sp8.x = pm_vtx_tbl[i_vtx2].x - pm_vtx_tbl[i_vtx0].x;
    sp8.z = pm_vtx_tbl[i_vtx2].z - pm_vtx_tbl[i_vtx0].z;

    i_pos->x = (temp_f6_2 * sp14.x) + (temp_f7_2 * sp8.x);
    i_pos->z = (temp_f6_2 * sp14.z) + (temp_f7_2 * sp8.z);

    i_pos->x += pm_vtx_tbl[i_vtx0].x;
    i_pos->z += pm_vtx_tbl[i_vtx0].z;

    return 0;
}

/* 80083244-80083300 07DB84 00BC+00 1/0 0/0 0/0 .text
 * CrrPos__6dBgWSvFRC13cBgS_PolyInfoPvbP4cXyzP5csXyzP5csXyz     */
void dBgWSv::CrrPos(cBgS_PolyInfo const& i_poly, void* i_actor_ptr, bool param_2, cXyz* i_pos,
                    csXyz* i_angle, csXyz* i_shapeAngle) {
    if (!(field_0xc4 & 1) && param_2) {
        int poly_idx = i_poly.GetPolyIndex();
        int vtx0 = pm_bgd->m_t_tbl[poly_idx].m_vtx_idx0;
        int vtx1 = pm_bgd->m_t_tbl[poly_idx].m_vtx_idx1;
        int vtx2 = pm_bgd->m_t_tbl[poly_idx].m_vtx_idx2;

        if (CrrPosWork(i_pos, vtx0, vtx1, vtx2) && CrrPosWork(i_pos, vtx1, vtx2, vtx0)) {
            CrrPosWork(i_pos, vtx2, vtx0, vtx1);
        }
    }
}

/* 80083300-8008351C 07DC40 021C+00 1/1 0/0 0/0 .text            TransPosWork__6dBgWSvFP4cXyziii */
bool dBgWSv::TransPosWork(cXyz* i_pos, int i_vtx0, int i_vtx1, int i_vtx2) {
    cXyz sp34;
    cXyz sp28;

    sp34.x = field_0xc0[i_vtx1].x - field_0xc0[i_vtx0].x;
    sp34.y = field_0xc0[i_vtx1].y - field_0xc0[i_vtx0].y;
    sp34.z = field_0xc0[i_vtx1].z - field_0xc0[i_vtx0].z;

    sp28.x = field_0xc0[i_vtx2].x - field_0xc0[i_vtx0].x;
    sp28.y = field_0xc0[i_vtx2].y - field_0xc0[i_vtx0].y;
    sp28.z = field_0xc0[i_vtx2].z - field_0xc0[i_vtx0].z;

    if (cM3d_IsZero(sp34.z) || cM3d_IsZero(sp28.z)) {
        return 1;
    }

    f32 temp_f8 = sp34.x - (sp34.z * (sp28.x / sp28.z));
    f32 temp_f5_2 = sp28.x - (sp28.z * (sp34.x / sp34.z));

    if (cM3d_IsZero(temp_f8) || cM3d_IsZero(temp_f5_2)) {
        return 1;
    }

    f32 temp_f3 = i_pos->x - field_0xc0[i_vtx0].x;
    f32 temp_f4 = i_pos->z - field_0xc0[i_vtx0].z;

    f32 temp_f6_2 = (temp_f3 - (temp_f4 * (sp28.x / sp28.z))) / temp_f8;
    f32 temp_f7_2 = (temp_f3 - (temp_f4 * (sp34.x / sp34.z))) / temp_f5_2;

    if (temp_f6_2 < 0.0f || temp_f6_2 > 1.0f || temp_f7_2 < 0.0f || temp_f7_2 > 1.0f) {
        return 1;
    }

    cXyz sp14;
    cXyz sp8;

    sp14.x = pm_vtx_tbl[i_vtx1].x - pm_vtx_tbl[i_vtx0].x;
    sp14.y = pm_vtx_tbl[i_vtx1].y - pm_vtx_tbl[i_vtx0].y;
    sp14.z = pm_vtx_tbl[i_vtx1].z - pm_vtx_tbl[i_vtx0].z;

    sp8.x = pm_vtx_tbl[i_vtx2].x - pm_vtx_tbl[i_vtx0].x;
    sp8.y = pm_vtx_tbl[i_vtx2].y - pm_vtx_tbl[i_vtx0].y;
    sp8.z = pm_vtx_tbl[i_vtx2].z - pm_vtx_tbl[i_vtx0].z;

    i_pos->x = (temp_f6_2 * sp14.x) + (temp_f7_2 * sp8.x);
    i_pos->y = (temp_f6_2 * sp14.y) + (temp_f7_2 * sp8.y);
    i_pos->z = (temp_f6_2 * sp14.z) + (temp_f7_2 * sp8.z);

    i_pos->x += pm_vtx_tbl[i_vtx0].x;
    i_pos->y += pm_vtx_tbl[i_vtx0].y;
    i_pos->z += pm_vtx_tbl[i_vtx0].z;

    return 0;
}

/* 8008351C-800835D8 07DE5C 00BC+00 1/0 0/0 0/0 .text
 * TransPos__6dBgWSvFRC13cBgS_PolyInfoPvbP4cXyzP5csXyzP5csXyz   */
void dBgWSv::TransPos(cBgS_PolyInfo const& i_poly, void* i_actor_ptr, bool param_2, cXyz* i_pos,
                      csXyz* i_angle, csXyz* i_shapeAngle) {
    if (!(field_0xc4 & 1) && param_2) {
        int poly_idx = i_poly.GetPolyIndex();
        int vtx0 = pm_bgd->m_t_tbl[poly_idx].m_vtx_idx0;
        int vtx1 = pm_bgd->m_t_tbl[poly_idx].m_vtx_idx1;
        int vtx2 = pm_bgd->m_t_tbl[poly_idx].m_vtx_idx2;

        if (TransPosWork(i_pos, vtx0, vtx1, vtx2) && TransPosWork(i_pos, vtx1, vtx2, vtx0)) {
            TransPosWork(i_pos, vtx2, vtx0, vtx1);
        }
    }
}

/* 800835D8-800835DC 07DF18 0004+00 1/0 0/0 0/0 .text
 * MatrixCrrPos__6dBgWSvFRC13cBgS_PolyInfoPvbP4cXyzP5csXyzP5csXyz */
void dBgWSv::MatrixCrrPos(cBgS_PolyInfo const& i_poly, void* i_actor_ptr, bool param_2, cXyz* i_pos,
                          csXyz* i_angle, csXyz* i_shapeAngle) {}