SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
CameraHolder.cpp
1#include "Game/Camera/Camera.hpp"
2#include "Game/Camera/CameraAnim.hpp"
3#include "Game/Camera/CameraBehind.hpp"
4#include "Game/Camera/CameraBlackHole.hpp"
5#include "Game/Camera/CameraCharmedFix.hpp"
6#include "Game/Camera/CameraCharmedTripodBoss.hpp"
7#include "Game/Camera/CameraCharmedVecReg.hpp"
8#include "Game/Camera/CameraCharmedVecRegTower.hpp"
9#include "Game/Camera/CameraCubePlanet.hpp"
10#include "Game/Camera/CameraDPD.hpp"
11#include "Game/Camera/CameraDead.hpp"
12#include "Game/Camera/CameraFix.hpp"
13#include "Game/Camera/CameraFixedPoint.hpp"
14#include "Game/Camera/CameraFixedThere.hpp"
15#include "Game/Camera/CameraFollow.hpp"
16#include "Game/Camera/CameraFooFighter.hpp"
17#include "Game/Camera/CameraFooFighterPlanet.hpp"
18#include "Game/Camera/CameraFrontAndBack.hpp"
19#include "Game/Camera/CameraGround.hpp"
20#include "Game/Camera/CameraHolder.hpp"
21#include "Game/Camera/CameraInnerCylinder.hpp"
22#include "Game/Camera/CameraInwardSphere.hpp"
23#include "Game/Camera/CameraInwardTower.hpp"
24#include "Game/Camera/CameraMedianPlanet.hpp"
25#include "Game/Camera/CameraMedianTower.hpp"
26#include "Game/Camera/CameraMtxRegParallel.hpp"
27#include "Game/Camera/CameraObjParallel.hpp"
28#include "Game/Camera/CameraParallel.hpp"
29#include "Game/Camera/CameraRaceFollow.hpp"
30#include "Game/Camera/CameraRailDemo.hpp"
31#include "Game/Camera/CameraRailFollow.hpp"
32#include "Game/Camera/CameraRailWatch.hpp"
33#include "Game/Camera/CameraSlide.hpp"
34#include "Game/Camera/CameraSpiral.hpp"
35#include "Game/Camera/CameraSubjective.hpp"
36#include "Game/Camera/CameraTalk.hpp"
37#include "Game/Camera/CameraTower.hpp"
38#include "Game/Camera/CameraTowerPos.hpp"
39#include "Game/Camera/CameraTripodBoss.hpp"
40#include "Game/Camera/CameraTripodBossJoint.hpp"
41#include "Game/Camera/CameraTripodPlanet.hpp"
42#include "Game/Camera/CameraTrundle.hpp"
43#include "Game/Camera/CameraTwistedPassage.hpp"
44#include "Game/Camera/CameraWaterFollow.hpp"
45#include "Game/Camera/CameraWaterPlanet.hpp"
46#include "Game/Camera/CameraWaterPlanetBoss.hpp"
47#include "Game/Camera/CameraWonderPlanet.hpp"
48#include <cstring>
49
51 const char *mName; // _0
52 const char *mJapaneseDescription; // _4
53 Camera* (*mCreateFunction)(void); // _8
54 u8 _C;
55 u8 _D[3];
56};
57
58namespace {
59 const char *gDefaultCameraName = "CAM_TYPE_XZ_PARA";
60
61 template<typename T>
62 Camera *createCamera();
63
64 template<>
65 Camera *createCamera<CameraParallel>() {
66 return new CameraParallel("平行カメラ");
67 }
68
69 template<>
70 Camera *createCamera<CameraTower>() {
71 return new CameraTower("塔カメラ");
72 }
73
74 template<>
75 Camera *createCamera<CameraFollow>() {
76 return new CameraFollow("フォローカメラ");
77 }
78
79 template<>
80 Camera *createCamera<CameraWonderPlanet>() {
81 return new CameraWonderPlanet("ワンダープラネットカメラ");
82 }
83
84 template<>
85 Camera *createCamera<CameraFix>() {
86 return new CameraFix("完全固定カメラ");
87 }
88
89 template<>
90 Camera *createCamera<CameraFixedPoint>() {
91 return new CameraFixedPoint("定点カメラ");
92 }
93
94 template<>
95 Camera *createCamera<CameraBehind>() {
96 return new CameraBehind("後方カメラ");
97 }
98
99 template<>
100 Camera *createCamera<CameraInwardTower>() {
101 return new CameraInwardTower("塔内部カメラ");
102 }
103
104 template<>
105 Camera *createCamera<CameraFixedThere>() {
106 return new CameraFixedThere("その場定点カメラ");
107 }
108
109 template<>
110 Camera *createCamera<CameraTripodBoss>() {
111 return new CameraTripodBoss("三脚ボスカメラ");
112 }
113
114 template<>
115 Camera *createCamera<CameraTowerPos>() {
116 return new CameraTowerPos("塔カメラ(サブターゲット付き)");
117 }
118
119 template<>
120 Camera *createCamera<CameraTripodPlanet>() {
121 return new CameraTripodPlanet("三脚惑星カメラ");
122 }
123
124 template<>
125 Camera *createCamera<CameraDead>() {
126 return new CameraDead("通常死亡カメラ");
127 }
128
129 template<>
130 Camera *createCamera<CameraInwardSphere>() {
131 return new CameraInwardSphere("球内部カメラ");
132 }
133
134 template<>
135 Camera *createCamera<CameraRailDemo>() {
136 return new CameraRailDemo("レールデモカメラ");
137 }
138
139 template<>
140 Camera *createCamera<CameraRailFollow>() {
141 return new CameraRailFollow("レールフォローカメラ");
142 }
143
144 template<>
145 Camera *createCamera<CameraTripodBossJoint>() {
146 return new CameraTripodBossJoint("三脚ボス関節カメラ");
147 }
148
149 template<>
150 Camera *createCamera<CameraCharmedTripodBoss>() {
151 return new CameraCharmedTripodBoss("三脚ボスジョイント注視カメラ");
152 }
153
154 template<>
155 Camera *createCamera<CameraObjParallel>() {
156 return new CameraObjParallel("オブジェ並行カメラ");
157 }
158
159 template<>
160 Camera *createCamera<CameraCharmedFix>() {
161 return new CameraCharmedFix("サンボカメラ");
162 }
163
164 template<>
165 Camera *createCamera<CameraGround>() {
166 return new CameraGround("地面カメラ");
167 }
168
169 template<>
170 Camera *createCamera<CameraTrundle>() {
171 return new CameraTrundle("トランドルカメラ");
172 }
173
174 template<>
175 Camera *createCamera<CameraCubePlanet>() {
176 return new CameraCubePlanet("キューブ惑星カメラ");
177 }
178
179 template<>
180 Camera *createCamera<CameraInnerCylinder>() {
181 return new CameraInnerCylinder("CameraInnerCylinder");
182 }
183
184 template<>
185 Camera *createCamera<CameraSpiral>() {
186 return new CameraSpiral("螺旋カメラ(デモ用)");
187 }
188
189 template<>
190 Camera *createCamera<CameraTalk>() {
191 return new CameraTalk("会話カメラ");
192 }
193
194 template<>
195 Camera *createCamera<CameraMtxRegParallel>() {
196 return new CameraMtxRegParallel("マトリクスレジスタ並行カメラ");
197 }
198
199 template<>
200 Camera *createCamera<CameraCharmedVecReg>() {
201 return new CameraCharmedVecReg("ベクトルレジスタ注目カメラ");
202 }
203
204 template<>
205 Camera *createCamera<CameraMedianPlanet>() {
206 return new CameraMedianPlanet("中点注目プラネットカメラ");
207 }
208
209 template<>
210 Camera *createCamera<CameraTwistedPassage>() {
211 return new CameraTwistedPassage("ねじれ回廊カメラ");
212 }
213
214 template<>
215 Camera *createCamera<CameraMedianTower>() {
216 return new CameraMedianTower("中点塔カメラ");
217 }
218
219 template<>
220 Camera *createCamera<CameraCharmedVecRegTower>() {
221 return new CameraCharmedVecRegTower("CameraCharmedVecRegTower");
222 }
223
224 template<>
225 Camera *createCamera<CameraFrontAndBack>() {
226 return new CameraFrontAndBack("表裏カメラ");
227 }
228
229 template<>
230 Camera *createCamera<CameraRaceFollow>() {
231 return new CameraRaceFollow("CameraRaceFollow");
232 }
233
234 template<>
235 Camera *createCamera<CameraSlide>() {
236 return new CameraSlide("スライドカメラ");
237 }
238
239 template<>
240 Camera *createCamera<CameraFooFighter>() {
241 return new CameraFooFighter("フーファイター");
242 }
243
244 template<>
245 Camera *createCamera<CameraFooFighterPlanet>() {
246 return new CameraFooFighterPlanet("フーファイタープラネットカメラ");
247 }
248
249 template<>
250 Camera *createCamera<CameraBlackHole>() {
251 return new CameraBlackHole("ブラックホールカメラ");
252 }
253
254 template<>
255 Camera *createCamera<CameraAnim>() {
256 return new CameraAnim("アニメーションカメラ");
257 }
258
259 template<>
260 Camera *createCamera<CameraDPD>() {
261 return new CameraDPD("DPD操作カメラ");
262 }
263
264 template<>
265 Camera *createCamera<CameraWaterFollow>() {
266 return new CameraWaterFollow("水中フォロー");
267 }
268
269 template<>
270 Camera *createCamera<CameraWaterPlanet>() {
271 return new CameraWaterPlanet("水中プラネット");
272 }
273
274 template<>
275 Camera *createCamera<CameraWaterPlanetBoss>() {
276 return new CameraWaterPlanetBoss("水中プラネットボス");
277 }
278
279 template<>
280 Camera *createCamera<CameraRailWatch>() {
281 return new CameraRailWatch("レール注目カメラ");
282 }
283
284 template<>
285 Camera *createCamera<CameraSubjective>() {
286 return new CameraSubjective("主観カメラ");
287 }
288
289 #define NR_CAMERA_TYPES 45
290
291 CameraTableEntry gCameraTable[NR_CAMERA_TYPES] = {
292 { "CAM_TYPE_XZ_PARA", "並行", createCamera<CameraParallel>, 1 },
293 { "CAM_TYPE_TOWER", "塔", createCamera<CameraTower>, 1 },
294 { "CAM_TYPE_FOLLOW", "フォロー", createCamera<CameraFollow>, 1 },
295 { "CAM_TYPE_WONDER_PLANET", "プラネット", createCamera<CameraWonderPlanet>, 1 },
296 { "CAM_TYPE_POINT_FIX", "完全固定", createCamera<CameraFix>, 1 },
297 { "CAM_TYPE_EYEPOS_FIX", "定点", createCamera<CameraFixedPoint>, 1 },
298 { "CAM_TYPE_SLIDER", "スライダー", createCamera<CameraBehind>, 1 },
299 { "CAM_TYPE_INWARD_TOWER", "塔内部", createCamera<CameraInwardTower>, 1 },
300 { "CAM_TYPE_EYEPOS_FIX_THER", "その場定点", createCamera<CameraFixedThere>, 1 },
301 { "CAM_TYPE_TRIPOD_BOSS", "三脚ボス", createCamera<CameraTripodBoss>, 1 },
302 { "CAM_TYPE_TOWER_POS", "塔(サブターゲット付き)", createCamera<CameraTowerPos>, 1 },
303 { "CAM_TYPE_TRIPOD_PLANET", "三脚惑星", createCamera<CameraTripodPlanet>, 1 },
304 { "CAM_TYPE_DEAD", "通常死亡", createCamera<CameraDead>, 1 },
305 { "CAM_TYPE_INWARD_SPHERE", "球内部", createCamera<CameraInwardSphere>, 1 },
306 { "CAM_TYPE_RAIL_DEMO", "レールデモ", createCamera<CameraRailDemo>, 1 },
307 { "CAM_TYPE_RAIL_FOLLOW", "レールフォロー", createCamera<CameraRailFollow>, 1 },
308 { "CAM_TYPE_TRIPOD_BOSS_JOINT", "三脚ボスジョイント", createCamera<CameraTripodBossJoint>, 1 },
309 { "CAM_TYPE_CHARMED_TRIPOD_BOSS", "三脚ボスジョイント注視", createCamera<CameraCharmedTripodBoss>, 1 },
310 { "CAM_TYPE_OBJ_PARALLEL", "オブジェ並行", createCamera<CameraObjParallel>, 1 },
311 { "CAM_TYPE_CHARMED_FIX", "サンボ", createCamera<CameraCharmedFix>, 1 },
312 { "CAM_TYPE_GROUND", "地面", createCamera<CameraGround>, 1 },
313 { "CAM_TYPE_TRUNDLE", "トランドル", createCamera<CameraTrundle>, 1 },
314 { "CAM_TYPE_CUBE_PLANET", "キューブ惑星", createCamera<CameraCubePlanet>, 1 },
315 { "CAM_TYPE_INNER_CYLINDER", "円筒内部", createCamera<CameraInnerCylinder>, 1 },
316 { "CAM_TYPE_SPIRAL_DEMO", "螺旋デモ", createCamera<CameraSpiral>, 1 },
317 { "CAM_TYPE_TALK", "会話", createCamera<CameraTalk>, 1 },
318 { "CAM_TYPE_MTXREG_PARALLEL", "マトリクスレジスタ並行", createCamera<CameraMtxRegParallel>, 1 },
319 { "CAM_TYPE_CHARMED_VECREG", "ベクトルレジスタ注目", createCamera<CameraCharmedVecReg>, 1 },
320 { "CAM_TYPE_MEDIAN_PLANET", "中点注目プラネット", createCamera<CameraMedianPlanet>, 1 },
321 { "CAM_TYPE_TWISTED_PASSAGE", "ねじれ回廊", createCamera<CameraTwistedPassage>, 1 },
322 { "CAM_TYPE_MEDIAN_TOWER", "中点塔カメラ", createCamera<CameraMedianTower>, 1 },
323 { "CAM_TYPE_CHARMED_VECREG_TOWER", "VecReg角度補正塔カメラ", createCamera<CameraCharmedVecRegTower>, 1 },
324 { "CAM_TYPE_FRONT_AND_BACK", "表裏カメラ", createCamera<CameraFrontAndBack>, 1 },
325 { "CAM_TYPE_RACE_FOLLOW", "レース用フォロー", createCamera<CameraRaceFollow>, 1 },
326 { "CAM_TYPE_2D_SLIDE", "2Dスライド", createCamera<CameraSlide>, 1 },
327 { "CAM_TYPE_FOO_FIGHTER", "フーファイター", createCamera<CameraFooFighter>, 1 },
328 { "CAM_TYPE_FOO_FIGHTER_PLANET", "フーファイタープラネット", createCamera<CameraFooFighterPlanet>, 1 },
329 { "CAM_TYPE_BLACK_HOLE", "ブラックホール", createCamera<CameraBlackHole>, 0 },
330 { "CAM_TYPE_ANIM", "アニメ", createCamera<CameraAnim>, 0 },
331 { "CAM_TYPE_DPD", "DPD", createCamera<CameraDPD>, 1 },
332 { "CAM_TYPE_WATER_FOLLOW", "水中フォロー", createCamera<CameraWaterFollow>, 1 },
333 { "CAM_TYPE_WATER_PLANET", "水中プラネット", createCamera<CameraWaterPlanet>, 1 },
334 { "CAM_TYPE_WATER_PLANET_BOSS", "水中プラネットボス", createCamera<CameraWaterPlanetBoss>, 1 },
335 { "CAM_TYPE_RAIL_WATCH", "レール注目", createCamera<CameraRailWatch>, 1 },
336 { "CAM_TYPE_SUBJECTIVE", "主観", createCamera<CameraSubjective>, 1 }
337 };
338}
339
340CameraHolder::CameraHolder(const char *pName) : NameObj(pName) {
341 createCameras();
342 mDefaultCameraIndex = getIndexOf(gDefaultCameraName);
343 mDefaultTranslator = mTranslators[mDefaultCameraIndex];
344}
345
346CameraHolder::~CameraHolder() {
347
348}
349
350CamTranslatorBase *CameraHolder::getTranslator(long index) {
351 return mTranslators[index];
352}
353
354s32 CameraHolder::getIndexOf(const char *pName) const {
355 for (s32 i = 0; i < NR_CAMERA_TYPES; i++) {
356 if (strcmp(pName, gCameraTable[i].mName) == 0) {
357 return i;
358 }
359 }
360
361 return -1;
362}
363
364Camera *CameraHolder::getDefaultCamera() {
365 return mCameras[mDefaultCameraIndex];
366}
367
368s32 CameraHolder::getIndexOfDefault() const {
369 return mDefaultCameraIndex;
370}
371
372s32 CameraHolder::getIndexOf(Camera *pCamera) const {
373 for (s32 i = 0; i < NR_CAMERA_TYPES; i++) {
374 if (mCameras[i] == pCamera) {
375 return i;
376 }
377 }
378
379 return -1;
380}
381
382void CameraHolder::createCameras() {
383 mCameras = new Camera *[NR_CAMERA_TYPES];
384 mTranslators = new CamTranslatorBase *[NR_CAMERA_TYPES];
385
386 for (s32 i = 0; i < NR_CAMERA_TYPES; i++) {
387 mCameras[i] = gCameraTable[i].mCreateFunction();
388 mTranslators[i] = mCameras[i]->createTranslator();
389 }
390}
391
392Camera *CameraHolder::getCameraInner(long index) const {
393 return mCameras[index];
394}
The most basic form of an object.
Definition NameObj.hpp:11
const char * mName
A string to identify the NameObj.
Definition NameObj.hpp:38