1#include "Game/Camera/Camera.hpp"
2#include "Game/Camera/CamTranslatorAnim.hpp"
3#include "Game/Camera/CameraDirector.hpp"
4#include "Game/Camera/CameraHeightArrange.hpp"
5#include "Game/Camera/CameraLocalUtil.hpp"
6#include "Game/Camera/CameraManEvent.hpp"
7#include "Game/Camera/CameraHolder.hpp"
8#include "Game/Camera/CameraParamChunk.hpp"
9#include "Game/Camera/CameraParamChunkHolder.hpp"
10#include "Game/Util/CameraUtil.hpp"
16CameraManEvent::ChunkFIFOItem::ChunkFIFOItem() {
17 mTargetArg.mTargetObj =
nullptr;
18 mTargetArg.mTargetMtx =
nullptr;
19 mTargetArg.mLiveActor =
nullptr;
20 mTargetArg.mMarioActor =
nullptr;
25 CameraMan(pName), mHolder(pHolder), mChunkHolder(pChunkHolder), mCamera(nullptr) {
30 for (u32 i = 0; i < NR_FIFO_ITEMS; i++) {
31 mItems[i].mFirst.mChunk =
nullptr;
32 mItems[i].mSecond.mChunk =
nullptr;
36CameraManEvent::~CameraManEvent() {
44void CameraManEvent::calc() {
48 resetCameraIfRequested();
50 CameraLocalUtil::setUsedTarget(
this, target);
54void CameraManEvent::notifyActivate() {
58void CameraManEvent::notifyDeactivate() {
62bool CameraManEvent::isInterpolationOff()
const {
63 if (mCamera !=
nullptr && mCamera->isInterpolationOff()) {
67 if (mChunk !=
nullptr && mChunk->isAntiBlurOff()) {
74bool CameraManEvent::isCollisionOff()
const {
75 if (mCamera !=
nullptr && mCamera->isCollisionOff()) {
79 if (mChunk !=
nullptr && mChunk->isCollisionOff()) {
86bool CameraManEvent::isZeroFrameMoveOff()
const {
87 if (mCamera !=
nullptr) {
88 return mCamera->isZeroFrameMoveOff();
94bool CameraManEvent::isCorrectingErpPositionOff()
const {
97 if (mCamera !=
nullptr && mCamera->isCorrectingErpPositionOff()) {
104void CameraManEvent::start(
long zoneID,
const char *pName,
const CameraTargetArg &rTargetArg,
long a4) {
106 requestChunk(chunk,
static_cast<EPriority
>(chunk->mEvPriority), rTargetArg, a4);
107 rTargetArg.setTarget();
110void CameraManEvent::end(
long zoneID,
const char *pName,
long a3) {
112 searchPriority(chunk);
114 if (cleanChunkFIFO(chunk)) {
115 sendFinishInterpolateFrame(chunk, a3);
118 if (isChunkFIFOEmpty()) {
120 MR::cleanEventCameraTarget_temporally();
124bool CameraManEvent::isEventActive(
long zoneID,
const char *pName)
const {
125 if (mCamera !=
nullptr) {
127 chunkID.createEventID(zoneID, pName);
132 for (s32 i = NR_FIFO_ITEMS - 1; i >= 0; i++) {
133 if (mItems[i].mSecond.mChunk !=
nullptr) {
134 return mItems[i].mSecond.mChunk == chunk;
137 if (mItems[i].mFirst.mChunk !=
nullptr) {
138 return mItems[i].mFirst.mChunk == chunk;
146bool CameraManEvent::isActive()
const {
147 return !isChunkFIFOEmpty();
150bool CameraManEvent::doesNextChunkHaveInterpolation()
const {
151 const ChunkFIFOItem *item =
nullptr;
153 for (u32 i = 0; i < NR_FIFO_ITEMS; i++) {
154 if (mItems[i].mSecond.mChunk !=
nullptr) {
155 item = &mItems[i].mSecond;
159 if (mItems[i].mFirst.mChunk !=
nullptr) {
164 if (item !=
nullptr && getInterpolateFrame(item->mChunk, item->_14) > 0) {
171u32 CameraManEvent::getAnimCameraFrame(
long zoneID,
const char *pName)
const {
172 mHolder->getIndexOf(
"CAM_TYPE_ANIM");
176 return translator->getAnimFrame(chunk);
179void CameraManEvent::pauseOnAnimCamera(
long zoneID,
const char *pName) {
180 mHolder->getIndexOf(
"CAM_TYPE_ANIM");
183 if (chunk == mChunk && mCamera !=
nullptr) {
189void CameraManEvent::pauseOffAnimCamera(
long zoneID,
const char *pName) {
190 mHolder->getIndexOf(
"CAM_TYPE_ANIM");
193 if (chunk == mChunk && mCamera !=
nullptr) {
201void CameraManEvent::updateChunkFIFO() {
202 for (u32 i = 0; i < NR_FIFO_ITEMS; i++) {
205 if (chunk !=
nullptr) {
206 mItems[i].mFirst.mChunk = chunk;
211 mItems[i].mFirst.mTargetArg.mTargetObj = obj;
212 mItems[i].mFirst.mTargetArg.mTargetMtx = mtx;
214 const LiveActor *liveActor = mItems[i].mSecond.mTargetArg.mLiveActor;
215 MarioActor *marioActor = mItems[i].mSecond.mTargetArg.mMarioActor;
217 mItems[i].mFirst.mTargetArg.mLiveActor = liveActor;
218 mItems[i].mFirst.mTargetArg.mMarioActor = marioActor;
220 mItems[i].mFirst._14 = mItems[i].mSecond._14;
222 mItems[i].mSecond.mChunk =
nullptr;
228void CameraManEvent::applyChunk() {
229 ChunkFIFOItem *item =
nullptr;
231 for (u32 i = 0; i < NR_FIFO_ITEMS; i++) {
232 if (mItems[i].mFirst.mChunk !=
nullptr) {
233 item = &mItems[i].mFirst;
239 mChunk = item->mChunk;
242void CameraManEvent::checkReset(ChunkFIFOItem *pItem) {
245 if (mChunk != itemChunk) {
247 sendStartInterpolateFrame(pItem->mChunk, pItem->_14);
248 pItem->mTargetArg.setTarget();
251 u8 cameraIndex = itemChunk->mCameraTypeIndex;
253 if (cameraIndex != mHolder->getIndexOf(mCamera)) {
259void CameraManEvent::changeCamera() {
260 mCamera = mHolder->getCameraInner(mChunk->mCameraTypeIndex);
261 CamTranslatorBase *translator = mHolder->getTranslator(mChunk->mCameraTypeIndex);
262 translator->setParam(mChunk);
267void CameraManEvent::setExtraParam() {
268 s32 zoneID = mChunk->getZoneID();
269 mCamera->setZoneMtx(zoneID);
271 CameraLocalUtil::setGlobalOffset(mCamera, mChunk->mExParam.mWOffset);
273 TVec3f *localOffset = CameraLocalUtil::getLocalOffset(
this);
274 CameraLocalUtil::setLocalOffset(mCamera, *localOffset);
276 CameraLocalUtil::setFrontOffset(mCamera, mChunk->mExParam.mLOffset);
277 CameraLocalUtil::setUpperOffset(mCamera, mChunk->mExParam.mLOffsetV);
279 if (mChunk->isOnUseFovy()) {
280 CameraLocalUtil::setFovy(mCamera, mChunk->mExParam.mFovy);
283 f32 fovy = mDirector->getDefaultFovy();
284 CameraLocalUtil::setFovy(mCamera, fovy);
287 if (mChunk->isLOfsErpOff()) {
288 mCamera->mIsLOfsErpOff =
true;
291 mCamera->mIsLOfsErpOff =
false;
294 CameraLocalUtil::setRoll(mCamera, mChunk->mExParam.mRoll);
299void CameraManEvent::setVPanParam() {
300 if (mCamera->mVPan !=
nullptr) {
302 vPan->resetParameter();
304 vPan->mUpper = mChunk->mExParam.mUpper;
305 vPan->mLower = mChunk->mExParam.mLower;
306 vPan->mGndInt = mChunk->mExParam.mGndInt;
307 vPan->mUPlay = mChunk->mExParam.mUPlay;
308 vPan->mLPlay = mChunk->mExParam.mLPlay;
309 vPan->mPushDelay = mChunk->mExParam.mPushDelay;
310 vPan->mPushDelayLow = mChunk->mExParam.mPushDelayLow;
311 vPan->mUDown = mChunk->mExParam.mUDown;
312 vPan->mVPanUse = mChunk->mExParam.mVPanUse != 0;
315 mChunk->getVPanAxis(&axis);
317 vPan->mVPanAxis.set(axis);
324void CameraManEvent::resetCameraIfRequested() {
326 mCamera->mCameraMan =
this;
350 chunkID.createEventID(zoneID, pName);
356 mItems[priority].mSecond.mChunk = pChunk;
357 mItems[priority].mSecond.mTargetArg.mTargetObj = rArg.mTargetObj;
358 mItems[priority].mSecond.mTargetArg.mTargetMtx = rArg.mTargetMtx;
359 mItems[priority].mSecond.mTargetArg.mLiveActor = rArg.mLiveActor;
360 mItems[priority].mSecond.mTargetArg.mMarioActor = rArg.mMarioActor;
361 mItems[priority].mSecond._14 = a4;
367 for (u32 i = 0; i < NR_FIFO_ITEMS; i++) {
368 if (mItems[i].mSecond.mChunk !=
nullptr && mItems[i].mSecond.mChunk == pChunk) {
369 mItems[i].mFirst.mChunk =
nullptr;
370 mItems[i].mSecond.mChunk =
nullptr;
374 if (mItems[i].mFirst.mChunk !=
nullptr && mItems[i].mFirst.mChunk == pChunk) {
375 mItems[i].mFirst.mChunk =
nullptr;
379 if (mItems[i].mFirst.mChunk !=
nullptr || mItems[i].mSecond.mChunk !=
nullptr) {
387bool CameraManEvent::isChunkFIFOEmpty()
const {
388 for (u32 i = 0; i < NR_FIFO_ITEMS; i++) {
389 if (mItems[i].mFirst.mChunk !=
nullptr) {
393 if (mItems[i].mSecond.mChunk !=
nullptr) {
402 u32 frames = getInterpolateFrame(pChunk, a2);
408 mDirector->setInterpolation(frames);
414 if (pChunk->mEnableErpFrame != 0) {
415 frames = pChunk->mExParam.mCamInt;
418 if (frames < 0 && a2 >= 0) {
432 if (pChunk->mEnableEndErpFrame) {
433 frames = pChunk->mCamEndInt;
435 else if (pChunk->mEnableErpFrame) {
436 frames = pChunk->mExParam.mCamInt;
439 if (frames < 0 && a2 >= 0) {
447 mDirector->setInterpolation(frames);
453 for (i = 0; i < NR_FIFO_ITEMS; i++) {
454 if (mItems[i].mFirst.mChunk == pChunk) {
458 if (mItems[i].mSecond.mChunk == pChunk) {
467 for (u32 i = 0; i < NR_FIFO_ITEMS; i++) {
468 if (mItems[i].mFirst.mChunk == pChunk || mItems[i].mSecond.mChunk == pChunk) {
476bool CameraManEvent::isAnimCameraEnd(
long zoneID,
const char *pName)
const {
477 mHolder->getIndexOf(
"CAM_TYPE_ANIM");
480 if (isInFIFO(chunk)) {
481 if (chunk == mChunk && mCamera !=
nullptr) {
482 return reinterpret_cast<CameraAnim *
>(mCamera)->isAnimEnd();
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)