Files

141 lines
3.5 KiB
C++
Raw Permalink Normal View History

#include "Game/LiveActor/PartsModel.hpp"
#include "Game/NameObj/NameObjExecuteHolder.hpp"
2021-12-23 17:15:28 +00:00
PartsModel::PartsModel(LiveActor *pActor, const char *pName, const char *pModelName, MtxPtr mtx, int a5, bool a6) : LiveActor(pName) {
mHost = pActor;
mFixedPos = nullptr;
2021-12-23 17:15:28 +00:00
mMtx = mtx;
mCalcOwnMtx = true;
_99 = false;
mIsDead = false;
if (a5 > 0) {
a5 = 8;
}
if (mMtx) {
mPosition.set<f32>(mMtx[0][3], mMtx[1][3], mMtx[2][3]);
}
else {
mPosition.set<f32>(pActor->mPosition);
}
mRotation.set<f32>(pActor->mRotation);
mScale.set<f32>(pActor->mScale);
initModelManagerWithAnm(pModelName, nullptr, a6);
2021-12-23 17:15:28 +00:00
u32 v14 = 43;
u32 v15 = 11;
if ((a5 - 21) <= (u32)2) {
v14 = 38;
v15 = 10;
}
if (a5 == 16 || a5 == 27) {
v14 = 40;
v15 = 6;
}
MR::connectToScene(this, v14, v15, a5, -1);
}
void PartsModel::makeActorAppeared() {
LiveActor::makeActorAppeared();
mIsDead = false;
}
void PartsModel::makeActorDead() {
LiveActor::makeActorDead();
mIsDead = true;
}
// 99.9% sure the call to makeActorAppered is meant to be inlined but ¯\_(ツ)_/¯ this matches
void PartsModel::init(const JMapInfoIter &rIter) {
initEffectKeeper(8, nullptr, false);
2021-12-23 17:15:28 +00:00
initSound(8, false);
MR::isInvalidClipping(this);
makeActorAppeared();
mIsDead = false;
}
void PartsModel::movement() {
if (MR::isDead(this) || MR::isDead(mHost) || MR::isClipped(mHost) || !_99 && MR::isHiddenModel(mHost)) {
if (!mIsDead) {
mIsDead = true;
MR::invalidateHitSensors(this);
if (!MR::isHiddenModel(this)) {
MR::disconnectToDrawTemporarily(this);
}
}
}
else {
if (mIsDead) {
mIsDead = false;
MR::validateHitSensors(this);
if (!MR::isHiddenModel(this)) {
MR::connectToDrawTemporarily(this);
}
}
LiveActor::movement();
}
}
#ifdef NON_MATCHING
void PartsModel::calcAnim() {
if (mIsDead || MR::isDead(this) || MR::isNoCalcAnim(this) || MR::isClipped(this)) {
return;
}
if (mFixedPos) {
mFixedPos->calc();
}
LiveActor::calcAnim();
}
#endif
void PartsModel::calcViewAndEntry() {
if (!mIsDead) {
LiveActor::calcViewAndEntry();
}
}
void PartsModel::initFixedPosition(const TVec3f &rLocalTrans, const TVec3f &a2, const char *pJointName) {
if (pJointName) {
mFixedPos = new FixedPosition(mHost, pJointName, rLocalTrans, a2);
}
else {
mFixedPos = new FixedPosition(mHost, rLocalTrans, a2);
}
mMtx = (MtxPtr)&mFixedPos->_1C;
}
void PartsModel::initFixedPosition(const char *pJointName) {
initFixedPosition(TVec3f(0.0f, 0.0f, 0.0f), TVec3f(0.0f, 0.0f, 0.0f), pJointName);
}
void PartsModel::initFixedPosition(MtxPtr mtx, const TVec3f &rLocalTrans, const TVec3f &a3) {
mFixedPos = new FixedPosition(mtx, rLocalTrans, a3);
mMtx = (MtxPtr)&mFixedPos->_1C;
}
void PartsModel::loadFixedPosition(const char *pJointName) {
mFixedPos = new FixedPosition(mHost, pJointName, nullptr);
2021-12-23 17:15:28 +00:00
mMtx = (MtxPtr)&mFixedPos->_1C;
}
void PartsModel::offFixedPosNormalizeScale() {
mFixedPos->mNormalizeScale = false;
}
void PartsModel::calcAndSetBaseMtx() {
if (mMtx && mCalcOwnMtx) {
mPosition.set<f32>(mMtx[0][3], mMtx[1][3], mMtx[2][3]);
MR::setBaseTRMtx(this, mMtx);
}
else {
LiveActor::calcAndSetBaseMtx();
}
}