Files
Petari/source/Game/Util/LiveActorUtil.cpp

239 lines
7.4 KiB
C++

#include "Game/Util.hpp"
#include "Game/LiveActor/LiveActor.hpp"
#include "Game/LiveActor/ActorLightCtrl.hpp"
#include "Game/LiveActor/ClippingDirector.hpp"
#include "Game/Map/LightFunction.hpp"
namespace MR {
void initDefaultPos(LiveActor *pActor, const JMapInfoIter &rIter) {
if (!rIter.isValid()) {
return;
}
MR::getJMapInfoTrans(rIter, &pActor->mPosition);
MR::getJMapInfoRotate(rIter, &pActor->mRotation);
MR::getJMapInfoScale(rIter, &pActor->mScale);
f32 rot_x = fmod(360.0f + (pActor->mRotation.x) - 0.0f, 360.0f);
f32 rot_y = fmod(360.0f + (pActor->mRotation.y) - 0.0f, 360.0f);
pActor->mRotation.x = 0.0f + rot_x;
}
void initDefaultPosNoRepeat(LiveActor *pActor, const JMapInfoIter &rIter) {
MR::getJMapInfoTrans(rIter, &pActor->mPosition);
MR::getJMapInfoRotate(rIter, &pActor->mRotation);
MR::getJMapInfoScale(rIter, &pActor->mScale);
}
bool isValidMovement(const LiveActor *pActor) {
if (pActor->mFlags.mIsDead || pActor->mFlags.mIsClipped) {
return false;
}
return true;
}
bool isValidCalcAnim(const LiveActor *pActor) {
if (pActor->mFlags.mIsDead || pActor->mFlags.mIsClipped || pActor->mFlags.mIsNoCalcAnim) {
return false;
}
return true;
}
bool isValidCalcViewAndEntry(const LiveActor *pActor) {
if (pActor->mFlags.mIsDead || pActor->mFlags.mIsClipped) {
return false;
}
return true;
}
bool isValidDraw(const LiveActor *pActor) {
if (pActor->mFlags.mIsDead || pActor->mFlags.mIsClipped || pActor->mFlags.mIsHiddenModel) {
return false;
}
return true;
}
void calcAnimDirect(LiveActor *pActor) {
bool isNoCalcAnim = pActor->mFlags.mIsNoCalcAnim;
pActor->mFlags.mIsNoCalcAnim = false;
pActor->calcAnim();
if (isNoCalcAnim) {
pActor->mFlags.mIsNoCalcAnim = true;
}
}
void setClippingTypeSphere(LiveActor *pActor, f32 rad) {
MR::getClippingDirector()->mActorHolder->setTypeToSphere(pActor, rad, 0);
}
void setClippingTypeSphere(LiveActor *pActor, f32 rad, const TVec3f *a3) {
MR::getClippingDirector()->mActorHolder->setTypeToSphere(pActor, rad, a3);
}
void setClippingTypeSphereContainsModelBoundingBox(LiveActor *pActor, f32 a2) {
f32 radius = 0.0f;
MR::calcModelBoundingRadius(&radius, pActor);
f32 rad = radius * a2;
MR::getClippingDirector()->mActorHolder->setTypeToSphere(pActor, rad, 0);
}
void setClippingFar50m(LiveActor *pActor) {
MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 7);
}
void setClippingFar100m(LiveActor *pActor) {
MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 6);
}
void setClippingFar200m(LiveActor *pActor) {
MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 5);
}
void setClippingFar300m(LiveActor *pActor) {
MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 4);
}
void setClippingFarMax(LiveActor *pActor) {
MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 0);
}
void setClippingFar(LiveActor *pActor, f32 clipping) {
s32 clip = clipping;
switch (clip) {
case 0x32:
MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 7);
break;
case 0x64:
MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 6);
break;
case 0xC8:
MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 5);
break;
case 0x12C:
MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 4);
break;
case 0x190:
MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 3);
break;
case 0x1F4:
MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 2);
break;
case 0x258:
MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 1);
break;
case -1:
MR::getClippingDirector()->mActorHolder->setFarClipLevel(pActor, 0);
break;
}
}
void setGroupClipping(LiveActor *pActor, const JMapInfoIter &rIter, int a3) {
MR::getClippingDirector()->joinToGroupClipping(pActor, rIter, a3);
}
void validateClipping(LiveActor *pActor) {
if (pActor->mFlags.mIsInvalidClipping) {
MR::getClippingDirector()->mActorHolder->validateClipping(pActor);
}
}
void invalidateClipping(LiveActor *pActor) {
if (pActor->mFlags.mIsInvalidClipping) {
if (pActor->mFlags.mIsClipped) {
pActor->endClipped();
}
}
else {
MR::getClippingDirector()->mActorHolder->invalidateClipping(pActor);
}
}
void initLightCtrl(LiveActor *pActor) {
pActor->initActorLightCtrl();
pActor->mActorLightCtrl->init(-1, false);
}
void initLightCtrlForPlayer(LiveActor *pActor) {
pActor->initActorLightCtrl();
pActor->mActorLightCtrl->init(-1, false);
LightFunction::registerPlayerLightCtrl(pActor->mActorLightCtrl);
}
void initLightCtrlNoDrawEnemy(LiveActor *pActor) {
pActor->initActorLightCtrl();
pActor->mActorLightCtrl->init(1, true);
}
void initLightCtrlNoDrawMapObj(LiveActor *pActor) {
pActor->initActorLightCtrl();
pActor->mActorLightCtrl->init(3, true);
}
void updateLightCtrl(LiveActor *pActor) {
pActor->mActorLightCtrl->update(false);
}
void updateLightCtrlDirect(LiveActor *pActor) {
pActor->mActorLightCtrl->update(true);
}
void loadActorLight(const LiveActor *pActor) {
pActor->mActorLightCtrl->loadLight();
}
void calcLightPos0(TVec3f *pPos, const LiveActor *pActor) {
LightFunction::calcLightWorldPos(pPos, pActor->mActorLightCtrl->getActorLight()->mInfo0);
}
void calcLightPos1(TVec3f *pPos, const LiveActor *pActor) {
LightFunction::calcLightWorldPos(pPos, pActor->mActorLightCtrl->getActorLight()->mInfo1);
}
const GXColor* getLightAmbientColor(const LiveActor *pActor) {
return &pActor->mActorLightCtrl->getActorLight()->mColor;
}
ActorLightCtrl* getLightCtrl(const LiveActor *pActor) {
return pActor->mActorLightCtrl;
}
bool isStep(const LiveActor *pActor, s32 step) {
return pActor->getNerveStep() == step;
}
/*
bool isFirstStep(const LiveActor *pActor) {
return MR::isStep(pActor, 0);
}
*/
bool isLessStep(const LiveActor *pActor, s32 step) {
return pActor->getNerveStep() < step;
}
bool isLessEqualStep(const LiveActor *pActor, s32 step) {
return pActor->getNerveStep() <= step;
}
bool isGreaterStep(const LiveActor *pActor, s32 step) {
return pActor->getNerveStep() > step;
}
bool isGreaterEqualStep(const LiveActor *pActor, s32 step) {
return pActor->getNerveStep() >= step;
}
bool isIntervalStep(const LiveActor *pActor, s32 step) {
s32 curStep = pActor->getNerveStep();
s32 ratio = curStep / step;
s32 mult = ratio * step;
return mult == curStep;
}
};