mirror of
https://github.com/zeldaret/tww.git
synced 2026-05-23 23:05:11 -04:00
417 lines
13 KiB
C++
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;
|
|
}
|