From da953600ce7e176610d48486889475f5bff35e2e Mon Sep 17 00:00:00 2001 From: swekka Date: Sat, 6 Dec 2025 21:15:36 +0100 Subject: [PATCH 1/5] d_a_obj_paint almost OK --- .../SOUE01/rels/d_a_obj_paintNP/symbols.txt | 56 ++++---- include/d/a/obj/d_a_obj_paint.h | 30 ++++- src/REL/d/a/obj/d_a_obj_paint.cpp | 127 +++++++++++++++++- 3 files changed, 183 insertions(+), 30 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_paintNP/symbols.txt b/config/SOUE01/rels/d_a_obj_paintNP/symbols.txt index 44476abe..713e3efe 100644 --- a/config/SOUE01/rels/d_a_obj_paintNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_paintNP/symbols.txt @@ -4,24 +4,24 @@ _unresolved = .text:0x00000060; // type:function size:0x4 scope:global __register_global_object = .text:0x00000070; // type:function size:0x1C scope:global __destroy_global_chain = .text:0x00000090; // type:function size:0x54 scope:global dAcOpaint_c_classInit__Fv = .text:0x000000F0; // type:function size:0xD8 -fn_613_1D0 = .text:0x000001D0; // type:function size:0x58 +__dt__15dShadowCircle_cFv = .text:0x000001D0; // type:function size:0x58 __dt__24sFState_c<11dAcOpaint_c>Fv = .text:0x00000230; // type:function size:0x58 __dt__27sFStateFct_c<11dAcOpaint_c>Fv = .text:0x00000290; // type:function size:0x6C __dt__80sStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000300; // type:function size:0xA0 __dt__50sFStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c>Fv = .text:0x000003A0; // type:function size:0xA4 -AcOpaint__initModels = .text:0x00000450; // type:function size:0xE0 -AcOpaint__init = .text:0x00000530; // type:function size:0xBC +createHeap__11dAcOpaint_cFv = .text:0x00000450; // type:function size:0xE0 +create__11dAcOpaint_cFv = .text:0x00000530; // type:function size:0xBC changeState__80sStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x000005F0; // type:function size:0x10 -fn_613_600 = .text:0x00000600; // type:function size:0x8 -AcOpaint__update = .text:0x00000610; // type:function size:0x50 +doDelete__11dAcOpaint_cFv = .text:0x00000600; // type:function size:0x8 +actorExecute__11dAcOpaint_cFv = .text:0x00000610; // type:function size:0x50 executeState__80sStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000660; // type:function size:0x10 -AcOpaint__draw = .text:0x00000670; // type:function size:0xB0 +draw__11dAcOpaint_cFv = .text:0x00000670; // type:function size:0xB0 initializeState_Wait__11dAcOpaint_cFv = .text:0x00000720; // type:function size:0x4 executeState_Wait__11dAcOpaint_cFv = .text:0x00000730; // type:function size:0x234 finalizeState_Wait__11dAcOpaint_cFv = .text:0x00000970; // type:function size:0x4 -AcOpaint__updateMatrix = .text:0x00000980; // type:function size:0xC4 -AcOpaint__getOarcName = .text:0x00000A50; // type:function size:0xC -AcOpaint__getModelName = .text:0x00000A60; // type:function size:0x38 +updateMatrix__11dAcOpaint_cFv = .text:0x00000980; // type:function size:0xC4 +getOarcName__11dAcOpaint_cFv = .text:0x00000A50; // type:function size:0xC +getModelName__11dAcOpaint_cFv = .text:0x00000A60; // type:function size:0x38 __dt__11dAcOpaint_cFv = .text:0x00000AA0; // type:function size:0xE8 getStateID__80sStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000B90; // type:function size:0x10 build__27sFStateFct_c<11dAcOpaint_c>FRC12sStateIDIf_c = .text:0x00000BA0; // type:function size:0x60 @@ -44,24 +44,24 @@ isSameName__26sFStateID_c<11dAcOpaint_c>CFPCc = .text:0x00000EE0; // type:functi _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global __destroy_global_chain_reference = .dtors:0x00000000; // type:object size:0x4 scope:global -lbl_613_rodata_0 = .rodata:0x00000000; // type:object size:0x4 data:float -lbl_613_rodata_4 = .rodata:0x00000004; // type:object size:0x2C align:4 data:float +lbl_613_rodata_0 = .rodata:0x00000000; // type:object size:0x4 scope:local data:float +lbl_613_rodata_4 = .rodata:0x00000004; // type:object size:0x2C scope:local align:4 data:float g_profile_OBJ_PAINT = .data:0x00000000; // type:object size:0x10 data:4byte -lbl_613_data_10 = .data:0x00000010; // type:object size:0x19 data:string -lbl_613_data_2C = .data:0x0000002C; // type:object size:0x6 data:string -lbl_613_data_34 = .data:0x00000034; // type:object size:0x7 data:string -lbl_613_data_3C = .data:0x0000003C; // type:object size:0x7 data:string -AcOpaint__vtable = .data:0x00000048; // type:object size:0x80 -lbl_613_data_C8 = .data:0x000000C8; // type:object size:0x30 -lbl_613_data_F8 = .data:0x000000F8; // type:object size:0x30 -lbl_613_data_128 = .data:0x00000128; // type:object size:0x18 -lbl_613_data_140 = .data:0x00000140; // type:object size:0x18 -lbl_613_data_158 = .data:0x00000158; // type:object size:0x4C -lbl_613_data_1A4 = .data:0x000001A4; // type:object size:0x34 +lbl_613_data_10 = .data:0x00000010; // type:object size:0x19 scope:local data:string +lbl_613_data_2C = .data:0x0000002C; // type:object size:0x6 scope:local data:string +lbl_613_data_34 = .data:0x00000034; // type:object size:0x7 scope:local data:string +lbl_613_data_3C = .data:0x0000003C; // type:object size:0x7 scope:local data:string +__vt__11dAcOpaint_c = .data:0x00000048; // type:object size:0x80 +__vt__50sFStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c> = .data:0x000000C8; // type:object size:0x30 +__vt__80sStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x000000F8; // type:object size:0x30 +lbl_613_data_128 = .data:0x00000128; // type:object size:0x18 scope:local +lbl_613_data_140 = .data:0x00000140; // type:object size:0x18 scope:local +lbl_613_data_158 = .data:0x00000158; // type:object size:0x4C scope:local +__vt__26sFStateID_c<11dAcOpaint_c> = .data:0x000001A4; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -lbl_613_bss_8 = .bss:0x00000008; // type:object size:0x10 data:2byte -AcOpaint__StateID_Wait = .bss:0x00000018; // type:object size:0x30 data:4byte -lbl_613_bss_48 = .bss:0x00000048; // type:object size:0x2 data:2byte -lbl_613_bss_4C = .bss:0x0000004C; // type:object size:0x2 data:2byte -lbl_613_bss_4E = .bss:0x0000004E; // type:object size:0x1 data:byte -lbl_613_bss_50 = .bss:0x00000050; // type:object size:0x10 align:4 data:float +lbl_613_bss_8 = .bss:0x00000008; // type:object size:0x10 scope:local data:2byte +AcOpaint__StateID_Wait = .bss:0x00000018; // type:object size:0x30 scope:local data:4byte +lbl_613_bss_48 = .bss:0x00000048; // type:object size:0x2 scope:local data:2byte +lbl_613_bss_4C = .bss:0x0000004C; // type:object size:0x2 scope:local data:2byte +lbl_613_bss_4E = .bss:0x0000004E; // type:object size:0x1 scope:local data:byte +lbl_613_bss_50 = .bss:0x00000050; // type:object size:0x10 scope:local align:4 data:float diff --git a/include/d/a/obj/d_a_obj_paint.h b/include/d/a/obj/d_a_obj_paint.h index 8041faf2..815b2919 100644 --- a/include/d/a/obj/d_a_obj_paint.h +++ b/include/d/a/obj/d_a_obj_paint.h @@ -2,6 +2,11 @@ #define D_A_OBJ_PAINT_H #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_w.h" +#include "d/d_shadow.h" +#include "m/m3d/m_smdl.h" +#include "m/m_angle.h" +#include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" #include "s/s_StateMgr.hpp" @@ -10,10 +15,33 @@ public: dAcOpaint_c() : mStateMgr(*this, sStateID::null) {} virtual ~dAcOpaint_c() {} + virtual bool createHeap() override; + virtual int create() override; + virtual int doDelete() override; + virtual int actorExecute() override; + virtual int draw() override; + STATE_FUNC_DECLARE(dAcOpaint_c, Wait); private: - /* 0x??? */ STATE_MGR_DECLARE(dAcOpaint_c); + void updateMatrix(); + const char *getOarcName(); + const char *getModelName(); + + /* 0x330 */ nw4r::g3d::ResFile mResFile; + /* 0x334 */ m3d::smdl_c mMdl; + /* 0x350 */ dShadowCircle_c mShadow; + /* 0x358 */ dBgW mBgW; + /* 0x568 */ STATE_MGR_DECLARE(dAcOpaint_c); + /* 0x5A4 */ mAng mRotationZRelated; + /* 0x5A6 */ mAng mRotationZOffset; + /* 0x5A8 */ s8 field_0x5A8; + /* 0x5A9 */ u8 mSubtype; + /* 0x5AA */ bool field_0x5AA; + + static mAng rotationZRelated0; + static mAng rotationZRelated1; + static const f32 lbl_613_rodata_2C; }; #endif diff --git a/src/REL/d/a/obj/d_a_obj_paint.cpp b/src/REL/d/a/obj/d_a_obj_paint.cpp index 9b74a0db..6481d2dc 100644 --- a/src/REL/d/a/obj/d_a_obj_paint.cpp +++ b/src/REL/d/a/obj/d_a_obj_paint.cpp @@ -1,9 +1,134 @@ #include "d/a/obj/d_a_obj_paint.h" +#include "d/a/d_a_player.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_s.h" +#include "d/snd/d_snd_wzsound.h" +#include "f/f_base.h" +#include "m/m_mtx.h" +#include "m/m_quat.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/g3d/res/g3d_resmdl.h" +#include "rvl/MTX/mtx.h" +#include "toBeSorted/arc_managers/oarc_manager.h" + SPECIAL_ACTOR_PROFILE(OBJ_PAINT, dAcOpaint_c, fProfile::OBJ_PAINT, 0x163, 0, 0); STATE_DEFINE(dAcOpaint_c, Wait); +bool dAcOpaint_c::createHeap() { + const char *oarcName = getOarcName(); + const char *modelName = getModelName(); + void *data = getOarcResFile(oarcName); + mResFile = nw4r::g3d::ResFile(data); + nw4r::g3d::ResMdl mdl = mResFile.GetResMdl(modelName); + TRY_CREATE(mMdl.create(mdl, &mAllocator, 0x120, 1, nullptr)); + + void *dzb = OarcManager::GetInstance()->getDzbFromArc(oarcName, modelName); + void *plc = OarcManager::GetInstance()->getPlcFromArc(oarcName, modelName); + TRY_CREATE(!mBgW.Set((cBgD_t *)dzb, (PLC *)plc, 1, &mWorldMtx, &mScale)); + return SUCCEEDED; +} + +int dAcOpaint_c::create() { + if (getFromParams(0, 3) == 0) { + mSubtype = 0; + } else { + mSubtype = 1; + } + dAcObjBase_c::updateMatrix(); + CREATE_ALLOCATOR(dAcOpaint_c); + mMdl.setLocalMtx(mWorldMtx); + dBgS::GetInstance()->Regist(&mBgW, this); + field_0x5AA = false; + mStateMgr.changeState(StateID_Wait); + return SUCCEEDED; +} + +int dAcOpaint_c::doDelete() { + return SUCCEEDED; +} + +int dAcOpaint_c::actorExecute() { + mStateMgr.executeState(); + updateMatrix(); + mBgW.Move(); + return SUCCEEDED; +} + +int dAcOpaint_c::draw() { + drawModelType1(&mMdl); + static mQuat_c rot(0.0f, 0.0f, 0.0f, 100.0f); + fn_8002edb0(mShadow, mMdl, &rot, -1, -1, 0.0f); + return SUCCEEDED; +} + void dAcOpaint_c::initializeState_Wait() {} -void dAcOpaint_c::executeState_Wait() {} + +void dAcOpaint_c::executeState_Wait() { + s32 _a = 0; + if (dAcPy_c::GetLink() != nullptr && dAcPy_c::GetLink()->checkFlags0x350(0x2000)) { + mVec3_c deltaPosition = dAcPy_c::GetLink()->mPosition - mPosition; + f32 distance = deltaPosition.absXZ(); + if (1000.f - distance > 0.f) { + if (distance < _a + 700.f && !field_0x5AA) { + if (mSubtype == 0) { + mRotationZRelated = rotationZRelated0; + } else { + mRotationZRelated = rotationZRelated1; + } + } + field_0x5AA = true; + startSound(SE_Paint_LOOSE); + } + field_0x5A8 = 3; + mPosition.y += 10.f; + + if (field_0x5AA) { + mRotationZOffset = mAng(0x100); + } + } + + mRotationZOffset -= mAng((mRotation.z - mRotationZRelated) * (0.03f + (0.01f * _a))); + mRotationZOffset *= 0.89f + (0.01f * _a); + + mRotation.z = mRotation.z + mRotationZOffset; + + if (field_0x5A8 > 0) { + field_0x5A8--; + } else if (field_0x5A8 != -1) { + field_0x5A8 = 0xFF; + mPosition.y -= 10.f; + } +} + void dAcOpaint_c::finalizeState_Wait() {} + +void dAcOpaint_c::updateMatrix() { + PSMTXTrans(mWorldMtx, mPosition.x, mPosition.y, mPosition.z); + mWorldMtx.XrotM(mRotation.x); + mWorldMtx.YrotM(mRotation.y); + mMtx_c mtx; + PSMTXTrans(mtx, 100.0f, 100.0f, 0.0f); + PSMTXConcat(mWorldMtx, mtx, mWorldMtx); + mWorldMtx.ZrotM(mRotation.z); + mMtx_c mtx2; + PSMTXTrans(mtx2, -100.0f, -100.0f, 0.0f); + PSMTXConcat(mWorldMtx, mtx2, mWorldMtx); + mMdl.setLocalMtx(mWorldMtx); +} + +const float dAcOpaint_c::lbl_613_rodata_2C = 1000.f; + +const char *dAcOpaint_c::getOarcName() { + return "Paint"; +} + +const char *dAcOpaint_c::getModelName() { + switch (mSubtype) { + case 0: return "PaintA"; + case 1: return "PaintB"; + default: return nullptr; + } +} From 5d6136c3644413a5c8bea63d37ece528c03b9708 Mon Sep 17 00:00:00 2001 From: swekka Date: Sat, 6 Dec 2025 21:20:44 +0100 Subject: [PATCH 2/5] fix executeState_Wait --- src/REL/d/a/obj/d_a_obj_paint.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/REL/d/a/obj/d_a_obj_paint.cpp b/src/REL/d/a/obj/d_a_obj_paint.cpp index 6481d2dc..1a922305 100644 --- a/src/REL/d/a/obj/d_a_obj_paint.cpp +++ b/src/REL/d/a/obj/d_a_obj_paint.cpp @@ -78,15 +78,15 @@ void dAcOpaint_c::executeState_Wait() { } else { mRotationZRelated = rotationZRelated1; } + field_0x5AA = true; + startSound(SE_Paint_LOOSE); } - field_0x5AA = true; - startSound(SE_Paint_LOOSE); - } - field_0x5A8 = 3; - mPosition.y += 10.f; + field_0x5A8 = 3; + mPosition.y += 10.f; - if (field_0x5AA) { - mRotationZOffset = mAng(0x100); + if (field_0x5AA) { + mRotationZOffset = mAng(0x100); + } } } From c603e323d3239c17a1df769df5069f3913230bac Mon Sep 17 00:00:00 2001 From: swekka Date: Sat, 6 Dec 2025 21:30:40 +0100 Subject: [PATCH 3/5] d_a_obj_paint OK --- configure.py | 2 +- src/REL/d/a/obj/d_a_obj_paint.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/configure.py b/configure.py index 03e61e06..0d76f5f6 100644 --- a/configure.py +++ b/configure.py @@ -2592,7 +2592,7 @@ config.libs = [ Rel( NonMatching, "d_a_obj_oct_grass_leaf", "REL/d/a/obj/d_a_obj_oct_grass_leaf.cpp" ), - Rel(NonMatching, "d_a_obj_paint", "REL/d/a/obj/d_a_obj_paint.cpp"), + Rel(Matching, "d_a_obj_paint", "REL/d/a/obj/d_a_obj_paint.cpp"), Rel(Matching, "d_a_obj_pinwheel", "REL/d/a/obj/d_a_obj_pinwheel.cpp"), Rel(NonMatching, "d_a_obj_pipe", "REL/d/a/obj/d_a_obj_pipe.cpp"), Rel(NonMatching, "d_a_obj_piston", "REL/d/a/obj/d_a_obj_piston.cpp"), diff --git a/src/REL/d/a/obj/d_a_obj_paint.cpp b/src/REL/d/a/obj/d_a_obj_paint.cpp index 1a922305..370f8993 100644 --- a/src/REL/d/a/obj/d_a_obj_paint.cpp +++ b/src/REL/d/a/obj/d_a_obj_paint.cpp @@ -17,6 +17,9 @@ SPECIAL_ACTOR_PROFILE(OBJ_PAINT, dAcOpaint_c, fProfile::OBJ_PAINT, 0x163, 0, 0); STATE_DEFINE(dAcOpaint_c, Wait); +mAng dAcOpaint_c::rotationZRelated0 = mAng::d2s(35.0025f); +mAng dAcOpaint_c::rotationZRelated1 = mAng::d2s(40.0015f); + bool dAcOpaint_c::createHeap() { const char *oarcName = getOarcName(); const char *modelName = getModelName(); From 81abbf0bc7676e1ab9c370183296dbfabe905979 Mon Sep 17 00:00:00 2001 From: swekka Date: Sat, 6 Dec 2025 22:22:44 +0100 Subject: [PATCH 4/5] review --- include/d/a/obj/d_a_obj_paint.h | 13 +++++--- src/REL/d/a/obj/d_a_obj_paint.cpp | 53 ++++++++++++++++--------------- 2 files changed, 37 insertions(+), 29 deletions(-) diff --git a/include/d/a/obj/d_a_obj_paint.h b/include/d/a/obj/d_a_obj_paint.h index 815b2919..a8b0f643 100644 --- a/include/d/a/obj/d_a_obj_paint.h +++ b/include/d/a/obj/d_a_obj_paint.h @@ -12,6 +12,11 @@ class dAcOpaint_c : public dAcObjBase_c { public: + enum Subtype { + Batreaux = 0, + Groose = 1, + }; + dAcOpaint_c() : mStateMgr(*this, sStateID::null) {} virtual ~dAcOpaint_c() {} @@ -35,12 +40,12 @@ private: /* 0x568 */ STATE_MGR_DECLARE(dAcOpaint_c); /* 0x5A4 */ mAng mRotationZRelated; /* 0x5A6 */ mAng mRotationZOffset; - /* 0x5A8 */ s8 field_0x5A8; + /* 0x5A8 */ s8 mPaintingOffsetTimer; /* 0x5A9 */ u8 mSubtype; - /* 0x5AA */ bool field_0x5AA; + /* 0x5AA */ bool mPaintingSwayed; - static mAng rotationZRelated0; - static mAng rotationZRelated1; + static mAng rotationZRelatedBatreaux; + static mAng rotationZRelatedGroose; static const f32 lbl_613_rodata_2C; }; diff --git a/src/REL/d/a/obj/d_a_obj_paint.cpp b/src/REL/d/a/obj/d_a_obj_paint.cpp index 370f8993..dee3a119 100644 --- a/src/REL/d/a/obj/d_a_obj_paint.cpp +++ b/src/REL/d/a/obj/d_a_obj_paint.cpp @@ -10,15 +10,14 @@ #include "m/m_vec.h" #include "nw4r/g3d/res/g3d_resfile.h" #include "nw4r/g3d/res/g3d_resmdl.h" -#include "rvl/MTX/mtx.h" #include "toBeSorted/arc_managers/oarc_manager.h" SPECIAL_ACTOR_PROFILE(OBJ_PAINT, dAcOpaint_c, fProfile::OBJ_PAINT, 0x163, 0, 0); STATE_DEFINE(dAcOpaint_c, Wait); -mAng dAcOpaint_c::rotationZRelated0 = mAng::d2s(35.0025f); -mAng dAcOpaint_c::rotationZRelated1 = mAng::d2s(40.0015f); +mAng dAcOpaint_c::rotationZRelatedBatreaux = mAng::d2s(35.0025f); +mAng dAcOpaint_c::rotationZRelatedGroose = mAng::d2s(40.0015f); bool dAcOpaint_c::createHeap() { const char *oarcName = getOarcName(); @@ -36,15 +35,15 @@ bool dAcOpaint_c::createHeap() { int dAcOpaint_c::create() { if (getFromParams(0, 3) == 0) { - mSubtype = 0; + mSubtype = Batreaux; } else { - mSubtype = 1; + mSubtype = Groose; } dAcObjBase_c::updateMatrix(); CREATE_ALLOCATOR(dAcOpaint_c); mMdl.setLocalMtx(mWorldMtx); dBgS::GetInstance()->Regist(&mBgW, this); - field_0x5AA = false; + mPaintingSwayed = false; mStateMgr.changeState(StateID_Wait); return SUCCEEDED; } @@ -75,19 +74,19 @@ void dAcOpaint_c::executeState_Wait() { mVec3_c deltaPosition = dAcPy_c::GetLink()->mPosition - mPosition; f32 distance = deltaPosition.absXZ(); if (1000.f - distance > 0.f) { - if (distance < _a + 700.f && !field_0x5AA) { - if (mSubtype == 0) { - mRotationZRelated = rotationZRelated0; + if (distance < _a + 700.f && !mPaintingSwayed) { + if (mSubtype == Batreaux) { + mRotationZRelated = rotationZRelatedBatreaux; } else { - mRotationZRelated = rotationZRelated1; + mRotationZRelated = rotationZRelatedGroose; } - field_0x5AA = true; + mPaintingSwayed = true; startSound(SE_Paint_LOOSE); } - field_0x5A8 = 3; + mPaintingOffsetTimer = 3; mPosition.y += 10.f; - if (field_0x5AA) { + if (mPaintingSwayed) { mRotationZOffset = mAng(0x100); } } @@ -98,10 +97,10 @@ void dAcOpaint_c::executeState_Wait() { mRotation.z = mRotation.z + mRotationZOffset; - if (field_0x5A8 > 0) { - field_0x5A8--; - } else if (field_0x5A8 != -1) { - field_0x5A8 = 0xFF; + if (mPaintingOffsetTimer > 0) { + mPaintingOffsetTimer--; + } else if (mPaintingOffsetTimer != -1) { + mPaintingOffsetTimer = -1; mPosition.y -= 10.f; } } @@ -109,16 +108,20 @@ void dAcOpaint_c::executeState_Wait() { void dAcOpaint_c::finalizeState_Wait() {} void dAcOpaint_c::updateMatrix() { - PSMTXTrans(mWorldMtx, mPosition.x, mPosition.y, mPosition.z); + mWorldMtx.transS(mPosition); mWorldMtx.XrotM(mRotation.x); mWorldMtx.YrotM(mRotation.y); + mMtx_c mtx; - PSMTXTrans(mtx, 100.0f, 100.0f, 0.0f); - PSMTXConcat(mWorldMtx, mtx, mWorldMtx); + mtx.transS(100.0f, 100.0f, 0.0f); + + mWorldMtx += mtx; mWorldMtx.ZrotM(mRotation.z); + mMtx_c mtx2; - PSMTXTrans(mtx2, -100.0f, -100.0f, 0.0f); - PSMTXConcat(mWorldMtx, mtx2, mWorldMtx); + mtx2.transS(-100.0f, -100.0f, 0.0f); + mWorldMtx += mtx2; + mMdl.setLocalMtx(mWorldMtx); } @@ -130,8 +133,8 @@ const char *dAcOpaint_c::getOarcName() { const char *dAcOpaint_c::getModelName() { switch (mSubtype) { - case 0: return "PaintA"; - case 1: return "PaintB"; - default: return nullptr; + case Batreaux: return "PaintA"; + case Groose: return "PaintB"; + default: return nullptr; } } From 25ae37016fc8df57fea940eca3b27d9f56835e5b Mon Sep 17 00:00:00 2001 From: swekka Date: Sat, 6 Dec 2025 22:26:53 +0100 Subject: [PATCH 5/5] name some fields --- include/d/a/obj/d_a_obj_paint.h | 8 ++++---- src/REL/d/a/obj/d_a_obj_paint.cpp | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/include/d/a/obj/d_a_obj_paint.h b/include/d/a/obj/d_a_obj_paint.h index a8b0f643..e614f139 100644 --- a/include/d/a/obj/d_a_obj_paint.h +++ b/include/d/a/obj/d_a_obj_paint.h @@ -38,14 +38,14 @@ private: /* 0x350 */ dShadowCircle_c mShadow; /* 0x358 */ dBgW mBgW; /* 0x568 */ STATE_MGR_DECLARE(dAcOpaint_c); - /* 0x5A4 */ mAng mRotationZRelated; - /* 0x5A6 */ mAng mRotationZOffset; + /* 0x5A4 */ mAng mPaintingTilt; + /* 0x5A6 */ mAng mTilt; /* 0x5A8 */ s8 mPaintingOffsetTimer; /* 0x5A9 */ u8 mSubtype; /* 0x5AA */ bool mPaintingSwayed; - static mAng rotationZRelatedBatreaux; - static mAng rotationZRelatedGroose; + static mAng paintingTiltBatreaux; + static mAng paintingTiltGroose; static const f32 lbl_613_rodata_2C; }; diff --git a/src/REL/d/a/obj/d_a_obj_paint.cpp b/src/REL/d/a/obj/d_a_obj_paint.cpp index dee3a119..883bfdf8 100644 --- a/src/REL/d/a/obj/d_a_obj_paint.cpp +++ b/src/REL/d/a/obj/d_a_obj_paint.cpp @@ -16,8 +16,8 @@ SPECIAL_ACTOR_PROFILE(OBJ_PAINT, dAcOpaint_c, fProfile::OBJ_PAINT, 0x163, 0, 0); STATE_DEFINE(dAcOpaint_c, Wait); -mAng dAcOpaint_c::rotationZRelatedBatreaux = mAng::d2s(35.0025f); -mAng dAcOpaint_c::rotationZRelatedGroose = mAng::d2s(40.0015f); +mAng dAcOpaint_c::paintingTiltBatreaux = mAng::d2s(35.0025f); +mAng dAcOpaint_c::paintingTiltGroose = mAng::d2s(40.0015f); bool dAcOpaint_c::createHeap() { const char *oarcName = getOarcName(); @@ -76,9 +76,9 @@ void dAcOpaint_c::executeState_Wait() { if (1000.f - distance > 0.f) { if (distance < _a + 700.f && !mPaintingSwayed) { if (mSubtype == Batreaux) { - mRotationZRelated = rotationZRelatedBatreaux; + mPaintingTilt = paintingTiltBatreaux; } else { - mRotationZRelated = rotationZRelatedGroose; + mPaintingTilt = paintingTiltGroose; } mPaintingSwayed = true; startSound(SE_Paint_LOOSE); @@ -87,15 +87,15 @@ void dAcOpaint_c::executeState_Wait() { mPosition.y += 10.f; if (mPaintingSwayed) { - mRotationZOffset = mAng(0x100); + mTilt = mAng(0x100); } } } - mRotationZOffset -= mAng((mRotation.z - mRotationZRelated) * (0.03f + (0.01f * _a))); - mRotationZOffset *= 0.89f + (0.01f * _a); + mTilt -= mAng((mRotation.z - mPaintingTilt) * (0.03f + (0.01f * _a))); + mTilt *= 0.89f + (0.01f * _a); - mRotation.z = mRotation.z + mRotationZOffset; + mRotation.z = mRotation.z + mTilt; if (mPaintingOffsetTimer > 0) { mPaintingOffsetTimer--;