1#include "Game/AreaObj/CubeCamera.hpp"
2#include "Game/Boss/SkeletalFishGuard.hpp"
3#include "Game/Camera/Camera.hpp"
4#include "Game/Camera/Camera.hpp"
5#include "Game/Camera/CameraDirector.hpp"
6#include "Game/Camera/CameraHeightArrange.hpp"
7#include "Game/Camera/CameraHolder.hpp"
8#include "Game/Camera/CameraLocalUtil.hpp"
9#include "Game/Camera/CameraManGame.hpp"
10#include "Game/Camera/CameraParamChunk.hpp"
11#include "Game/Camera/CameraParamChunkHolder.hpp"
12#include "Game/Camera/CameraTargetObj.hpp"
13#include "Game/Camera/CamKarikariEffector.hpp"
14#include "Game/Camera/CamHeliEffector.hpp"
15#include "Game/MapObj/GCapture.hpp"
19 const char *gDefaultCameraName =
"デフォルトカメラ";
20 const char *gDefaultWaterCameraName =
"デフォルト水中カメラ";
21 const char *gDefaultWaterSurfaceCameraName =
"デフォルト水面カメラ";
22 const char *gDefaultFooFighterCameraName =
"デフォルトフーファイターカメラ";
23 const char *gDefaultStartAnimCameraName =
"スタートアニメカメラ";
26const char *CameraParamChunk::getClassName()
const {
30bool CameraTargetObj::isWaterMode()
const {
34bool CameraTargetObj::isOnWaterSurface()
const {
38bool CameraTargetObj::isFooFighterMode()
const {
46Triangle *CameraTargetObj::getGroundTriangle()
const {
52 mChunkHolder = pChunkHolder;
61 mCamera = mHolder->getDefaultCamera();
63 CameraLocalUtil::setWatchPos(
this, TVec3f(0.0f, 0.0f, 300.0f));
66CameraManGame::~CameraManGame() {
74void CameraManGame::calc() {
78 CameraLocalUtil::setUsedTarget(
this, target);
80 mKarikari->update(
this);
84void CameraManGame::notifyActivate() {
88void CameraManGame::notifyDeactivate() {
92bool CameraManGame::isInterpolationOff()
const {
93 if (mCamera !=
nullptr && mCamera->isInterpolationOff()) {
97 if (mChunk !=
nullptr && mChunk->isAntiBlurOff()) {
104bool CameraManGame::isCollisionOff()
const {
105 if (mCamera !=
nullptr && mCamera->isCollisionOff()) {
109 if (mChunk !=
nullptr && mChunk->isCollisionOff()) {
116bool CameraManGame::isZeroFrameMoveOff()
const {
117 if (mCamera !=
nullptr) {
118 return mCamera->isZeroFrameMoveOff();
124bool CameraManGame::isSubjectiveCameraOff()
const {
125 if (mCamera !=
nullptr && mCamera->isSubjectiveCameraOff()) {
129 if (mChunk !=
nullptr && mChunk->isSubjectiveCameraOff()) {
136bool CameraManGame::isCorrectingErpPositionOff()
const {
139 if (mCamera !=
nullptr && mCamera->isCorrectingErpPositionOff()) {
146bool CameraManGame::isEnableToRoundLeft()
const {
147 if (mCamera !=
nullptr) {
148 return mCamera->isEnableToRoundLeft();
154bool CameraManGame::isEnableToRoundRight()
const {
155 if (mCamera !=
nullptr) {
156 return mCamera->isEnableToRoundRight();
162bool CameraManGame::isEnableToReset()
const {
163 if (mCamera !=
nullptr) {
164 return mCamera->isEnableToReset();
170void CameraManGame::closeCreatingCameraChunk() {
171 createDefaultCamera();
172 createDefaultWaterCamera();
173 createDefaultWaterSurfaceCamera();
174 createDefaultFooFighterCamera();
175 createStartAnimCamera();
179void CameraManGame::startStartPosCamera(
bool a1) {
184void CameraManGame::endStartPosCamera() {
189void CameraManGame::zoomIn() {
193 chunkID.createOtherID(0,
"ズームカメラ");
197 TVec3f *pos = CameraLocalUtil::getPos(
this);
198 TVec3f *watchPos = CameraLocalUtil::getWatchPos(
this);
200 f32 distance = PSVECDistance(
reinterpret_cast<Vec *
>(watchPos),
reinterpret_cast<Vec *
>(pos));
201 f32 dVar3 = JMAAsinRadian(100.0f / distance);
203 f32 var1 = dVar3 * var2;
205 chunk->mExParam.mFovy = (180.0f * (2 * var1)) / 3.1415927f;
208void CameraManGame::zoomOut() {
212void CameraManGame::selectCameraChunk() {
213 if (!tryStartPosCamera() && !tryZoomCamera()) {
216 switch (mTypeState) {
224 updateWaterSurface();
241 if (chunk ==
nullptr) {
245 chunk = tryToReplaceChunkToDefault(chunk);
246 requestResetIfNecessary(chunk);
247 replaceCurrentChunkAndCamera(chunk);
254void CameraManGame::setNullCamera() {
256 s32 index = mHolder->getIndexOfDefault();
257 mCamera = mHolder->getCameraInner(index);
259 f32 fovy = mDirector->getDefaultFovy();
260 CameraLocalUtil::setFovy(
this, fovy);
261 CameraLocalUtil::setRoll(
this, 0.0f);
263 CameraLocalUtil::setGlobalOffset(
this, TVec3f(0.0f, 0.0f, 0.0f));
264 CameraLocalUtil::setLocalOffset(
this, TVec3f(0.0f, 0.0f, 0.0f));
265 CameraLocalUtil::setFrontOffset(
this, 0.0f);
266 CameraLocalUtil::setUpperOffset(
this, 0.0f);
268 if (mCamera->mVPan !=
nullptr) {
269 mCamera->mVPan->resetParameter();
275 if (strcmp(pChunk->getClassName(),
"Game") != 0) {
281 if (gameChunk->mThru != 1) {
285 static const char *name =
"デフォルトカメラ";
288 chunkID.createOtherID(0, name);
290 return mChunkHolder->getChunk(chunkID);
294 if (isNecessaryToReset(pChunk)) {
297 if (isZoomCamera()) {
298 mDirector->setInterpolation(mChunk->mExParam.mCamInt);
300 else if (isCurrentChunkEnableEndInterp()) {
302 mDirector->setInterpolation(gameChunk->mCamEndInt);
305 mDirector->setInterpolation(pChunk->mExParam.mCamInt);
311 if (mChunk == pChunk) {
315 u8 cameraTypeIndex = pChunk->mCameraTypeIndex;
317 if (cameraTypeIndex != mHolder->getIndexOf(mCamera)) {
321 if (mChunk !=
nullptr && !mChunk->isOnNoReset()) {
325 if (!pChunk->isOnNoReset()) {
333bool CameraManGame::isCurrentChunkEnableEndInterp()
const {
336 if (mChunk !=
nullptr) {
339 if (strcmp(mChunk->getClassName(),
"Game") == 0) {
342 if (gameChunk->mEnableEndErpFrame != 0) {
355 mCamera = mHolder->getCameraInner(pChunk->mCameraTypeIndex);
361void CameraManGame::applyParameter() {
362 CamTranslatorBase *translator = mHolder->getTranslator(mChunk->mCameraTypeIndex);
363 translator->setParam(mChunk);
364 Camera *camera = translator->getCamera();
366 camera->setZoneMtx(mChunk->getZoneID());
368 CameraLocalUtil::setGlobalOffset(mCamera, mChunk->mExParam.mWOffset);
370 TVec3f *localOffset = CameraLocalUtil::getLocalOffset(
this);
371 CameraLocalUtil::setLocalOffset(mCamera, *localOffset);
372 CameraLocalUtil::setFrontOffset(mCamera, mChunk->mExParam.mLOffset);
373 CameraLocalUtil::setUpperOffset(mCamera, mChunk->mExParam.mLOffsetV);
375 if (mChunk->isOnUseFovy()) {
376 CameraLocalUtil::setFovy(mCamera, mChunk->mExParam.mFovy);
379 CameraLocalUtil::setFovy(mCamera, mDirector->getDefaultFovy());
382 if (mChunk->isLOfsErpOff()) {
389 CameraLocalUtil::setRoll(mCamera, mChunk->mExParam.mRoll);
391 if (camera->mVPan !=
nullptr) {
393 vPan->resetParameter();
395 vPan->mUpper = mChunk->mExParam.mUpper;
396 vPan->mLower = mChunk->mExParam.mLower;
397 vPan->mGndInt = mChunk->mExParam.mGndInt;
398 vPan->mUPlay = mChunk->mExParam.mUPlay;
399 vPan->mLPlay = mChunk->mExParam.mLPlay;
400 vPan->mPushDelay = mChunk->mExParam.mPushDelay;
401 vPan->mPushDelayLow = mChunk->mExParam.mPushDelayLow;
402 vPan->mUDown = mChunk->mExParam.mUDown;
403 vPan->mVPanUse = mChunk->mExParam.mVPanUse != 0;
406 mChunk->getVPanAxis(&axis);
408 vPan->mVPanAxis.set(axis);
415void CameraManGame::checkReset() {
416 if (_58 == 0 || mChunk ==
nullptr || mCamera ==
nullptr) {
420 mCamera->mCameraMan =
this;
425void CameraManGame::setSafePose() {
426 TVec3f pos = TVec3f(*CameraLocalUtil::getPos(mCamera));
427 TVec3f watchPos = TVec3f(*CameraLocalUtil::getWatchPos(mCamera));
428 TVec3f up = TVec3f(*CameraLocalUtil::getUpVec(mCamera));
430 if (MR::isNan(pos) || MR::isNan(watchPos) || MR::isNan(up)) {
434 keepAwayWatchPos(&watchPos, pos);
435 calcSafeUpVec(&up, pos, watchPos);
437 CameraLocalUtil::setPos(
this, pos);
438 CameraLocalUtil::setUpVec(
this, up);
439 CameraLocalUtil::setWatchPos(
this, watchPos);
441 TVec3f *watchUp = CameraLocalUtil::getWatchUpVec(mCamera);
442 CameraLocalUtil::setWatchUpVec(
this, *watchUp);
444 TVec3f *globalOffset = CameraLocalUtil::getGlobalOffset(mCamera);
445 CameraLocalUtil::setGlobalOffset(
this, *globalOffset);
447 TVec3f *localOffset = CameraLocalUtil::getLocalOffset(mCamera);
448 CameraLocalUtil::setLocalOffset(
this, *localOffset);
450 f32 fovy = CameraLocalUtil::getFovy(mCamera);
451 CameraLocalUtil::setFovy(
this, fovy);
453 f32 roll = CameraLocalUtil::getRoll(mCamera);
454 CameraLocalUtil::setRoll(
this, roll);
459void CameraManGame::keepAwayWatchPos(TVec3f *watchPos,
const TVec3f &pos) {
460 TVec3f dir = *watchPos - pos;
461 float length = PSVECMag(
reinterpret_cast<Vec *
>(&dir));
463 if (length < 300.0f) {
465 TVec3f *currentPos = CameraLocalUtil::getPos(
this);
466 TVec3f *currentWatchPos = CameraLocalUtil::getWatchPos(
this);
468 TVec3f newWatchPos1 = pos + *currentWatchPos;
469 TVec3f newWatchPos2 = newWatchPos1 - *currentPos;
471 watchPos->set(newWatchPos2);
474 float length2 = PSVECMag(
reinterpret_cast<Vec *
>(&dir));
475 PSVECNormalize(
reinterpret_cast<Vec *
>(&dir),
reinterpret_cast<Vec *
>(&dir));
477 TVec3f dirCopy = TVec3f(dir);
482 watchPos->set(pos + dirCopy);
488void CameraManGame::createDefaultCamera() {
490 chunkID.createOtherID(0, gDefaultCameraName);
491 mChunkHolder->createChunk(chunkID,
nullptr);
494void CameraManGame::createDefaultWaterCamera() {
496 chunkID.createOtherID(0, gDefaultWaterCameraName);
499 chunk->setCameraType(
"CAM_TYPE_WATER_FOLLOW", mHolder);
501 TVec3f wOffset = TVec3f(0.0f, 170.0f, 0.0f);
502 chunk->mExParam.mWOffset.set(wOffset);
503 chunk->mExParam.mLOffset = 100.0f;
504 chunk->mExParam.mFovy = 45.0f;
505 chunk->mExParam.mCamInt = 120;
506 chunk->mGeneralParam->mAxis.x = 1000.0f;
507 chunk->mGeneralParam->mAxis.y = 900.0f;
508 chunk->mGeneralParam->mDist = 0.01f;
511void CameraManGame::createDefaultWaterSurfaceCamera() {
513 chunkID.createOtherID(0, gDefaultWaterSurfaceCameraName);
516 chunk->setCameraType(
"CAM_TYPE_FOLLOW", mHolder);
518 TVec3f wOffset = TVec3f(0.0f, 170.0f, 0.0f);
519 chunk->mExParam.mWOffset.set(wOffset);
520 chunk->mExParam.mLOffset = 100.0f;
521 chunk->mExParam.mFovy = 45.0f;
522 chunk->mExParam.mCamInt = 120;
523 chunk->mGeneralParam->mAxis.x = 900.0;
524 chunk->mGeneralParam->mAxis.y = 600.0f;
525 chunk->mGeneralParam->mAngleA = 0.174533f;
526 chunk->mGeneralParam->mAngleB = 0.349066f;
527 chunk->mGeneralParam->mDist = 0.15f;
528 chunk->mGeneralParam->mNum1 = 0;
531void CameraManGame::createDefaultFooFighterCamera() {
533 chunkID.createOtherID(0, gDefaultFooFighterCameraName);
536 chunk->setCameraType(
"CAM_TYPE_FOO_FIGHTER", mHolder);
538 TVec3f wOffset = TVec3f(0.0f, 170.0f, 0.0f);
539 chunk->mExParam.mWOffset.set(wOffset);
540 chunk->mExParam.mLOffset = 100.0f;
541 chunk->mExParam.mFovy = 45.0f;
542 chunk->mExParam.mCamInt = 120;
543 chunk->mGeneralParam->mAxis.x = 1200.0;
544 chunk->mGeneralParam->mAxis.y = 300.0f;
545 chunk->mGeneralParam->mDist = 0.03f;
548void CameraManGame::createStartAnimCamera() {
551 MR::getCurrentScenarioStartAnimCameraData(&data, &size);
555 chunkID.createOtherID(0, gDefaultStartAnimCameraName);
559 chunk->setCameraType(
"CAM_TYPE_ANIM", director->mHolder);
561 chunk->mGeneralParam->mNum1 =
reinterpret_cast<s32
>(data);
566void CameraManGame::createZoomCamera() {
568 chunkID.createOtherID(0,
"ズームカメラ");
572 chunk->setCameraType(
"CAM_TYPE_EYEPOS_FIX_THERE", director->mHolder);
574 TVec3f wOffset = TVec3f(0.0f, 0.0f, 0.0f);
575 chunk->mExParam.mWOffset.set(wOffset);
576 chunk->mExParam.mLOffset = 0.0f;
577 chunk->mExParam.mLOffsetV = 100.0f;
579 chunk->setUseFovy(
true);
580 chunk->setLOfsErpOff(
true);
582 chunk->mExParam.mCamInt = 0;
583 chunk->mGeneralParam->mNum1 = 1;
584 chunk->mGeneralParam->mNum2 = 1;
588void CameraManGame::checkStateShift() {
589 if (!tryShiftToGCapture() && !tryShiftToSwimOrWaterSurface() && !tryShiftToFooFighter()) {
594bool CameraManGame::tryShiftToGCapture() {
595 bool captured = MR::isPlayerGCaptured();
605bool CameraManGame::tryShiftToSwimOrWaterSurface() {
608 if (target->isWaterMode()) {
611 if (target2->isOnWaterSurface()) {
624bool CameraManGame::tryShiftToFooFighter() {
627 if (target->isFooFighterMode()) {
643void CameraManGame::updateSwim() {
644 if (!setCubeChunk(CubeCameraArea::CATEGORY_UNKNOWN_1)) {
646 chunkID.createOtherID(0, gDefaultWaterCameraName);
652void CameraManGame::updateWaterSurface() {
653 if (!setCubeChunk(CubeCameraArea::CATEGORY_UNKNOWN_2)) {
655 chunkID.createOtherID(0, gDefaultWaterSurfaceCameraName);
661void CameraManGame::updateGCapture() {
662 CubeCameraArea::setCurrentCategory(CubeCameraArea::CATEGORY_UNKNOWN_3);
664 const TVec3f *position = target->getPosition();
668 if (area !=
nullptr) {
670 chunkID.createCubeID(area->mZoneID,
static_cast<u16
>(area->mObjArg0));
673 CubeCameraArea::setCurrentCategory(CubeCameraArea::CATEGORY_UNKNOWN_0);
680void CameraManGame::updateFooFighter() {
681 if (!setCubeChunk(CubeCameraArea::CATEGORY_UNKNOWN_4)) {
683 chunkID.createOtherID(0, gDefaultFooFighterCameraName);
689bool CameraManGame::setCubeChunk(CubeCameraArea::ECategory category) {
690 CubeCameraArea::setCurrentCategory(
static_cast<s32
>(category));
694 if (area !=
nullptr) {
696 chunkID.createCubeID(area->mZoneID,
static_cast<u16
>(area->mObjArg0));
705bool CameraManGame::tryStartPosCamera() {
711 u16 startCameraID =
static_cast<u16
>(MR::getCurrentStartCameraID());
712 s32 startZoneID = MR::getCurrentStartZoneID();
714 chunkID.createStartID(startZoneID, startCameraID);
726 mDirector->setInterpolation(0);
736bool CameraManGame::tryZoomCamera() {
737 if (!mZoomedIn == 0) {
742 chunkID.createOtherID(0,
"ズームカメラ");
749bool CameraManGame::isZoomCamera()
const {
751 chunkID.createOtherID(0,
"ズームカメラ");
755 return mChunk == chunk;
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.