1#include "Game/Boss/BossStinkBug.hpp"
2#include "Game/Camera/CameraLocalUtil.hpp"
3#include "Game/Camera/CameraCover.hpp"
4#include "Game/Camera/CameraDirector.hpp"
5#include "Game/Camera/CameraHolder.hpp"
6#include "Game/Camera/CameraMan.hpp"
7#include "Game/Camera/CameraManGame.hpp"
8#include "Game/Camera/CameraManEvent.hpp"
9#include "Game/Camera/CameraManPause.hpp"
10#include "Game/Camera/CameraManSubjective.hpp"
11#include "Game/Camera/CameraParamChunk.hpp"
12#include "Game/Camera/CameraParamChunkHolder.hpp"
13#include "Game/Camera/CameraPoseParam.hpp"
14#include "Game/Camera/CameraRailHolder.hpp"
15#include "Game/Camera/CameraRegisterHolder.hpp"
16#include "Game/Camera/CameraRotChecker.hpp"
17#include "Game/Camera/CameraTargetHolder.hpp"
18#include "Game/Camera/CameraShaker.hpp"
19#include "Game/Camera/CameraTargetMtx.hpp"
20#include "Game/Camera/CameraViewInterpolator.hpp"
21#include "Game/Camera/GameCameraCreator.hpp"
22#include "Game/Camera/OnlyCamera.hpp"
23#include "Game/LiveActor/ActorCameraInfo.hpp"
24#include "Game/Util/CameraUtil.hpp"
25#include "Game/Util/ObjUtil.hpp"
26#include "Game/Util/PlayerUtil.hpp"
27#include "Game/Util/ScreenUtil.hpp"
28#include "Game/Util/SequenceUtil.hpp"
33 const char *gSubjectiveCameraName =
"主観カメラ";
34 const char *gStartCameraName =
"スタートアニメカメラ";
35 const char *gTalkCameraName =
"共通会話カメラ";
51char *CameraParamChunkID_Tmp::getBuffer(
unsigned long size) {
55bool CameraMan::isInterpolationOff()
const {
59bool CameraMan::isCollisionOff()
const {
63bool CameraMan::isZeroFrameMoveOff()
const {
67bool CameraMan::isSubjectiveCameraOff()
const {
71bool CameraMan::isCorrectingErpPositionOff()
const {
75bool CameraMan::isEnableToReset()
const {
79bool CameraMan::isEnableToRoundLeft()
const {
83bool CameraMan::isEnableToRoundRight()
const {
87void CameraMan::roundLeft() {
91void CameraMan::roundRight() {
95CameraDirector::CameraDirector(
const char *pName) :
NameObj(pName) {
97 mStack =
new CameraManStack();
111 mCameraManGame =
new CameraManGame(mHolder, mChunkHolder,
"ゲームカメラマン");
112 mCameraManEvent =
new CameraManEvent(mHolder, mChunkHolder,
"イベントカメラマン");
119 mStartCameraCreated =
false;
121 mRequestCameraManReset =
false;
123 mIsSubjectiveCamera =
false;
131 MR::connectToSceneCamera(
this);
132 push(mCameraManGame);
134 JMath::gekko_ps_copy12(&mTargetMatrix->mMatrix, &_180);
136 mCameraManSubjective->owned(
this);
138 MR::createCenterScreenBlur();
141CameraDirector::~CameraDirector() {
149void CameraDirector::movement() {
152 mTargetHolder->movement();
156 TPos3f *invView = MR::getCameraInvViewMtx();
157 JMath::gekko_ps_copy12(&getCurrentCameraMan()->mMatrix, invView);
158 mPoseParam2->copyFrom(*getCurrentCameraMan()->mPoseParam);
161 checkStartCondition();
162 checkEndOfEventCamera();
163 mRotChecker->update();
164 mRequestCameraManReset =
false;
169 mTargetHolder->set(pTarget);
173 return mTargetHolder->get();
176void CameraDirector::push(
CameraMan *pMan) {
177 if (mStack->mCount != 0) {
179 man->deactivate(
this);
182 mStack->mElements[mStack->mCount++] = pMan;
185 pMan->activate(
this);
189 CameraMan *man = mStack->mElements[--mStack->mCount];
191 man->deactivate(
this);
194 if (mStack->mCount != 0) {
195 CameraMan *newMan = getCurrentCameraMan();
196 newMan->activate(
this);
202void CameraDirector::backLastMtx() {
204 MR::setCameraViewMtx(_1C0,
false,
false, TVec3f(0.0f, 0.0f, 0.0f));
205 TPos3f *invView = MR::getCameraInvViewMtx();
208 invView->getTrans(invTrans);
212CameraMan *CameraDirector::getCurrentCameraMan()
const {
213 return mStack->mElements[mStack->mCount - 1];
216void CameraDirector::updateCameraMan() {
217 if (mRequestCameraManReset) {
226 getCurrentCameraMan()->movement();
230void CameraDirector::calcPose() {
231 switchAntiOscillation();
233 if (getCurrentCameraMan()->isCollisionOff()) {
234 mViewInterpolator->_7C =
true;
237 if (getCurrentCameraMan()->isCorrectingErpPositionOff()) {
238 mViewInterpolator->_8A =
false;
241 if (getCurrentCameraMan()->isZeroFrameMoveOff()) {
242 mOnlyCamera->_3C =
true;
245 mOnlyCamera->calcPose(getCurrentCameraMan());
246 mPoseParam1->copyFrom(*mOnlyCamera->mPoseParam);
253bool CameraDirector::isInterpolationOff() {
258 if (man->isInterpolationOff() || mViewInterpolator->_9) {
265void CameraDirector::switchAntiOscillation() {
266 if (isInterpolationOff()) {
267 mViewInterpolator->_8 =
false;
270 mViewInterpolator->_8 =
true;
274void CameraDirector::createViewMtx() {
276 calcViewMtxFromPoseParam(&view, mPoseParam1);
280 TVec3f &vec = poseParam->_C;
283 f32 fovy = CameraLocalUtil::getFovy(man);
284 mViewInterpolator->updateCameraMtx(
reinterpret_cast<MtxPtr
>(&view), vec, target, fovy);
287void CameraDirector::checkStartCondition() {
288 if (_170 && getCurrentCameraMan() == mCameraManGame && _174++ > 30 && mTargetHolder->isMoving()) {
290 mCameraManGame->endStartPosCamera();
294void CameraDirector::startEvent(
long zoneID,
const char * pName,
const CameraTargetArg &rTargetArg,
long a4) {
295 mViewInterpolator->_A =
false;
296 removeEndEventAtLanding(zoneID, pName);
298 if (getCurrentCameraMan() != mCameraManEvent) {
299 if (mStack->mCount != 0) {
302 if (getCurrentCameraMan() == gameMan) {
303 mCameraManEvent->mPoseParam->copyFrom(*gameMan->mPoseParam);
304 TPos3f *invView = MR::getCameraInvViewMtx();
305 JMath::gekko_ps_copy12(&mCameraManEvent->mMatrix, invView);
309 push(mCameraManEvent);
312 mCameraManEvent->start(zoneID, pName, rTargetArg, a4);
315void CameraDirector::endEvent(
long zoneID,
const char *pName,
bool a3,
long a4) {
316 if (getCurrentCameraMan() == mCameraManEvent) {
317 mCameraManEvent->end(zoneID, pName, a4);
319 if (!mCameraManEvent->isActive()) {
322 if (!mViewInterpolator->_9 && a3 && getCurrentCameraMan() == mCameraManGame) {
323 mCameraManGame->mPoseParam->copyFrom(*mPoseParam1);
324 TPos3f *invView = MR::getCameraInvViewMtx();
325 JMath::gekko_ps_copy12(&mCameraManGame->mMatrix, invView);
328 mViewInterpolator->_A =
true;
344 chunkID.createEventID(zoneID, pName);
349void CameraDirector::requestToResetCameraMan() {
350 mRequestCameraManReset =
true;
353void CameraDirector::setInterpolation(
unsigned long a1) {
354 mViewInterpolator->setInterpolation(a1);
356 if (a1 == 0 && !_170) {
357 mViewInterpolator->_7C =
true;
362void CameraDirector::cover(
unsigned long a1) {
366void CameraDirector::closeCreatingCameraChunk() {
367 mCameraCreator->scanArea();
368 mCameraCreator->scanStartPos();
369 createStartAnimCamera();
371 createSubjectiveCamera();
372 mCameraManGame->closeCreatingCameraChunk();
373 mChunkHolder->loadCameraParameters();
374 mChunkHolder->sort();
376 mCameraManGame->startStartPosCamera(
false);
379void CameraDirector::initCameraCodeCollection(
const char *a1,
long a2) {
380 mCameraCreator->initCameraCodeCollection(a1, a2);
383void CameraDirector::registerCameraCode(
unsigned long code) {
384 mCameraCreator->registerCameraCode(code);
387void CameraDirector::termCameraCodeCollection() {
388 mCameraCreator->termCameraCodeCollection();
391void CameraDirector::declareEvent(
long zoneID,
const char *pName) {
393 chunkID.createEventID(zoneID, pName);
395 mChunkHolder->createChunk(chunkID,
nullptr);
398void CameraDirector::started() {
400 mCameraManGame->endStartPosCamera();
403void CameraDirector::setTargetActor(
const LiveActor *pActor) {
404 mTargetHolder->set(pActor);
407void CameraDirector::setTargetPlayer(
const MarioActor *pActor) {
408 mTargetHolder->set(pActor);
411bool CameraDirector::isRotatingHard()
const {
412 return mRotChecker->_30;
415bool CameraDirector::isSubjectiveCamera()
const {
416 return mIsSubjectiveCamera;
419bool CameraDirector::isEnableToControl()
const {
422 if (!getCurrentCameraMan()->isSubjectiveCameraOff()) {
424 bool equals = getCurrentCameraMan() == mCameraManEvent;
426 if (equals && !isEventCameraActive(0, gSubjectiveCameraName)) {
438bool CameraDirector::isEnableToRoundLeft()
const {
439 return getCurrentCameraMan()->isEnableToRoundLeft();
442bool CameraDirector::isEnableToRoundRight()
const {
443 return getCurrentCameraMan()->isEnableToRoundRight();
446bool CameraDirector::isEnableToReset()
const {
447 return getCurrentCameraMan()->isEnableToReset();
450bool CameraDirector::isEventCameraActive(
long zoneID,
const char *pName)
const {
451 if (getCurrentCameraMan() == mCameraManEvent) {
452 return mCameraManEvent->isEventActive(zoneID, pName);
458bool CameraDirector::isEventCameraActive()
const {
459 return getCurrentCameraMan() == mCameraManEvent;
462void CameraDirector::startStartPosCamera(
bool a1) {
464 mCameraManGame->startStartPosCamera(a1);
467bool CameraDirector::isInterpolatingNearlyEnd()
const {
468 if (getCurrentCameraMan() == mCameraManEvent && mCameraManEvent->doesNextChunkHaveInterpolation()) {
472 return mViewInterpolator->isInterpolatingNearlyEnd();
475bool CameraDirector::isForceCameraChange()
const {
476 return mViewInterpolator->_9;
479f32 CameraDirector::getDefaultFovy()
const {
483void CameraDirector::startStartAnimCamera() {
484 if (mStartCameraCreated) {
488 MR::startEventCamera(&info, gStartCameraName, targetArg, 0);
492bool CameraDirector::isStartAnimCameraEnd()
const {
493 if (mStartCameraCreated) {
494 return isAnimCameraEnd(0, gStartCameraName);
500u32 CameraDirector::getStartAnimCameraFrame()
const {
501 if (mStartCameraCreated) {
502 return getAnimCameraFrame(0, gStartCameraName);
508void CameraDirector::endStartAnimCamera() {
510 MR::endEventCamera(&info, gStartCameraName,
true, 0);
515void CameraDirector::startTalkCamera(
const TVec3f &rPosition,
const TVec3f &rUp,
float axisX,
float axisY,
long a5) {
516 const char *name = gTalkCameraName;
518 chunkID.createEventID(0, name);
522 if (chunk !=
nullptr) {
523 chunk->mGeneralParam->mWPoint.set(rPosition);
524 chunk->mGeneralParam->mUp.set(rUp);
527 generalParam->mAxis.x = axisX;
528 generalParam->mAxis.y = axisY;
529 generalParam->mAxis.z = 0.0f;
533 MR::setCameraTargetToPlayer(&targetArg);
534 startEvent(0, name, targetArg, a5);
539void CameraDirector::endTalkCamera(
bool a1,
long a2) {
540 endEvent(0, gTalkCameraName, a1, a2);
543void CameraDirector::startSubjectiveCamera(
long a1) {
545 mCameraManGame->endStartPosCamera();
546 mIsSubjectiveCamera =
true;
552 mCameraManSubjective->activate(
this);
553 f32 nearZ = MR::getNearZ();
557 MR::turnOffDOFInSubjective();
561 MR::startCenterScreenBlur(20, 15.0f, 80, 5, 10);
565void CameraDirector::endSubjectiveCamera(
long a1) {
566 bool bVar1 = a1 == 0 || a1 == 1;
568 if (mIsSubjectiveCamera ==
true) {
569 mIsSubjectiveCamera =
false;
572 MR::startCenterScreenBlur(_1B4, 15.0f, 80, 5, 10);
581bool CameraDirector::isAnimCameraEnd(
long zoneID,
const char *pName)
const {
585 if (man == eventMan) {
586 return eventMan->isAnimCameraEnd(zoneID, pName);
592u32 CameraDirector::getAnimCameraFrame(
long zoneID,
const char *pName)
const {
596 if (man == eventMan) {
597 return eventMan->getAnimCameraFrame(zoneID, pName);
603void CameraDirector::pauseOnAnimCamera(
long zoneID,
const char *pName) {
607 if (man == eventMan) {
608 eventMan->pauseOnAnimCamera(zoneID, pName);
612void CameraDirector::pauseOffAnimCamera(
long zoneID,
const char *pName) {
616 if (man == eventMan) {
617 eventMan->pauseOffAnimCamera(zoneID, pName);
621void CameraDirector::zoomInGameCamera() {
622 mCameraManGame->zoomIn();
625void CameraDirector::zoomOutGameCamera() {
626 mCameraManGame->zoomOut();
651bool CameraDirector::isPlayableCameraSE(
bool a1) {
652 if (MR::isDemoActive()) {
656 if (MR::isPowerStarGetDemoActive()) {
660 if (MR::isStageStateScenarioOpeningCamera()) {
664 if (MR::isExecScenarioStarter()) {
668 if (MR::isPlayerDead()) {
672 if (MR::isEqualStageName(
"FileSelect")) {
676 if (MR::isEqualStageName(
"EpilogueDemoStage")) {
680 if (a1 && mIsSubjectiveCamera) {
687void CameraDirector::resetCameraMan() {
695 target1 = mTargetHolder->get();
696 target2 = mTargetHolder->get();
697 target3 = mTargetHolder->get();
699 TVec3f newPos = *target3->getPosition() - *target2->getFrontVec() * 800.0f + *target1->getUpVec() * 300.0f;
701 CameraLocalUtil::setPos(man, newPos);
702 CameraLocalUtil::setWatchPos(man, *mTargetHolder->get()->getPosition());
703 CameraLocalUtil::setUpVec(man, *mTargetHolder->get()->getUpVec());
704 CameraLocalUtil::setWatchUpVec(man, *mTargetHolder->get()->getUpVec());
706 man->deactivate(
this);
709 mOnlyCamera->_3D =
true;
712void CameraDirector::createStartAnimCamera() {
713 void *data =
nullptr;
715 MR::getCurrentScenarioStartAnimCameraData(&data, &size);
719 MR::declareEventCameraAnim(&info, gStartCameraName, data);
720 mStartCameraCreated =
true;
724void CameraDirector::createTalkCamera() {
725 const char *name = gTalkCameraName;
727 chunkID.createEventID(0, name);
729 mChunkHolder->createChunk(chunkID,
nullptr);
731 const char *name2 = gTalkCameraName;
733 chunkID2.createEventID(0, name2);
737 if (chunk2 !=
nullptr) {
738 chunk2->setCameraType(
"CAM_TYPE_TALK", mHolder);
743void CameraDirector::createSubjectiveCamera() {
744 const char *name = gSubjectiveCameraName;
746 chunkID.createEventID(0, name);
748 mChunkHolder->createChunk(chunkID,
nullptr);
750 const char *name2 = gSubjectiveCameraName;
752 chunkID2.createEventID(0, name2);
756 if (chunk2 !=
nullptr) {
757 chunk2->setCameraType(
"CAM_TYPE_SUBJECTIVE", mHolder);
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
The basis of a drawable actor that can contain states (see: Nerve)
The most basic form of an object.