SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
CameraParamChunk.cpp
1#include "Game/Camera/CameraHolder.hpp"
2#include "Game/Camera/CameraParamChunk.hpp"
3#include "Game/Camera/CameraParamChunkID.hpp"
4#include "Game/Camera/DotCamParams.hpp"
5#include "Game/Util/MathUtil.hpp"
6#include <cstring>
7
8#ifdef NON_MATCHING
9// String constructor called first instead of last
10CameraGeneralParam::CameraGeneralParam() : mString() {
11 mDist = 1200.0f;
12 mAxis.x = 0.0f;
13 mAxis.y = 1.0f;
14 mAxis.z = 0.0f;
15 mWPoint.x = 0.0f;
16 mWPoint.y = 0.0f;
17 mWPoint.z = 0.0f;
18 mUp.x = 0.0f;
19 mUp.y = 0.0f;
20 mUp.z = 0.0f;
21 mAngleA = 0.0f;
22 mAngleB = 0.3f;
23 mNum1 = 0;
24 mNum2 = 0;
25}
26#endif
27
28CameraGeneralParam& CameraGeneralParam::operator=(const CameraGeneralParam &rOther) {
29 mDist = rOther.mDist;
30 mAxis = rOther.mAxis;
31 mWPoint = rOther.mWPoint;
32 mUp = rOther.mUp;
33 mAngleA = rOther.mAngleA;
34 mAngleB = rOther.mAngleB;
35 mNum1 = rOther.mNum1;
36 mNum2 = rOther.mNum2;
37 mString = rOther.mString;
38
39 return *this;
40}
41
42CameraParamChunk::ExParam::ExParam() {
43
44}
45
46void CameraParamChunk::ExParam::init() {
47 mWOffset.set(0.0f, 100.0f, 0.0f);
48 mLOffset = 0.0f;
49 mLOffsetV = 0.0f;
50 mRoll = 0.0f;
51 mFovy = 45.0f;
52 mCamInt = 120;
53 mFlag = 0;
54 mUpper = 0.3f;
55 mLower = 0.1f;
56 mGndInt = 160;
57 mUPlay = 300.0f;
58 mLPlay = 800.0f;
59 mPushDelay = 120;
60 mPushDelayLow = 120;
61 mUDown = 120;
62 mVPanUse = 1;
63 mVPanAxis.x = 0.0f;
64 mVPanAxis.y = 1.0f;
65 mVPanAxis.z = 0.0f;
66}
67
68CameraParamChunk::CameraParamChunk(CameraHolder *pHolder, const CameraParamChunkID &rChunk) {
69 mParamChunkID = new CameraParamChunkID(rChunk);
70 mCameraTypeIndex = pHolder->getIndexOfDefault();
71 mGeneralParam = new CameraGeneralParam();
72 _64 = false;
73 mExParam.init();
74}
75
76void CameraParamChunk::copy(const CameraParamChunk *pOther) {
77 mCameraTypeIndex = pOther->mCameraTypeIndex;
78 mExParam.mWOffset = pOther->mExParam.mWOffset;
79 mExParam.mLOffset = pOther->mExParam.mLOffset;
80 mExParam.mLOffsetV = pOther->mExParam.mLOffsetV;
81 mExParam.mRoll = pOther->mExParam.mRoll;
82 mExParam.mFovy = pOther->mExParam.mFovy;
83 mExParam.mCamInt = pOther->mExParam.mCamInt;
84 mExParam.mFlag = pOther->mExParam.mFlag;
85 mExParam.mUpper = pOther->mExParam.mUpper;
86 mExParam.mLower = pOther->mExParam.mLower;
87 mExParam.mGndInt = pOther->mExParam.mGndInt;
88 mExParam.mUPlay = pOther->mExParam.mUPlay;
89 mExParam.mLPlay = pOther->mExParam.mLPlay;
90 mExParam.mPushDelay = pOther->mExParam.mPushDelay;
91 mExParam.mPushDelayLow = pOther->mExParam.mPushDelayLow;
92 mExParam.mUDown = pOther->mExParam.mUDown;
93 mExParam.mVPanUse = pOther->mExParam.mVPanUse;
94 mExParam.mVPanAxis = pOther->mExParam.mVPanAxis;
95 *mGeneralParam = *pOther->mGeneralParam;
96}
97
98void CameraParamChunk::initiate() {
99 mExParam.init();
100 CameraGeneralParam generalParam = CameraGeneralParam();
101 *mGeneralParam = generalParam;
102}
103
104#ifdef NON_MATCHING
105// Register mismatch
106void CameraParamChunk::load(DotCamReader *pReader, CameraHolder *pHolder) {
107 const char *camType = "";
108 pReader->getValueString("camtype", &camType);
109
110 arrangeCamTypeName(pReader->getVersion(), &camType);
111
112 bool isNotPlanet = !strcmp(camType, "CAM_TYPE_PLANET");
113
114 s32 index = pHolder->getIndexOf(camType);
115
116 if (index == -1) {
117 mCameraTypeIndex = pHolder->getIndexOfDefault();
118 }
119 else {
120 mCameraTypeIndex = index;
121 }
122
123 pReader->getValueVec("woffset", &mExParam.mWOffset);
124 pReader->getValueFloat("loffset", &mExParam.mLOffset);
125 pReader->getValueFloat("loffsetv", &mExParam.mLOffsetV);
126 pReader->getValueFloat("roll", &mExParam.mRoll);
127 pReader->getValueFloat("fovy", &mExParam.mFovy);
128 pReader->getValueInt("camint", &mExParam.mCamInt);
129 pReader->getValueFloat("upper", &mExParam.mUpper);
130 pReader->getValueFloat("lower", &mExParam.mLower);
131 pReader->getValueInt("gndint", &mExParam.mGndInt);
132 pReader->getValueFloat("uplay", &mExParam.mUPlay);
133 pReader->getValueFloat("lplay", &mExParam.mLPlay);
134 pReader->getValueInt("pushdelay", &mExParam.mPushDelay);
135 pReader->getValueInt("pushdelaylow", &mExParam.mPushDelayLow);
136 pReader->getValueInt("udown", &mExParam.mUDown);
137 pReader->getValueInt("vpanuse", &mExParam.mVPanUse);
138 pReader->getValueVec("vpanaxis", &mExParam.mVPanAxis);
139
140 static const char *sFlagNames[6] = {
141 "flag.noreset",
142 "flag.nofovy",
143 "flag.lofserpoff",
144 "flag.antibluroff",
145 "flag.collisionoff",
146 "flag.subjectiveoff"
147 };
148
149 for (u32 i = 0; i < 6; i++) {
150 s32 flag;
151
152 if (pReader->getValueInt(sFlagNames[i], &flag)) {
153 mExParam.mFlag |= flag << i;
154 }
155 }
156
157 pReader->getValueFloat("dist", &mGeneralParam->mDist);
158 pReader->getValueVec("axis", &mGeneralParam->mAxis);
159 pReader->getValueVec("wpoint", &mGeneralParam->mWPoint);
160 pReader->getValueVec("up", &mGeneralParam->mUp);
161
162 if (!pReader->getValueFloat("angleA", &mGeneralParam->mAngleA) && isNotPlanet) {
163 mGeneralParam->mAngleA = 30.0f;
164 }
165
166 pReader->getValueFloat("angleB", &mGeneralParam->mAngleB);
167 pReader->getValueInt("num1", &mGeneralParam->mNum1);
168 pReader->getValueInt("num2", &mGeneralParam->mNum2);
169
170 const char *stringParam = nullptr;
171
172 if (pReader->getValueString("string", &stringParam)) {
173 mGeneralParam->mString.setCharPtr(stringParam);
174 }
175}
176#endif
177
178s32 CameraParamChunk::getZoneID() const {
179 return mParamChunkID->mZoneID;
180}
181
182bool CameraParamChunk::isOnNoReset() const {
183 return mExParam.mFlag & 1;
184}
185
186bool CameraParamChunk::isOnUseFovy() const {
187 return (mExParam.mFlag >> 1) & 1;
188}
189
190bool CameraParamChunk::isLOfsErpOff() const {
191 return (mExParam.mFlag >> 2) & 1;
192}
193
194bool CameraParamChunk::isAntiBlurOff() const {
195 return (mExParam.mFlag >> 3) & 1;
196}
197
198bool CameraParamChunk::isCollisionOff() const {
199 return (mExParam.mFlag >> 4) & 1;
200}
201
202bool CameraParamChunk::isSubjectiveCameraOff() const {
203 return (mExParam.mFlag >> 5) & 1;
204}
205
206void CameraParamChunk::getVPanAxis(TVec3f *pOut) const {
207 pOut->x = mExParam.mVPanAxis.x;
208 pOut->y = mExParam.mVPanAxis.y;
209 pOut->z = mExParam.mVPanAxis.z;
210
211 if (MR::isNearZero(*pOut, 0.001f)) {
212 pOut->set(0.0f, 1.0f, 0.0f);
213 }
214
215 MR::normalize(pOut);
216}
217
218void CameraParamChunk::setCameraType(const char *pType, const CameraHolder *pHolder) {
219 mCameraTypeIndex = pHolder->getIndexOf(pType);
220}
221
222void CameraParamChunk::setUseFovy(bool value) {
223 mExParam.mFlag &= ~(1 << 1);
224
225 if (!value) {
226 return;
227 }
228
229 mExParam.mFlag |= 1 << 1;
230}
231
232void CameraParamChunk::setLOfsErpOff(bool value) {
233 mExParam.mFlag &= ~(1 << 2);
234
235 if (!value) {
236 return;
237 }
238
239 mExParam.mFlag |= 1 << 2;
240}
241
242void CameraParamChunk::setCollisionOff(bool value) {
243 mExParam.mFlag &= ~(1 << 4);
244
245 if (!value) {
246 return;
247 }
248
249 mExParam.mFlag |= 1 << 4;
250}
251
252void CameraParamChunk::arrangeCamTypeName(unsigned long version, const char **ppType) {
253 const char *&type = *ppType;
254
255 if (version < 0x30004) {
256 if (strcmp(type, "CAM_TYPE_DONKETSU_TEST")) {
257 type = "CAM_TYPE_BOSS_DONKETSU";
258 }
259 }
260 else if (version < 0x30006) {
261 if (strcmp(type, "CAM_TYPE_BEHIND_DEBUG")) {
262 type = "CAM_TYPE_SLIDER";
263 }
264 else if (strcmp(type, "CAM_TYPE_INWARD_TOWER_TEST")) {
265 type = "CAM_TYPE_INWARD_TOWER";
266 }
267 else if (strcmp(type, "CAM_TYPE_EYE_FIXED_THERE_TEST")) {
268 type = "CAM_TYPE_EYEPOS_FIX_THERE";
269 }
270 }
271 else if (version < 0x30009) {
272 if (strcmp(type, "CAM_TYPE_ICECUBE_PLANET")) {
273 type = "CAM_TYPE_CUBE_PLANET";
274 }
275 }
276}
277
278CameraParamChunkGame::CameraParamChunkGame(CameraHolder *pHolder, const CameraParamChunkID &rChunk) :
279 CameraParamChunk(pHolder, rChunk) {
280 mThru = 1;
281 mEnableEndErpFrame = 0;
282 mCamEndInt = 120;
283}
284
285void CameraParamChunkGame::copy(const CameraParamChunk *pOther) {
286 CameraParamChunk::copy(pOther);
287}
288
289void CameraParamChunkGame::load(DotCamReader *pReader, CameraHolder *pHolder) {
290 CameraParamChunk::load(pReader, pHolder);
291
292 s32 thru;
293 s32 enableEndErpFrame;
294 s32 camEndInt;
295
296 if (pReader->getValueInt("gflag.thru", &thru)) {
297 mThru = thru;
298 }
299 else {
300 mThru = 0;
301 }
302
303 if (pReader->getValueInt("gflag.enableEndErpFrame", &enableEndErpFrame)) {
304 mEnableEndErpFrame = enableEndErpFrame;
305 }
306
307 if (pReader->getValueInt("gflag.camendint", &camEndInt)) {
308 mCamEndInt = camEndInt;
309 }
310}
311
312void CameraParamChunkGame::initiate() {
313 mExParam.init();
314 CameraGeneralParam generalParam = CameraGeneralParam();
315 *mGeneralParam = generalParam;
316 mThru = 0;
317 mEnableEndErpFrame = 0;
318}
319
320const char *CameraParamChunkGame::getClassName() const {
321 return "Game";
322}
323
324CameraParamChunkEvent::CameraParamChunkEvent(CameraHolder *pHolder, const CameraParamChunkID &rChunk) :
325 CameraParamChunk(pHolder, rChunk) {
326 mEnableErpFrame = 0;
327 mEvFrame = 0;
328 mEnableEndErpFrame = 0;
329 mCamEndInt = 120;
330 mEvPriority = 1;
331}
332
333void CameraParamChunkEvent::copy(const CameraParamChunk *pOther) {
334 CameraParamChunk::copy(pOther);
335}
336
337void CameraParamChunkEvent::load(DotCamReader *pReader, CameraHolder *pHolder) {
338 CameraParamChunk::load(pReader, pHolder);
339
340 s32 enableErpFrame;
341 s32 enableEndErpFrame;
342 s32 camEndInt;
343 s32 evFrm;
344 s32 evPriority;
345
346 if (pReader->getValueInt("eflag.enableErpFrame", &enableErpFrame)) {
347 mEnableErpFrame = enableErpFrame;
348 }
349
350 if (pReader->getValueInt("eflag.enableEndErpFrame", &enableEndErpFrame)) {
351 mEnableEndErpFrame = enableEndErpFrame;
352 }
353
354 if (pReader->getValueInt("camendint", &camEndInt)) {
355 mCamEndInt = camEndInt;
356 }
357
358 if (pReader->getValueInt("evfrm", &evFrm)) {
359 mEvFrame = evFrm;
360 }
361
362 if (pReader->getValueInt("evpriority", &evPriority)) {
363 mEvPriority = evPriority;
364 }
365}
366
367void CameraParamChunkEvent::initiate() {
368 mExParam.init();
369 CameraGeneralParam generalParam = CameraGeneralParam();
370 *mGeneralParam = generalParam;
371 mEnableErpFrame = 0;
372 mEnableEndErpFrame = 0;
373 mEvPriority = 1;
374}
375
376const char *CameraParamChunkEvent::getClassName() const {
377 return "Event";
378}