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"
10CameraGeneralParam::CameraGeneralParam() : mString() {
31 mWPoint = rOther.mWPoint;
33 mAngleA = rOther.mAngleA;
34 mAngleB = rOther.mAngleB;
37 mString = rOther.mString;
42CameraParamChunk::ExParam::ExParam() {
46void CameraParamChunk::ExParam::init() {
47 mWOffset.set(0.0f, 100.0f, 0.0f);
70 mCameraTypeIndex = pHolder->getIndexOfDefault();
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;
98void CameraParamChunk::initiate() {
101 *mGeneralParam = generalParam;
107 const char *camType =
"";
108 pReader->getValueString(
"camtype", &camType);
110 arrangeCamTypeName(pReader->getVersion(), &camType);
112 bool isNotPlanet = !strcmp(camType,
"CAM_TYPE_PLANET");
114 s32 index = pHolder->getIndexOf(camType);
117 mCameraTypeIndex = pHolder->getIndexOfDefault();
120 mCameraTypeIndex = index;
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);
140 static const char *sFlagNames[6] = {
149 for (u32 i = 0; i < 6; i++) {
152 if (pReader->getValueInt(sFlagNames[i], &flag)) {
153 mExParam.mFlag |= flag << i;
157 pReader->getValueFloat(
"dist", &mGeneralParam->mDist);
158 pReader->getValueVec(
"axis", &mGeneralParam->mAxis);
159 pReader->getValueVec(
"wpoint", &mGeneralParam->mWPoint);
160 pReader->getValueVec(
"up", &mGeneralParam->mUp);
162 if (!pReader->getValueFloat(
"angleA", &mGeneralParam->mAngleA) && isNotPlanet) {
163 mGeneralParam->mAngleA = 30.0f;
166 pReader->getValueFloat(
"angleB", &mGeneralParam->mAngleB);
167 pReader->getValueInt(
"num1", &mGeneralParam->mNum1);
168 pReader->getValueInt(
"num2", &mGeneralParam->mNum2);
170 const char *stringParam =
nullptr;
172 if (pReader->getValueString(
"string", &stringParam)) {
173 mGeneralParam->mString.setCharPtr(stringParam);
178s32 CameraParamChunk::getZoneID()
const {
179 return mParamChunkID->mZoneID;
182bool CameraParamChunk::isOnNoReset()
const {
183 return mExParam.mFlag & 1;
186bool CameraParamChunk::isOnUseFovy()
const {
187 return (mExParam.mFlag >> 1) & 1;
190bool CameraParamChunk::isLOfsErpOff()
const {
191 return (mExParam.mFlag >> 2) & 1;
194bool CameraParamChunk::isAntiBlurOff()
const {
195 return (mExParam.mFlag >> 3) & 1;
198bool CameraParamChunk::isCollisionOff()
const {
199 return (mExParam.mFlag >> 4) & 1;
202bool CameraParamChunk::isSubjectiveCameraOff()
const {
203 return (mExParam.mFlag >> 5) & 1;
206void CameraParamChunk::getVPanAxis(TVec3f *pOut)
const {
207 pOut->x = mExParam.mVPanAxis.x;
208 pOut->y = mExParam.mVPanAxis.y;
209 pOut->z = mExParam.mVPanAxis.z;
211 if (MR::isNearZero(*pOut, 0.001f)) {
212 pOut->set(0.0f, 1.0f, 0.0f);
218void CameraParamChunk::setCameraType(
const char *pType,
const CameraHolder *pHolder) {
219 mCameraTypeIndex = pHolder->getIndexOf(pType);
222void CameraParamChunk::setUseFovy(
bool value) {
223 mExParam.mFlag &= ~(1 << 1);
229 mExParam.mFlag |= 1 << 1;
232void CameraParamChunk::setLOfsErpOff(
bool value) {
233 mExParam.mFlag &= ~(1 << 2);
239 mExParam.mFlag |= 1 << 2;
242void CameraParamChunk::setCollisionOff(
bool value) {
243 mExParam.mFlag &= ~(1 << 4);
249 mExParam.mFlag |= 1 << 4;
252void CameraParamChunk::arrangeCamTypeName(
unsigned long version,
const char **ppType) {
253 const char *&type = *ppType;
255 if (version < 0x30004) {
256 if (strcmp(type,
"CAM_TYPE_DONKETSU_TEST")) {
257 type =
"CAM_TYPE_BOSS_DONKETSU";
260 else if (version < 0x30006) {
261 if (strcmp(type,
"CAM_TYPE_BEHIND_DEBUG")) {
262 type =
"CAM_TYPE_SLIDER";
264 else if (strcmp(type,
"CAM_TYPE_INWARD_TOWER_TEST")) {
265 type =
"CAM_TYPE_INWARD_TOWER";
267 else if (strcmp(type,
"CAM_TYPE_EYE_FIXED_THERE_TEST")) {
268 type =
"CAM_TYPE_EYEPOS_FIX_THERE";
271 else if (version < 0x30009) {
272 if (strcmp(type,
"CAM_TYPE_ICECUBE_PLANET")) {
273 type =
"CAM_TYPE_CUBE_PLANET";
281 mEnableEndErpFrame = 0;
286 CameraParamChunk::copy(pOther);
290 CameraParamChunk::load(pReader, pHolder);
293 s32 enableEndErpFrame;
296 if (pReader->getValueInt(
"gflag.thru", &thru)) {
303 if (pReader->getValueInt(
"gflag.enableEndErpFrame", &enableEndErpFrame)) {
304 mEnableEndErpFrame = enableEndErpFrame;
307 if (pReader->getValueInt(
"gflag.camendint", &camEndInt)) {
308 mCamEndInt = camEndInt;
312void CameraParamChunkGame::initiate() {
315 *mGeneralParam = generalParam;
317 mEnableEndErpFrame = 0;
320const char *CameraParamChunkGame::getClassName()
const {
328 mEnableEndErpFrame = 0;
334 CameraParamChunk::copy(pOther);
338 CameraParamChunk::load(pReader, pHolder);
341 s32 enableEndErpFrame;
346 if (pReader->getValueInt(
"eflag.enableErpFrame", &enableErpFrame)) {
347 mEnableErpFrame = enableErpFrame;
350 if (pReader->getValueInt(
"eflag.enableEndErpFrame", &enableEndErpFrame)) {
351 mEnableEndErpFrame = enableEndErpFrame;
354 if (pReader->getValueInt(
"camendint", &camEndInt)) {
355 mCamEndInt = camEndInt;
358 if (pReader->getValueInt(
"evfrm", &evFrm)) {
362 if (pReader->getValueInt(
"evpriority", &evPriority)) {
363 mEvPriority = evPriority;
367void CameraParamChunkEvent::initiate() {
370 *mGeneralParam = generalParam;
372 mEnableEndErpFrame = 0;
376const char *CameraParamChunkEvent::getClassName()
const {