Files
Petari/source/Game/MapObj/MercatorRotateParts.cpp
2024-03-26 19:09:08 -04:00

79 lines
2.4 KiB
C++

#include "Game/MapObj/MercatorRotateParts.hpp"
#include "Game/AreaObj/MercatorTransformCube.hpp"
MercatorRotateParts::MercatorRotateParts(const char *pName) : LiveActor(pName) {
mRotator = nullptr;
mAppearController = nullptr;
}
void MercatorRotateParts::initAfterPlacement() {
TVec3f trans;
TPos3f rotate;
MR::convertMercatorPlaneToSphereTransAndRotate(&trans, &rotate, mLocalTrans, false);
mPosition.x = trans.x;
mPosition.y = trans.y;
mPosition.z = trans.z;
mAppearController->storeCurrentPosture();
}
bool MercatorRotateParts::receiveOtherMsg(u32 msg, HitSensor *, HitSensor *) {
return mAppearController->receiveMsg(msg);
}
void MercatorRotateParts::control() {
mRotator->movement();
}
void MercatorRotateParts::calcAndSetBaseMtx() {
TVec3f trans;
TPos3f rotate;
TMtx34f mtx;
TPos3f baseMtx;
baseMtx.identity();
MR::makeMtxRotate(mtx.toMtxPtr(), mLocalRotate.x, mLocalRotate.y, mLocalRotate.z);
baseMtx.concat(mRotator->getRotateMtx(), mtx);
MR::convertMercatorPlaneToSphereTransAndRotate(&trans, &rotate, mLocalTrans, false);
baseMtx.concat(rotate, baseMtx);
baseMtx.mMtx[0][3] = trans.x;
baseMtx.mMtx[1][3] = trans.y;
baseMtx.mMtx[2][3] = trans.z;
MR::setBaseTRMtx(this, baseMtx);
}
void MercatorRotateParts::init(const JMapInfoIter &rIter) {
char objName[0x100];
MR::getMapPartsObjectName(objName, sizeof(objName), rIter);
MR::initDefaultPos(this, rIter);
MR::getJMapInfoTrans(rIter, &mLocalTrans);
MR::getJMapInfoRotate(rIter, &mLocalRotate);
initModelManagerWithAnm(objName, nullptr, false);
MR::connectToSceneMapObj(this);
initHitSensor(1);
TVec3f bodyOffs;
bodyOffs.x = 0.0f;
bodyOffs.y = 0.0f;
bodyOffs.z = 0.0f;
MR::addHitSensorMapObj(this, "body", 4, 0.0f, bodyOffs);
MR::initCollisionParts(this, objName, getSensor("body"), nullptr);
mRotator = new MapPartsRotator(this);
mRotator->init(rIter);
mRotator->start();
mAppearController = new MapPartsAppearController(this);
mAppearController->init(rIter);
mAppearController->start();
if (MR::useStageSwitchReadAppear(this, rIter)) {
MR::syncStageSwitchAppear(this);
makeActorDead();
}
else {
makeActorAppeared();
}
MR::initMapPartsClipping(this, rIter, nullptr, false);
}
MercatorRotateParts::~MercatorRotateParts() {
}