mirror of
https://github.com/encounter/Petari.git
synced 2026-03-30 11:34:15 -07:00
79 lines
2.4 KiB
C++
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() {
|
|
|
|
}
|