SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
CameraDirector.cpp
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"
29#include <cstring>
30
31namespace {
32 u32 gMovementCounter;
33 const char *gSubjectiveCameraName = "主観カメラ";
34 const char *gStartCameraName = "スタートアニメカメラ";
35 const char *gTalkCameraName = "共通会話カメラ";
36}
37
38void CameraPoseParam::copyFrom(const CameraPoseParam &rOther) {
39 _0.set(rOther._0);
40 _C.set(rOther._C);
41 _18.set(rOther._18);
42 _24.set(rOther._24);
43 _30 = rOther._30;
44 _34.set(rOther._34);
45 _40.set(rOther._40);
46 _4C = rOther._4C;
47 _50 = rOther._50;
48 _54 = rOther._54;
49}
50
51char *CameraParamChunkID_Tmp::getBuffer(unsigned long size) {
52 return &mBuffer[0];
53}
54
55bool CameraMan::isInterpolationOff() const {
56 return false;
57}
58
59bool CameraMan::isCollisionOff() const {
60 return false;
61}
62
63bool CameraMan::isZeroFrameMoveOff() const {
64 return false;
65}
66
67bool CameraMan::isSubjectiveCameraOff() const {
68 return false;
69}
70
71bool CameraMan::isCorrectingErpPositionOff() const {
72 return false;
73}
74
75bool CameraMan::isEnableToReset() const {
76 return false;
77}
78
79bool CameraMan::isEnableToRoundLeft() const {
80 return false;
81}
82
83bool CameraMan::isEnableToRoundRight() const {
84 return false;
85}
86
87void CameraMan::roundLeft() {
88
89}
90
91void CameraMan::roundRight() {
92
93}
94
95CameraDirector::CameraDirector(const char *pName) : NameObj(pName) {
96 _C = 0;
97 mStack = new CameraManStack();
98 mOnlyCamera = new OnlyCamera("OnlyCamera");
99 mPoseParam1 = new CameraPoseParam();
100 mPoseParam2 = new CameraPoseParam();
101 mHolder = new CameraHolder("カメラホルダー");
102 mChunkHolder = new CameraParamChunkHolder(mHolder, "パラメータ");
103 mCameraCreator = new GameCameraCreator(mChunkHolder);
104 mRailHolder = new CameraRailHolder("カメラレール管理");
105 mRegisterHolder = new CameraRegisterHolder("カメラレジスタ");
106 mTargetHolder = new CameraTargetHolder();
107 mShaker = new CameraShaker("振動");
108 mViewInterpolator = new CameraViewInterpolator();
109 mCover = new CameraCover("CameraCover");
110 mRotChecker = new CameraRotChecker();
111 mCameraManGame = new CameraManGame(mHolder, mChunkHolder, "ゲームカメラマン");
112 mCameraManEvent = new CameraManEvent(mHolder, mChunkHolder, "イベントカメラマン");
113 mCameraManPause = new CameraManPause("ポーズカメラマン");
114 mCameraManSubjective = new CameraManSubjective("主観カメラマン");
115 _58 = false;
116 _16C = 0;
117 _170 = true;
118 _174 = 0;
119 mStartCameraCreated = false;
120 mTargetMatrix = new CameraTargetMtx("カメラターゲットダミー");
121 mRequestCameraManReset = false;
122 _1B1 = false;
123 mIsSubjectiveCamera = false;
124 _1B3 = false;
125 _1B4 = 0;
126 _1BC = -100.0f;
127 _1F0 = false;
128 _1F1 = true;
129 _1F2 = false;
130
131 MR::connectToSceneCamera(this);
132 push(mCameraManGame);
133 _180.identity();
134 JMath::gekko_ps_copy12(&mTargetMatrix->mMatrix, &_180);
135 setInterpolation(0);
136 mCameraManSubjective->owned(this);
137 _1C0.identity();
138 MR::createCenterScreenBlur();
139}
140
141CameraDirector::~CameraDirector() {
142
143}
144
146
147}
148
149void CameraDirector::movement() {
150 gMovementCounter++;
151 backLastMtx();
152 mTargetHolder->movement();
153 updateCameraMan();
154 calcPose();
155 createViewMtx();
156 TPos3f *invView = MR::getCameraInvViewMtx();
157 JMath::gekko_ps_copy12(&getCurrentCameraMan()->mMatrix, invView);
158 mPoseParam2->copyFrom(*getCurrentCameraMan()->mPoseParam);
159 calcSubjective();
160 mShaker->movement();
161 checkStartCondition();
162 checkEndOfEventCamera();
163 mRotChecker->update();
164 mRequestCameraManReset = false;
165 _1B1 = false;
166}
167
168void CameraDirector::setTarget(CameraTargetObj *pTarget) {
169 mTargetHolder->set(pTarget);
170}
171
172CameraTargetObj *CameraDirector::getTarget() {
173 return mTargetHolder->get();
174}
175
176void CameraDirector::push(CameraMan *pMan) {
177 if (mStack->mCount != 0) {
178 CameraMan *man = getCurrentCameraMan();
179 man->deactivate(this);
180 }
181
182 mStack->mElements[mStack->mCount++] = pMan;
183
184 pMan->owned(this);
185 pMan->activate(this);
186}
187
188CameraMan *CameraDirector::pop() {
189 CameraMan *man = mStack->mElements[--mStack->mCount];
190
191 man->deactivate(this);
192 man->released(this);
193
194 if (mStack->mCount != 0) {
195 CameraMan *newMan = getCurrentCameraMan();
196 newMan->activate(this);
197 }
198
199 return man;
200}
201
202void CameraDirector::backLastMtx() {
203 if (_1F0) {
204 MR::setCameraViewMtx(_1C0, false, false, TVec3f(0.0f, 0.0f, 0.0f));
205 TPos3f *invView = MR::getCameraInvViewMtx();
206
207 TVec3f invTrans;
208 invView->getTrans(invTrans);
209 }
210}
211
212CameraMan *CameraDirector::getCurrentCameraMan() const {
213 return mStack->mElements[mStack->mCount - 1];
214}
215
216void CameraDirector::updateCameraMan() {
217 if (mRequestCameraManReset) {
218 resetCameraMan();
219 }
220
221 if (_1B1) {
222 CameraMan *man = getCurrentCameraMan();
223 man->_15 = true;
224 }
225
226 getCurrentCameraMan()->movement();
227 controlCameraSE();
228}
229
230void CameraDirector::calcPose() {
231 switchAntiOscillation();
232
233 if (getCurrentCameraMan()->isCollisionOff()) {
234 mViewInterpolator->_7C = true;
235 }
236
237 if (getCurrentCameraMan()->isCorrectingErpPositionOff()) {
238 mViewInterpolator->_8A = false;
239 }
240
241 if (getCurrentCameraMan()->isZeroFrameMoveOff()) {
242 mOnlyCamera->_3C = true;
243 }
244
245 mOnlyCamera->calcPose(getCurrentCameraMan());
246 mPoseParam1->copyFrom(*mOnlyCamera->mPoseParam);
247}
248
249/*void CameraDirector::calcSubjective() {
250
251}*/
252
253bool CameraDirector::isInterpolationOff() {
254 bool off = false;
255
256 CameraMan *man = getCurrentCameraMan();
257
258 if (man->isInterpolationOff() || mViewInterpolator->_9) {
259 off = true;
260 }
261
262 return off;
263}
264
265void CameraDirector::switchAntiOscillation() {
266 if (isInterpolationOff()) {
267 mViewInterpolator->_8 = false;
268 }
269 else {
270 mViewInterpolator->_8 = true;
271 }
272}
273
274void CameraDirector::createViewMtx() {
275 TPos3f view;
276 calcViewMtxFromPoseParam(&view, mPoseParam1);
277
278 CameraPoseParam *poseParam = mPoseParam1;
279 CameraTargetObj *target = _C;
280 TVec3f &vec = poseParam->_C;
281
282 CameraMan *man = getCurrentCameraMan();
283 f32 fovy = CameraLocalUtil::getFovy(man);
284 mViewInterpolator->updateCameraMtx(reinterpret_cast<MtxPtr>(&view), vec, target, fovy);
285}
286
287void CameraDirector::checkStartCondition() {
288 if (_170 && getCurrentCameraMan() == mCameraManGame && _174++ > 30 && mTargetHolder->isMoving()) {
289 _170 = false;
290 mCameraManGame->endStartPosCamera();
291 }
292}
293
294void CameraDirector::startEvent(long zoneID, const char * pName, const CameraTargetArg &rTargetArg, long a4) {
295 mViewInterpolator->_A = false;
296 removeEndEventAtLanding(zoneID, pName);
297
298 if (getCurrentCameraMan() != mCameraManEvent) {
299 if (mStack->mCount != 0) {
300 CameraMan *gameMan = mCameraManGame;
301
302 if (getCurrentCameraMan() == gameMan) {
303 mCameraManEvent->mPoseParam->copyFrom(*gameMan->mPoseParam);
304 TPos3f *invView = MR::getCameraInvViewMtx();
305 JMath::gekko_ps_copy12(&mCameraManEvent->mMatrix, invView);
306 }
307 }
308
309 push(mCameraManEvent);
310 }
311
312 mCameraManEvent->start(zoneID, pName, rTargetArg, a4);
313}
314
315void CameraDirector::endEvent(long zoneID, const char *pName, bool a3, long a4) {
316 if (getCurrentCameraMan() == mCameraManEvent) {
317 mCameraManEvent->end(zoneID, pName, a4);
318
319 if (!mCameraManEvent->isActive()) {
320 pop();
321
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);
326 }
327
328 mViewInterpolator->_A = true;
329 }
330 }
331}
332
333/*void CameraDirector::endEventAtLanding(long a1, const char *pName, long a3) {
334 if (getCurrentCameraMan() == mCameraManEvent) {
335 _5C[_16C][0] = a1;
336 strcpy(reinterpret_cast<char *>(_5C[_16C][1]), pName);
337 _5C[_16C][0x21] = a3;
338 _16C++;
339 }
340}*/
341
342CameraParamChunkEvent *CameraDirector::getEventParameter(long zoneID, const char *pName) {
344 chunkID.createEventID(zoneID, pName);
345
346 return reinterpret_cast<CameraParamChunkEvent *>(mChunkHolder->getChunk(chunkID));
347}
348
349void CameraDirector::requestToResetCameraMan() {
350 mRequestCameraManReset = true;
351}
352
353void CameraDirector::setInterpolation(unsigned long a1) {
354 mViewInterpolator->setInterpolation(a1);
355
356 if (a1 == 0 && !_170) {
357 mViewInterpolator->_7C = true;
358 mCover->cover(2);
359 }
360}
361
362void CameraDirector::cover(unsigned long a1) {
363 mCover->cover(a1);
364}
365
366void CameraDirector::closeCreatingCameraChunk() {
367 mCameraCreator->scanArea();
368 mCameraCreator->scanStartPos();
369 createStartAnimCamera();
370 createTalkCamera();
371 createSubjectiveCamera();
372 mCameraManGame->closeCreatingCameraChunk();
373 mChunkHolder->loadCameraParameters();
374 mChunkHolder->sort();
375 _170 = true;
376 mCameraManGame->startStartPosCamera(false);
377}
378
379void CameraDirector::initCameraCodeCollection(const char *a1, long a2) {
380 mCameraCreator->initCameraCodeCollection(a1, a2);
381}
382
383void CameraDirector::registerCameraCode(unsigned long code) {
384 mCameraCreator->registerCameraCode(code);
385}
386
387void CameraDirector::termCameraCodeCollection() {
388 mCameraCreator->termCameraCodeCollection();
389}
390
391void CameraDirector::declareEvent(long zoneID, const char *pName) {
393 chunkID.createEventID(zoneID, pName);
394
395 mChunkHolder->createChunk(chunkID, nullptr);
396}
397
398void CameraDirector::started() {
399 _170 = false;
400 mCameraManGame->endStartPosCamera();
401}
402
403void CameraDirector::setTargetActor(const LiveActor *pActor) {
404 mTargetHolder->set(pActor);
405}
406
407void CameraDirector::setTargetPlayer(const MarioActor *pActor) {
408 mTargetHolder->set(pActor);
409}
410
411bool CameraDirector::isRotatingHard() const {
412 return mRotChecker->_30;
413}
414
415bool CameraDirector::isSubjectiveCamera() const {
416 return mIsSubjectiveCamera;
417}
418
419bool CameraDirector::isEnableToControl() const {
420 bool enable = false;
421
422 if (!getCurrentCameraMan()->isSubjectiveCameraOff()) {
423 bool change = true;
424 bool equals = getCurrentCameraMan() == mCameraManEvent;
425
426 if (equals && !isEventCameraActive(0, gSubjectiveCameraName)) {
427 change = false;
428 }
429
430 if (change) {
431 enable = true;
432 }
433 }
434
435 return enable;
436}
437
438bool CameraDirector::isEnableToRoundLeft() const {
439 return getCurrentCameraMan()->isEnableToRoundLeft();
440}
441
442bool CameraDirector::isEnableToRoundRight() const {
443 return getCurrentCameraMan()->isEnableToRoundRight();
444}
445
446bool CameraDirector::isEnableToReset() const {
447 return getCurrentCameraMan()->isEnableToReset();
448}
449
450bool CameraDirector::isEventCameraActive(long zoneID, const char *pName) const {
451 if (getCurrentCameraMan() == mCameraManEvent) {
452 return mCameraManEvent->isEventActive(zoneID, pName);
453 }
454
455 return false;
456}
457
458bool CameraDirector::isEventCameraActive() const {
459 return getCurrentCameraMan() == mCameraManEvent;
460}
461
462void CameraDirector::startStartPosCamera(bool a1) {
463 _170 = true;
464 mCameraManGame->startStartPosCamera(a1);
465}
466
467bool CameraDirector::isInterpolatingNearlyEnd() const {
468 if (getCurrentCameraMan() == mCameraManEvent && mCameraManEvent->doesNextChunkHaveInterpolation()) {
469 return false;
470 }
471
472 return mViewInterpolator->isInterpolatingNearlyEnd();
473}
474
475bool CameraDirector::isForceCameraChange() const {
476 return mViewInterpolator->_9;
477}
478
479f32 CameraDirector::getDefaultFovy() const {
480 return 45.0f;
481}
482
483void CameraDirector::startStartAnimCamera() {
484 if (mStartCameraCreated) {
485 ActorCameraInfo info = ActorCameraInfo(-1, 0);
486 CameraTargetArg targetArg = CALL_INLINE_FUNC(CameraTargetArg, mTargetMatrix);
487
488 MR::startEventCamera(&info, gStartCameraName, targetArg, 0);
489 }
490}
491
492bool CameraDirector::isStartAnimCameraEnd() const {
493 if (mStartCameraCreated) {
494 return isAnimCameraEnd(0, gStartCameraName);
495 }
496
497 return true;
498}
499
500u32 CameraDirector::getStartAnimCameraFrame() const {
501 if (mStartCameraCreated) {
502 return getAnimCameraFrame(0, gStartCameraName);
503 }
504
505 return 0;
506}
507
508void CameraDirector::endStartAnimCamera() {
509 ActorCameraInfo info = ActorCameraInfo(-1, 0);
510 MR::endEventCamera(&info, gStartCameraName, true, 0);
511}
512
513#ifndef NON_MATCHING
514// Register mismatch
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);
519
520 CameraParamChunk *chunk = mChunkHolder->getChunk(chunkID);
521
522 if (chunk != nullptr) {
523 chunk->mGeneralParam->mWPoint.set(rPosition);
524 chunk->mGeneralParam->mUp.set(rUp);
525
526 CameraGeneralParam *generalParam = chunk->mGeneralParam;
527 generalParam->mAxis.x = axisX;
528 generalParam->mAxis.y = axisY;
529 generalParam->mAxis.z = 0.0f;
530
531 CameraTargetArg targetArg = CALL_INLINE_FUNC_NO_ARG(CameraTargetArg);
532
533 MR::setCameraTargetToPlayer(&targetArg);
534 startEvent(0, name, targetArg, a5);
535 }
536}
537#endif
538
539void CameraDirector::endTalkCamera(bool a1, long a2) {
540 endEvent(0, gTalkCameraName, a1, a2);
541}
542
543void CameraDirector::startSubjectiveCamera(long a1) {
544 _170 = false;
545 mCameraManGame->endStartPosCamera();
546 mIsSubjectiveCamera = true;
547
548 if (!_1B3) {
549 _1B3 = true;
550 _1B4 = 0;
551
552 mCameraManSubjective->activate(this);
553 f32 nearZ = MR::getNearZ();
554 _1BC = nearZ;
555
556 MR::setNearZ(10.0f);
557 MR::turnOffDOFInSubjective();
558 }
559
560 if (_1B4 < 20) {
561 MR::startCenterScreenBlur(20, 15.0f, 80, 5, 10);
562 }
563}
564
565void CameraDirector::endSubjectiveCamera(long a1) {
566 bool bVar1 = a1 == 0 || a1 == 1;
567
568 if (mIsSubjectiveCamera == true) {
569 mIsSubjectiveCamera = false;
570
571 if (!bVar1) {
572 MR::startCenterScreenBlur(_1B4, 15.0f, 80, 5, 10);
573 }
574 }
575
576 if (_1B3 && bVar1) {
577 _1B4 = 0;
578 }
579}
580
581bool CameraDirector::isAnimCameraEnd(long zoneID, const char *pName) const {
582 CameraManEvent *eventMan = mCameraManEvent;
583 CameraMan *man = getCurrentCameraMan();
584
585 if (man == eventMan) {
586 return eventMan->isAnimCameraEnd(zoneID, pName);
587 }
588
589 return true;
590}
591
592u32 CameraDirector::getAnimCameraFrame(long zoneID, const char *pName) const {
593 CameraManEvent *eventMan = mCameraManEvent;
594 CameraMan *man = getCurrentCameraMan();
595
596 if (man == eventMan) {
597 return eventMan->getAnimCameraFrame(zoneID, pName);
598 }
599
600 return 0;
601}
602
603void CameraDirector::pauseOnAnimCamera(long zoneID, const char *pName) {
604 CameraManEvent *eventMan = mCameraManEvent;
605 CameraMan *man = getCurrentCameraMan();
606
607 if (man == eventMan) {
608 eventMan->pauseOnAnimCamera(zoneID, pName);
609 }
610}
611
612void CameraDirector::pauseOffAnimCamera(long zoneID, const char *pName) {
613 CameraManEvent *eventMan = mCameraManEvent;
614 CameraMan *man = getCurrentCameraMan();
615
616 if (man == eventMan) {
617 eventMan->pauseOffAnimCamera(zoneID, pName);
618 }
619}
620
621void CameraDirector::zoomInGameCamera() {
622 mCameraManGame->zoomIn();
623}
624
625void CameraDirector::zoomOutGameCamera() {
626 mCameraManGame->zoomOut();
627}
628
629/*void CameraDirector::checkEndOfEventCamera() {
630 if (_16C != 0 && mTargetHolder->isOnGround()) {
631 for (u32 i = 0; i < _16C; i++) {
632 endEvent(_5C[i][0], reinterpret_cast<const char *>(_5C[i][4]), true, _5C[i][33]);
633 }
634
635 _16C = 0;
636 }
637}*/
638
639/*void CameraDirector::controlCameraSE() {
640
641}*/
642
643/*void CameraDirector::removeEndEventAtLanding(long, const char *) {
644
645}*/
646
647/*void CameraDirector::calcViewMtxFromPoseParam(TPos3f *, const CameraPoseParam *) {
648
649}*/
650
651bool CameraDirector::isPlayableCameraSE(bool a1) {
652 if (MR::isDemoActive()) {
653 return false;
654 }
655
656 if (MR::isPowerStarGetDemoActive()) {
657 return false;
658 }
659
660 if (MR::isStageStateScenarioOpeningCamera()) {
661 return false;
662 }
663
664 if (MR::isExecScenarioStarter()) {
665 return false;
666 }
667
668 if (MR::isPlayerDead()) {
669 return false;
670 }
671
672 if (MR::isEqualStageName("FileSelect")) {
673 return false;
674 }
675
676 if (MR::isEqualStageName("EpilogueDemoStage")) {
677 return false;
678 }
679
680 if (a1 && mIsSubjectiveCamera) {
681 return false;
682 }
683
684 return true;
685}
686
687void CameraDirector::resetCameraMan() {
688 setInterpolation(0);
689
690 CameraTargetObj *target1;
691 CameraTargetObj *target2;
692 CameraTargetObj *target3;
693 CameraMan *man = getCurrentCameraMan();
694
695 target1 = mTargetHolder->get();
696 target2 = mTargetHolder->get();
697 target3 = mTargetHolder->get();
698
699 TVec3f newPos = *target3->getPosition() - *target2->getFrontVec() * 800.0f + *target1->getUpVec() * 300.0f;
700
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());
705
706 man->deactivate(this);
707 man->activate(this);
708
709 mOnlyCamera->_3D = true;
710}
711
712void CameraDirector::createStartAnimCamera() {
713 void *data = nullptr;
714 s32 size = 0;
715 MR::getCurrentScenarioStartAnimCameraData(&data, &size);
716
717 if (size > 0) {
718 ActorCameraInfo info = ActorCameraInfo(-1, 0);
719 MR::declareEventCameraAnim(&info, gStartCameraName, data);
720 mStartCameraCreated = true;
721 }
722}
723
724void CameraDirector::createTalkCamera() {
725 const char *name = gTalkCameraName;
727 chunkID.createEventID(0, name);
728
729 mChunkHolder->createChunk(chunkID, nullptr);
730
731 const char *name2 = gTalkCameraName;
733 chunkID2.createEventID(0, name2);
734
735 CameraParamChunk *chunk2 = mChunkHolder->getChunk(chunkID2);
736
737 if (chunk2 != nullptr) {
738 chunk2->setCameraType("CAM_TYPE_TALK", mHolder);
739 chunk2->_64 = true;
740 }
741}
742
743void CameraDirector::createSubjectiveCamera() {
744 const char *name = gSubjectiveCameraName;
746 chunkID.createEventID(0, name);
747
748 mChunkHolder->createChunk(chunkID, nullptr);
749
750 const char *name2 = gSubjectiveCameraName;
752 chunkID2.createEventID(0, name2);
753
754 CameraParamChunk *chunk2 = mChunkHolder->getChunk(chunkID2);
755
756 if (chunk2 != nullptr) {
757 chunk2->setCameraType("CAM_TYPE_SUBJECTIVE", mHolder);
758 chunk2->_64 = true;
759 }
760}
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)
Definition LiveActor.hpp:24
The most basic form of an object.
Definition NameObj.hpp:11