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
|
/**
* d_bg_w_sv.cpp
*
*/
#include "d/dolzel.h" // IWYU pragma: keep
#include "d/d_bg_w_sv.h"
#include "SSystem/SComponent/c_bg_s_chk.h"
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;
}
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];
}
}
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;
}
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);
}
}
}
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;
}
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);
}
}
}
void dBgWSv::MatrixCrrPos(cBgS_PolyInfo const& i_poly, void* i_actor_ptr, bool param_2, cXyz* i_pos,
csXyz* i_angle, csXyz* i_shapeAngle) {}
|