d_jnt_col OK (#2180)

This commit is contained in:
hatal175
2024-07-16 06:13:26 +03:00
committed by GitHub
parent 09beea4a09
commit 038cdb8b5f
7 changed files with 229 additions and 1398 deletions
+227 -168
View File
@@ -1,85 +1,13 @@
//
// Generated By: dol2asm
// Translation Unit: d/d_jnt_col
// d_jnt_col
//
#include "d/d_jnt_col.h"
#include "dol2asm.h"
#include "SSystem/SComponent/c_math.h"
#include "SSystem/SComponent/c_m3d_g_sph.h"
#include "SSystem/SComponent/c_m3d_g_cyl.h"
#include "f_op/f_op_actor_mng.h"
//
// Types:
//
struct cM3dGSph {
/* 80036AA4 */ ~cM3dGSph();
/* 8026F664 */ void Set(cXyz const&, f32);
};
struct cM3dGCyl {
/* 8026F180 */ void Set(cXyz const&, f32, f32);
};
//
// Forward References:
//
extern "C" void __ct__9dJntCol_cFv();
extern "C" void init__9dJntCol_cFP10fopAc_ac_cPC13dJntColData_cP8J3DModeli();
extern "C" void setNowLine__9dJntCol_cFP8cM3dGLinPC4cXyzPC5csXyzP4cXyz();
extern "C" void searchNearPos__9dJntCol_cCFPC8cM3dGLinPC4cXyzP4cXyzi();
extern "C" void __dt__8cM3dGLinFv();
extern "C" void __dt__8cM3dGSphFv();
extern "C" void getArrowOffsetPosAndAngle__9dJntCol_cCFPC4cXyzPC5csXyzP4cXyzP4cXyz();
extern "C" void getHitmarkPosAndAngle__9dJntCol_cCFPC4cXyzPC5csXyzP4cXyzP5csXyzi();
extern "C" void setArrowPosAndAngle__9dJntCol_cFPC4cXyzPC4cXyziP4cXyzP5csXyz();
//
// External References:
//
extern "C" void mDoMtx_XrotM__FPA4_fs();
extern "C" void mDoMtx_YrotM__FPA4_fs();
extern "C" void transS__14mDoMtx_stack_cFRC4cXyz();
extern "C" void transM__14mDoMtx_stack_cFfff();
extern "C" void ZXYrotS__14mDoMtx_stack_cFRC5csXyz();
extern "C" void __pl__4cXyzCFRC3Vec();
extern "C" void __mi__4cXyzCFRC3Vec();
extern "C" void __ml__4cXyzCFf();
extern "C" void __dv__4cXyzCFf();
extern "C" void normalizeZP__4cXyzFv();
extern "C" void atan2sX_Z__4cXyzCFv();
extern "C" void atan2sY_XZ__4cXyzCFv();
extern "C" void cM_atan2s__Fff();
extern "C" void cM3d_SignedLenPlaAndPos__FPC8cM3dGPlaPC3Vec();
extern "C" void cM3d_Cross_LinPla__FPC8cM3dGLinPC8cM3dGPlaP3Vecbb();
extern "C" void cM3d_Cross_LinSph_CrossPos__FRC8cM3dGSphRC8cM3dGLinP3VecP3Vec();
extern "C" void cM3d_Cross_CylLin__FPC8cM3dGCylPC8cM3dGLinP3VecP3Vec();
extern "C" void cM3d_lineVsPosSuisenCross__FPC8cM3dGLinPC3VecP3Vec();
extern "C" void cM3d_lineVsPosSuisenCross__FRC3VecRC3VecRC3VecP3Vec();
extern "C" void Set__8cM3dGCylFRC4cXyzff();
extern "C" void SetStartEnd__8cM3dGLinFRC4cXyzRC4cXyz();
extern "C" void crossInfLin__8cM3dGPlaCFRC4cXyzRC4cXyzR4cXyz();
extern "C" void SetupNP0__8cM3dGPlaFRC3VecRC3Vec();
extern "C" void Set__8cM3dGSphFRC4cXyzf();
extern "C" void __dl__FPv();
extern "C" void _savegpr_19();
extern "C" void _savegpr_27();
extern "C" void _savegpr_28();
extern "C" void _savegpr_29();
extern "C" void _restgpr_19();
extern "C" void _restgpr_27();
extern "C" void _restgpr_28();
extern "C" void _restgpr_29();
extern "C" extern void* __vt__8cM3dGPla[3];
extern "C" extern void* __vt__8cM3dGCyl[3];
extern "C" u8 now__14mDoMtx_stack_c[48];
extern "C" u8 BaseZ__4cXyz[12];
//
// Declarations:
//
/* 80035C8C-80035CA0 0305CC 0014+00 0/0 1/1 8/8 .text __ct__9dJntCol_cFv */
dJntCol_c::dJntCol_c() {
mModel = 0;
@@ -119,109 +47,240 @@ void dJntCol_c::setNowLine(cM3dGLin* i_line, cXyz const* param_1, csXyz const* p
i_line->SetStartEnd(start_pos, end_pos);
}
/* ############################################################################################## */
/* 803A78F8-803A7904 004A18 000C+00 4/4 21/21 0/0 .data __vt__8cM3dGLin */
SECTION_DATA extern void* __vt__8cM3dGLin[3] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__8cM3dGLinFv,
};
/* 803A7904-803A7910 004A24 000C+00 2/2 10/10 0/0 .data __vt__8cM3dGSph */
SECTION_DATA extern void* __vt__8cM3dGSph[3] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__8cM3dGSphFv,
};
/* 80451D64-80451D68 000364 0004+00 1/1 0/0 0/0 .sdata2 @4141 */
SECTION_SDATA2 static f32 lit_4141 = -10000000.0f;
/* 80451D68-80451D70 000368 0004+04 2/2 0/0 0/0 .sdata2 @4142 */
SECTION_SDATA2 static f32 lit_4142[1 + 1 /* padding */] = {
0.0f,
/* padding */
0.0f,
};
/* 80451D70-80451D78 000370 0008+00 2/2 0/0 0/0 .sdata2 @4143 */
SECTION_SDATA2 static f64 lit_4143 = 0.5;
/* 80451D78-80451D80 000378 0008+00 2/2 0/0 0/0 .sdata2 @4144 */
SECTION_SDATA2 static f64 lit_4144 = 3.0;
/* 80451D80-80451D88 000380 0008+00 2/2 0/0 0/0 .sdata2 @4145 */
SECTION_SDATA2 static u8 lit_4145[8] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
/* 80451D88-80451D8C 000388 0004+00 1/1 0/0 0/0 .sdata2 @4146 */
SECTION_SDATA2 static f32 lit_4146 = 1.0f / 100.0f;
/* 80451D8C-80451D90 00038C 0004+00 2/2 0/0 0/0 .sdata2 @4147 */
SECTION_SDATA2 static f32 lit_4147 = 9.999999747378752e-05f;
/* 80451D90-80451D94 000390 0004+00 1/1 0/0 0/0 .sdata2 @4148 */
SECTION_SDATA2 static f32 lit_4148 = 0.5f;
/* 80451D94-80451D98 000394 0004+00 1/1 0/0 0/0 .sdata2 @4149 */
SECTION_SDATA2 static f32 lit_4149 = 1.0f;
/* 80035DC8-80036A5C 030708 0C94+00 2/2 0/0 0/0 .text
* searchNearPos__9dJntCol_cCFPC8cM3dGLinPC4cXyzP4cXyzi */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void dJntCol_c::searchNearPos(cM3dGLin const* param_0, cXyz const* param_1, cXyz* param_2,
int param_3) const {
nofralloc
#include "asm/d/d_jnt_col/searchNearPos__9dJntCol_cCFPC8cM3dGLinPC4cXyzP4cXyzi.s"
int dJntCol_c::searchNearPos(cM3dGLin const* param_1, cXyz const* param_2, cXyz* param_3,
int param_4) const {
const dJntColData_c* pcVar12 = mData;
cXyz const* pcVar9 = param_2;
cM3dGSph acStack_a0;
cM3dGCyl acStack_b8;
cM3dGPla acStack_d0;
cXyz cStack_f8;
cXyz local_104;
cXyz cStack_110;
cXyz cStack_11c;
cXyz local_128;
cXyz cStack_134;
cM3dGLin acStack_ec;
cXyz cStack_140;
cXyz cStack_14c;
f32 dVar17;
f32 dVar18 = FLT_MAX;
int bVar5 = FALSE;
int rv = -1;
dVar17 = -10000000.0f;
for (int i = 0; i < field_0x8; i++, pcVar12++) {
if ((field_0xc & (1 << i)) == 0 &&
(param_4 == 0 || pcVar12->mType == 3))
{
MtxP dst = mModel->getAnmMtx(pcVar12->mJntNum);
mDoMtx_stack_c::copy(dst);
mDoMtx_stack_c::multVec(pcVar12->field_0x8, &local_128);
if (pcVar12->field_0x0 == 0) {
acStack_a0.Set(local_128, pcVar12->field_0x4);
int iVar6 = cM3d_Cross_LinSph_CrossPos(acStack_a0, *param_1, &cStack_110,
&cStack_11c);
if (iVar6 != 0) {
if (iVar6 == 1) {
cStack_f8 = cStack_110;
} else {
f32 dVar15 = cStack_11c.abs2(param_1->GetStart());
f32 dVar16 = cStack_110.abs2(param_1->GetStart());
if (dVar16 < dVar15) {
cStack_f8 = cStack_110;
} else {
cStack_f8 = cStack_11c;
}
}
} else {
local_104 = *param_2 - local_128;
local_104.normalizeZP();
cStack_f8 = local_128 + local_104 * pcVar12->field_0x4;
}
} else if (pcVar12->field_0x0 == 1) {
mDoMtx_stack_c::multVec(pcVar12->field_0x8 + 1, &cStack_134);
local_104 = cStack_134 - local_128;
int bVar13;
if (local_104.absXZ() > 0.01f) {
mDoMtx_stack_c::transS(local_128);
mDoMtx_stack_c::XrotM(cM_atan2s(-local_104.absXZ(), local_104.y));
mDoMtx_stack_c::YrotM(cM_atan2s(-local_104.x, local_104.z));
mDoMtx_stack_c::transM(-local_128.x, -local_128.y, -local_128.z);
mDoMtx_stack_c::multVec(&cStack_134, &cStack_11c);
mDoMtx_stack_c::multVec(&param_1->GetStartP(), &cStack_140);
mDoMtx_stack_c::multVec(&param_1->GetEndP(), &cStack_14c);
acStack_ec.SetStartEnd(cStack_140, cStack_14c);
bVar13 = 1;
} else {
cStack_11c = cStack_134;
acStack_ec.SetStartEnd(param_1->GetStart(), param_1->GetEnd());
bVar13 = 0;
}
acStack_b8.Set(local_128, pcVar12->field_0x4,
cStack_11c.y - local_128.y);
if (cM3d_Cross_CylLin(&acStack_b8, &acStack_ec, &cStack_110, &cStack_11c)) {
if (bVar13) {
mDoMtx_stack_c::inverse();
mDoMtx_stack_c::multVec(&cStack_110, &cStack_f8);
} else {
cStack_f8 = cStack_110;
}
} else {
acStack_ec.SetStartEnd(local_128, cStack_134);
f32 dVar15 = cM3d_lineVsPosSuisenCross(&acStack_ec, param_2,
&cStack_110);
local_104 = *param_2 - cStack_110;
f32 dVar16 = local_104.abs2();
if (dVar16 < 9.999999747378752e-05f) {
cStack_110 = acStack_ec.GetStart() - acStack_ec.GetEnd();
cStack_11c = param_1->GetStart() - param_1->GetEnd();
f32 inprod = cStack_110.inprod(cStack_11c);
if (inprod > 0.0f) {
cStack_f8 = acStack_ec.GetEnd();
} else if (inprod < 0.0f) {
cStack_f8 = acStack_ec.GetStart();
} else if (dVar15 < 0.5f) {
cStack_f8 = acStack_ec.GetStart();
} else {
cStack_f8 = acStack_ec.GetEnd();
}
} else {
if (dVar15 >= 0.0f && dVar15 <= 1.0f) {
cStack_f8 = cStack_110 + (local_104 / JMAFastSqrt(dVar16)) * pcVar12->field_0x4;
} else {
cStack_110 = acStack_ec.GetStart() - acStack_ec.GetEnd();
cStack_11c = param_1->GetStart() - param_1->GetEnd();
f32 dVar14 = cStack_110.inprod(cStack_11c);
if (dVar14 > 0.0f) {
cStack_110 = acStack_ec.GetEnd();
} else {
if (dVar14 < 0.0f) {
cStack_110 = acStack_ec.GetStart();
} else {
if (dVar15 < 0.5f) {
cStack_110 = acStack_ec.GetStart();
} else {
cStack_110 = acStack_ec.GetEnd();
}
}
}
cStack_f8 = cStack_110 + (local_104 / JMAFastSqrt(dVar16)) * pcVar12->field_0x4;
}
}
}
} else {
mDoMtx_stack_c::multVecSR(pcVar12->field_0x8 + 1, &local_104);
acStack_d0.SetupNP0(local_104, local_128);
if (cM3d_Cross_LinPla(param_1, &acStack_d0, &cStack_f8, true, true)) {
if (!(local_128.abs(cStack_f8) < pcVar12->field_0x4)) {
local_104 = cStack_f8 - local_128;
local_104.normalizeZP();
cStack_f8 = local_128 + local_104 * pcVar12->field_0x4;
}
} else {
if (acStack_d0.crossInfLin(*param_2, param_1->GetEnd(), cStack_f8)) {
local_104 = cStack_f8 - local_128;
local_104.normalizeZP();
cStack_f8 = local_128 + local_104 * pcVar12->field_0x4;
} else {
f32 pla = cM3d_SignedLenPlaAndPos(&acStack_d0, param_2);
local_104.normalizeZP();
cStack_f8 = *param_2 - local_104 * pla;
}
}
}
f32 cross = cM3d_lineVsPosSuisenCross(param_1, &cStack_f8, &cStack_110);
f32 dVar16 = cStack_f8.abs2(cStack_110);
if (dVar16 < 9.999999747378752e-05f) {
if (!bVar5 || dVar17 < cross) {
dVar17 = cross;
*param_3 = cStack_f8;
rv = i;
bVar5 = TRUE;
}
} else {
if (!bVar5 && (dVar18 >= dVar16)) {
dVar18 = dVar16;
*param_3 = cStack_f8;
rv = i;
}
}
}
;
}
return rv;
}
#pragma pop
/* 80036A5C-80036AA4 03139C 0048+00 1/0 3/3 0/0 .text __dt__8cM3dGLinFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
extern "C" asm void __dt__8cM3dGLinFv() {
nofralloc
#include "asm/d/d_jnt_col/__dt__8cM3dGLinFv.s"
}
#pragma pop
/* 80036AA4-80036AEC 0313E4 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGSphFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm cM3dGSph::~cM3dGSph() {
nofralloc
#include "asm/d/d_jnt_col/__dt__8cM3dGSphFv.s"
}
#pragma pop
/* 80036AEC-80036C44 03142C 0158+00 0/0 0/0 1/1 .text
* getArrowOffsetPosAndAngle__9dJntCol_cCFPC4cXyzPC5csXyzP4cXyzP4cXyz */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm int dJntCol_c::getArrowOffsetPosAndAngle(cXyz const* param_0, csXyz const* param_1,
cXyz* param_2, cXyz* param_3) const {
nofralloc
#include "asm/d/d_jnt_col/getArrowOffsetPosAndAngle__9dJntCol_cCFPC4cXyzPC5csXyzP4cXyzP4cXyz.s"
int dJntCol_c::getArrowOffsetPosAndAngle(cXyz const* param_1, csXyz const* param_2,
cXyz* param_3, cXyz* param_4) const {
cM3dGLin acStack_34;
cXyz cStack_40;
setNowLine(&acStack_34, param_1, param_2, &cStack_40);
cXyz cStack_4c;
int iVar1 = searchNearPos(&acStack_34, param_1, &cStack_4c, 0);
if (iVar1 < 0) {
return -3;
}
const dJntColData_c* jntColData = &mData[iVar1];
if (jntColData->mType == 0) {
return -3;
}
if (jntColData->mType == 2) {
return -1;
}
if (jntColData->mType == 3) {
return -2;
}
mDoMtx_stack_c::copy(mModel->getAnmMtx(jntColData->mJntNum));
mDoMtx_stack_c::inverse();
mDoMtx_stack_c::multVecSR(&cStack_40, param_4);
mDoMtx_stack_c::multVec(&cStack_4c, param_3);
return jntColData->mJntNum;
}
#pragma pop
/* 80036C44-80036FA8 031584 0364+00 0/0 3/3 0/0 .text
* getHitmarkPosAndAngle__9dJntCol_cCFPC4cXyzPC5csXyzP4cXyzP5csXyzi */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm int dJntCol_c::getHitmarkPosAndAngle(cXyz const* param_0, csXyz const* param_1, cXyz* param_2,
csXyz* param_3, int param_4) const {
nofralloc
#include "asm/d/d_jnt_col/getHitmarkPosAndAngle__9dJntCol_cCFPC4cXyzPC5csXyzP4cXyzP5csXyzi.s"
int dJntCol_c::getHitmarkPosAndAngle(cXyz const* param_1, csXyz const* param_2, cXyz* param_3,
csXyz* param_4, int param_5) const {
cM3dGLin acStack_54;
cXyz cStack_60;
setNowLine(&acStack_54, param_1, param_2, &cStack_60);
int iVar3 = searchNearPos(&acStack_54, param_1, param_3, param_5);
if (iVar3 < 0) {
return -1;
}
const dJntColData_c* jntColData = &mData[iVar3];
cXyz cStack_6c;
cXyz local_78;
mDoMtx_stack_c::copy(mModel->getAnmMtx(jntColData->mJntNum));
mDoMtx_stack_c::multVec(jntColData->field_0x8, &cStack_6c);
if (jntColData->field_0x0 == 0) {
local_78 = *param_3 - cStack_6c;
} else if (jntColData->field_0x0 == 1) {
cXyz cStack_84;
cXyz cStack_90;
mDoMtx_stack_c::multVec(jntColData->field_0x8 + 1, &cStack_84);
cM3d_lineVsPosSuisenCross(cStack_6c, cStack_84, *param_3, &cStack_90);
local_78 = *param_3 - cStack_90;
if (local_78.abs2() < 9.999999747378752e-05f) {
if (param_3->abs2(cStack_6c) < param_3->abs2(cStack_84)) {
local_78 = cStack_6c - cStack_84;
} else {
local_78 = cStack_84 - cStack_6c;
}
}
} else {
mDoMtx_stack_c::multVecSR(jntColData->field_0x8 + 1, &local_78);
}
param_4->x = cM_atan2s(local_78.y, local_78.absXZ());
param_4->y = cM_atan2s(-local_78.x, -local_78.z);
param_4->z = 0;
return iVar3;
}
#pragma pop
/* 80036FA8-80037038 0318E8 0090+00 0/0 0/0 1/1 .text
* setArrowPosAndAngle__9dJntCol_cFPC4cXyzPC4cXyziP4cXyzP5csXyz */