Library/Camera: Implement CameraPoser (#398)

This commit is contained in:
Moddimation 2025-03-08 08:10:44 +01:00 committed by GitHub
parent 5ba8ccae43
commit e91b84f0f4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 605 additions and 137 deletions

2
.gitignore vendored
View file

@ -25,6 +25,8 @@ bin/
/cmake-build-*
compile_commands.json
.clangd
manifest.json
.lite_project.lua
# IDA
*.id0

View file

@ -5221,16 +5221,16 @@ Address,Quality,Size,Name
0x00000071000cc5e4,U,000060,_ZN30CameraPoserFollowLimitFunction21calcRotateSpeedDegreeEi
0x00000071000cc620,U,000012,_ZN30CameraPoserFollowLimitFunction23getRotateStickThresholdEv
0x00000071000cc62c,U,000072,_ZN30CameraPoserFollowLimitFunction27isPreCameraFollowOrParallelERKN2al15CameraStartInfoE
0x00000071000cc674,U,000004,_ZN2al11CameraPoser7endInitEv
0x00000071000cc678,U,000012,_ZN2al11CameraPoser3endEv
0x00000071000cc684,U,000004,_ZNK2al11CameraPoser16makeLookAtCameraEPN4sead12LookAtCameraE
0x00000071000cc688,U,000008,_ZNK2al11CameraPoser9isZoomingEv
0x00000071000cc690,U,000008,_ZNK2al11CameraPoser7getNameEv
0x00000071000cc698,U,000008,_ZNK2al11CameraPoser14getNerveKeeperEv
0x00000071000cc6a0,U,000008,_ZNK2al11CameraPoser14getAudioKeeperEv
0x00000071000cc6a8,U,000008,_ZThn8_NK2al11CameraPoser14getAudioKeeperEv
0x00000071000cc6b0,U,000008,_ZThn24_NK2al11CameraPoser7getNameEv
0x00000071000cc6b8,U,000008,_ZThn32_NK2al11CameraPoser14getNerveKeeperEv
0x00000071000cc674,O,000004,_ZN2al11CameraPoser7endInitEv
0x00000071000cc678,O,000012,_ZN2al11CameraPoser3endEv
0x00000071000cc684,O,000004,_ZNK2al11CameraPoser16makeLookAtCameraEPN4sead12LookAtCameraE
0x00000071000cc688,O,000008,_ZNK2al11CameraPoser9isZoomingEv
0x00000071000cc690,O,000008,_ZNK2al11CameraPoser7getNameEv
0x00000071000cc698,O,000008,_ZNK2al11CameraPoser14getNerveKeeperEv
0x00000071000cc6a0,O,000008,_ZNK2al11CameraPoser14getAudioKeeperEv
0x00000071000cc6a8,O,000008,_ZThn8_NK2al11CameraPoser14getAudioKeeperEv
0x00000071000cc6b0,O,000008,_ZThn24_NK2al11CameraPoser7getNameEv
0x00000071000cc6b8,O,000008,_ZThn32_NK2al11CameraPoser14getNerveKeeperEv
0x00000071000cc6c0,U,000020,_ZNK12_GLOBAL__N_131CameraPoserFollowLimitNrvFollow7executeEPN2al11NerveKeeperE
0x00000071000cc6d4,U,000212,
0x00000071000cc7a8,U,000020,_ZNK12_GLOBAL__N_130CameraPoserFollowLimitNrvWater7executeEPN2al11NerveKeeperE
@ -5245,18 +5245,18 @@ Address,Quality,Size,Name
0x00000071000cd264,U,000236,_ZNK18CameraPoserGetMoon14checkCollisionEPN4sead7Vector3IfEERKS2_S5_S5_
0x00000071000cd350,U,000260,_ZN18CameraPoserGetMoon10verifyWallEv
0x00000071000cd454,U,000292,_ZN18CameraPoserGetMoon22verifyWallOneDirectionERKN4sead7Vector3IfEE
0x00000071000cd578,U,000004,_ZN2al11CameraPoser18initByPlacementObjERKNS_13PlacementInfoE
0x00000071000cd57c,U,000004,_ZN2al11CameraPoser9loadParamERKNS_9ByamlIterE
0x00000071000cd580,U,000008,_ZN2al11CameraPoser24receiveRequestFromObjectERKNS_23CameraObjectRequestInfoE
0x00000071000cd588,U,000004,_ZN2al11CameraPoser17startSnapShotModeEv
0x00000071000cd58c,U,000004,_ZN2al11CameraPoser15endSnapShotModeEv
0x00000071000cd590,U,000008,_ZN2al11CameraPoser22requestTurnToDirectionEPKNS_14CameraTurnInfoE
0x00000071000cd578,O,000004,_ZN2al11CameraPoser18initByPlacementObjERKNS_13PlacementInfoE
0x00000071000cd57c,O,000004,_ZN2al11CameraPoser9loadParamERKNS_9ByamlIterE
0x00000071000cd580,O,000008,_ZN2al11CameraPoser24receiveRequestFromObjectERKNS_23CameraObjectRequestInfoE
0x00000071000cd588,O,000004,_ZN2al11CameraPoser17startSnapShotModeEv
0x00000071000cd58c,O,000004,_ZN2al11CameraPoser15endSnapShotModeEv
0x00000071000cd590,O,000008,_ZN2al11CameraPoser22requestTurnToDirectionEPKNS_14CameraTurnInfoE
0x00000071000cd598,U,000088,_ZN29CameraPoserKoopaFireBeamStartC2EPKc
0x00000071000cd5f0,U,000048,_ZN29CameraPoserKoopaFireBeamStart4initEv
0x00000071000cd620,U,000040,_ZN29CameraPoserKoopaFireBeamStart12prepareStartERKN4sead7Vector3IfEES4_
0x00000071000cd648,U,000500,_ZN29CameraPoserKoopaFireBeamStart5startERKN2al15CameraStartInfoE
0x00000071000cd83c,U,000328,_ZN29CameraPoserKoopaFireBeamStart7exeWaitEv
0x00000071000cd984,U,000004,_ZN2al11CameraPoser6updateEv
0x00000071000cd984,O,000004,_ZN2al11CameraPoser6updateEv
0x00000071000cd988,U,000020,_ZNK12_GLOBAL__N_136CameraPoserKoopaFireBeamStartNrvWait7executeEPN2al11NerveKeeperE
0x00000071000cd99c,U,000180,_ZN25CameraPoserWarpCheckpointC2EPN4sead7Vector3IfEES3_S3_PKN2al9LiveActorE
0x00000071000cda50,U,000004,_ZN25CameraPoserWarpCheckpoint4initEv
@ -5338,7 +5338,7 @@ Address,Quality,Size,Name
0x00000071000cf74c,O,000004,_ZNK2al12IUseExecutor4drawEv
0x00000071000cf750,U,000008,_ZNK12_GLOBAL__N_143SafetyPointRecoveryCameraWatcherNrvDeactive7executeEPN2al11NerveKeeperE
0x00000071000cf758,U,000004,j__ZN21alCameraPoserFunction23initCameraArrowColliderEPN2al11CameraPoserE
0x00000071000cf75c,U,000004,_ZN2al11CameraPoser5startERKNS_15CameraStartInfoE
0x00000071000cf75c,O,000004,_ZN2al11CameraPoser5startERKNS_15CameraStartInfoE
0x00000071000cf760,U,000008,_ZNK12_GLOBAL__N_153SafetyPointRecoveryCameraWatcherNrvActiveObjectCamera7executeEPN2al11NerveKeeperE
0x00000071000cf768,U,000008,_ZNK12_GLOBAL__N_141SafetyPointRecoveryCameraWatcherNrvActive7executeEPN2al11NerveKeeperE
0x00000071000cf770,U,000008,_ZNK12_GLOBAL__N_151SafetyPointRecoveryCameraWatcherNrvActiveGoalCamera7executeEPN2al11NerveKeeperE
@ -5384,7 +5384,7 @@ Address,Quality,Size,Name
0x00000071000d0af8,U,000296,_ZN32ScenarioStartCameraPoserRailMove18initScenarioCameraERKN2al13PlacementInfoE
0x00000071000d0c20,U,000440,_ZN32ScenarioStartCameraPoserRailMove9loadParamERKN2al9ByamlIterE
0x00000071000d0dd8,U,000720,_ZN32ScenarioStartCameraPoserRailMove6updateEv
0x00000071000d10a8,U,000004,_ZN2al11CameraPoser4initEv
0x00000071000d10a8,O,000004,_ZN2al11CameraPoser4initEv
0x00000071000d10ac,U,000004,_ZN14CapManHeroBase14makeActorAliveEv
0x00000071000d10b0,U,000004,_ZN14CapManHeroBase7controlEv
0x00000071000d10b4,U,000004,_ZN22CapManHeroDemoFunction17capManHeroControlEPN2al9LiveActorE
@ -51357,45 +51357,45 @@ Address,Quality,Size,Name
0x0000007100832d08,U,000012,_ZN2al19CameraParamTransfer12setFuncTableEPKNS_29NameToCameraParamTransferFuncEi
0x0000007100832d14,U,000236,_ZNK2al19CameraParamTransfer16tryTransferParamEPNS_11CameraPoserES2_
0x0000007100832e00,U,000168,_ZNK2al19CameraParamTransfer19tryFindTransferFuncEPKcS2_
0x0000007100832ea8,U,000232,_ZN2al11CameraPoserC2EPKc
0x0000007100832f90,U,000092,_ZNK2al11CameraPoser26tryCalcOrthoProjectionInfoEPNS_19OrthoProjectionInfoE
0x0000007100832fec,U,000068,_ZNK2al11CameraPoser19isEnableRotateByPadEv
0x0000007100832ea8,O,000232,_ZN2al11CameraPoserC2EPKc
0x0000007100832f90,O,000092,_ZNK2al11CameraPoser26tryCalcOrthoProjectionInfoEPNS_19OrthoProjectionInfoE
0x0000007100832fec,O,000068,_ZNK2al11CameraPoser19isEnableRotateByPadEv
0x0000007100833030,O,000060,_ZNK2al11CameraPoser13getFovyDegreeEv
0x000000710083306c,U,000012,_ZNK2al11CameraPoser18getSceneFovyDegreeEv
0x0000007100833078,U,000012,_ZNK2al11CameraPoser18getAreaObjDirectorEv
0x0000007100833084,U,000012,_ZNK2al11CameraPoser20getCollisionDirectorEv
0x0000007100833090,U,000012,_ZThn16_NK2al11CameraPoser20getCollisionDirectorEv
0x000000710083309c,U,000012,_ZNK2al11CameraPoser14getInputHolderEv
0x00000071008330a8,U,000012,_ZNK2al11CameraPoser15getTargetHolderEv
0x00000071008330b4,U,000012,_ZNK2al11CameraPoser11getFlagCtrlEv
0x00000071008330c0,U,000024,_ZNK2al11CameraPoser12getRailRiderEv
0x00000071008330d8,U,000024,_ZThn40_NK2al11CameraPoser12getRailRiderEv
0x00000071008330f0,U,000020,_ZNK2al11CameraPoser27isInterpoleByCameraDistanceEv
0x0000007100833104,U,000024,_ZNK2al11CameraPoser16getInterpoleStepEv
0x000000710083311c,U,000020,_ZN2al11CameraPoser16setInterpoleStepEi
0x0000007100833130,U,000024,_ZN2al11CameraPoser18resetInterpoleStepEv
0x0000007100833148,U,000020,_ZNK2al11CameraPoser18isInterpoleEaseOutEv
0x000000710083315c,U,000016,_ZN2al11CameraPoser19setInterpoleEaseOutEv
0x000000710083316c,U,000020,_ZNK2al11CameraPoser20isEndInterpoleByStepEv
0x0000007100833180,U,000012,_ZNK2al11CameraPoser19getEndInterpoleStepEv
0x000000710083318c,U,000076,_ZN2al11CameraPoser9initNerveEPKNS_5NerveEi
0x00000071008331d8,U,000016,_ZN2al11CameraPoser17initArrowColliderEPNS_19CameraArrowColliderE
0x00000071008331e8,U,000048,_ZN2al11CameraPoser15initAudioKeeperEPKc
0x0000007100833218,U,000064,_ZN2al11CameraPoser8initRailERKNS_13PlacementInfoE
0x0000007100833258,U,000064,_ZN2al11CameraPoser18initLocalInterpoleEv
0x0000007100833298,U,000064,_ZN2al11CameraPoser19initLookAtInterpoleEf
0x00000071008332d8,U,000052,_ZN2al11CameraPoser24initOrthoProjectionParamEv
0x000000710083330c,U,000040,_ZN2al11CameraPoser19tryInitAreaLimitterERKNS_13PlacementInfoE
0x0000007100833334,U,000500,_ZN2al11CameraPoser4loadERKNS_9ByamlIterE
0x0000007100833528,U,000012,_ZNK2al11CameraPoser11isFirstCalcEv
0x0000007100833534,U,000228,_ZN2al11CameraPoser6appearERKNS_15CameraStartInfoE
0x000000710083306c,O,000012,_ZNK2al11CameraPoser18getSceneFovyDegreeEv
0x0000007100833078,O,000012,_ZNK2al11CameraPoser18getAreaObjDirectorEv
0x0000007100833084,O,000012,_ZNK2al11CameraPoser20getCollisionDirectorEv
0x0000007100833090,O,000012,_ZThn16_NK2al11CameraPoser20getCollisionDirectorEv
0x000000710083309c,O,000012,_ZNK2al11CameraPoser14getInputHolderEv
0x00000071008330a8,O,000012,_ZNK2al11CameraPoser15getTargetHolderEv
0x00000071008330b4,O,000012,_ZNK2al11CameraPoser11getFlagCtrlEv
0x00000071008330c0,O,000024,_ZNK2al11CameraPoser12getRailRiderEv
0x00000071008330d8,O,000024,_ZThn40_NK2al11CameraPoser12getRailRiderEv
0x00000071008330f0,O,000020,_ZNK2al11CameraPoser27isInterpoleByCameraDistanceEv
0x0000007100833104,O,000024,_ZNK2al11CameraPoser16getInterpoleStepEv
0x000000710083311c,O,000020,_ZN2al11CameraPoser16setInterpoleStepEi
0x0000007100833130,O,000024,_ZN2al11CameraPoser18resetInterpoleStepEv
0x0000007100833148,O,000020,_ZNK2al11CameraPoser18isInterpoleEaseOutEv
0x000000710083315c,O,000016,_ZN2al11CameraPoser19setInterpoleEaseOutEv
0x000000710083316c,O,000020,_ZNK2al11CameraPoser20isEndInterpoleByStepEv
0x0000007100833180,O,000012,_ZNK2al11CameraPoser19getEndInterpoleStepEv
0x000000710083318c,O,000076,_ZN2al11CameraPoser9initNerveEPKNS_5NerveEi
0x00000071008331d8,O,000016,_ZN2al11CameraPoser17initArrowColliderEPNS_19CameraArrowColliderE
0x00000071008331e8,O,000048,_ZN2al11CameraPoser15initAudioKeeperEPKc
0x0000007100833218,O,000064,_ZN2al11CameraPoser8initRailERKNS_13PlacementInfoE
0x0000007100833258,O,000064,_ZN2al11CameraPoser18initLocalInterpoleEv
0x0000007100833298,O,000064,_ZN2al11CameraPoser19initLookAtInterpoleEf
0x00000071008332d8,O,000052,_ZN2al11CameraPoser24initOrthoProjectionParamEv
0x000000710083330c,O,000040,_ZN2al11CameraPoser19tryInitAreaLimitterERKNS_13PlacementInfoE
0x0000007100833334,O,000500,_ZN2al11CameraPoser4loadERKNS_9ByamlIterE
0x0000007100833528,O,000012,_ZNK2al11CameraPoser11isFirstCalcEv
0x0000007100833534,O,000228,_ZN2al11CameraPoser6appearERKNS_15CameraStartInfoE
0x0000007100833618,U,001096,_ZN2al11CameraPoser8movementEv
0x0000007100833a60,U,000536,_ZNK2al11CameraPoser20makeLookAtCameraPrevEPN4sead12LookAtCameraE
0x0000007100833c78,U,000080,_ZNK2al11CameraPoser20makeLookAtCameraPostEPN4sead12LookAtCameraE
0x0000007100833cc8,U,000064,_ZNK2al11CameraPoser20makeLookAtCameraLastEPN4sead12LookAtCameraE
0x0000007100833d08,U,000028,_ZNK2al11CameraPoser23makeLookAtCameraCollideEPN4sead12LookAtCameraE
0x0000007100833d24,U,000164,_ZNK2al11CameraPoser14calcCameraPoseEPN4sead12LookAtCameraE
0x0000007100833dc8,U,000116,_ZN2al11CameraPoser28receiveRequestFromObjectCoreERKNS_23CameraObjectRequestInfoE
0x0000007100833a60,O,000536,_ZNK2al11CameraPoser20makeLookAtCameraPrevEPN4sead12LookAtCameraE
0x0000007100833c78,O,000080,_ZNK2al11CameraPoser20makeLookAtCameraPostEPN4sead12LookAtCameraE
0x0000007100833cc8,O,000064,_ZNK2al11CameraPoser20makeLookAtCameraLastEPN4sead12LookAtCameraE
0x0000007100833d08,O,000028,_ZNK2al11CameraPoser23makeLookAtCameraCollideEPN4sead12LookAtCameraE
0x0000007100833d24,O,000164,_ZNK2al11CameraPoser14calcCameraPoseEPN4sead12LookAtCameraE
0x0000007100833dc8,O,000116,_ZN2al11CameraPoser28receiveRequestFromObjectCoreERKNS_23CameraObjectRequestInfoE
0x0000007100833e3c,O,000056,_ZN2al11CameraPoser21startSnapShotModeCoreEv
0x0000007100833e74,O,000012,_ZN2al11CameraPoser19endSnapShotModeCoreEv
0x0000007100833e80,U,000028,_ZN2al18CameraPoserFactoryC2EPKc

Can't render this file because it is too large.

View file

@ -1,22 +1,390 @@
#include "Library/Camera/CameraPoser.h"
#include <gfx/seadCamera.h>
#include "Library/Area/AreaObjDirector.h"
#include "Library/Audio/System/AudioKeeper.h"
#include "Library/Base/StringUtil.h"
#include "Library/Camera/CameraArrowCollider.h"
#include "Library/Camera/CameraOffsetCtrlPreset.h"
#include "Library/Camera/CameraParamMoveLimit.h"
#include "Library/Camera/CameraPoserFlag.h"
#include "Library/Camera/CameraPoserFunction.h"
#include "Library/Camera/CameraPoserSceneInfo.h"
#include "Library/Camera/CameraStartInfo.h"
#include "Library/Camera/CameraTargetAreaLimitter.h"
#include "Library/Camera/CameraViewCtrlGyro.h"
#include "Library/Camera/SnapShotCameraCtrl.h"
#include "Library/Math/MathUtil.h"
#include "Library/Nerve/NerveKeeper.h"
#include "Library/Play/Camera/CameraVerticalAbsorber.h"
#include "Library/Rail/RailKeeper.h"
#include "Library/Yaml/ByamlIter.h"
#include "Library/Yaml/ByamlUtil.h"
#include "Project/Camera/CameraAngleCtrlInfo.h"
#include "Project/Camera/CameraAngleSwingInfo.h"
#include "Project/Camera/CameraObjectRequestInfo.h"
namespace al {
CameraPoser::CameraPoser(const char* name) : mPoserName(name) {
mPoserFlag = new CameraPoserFlag();
mActiveInterpoleParam = new CameraInterpoleParam();
mEndInterpoleParam = new CameraInterpoleStep();
};
void CameraPoser::init() {}
void CameraPoser::initByPlacementObj(const PlacementInfo& mInfo) {}
void CameraPoser::endInit() {}
void CameraPoser::start(const CameraStartInfo& mInfo) {}
void CameraPoser::update() {}
void CameraPoser::end() {
mActiveState = ActiveState::End;
}
void CameraPoser::loadParam(const ByamlIter& iter) {}
void CameraPoser::makeLookAtCamera(sead::LookAtCamera* cam) const {}
bool CameraPoser::receiveRequestFromObject(const CameraObjectRequestInfo& mInfo) {
return false;
}
bool CameraPoser::isZooming() const {
return false;
}
void CameraPoser::startSnapShotMode() {}
void CameraPoser::endSnapShotMode() {}
const char* CameraPoser::getName() const {
return mPoserName;
}
NerveKeeper* CameraPoser::getNerveKeeper() const {
return mNerveKeeper;
}
AudioKeeper* CameraPoser::getAudioKeeper() const {
return mAudioKeeper;
}
bool CameraPoser::requestTurnToDirection(const CameraTurnInfo* mInfo) {
return false;
}
bool CameraPoser::tryCalcOrthoProjectionInfo(OrthoProjectionInfo* projectionInfo) const {
OrthoProjectionParam* param = mOrthoProjectionParam;
if (param && param->isSetInfo && param->info.nearClipWidth > 0.1f &&
param->info.nearClipHeight > 0.1f) {
*projectionInfo = {param->info.nearClipWidth, param->info.nearClipHeight};
return true;
}
return false;
}
bool CameraPoser::isEnableRotateByPad() const {
if (mAngleCtrlInfo != nullptr)
return !mAngleCtrlInfo->isFixByRangeHV();
if (mAngleSwingInfo != nullptr)
return !mAngleSwingInfo->isInvalidSwing();
return false;
}
f32 CameraPoser::getFovyDegree() const {
if (alCameraPoserFunction::isSnapShotMode(this) && mSnapShotCtrl)
return mSnapShotCtrl->getFovyDegree();
return mFovyDegree;
}
f32 CameraPoser::getSceneFovyDegree() const {
return mSceneInfo->sceneFovyDegree;
}
AreaObjDirector* CameraPoser::getAreaObjDirector() const {
return mSceneInfo->areaObjDirector;
}
CollisionDirector* CameraPoser::getCollisionDirector() const {
return mSceneInfo->collisionDirector;
}
CameraInputHolder* CameraPoser::getInputHolder() const {
return mSceneInfo->inputHolder;
}
CameraTargetHolder* CameraPoser::getTargetHolder() const {
return mSceneInfo->targetHolder;
}
CameraFlagCtrl* CameraPoser::getFlagCtrl() const {
return mSceneInfo->flagCtrl;
}
RailRider* CameraPoser::getRailRider() const {
return mRailKeeper ? mRailKeeper->getRailRider() : nullptr;
}
bool CameraPoser::isInterpoleByCameraDistance() const {
return mActiveInterpoleParam->stepType == CameraInterpoleStepType::ByCameraDistance;
}
s32 CameraPoser::getInterpoleStep() const {
return mActiveInterpoleParam->stepNum < 0 ? 60 : mActiveInterpoleParam->stepNum;
}
void CameraPoser::setInterpoleStep(s32 step) {
mActiveInterpoleParam->set(CameraInterpoleStepType::ByStep, step, true);
}
void CameraPoser::resetInterpoleStep() {
mActiveInterpoleParam->set(CameraInterpoleStepType::ByCameraDistance, -1, false);
}
bool CameraPoser::isInterpoleEaseOut() const {
return mActiveInterpoleParam->isEaseOut;
}
void CameraPoser::setInterpoleEaseOut() {
mActiveInterpoleParam->isEaseOut = true;
}
bool CameraPoser::isEndInterpoleByStep() const {
return mEndInterpoleParam->stepType == CameraInterpoleStepType::ByStep;
}
s32 CameraPoser::getEndInterpoleStep() const {
return mEndInterpoleParam->stepNum;
}
void CameraPoser::initNerve(const Nerve* nerve, s32 maxStates) {
mNerveKeeper = new NerveKeeper(this, nerve, maxStates);
}
void CameraPoser::initArrowCollider(CameraArrowCollider* arrowCollider) {
mArrowCollider = arrowCollider;
mPoserFlag->isInvalidCollider = false;
}
void CameraPoser::initAudioKeeper(const char* name) {
mAudioKeeper =
alAudioKeeperFunction::createAudioKeeper(mSceneInfo->audioDirector, name, nullptr);
}
void CameraPoser::initRail(const PlacementInfo& mInfo) {
mRailKeeper = new RailKeeper(mInfo);
}
void CameraPoser::initLocalInterpole() {
mLocalInterpole = new LocalInterpole();
}
void CameraPoser::initLookAtInterpole(f32 v) {
mLookAtInterpole = new LookAtInterpole(v);
}
void CameraPoser::initOrthoProjectionParam() {
mOrthoProjectionParam = new OrthoProjectionParam();
}
void CameraPoser::tryInitAreaLimitter(const PlacementInfo& mInfo) {
mTargetAreaLimitter = CameraTargetAreaLimitter::tryCreate(mInfo);
}
inline void CameraPoser::CameraInterpoleParam::set(CameraInterpoleStepType type, s32 step,
bool is_interpolate_by_step) {
stepType = type;
stepNum = step;
isInterpolateByStep = is_interpolate_by_step;
}
inline void CameraPoser::CameraInterpoleParam::load(const ByamlIter& iter) {
tryGetByamlS32((s32*)&stepType, iter, "InterpoleStepType");
const char* curveType = nullptr;
if (tryGetByamlString(&curveType, iter, "InterpoleCurveType") != 0 && curveType &&
isEqualString(curveType, "EaseOut"))
isEaseOut = true;
isInterpolateByStep = tryGetByamlS32(&stepNum, iter, "InterpoleStep");
if (isInterpolateByStep)
stepType = CameraInterpoleStepType::ByStep;
}
inline void CameraPoser::CameraInterpoleStep::load(const ByamlIter& iter) {
ByamlIter newIter;
if (tryGetByamlIterByKey(&newIter, iter, "EndInterpoleParam")) {
if (isEqualString(getByamlKeyString(newIter, "Type"), "Step"))
stepType = CameraInterpoleStepType::ByStep;
if (stepType == CameraInterpoleStepType::ByStep)
stepNum = getByamlKeyInt(newIter, "Step");
}
}
inline void CameraPoser::OrthoProjectionParam::load(const ByamlIter& iter) {
bool isExist = tryGetByamlBool(&isSetInfo, iter, "IsSetOrthoProjectionInfo");
if (isExist && isSetInfo) {
tryGetByamlF32(&info.nearClipWidth, iter, "OrthoProjectionNearClipWidth");
tryGetByamlF32(&info.nearClipHeight, iter, "OrthoProjectionNearClipHeight");
}
}
void CameraPoser::load(const ByamlIter& iter) {
loadParam(iter);
tryGetByamlF32(&mFovyDegree, iter, "FovyDegree");
mPoserFlag->load(iter);
mActiveInterpoleParam->load(iter);
mEndInterpoleParam->load(iter);
if (mVerticalAbsorber != nullptr)
mVerticalAbsorber->load(iter);
if (mAngleCtrlInfo != nullptr)
mAngleCtrlInfo->load(iter);
if (mAngleSwingInfo != nullptr)
mAngleSwingInfo->load(iter);
if (mOffsetCtrlPreset != nullptr)
mOffsetCtrlPreset->load(iter);
if (mParamMoveLimit != nullptr)
mParamMoveLimit->load(iter);
if (mSnapShotCtrl != nullptr)
mSnapShotCtrl->load(iter);
if (mOrthoProjectionParam != nullptr)
mOrthoProjectionParam->load(iter);
}
bool CameraPoser::isFirstCalc() const {
return mPoserFlag->isFirstCalc;
}
void CameraPoser::appear(const CameraStartInfo& mInfo) {
mActiveState = ActiveState::Active;
if (mAngleCtrlInfo != nullptr) {
sead::Vector3f vec = {0, 0, 0};
alCameraPoserFunction::calcPreCameraDir(&vec, this);
mAngleCtrlInfo->start(sead::Mathf::rad2deg(asinf(vec.y)));
}
if (mAngleSwingInfo != nullptr)
mAngleSwingInfo->setCurrentAngle({0, 0});
start(mInfo);
if (mArrowCollider != nullptr && !mPoserFlag->isInvalidCollider)
mArrowCollider->start();
if (mVerticalAbsorber != nullptr && !mPoserFlag->isOffVerticalAbsorb)
mVerticalAbsorber->start(mTargetTrans, mInfo);
if (mLookAtInterpole != nullptr)
mLookAtInterpole->lookAtPos.set(mTargetTrans);
}
// TODO: CameraPoser::movement
inline void CameraPoser::LocalInterpole::interpolate(sead::LookAtCamera* cam) {
if (step > -1) {
f32 rate = hermiteRate(normalize(step, 0, end), 1.5f, 0.0f);
sead::Vector3f camPosNext = sead::Vector3f(0, 0, 0);
sead::Vector3f lookAtPosNext = sead::Vector3f(0, 0, 0);
lerpVec(&camPosNext, prevCameraPos, cam->getPos(), rate);
lerpVec(&lookAtPosNext, prevLookAtPos, cam->getAt(), rate);
cam->setPos(camPosNext);
cam->setAt(lookAtPosNext);
}
}
void CameraPoser::makeLookAtCameraPrev(sead::LookAtCamera* cam) const {
cam->setPos(mPosition);
cam->setAt(mTargetTrans);
cam->setUp(mCameraUp);
cam->normalizeUp();
if (mVerticalAbsorber != nullptr && !mPoserFlag->isOffVerticalAbsorb)
mVerticalAbsorber->makeLookAtCamera(cam);
if (mLocalInterpole != nullptr)
mLocalInterpole->interpolate(cam);
if (mAngleSwingInfo != nullptr)
mAngleSwingInfo->makeLookAtCamera(cam);
if (mTargetAreaLimitter != nullptr) {
sead::Vector3f camPosNext = cam->getAt();
if (mTargetAreaLimitter->applyAreaLimit(&camPosNext, camPosNext)) {
sead::Vector3f camDiff = camPosNext - cam->getAt();
cam->setPos(camDiff + cam->getPos());
cam->setAt(camDiff + cam->getAt());
}
}
}
void CameraPoser::makeLookAtCameraPost(sead::LookAtCamera* cam) const {
if (alCameraPoserFunction::isSnapShotMode(this) && mSnapShotCtrl != nullptr)
mSnapShotCtrl->makeLookAtCameraPost(cam);
if (mParamMoveLimit != nullptr)
mParamMoveLimit->apply(cam);
}
void CameraPoser::makeLookAtCameraLast(sead::LookAtCamera* cam) const {
if (alCameraPoserFunction::isSnapShotMode(this) && mSnapShotCtrl != nullptr)
mSnapShotCtrl->makeLookAtCameraLast((cam));
}
void CameraPoser::makeLookAtCameraCollide(sead::LookAtCamera* cam) const {
if (!mPoserFlag->isInvalidCollider && mArrowCollider)
mArrowCollider->makeLookAtCamera(cam);
}
void CameraPoser::calcCameraPose(sead::LookAtCamera* cam) const {
makeLookAtCameraPrev(cam);
makeLookAtCamera(cam);
makeLookAtCameraPost(cam);
makeLookAtCameraCollide(cam);
makeLookAtCameraLast(cam);
}
bool CameraPoser::receiveRequestFromObjectCore(const CameraObjectRequestInfo& mInfo) {
if (receiveRequestFromObject(mInfo))
return true;
if (mVerticalAbsorber != nullptr && mInfo.isStopVerticalAbsorb) {
mVerticalAbsorber->liberateAbsorb();
return true;
}
if (mAngleCtrlInfo != nullptr && mAngleCtrlInfo->receiveRequestFromObject(mInfo))
return true;
return false;
}
void CameraPoser::startSnapShotModeCore() {
if (mSnapshotCtrl)
mSnapshotCtrl->start(mFovyDegree);
if (mSnapShotCtrl != nullptr)
mSnapShotCtrl->start(mFovyDegree);
startSnapShotMode();
}
void CameraPoser::endSnapShotModeCore() {
endSnapShotMode();
}
f32 CameraPoser::getFovyDegree() const {
if (alCameraPoserFunction::isSnapShotMode(this) && mSnapshotCtrl)
return mSnapshotCtrl->getFovyDegree();
return mFovyDegree;
}
} // namespace al

View file

@ -11,26 +11,37 @@
#include "Library/HostIO/HioNode.h"
#include "Library/HostIO/IUseName.h"
#include "Library/Nerve/IUseNerve.h"
#include "Library/Projection/OrthoProjectionInfo.h"
#include "Library/Rail/IUseRail.h"
namespace al {
class CameraVerticalAbsorber;
class AudioDirector;
class ByamlIter;
class CameraAngleCtrlInfo;
class CameraAngleSwingInfo;
class CameraArrowCollider;
class CameraFlagCtrl;
class CameraInputHolder;
class CameraOffsetCtrlPreset;
class CameraParamMoveLimit;
class GyroCameraCtrl;
class CameraViewInfo;
struct CameraStartInfo;
class CameraObjectRequestInfo;
class CameraRequestParamHolder;
class CameraTargetAreaLimitter;
class CameraTargetCollideInfoHolder;
class CameraTargetHolder;
class CameraTurnInfo;
struct CameraPoserFlag;
class RailKeeper;
class PlacementInfo;
class ByamlIter;
class CameraVerticalAbsorber;
class CameraViewInfo;
class GyroCameraCtrl;
class Nerve;
class PlacementInfo;
class RailKeeper;
class SnapShotCameraCtrl;
struct CameraObjectRequestInfo;
struct CameraPoserFlag;
struct CameraPoserSceneInfo;
struct CameraStartInfo;
struct OrthoProjectionInfo;
struct SnapShotCameraSceneInfo;
class CameraPoser : public HioNode,
public IUseAreaObj,
@ -40,8 +51,72 @@ class CameraPoser : public HioNode,
public IUseNerve,
public IUseRail {
public:
CameraPoser(const char* poserName);
enum class ActiveState : s32 {
Start = 0,
Active = 1,
End = 2,
};
enum class CameraInterpoleStepType : s32 {
Undefined = -1,
ByStep = 0,
ByCameraDistance = 1,
};
struct LocalInterpole {
inline void interpolate(sead::LookAtCamera* cam);
s32 step = -1;
s32 end = 0;
sead::Vector3f prevCameraPos = {0, 0, 0};
sead::Vector3f prevLookAtPos = {0, 0, 0};
};
static_assert(sizeof(LocalInterpole) == 0x20);
struct LookAtInterpole {
inline LookAtInterpole(f32 v) : _c(v) {}
sead::Vector3f lookAtPos = {0.0f, 0.0f, 0.0f};
f32 _c;
};
static_assert(sizeof(LookAtInterpole) == 0x10);
struct CameraInterpoleStep {
inline void load(const ByamlIter& iter);
CameraInterpoleStepType stepType = CameraInterpoleStepType::Undefined;
s32 stepNum = -1;
};
static_assert(sizeof(CameraInterpoleStep) == 0x8);
struct CameraInterpoleParam : public CameraInterpoleStep {
inline CameraInterpoleParam()
: CameraInterpoleStep({CameraInterpoleStepType::ByCameraDistance}) {}
inline void load(const ByamlIter& iter);
inline void set(CameraInterpoleStepType type, s32 step, bool isInterpolate);
s8 isEaseOut = false;
bool isInterpolateByStep = false;
};
static_assert(sizeof(CameraInterpoleParam) == 0xC);
struct OrthoProjectionParam {
OrthoProjectionParam() {}
inline void load(const ByamlIter& iter);
bool isSetInfo = false;
OrthoProjectionInfo info;
};
static_assert(sizeof(OrthoProjectionParam) == 0xC);
CameraPoser(const char* poserName);
virtual AreaObjDirector* getAreaObjDirector() const override;
virtual void init();
virtual void initByPlacementObj(const PlacementInfo&);
@ -51,7 +126,7 @@ public:
virtual void end();
virtual void loadParam(const ByamlIter&);
virtual void makeLookAtCamera(sead::LookAtCamera*) const;
virtual void receiveRequestFromObject(const CameraObjectRequestInfo&);
virtual bool receiveRequestFromObject(const CameraObjectRequestInfo&);
virtual bool isZooming() const;
virtual bool isEnableRotateByPad() const;
virtual void startSnapShotMode();
@ -63,82 +138,103 @@ public:
virtual AudioKeeper* getAudioKeeper() const override;
virtual RailRider* getRailRider() const override;
virtual void load(const ByamlIter&);
virtual void movement();
virtual void calcCameraPose(sead::LookAtCamera*) const;
virtual void requestTurnToDirection(const CameraTurnInfo*);
virtual void load(const ByamlIter& iter);
virtual void movement(); // TODO: implementation missing
virtual void calcCameraPose(sead::LookAtCamera* cam) const;
virtual bool requestTurnToDirection(const CameraTurnInfo*);
void appear(const CameraStartInfo& startInfo);
bool receiveRequestFromObjectCore(const CameraObjectRequestInfo& objRequestInfo);
bool isInterpoleByCameraDistance() const;
bool isInterpoleEaseOut() const;
bool isEndInterpoleByStep() const;
bool isFirstCalc() const;
void initNerve(const Nerve*, s32);
void initArrowCollider(CameraArrowCollider*);
void initAudioKeeper(const char*);
void initRail(const PlacementInfo&);
void initNerve(const Nerve* nerve, s32 maxStates);
void initArrowCollider(CameraArrowCollider* arrowCollider);
void initAudioKeeper(const char* name);
void initRail(const PlacementInfo& placementInfo);
void initLocalInterpole();
void initLookAtInterpole(f32);
void initOrthoProjectionParam();
void tryInitAreaLimitter(const PlacementInfo&);
void tryInitAreaLimitter(const PlacementInfo& placementInfo);
bool tryCalcOrthoProjectionInfo(OrthoProjectionInfo* projectionInfo) const;
void makeLookAtCameraPrev(sead::LookAtCamera*) const;
void makeLookAtCameraPost(sead::LookAtCamera*) const;
void makeLookAtCameraLast(sead::LookAtCamera*) const;
void makeLookAtCameraCollide(sead::LookAtCamera*) const;
void makeLookAtCameraPrev(sead::LookAtCamera* cam) const;
void makeLookAtCameraPost(sead::LookAtCamera* cam) const;
void makeLookAtCameraLast(sead::LookAtCamera* cam) const;
void makeLookAtCameraCollide(sead::LookAtCamera* cam) const;
void getInterpoleStep();
void setInterpoleStep(s32);
void resetInterpoleStep();
s32 getEndInterpoleStep() const;
s32 getInterpoleStep() const;
void setInterpoleStep(s32 step);
void setInterpoleEaseOut();
void getEndInterpoleStep();
void appear(const CameraStartInfo&);
void calcCameraPose(sead::LookAtCamera*);
void receiveRequestFromObjectCore(const CameraObjectRequestInfo&);
void resetInterpoleStep();
void startSnapShotModeCore();
void endSnapShotModeCore();
f32 getFovyDegree() const;
f32 getSceneFovyDegree() const;
CameraInputHolder* getInputHolder() const;
CameraTargetHolder* getTargetHolder() const;
CameraFlagCtrl* getFlagCtrl() const;
sead::Vector3f getPosition() const { return mPosition; };
// get
const sead::Vector3f& getPosition() const { return mPosition; };
sead::Vector3f getTargetTrans() const { return mTargetTrans; };
const sead::Vector3f& getTargetTrans() const { return mTargetTrans; };
sead::Vector3f getCameraUp() const { return mCameraUp; };
const sead::Vector3f& getCameraUp() const { return mCameraUp; };
const sead::Matrix34f& getViewMtx() const { return mViewMtx; };
CameraViewInfo* getViewInfo() const { return mViewInfo; }
// set
void setPosition(const sead::Vector3f& vec) { mPosition.set(vec); };
void setTargetTrans(const sead::Vector3f& vec) { mTargetTrans.set(vec); };
void setCameraUp(const sead::Vector3f& vec) { mCameraUp.set(vec); };
void setViewMtx(const sead::Matrix34f& mtx) { mViewMtx = mtx; }
void setFovyDegree(f32 fovy) { mFovyDegree = fovy; }
protected:
const char* mPoserName;
f32 field_38;
sead::Vector3f mPosition;
sead::Vector3f mTargetTrans = sead::Vector3f::ex;
ActiveState mActiveState = ActiveState::Start;
sead::Vector3f mPosition = {0.0f, 0.0f, 0.0f};
sead::Vector3f mTargetTrans = {0.0f, 0.0f, 500.0f};
sead::Vector3f mCameraUp = sead::Vector3f::ey;
f32 mFovyDegree = 35.0f;
f32 field_64;
f32 _64 = -1.0f;
sead::Matrix34f mViewMtx = sead::Matrix34f::ident;
bool field_98 = false;
CameraViewInfo* mViewInfo;
AreaObjDirector* mAreaDirector;
CameraPoserFlag* mPoserFlags;
CameraVerticalAbsorber* mVerticalAbsorber;
CameraAngleCtrlInfo* mAngleCtrlInfo;
CameraAngleSwingInfo* mAngleSwingInfo;
CameraArrowCollider* mArrowCollider;
CameraOffsetCtrlPreset* mOffsetCtrlPreset;
f32* mLocalInterpole; // size = 0x20
f32* mLookAtInterpole; // size = 0x10
CameraParamMoveLimit* mParamMoveLimit;
void* field_f8;
GyroCameraCtrl* mGyroCtrl;
SnapShotCameraCtrl* mSnapshotCtrl;
AudioKeeper* mAudioKeeper;
NerveKeeper* mNerveKeeper;
RailKeeper* mRailKeeper;
s32* field_128; // (size = 0xC) interpolesteptype?
s32* field_130; // (size - 0x8)
sead::Vector3f* mOrthoProjectionParam;
bool _98 = false;
CameraPoserSceneInfo* mSceneInfo = nullptr;
CameraViewInfo* mViewInfo = nullptr;
CameraPoserFlag* mPoserFlag;
CameraVerticalAbsorber* mVerticalAbsorber = nullptr;
CameraAngleCtrlInfo* mAngleCtrlInfo = nullptr;
CameraAngleSwingInfo* mAngleSwingInfo = nullptr;
CameraArrowCollider* mArrowCollider = nullptr;
CameraOffsetCtrlPreset* mOffsetCtrlPreset = nullptr;
LocalInterpole* mLocalInterpole = nullptr;
LookAtInterpole* mLookAtInterpole = nullptr;
CameraParamMoveLimit* mParamMoveLimit = nullptr;
CameraTargetAreaLimitter* mTargetAreaLimitter = nullptr;
GyroCameraCtrl* mGyroCtrl = nullptr;
SnapShotCameraCtrl* mSnapShotCtrl = nullptr;
AudioKeeper* mAudioKeeper = nullptr;
NerveKeeper* mNerveKeeper = nullptr;
RailKeeper* mRailKeeper = nullptr;
CameraInterpoleParam* mActiveInterpoleParam = nullptr;
CameraInterpoleStep* mEndInterpoleParam = nullptr;
OrthoProjectionParam* mOrthoProjectionParam = nullptr;
};
static_assert(sizeof(CameraPoser) == 0x140);
} // namespace al

View file

@ -8,7 +8,7 @@
namespace al {
class CameraPoser;
struct CameraStartInfo;
class CameraObjectRequestInfo;
struct CameraObjectRequestInfo;
class IUseCollision;
class PlacementInfo;
} // namespace al
@ -24,7 +24,7 @@ void getProjectionMtx(const al::CameraPoser*);
f32 getNear(const al::CameraPoser*);
f32 getFar(const al::CameraPoser*);
f32 getAspect(const al::CameraPoser*);
void getPreCameraPos(const al::CameraPoser*);
const sead::Vector3f& getPreCameraPos(const al::CameraPoser*);
const sead::Vector3f& getPreLookAtPos(const al::CameraPoser*);
void getPreUpDir(const al::CameraPoser*);
void getPreFovyDegree(const al::CameraPoser*);
@ -216,7 +216,7 @@ void initCameraRail(al::CameraPoser*, const al::PlacementInfo&, const char*);
bool tryGetCameraRailArg(f32*, const al::PlacementInfo&, const char*, const char*);
// void getCameraRailPointObjId(al::CameraPoser const*, s32);
bool tryFindNearestLimitRailKeeper(const al::CameraPoser*, const sead::Vector3f&);
sead::Vector2f calcCameraRotateStick(sead::Vector2f*, const al::CameraPoser*);
void calcCameraRotateStick(sead::Vector2f*, const al::CameraPoser*);
f32 calcCameraRotateStickH(const al::CameraPoser*);
f32 calcCameraRotateStickV(const al::CameraPoser*);
f32 calcCameraRotateStickPower(const al::CameraPoser*);

View file

@ -7,7 +7,7 @@ namespace al {
CameraViewInfo::CameraViewInfo(s32 index, const sead::LookAtCamera& lookAtCam,
const Projection& projection, const CameraViewFlag& flag,
const OrthoProjectionInfo& orthoProjectionInfo)
: mIndex(index), mLookAtCam(lookAtCam), mProjection(projection), mCamViewFlag(flag),
: mIndex(index), mLookAtCam(lookAtCam), mProjection(projection), mViewFlag(flag),
mOrthoProjectionInfo(orthoProjectionInfo) {}
const sead::Projection& CameraViewInfo::getProjectionSead() const {

View file

@ -32,11 +32,11 @@ public:
private:
s32 mIndex;
bool mIsValid = true;
bool _5 = true;
bool mIsActiveInterpole = true;
bool _6 = false;
const sead::LookAtCamera& mLookAtCam;
const Projection& mProjection;
const CameraViewFlag& mCamViewFlag;
const CameraViewFlag& mViewFlag;
const OrthoProjectionInfo& mOrthoProjectionInfo;
};
} // namespace al

View file

@ -14,7 +14,7 @@ struct CameraParam {
};
namespace al {
class SnapShotCameraSceneInfo;
struct SnapShotCameraSceneInfo;
class ICameraInput;
class IUseCollision;

View file

@ -3,6 +3,8 @@
#include "Library/Camera/CameraPoser.h"
#include "Library/Camera/CameraStartInfo.h"
#include "Library/Math/MathUtil.h"
#include "Library/Nerve/NerveSetupUtil.h"
#include "Library/Nerve/NerveUtil.h"
#include "Library/Yaml/ByamlUtil.h"
namespace {

View file

@ -4,11 +4,7 @@
#include <gfx/seadProjection.h>
#include "Library/Camera/CameraPoserFunction.h"
#include "Library/Nerve/Nerve.h"
#include "Library/Nerve/NerveExecutor.h"
#include "Library/Nerve/NerveKeeper.h"
#include "Library/Nerve/NerveSetupUtil.h"
#include "Library/Nerve/NerveUtil.h"
#include "Library/Yaml/ByamlIter.h"
namespace al {
@ -27,7 +23,7 @@ public:
void invalidate();
bool isAbsorbing() const;
bool isValid() const;
void liverateAbsorb();
void liberateAbsorb();
void load(const ByamlIter&);
void makeLookAtCamera(sead::LookAtCamera*) const;
void start(const sead::Vector3f&, const CameraStartInfo&);

View file

@ -15,7 +15,7 @@ public:
void start(f32);
void load(const ByamlIter& iter);
void update(const sead::Vector2f&, f32, bool);
void update(const sead::Vector2f& cameraStick, f32 sensitivityScale, bool isTriggerReset);
s32 getMaxResetStep() const;
bool isFixByRangeHV() const;

View file

@ -13,6 +13,10 @@ public:
void update(const sead::Vector2f& stickInput, f32 stickSensitivity);
void makeLookAtCamera(sead::LookAtCamera* camera) const;
bool isInvalidSwing() const { return mIsInvalidSwing; }
void setCurrentAngle(sead::Vector2f currentAngle) { mCurrentAngle = currentAngle; }
// all of them are default-initialized in the constructor, but some can't be inlined here
private:
bool mIsInvalidSwing = false;