Files
tww/src/d/d_jnt_hit.cpp
T
LagoLunatic 5bfb7b1823 d_jnt_hit OK
2023-12-22 13:57:27 -05:00

417 lines
13 KiB
C++

//
// Generated by dtk
// Translation Unit: d_jnt_hit.cpp
//
#include "d/d_jnt_hit.h"
#include "m_Do/m_Do_mtx.h"
#include "SSystem/SComponent/c_math.h"
#include "SSystem/SComponent/c_lib.h"
/* 80060BE8-80060C44 .text __ct__12JntHit_HIO_cFv */
JntHit_HIO_c::JntHit_HIO_c() {
m06 = 0;
m08 = 0;
m0C = 50.0f;
m10 = cXyz::Zero;
m1C = 0.0f;
m20 = 0.0f;
m24 = 100.0f;
mChildID = -1;
}
/* 80060C44-80060EC4 .text CreateInit__8JntHit_cFv */
BOOL JntHit_c::CreateInit() {
__jnt_hit_data_c* pHitData = mpSearchData;
int posCount = 0;
int i;
for (i = 0; i < mMaxNum; i++) {
if (isCylinder(pHitData->mShapeType)) {
posCount += 2;
} else if (isSphere(pHitData->mShapeType)) {
posCount += 1;
}
pHitData++;
}
mpShapeTypes = new s16[mMaxNum];
mpOffsets = new cXyz[posCount];
mpRadiuses = new f32[mMaxNum];
mpJointIndexes = new s16[mMaxNum];
if (!mpShapeTypes || !mpOffsets || !mpRadiuses || !mpJointIndexes) {
return FALSE;
}
pHitData = mpSearchData;
s16* pShapeType = mpShapeTypes;
s16* pJointIndex = mpJointIndexes;
f32* pRadius = mpRadiuses;
cXyz* pOffset = mpOffsets;
for (i = 0; i < mMaxNum;) {
pShapeType[0] = pHitData->mShapeType;
pJointIndex[0] = pHitData->mJointIndex;
pRadius[0] = pHitData->mRadius;
if (isCylinder(pShapeType[0])) {
pOffset[0] = pHitData->mpOffsets[0];
pOffset[1] = pHitData->mpOffsets[1];
pOffset++;
} else if (isSphere(pShapeType[0])) {
pOffset[0] = pHitData->mpOffsets[0];
}
pOffset++;
i++;
pHitData++;
pShapeType++;
pJointIndex++;
pRadius++;
}
return TRUE;
}
/* 80060EC4-80061440 .text CylHitPosAngleOffset__8JntHit_cFP4cXyzP5csXyzP4cXyzP5csXyz4cXyz4cXyzf */
BOOL JntHit_c::CylHitPosAngleOffset(cXyz* r27, csXyz* r28, cXyz* r29, csXyz* r30, cXyz r31, cXyz r9, f32 f28) {
cXyz r1_100 = r9 - r31;
cXyz r1_F4 = r1_100.normZP();
f32 f30 = r1_100.abs();
f32 f1 = r27->inprod(r1_F4);
cXyz r1_E8;
cXyz r1_DC = *r27;
cXyz r1_D0 = r1_F4;
r1_D0 *= f1;
r1_DC -= r1_D0;
f32 sinX = cM_ssin(r28->x);
f32 cosX = cM_scos(r28->x);
f32 x = cM_ssin(r28->y) * cosX;
f32 z = cM_scos(r28->y) * cosX;
cXyz r1_C4(x, -sinX, z);
f1 = r1_C4.inprod(r1_F4);
cXyz r1_B8 = r1_C4;
r1_D0 = r1_F4;
r1_D0 *= f1;
r1_B8 -= r1_D0;
if (r1_B8.normalizeRS()) {
f32 f31 = r1_DC.inprod(r1_B8);
f32 temp = f31*f31 + f28*f28 - r1_DC.abs2();
if (temp < 0.0f)
temp = 0.0f;
r1_E8 = r1_C4 * (-f31 - sqrtf(temp));
r1_E8 += *r27;
if (temp == 0.0f) {
cXyz r1_AC = r1_E8;
r1_AC -= r1_F4 * r1_E8.inprod(r1_F4);
r1_AC.normalizeZP();
r1_AC = r1_AC * f28;
r1_AC += r1_F4 * r1_E8.inprod(r1_F4);
r1_E8 = r1_AC;
}
} else {
r1_E8 = *r27;
cXyz r1_A0 = *r27;
r1_A0 -= r1_F4 * r1_E8.inprod(r1_F4);
r1_A0.normalizeZP();
r1_A0 = r1_A0 * f28;
r1_A0 += r1_F4 * r1_E8.inprod(r1_F4);
r1_E8 = r1_A0;
}
f32 temp = r1_E8.inprod(r1_F4);
f32 temp2 = 0.0f;
if (temp < 0.0f)
temp2 = -temp;
else if (temp > f30)
temp2 = f30 - temp;
r1_E8 += r1_F4 * temp2;
r1_E8 += r31;
mDoMtx_stack_c::inverse();
mDoMtx_stack_c::transM(r1_E8);
mDoMtx_stack_c::ZXYrotM(*r28);
mDoMtx_stack_c::multVecZero(r29);
mDoMtx_MtxToRot(mDoMtx_stack_c::get(), r30);
return TRUE;
}
/* 80061440-80061830 .text Cyl2HitPosAngleOffset__8JntHit_cFP4cXyzP5csXyzP4cXyzP5csXyz4cXyz4cXyzf */
BOOL JntHit_c::Cyl2HitPosAngleOffset(cXyz* r27, csXyz* r29, cXyz* r30, csXyz* r31, cXyz r28, cXyz r9, f32 f31) {
cXyz r1_94 = r9 - r28;
cXyz r1_88 = r1_94.normZP();
f32 f29 = r1_94.abs();
f32 f30 = r27->inprod(r1_88);
f32 sinX = cM_ssin(r29->x);
f32 cosX = cM_scos(r29->x);
f32 x = cM_ssin(r29->y) * cosX;
f32 z = cM_scos(r29->y) * cosX;
cXyz r1_7C;
cXyz r1_70(x, -sinX, z);
f32 f1 = r1_70.inprod(r1_88);
if (!(fabsf(f1) < cXyz::getNearZeroValue())) { // TODO: is this an inline?
if (f1 > 0.0f) {
f1 = -f30 / f1;
} else {
f1 = (f29 - f30) / f1;
}
cXyz r1_64 = r1_70;
r1_64 *= f1;
r1_7C = *r27 + r1_64;
} else {
r1_7C = *r27;
}
cXyz r1_58 = r1_7C;
f32 temp = r1_58.inprod(r1_88);
cXyz r1_4C = r1_88;
r1_4C *= temp;
r1_58 -= r1_4C;
cXyz r1_40 = r1_58;
if (r1_58.abs() > f31 && r1_58.normalizeRS()) {
r1_58 *= f31;
r1_58 = r1_40 - r1_58;
r1_7C -= r1_58;
}
r1_7C += r28;
mDoMtx_stack_c::inverse();
mDoMtx_stack_c::transM(r1_7C);
mDoMtx_stack_c::ZXYrotM(*r29);
mDoMtx_stack_c::multVecZero(r30);
mDoMtx_MtxToRot(mDoMtx_stack_c::get(), r31);
return TRUE;
}
/* 80061830-80061ACC .text SphHitPosAngleOffset__8JntHit_cFP4cXyzP5csXyzP4cXyzP5csXyz4cXyzf */
BOOL JntHit_c::SphHitPosAngleOffset(cXyz* r27, csXyz* r29, cXyz* r30, csXyz* r31, cXyz r28, f32 f30) {
f32 sinX = cM_ssin(r29->x);
f32 cosX = cM_scos(r29->x);
f32 x = cM_ssin(r29->y) * cosX;
f32 z = cM_scos(r29->y) * cosX;
cXyz r1_34(x, -sinX, z);
f32 f31 = r27->inprod(r1_34);
f32 temp = f31*f31 + f30*f30 - r27->abs2();
if (temp < 0.0f)
temp = 0.0f;
cXyz r1_28 = r1_34 * (-f31 - sqrtf(temp));
r1_28 += *r27;
if (r1_28.abs() > f30) {
r1_28.normalizeZP();
r1_28 *= f30;
}
r1_28 += r28;
mDoMtx_stack_c::inverse();
mDoMtx_stack_c::transM(r1_28);
mDoMtx_stack_c::ZXYrotM(*r29);
mDoMtx_stack_c::multVecZero(r30);
mDoMtx_MtxToRot(mDoMtx_stack_c::get(), r31);
return TRUE;
}
/* 80061ACC-80061C28 .text HitBufferUpdate__8JntHit_cFPiP4cXyziP5csXyzP4cXyz */
BOOL JntHit_c::HitBufferUpdate(int* r28, cXyz* r29, int r30, csXyz* r31, cXyz* r27) {
mDoMtx_stack_c::copy(mpModel->getAnmMtx(r30));
cXyz r1_2C;
mDoMtx_stack_c::multVec(r27, &r1_2C);
if (*r28 >= 0) {
cXyz r1_20(
cM_scos(r31->x) * cM_ssin(r31->y),
-cM_ssin(r31->x),
cM_scos(r31->x) * cM_scos(r31->y)
);
cXyz r1_14 = r1_2C - *r29;
if (r1_14.inprod(r1_20) < 0.0f) {
*r28 = r30;
*r29 = r1_2C;
return TRUE;
} else {
return FALSE;
}
} else {
*r28 = r30;
*r29 = r1_2C;
return TRUE;
}
}
/* 80061C28-800627DC .text searchJntHitPosAngleOffset__8JntHit_cFP4cXyzP5csXyzP4cXyzP5csXyz */
s32 JntHit_c::searchJntHitPosAngleOffset(cXyz* r18, csXyz* r28, cXyz* r29, csXyz* r30) {
cXyz r1_1A0;
cXyz r1_194;
cXyz r1_188;
cXyz r1_17C;
cXyz r1_170;
cXyz r1_164;
cXyz r1_158;
cXyz r1_14C;
cXyz r1_140;
cXyz r1_134;
cXyz r1_128;
cXyz r1_11C;
cXyz r1_110;
cXyz r1_104;
cXyz r1_2C;
csXyz r1_24;
J3DModel* model = mpModel;
f32 f31 = 10000.0f;
int j = 0;
int jointIndex = -1;
s16* pShapeType = mpShapeTypes;
s16* pJointIndex = mpJointIndexes;
f32* pRadius = mpRadiuses;
cXyz* pOffset = mpOffsets;
int i = 0;
int posIndex = 0;
int hitIndex = 0;
int hitPosIndex = 0;
int r1_20 = -1;
for (; j++ < mMaxNum; i++) {
mDoMtx_stack_c::copy(model->getAnmMtx(*pJointIndex));
if (isCylinder(*pShapeType)) {
mDoMtx_stack_c::multVec(pOffset, &r1_17C);
mDoMtx_stack_c::multVec(pOffset+1, &r1_170);
r1_164 = r1_170 - r1_17C;
r1_158 = r1_164;
r1_1A0 = *r18 - r1_17C;
if (!r1_158.normalizeRS()) {
f32 temp = cLib_minLimit(r1_1A0.abs() - *pRadius, 0.0f);
if (temp <= f31) {
jointIndex = *pJointIndex;
f31 = temp;
hitIndex = i;
hitPosIndex = posIndex;
if (f31 < *pRadius) {
SphHitPosAngleOffset(&r1_1A0, r28, r29, r30, r1_17C, *pRadius);
if (HitBufferUpdate(&r1_20, &r1_194, jointIndex, r28, r29)) {
r1_188 = *r29;
r1_24 = *r30;
}
}
}
} else {
r1_14C = r1_158.outprod(r1_1A0);
f32 f29 = cLib_minLimit(r1_14C.abs() - *pRadius, 0.0f);
f32 f30 = r1_158.inprod(r1_1A0);
f32 f5;
if (f30 < 0.0f) {
f5 = -f30;
} else {
if (f30 > r1_164.abs()) {
f5 = f30 - r1_164.abs();
} else {
f5 = 0.0f;
}
}
f32 f4 = sqrtf(f5*f5 + f29*f29);
if (f4 <= f31) {
jointIndex = *pJointIndex;
f31 = f4;
hitIndex = i;
hitPosIndex = posIndex;
if (fabsf(f5) < cXyz::getNearZeroValue() && fabsf(f29) < cXyz::getNearZeroValue()) {
if (!isThrow(*pShapeType)) {
if (*pShapeType == 0) {
CylHitPosAngleOffset(&r1_1A0, r28, r29, r30, r1_17C, r1_170, *pRadius);
} else if (*pShapeType == 2) {
Cyl2HitPosAngleOffset(&r1_1A0, r28, r29, r30, r1_17C, r1_170, *pRadius);
}
if (isDelete(*pShapeType)) {
return -3;
}
if (HitBufferUpdate(&r1_20, &r1_194, jointIndex, r28, r29)) {
r1_188 = *r29;
r1_24 = *r30;
}
}
}
}
}
pOffset += 2;
posIndex += 2;
} else if (isSphere(*pShapeType)) {
mDoMtx_stack_c::multVec(pOffset, &r1_140);
r1_1A0 = *r18 - r1_140;
f32 temp = cLib_minLimit(r1_1A0.abs() - *pRadius, 0.0f);
if (temp <= f31) {
jointIndex = *pJointIndex;
f31 = temp;
hitIndex = i;
hitPosIndex = posIndex;
if (fabsf(f31) < cXyz::getNearZeroValue()) {
SphHitPosAngleOffset(&r1_1A0, r28, r29, r30, r1_140, *pRadius);
if (isDelete(*pShapeType)) {
jointIndex = -3;
return jointIndex;
} else if (isThrow(*pShapeType)) {
// Do nothing
} else if (HitBufferUpdate(&r1_20, &r1_194, jointIndex, r28, r29)) {
r1_188 = *r29;
r1_24 = *r30;
}
}
}
pOffset += 1;
posIndex += 1;
}
pShapeType++;
pJointIndex++;
pRadius++;
}
if (r1_20 >= 0) {
*r29 = r1_188;
*r30 = r1_24;
return r1_20;
}
pShapeType = mpShapeTypes;
pRadius = mpRadiuses;
pOffset = mpOffsets;
mDoMtx_stack_c::copy(model->getAnmMtx(jointIndex));
if (isThrow(pShapeType[hitIndex])) {
jointIndex = -1;
} else if (isDelete(pShapeType[hitIndex])) {
jointIndex = -3;
} else if (pShapeType[hitIndex] == 0) {
mDoMtx_stack_c::multVec(&pOffset[hitPosIndex], &r1_134);
mDoMtx_stack_c::multVec(&pOffset[hitPosIndex+1], &r1_128);
r1_1A0 = *r18 - r1_134;
CylHitPosAngleOffset(&r1_1A0, r28, r29, r30, r1_134, r1_128, pRadius[hitIndex]);
} else if (pShapeType[hitIndex] == 1) {
mDoMtx_stack_c::multVec(&pOffset[hitPosIndex], &r1_11C);
r1_1A0 = *r18 - r1_11C;
SphHitPosAngleOffset(&r1_1A0, r28, r29, r30, r1_11C, pRadius[hitIndex]);
} else {
mDoMtx_stack_c::multVec(&pOffset[hitPosIndex], &r1_110);
mDoMtx_stack_c::multVec(&pOffset[hitPosIndex+1], &r1_104);
r1_1A0 = *r18 - r1_110;
Cyl2HitPosAngleOffset(&r1_1A0, r28, r29, r30, r1_110, r1_104, pRadius[hitIndex]);
}
return jointIndex;
}
/* 800627DC-8006286C .text JntHit_create__FP8J3DModelP16__jnt_hit_data_cs */
JntHit_c* JntHit_create(J3DModel* model, __jnt_hit_data_c* jntHitData, s16 hitDataCount) {
JntHit_c * pJntHit = new JntHit_c();
if (pJntHit != NULL) {
pJntHit->setSearchData(jntHitData);
pJntHit->setMdlPtr(model);
pJntHit->setMaxNum(hitDataCount);
if (pJntHit->CreateInit())
return pJntHit;
}
return NULL;
}