mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-05-28 07:54:51 -04:00
15732e241c
* Undo array allocation changes from #43 Doesn't work * Expand dmeter heap sizes, give names * Fix manual operator delete call in resource.cpp * Disable map rendering for now Aurora can't handle lines * Re-enable assert heap on DVD thread Should be fine? * Some basic debug groups with the new Aurora API * Allow Aurora backend to be set via CLI * Give materials debug groups * More debug groups * JKRHeap separation: array edition Pain
167 lines
5.0 KiB
C++
167 lines
5.0 KiB
C++
/**
|
|
* 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 = JKR_NEW_ARRAY(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) {}
|