From d8a4157b9f8de4054defe551e07ffc7a7aaae6e2 Mon Sep 17 00:00:00 2001 From: Jcw87 Date: Wed, 11 Feb 2026 00:05:16 -0800 Subject: [PATCH] d_jnt_col debug (#3088) --- config/RZDE01_00/splits.txt | 7 +- config/RZDE01_02/splits.txt | 7 +- config/RZDJ01/splits.txt | 7 +- config/RZDP01/splits.txt | 7 +- include/JSystem/JHostIO/JORMContext.h | 9 +- include/d/d_jnt_col.h | 23 ++ include/m_Do/m_Do_mtx.h | 8 +- src/d/d_jnt_col.cpp | 318 ++++++++++++++++++++++++++ 8 files changed, 373 insertions(+), 13 deletions(-) diff --git a/config/RZDE01_00/splits.txt b/config/RZDE01_00/splits.txt index 54c6ce1e3ff..c0cdb64a1b8 100644 --- a/config/RZDE01_00/splits.txt +++ b/config/RZDE01_00/splits.txt @@ -434,14 +434,15 @@ d/d_save_init.cpp: d/d_jnt_col.cpp: .text start:0x8003A150 end:0x8003AF5C - .data start:0x803FE490 end:0x803FE5A8 - .sdata start:0x80537B38 end:0x80537B68 + .data start:0x803FE490 end:0x803FE4D8 + .sdata start:0x80537B38 end:0x80537B50 .sdata2 start:0x8053BE28 end:0x8053BE48 d/d_a_obj.cpp: .text start:0x8003AF5C end:0x8003B800 .rodata start:0x803D04F0 end:0x803D0500 .bss start:0x804B0D60 end:0x804B0DC0 + .sdata start:0x80537B50 end:0x80537B58 .sbss start:0x8053AA38 end:0x8053AA40 .sdata2 start:0x8053BE48 end:0x8053BE60 @@ -455,6 +456,8 @@ d/d_a_item_static.cpp: d/d_a_shop_item_static.cpp: .text start:0x8003B98C end:0x8003B9F4 .rodata start:0x803D0538 end:0x803D0988 + .data start:0x803FE4D8 end:0x803FE5A8 + .sdata start:0x80537B58 end:0x80537B68 d/d_a_horse_static.cpp: .text start:0x8003B9F4 end:0x8003BB4C diff --git a/config/RZDE01_02/splits.txt b/config/RZDE01_02/splits.txt index 99537c82d68..f1bd9313543 100644 --- a/config/RZDE01_02/splits.txt +++ b/config/RZDE01_02/splits.txt @@ -434,14 +434,15 @@ d/d_save_init.cpp: d/d_jnt_col.cpp: .text start:0x8003A300 end:0x8003B10C - .data start:0x803E9730 end:0x803E9848 - .sdata start:0x8051DBD8 end:0x8051DC08 + .data start:0x803E9730 end:0x803E9778 + .sdata start:0x8051DBD8 end:0x8051DBF0 .sdata2 start:0x80521E28 end:0x80521E48 d/d_a_obj.cpp: .text start:0x8003B10C end:0x8003B9B0 .rodata start:0x803BAF30 end:0x803BAF40 .bss start:0x80498368 end:0x804983C8 + .sdata start:0x8051DBF0 end:0x8051DBF8 .sbss start:0x80520A40 end:0x80520A48 .sdata2 start:0x80521E48 end:0x80521E60 @@ -455,6 +456,8 @@ d/d_a_item_static.cpp: d/d_a_shop_item_static.cpp: .text start:0x8003BB3C end:0x8003BBA4 .rodata start:0x803BAF78 end:0x803BB3C8 + .data start:0x803E9778 end:0x803E9848 + .sdata start:0x8051DBF8 end:0x8051DC08 d/d_a_horse_static.cpp: .text start:0x8003BBA4 end:0x8003BCFC diff --git a/config/RZDJ01/splits.txt b/config/RZDJ01/splits.txt index ffef7e81144..d60dba5171d 100644 --- a/config/RZDJ01/splits.txt +++ b/config/RZDJ01/splits.txt @@ -434,14 +434,15 @@ d/d_save_init.cpp: d/d_jnt_col.cpp: .text start:0x8003A27C end:0x8003B088 - .data start:0x803E76B8 end:0x803E77D0 - .sdata start:0x8051BA50 end:0x8051BA80 + .data start:0x803E76B8 end:0x803E7700 + .sdata start:0x8051BA50 end:0x8051BA68 .sdata2 start:0x8051FCA8 end:0x8051FCC8 d/d_a_obj.cpp: .text start:0x8003B088 end:0x8003B92C .rodata start:0x803BC9F0 end:0x803BCA00 .bss start:0x804961E8 end:0x80496248 + .sdata start:0x8051BA68 end:0x8051BA70 .sbss start:0x8051E8C0 end:0x8051E8C8 .sdata2 start:0x8051FCC8 end:0x8051FCE0 @@ -455,6 +456,8 @@ d/d_a_item_static.cpp: d/d_a_shop_item_static.cpp: .text start:0x8003BAB8 end:0x8003BB20 .rodata start:0x803BCA38 end:0x803BCE88 + .data start:0x803E7700 end:0x803E77D0 + .sdata start:0x8051BA70 end:0x8051BA80 d/d_a_horse_static.cpp: .text start:0x8003BB20 end:0x8003BC78 diff --git a/config/RZDP01/splits.txt b/config/RZDP01/splits.txt index 06235cc4c21..9f7823a2b47 100644 --- a/config/RZDP01/splits.txt +++ b/config/RZDP01/splits.txt @@ -434,14 +434,15 @@ d/d_save_init.cpp: d/d_jnt_col.cpp: .text start:0x8003A3CC end:0x8003B1D8 - .data start:0x803EA4E0 end:0x803EA5F8 - .sdata start:0x8051E4D8 end:0x8051E508 + .data start:0x803EA4E0 end:0x803EA528 + .sdata start:0x8051E4D8 end:0x8051E4F0 .sdata2 start:0x805225E8 end:0x80522608 d/d_a_obj.cpp: .text start:0x8003B1D8 end:0x8003BA7C .rodata start:0x803BB3B0 end:0x803BB3C0 .bss start:0x80498C60 end:0x80498CC0 + .sdata start:0x8051E4F0 end:0x8051E4F8 .sbss start:0x80521200 end:0x80521208 .sdata2 start:0x80522608 end:0x80522620 @@ -455,6 +456,8 @@ d/d_a_item_static.cpp: d/d_a_shop_item_static.cpp: .text start:0x8003BC08 end:0x8003BC70 .rodata start:0x803BB3F8 end:0x803BB848 + .data start:0x803EA528 end:0x803EA5F8 + .sdata start:0x8051E4F8 end:0x8051E508 d/d_a_horse_static.cpp: .text start:0x8003BC70 end:0x8003BDC8 diff --git a/include/JSystem/JHostIO/JORMContext.h b/include/JSystem/JHostIO/JORMContext.h index ad4d19f9f13..725cae652e9 100644 --- a/include/JSystem/JHostIO/JORMContext.h +++ b/include/JSystem/JHostIO/JORMContext.h @@ -86,6 +86,11 @@ updateSelectorSub(mode, (uintptr_t)pSrc, *pSrc, param_2); \ } +#define DEFINE_UPDATE_COMBO_BOX_ID(T) \ + void updateComboBoxID(u32 mode, u32 id, T value, u32 param_4) { \ + updateSelectorSub(mode, id, value, param_4); \ + } + #define DEFINE_UPDATE_SLIDER(T) \ void updateSlider(u32 mode, T* pSrc, T rangeMin, T rangeMax, u32 param_5) { \ updateSliderSub(mode, (uintptr_t)pSrc, *pSrc, rangeMin, rangeMax, param_5); \ @@ -258,10 +263,12 @@ public: DEFINE_START_COMBO_BOX(s16, jhostio::EKind_16B) DEFINE_START_COMBO_BOX(s32, jhostio::EKind_32B) - DEFINE_START_COMBO_BOX_ID(int, JORPropertyEvent::EKind_ValueID) + DEFINE_START_COMBO_BOX_ID(s32, JORPropertyEvent::EKind_ValueID) DEFINE_UPDATE_COMBO_BOX(u8) + DEFINE_UPDATE_COMBO_BOX_ID(s32) + void endComboBox() { endSelectorSub(); } void genComboBoxItem(const char* label, s32 itemNo) { diff --git a/include/d/d_jnt_col.h b/include/d/d_jnt_col.h index f8107f94402..763b41db529 100644 --- a/include/d/d_jnt_col.h +++ b/include/d/d_jnt_col.h @@ -25,6 +25,7 @@ public: int getArrowOffsetPosAndAngle(cXyz const*, csXyz const*, cXyz*, cXyz*) const; int getHitmarkPosAndAngle(cXyz const*, csXyz const*, cXyz*, csXyz*, int) const; void setArrowPosAndAngle(cXyz const*, cXyz const*, int, cXyz*, csXyz*); + void debugDraw(); BOOL checkPassNum(int bit) { return field_0xc & (1 << bit); } void onPassNum(int num) { field_0xc |= (1 << num); } @@ -40,4 +41,26 @@ public: /* 0x0C */ int field_0xc; }; +extern dJntColData_c l_debugColData[]; + +class dJntCol_HIO_c : public JORReflexible { +public: + dJntCol_HIO_c() { + field_0x5 = 0; + field_0xc = l_debugColData; + } + virtual ~dJntCol_HIO_c() {} + virtual void listenPropertyEvent(const JORPropertyEvent*); + virtual void genMessage(JORMContext*); + + void update(); + void fileOut(); + + /* 0x04 */ s8 field_0x4; + /* 0x05 */ u8 field_0x5; + /* 0x06 */ u8 field_0x6[0xC - 0x6]; + /* 0x0C */ dJntColData_c* field_0xc; + +}; + #endif /* D_D_JNT_COL_H */ diff --git a/include/m_Do/m_Do_mtx.h b/include/m_Do/m_Do_mtx.h index aa8e3c7ecad..e25f8b620ee 100644 --- a/include/m_Do/m_Do_mtx.h +++ b/include/m_Do/m_Do_mtx.h @@ -39,10 +39,6 @@ inline void cMtx_concat(const Mtx a, const Mtx b, Mtx ab) { mDoMtx_concat(a, b, ab); } -inline void cMtx_scale(Mtx m, f32 x, f32 y, f32 z) { - MTXScale(m, x, y, z); -} - inline void mDoMtx_multVec(CMtxP m, const Vec* src, Vec* dst) { PSMTXMultVec(m, src, dst); } @@ -145,6 +141,10 @@ inline void mDoMtx_scale(Mtx m, f32 x, f32 y, f32 z) { MTXScale(m, x, y, z); } +inline void cMtx_scale(Mtx m, f32 x, f32 y, f32 z) { + mDoMtx_scale(m, x, y, z); +} + inline void mDoMtx_quat(Mtx m, const Quaternion* q) { MTXQuat(m, q); } diff --git a/src/d/d_jnt_col.cpp b/src/d/d_jnt_col.cpp index 7462c250fb9..c50b551992a 100644 --- a/src/d/d_jnt_col.cpp +++ b/src/d/d_jnt_col.cpp @@ -5,17 +5,286 @@ #include "d/dolzel.h" // IWYU pragma: keep #include "d/d_jnt_col.h" +#include "JSystem/JHostIO/JORFile.h" +#include "JSystem/JHostIO/JORServer.h" #include "SSystem/SComponent/c_math.h" #include "SSystem/SComponent/c_m3d_g_sph.h" #include "SSystem/SComponent/c_m3d_g_cyl.h" +#include "d/d_debug_viewer.h" #include "f_op/f_op_actor_mng.h" +#if DEBUG +dJntCol_HIO_c l_HIO; + +Vec l_debugTmpPos[] = { + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 50.0f, 0.0f}, +}; + +dJntColData_c l_debugColData[32] = { + {1, 0, 0, 50.0f, &l_debugTmpPos[0]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[2]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[4]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[6]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[8]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[10]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[12]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[14]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[16]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[18]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[20]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[22]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[24]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[26]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[28]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[30]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[32]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[34]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[36]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[38]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[40]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[42]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[44]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[46]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[48]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[50]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[52]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[54]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[56]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[58]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[60]}, + {1, 0, -1, 50.0f, &l_debugTmpPos[62]}, +}; + +void dJntCol_HIO_c::genMessage(JORMContext* mctx) { + mctx->genButton("ファイルに保存", 0x4000001); + mctx->genCheckBox("デバッグ表示", &field_0x5, 1); + mctx->genSliderID("テーブル番号", 0x4000002, 0, 0, 0x1f); + mctx->startComboBoxID("形", 0x4000003, field_0xc->field_0x0, 0, NULL, 0xffff, 0xffff, 0x100, 0x1a); + mctx->genComboBoxItem("球", 0); + mctx->genComboBoxItem("円柱", 1); + mctx->genComboBoxItem("円盤", 2); + mctx->endComboBox(); + mctx->startComboBoxID("矢属性", 0x4000004, field_0xc->mType, 0, NULL, 0xffff, 0xffff, 0x100, 0x1a); + mctx->genComboBoxItem("消える", 0); + mctx->genComboBoxItem("刺さる", 1); + mctx->genComboBoxItem("貫通", 2); + mctx->genComboBoxItem("跳ね返し", 3); + mctx->endComboBox(); + mctx->genSliderID("ジョイント番号", 0x4000005, field_0xc->mJntNum, -1, 200); + mctx->genSliderID("中心X", 0x4000006, field_0xc->field_0x8->x, -10000.0f, 10000.0f); + mctx->genSliderID("中心Y", 0x4000007, field_0xc->field_0x8->y, -10000.0f, 10000.0f); + mctx->genSliderID("中心Z", 0x4000008, field_0xc->field_0x8->z, -10000.0f, 10000.0f); + mctx->genSliderID("次点X", 0x4000009, field_0xc->field_0x8[1].x, -10000.0f, 10000.0f); + mctx->genSliderID("次点Y", 0x400000a, field_0xc->field_0x8[1].y, -10000.0f, 10000.0f); + mctx->genSliderID("次点Z", 0x400000b, field_0xc->field_0x8[1].z, -10000.0f, 10000.0f); + mctx->genSliderID("半径", 0x400000c, field_0xc->field_0x4, 0.009999999776482582f, 1000.0f); +} + +void dJntCol_HIO_c::listenPropertyEvent(const JORPropertyEvent* property) { + JORReflexible::listenPropertyEvent(property); + const JORPropertyEvent* r29 = property; + const f32* r30 = (f32*)&property->field_0x18; + switch (u32(r29->id)) { + case 0x4000003: + field_0xc->field_0x0 = property->field_0x18.U32; + break; + case 0x4000004: + field_0xc->mType = property->field_0x18.U32; + break; + case 0x4000005: + field_0xc->mJntNum = property->field_0x18.U32; + break; + case 0x4000006: + field_0xc->field_0x8[0].x = *r30; + break; + case 0x4000007: + field_0xc->field_0x8[0].y = *r30; + break; + case 0x4000008: + field_0xc->field_0x8[0].z = *r30; + break; + case 0x4000009: + field_0xc->field_0x8[1].x = *r30; + break; + case 0x400000A: + field_0xc->field_0x8[1].y = *r30; + break; + case 0x400000B: + field_0xc->field_0x8[1].z = *r30; + break; + case 0x400000C: + field_0xc->field_0x4 = *r30; + break; + case 0x4000002: + field_0xc = &l_debugColData[property->field_0x18.U32]; + update(); + break; + case 0x4000001: + fileOut(); + break; + } +} + +void dJntCol_HIO_c::update() { + JORMContext* mctx = attachJORMContext(8); + mctx->startUpdateNode(this); + mctx->updateComboBoxID(2, 0x4000003, field_0xc->field_0x0, 0); + mctx->updateComboBoxID(2, 0x4000004, field_0xc->mType, 0); + mctx->updateSliderID(2, 0x4000005, field_0xc->mJntNum, 0, 0, 0); + mctx->updateSliderID(2, 0x4000006, field_0xc->field_0x8[0].x, 0.0, 0.0, 0); + mctx->updateSliderID(2, 0x4000007, field_0xc->field_0x8[0].y, 0.0, 0.0, 0); + mctx->updateSliderID(2, 0x4000008, field_0xc->field_0x8[0].z, 0.0, 0.0, 0); + mctx->updateSliderID(2, 0x4000009, field_0xc->field_0x8[1].x, 0.0, 0.0, 0); + mctx->updateSliderID(2, 0x400000a, field_0xc->field_0x8[1].y, 0.0, 0.0, 0); + mctx->updateSliderID(2, 0x400000b, field_0xc->field_0x8[1].z, 0.0, 0.0, 0); + mctx->updateSliderID(2, 0x400000c, field_0xc->field_0x4, 0.0, 0.0, 0); + mctx->endUpdateNode(); + releaseJORMContext(mctx); +} + +void dJntCol_HIO_c::fileOut() { + char* buffer = new(0x20) char[0x10000]; + if (!buffer) { + OSReport("書き込み用領域確保できませんでした\n"); + return; + } + buffer[0] = 0; + JORFile file; + int i; + if (file.open(JORFile::EFlags_WRITE | JORFile::EFlags_UNK_0x4, "すべてのファイル(*.*)\0*.*\0", NULL, NULL, NULL)) { + for (i = 0; i < ARRAY_SIZE(l_debugColData); i++) { + if (l_debugColData[i].mJntNum >= 0) { + if (l_debugColData[i].field_0x0 == 0) { + sprintf(buffer + strlen(buffer), "static Vec l_jntColPos%d = {\n", i); + sprintf(buffer + strlen(buffer), "\t%ff, %ff, %ff,\n};\n", l_debugColData[i].field_0x8->x, l_debugColData[i].field_0x8->y, l_debugColData[i].field_0x8->z); + } else { + sprintf(buffer + strlen(buffer), "static Vec l_jntColPos%d[2] = {\n", i); + sprintf(buffer + strlen(buffer), "\t{%ff, %ff, %ff},\n", l_debugColData[i].field_0x8[0].x, l_debugColData[i].field_0x8[0].y, l_debugColData[i].field_0x8[0].z); + sprintf(buffer + strlen(buffer), "\t{%ff, %ff, %ff},\n};\n", l_debugColData[i].field_0x8[1].x, l_debugColData[i].field_0x8[1].y, l_debugColData[i].field_0x8[1].z); + } + } + } + sprintf(buffer + strlen(buffer), "static dJntColData_c l_jntColData[] = {\n"); + for (i = 0; i < ARRAY_SIZE(l_debugColData); i++) { + if (l_debugColData[i].mJntNum >= 0) { + sprintf(buffer + strlen(buffer), "\t{\n\t\t"); + if (l_debugColData[i].field_0x0 == 0) { + sprintf(buffer + strlen(buffer), "dJntCol_c::SHAPE_SPH_e, "); + } else if (l_debugColData[i].field_0x0 == 1) { + sprintf(buffer + strlen(buffer), "dJntCol_c::SHAPE_CYL_e, "); + } else { + sprintf(buffer + strlen(buffer), "dJntCol_c::SHAPE_CIRCLE_e, "); + } + if (l_debugColData[i].mType == 0) { + sprintf(buffer + strlen(buffer), "dJntCol_c::TYPE_NORMAL_e,\n"); + } else if (l_debugColData[i].mType == 1) { + sprintf(buffer + strlen(buffer), "dJntCol_c::TYPE_STOP_e,\n"); + } else if (l_debugColData[i].mType == 2) { + sprintf(buffer + strlen(buffer), "dJntCol_c::TYPE_THROUGH_e,\n"); + } else { + sprintf(buffer + strlen(buffer), "dJntCol_c::TYPE_SHIELD_e,\n"); + } + sprintf(buffer + strlen(buffer), "\t\t%d, %ff, ", l_debugColData[i].mJntNum, l_debugColData[i].field_0x4); + if (l_debugColData[i].field_0x0 == 0) { + sprintf(buffer + strlen(buffer), "&l_jntColPos%d\n", i); + } else { + sprintf(buffer + strlen(buffer), "l_jntColPos%d\n", i); + } + sprintf(buffer + strlen(buffer), "\t},\n"); + } + } + sprintf(buffer + strlen(buffer), "};\n"); + file.writeData(buffer, strlen(buffer)); + if (strlen(buffer) > 0x10000) { + OSReport("メモリ破壊が起こりました!!!!!\n"); + } + file.close(); + } else { + OSReport("書き込みファイルが開けません\n"); + } + delete[] buffer; +} +#endif + dJntCol_c::dJntCol_c() { mModel = 0; mData = 0; field_0x8 = 0; } +#if DEBUG +void dJntCol_setDebugHIO() { + l_HIO.field_0x4 = mDoHIO_createChild("ジョイントコリジョン", &l_HIO); +} + +void dJntCol_deleteDebugHIO() { + mDoHIO_deleteChild(l_HIO.field_0x4); +} +#endif + int dJntCol_c::init(fopAc_ac_c* i_actorP, dJntColData_c const* i_jntColP, J3DModel* i_modelP, int param_3) { mData = i_jntColP; @@ -283,3 +552,52 @@ void dJntCol_c::setArrowPosAndAngle(cXyz const* param_0, cXyz const* i_srcPos, i i_arrowPosP->y = dst_pos.atan2sX_Z(); mDoMtx_multVec(mModel->getAnmMtx(i_anmMtxIdx), param_0, param_3); } + +#if DEBUG +void dJntCol_c::debugDraw() { + static const GXColor color = {255, 0, 0, 128}; + + if (!l_HIO.field_0x5) { + return; + } + + const dJntColData_c* r30 = mData; + cXyz local_b4; + cXyz local_c0; + cXyz local_cc; + for (int i = 0; i < field_0x8; i++, r30++) { + if (field_0xc & 1 << i) { + continue; + } + if (r30->mJntNum < 0) { + continue; + } + mDoMtx_stack_c::copy(mModel->getAnmMtx(r30->mJntNum)); + mDoMtx_stack_c::multVec(r30->field_0x8, &local_b4); + if (r30->field_0x0 == 0) { + dDbVw_drawSphereXlu(local_b4, r30->field_0x4, color, 1); + continue; + } else if (r30->field_0x0 == 1) { + mDoMtx_stack_c::multVec(&r30->field_0x8[1], &local_c0); + } else { + mDoMtx_stack_c::multVecSR(&r30->field_0x8[1], &local_c0); + local_c0.normalizeZP(); + local_c0 += local_b4; + } + local_cc = local_c0 - local_b4; + Mtx local_48; + Mtx local_78; + Mtx local_a8; + cMtx_trans(local_78, local_b4.x, local_b4.y, local_b4.z); + cM3d_UpMtx(local_cc, local_a8); + cMtx_concat(local_78, local_a8, local_48); + cMtx_scale(local_78, r30->field_0x4, local_cc.abs() * 0.5f, r30->field_0x4); + cMtx_concat(local_48, local_78, local_48); + cMtx_trans(local_78, 0.0f, 1.0f, 0.0f); + cMtx_concat(local_48, local_78, local_48); + cMtx_XrotS(local_78, 0x4000); + cMtx_concat(local_48, local_78, local_48); + dDbVw_drawCylinderMXlu(local_48, color, 1); + } +} +#endif