diff options
| author | TakaRikka <38417346+TakaRikka@users.noreply.github.com> | 2025-09-25 08:20:46 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-25 18:20:46 +0300 |
| commit | 9a2df2162b7ec4a23ad32915c61d46cf20b5003d (patch) | |
| tree | eaeff68a0e755a6014c559abff39685b3b3e9c14 /src/d/d_debug_camera.cpp | |
| parent | 4635fcb666d7c5f256016d733584712a55f1c130 (diff) | |
d_debug_camera mostly done (#2695)
* d_debug_camera mostly done
* update some alink demo stuff
* some misc debug stuff
Diffstat (limited to 'src/d/d_debug_camera.cpp')
| -rw-r--r-- | src/d/d_debug_camera.cpp | 1777 |
1 files changed, 1777 insertions, 0 deletions
diff --git a/src/d/d_debug_camera.cpp b/src/d/d_debug_camera.cpp new file mode 100644 index 0000000000..bb09f93724 --- /dev/null +++ b/src/d/d_debug_camera.cpp @@ -0,0 +1,1777 @@ +#if DEBUG + +#include "d/d_debug_camera.h" +#include "d/d_event_data.h" +#include "d/d_debug_viewer.h" +#include "d/d_com_inf_game.h" +#include "f_ap/f_ap_game.h" +#include "JSystem/JUtility/JUTDbPrint.h" +#include "JSystem/JUtility/JUTReport.h" + +namespace zevwork { + const int CutMaxNum = 32; + const int DataMaxNum = 0x100; + const int FDataMaxNum = 0x200; + const int IDataMaxNum = 0x100; + const int SDataMaxNum = 0x100; + + const int WorkSize = (sizeof(event_binary_data_header) - 8) + + sizeof(dEvDtEvent_DBG_c) + + sizeof(dEvDtStaff_DBG_c) + + sizeof(dEvDtStaff_DBG_c) + + (sizeof(dEvDtCut_c) * CutMaxNum) + + (sizeof(dEvDtData_DBG_c) * DataMaxNum) + + (sizeof(f32) * FDataMaxNum) + + (sizeof(int) * IDataMaxNum) + + (sizeof(char) * SDataMaxNum); + u8* WorkBuffer; +}; + +dDbgCamera_c dDbgCamera; + +dDbgCamKey_c::~dDbgCamKey_c() {} + +namespace { +cXyz rel2wld(cXyz* param_0, fopAc_ac_c* actor) { + if (actor == NULL) { + OS_REPORT("debug camera: error: actor NULL in rel2wld() \n"); + return cXyz::Zero; + } + + cSGlobe sp18(*param_0); + sp18.U(cSAngle(actor->shape_angle.y) + sp18.U()); + + return actor->attention_info.position + sp18.Xyz(); +} + +cXyz wld2rel(cXyz* param_0, fopAc_ac_c* actor) { + if (actor == NULL) { + OS_REPORT("debug camera: error: actor NULL in wld2rel() \n"); + return cXyz::Zero; + } + + cSGlobe sp18(*param_0 - actor->attention_info.position); + sp18.U(sp18.U() - cSAngle(actor->shape_angle.y)); + + return sp18.Xyz(); +} + +inline fpc_ProcID ActorID(fopAc_ac_c* actor) { + return fopAcM_GetID(actor); +} + +inline fopAc_ac_c* Actor(fpc_ProcID id) { + return fopAcM_SearchByID(id); +} +} + +dDbgCamSetup_c::dDbgCamSetup_c() { + mpDbgCam = NULL; + + mMoveSpeed = 20.0f; + mMoveTurbo = 400.0f; + mFovyTick = 2.5; + mMoveParallelShift = 10.0f; + mRotateSpeed = 20.0f; + mTransAccel = 0.1f; + mRotAccel = 0.01; + mMoveMax = 100.0f; + mUnkMax = 2000.0f; + mRotateMax = 30.0f; + + mCenterCross = 400.0f; + mCenterBall = 20.0f; + mCenterMarker = 1; + + mActorSrchType = 0; + mActorID = fpcM_ERROR_PROCESS_ID_e; + + mFlag = 0; + mFlag |= (u16)0x8000; + + mPosX = 40; + mPosY = 320; + + mGazePoint.x = 0.0f; + mGazePoint.y = 0.0f; + mGazePoint.z = 0.0f; + + mPerspective.x = 0.0f; + mPerspective.y = 0.0f; + mPerspective.z = 0.0f; + + mAngle = 0.0f; + + field_0x68.set(0.0f, 1.0f, 0.0f); +} + +void dDbgCamSetup_c::Init(dDbgCamera_c* i_dbgCamera) { + // "Debug Camera" + m_childNo = mDoHIO_CREATE_CHILD("デバッグカメラ", this); + mpDbgCam = i_dbgCamera; +} + +void dDbgCamSetup_c::Finish() { + mDoHIO_DELETE_CHILD(m_childNo); +} + +f32 dDbgCamSetup_c::Translate(f32 param_0) { + f32 var_f31 = mMoveSpeed * param_0; + + f32 var_f30; + if (var_f31 > mMoveMax) { + var_f30 = mMoveMax; + } else { + var_f30 = var_f31; + } + + return var_f30; +} + +s16 dDbgCamSetup_c::Rotate(f32 param_0) { + f32 var_f31 = mRotateSpeed * param_0; + + f32 var_f30; + if (var_f31 > mRotateMax) { + var_f30 = mRotateMax; + } else { + var_f30 = var_f31; + } + + return cAngle::d2s(var_f30); +} + +f32 dDbgCamSetup_c::FlatMove(f32 param_0) { + f32 var_f31 = mMoveParallelShift * param_0; + + f32 var_f30; + if (var_f31 > mMoveMax) { + var_f30 = mMoveMax; + } else { + var_f30 = var_f31; + } + + return var_f30; +} + +f32 dDbgCamSetup_c::Turbo(f32 param_0) { + f32 var_f31 = mMoveTurbo * param_0; + + f32 var_f30; + if (var_f31 > mUnkMax) { + var_f30 = mUnkMax; + } else { + var_f30 = var_f31; + } + + return var_f30; +} + +static int search_actor(fopAc_ac_c* actor, void* data) { + dDbgCamSetup_c* camsetup = (dDbgCamSetup_c*)data; + + cXyz sp18 = dDbgCamera.Center() - actor->attention_info.position; + if (sp18.abs() < camsetup->mActorSrchRange) { + camsetup->mActorSrchRange = sp18.abs(); + camsetup->mActorID = ActorID(actor); + } + + return 0; +} + +void dDbgCamSetup_c::genMessage(JORMContext* mctx) { + mctx->genLabel("- カメラ位置表示", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genCheckBox(" 現在位置", &mFlag, 4, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genCheckBox(" (補正前)", &mFlag, 8, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + + mctx->genLabel("- ヒットポリゴン表示", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genCheckBox(" 壁あたり", &mFlag, 0x10, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + + mctx->genLabel("-", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genLabel("- 移動", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" スピード", &mMoveSpeed, 0.0f, 5000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" 最大", &mMoveMax, 0.0f, 5000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" ターボ", &mMoveTurbo, 0.0f, 5000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" 最大", &mUnkMax, 0.0f, 5000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" 平行移動", &mMoveParallelShift, 0.0f, 5000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" 加速度", &mTransAccel, 0.0f, 1.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + + mctx->genLabel("-", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genLabel("- 回転", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" スピード", &mRotateSpeed, 0.0f, 90.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" 最大", &mRotateMax, 0.0f, 90.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" 加速度", &mRotAccel, 0.0f, 1.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + + mctx->genLabel("-", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genLabel("- 画角", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" スピード", &mFovyTick, 0.0f, 90.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + + mctx->genLabel("-", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genLabel("- センターマーカ", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" 線の長さ", &mCenterCross, 0.0f, 4000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" 球の大きさ", &mCenterBall, 0.0f, 4000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->startRadioButton("表示", &mCenterMarker, 0, NULL, 0xFFFF, 0xFFFF, 0x100, 0xFFFF); + mctx->genRadioButtonItem("常に表示", 3, 0, 0xFFFF, 0xFFFF, 0x80, 0x10); + mctx->genRadioButtonItem("動くと表示", 1, 0, 0xFFFF, 0xFFFF, 0x80, 0x10); + mctx->genRadioButtonItem("常に非表示", 0, 0, 0xFFFF, 0xFFFF, 0x80, 0x10); + mctx->endRadioButton(); + + mctx->genLabel("- 情報表示", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genCheckBox(" 有効", &mFlag, 0x8000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" 表示位置 X", &mPosX, 0, 640, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" Y", &mPosY, 0, 480, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + + mctx->genLabel("-", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genLabel("- 座標系", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->startRadioButton("基準", &mActorSrchType, 0, NULL, 0xFFFF, 0xFFFF, 0x100, 0xFFFF); + mctx->genRadioButtonItem("絶対座標", 0, 0, 0xFFFF, 0xFFFF, 0x80, 0x10); + mctx->genRadioButtonItem("プレイヤー相対座標", 1, 0, 0xFFFF, 0xFFFF, 0x80, 0x10); + mctx->genRadioButtonItem("指定アクター相対座標", 2, 0, 0xFFFF, 0xFFFF, 0x80, 0x10); + mctx->endRadioButton(); + mctx->genButton(" 更新 ", 0x66, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + + mctx->genLabel("- イベント", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genButton(" 保存 ", 0x68, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + + mctx->genLabel("-", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genLabel("- 座標指定", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" 注視点 X", &mGazePoint.x, -100000.0f, 100000.0f, 0, NULL, 0xFFFF, 0xFFFF, + 0x200, 0x18); + mctx->genSlider(" Y", &mGazePoint.y, -100000.0f, 100000.0f, 0, NULL, 0xFFFF, + 0xFFFF, 0x200, 0x18); + mctx->genSlider(" Z", &mGazePoint.z, -100000.0f, 100000.0f, 0, NULL, 0xFFFF, + 0xFFFF, 0x200, 0x18); + mctx->genButton(" 更新 ", 0x69, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" 視点 X", &mPerspective.x, -100000.0f, 100000.0f, 0, NULL, 0xFFFF, + 0xFFFF, 0x200, 0x18); + mctx->genSlider(" Y", &mPerspective.y, -100000.0f, 100000.0f, 0, NULL, + 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" Z", &mPerspective.z, -100000.0f, 100000.0f, 0, NULL, + 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genButton(" 更新 ", 0x6A, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" 画角 ", &mAngle, 0.0f, 180.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genButton(" 更新 ", 0x6B, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genLabel("-", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); +} + +void dDbgCamera_c::InitlChk() { + mLchkNum = 0; +} + +int dDbgCamera_c::SetlChk(dBgS_LinChk lchk) { + if (mLchkNum <= 1) { + mLchk[mLchkNum] = lchk; + return ++mLchkNum; + } + + return -1; +} + +void dDbgCamSetup_c::listenPropertyEvent(const JORPropertyEvent* property) { + int var_r27 = 0; + JORReflexible::listenPropertyEvent(property); + JORMContext* mctx = attachJORMContext(8); + + switch ((u32)property->id) { + case 0x66: + mActorSrchRange = 10000000.0f; + mActorID = fpcM_ERROR_PROCESS_ID_e; + + switch (mActorSrchType) { + case 1: { + fopAc_ac_c* player = dComIfGp_getPlayer(dComIfGp_getCameraPlayer1ID(0)); + mActorID = ActorID(player); + break; + } + case 2: + fopAcIt_Executor((fopAcIt_ExecutorFunc)search_actor, this); + break; + } + break; + case 0x68: + mpDbgCam->WriteZevData(); + break; + case 0x69: + if (mActorID == fpcM_ERROR_PROCESS_ID_e) { + mpDbgCam->Center(mGazePoint); + } else { + mpDbgCam->Center(wld2rel(&mGazePoint, Actor(mActorID))); + } + break; + case 0x6A: + if (mActorID == fpcM_ERROR_PROCESS_ID_e) { + mpDbgCam->Eye(mPerspective); + } else { + mpDbgCam->Eye(wld2rel(&mPerspective, Actor(mActorID))); + } + break; + case 0x6B: + mpDbgCam->Fovy(mAngle); + break; + } +} + +int dDbgCamera_c::moveTool() { + f32 substick_x = mDoCPd_c::getSubStickX3D(mPadNo); + f32 substick_y = mDoCPd_c::getSubStickY(mPadNo); + int sp4C = field_0xc00; + + if (mDoCPd_c::getHoldA(mPadNo)) { + if (field_0xc0c != 0) { + field_0xc00 = 6; + } else { + field_0xc00 = 0; + } + } else if (mDoCPd_c::getHoldB(mPadNo)) { + if (field_0xc0c != 0) { + field_0xc00 = 7; + } else { + field_0xc00 = 1; + } + } else if (mDoCPd_c::getSubStickValue(mPadNo) > 0.001f) { + field_0xc00 = 3; + } else { + field_0xc00 = 18; + } + + if (field_0xc00 != 18) { + if (field_0xc00 != sp4C) { + field_0xc10 = 0.1f; + } else { + field_0xc10 += field_0xc10 * mCamSetup.TransAccel(); + } + } else { + field_0xc10 = 0.0f; + } + + int sp48 = field_0xc04; + f32 stick_x = mDoCPd_c::getStickX3D(mPadNo); + f32 stick_y = mDoCPd_c::getStickY(mPadNo); + + if (mDoCPd_c::getTrigY(mPadNo)) { + field_0xc04 = 16; + } else if (mDoCPd_c::getTrigX(mPadNo)) { + field_0xc04 = 17; + } else if (mDoCPd_c::getTrigLeft(mPadNo)) { + if (field_0x54 == 0) { + field_0xc04 = 4; + } else if (field_0x54 == 1) { + field_0xc04 = 10; + } else if (field_0x54 == 2) { + field_0xc04 = 14; + } + field_0xc1c = 0; + } else if (mDoCPd_c::getHoldLeft(mPadNo)) { + if (field_0xc1c++ > 20) { + if (field_0x54 == 0) { + field_0xc04 = 4; + } else if (field_0x54 == 1) { + field_0xc04 = 10; + } else if (field_0x54 == 2) { + field_0xc04 = 14; + } + } else { + field_0xc04 = 18; + } + } else if (mDoCPd_c::getTrigRight(mPadNo)) { + if (field_0x54 == 0) { + field_0xc04 = 5; + } else if (field_0x54 == 1) { + field_0xc04 = 11; + } else if (field_0x54 == 2) { + field_0xc04 = 15; + } + field_0xc1c = 0; + } else if (mDoCPd_c::getHoldRight(mPadNo)) { + if (field_0xc1c++ > 20) { + if (field_0x54 == 0) { + field_0xc04 = 5; + } else if (field_0x54 == 1) { + field_0xc04 = 11; + } else if (field_0x54 == 2) { + field_0xc04 = 15; + } + } else { + field_0xc04 = 18; + } + } else if (mDoCPd_c::getStickValue(mPadNo) > 0.001f) { + field_0xc04 = 8; + } else { + field_0xc04 = 18; + } + + if (field_0xc04 != 18) { + if (field_0xc04 != sp48) { + field_0xc14 = 0.1f; + } else { + field_0xc14 += field_0xc14 * mCamSetup.RotAccel(); + } + } else { + field_0xc14 = 0.0f; + } + + switch (field_0xc04) { + case 12: + if (mRunKey.mAction == dDbgCam_KeyAction_FIXEDFRM) { + mRunKey.mAction = dDbgCam_KeyAction_NOACTION; + } else { + mRunKey.mAction--; + } + break; + case 13: + if (mRunKey.mAction == dDbgCam_KeyAction_NOACTION) { + mRunKey.mAction = dDbgCam_KeyAction_FIXEDFRM; + } else { + mRunKey.mAction++; + } + break; + case 14: + if (field_0x58 > 0) { + field_0x58--; + if (mActionKey[field_0x58] != '-') { + mRunKey = mKeys[field_0x58]; + if (mKeys[field_0x58].mActorInfo.id != fpcM_ERROR_PROCESS_ID_e) { + fopAc_ac_c* sp3C = Actor(mRunKey.mActorInfo.id); + if (sp3C != NULL) { + mRunKey.mCenter = rel2wld(&mKeys[field_0x58].mCenter, sp3C); + mRunKey.mEye = rel2wld(&mKeys[field_0x58].mEye, sp3C); + } + } + } + } + break; + case 15: + if (field_0x58 < 31) { + field_0x58++; + if (mActionKey[field_0x58] != '-') { + mRunKey = mKeys[field_0x58]; + if (mKeys[field_0x58].mActorInfo.id != fpcM_ERROR_PROCESS_ID_e) { + fopAc_ac_c* sp38 = Actor(mRunKey.mActorInfo.id); + if (sp38 != NULL) { + mRunKey.mCenter = rel2wld(&mKeys[field_0x58].mCenter, sp38); + mRunKey.mEye = rel2wld(&mKeys[field_0x58].mEye, sp38); + } + } + } + } + break; + case 16: + if (mRunKey.mAction == dDbgCam_KeyAction_NOACTION) { + OSReport(" <data name=\"Center\" type=\"xyz\">"); + OSReport("%.3f %.3f %.3f</data>\n", mRunKey.mCenter.x, mRunKey.mCenter.y, mRunKey.mCenter.z); + OSReport(" <data name=\"Eye\" type=\"xyz\">"); + OSReport("%.3f %.3f %.3f</data>\n", mRunKey.mEye.x, mRunKey.mEye.y, mRunKey.mEye.z); + OSReport(" <data name=\"Fovy\" type=\"float\">"); + OSReport("%.3f</data>\n", mRunKey.mFovy); + OSReport(" <data name=\"Bank\" type=\"float\">"); + OSReport("%.3f</data>\n", mRunKey.mBank); + } + + if (mActionKey[field_0x58] != '-' || mRunKey.mAction == dDbgCam_KeyAction_NOACTION) { + int var_r27 = field_0x58; + for (; var_r27 < 31; var_r27++) { + if (mActionKey[var_r27] == '-') { + break; + } + } + + while (var_r27 > field_0x58) { + mActionKey[var_r27] = mActionKey[var_r27 - 1]; + mKeys[var_r27] = mKeys[var_r27 - 1]; + var_r27--; + } + } + + mActionKey[field_0x58] = ActionSymbol(mRunKey.mAction); + mKeys[field_0x58] = mRunKey; + + if (mKeys[field_0x58].mActorInfo.id != fpcM_ERROR_PROCESS_ID_e) { + fopAc_ac_c* actor = Actor(mRunKey.mActorInfo.id); + if (actor != NULL) { + mKeys[field_0x58].mCenter = wld2rel(&mRunKey.mCenter, actor); + mKeys[field_0x58].mEye = wld2rel(&mRunKey.mEye, actor); + } + } + + if (mActionKey[field_0x58 + 1] == '-') { + field_0x58++; + } + break; + case 17: + if (mActionKey[field_0x58] != '-' && (mActionKey[field_0x58 + 1] != '-' || mRunKey.mAction == dDbgCam_KeyAction_NOACTION)) { + int var_r29 = field_0x58 + 1; + for (; var_r29 < 33; var_r29++) { + if (var_r29 == 0x20) { + mActionKey[var_r29 - 1] = '-'; + mKeys[var_r29 - 1] = PlaneKey(); + } else { + mActionKey[var_r29 - 1] = mActionKey[var_r29]; + mKeys[var_r29 - 1] = mKeys[var_r29]; + } + + if (mActionKey[var_r29] == '-') { + break; + } + } + } else { + mActionKey[field_0x58] = '-'; + mKeys[field_0x58] = PlaneKey(); + } + + mRunKey.mCenter = mKeys[field_0x58].mCenter; + break; + } + + if (mCmdMode == 3) { + fopAc_ac_c* sp2C = dComIfGp_getPlayer(0); + /* if (this->unk730 != 0x3E7) { + &field_0x704 = &sp2C->unk558 + this->unk730 = 0x3E7; + } else { + (sp15C, (Vec* ) &sp2C->unk558); + &mRunKey.mCenter += sp15C + &field_0x704 = &sp2C->unk558 + } */ + } else { + // this->unk730 = 3; + } + + cXyz* var_r28; + cXyz* sp30; + f32 temp_f31; + f32 var_f30; + f32 var_f29; + if (field_0xc08 != 0) { + var_r28 = &mRunKey.mCenter; + sp30 = &mRunKey.mEye; + var_f30 = -1.0f; + var_f29 = 1.0f; + } else { + var_r28 = &mRunKey.mEye; + sp30 = &mRunKey.mCenter; + var_f30 = 1.0f; + var_f29 = -1.0f; + } + + field_0x44.Val(*sp30 - *var_r28); + + switch (field_0xc00) { + case 2: + *var_r28 = *var_r28 + (field_0x44.Norm() * mCamSetup.Turbo(field_0xc10 * var_f30)); + + if (field_0xc0c != 0) { + *var_r28 = *var_r28 + (field_0x44.Norm() * mCamSetup.Turbo(field_0xc10 * var_f30)); + } + break; + case 0: + *var_r28 = *var_r28 + (field_0x44.Norm() * mCamSetup.Translate(field_0xc10 * var_f30)); + break; + case 1: + *var_r28 = *var_r28 - (field_0x44.Norm() * mCamSetup.Translate(field_0xc10 * var_f30)); + break; + case 3: { + f32 temp_f26 = fabsf(substick_x); + f32 temp_f1_2 = fabsf(substick_y); + + if (field_0xc0c == 0 || temp_f26 < temp_f1_2) { + cXyz sp1B0(0.0f, 1.0f, 0.0f); + *var_r28 = *var_r28 + (sp1B0 * mCamSetup.FlatMove(field_0xc10 * substick_y)); + } + + if (field_0xc0c == 0 || temp_f26 > temp_f1_2) { + cSGlobe sp58(1.0f, cSAngle::_0, field_0x44.U() + cSAngle::_90); + temp_f31 = var_f30 * (field_0xc10 * substick_x); + *var_r28 = *var_r28 - (sp58.Xyz() * mCamSetup.FlatMove(temp_f31)); + } + break; + } + case 6: { + temp_f31 = field_0x44.R(); + field_0x44.R(temp_f31 - (0.1f * (temp_f31 * field_0xc10))); + + if (field_0x44.R() < 10.0f) { + field_0x44.R(10.0f); + } + break; + } + case 7: + temp_f31 = field_0x44.R(); + field_0x44.R(temp_f31 + (0.1f * (temp_f31 * field_0xc10))); + break; + } + + if (mRunKey.mActorInfo.id != mCamSetup.mActorID) { + fopAc_ac_c* actor = Actor(mCamSetup.mActorID); + if (actor != NULL) { + mRunKey.mActorInfo.id = mCamSetup.mActorID; + fopAcM_getNameString(actor, mRunKey.mActorInfo.name); + } else { + mRunKey.mActorInfo.id = mCamSetup.mActorID = fpcM_ERROR_PROCESS_ID_e; + } + } + + u8 sp8 = 1; + switch (field_0xc04) { + case 4: + mRunKey.mFovy -= 0.1f * mCamSetup.FovyTick(); + if (mRunKey.mFovy < 1.0f) { + mRunKey.mFovy = 1.0f; + } + break; + case 5: + mRunKey.mFovy += 0.1f * mCamSetup.FovyTick(); + if (mRunKey.mFovy > 179.0f) { + mRunKey.mFovy = 179.0f; + } + break; + case 10: + mRunKey.mBank += cDegree(mCamSetup.FovyTick()) * 0.1f; + break; + case 11: + mRunKey.mBank -= cDegree(mCamSetup.FovyTick()) * 0.1f; + break; + case 8: + s16 temp_r26 = mCamSetup.Rotate(var_f29 * (stick_x * field_0xc14)); + field_0x44.U(field_0x44.U() + temp_r26); + + temp_r26 = mCamSetup.Rotate(var_f29 * (stick_y * field_0xc14)); + field_0x44.V(field_0x44.V() + temp_r26); + } + + if (sp8 != 0) { + *sp30 = *var_r28 + field_0x44.Xyz(); + } + + cSGlobe sp50(mRunKey.mEye - mRunKey.mCenter); + mUp.set(0.0f, 1.0f, 0.0f); + return 1; +} + +int dDbgCamera_c::cmdTool() { + if (mDoCPd_c::getTrigRight(mPadNo)) { + if (mCmdMode >= 3) { + mCmdMode = 0; + } else { + mCmdMode++; + } + } else if (mDoCPd_c::getTrigLeft(mPadNo)) { + if (mCmdMode <= 0) { + mCmdMode = 3; + } else { + mCmdMode--; + } + } + + if (!mIsPlaying) { + switch (mCmdMode) { + case 1: + if (mDoCPd_c::getTrigA(mPadNo)) { + mIsPlaying = true; + field_0x704.field_0x0 = 0; + field_0x704.field_0x4 = 0; + makeZevData(); + } + break; + case 2: + if (mDoCPd_c::getTrigA(mPadNo)) { + printZevData(); + } + break; + case 0: + if (mDoCPd_c::getTrigA(mPadNo)) { + mCamSetup.mActorSrchRange = 10000000.0f; + mCamSetup.mActorID = fpcM_ERROR_PROCESS_ID_e; + fopAcIt_Executor((fopAcIt_ExecutorFunc)search_actor, &mCamSetup); + + fopAc_ac_c* actor = Actor(mCamSetup.mActorID); + if (actor != NULL) { + mRunKey.mActorInfo.id = mCamSetup.mActorID; + fopAcM_getNameString(actor, mRunKey.mActorInfo.name); + } else { + mRunKey.mActorInfo.id = fpcM_ERROR_PROCESS_ID_e; + mCamSetup.mActorID = fpcM_ERROR_PROCESS_ID_e; + } + } else if (mDoCPd_c::getTrigB(mPadNo)) { + mRunKey.mActorInfo.id = fpcM_ERROR_PROCESS_ID_e; + mCamSetup.mActorID = fpcM_ERROR_PROCESS_ID_e; + } + break; + case 3: + if (mDoCPd_c::getTrigY(mPadNo)) { + mRunKey.mCenter = dComIfGp_getPlayer(0)->attention_info.position; + // field_0x704 = mRunKey.mCenter = dComIfGp_getPlayer(0)->attention_info.position; + // this->unk730 = 3; + } + /* fallthrough */ + default: + return 1; + } + } else if (dComIfGp_event_runCheck() == 0) { + mIsPlaying = false; + } + + if (mIsPlaying) { + field_0x704.field_0x4++; + } + + return 1; +} + +int dDbgCamera_c::makeZevData() { + int keyNo; + int spline_keyNo; + int sp48; + int spline_keyNum; + + int size = 0; + int spline_timer; + int sp38 = 0; + + field_0xb14 = 0; + + if (zevwork::WorkBuffer == NULL) { + zevwork::WorkBuffer = new u8[zevwork::WorkSize]; + if (zevwork::WorkBuffer == NULL) { + OSReport("debug camera: memory allocate error!! %d byte\n", zevwork::WorkSize); + return 0; + } + } + + OSReport("debug camera: making demo data...\n"); + + event_binary_data_header* header = (event_binary_data_header*)(zevwork::WorkBuffer + size); + size += sizeof(event_binary_data_header) - 8; + + header->cutNum = 0; + dEvDtEvent_DBG_c* event = (dEvDtEvent_DBG_c*)(zevwork::WorkBuffer + size); + header->eventTop = size; + header->eventNum = 1; + size += sizeof(dEvDtEvent_DBG_c); + event->Init(); + strcpy(event->mName, "_DebugCamera"); + event->mStaff[0] = 0; + event->mStaff[1] = 1; + event->mNStaff = 2; + + dEvDtStaff_DBG_c* camera_staff = (dEvDtStaff_DBG_c*)(zevwork::WorkBuffer + size); + header->staffTop = size; + header->staffNum = 2; + size += sizeof(dEvDtStaff_DBG_c); + camera_staff->Init(); + strcpy(camera_staff->mName, "CAMERA"); + camera_staff->mType = dEvDtStaff_c::TYPE_CAMERA; + camera_staff->mIndex = 0; + camera_staff->mStartCut = 1; + camera_staff->mFlagID = sp38++; + + dEvDtStaff_DBG_c* all_staff = (dEvDtStaff_DBG_c*)(zevwork::WorkBuffer + size); + size += sizeof(dEvDtStaff_DBG_c); + all_staff->Init(); + strcpy(all_staff->mName, "ALL"); + all_staff->mType = dEvDtStaff_c::TYPE_ALL; + all_staff->mIndex = 1; + all_staff->mStartCut = 0; + all_staff->mFlagID = sp38++; + + dEvDtCut_DBG_c* cut = (dEvDtCut_DBG_c*)(zevwork::WorkBuffer + size); + header->cutTop = size; + header->cutNum = 0; + size += sizeof(dEvDtCut_c) * zevwork::CutMaxNum; + dEvDtCut_DBG_c* prev_cut = NULL; + cut->Init(); + strcpy(cut->mName, "DUMMY"); + cut->mIndex = header->cutNum++; + cut->mFlagId = sp38++; + event->mFlags[0] = cut->mFlagId; + cut++; + + dEvDtData_DBG_c* pdata = (dEvDtData_DBG_c*)(zevwork::WorkBuffer + size); + header->dataTop = size; + header->dataNum = 0; + size += sizeof(dEvDtData_DBG_c) * zevwork::DataMaxNum; + + f32* fdata = (f32*)(zevwork::WorkBuffer + size); + header->fDataTop = size; + header->fDataNum = 0; + size += sizeof(f32) * zevwork::FDataMaxNum; + + int* idata = (int*)(zevwork::WorkBuffer + size); + header->iDataTop = size; + header->iDataNum = 0; + size += sizeof(int) * zevwork::IDataMaxNum; + + char* sdata = (char*)(zevwork::WorkBuffer + size); + header->sDataTop = size; + header->sDataNum = 0; + size += sizeof(char) * zevwork::SDataMaxNum; + + if (size > zevwork::WorkSize) { + OSReport("debug camera: too big data!! %d > %d byte\n", size, zevwork::WorkSize); + return 0; + } + + int sp14 = 0; + int sp10; + + for (keyNo = 0; keyNo < ARRAY_SIZE(mKeys); keyNo++) { + cut->Init(); + strcpy(cut->mName, ActionName(mKeys[keyNo].mAction)); + cut->mDataTop = header->dataNum; + + switch (mKeys[keyNo].mAction) { + case dDbgCam_KeyAction_FIXEDFRM: + case dDbgCam_KeyAction_UNITRANS: + if (mKeys[keyNo].mActorInfo.id != fpcM_ERROR_PROCESS_ID_e) { + pdata->Init(); + strcpy(pdata->mName, "RelActor"); + pdata->mIndex = header->dataNum++; + pdata->mType = dEvDtData_c::TYPE_STRING; + pdata->mDataIndex = sp14; + pdata->mNumber = 1; + pdata->mNext = header->dataNum; + pdata++; + strcpy(sdata, mKeys[keyNo].mActorInfo.name); + sp48 = strlen(mKeys[keyNo].mActorInfo.name) + 1; + header->sDataNum++; + sdata += sp48; + sp14 += sp48; + } + + pdata->Init(); + strcpy(pdata->mName, "Center"); + pdata->mIndex = header->dataNum++; + pdata->mType = dEvDtData_c::TYPE_VEC; + pdata->mDataIndex = header->fDataNum; + pdata->mNumber = 3; + pdata->mNext = header->dataNum; + pdata++; + + *fdata++ = mKeys[keyNo].mCenter.x; + *fdata++ = mKeys[keyNo].mCenter.y; + *fdata++ = mKeys[keyNo].mCenter.z; + header->fDataNum += 3; + + pdata->Init(); + strcpy(pdata->mName, "Eye"); + pdata->mIndex = header->dataNum++; + pdata->mType = dEvDtData_c::TYPE_VEC; + pdata->mDataIndex = header->fDataNum; + pdata->mNumber = 3; + pdata->mNext = header->dataNum; + pdata++; + + *fdata++ = mKeys[keyNo].mEye.x; + *fdata++ = mKeys[keyNo].mEye.y; + *fdata++ = mKeys[keyNo].mEye.z; + header->fDataNum += 3; + + pdata->Init(); + strcpy(pdata->mName, "Fovy"); + pdata->mIndex = header->dataNum++; + pdata->mType = dEvDtData_c::TYPE_FLOAT; + pdata->mDataIndex = header->fDataNum; + pdata->mNumber = 1; + pdata->mNext = header->dataNum; + pdata++; + + *fdata++ = mKeys[keyNo].mFovy; + header->fDataNum += 1; + + pdata->Init(); + strcpy(pdata->mName, "Bank"); + pdata->mIndex = header->dataNum++; + pdata->mType = dEvDtData_c::TYPE_FLOAT; + pdata->mDataIndex = header->fDataNum; + pdata->mNumber = 1; + pdata->mNext = header->dataNum; + pdata++; + + *fdata++ = mKeys[keyNo].mBank; + header->fDataNum += 1; + + pdata->Init(); + strcpy(pdata->mName, "Timer"); + pdata->mIndex = header->dataNum++; + pdata->mType = dEvDtData_c::TYPE_INT; + pdata->mDataIndex = header->iDataNum; + pdata->mNumber = 1; + pdata++; + + *idata++ = mKeys[keyNo].mTimer; + header->iDataNum += 1; + + field_0xb14 += mKeys[keyNo].mTimer; + break; + case dDbgCam_KeyAction_BSPLINE: + spline_timer = 0; + sp48 = 0; + + int sp8; + sp8 = spline_keyNum = keyNo; + for (; spline_keyNum < ARRAY_SIZE(mActionKey); spline_keyNum++) { + if (mActionKey[spline_keyNum] != ActionSymbol(dDbgCam_KeyAction_BSPLINE)) { + break; + } + + sp48++; + spline_timer += mKeys[spline_keyNum].mTimer; + } + + if (mKeys[keyNo].mActorInfo.id != fpcM_ERROR_PROCESS_ID_e) { + pdata->Init(); + strcpy(pdata->mName, "RelActor"); + pdata->mIndex = header->dataNum++; + pdata->mType = dEvDtData_c::TYPE_STRING; + pdata->mDataIndex = sp14; + pdata->mNumber = 1; + pdata->mNext = header->dataNum; + pdata++; + + strcpy(sdata, mKeys[keyNo].mActorInfo.name); + sp10 = strlen(mKeys[keyNo].mActorInfo.name) + 1; + header->sDataNum += 1; + + sdata += sp10; + sp14 += sp10; + } + + pdata->Init(); + strcpy(pdata->mName, "Centers"); + pdata->mIndex = header->dataNum++; + pdata->mType = dEvDtData_c::TYPE_VEC; + pdata->mDataIndex = header->fDataNum; + pdata->mNumber = sp48 * 3; + pdata->mNext = header->dataNum; + pdata++; + + + for (spline_keyNo = keyNo; spline_keyNo < spline_keyNum; spline_keyNo++) { + *fdata++ = mKeys[spline_keyNo].mCenter.x; + *fdata++ = mKeys[spline_keyNo].mCenter.y; + *fdata++ = mKeys[spline_keyNo].mCenter.z; + } + + header->fDataNum += sp48 * 3; + + pdata->Init(); + strcpy(pdata->mName, "Eyes"); + pdata->mIndex = header->dataNum++; + pdata->mType = dEvDtData_c::TYPE_VEC; + pdata->mDataIndex = header->fDataNum; + pdata->mNumber = sp48 * 3; + pdata->mNext = header->dataNum; + pdata++; + + for (spline_keyNo = keyNo; spline_keyNo < spline_keyNum; spline_keyNo++) { + *fdata++ = mKeys[spline_keyNo].mEye.x; + *fdata++ = mKeys[spline_keyNo].mEye.y; + *fdata++ = mKeys[spline_keyNo].mEye.z; + } + + header->fDataNum += sp48 * 3; + + pdata->Init(); + strcpy(pdata->mName, "Fovys"); + pdata->mIndex = header->dataNum++; + pdata->mType = dEvDtData_c::TYPE_FLOAT; + pdata->mDataIndex = header->fDataNum; + pdata->mNumber = sp48; + pdata->mNext = header->dataNum; + pdata++; + + for (spline_keyNo = keyNo; spline_keyNo < spline_keyNum; spline_keyNo++) { + *fdata++ = mKeys[spline_keyNo].mFovy; + } + + header->fDataNum += sp48; + + pdata->Init(); + strcpy(pdata->mName, "Timer"); + pdata->mIndex = header->dataNum++; + pdata->mType = dEvDtData_c::TYPE_INT; + pdata->mDataIndex = header->iDataNum; + pdata->mNumber = 1; + pdata++; + + *idata++ = spline_timer; + header->iDataNum += 1; + + field_0xb14 += spline_timer; + + keyNo += sp48; + } + + cut->mIndex = header->cutNum++; + cut->mFlagId = sp38++; + + if (prev_cut != NULL) { + cut->mFlags[0] = prev_cut->mFlagId; + prev_cut->mNext = cut->mIndex; + } + + prev_cut = cut; + event->mFlags[0] = cut->mFlagId; + cut++; + } + + if (header->cutNum > zevwork::CutMaxNum) { + OSReport("debug camera: too many cuts: %d > %d: broken event data\n", header->cutNum, zevwork::CutMaxNum); + return 0; + } + + if (header->dataNum > zevwork::DataMaxNum) { + OSReport("debug camera: too many data: %d > %d: broken event data\n", header->dataNum, zevwork::DataMaxNum); + return 0; + } + + if (header->fDataNum > zevwork::FDataMaxNum) { + OSReport("debug camera: too many fdata: %d > %d: broken event data\n", header->fDataNum, zevwork::FDataMaxNum); + return 0; + } + + if (header->fDataNum > zevwork::IDataMaxNum) { + OSReport("debug camera: too many idata: %d > %d: broken event data\n", header->iDataNum, zevwork::IDataMaxNum); + return 0; + } + + if (header->sDataNum > zevwork::SDataMaxNum) { + OSReport("debug camera: too many idata: %d > %d: broken event data\n", header->sDataNum, zevwork::SDataMaxNum); + return 0; + } + + if (header->cutNum != 0) { + OSReport(" cut %d \n", header->cutNum); + OSReport(" data %d \n", header->dataNum); + OSReport(" float %d \n", header->fDataNum); + OSReport(" integer %d \n", header->iDataNum); + OSReport(" string %d \n", header->sDataNum); + + dEvM_HIO_c& hio = dComIfGp_getPEvtManager()->getEventHIO(); + hio.setDebugCameraData(zevwork::WorkBuffer); + } + + return 1; +} + +void dDbgCamera_c::printZevData() { + OSReport("\n"); + OSReport("<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n\n"); + OSReport("<!--\n △ \n △△ Game Cube Zelda - "); + OSReport("Camera Tool Event Data \n ▼▼ \n ▼ \n-->\n"); + OSReport("<event version=\"2.0\">\n"); + OSReport(" <sequence name=\"???\" finish=\"CAMERA\">\n"); + OSReport(" <staff name=\"CAMERA\" type=\"CAMERA\">\n"); + + int keyNo; + int spline_keyNo, spline_keyNum, spline_timer; + for (keyNo = 0; keyNo < ARRAY_SIZE(mKeys); keyNo++) { + switch (mKeys[keyNo].mAction) { + case dDbgCam_KeyAction_FIXEDFRM: + OSReport(" <cut name=\"Key%02d\" type=\"FIXEDFRM\">\n", keyNo); + + if (mKeys[keyNo].mActorInfo.id != fpcM_ERROR_PROCESS_ID_e) { + OSReport(" <data name=\"RelActor\" type=\"STRING\">"); + OSReport("%s</data>\n", mKeys[keyNo].mActorInfo.name); + } + + OSReport(" <data name=\"Center\" type=\"XYZ\">"); + OSReport("%.3f %.3f %.3f</data>\n", mKeys[keyNo].mCenter.x, mKeys[keyNo].mCenter.y, mKeys[keyNo].mCenter.z); + + OSReport(" <data name=\"Eye\" type=\"XYZ\">"); + OSReport("%.3f %.3f %.3f</data>\n", mKeys[keyNo].mEye.x, mKeys[keyNo].mEye.y, mKeys[keyNo].mEye.z); + + OSReport(" <data name=\"Fovy\" type=\"FLOAT\">"); + OSReport("%.3f</data>\n", mKeys[keyNo].mFovy); + + OSReport(" <data name=\"Bank\" type=\"FLOAT\">"); + OSReport("%.3f</data>\n", mKeys[keyNo].mBank); + + OSReport(" <data name=\"Timer\" type=\"INTEGER\">"); + OSReport("%d</data>\n", mKeys[keyNo].mTimer); + + OSReport(" </cut>\n"); + break; + case dDbgCam_KeyAction_UNITRANS: + OSReport(" <cut name=\"Key%02d\" type=\"UNITRANS\">\n", keyNo); + + if (mKeys[keyNo].mActorInfo.id != fpcM_ERROR_PROCESS_ID_e) { + OSReport(" <data name=\"RelActor\" type=\"STRING\">"); + OSReport("%s</data>\n", mKeys[keyNo].mActorInfo.name); + } + + OSReport(" <data name=\"Center\" type=\"XYZ\">"); + OSReport("%.3f %.3f %.3f</data>\n", mKeys[keyNo].mCenter.x, mKeys[keyNo].mCenter.y, mKeys[keyNo].mCenter.z); + + OSReport(" <data name=\"Eye\" type=\"XYZ\">"); + OSReport("%.3f %.3f %.3f</data>\n", mKeys[keyNo].mEye.x, mKeys[keyNo].mEye.y, mKeys[keyNo].mEye.z); + + OSReport(" <data name=\"Fovy\" type=\"FLOAT\">"); + OSReport("%.3f</data>\n", mKeys[keyNo].mFovy); + + OSReport(" <data name=\"Bank\" type=\"FLOAT\">"); + OSReport("%.3f</data>\n", mKeys[keyNo].mBank); + + OSReport(" <data name=\"Timer\" type=\"INTEGER\">"); + OSReport("%d</data>\n", mKeys[keyNo].mTimer); + + OSReport(" </cut>\n"); + break; + case dDbgCam_KeyAction_BSPLINE: + spline_keyNum = keyNo; + for (; spline_keyNum < ARRAY_SIZE(mActionKey); spline_keyNum++) { + if (mActionKey[spline_keyNum] != ActionSymbol(dDbgCam_KeyAction_BSPLINE)) { + break; + } + } + + OSReport(" <cut name=\"Key%02d\" type=\"BSPLINE\">\n", keyNo); + + if (mKeys[keyNo].mActorInfo.id != fpcM_ERROR_PROCESS_ID_e) { + OSReport(" <data name=\"RelActor\" type=\"STRING\">"); + OSReport("%s</data>\n", mKeys[keyNo].mActorInfo.name); + } + + OSReport(" <data name=\"Centers\" type=\"XYZ\">\n"); + for (spline_keyNo = keyNo; spline_keyNo < spline_keyNum; spline_keyNo++) { + OSReport(" %.3f %.3f %.3f\n", mKeys[spline_keyNo].mCenter.x, mKeys[spline_keyNo].mCenter.y, mKeys[spline_keyNo].mCenter.z); + } + OSReport(" </data>\n"); + + OSReport(" <data name=\"Eyes\" type=\"XYZ\">\n"); + for (spline_keyNo = keyNo; spline_keyNo < spline_keyNum; spline_keyNo++) { + OSReport(" %.3f %.3f %.3f\n", mKeys[spline_keyNo].mEye.x, mKeys[spline_keyNo].mEye.y, mKeys[spline_keyNo].mEye.z); + } + OSReport(" </data>\n"); + + OSReport(" <data name=\"Fovys\" type=\"FLOAT\">\n"); + for (spline_keyNo = keyNo; spline_keyNo < spline_keyNum; spline_keyNo++) { + OSReport(" %.3f\n", mKeys[spline_keyNo].mFovy); + } + OSReport(" </data>\n"); + + spline_timer = 0; + for (spline_keyNo = keyNo; spline_keyNo < spline_keyNum; spline_keyNo++) { + spline_timer += mKeys[spline_keyNo].mTimer; + } + OSReport(" <data name=\"Timer\" type=\"INTEGER\">%d</data>\n", spline_timer); + + OSReport(" </cut>\n"); + keyNo = spline_keyNum - 1; + break; + } + } + + OSReport(" </staff>\n"); + OSReport(" <staff name=\"ALL\" type=\"EXTRA\">\n"); + OSReport(" <cut name=\"dummy\" type=\"DUMMY\"/>\n"); + OSReport(" </staff>\n"); + OSReport(" </sequence>\n"); + OSReport("</event>\n"); + OSReport("\n"); +} + +void dDbgCamera_c::WriteZevData() { + OpenFile(); + + PrintFile("\n"); + PrintFile("<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n\n"); + PrintFile("<!--\n △ \n △△ Game Cube Zelda - "); + PrintFile("Camera Tool Event Data \n ▼▼ \n ▼ \n-->\n"); + PrintFile("<event version=\"2.0\">\n"); + PrintFile(" <sequence name=\"???\" finish=\"CAMERA\">\n"); + PrintFile(" <staff name=\"CAMERA\" type=\"CAMERA\">\n"); + + int keyNo; + int spline_keyNo, spline_keyNum, spline_timer; + for (keyNo = 0; keyNo < ARRAY_SIZE(mKeys); keyNo++) { + switch (mKeys[keyNo].mAction) { + case dDbgCam_KeyAction_FIXEDFRM: + PrintFile(" <cut name=\"Key%02d\" type=\"FIXEDFRM\">\n", keyNo); + + if (mKeys[keyNo].mActorInfo.id != fpcM_ERROR_PROCESS_ID_e) { + PrintFile(" <data name=\"RelActor\" type=\"STRING\">"); + PrintFile("%s</data>\n", mKeys[keyNo].mActorInfo.name); + } + + PrintFile(" <data name=\"Center\" type=\"XYZ\">"); + PrintFile("%.3f %.3f %.3f</data>\n", mKeys[keyNo].mCenter.x, mKeys[keyNo].mCenter.y, mKeys[keyNo].mCenter.z); + + PrintFile(" <data name=\"Eye\" type=\"XYZ\">"); + PrintFile("%.3f %.3f %.3f</data>\n", mKeys[keyNo].mEye.x, mKeys[keyNo].mEye.y, mKeys[keyNo].mEye.z); + + PrintFile(" <data name=\"Fovy\" type=\"FLOAT\">"); + PrintFile("%.3f</data>\n", mKeys[keyNo].mFovy); + + PrintFile(" <data name=\"Bank\" type=\"FLOAT\">"); + PrintFile("%.3f</data>\n", mKeys[keyNo].mBank); + + PrintFile(" <data name=\"Timer\" type=\"INTEGER\">"); + PrintFile("%d</data>\n", mKeys[keyNo].mTimer); + + PrintFile(" </cut>\n"); + break; + case dDbgCam_KeyAction_UNITRANS: + PrintFile(" <cut name=\"Key%02d\" type=\"UNITRANS\">\n", keyNo); + + if (mKeys[keyNo].mActorInfo.id != fpcM_ERROR_PROCESS_ID_e) { + PrintFile(" <data name=\"RelActor\" type=\"STRING\">"); + PrintFile("%s</data>\n", mKeys[keyNo].mActorInfo.name); + } + + PrintFile(" <data name=\"Center\" type=\"XYZ\">"); + PrintFile("%.3f %.3f %.3f</data>\n", mKeys[keyNo].mCenter.x, mKeys[keyNo].mCenter.y, mKeys[keyNo].mCenter.z); + + PrintFile(" <data name=\"Eye\" type=\"XYZ\">"); + PrintFile("%.3f %.3f %.3f</data>\n", mKeys[keyNo].mEye.x, mKeys[keyNo].mEye.y, mKeys[keyNo].mEye.z); + + PrintFile(" <data name=\"Fovy\" type=\"FLOAT\">"); + PrintFile("%.3f</data>\n", mKeys[keyNo].mFovy); + + PrintFile(" <data name=\"Bank\" type=\"FLOAT\">"); + PrintFile("%.3f</data>\n", mKeys[keyNo].mBank); + + PrintFile(" <data name=\"Timer\" type=\"INTEGER\">"); + PrintFile("%d</data>\n", mKeys[keyNo].mTimer); + + PrintFile(" </cut>\n"); + break; + case dDbgCam_KeyAction_BSPLINE: + spline_keyNum = keyNo; + for (; spline_keyNum < ARRAY_SIZE(mActionKey); spline_keyNum++) { + if (mActionKey[spline_keyNum] != ActionSymbol(dDbgCam_KeyAction_BSPLINE)) { + break; + } + } + + PrintFile(" <cut name=\"Key%02d\" type=\"BSPLINE\">\n", keyNo); + + if (mKeys[keyNo].mActorInfo.id != fpcM_ERROR_PROCESS_ID_e) { + PrintFile(" <data name=\"RelActor\" type=\"STRING\">"); + PrintFile("%s</data>\n", mKeys[keyNo].mActorInfo.name); + } + + PrintFile(" <data name=\"Centers\" type=\"XYZ\">\n"); + for (spline_keyNo = keyNo; spline_keyNo < spline_keyNum; spline_keyNo++) { + PrintFile(" %.3f %.3f %.3f\n", mKeys[spline_keyNo].mCenter.x, mKeys[spline_keyNo].mCenter.y, mKeys[spline_keyNo].mCenter.z); + } + PrintFile(" </data>\n"); + + PrintFile(" <data name=\"Eyes\" type=\"XYZ\">\n"); + for (spline_keyNo = keyNo; spline_keyNo < spline_keyNum; spline_keyNo++) { + PrintFile(" %.3f %.3f %.3f\n", mKeys[spline_keyNo].mEye.x, mKeys[spline_keyNo].mEye.y, mKeys[spline_keyNo].mEye.z); + } + PrintFile(" </data>\n"); + + PrintFile(" <data name=\"Fovys\" type=\"FLOAT\">\n"); + for (spline_keyNo = keyNo; spline_keyNo < spline_keyNum; spline_keyNo++) { + PrintFile(" %.3f\n", mKeys[spline_keyNo].mFovy); + } + PrintFile(" </data>\n"); + + spline_timer = 0; + for (spline_keyNo = keyNo; spline_keyNo < spline_keyNum; spline_keyNo++) { + spline_timer += mKeys[spline_keyNo].mTimer; + } + PrintFile(" <data name=\"Timer\" type=\"INTEGER\">%d</data>\n", spline_timer); + + PrintFile(" </cut>\n"); + keyNo = spline_keyNum - 1; + break; + } + } + + PrintFile(" </staff>\n"); + PrintFile(" <staff name=\"ALL\" type=\"EXTRA\">\n"); + PrintFile(" <cut name=\"dummy\" type=\"DUMMY\"/>\n"); + PrintFile(" </staff>\n"); + PrintFile(" </sequence>\n"); + PrintFile("</event>\n"); + PrintFile("\n"); + + CloseFile(); +} + +void dDbgCamera_c::monitor() { + s32 pos_x = mCamSetup.mPosX; + s32 pos_y = mCamSetup.mPosY; + s32 y_offset = 15; + + if (!mIsPlaying) { + cXyz center(mRunKey.mCenter); + cXyz eye(mRunKey.mEye); + fopAc_ac_c* actor = NULL; + f32 u = field_0x44.U().Degree(); + + if (mRunKey.mActorInfo.id != fpcM_ERROR_PROCESS_ID_e) { + actor = Actor(mRunKey.mActorInfo.id); + if (actor != NULL) { + cSGlobe sp70(mRunKey.mCenter - actor->attention_info.position); + sp70.U(sp70.U() - cSAngle(actor->shape_angle.y)); + center = sp70.Xyz(); + + cSGlobe sp68(mRunKey.mEye - actor->attention_info.position); + sp68.U(sp68.U() - cSAngle(actor->shape_angle.y)); + eye = sp68.Xyz(); + + u = cSAngle(field_0x44.U() - actor->shape_angle.y).Degree(); + } + } + + Report(pos_x, pos_y, 1, "CTR%11.3f%11.3f%11.3f", center.x, center.y, center.z); + Report(pos_x, pos_y += y_offset, 1, "EYE%11.3f%11.3f%11.3f", eye.x, eye.y, eye.z); + Report(pos_x, pos_y += y_offset, 1, "RVU %10.3f %10.3f %10.3f", field_0x44.R(), field_0x44.V().Degree(), u); + Report(pos_x, pos_y += y_offset, 1, "FVY %10.3f %s %s %s", mRunKey.mFovy, field_0xc08 ? "[L]" : "[ ]", field_0xc0c ? "[R]" : "[ ]", field_0xc08 ? "CTR->EYE" : "EYE->CTR"); + Report(pos_x - 13, pos_y + (y_offset * field_0x54), 7, "*"); + + if (actor != NULL) { + Report(pos_x, pos_y += y_offset, 1, "BNK %10.3f @%7.7s", mRunKey.mBank, &mRunKey.mActorInfo.name); + } else { + Report(pos_x, pos_y += y_offset, 1, "BNK %10.3f @ WORLD", mRunKey.mBank); + } + + Report(pos_x, pos_y += y_offset, 1, "KEY %s", mActionKey); + + char spC0[32]; + + int var_r27; + for (var_r27 = 0; var_r27 < ARRAY_SIZE(spC0); var_r27++) { + if (var_r27 == field_0x58) { + spC0[var_r27] = '_'; + var_r27++; + break; + } + + spC0[var_r27] = ' '; + } + + spC0[var_r27] = 0; + Report(pos_x, pos_y, 7, " %s", spC0); + Report(pos_x, pos_y += y_offset, 1, "CMD BASE PLAY TERM FIXP"); + + *spC0 = 0; + + for (var_r27 = 0; var_r27 < 4; var_r27++) { + if (var_r27 == mCmdMode) { + strcat(spC0, "____ "); + break; + } + + strcat(spC0, " "); + } + + Report(pos_x, pos_y, 7, " %s", spC0); + Report(pos_x, pos_y += y_offset, 1, "ACT %c %8.8s", ActionSymbol(mRunKey.mAction), ActionName(mRunKey.mAction)); + Report(pos_x, pos_y += y_offset, 1, "TIM %3d", mRunKey.mTimer); + } else { + Report(pos_x, pos_y, 1, "CNT %4d/%4d", field_0x704.field_0x4 - 1, field_0xb14); + } +} + +bool dDbgCamera_c::showCenterMarker() { + switch (mCamSetup.CenterMarker()) { + case 1: + if (field_0xc00 != 18 || field_0xc04 != 18 || field_0xc08 != 0 || field_0xc0c != 0) { + field_0xc18 = 60; + } + + if (field_0xc18 != 0) { + field_0xc18--; + } + + return field_0xc18 != 0; + case 3: + return true; + case 2: + case 0: + default: + return false; + } +} + +bool dDbgCamera_c::showCameraPos() { + return mCamSetup.CheckFlag(4); +} + +bool dDbgCamera_c::showIdlCameraPos() { + return mCamSetup.CheckFlag(8); +} + +void dDbgCamera_c::Init(dCamera_c* i_dbgCamera) { + mpCamera = i_dbgCamera; + mRunKey = PlaneKey(); + mRunKey.mAction = dDbgCam_KeyAction_FIXEDFRM; + field_0x58 = 0; + + int i; + for (i = 0; i < ARRAY_SIZE(mKeys); i++) { + mKeys[i] = PlaneKey(); + } + + memset(mActionKey, '-', sizeof(mActionKey)); + field_0x80 = 0; + field_0x54 = 0; + mCmdMode = 0; + mCamSetup.Init(this); +} + +void dDbgCamera_c::Finish() { + mCamSetup.Finish(); +} + +void dDbgCamera_c::Reset(dCamera_c* i_dbgCamera) { + mpCamera = i_dbgCamera; + mPadNo = PAD_3; + field_0x50 = 0; + mUp = i_dbgCamera->Up(); + + if (mActionKey[field_0x58] == '-') { + mRunKey = PlaneKey(); + } + + field_0xc04 = field_0xc00 = 18; + field_0xc10 = field_0xc14 = 0.0f; + field_0xc08 = field_0xc0c = 0; + field_0xc18 = 0; + mCmdMode = 0; + mIsPlaying = false; +} + +int dDbgCamera_c::Run() { + int rt; + + if (mDoCPd_c::getHoldLockL(mPadNo)) { + field_0xc08 = 1; + } else { + field_0xc08 = 0; + } + + if (mDoCPd_c::getHoldLockR(mPadNo)) { + field_0xc0c = 1; + } else { + field_0xc0c = 0; + } + + if (mDoCPd_c::getTrigUp(mPadNo)) { + if (field_0x54 == 0) { + field_0x54 = 5; + } else { + field_0x54--; + } + } else if (mDoCPd_c::getTrigDown(mPadNo)) { + if (field_0x54 >= 5) { + field_0x54 = 0; + } else { + field_0x54++; + } + } + + if (field_0x54 == 4) { + if (mDoCPd_c::getTrigLeft(mPadNo)) { + if (mRunKey.mAction == dDbgCam_KeyAction_FIXEDFRM) { + mRunKey.mAction = dDbgCam_KeyAction_NOACTION; + } else { + mRunKey.mAction--; + } + } else if (mDoCPd_c::getTrigRight(mPadNo)) { + if (mRunKey.mAction == dDbgCam_KeyAction_NOACTION) { + mRunKey.mAction = dDbgCam_KeyAction_FIXEDFRM; + } else { + mRunKey.mAction++; + } + } + } else if (field_0x54 == 5) { + if (mDoCPd_c::getTrigRight(mPadNo)) { + mRunKey.mTimer++; + field_0xc1c = 0; + } else if (mDoCPd_c::getHoldRight(mPadNo)) { + if (field_0xc1c++ > 20) { + mRunKey.mTimer++; + } + } else if (mDoCPd_c::getTrigLeft(mPadNo)) { + mRunKey.mTimer--; + field_0xc1c = 0; + } else if (mDoCPd_c::getHoldLeft(mPadNo)) { + if (field_0xc1c++ > 20) { + mRunKey.mTimer--; + } + } + } else if (field_0x54 == 3) { + rt = cmdTool(); + } else { + rt = moveTool(); + } + + if (mCamSetup.CheckFlag(0x8000)) { + monitor(); + } + + return rt; +} + +int dDbgCamera_c::DrawShape() { + int rt = 0; + + if (showCameraPos()) { + cXyz sp2F0[] = { + cXyz(5.0f, 6.5f, 10.0f), + cXyz(-5.0f, 6.5f, 10.0f), + cXyz(5.0f, -7.5f, 10.0f), + cXyz(-5.0f, -7.5f, 10.0f), + cXyz(5.0f, 6.5f, -10.0f), + cXyz(-5.0f, 6.5f, -10.0f), + cXyz(5.0f, -5.0f, -10.0f), + cXyz(-5.0f, -5.0f, -10.0f), + }; + + cXyz sp290[] = { + cXyz(3.0f, 3.0f, 10.0f), + cXyz(-3.0f, 3.0f, 10.0f), + cXyz(3.0f, -3.0f, 10.0f), + cXyz(-3.0f, -3.0f, 10.0f), + cXyz(3.0f, 3.0f, 16.0f), + cXyz(-3.0f, 3.0f, 16.0f), + cXyz(3.0f, -3.0f, 16.0f), + cXyz(-3.0f, -3.0f, 16.0f), + }; + + cXyz sp1A0[] = { + cXyz(80.0f, 0.0f, 0.0f), + cXyz(-80.0f, 0.0f, 0.0f), + cXyz(0.0f, 80.0f, 0.0f), + cXyz(0.0f, -80.0f, 0.0f), + }; + + dCamera_c* camera = dCam_getBody(); + + GXColor sp6C = {0xFF, 0xDC, 0x80, 0x96}; + GXColor sp68 = {0xDC, 0xFF, 0x80, 0x96}; + GXColor sp64 = {0xFF, 0xFF, 0xFF, 0x32}; + + cXyz cam_center = camera->Center(); + cXyz cam_eye = camera->Eye(); + cSAngle cam_u(camera->U()); + cSAngle cam_v(camera->V()); + + int i; + for (i = 0; i < 8; i++) { + sp2F0[i] = dCamMath::xyzRotateX(sp2F0[i], cam_v); + sp2F0[i] = dCamMath::xyzRotateY(sp2F0[i], cam_u); + sp2F0[i] += cam_eye; + + sp290[i] = dCamMath::xyzRotateX(sp290[i], cam_v); + sp290[i] = dCamMath::xyzRotateY(sp290[i], cam_u); + sp290[i] += cam_eye; + } + + dDbVw_drawCube8pOpa(sp2F0, sp6C); + dDbVw_drawCube8pOpa(sp290, sp6C); + dDbVw_drawSphereXlu(cam_eye, 3.0f, sp68, 1); + dDbVw_drawSphereXlu(cam_center, 5.0f, sp68, 1); + + for (i = 0; i < 4; i++) { + sp1A0[i] = dCamMath::xyzRotateX(sp1A0[i], cam_v); + sp1A0[i] = dCamMath::xyzRotateY(sp1A0[i], cam_u); + sp1A0[i] += cam_center; + } + + cSGlobe sp78(80.0f + camera->R(), -cam_v, cam_u); + dDbVw_drawLineXlu(cam_eye, cam_center, sp64, 1, 0xC); + dDbVw_drawLineXlu(sp1A0[0], sp1A0[1], sp64, 1, 0xC); + dDbVw_drawLineXlu(sp1A0[2], sp1A0[3], sp64, 1, 0xC); + rt = 1; + } + + if (showIdlCameraPos()) { + cXyz sp230[] = { + cXyz(5.0f, 6.5f, 10.0f), + cXyz(-5.0f, 6.5f, 10.0f), + cXyz(5.0f, -7.5f, 10.0f), + cXyz(-5.0f, -7.5f, 10.0f), + cXyz(5.0f, 6.5f, -10.0f), + cXyz(-5.0f, 6.5f, -10.0f), + cXyz(5.0f, -5.0f, -10.0f), + cXyz(-5.0f, -5.0f, -10.0f), + }; + + cXyz sp1D0[] = { + cXyz(3.0f, 3.0f, 10.0f), + cXyz(-3.0f, 3.0f, 10.0f), + cXyz(3.0f, -3.0f, 10.0f), + cXyz(-3.0f, -3.0f, 10.0f), + cXyz(3.0f, 3.0f, 16.0f), + cXyz(-3.0f, 3.0f, 16.0f), + cXyz(3.0f, -3.0f, 16.0f), + cXyz(-3.0f, -3.0f, 16.0f), + }; + + cXyz sp170[] = { + cXyz(80.0f, 0.0f, 0.0f), + cXyz(-80.0f, 0.0f, 0.0f), + cXyz(0.0f, 80.0f, 0.0f), + cXyz(0.0f, -80.0f, 0.0f), + }; + + dCamera_c* camera = dCam_getBody(); + + GXColor sp60 = {0x80, 0xFF, 0xDC, 0x5A}; + GXColor sp5C = {0x80, 0xDC, 0xFF, 0x5A}; + GXColor sp58 = {0xFF, 0xFF, 0xFF, 0x1E}; + + cXyz cam_icenter = camera->iCenter(); + cXyz cam_ieye = camera->iEye(); + cSAngle cam_iu(camera->iU()); + cSAngle cam_iv(camera->iV()); + + int i; + for (i = 0; i < 8; i++) { + sp230[i] = dCamMath::xyzRotateX(sp230[i], cam_iv); + sp230[i] = dCamMath::xyzRotateY(sp230[i], cam_iu); + sp230[i] += cam_ieye; + + sp1D0[i] = dCamMath::xyzRotateX(sp1D0[i], cam_iv); + sp1D0[i] = dCamMath::xyzRotateY(sp1D0[i], cam_iu); + sp1D0[i] += cam_ieye; + } + + dDbVw_drawCube8pOpa(sp230, sp60); + dDbVw_drawCube8pOpa(sp1D0, sp60); + dDbVw_drawSphereXlu(cam_ieye, 3.0f, sp5C, 1); + dDbVw_drawSphereXlu(cam_icenter, 5.0f, sp5C, 1); + + for (i = 0; i < 4; i++) { + sp170[i] = dCamMath::xyzRotateX(sp170[i], cam_iv); + sp170[i] = dCamMath::xyzRotateY(sp170[i], cam_iu); + sp170[i] += cam_icenter; + } + + cSGlobe sp70(80.0f + camera->iR(), -cam_iv, cam_iu); + cam_icenter = cam_ieye + sp70.Xyz(); + + dDbVw_drawLineXlu(cam_ieye, cam_icenter, sp58, 1, 0xC); + dDbVw_drawLineXlu(sp170[0], sp170[01], sp58, 1, 0xC); + dDbVw_drawLineXlu(sp170[2], sp170[3], sp58, 1, 0xC); + rt = 1; + } + + if (showCenterMarker()) { + f32 cam_cross = mCamSetup.CenterCloss(); + GXColor color = {0x80, 0x80, 0xFF, 0x80}; + cXyz sp134; + cXyz sp128; + + sp134 = mRunKey.mCenter; + sp128 = mRunKey.mCenter; + sp134.x += cam_cross; + sp128.x -= cam_cross; + dDbVw_drawLineXlu(sp134, sp128, color, 1, 0xC); + + sp134.x -= cam_cross; + sp128.x += cam_cross; + sp134.y += cam_cross; + sp128.y -= cam_cross; + dDbVw_drawLineXlu(sp134, sp128, color, 1, 0xC); + + sp134.y -= cam_cross; + sp128.y += cam_cross; + sp134.z += cam_cross; + sp128.z -= cam_cross; + dDbVw_drawLineXlu(sp134, sp128, color, 1, 0xC); + + cam_cross = mCamSetup.CenterBall(); + + GXColor sp50 = {0xFF, 0x80, 0x80, 0x80}; + if (field_0xc08 != 0) { + sp50.g = 0xFF; + } + + if (field_0xc0c != 0) { + sp50.b = 0xFF; + } + + dDbVw_drawSphereXlu(mRunKey.mCenter, cam_cross, sp50, 1); + rt = 1; + } + + if (mCamSetup.CheckFlag(0x10)) { + switch (mLchkNum) { + case 2: + // dComIfG_Bgsp().DrawPoly(mLchk[1], l_color2); + /* fallthrough */ + case 1: + // dComIfG_Bgsp().DrawPoly(mLchk[0], l_color1); + break; + } + } + + return rt; +} + +JUtility::TColor get_color(JUtility::TColor color) { + static JUtility::TColor colors[] = { + JUtility::TColor(0xFF, 0xFF, 0xFF, 0xFF), + JUtility::TColor(0xFF, 0xFF, 0xC0, 0xFF), + JUtility::TColor(0xFF, 0xC0, 0xC0, 0xFF), + JUtility::TColor(0xC0, 0xFF, 0xC0, 0xFF), + JUtility::TColor(0xC0, 0xC0, 0xFF, 0xFF), + JUtility::TColor(0xFF, 0xFF, 0x80, 0xFF), + JUtility::TColor(0xFF, 0x80, 0x80, 0xFF), + JUtility::TColor(0xC0, 0xFF, 0x80, 0xFF), + JUtility::TColor(0x80, 0x80, 0xFF, 0xFF), + }; + + (void)(u32)color; + int var_r30 = 1; + + if (var_r30 && (u32)color < 9) { + return colors[(u32)color & ~0x80000000]; + } + + return color; +} + +int dDbgCamera_c::Report(int x, int y, JUtility::TColor color, const char* mesg, ...) { + char buffer[0x100]; + + static JUtility::TColor ShadowDarkColor(0, 0, 0, 0x80); + + va_list list; + va_start(list, mesg); + vsnprintf(buffer, sizeof(buffer), mesg, list); + va_end(list); + + JUTDbPrint::getManager()->flush(); + + JUTDbPrint::getManager()->setCharColor(ShadowDarkColor); + JUTReport(x + 2, y + 2, buffer); + + JUTDbPrint::getManager()->flush(); + + JUTDbPrint::getManager()->setCharColor(get_color(color)); + JUTReport(x, y, buffer); + + JUTDbPrint::getManager()->flush(); + JUTDbPrint::getManager()->setCharColor(g_HIO.mColor); + return 1; +} + +void dDbgCamera_c::OpenFile() { + const char ext[] = "イベントファイル(*.zev)\0*.zev\0その他のファイル(*.*)\0*.*\0"; + mFile.open("dbgcam.zev", 2, ext, NULL, NULL, NULL); +} + +void dDbgCamera_c::PrintFile(char* string, ...) { + char buffer[0x100]; + + va_list args; + va_start(args, string); + vsnprintf(buffer, sizeof(buffer), string, args); + va_end(args); + + mFile.writeData(buffer, strlen(buffer)); +} + +void dDbgCamera_c::CloseFile() { + mFile.close(); +} + +#endif |
