SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
CameraParamChunkHolder.cpp
1#include "Game/Camera/CameraHolder.hpp"
2#include "Game/Camera/CameraLocalUtil.hpp"
3#include "Game/Camera/CameraParamChunk.hpp"
4#include "Game/Camera/CameraParamChunkHolder.hpp"
5#include "Game/Camera/CameraParamChunkID.hpp"
6#include "Game/Camera/DotCamParams.hpp"
7#include "Game/Util/SceneUtil.hpp"
8#include "JSystem/JKernel/JKRHeap.hpp"
9#include <cstring>
10
11#define CHUNK_CAPACITY 0x400
12
13CameraParamChunkHolder::CameraParamChunkHolder(CameraHolder *pCameraHolder, const char *pName) : NameObj(pName) {
14 mCameraHolder = pCameraHolder;
15 mChunkCapacity = CHUNK_CAPACITY;
16 mNrChunks = 0;
17 mChunks = new CameraParamChunk *[CHUNK_CAPACITY];
18 mIsSorted = 0;
19}
20
21CameraParamChunkHolder::~CameraParamChunkHolder() {
22
23}
24
25CameraParamChunk *CameraParamChunkHolder::createChunk(const CameraParamChunkID &rID, JKRHeap *pHeap) {
26 if (isNewAttribute(rID)) {
27 char firstChar = rID.mName[0];
28 CameraParamChunk *chunk;
29
30 if (firstChar == 'e') {
31 chunk = new(pHeap, 0) CameraParamChunkEvent(mCameraHolder, rID);
32 }
33 else if (firstChar == 'g' || firstChar == 'c' || firstChar == 's') {
34 chunk = new(pHeap, 0) CameraParamChunkGame(mCameraHolder, rID);
35 }
36 else {
37 chunk = new(pHeap, 0) CameraParamChunk(mCameraHolder, rID);
38 }
39
40 mChunks[mNrChunks++] = chunk;
41
42 return chunk;
43 }
44
45 return nullptr;
46}
47
48CameraParamChunk *CameraParamChunkHolder::getChunk(const CameraParamChunkID &rID) {
49 if (rID.mName == nullptr) {
50 return nullptr;
51 }
52
53 return findChunk(rID);
54}
55
56void CameraParamChunkHolder::sort() {
57 // Selection sort
58 for (s32 i = 0; i < mNrChunks - 1; i++) {
59 s32 minIndex = i;
60
61 for (s32 j = i + 1; j < mNrChunks; j++) {
62 if (*mChunks[j]->mParamChunkID > *mChunks[minIndex]->mParamChunkID) {
63 minIndex = j;
64 }
65 }
66
67 if (minIndex != i) {
68 CameraParamChunk *temp = mChunks[i];
69 mChunks[i] = mChunks[minIndex];
70 mChunks[minIndex] = temp;
71 }
72 }
73
74 mIsSorted = 1;
75}
76
77void CameraParamChunkHolder::loadCameraParameters() {
78 for (s32 i = 0; i < MR::getZoneNum(); i++) {
79 loadFile(i);
80 }
81}
82
83bool CameraParamChunkHolder::isNewAttribute(const CameraParamChunkID &rID) {
84 for (s32 i = 0; i < mNrChunks; i++) {
85 if (*mChunks[i]->mParamChunkID == rID) {
86 return false;
87 }
88 }
89
90 return true;
91}
92
93CameraParamChunk *CameraParamChunkHolder::findChunk(const CameraParamChunkID &rID) {
94 if (mIsSorted) {
95 s32 low = 0;
96 s32 high = mNrChunks - 1;
97
98 while (low < high) {
99 s32 middle = (low + high) / 2;
100
101 if (*mChunks[middle]->mParamChunkID > rID) {
102 low = middle + 1;
103 }
104 else {
105 high = middle;
106 }
107 }
108
109 if (*mChunks[low]->mParamChunkID == rID) {
110 return mChunks[low];
111 }
112 }
113 else {
114 for (s32 i = 0; i < mNrChunks; i++) {
115 if (*mChunks[i]->mParamChunkID == rID) {
116 return mChunks[i];
117 }
118 }
119 }
120
121 return nullptr;
122}
123
124CameraParamChunk *CameraParamChunkHolder::findChunk(long zoneID, const char *pName) {
125 for (s32 i = 0; i < mNrChunks; i++) {
126 if (mChunks[i]->mParamChunkID->equals(zoneID, pName)) {
127 return mChunks[i];
128 }
129 }
130
131 return nullptr;
132}
133
134#ifdef NON_MATCHING
135// Stack is 0x10 bytes smaller
136void CameraParamChunkHolder::loadFile(long zoneID) {
137 void *data;
138 long local44;
139 MR::getStageCameraData(&data, &local44, zoneID);
140
141 if (local44 != 0) {
143 mCameraVersion = reader.mVersion;
144
145 while (reader.hasMoreChunk()) {
146 const char *id = nullptr;
147 reader.getValueString("id", &id);
148
149 CameraParamChunk *chunk = findChunk(zoneID, id);
150
151 if (chunk != nullptr && chunk->_64 != 0) {
152 reader.nextToChunk();
153 }
154 else {
155 if (chunk != nullptr) {
156 chunk->load(&reader, mCameraHolder);
157 arrangeChunk(chunk);
158 }
159
160 reader.nextToChunk();
161 }
162 }
163 }
164}
165#endif
166
167void CameraParamChunkHolder::arrangeChunk(CameraParamChunk *pChunk) {
168 s32 index = pChunk->mCameraTypeIndex;
169
170 if (mCameraHolder->getIndexOf("CAM_TYPE_FOLLOW") == index) {
171 if (mCameraVersion < 0x30001) {
172 CameraGeneralParam *param = pChunk->mGeneralParam;
173
174 param->mAngleA = 0.17453294f; // 10 degrees
175 param->mAngleB = 0.34906587f; // 20 degrees
176 }
177
178 if (mCameraVersion < 0x30002) {
179 pChunk->mGeneralParam->mDist = 0.15f;
180 }
181 }
182
183 if (mCameraVersion < 0x30003) {
184 const char *className = pChunk->getClassName();
185
186 if (strcmp(className, "Game") == 0) {
187 CameraParamChunkGame *pGameChunk = reinterpret_cast<CameraParamChunkGame *>(pChunk);
188 pGameChunk->mThru = 0;
189 }
190 }
191
192 index = pChunk->mCameraTypeIndex;
193
194 if (mCameraHolder->getIndexOf("CAM_TYPE_RAIL_FOLLOW") == index) {
195 if (mCameraVersion < 0x30007) {
196 CameraGeneralParam *param = pChunk->mGeneralParam;
197
198 param->mWPoint.x = 30.0f;
199 param->mWPoint.y = 0.35f;
200 param->mWPoint.z = 0.0f;
201 }
202 }
203
204 if (mCameraVersion < 0x30008) {
205 TVec3f temp;
206 temp.x = 0.0f;
207 temp.y = 1.0f;
208 temp.z = 0.0f;
209
210 pChunk->mExParam.mVPanAxis.x = temp.x;
211 pChunk->mExParam.mVPanAxis.y = temp.y;
212 pChunk->mExParam.mVPanAxis.z = temp.z;
213 }
214
215 if (mCameraVersion < 0x3000A) {
216 index = pChunk->mCameraTypeIndex;
217
218 if (mCameraHolder->getIndexOf("CAM_TYPE_CUBE_PLANET") == index) {
219 pChunk->mGeneralParam->mAngleB = 0.35f;
220 }
221 }
222
223 if (mCameraVersion < 0x3000B) {
224 index = pChunk->mCameraTypeIndex;
225
226 if (mCameraHolder->getIndexOf("CAM_TYPE_WATER_FOLLOW") == index) {
227 pChunk->mGeneralParam->mDist = 0.01f;
228 }
229 }
230
231 if (mCameraVersion < 0x3000C) {
232 index = pChunk->mCameraTypeIndex;
233
234 if (mCameraHolder->getIndexOf("CAM_TYPE_CHARMED_VECREG") == index) {
235 CameraGeneralParam *param = pChunk->mGeneralParam;
236 param->mString.setCharPtr(CameraLocalUtil::getDummyVecRegName());
237 }
238 }
239
240 if (mCameraVersion < 0x3000D) {
241 index = pChunk->mCameraTypeIndex;
242
243 if (mCameraHolder->getIndexOf("CAM_TYPE_FOLLOW") == index) {
244 pChunk->mGeneralParam->mNum1 = 1;
245 }
246 }
247
248 if (mCameraVersion < 0x3000E) {
249 index = pChunk->mCameraTypeIndex;
250
251 if (mCameraHolder->getIndexOf("CAM_TYPE_CHARMED_VECREG") == index) {
252 pChunk->mGeneralParam->mAngleA = 0.5f;
253 }
254 }
255
256 if (mCameraVersion < 0x3000F) {
257 index = pChunk->mCameraTypeIndex;
258
259 if (mCameraHolder->getIndexOf("CAM_TYPE_MEDIAN_TOWER") == index) {
260 pChunk->mGeneralParam->mUp.zero();
261 }
262 }
263
264 if (mCameraVersion < 0x30010) {
265 index = pChunk->mCameraTypeIndex;
266
267 if (mCameraHolder->getIndexOf("CAM_TYPE_MEDIAN_TOWER") == index) {
268 pChunk->mGeneralParam->mUp.y = 0.5f;
269 }
270 }
271
272 if (mCameraVersion < 0x30011) {
273 index = pChunk->mCameraTypeIndex;
274
275 if (mCameraHolder->getIndexOf("CAM_TYPE_CHARMED_VECREG") == index) {
276 pChunk->mGeneralParam->mAngleB = 0.02f;
277 }
278 }
279
280 if (mCameraVersion < 0x30012) {
281 index = pChunk->mCameraTypeIndex;
282
283 if (mCameraHolder->getIndexOf("CAM_TYPE_MEDIAN_TOWER") == index) {
284 pChunk->mGeneralParam->mUp.z = 0.992f;
285 }
286 }
287
288 if (mCameraVersion < 0x30013) {
289 index = pChunk->mCameraTypeIndex;
290
291 if (mCameraHolder->getIndexOf("CAM_TYPE_EYEPOS_FIX_THERE") == index) {
292 pChunk->mExParam.mRoll = 0.0f;
293 }
294 }
295
296 if (mCameraVersion < 0x30014) {
297 index = pChunk->mCameraTypeIndex;
298
299 if (mCameraHolder->getIndexOf("CAM_TYPE_MEDIAN_PLANET") == index) {
300 pChunk->mGeneralParam->mWPoint.x = 0.5f;
301 }
302 }
303
304 if (mCameraVersion < 0x30015) {
305 index = pChunk->mCameraTypeIndex;
306
307 if (mCameraHolder->getIndexOf("CAM_TYPE_DPD") == index) {
308 pChunk->mGeneralParam->mUp.zero();
309 pChunk->mGeneralParam->mNum2 = 0;
310 }
311 }
312
313 if (mCameraVersion < 0x30016) {
314 index = pChunk->mCameraTypeIndex;
315
316 if (mCameraHolder->getIndexOf("CAM_TYPE_XZ_PARA") == index) {
317 pChunk->mGeneralParam->mNum1 = 0;
318 }
319 }
320}
The most basic form of an object.
Definition NameObj.hpp:11