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"
11#define CHUNK_CAPACITY 0x400
13CameraParamChunkHolder::CameraParamChunkHolder(
CameraHolder *pCameraHolder,
const char *pName) :
NameObj(pName) {
14 mCameraHolder = pCameraHolder;
15 mChunkCapacity = CHUNK_CAPACITY;
21CameraParamChunkHolder::~CameraParamChunkHolder() {
26 if (isNewAttribute(rID)) {
27 char firstChar = rID.mName[0];
30 if (firstChar ==
'e') {
33 else if (firstChar ==
'g' || firstChar ==
'c' || firstChar ==
's') {
40 mChunks[mNrChunks++] = chunk;
49 if (rID.mName ==
nullptr) {
53 return findChunk(rID);
56void CameraParamChunkHolder::sort() {
58 for (s32 i = 0; i < mNrChunks - 1; i++) {
61 for (s32 j = i + 1; j < mNrChunks; j++) {
62 if (*mChunks[j]->mParamChunkID > *mChunks[minIndex]->mParamChunkID) {
69 mChunks[i] = mChunks[minIndex];
70 mChunks[minIndex] = temp;
77void CameraParamChunkHolder::loadCameraParameters() {
78 for (s32 i = 0; i < MR::getZoneNum(); i++) {
84 for (s32 i = 0; i < mNrChunks; i++) {
85 if (*mChunks[i]->mParamChunkID == rID) {
96 s32 high = mNrChunks - 1;
99 s32 middle = (low + high) / 2;
101 if (*mChunks[middle]->mParamChunkID > rID) {
109 if (*mChunks[low]->mParamChunkID == rID) {
114 for (s32 i = 0; i < mNrChunks; i++) {
115 if (*mChunks[i]->mParamChunkID == rID) {
124CameraParamChunk *CameraParamChunkHolder::findChunk(
long zoneID,
const char *pName) {
125 for (s32 i = 0; i < mNrChunks; i++) {
126 if (mChunks[i]->mParamChunkID->equals(zoneID, pName)) {
136void CameraParamChunkHolder::loadFile(
long zoneID) {
139 MR::getStageCameraData(&data, &local44, zoneID);
143 mCameraVersion = reader.mVersion;
145 while (reader.hasMoreChunk()) {
146 const char *
id =
nullptr;
147 reader.getValueString(
"id", &
id);
151 if (chunk !=
nullptr && chunk->_64 != 0) {
152 reader.nextToChunk();
155 if (chunk !=
nullptr) {
156 chunk->load(&reader, mCameraHolder);
160 reader.nextToChunk();
168 s32 index = pChunk->mCameraTypeIndex;
170 if (mCameraHolder->getIndexOf(
"CAM_TYPE_FOLLOW") == index) {
171 if (mCameraVersion < 0x30001) {
174 param->mAngleA = 0.17453294f;
175 param->mAngleB = 0.34906587f;
178 if (mCameraVersion < 0x30002) {
179 pChunk->mGeneralParam->mDist = 0.15f;
183 if (mCameraVersion < 0x30003) {
184 const char *className = pChunk->getClassName();
186 if (strcmp(className,
"Game") == 0) {
188 pGameChunk->mThru = 0;
192 index = pChunk->mCameraTypeIndex;
194 if (mCameraHolder->getIndexOf(
"CAM_TYPE_RAIL_FOLLOW") == index) {
195 if (mCameraVersion < 0x30007) {
198 param->mWPoint.x = 30.0f;
199 param->mWPoint.y = 0.35f;
200 param->mWPoint.z = 0.0f;
204 if (mCameraVersion < 0x30008) {
210 pChunk->mExParam.mVPanAxis.x = temp.x;
211 pChunk->mExParam.mVPanAxis.y = temp.y;
212 pChunk->mExParam.mVPanAxis.z = temp.z;
215 if (mCameraVersion < 0x3000A) {
216 index = pChunk->mCameraTypeIndex;
218 if (mCameraHolder->getIndexOf(
"CAM_TYPE_CUBE_PLANET") == index) {
219 pChunk->mGeneralParam->mAngleB = 0.35f;
223 if (mCameraVersion < 0x3000B) {
224 index = pChunk->mCameraTypeIndex;
226 if (mCameraHolder->getIndexOf(
"CAM_TYPE_WATER_FOLLOW") == index) {
227 pChunk->mGeneralParam->mDist = 0.01f;
231 if (mCameraVersion < 0x3000C) {
232 index = pChunk->mCameraTypeIndex;
234 if (mCameraHolder->getIndexOf(
"CAM_TYPE_CHARMED_VECREG") == index) {
236 param->mString.setCharPtr(CameraLocalUtil::getDummyVecRegName());
240 if (mCameraVersion < 0x3000D) {
241 index = pChunk->mCameraTypeIndex;
243 if (mCameraHolder->getIndexOf(
"CAM_TYPE_FOLLOW") == index) {
244 pChunk->mGeneralParam->mNum1 = 1;
248 if (mCameraVersion < 0x3000E) {
249 index = pChunk->mCameraTypeIndex;
251 if (mCameraHolder->getIndexOf(
"CAM_TYPE_CHARMED_VECREG") == index) {
252 pChunk->mGeneralParam->mAngleA = 0.5f;
256 if (mCameraVersion < 0x3000F) {
257 index = pChunk->mCameraTypeIndex;
259 if (mCameraHolder->getIndexOf(
"CAM_TYPE_MEDIAN_TOWER") == index) {
260 pChunk->mGeneralParam->mUp.zero();
264 if (mCameraVersion < 0x30010) {
265 index = pChunk->mCameraTypeIndex;
267 if (mCameraHolder->getIndexOf(
"CAM_TYPE_MEDIAN_TOWER") == index) {
268 pChunk->mGeneralParam->mUp.y = 0.5f;
272 if (mCameraVersion < 0x30011) {
273 index = pChunk->mCameraTypeIndex;
275 if (mCameraHolder->getIndexOf(
"CAM_TYPE_CHARMED_VECREG") == index) {
276 pChunk->mGeneralParam->mAngleB = 0.02f;
280 if (mCameraVersion < 0x30012) {
281 index = pChunk->mCameraTypeIndex;
283 if (mCameraHolder->getIndexOf(
"CAM_TYPE_MEDIAN_TOWER") == index) {
284 pChunk->mGeneralParam->mUp.z = 0.992f;
288 if (mCameraVersion < 0x30013) {
289 index = pChunk->mCameraTypeIndex;
291 if (mCameraHolder->getIndexOf(
"CAM_TYPE_EYEPOS_FIX_THERE") == index) {
292 pChunk->mExParam.mRoll = 0.0f;
296 if (mCameraVersion < 0x30014) {
297 index = pChunk->mCameraTypeIndex;
299 if (mCameraHolder->getIndexOf(
"CAM_TYPE_MEDIAN_PLANET") == index) {
300 pChunk->mGeneralParam->mWPoint.x = 0.5f;
304 if (mCameraVersion < 0x30015) {
305 index = pChunk->mCameraTypeIndex;
307 if (mCameraHolder->getIndexOf(
"CAM_TYPE_DPD") == index) {
308 pChunk->mGeneralParam->mUp.zero();
309 pChunk->mGeneralParam->mNum2 = 0;
313 if (mCameraVersion < 0x30016) {
314 index = pChunk->mCameraTypeIndex;
316 if (mCameraHolder->getIndexOf(
"CAM_TYPE_XZ_PARA") == index) {
317 pChunk->mGeneralParam->mNum1 = 0;
The most basic form of an object.