diff --git a/config/eur/arm9/overlays/ov000/delinks.txt b/config/eur/arm9/overlays/ov000/delinks.txt index 5d53bcbc..fdd47cf9 100644 --- a/config/eur/arm9/overlays/ov000/delinks.txt +++ b/config/eur/arm9/overlays/ov000/delinks.txt @@ -111,7 +111,7 @@ src/00_Core/Player/LinkStateDamage.cpp: src/00_Core/Player/LinkStateFollow.cpp: .text start:0x020a8f74 end:0x020a92a4 - .data start:0x020e575c end:0x020e58e8 + .data start:0x020e575c end:0x020e57f0 src/00_Core/Player/LinkStateInteract.cpp: .text start:0x020aa32c end:0x020abd78 @@ -153,3 +153,7 @@ src/00_Core/Save/AdventureFlags.cpp: src/00_Core/Game/GameModePlay.cpp: .text start:0x02079d28 end:0x02079ddc + +src/00_Core/Render/ModelRender.cpp: + .text start:0x020a956c end:0x020a99e0 + .data start:0x020e5818 end:0x020e5860 \ No newline at end of file diff --git a/config/eur/arm9/overlays/ov000/relocs.txt b/config/eur/arm9/overlays/ov000/relocs.txt index 29d455ef..971f6546 100644 --- a/config/eur/arm9/overlays/ov000/relocs.txt +++ b/config/eur/arm9/overlays/ov000/relocs.txt @@ -4799,18 +4799,18 @@ from:0x020a92f8 kind:load to:0x020e57f0 module:overlay(0) from:0x020a9524 kind:load to:0x027e0d78 module:dtcm from:0x020a9538 kind:arm_call to:0x0202ea0c module:main from:0x020a9560 kind:arm_call to:0x0202ea0c module:main -from:0x020a9584 kind:load to:0x020e5820 module:overlay(0) -from:0x020a95a0 kind:load to:0x020e5820 module:overlay(0) +from:0x020a9584 kind:load to:0x020e5818 add:8 module:overlay(0) +from:0x020a95a0 kind:load to:0x020e5818 add:8 module:overlay(0) from:0x020a95b2 kind:thumb_call_arm to:0x0202ea18 module:main from:0x020a95b8 kind:thumb_call to:0x020b3ea8 module:overlay(0) -from:0x020a95c0 kind:load to:0x020e5820 module:overlay(0) +from:0x020a95c0 kind:load to:0x020e5818 add:8 module:overlay(0) from:0x020a95d2 kind:thumb_call_arm to:0x0202ea18 module:main from:0x020a95d8 kind:thumb_call to:0x020b3ea8 module:overlay(0) from:0x020a95de kind:thumb_call_arm to:0x0202ea0c module:main -from:0x020a95e8 kind:load to:0x020e5820 module:overlay(0) +from:0x020a95e8 kind:load to:0x020e5818 add:8 module:overlay(0) from:0x020a95fa kind:thumb_call_arm to:0x0202ea18 module:main from:0x020a9600 kind:thumb_call to:0x020b3ea8 module:overlay(0) -from:0x020a9608 kind:load to:0x020e5820 module:overlay(0) +from:0x020a9608 kind:load to:0x020e5818 add:8 module:overlay(0) from:0x020a9620 kind:load to:0x020189dc module:main from:0x020a9664 kind:arm_call to:0x020183b4 module:main from:0x020a9670 kind:arm_call to:0x020079d8 module:main diff --git a/config/eur/arm9/overlays/ov000/symbols.txt b/config/eur/arm9/overlays/ov000/symbols.txt index 95d61cf2..4ed2a2d1 100644 --- a/config/eur/arm9/overlays/ov000/symbols.txt +++ b/config/eur/arm9/overlays/ov000/symbols.txt @@ -1992,26 +1992,26 @@ _ZN11ModelRenderD1Ev kind:function(thumb,size=0x20) addr:0x020a95a4 _ZN11ModelRenderD0Ev kind:function(thumb,size=0x28) addr:0x020a95c4 _ZN11ModelRenderD2Ev kind:function(thumb,size=0x20) addr:0x020a95ec _ZN11ModelRender14GetLcdcAddressEv kind:function(arm,size=0x8) addr:0x020a960c -_ZN11ModelRender8vfunc_0cEP9ItemModel kind:function(arm,size=0x10) addr:0x020a9614 -_ZN11ModelRender19func_ov000_020a9624Ei kind:function(arm,size=0x2c) addr:0x020a9624 +_ZN11ModelRender28Init_ModelRender_UnkStruct_4EP9ItemModel kind:function(arm,size=0x10) addr:0x020a9614 +_ZN11ModelRender16UnkGetBoneMatrixEi kind:function(arm,size=0x2c) addr:0x020a9624 _ZN11ModelRender12SetTransformEP5Vec3pP5Mat3pS1_ kind:function(arm,size=0x84) addr:0x020a9650 _ZN11ModelRender22SetRotationTranslationEP5Mat3pP5Vec3p kind:function(arm,size=0x6c) addr:0x020a96d4 _ZN11ModelRender14SetTranslationEP5Vec3p kind:function(arm,size=0x24) addr:0x020a9740 _ZN11ModelRender20PushGeometryCommandsEv kind:function(arm,size=0x6c) addr:0x020a9764 -_ZN11ModelRender8vfunc_20Ev kind:function(arm,size=0x10) addr:0x020a97d0 +_ZN11ModelRender18ExecRenderCommandsEv kind:function(arm,size=0x10) addr:0x020a97d0 _ZN11ModelRender8vfunc_24EP24UnkStruct_ov000_020c0c08 kind:function(arm,size=0x18) addr:0x020a97e0 _ZN11ModelRender8vfunc_28Ev kind:function(arm,size=0x6c) addr:0x020a97f8 _ZN11ModelRender8vfunc_2cEv kind:function(arm,size=0x2c) addr:0x020a9864 _ZN11ModelRender8vfunc_34Ev kind:function(arm,size=0x2c) addr:0x020a9890 _ZN11ModelRender8vfunc_30Ev kind:function(arm,size=0x2c) addr:0x020a98bc -_ZN11ModelRender19func_ov000_020a98e8Ei kind:function(arm,size=0x24) addr:0x020a98e8 -_ZN11ModelRender19func_ov000_020a990cEi kind:function(arm,size=0x2c) addr:0x020a990c -_ZN11ModelRender19func_ov000_020a9938Ei kind:function(thumb,size=0x28) addr:0x020a9938 -_ZN11ModelRender19func_ov000_020a9960EPv kind:function(arm,size=0x8) addr:0x020a9960 +_ZN11ModelRender14GetObjectIndexEPc kind:function(arm,size=0x24) addr:0x020a98e8 +_ZN11ModelRender16GetMaterialIndexEPc kind:function(arm,size=0x2c) addr:0x020a990c +_ZN11ModelRender20InitBoneMatrixArraysEj kind:function(thumb,size=0x28) addr:0x020a9938 +_ZN11ModelRender22SetUnkBoneMatrixArray1EP31ModelRender_UnkBoneMatrixStruct kind:function(arm,size=0x8) addr:0x020a9960 _ZN11ModelRender8vfunc_38Ev kind:function(arm,size=0x2c) addr:0x020a9968 -_ZN11ModelRender8vfunc_3cEv kind:function(arm,size=0x4) addr:0x020a9994 -_ZN11ModelRender19func_ov000_020a9998Eii kind:function(arm,size=0x28) addr:0x020a9998 -_ZN11ModelRender19func_ov000_020a99c0Ev kind:function(arm,size=0x20) addr:0x020a99c0 +_ZN11ModelRender8vfunc_3cEP23ModelRenderCommandsData kind:function(arm,size=0x4) addr:0x020a9994 +_ZN11ModelRender22UnkInit_Struct4_ParamsEhh kind:function(arm,size=0x28) addr:0x020a9998 +_Z19func_ov000_020a99c0P23ModelRenderCommandsData kind:function(arm,size=0x20) addr:0x020a99c0 func_ov000_020a99e0 kind:function(thumb,size=0x40) addr:0x020a99e0 func_ov000_020a9a20 kind:function(thumb,size=0x20) addr:0x020a9a20 func_ov000_020a9a40 kind:function(thumb,size=0x28) addr:0x020a9a40 @@ -4797,7 +4797,8 @@ data_ov000_020e5778 kind:data(any) addr:0x020e5778 _ZTV15LinkStateFollow kind:data(any) addr:0x020e57a4 data_ov000_020e57f0 kind:data(any) addr:0x020e57f0 data_ov000_020e5808 kind:data(any) addr:0x020e5808 -data_ov000_020e5820 kind:data(any) addr:0x020e5820 +_ZTV11ModelRender kind:data(any) addr:0x020e5818 +data_ov000_020e5868_pad kind:data(any) addr:0x020e5860 data_ov000_020e5868 kind:data(any) addr:0x020e5868 data_ov000_020e5878 kind:data(any) addr:0x020e5878 data_ov000_020e58e8 kind:data(any) addr:0x020e58e8 diff --git a/config/eur/arm9/symbols.txt b/config/eur/arm9/symbols.txt index 5f15907d..b5cfcfa7 100644 --- a/config/eur/arm9/symbols.txt +++ b/config/eur/arm9/symbols.txt @@ -802,7 +802,7 @@ func_02018ae8 kind:function(arm,size=0x68) addr:0x02018ae8 func_02018b50 kind:function(arm,size=0x78) addr:0x02018b50 func_02018bc8 kind:function(arm,size=0x74) addr:0x02018bc8 func_02018c3c kind:function(arm,size=0x54) addr:0x02018c3c -func_02018c90 kind:function(arm,size=0x14) addr:0x02018c90 +UnkInit_ModelRender_Struct4_Params kind:function(arm,size=0x14) addr:0x02018c90 func_02018ca4 kind:function(arm,size=0x14) addr:0x02018ca4 func_02018cb8 kind:function(arm,size=0x8) addr:0x02018cb8 func_02018cc0 kind:function(arm,size=0xc) addr:0x02018cc0 @@ -847,7 +847,7 @@ func_0201987c kind:function(arm,size=0x40) addr:0x0201987c func_020198bc kind:function(arm,size=0x48) addr:0x020198bc func_02019904 kind:function(arm,size=0x17c) addr:0x02019904 func_02019a80 kind:function(arm,size=0x68) addr:0x02019a80 -func_02019ae8 kind:function(arm,size=0xdc) addr:0x02019ae8 +ExecModelRenderCommands kind:function(arm,size=0xdc) addr:0x02019ae8 func_02019bc4 kind:function(arm,size=0x28) addr:0x02019bc4 func_02019bec kind:function(arm,size=0x28) addr:0x02019bec func_02019c14 kind:function(arm,size=0x308) addr:0x02019c14 diff --git a/config/usa/arm9/overlays/ov000/delinks.txt b/config/usa/arm9/overlays/ov000/delinks.txt index c80d50a1..cae2e579 100644 --- a/config/usa/arm9/overlays/ov000/delinks.txt +++ b/config/usa/arm9/overlays/ov000/delinks.txt @@ -111,7 +111,7 @@ src/00_Core/Player/LinkStateDamage.cpp: src/00_Core/Player/LinkStateFollow.cpp: .text start:0x020a8f14 end:0x020a9244 - .data start:0x020e56fc end:0x020e5888 + .data start:0x020e56fc end:0x020e5790 src/00_Core/Player/LinkStateInteract.cpp: .text start:0x020aa2cc end:0x020abd18 @@ -153,3 +153,7 @@ src/00_Core/Save/AdventureFlags.cpp: src/00_Core/Game/GameModePlay.cpp: .text start:0x02079cc8 end:0x02079d7c + +src/00_Core/Render/ModelRender.cpp: + .text start:0x020a950c end:0x020a9980 + .data start:0x020e57b8 end:0x020e5800 \ No newline at end of file diff --git a/config/usa/arm9/overlays/ov000/relocs.txt b/config/usa/arm9/overlays/ov000/relocs.txt index abe8bf8e..82e14c8d 100644 --- a/config/usa/arm9/overlays/ov000/relocs.txt +++ b/config/usa/arm9/overlays/ov000/relocs.txt @@ -4799,18 +4799,18 @@ from:0x020a9298 kind:load to:0x020e5790 module:overlay(0) from:0x020a94c4 kind:load to:0x027e0d78 module:dtcm from:0x020a94d8 kind:arm_call to:0x0202ea08 module:main from:0x020a9500 kind:arm_call to:0x0202ea08 module:main -from:0x020a9524 kind:load to:0x020e57c0 module:overlay(0) -from:0x020a9540 kind:load to:0x020e57c0 module:overlay(0) +from:0x020a9524 kind:load to:0x020e57b8 add:8 module:overlay(0) +from:0x020a9540 kind:load to:0x020e57b8 add:8 module:overlay(0) from:0x020a9552 kind:thumb_call_arm to:0x0202ea14 module:main from:0x020a9558 kind:thumb_call to:0x020b3e48 module:overlay(0) -from:0x020a9560 kind:load to:0x020e57c0 module:overlay(0) +from:0x020a9560 kind:load to:0x020e57b8 add:8 module:overlay(0) from:0x020a9572 kind:thumb_call_arm to:0x0202ea14 module:main from:0x020a9578 kind:thumb_call to:0x020b3e48 module:overlay(0) from:0x020a957e kind:thumb_call_arm to:0x0202ea08 module:main -from:0x020a9588 kind:load to:0x020e57c0 module:overlay(0) +from:0x020a9588 kind:load to:0x020e57b8 add:8 module:overlay(0) from:0x020a959a kind:thumb_call_arm to:0x0202ea14 module:main from:0x020a95a0 kind:thumb_call to:0x020b3e48 module:overlay(0) -from:0x020a95a8 kind:load to:0x020e57c0 module:overlay(0) +from:0x020a95a8 kind:load to:0x020e57b8 add:8 module:overlay(0) from:0x020a95c0 kind:load to:0x020189dc module:main from:0x020a9604 kind:arm_call to:0x020183b4 module:main from:0x020a9610 kind:arm_call to:0x020079d8 module:main diff --git a/config/usa/arm9/overlays/ov000/symbols.txt b/config/usa/arm9/overlays/ov000/symbols.txt index e8604eff..25db19b7 100644 --- a/config/usa/arm9/overlays/ov000/symbols.txt +++ b/config/usa/arm9/overlays/ov000/symbols.txt @@ -1992,26 +1992,26 @@ _ZN11ModelRenderD1Ev kind:function(thumb,size=0x20) addr:0x020a9544 _ZN11ModelRenderD0Ev kind:function(thumb,size=0x28) addr:0x020a9564 _ZN11ModelRenderD2Ev kind:function(thumb,size=0x20) addr:0x020a958c _ZN11ModelRender14GetLcdcAddressEv kind:function(arm,size=0x8) addr:0x020a95ac -_ZN11ModelRender8vfunc_0cEP9ItemModel kind:function(arm,size=0x10) addr:0x020a95b4 -_ZN11ModelRender19func_ov000_020a9624Ei kind:function(arm,size=0x2c) addr:0x020a95c4 +_ZN11ModelRender28Init_ModelRender_UnkStruct_4EP9ItemModel kind:function(arm,size=0x10) addr:0x020a95b4 +_ZN11ModelRender16UnkGetBoneMatrixEi kind:function(arm,size=0x2c) addr:0x020a95c4 _ZN11ModelRender12SetTransformEP5Vec3pP5Mat3pS1_ kind:function(arm,size=0x84) addr:0x020a95f0 _ZN11ModelRender22SetRotationTranslationEP5Mat3pP5Vec3p kind:function(arm,size=0x6c) addr:0x020a9674 _ZN11ModelRender14SetTranslationEP5Vec3p kind:function(arm,size=0x24) addr:0x020a96e0 _ZN11ModelRender20PushGeometryCommandsEv kind:function(arm,size=0x6c) addr:0x020a9704 -_ZN11ModelRender8vfunc_20Ev kind:function(arm,size=0x10) addr:0x020a9770 +_ZN11ModelRender18ExecRenderCommandsEv kind:function(arm,size=0x10) addr:0x020a9770 _ZN11ModelRender8vfunc_24EP24UnkStruct_ov000_020c0c08 kind:function(arm,size=0x18) addr:0x020a9780 _ZN11ModelRender8vfunc_28Ev kind:function(arm,size=0x6c) addr:0x020a9798 _ZN11ModelRender8vfunc_2cEv kind:function(arm,size=0x2c) addr:0x020a9804 _ZN11ModelRender8vfunc_34Ev kind:function(arm,size=0x2c) addr:0x020a9830 _ZN11ModelRender8vfunc_30Ev kind:function(arm,size=0x2c) addr:0x020a985c -_ZN11ModelRender19func_ov000_020a98e8Ei kind:function(arm,size=0x24) addr:0x020a9888 -_ZN11ModelRender19func_ov000_020a990cEi kind:function(arm,size=0x2c) addr:0x020a98ac -_ZN11ModelRender19func_ov000_020a9938Ei kind:function(thumb,size=0x28) addr:0x020a98d8 -_ZN11ModelRender19func_ov000_020a9960EPv kind:function(arm,size=0x8) addr:0x020a9900 +_ZN11ModelRender14GetObjectIndexEPc kind:function(arm,size=0x24) addr:0x020a9888 +_ZN11ModelRender16GetMaterialIndexEPc kind:function(arm,size=0x2c) addr:0x020a98ac +_ZN11ModelRender20InitBoneMatrixArraysEj kind:function(thumb,size=0x28) addr:0x020a98d8 +_ZN11ModelRender22SetUnkBoneMatrixArray1EP31ModelRender_UnkBoneMatrixStruct kind:function(arm,size=0x8) addr:0x020a9900 _ZN11ModelRender8vfunc_38Ev kind:function(arm,size=0x2c) addr:0x020a9908 -_ZN11ModelRender8vfunc_3cEv kind:function(arm,size=0x4) addr:0x020a9934 -_ZN11ModelRender19func_ov000_020a9998Eii kind:function(arm,size=0x28) addr:0x020a9938 -_ZN11ModelRender19func_ov000_020a99c0Ev kind:function(arm,size=0x20) addr:0x020a9960 +_ZN11ModelRender8vfunc_3cEP23ModelRenderCommandsData kind:function(arm,size=0x4) addr:0x020a9934 +_ZN11ModelRender22UnkInit_Struct4_ParamsEhh kind:function(arm,size=0x28) addr:0x020a9938 +_Z19func_ov000_020a99c0P23ModelRenderCommandsData kind:function(arm,size=0x20) addr:0x020a9960 func_ov000_020a99e0 kind:function(thumb,size=0x40) addr:0x020a9980 func_ov000_020a9a20 kind:function(thumb,size=0x20) addr:0x020a99c0 func_ov000_020a9a40 kind:function(thumb,size=0x28) addr:0x020a99e0 @@ -2289,7 +2289,7 @@ _ZN17LinkStateCutscene8vfunc_38Ev kind:function(arm,size=0x94) addr:0x020b3d84 _ZN24UnkStruct_ov004_0210abb8D1Ev kind:function(arm,size=0x1c) addr:0x020b3e18 _ZN24UnkStruct_ov004_0210abb8D0Ev kind:function(arm,size=0x14) addr:0x020b3e34 func_ov000_020b3ea8 kind:function(thumb,size=0x2) addr:0x020b3e48 -func_ov000_020b3eac kind:function(arm,size=0x18) addr:0x020b3e4c +GetModelUnknownHeader kind:function(arm,size=0x18) addr:0x020b3e4c func_ov000_020b3ec4 kind:function(arm,size=0x24) addr:0x020b3e64 func_ov000_020b3ee8 kind:function(arm,size=0x3c) addr:0x020b3e88 func_ov000_020b3f24 kind:function(arm,size=0x54) addr:0x020b3ec4 @@ -4797,7 +4797,8 @@ data_ov000_020e5778 kind:data(any) addr:0x020e5718 _ZTV15LinkStateFollow kind:data(any) addr:0x020e5744 data_ov000_020e57f0 kind:data(any) addr:0x020e5790 data_ov000_020e5808 kind:data(any) addr:0x020e57a8 -data_ov000_020e5820 kind:data(any) addr:0x020e57c0 +_ZTV11ModelRender kind:data(any) addr:0x020e57b8 +data_ov000_020e5868_pad kind:data(any) addr:0x020e5800 data_ov000_020e5868 kind:data(any) addr:0x020e5808 data_ov000_020e5878 kind:data(any) addr:0x020e5818 data_ov000_020e58e8 kind:data(any) addr:0x020e5888 diff --git a/config/usa/arm9/symbols.txt b/config/usa/arm9/symbols.txt index cece0af2..f5117022 100644 --- a/config/usa/arm9/symbols.txt +++ b/config/usa/arm9/symbols.txt @@ -802,7 +802,7 @@ func_02018ae8 kind:function(arm,size=0x68) addr:0x02018ae8 func_02018b50 kind:function(arm,size=0x78) addr:0x02018b50 func_02018bc8 kind:function(arm,size=0x74) addr:0x02018bc8 func_02018c3c kind:function(arm,size=0x54) addr:0x02018c3c -func_02018c90 kind:function(arm,size=0x14) addr:0x02018c90 +UnkInit_ModelRender_Struct4_Params kind:function(arm,size=0x14) addr:0x02018c90 func_02018ca4 kind:function(arm,size=0x14) addr:0x02018ca4 func_02018cb8 kind:function(arm,size=0x8) addr:0x02018cb8 func_02018cc0 kind:function(arm,size=0xc) addr:0x02018cc0 @@ -847,7 +847,7 @@ func_0201987c kind:function(arm,size=0x40) addr:0x0201987c func_020198bc kind:function(arm,size=0x48) addr:0x020198bc func_02019904 kind:function(arm,size=0x17c) addr:0x02019904 func_02019a80 kind:function(arm,size=0x68) addr:0x02019a80 -func_02019ae8 kind:function(arm,size=0xdc) addr:0x02019ae8 +ExecModelRenderCommands kind:function(arm,size=0xdc) addr:0x02019ae8 func_02019bc4 kind:function(arm,size=0x28) addr:0x02019bc4 func_02019bec kind:function(arm,size=0x28) addr:0x02019bec func_02019c14 kind:function(arm,size=0x308) addr:0x02019c14 diff --git a/include/Actor/Navi/ActorNavi.hpp b/include/Actor/Navi/ActorNavi.hpp index 4dbad5fe..841c91f1 100644 --- a/include/Actor/Navi/ActorNavi.hpp +++ b/include/Actor/Navi/ActorNavi.hpp @@ -45,9 +45,7 @@ public: /* 344 */ q20 mUnk_344; /* 348 */ unk32 mUnk_348; /* 34c */ ActorNaviBase_Unk1 mUnk_34c[4]; - /* 35c */ unk8 mUnk_35c[0x28]; - /* 384 */ Mat3p mUnk_384; - /* 3a8 */ unk8 mUnk_3a8[0xC]; + /* 35c */ ModelRender_UnkBoneMatrixStruct unkBoneMatrixStruct; /* 3b4 */ EquipHammer *mHammer; /* 3b8 */ UnkStruct_02057200 mUnk_3b8; /* 3c0 */ u8 mUnk_3c0; diff --git a/include/Render/ModelRender.hpp b/include/Render/ModelRender.hpp index 8698d5b9..d0fca92a 100644 --- a/include/Render/ModelRender.hpp +++ b/include/Render/ModelRender.hpp @@ -8,46 +8,76 @@ #include "System/SysNew.hpp" #include "Unknown/UnkStruct_ov000_020c0c08.hpp" +class ModelRender; + +struct ModelRender_UnkBoneMatrixStruct { + /* 00 */ unk8 mUnk_00[0x28]; + /* 28 */ Mat3p mUnk_28; + /* 4c */ unk8 mUnk_4c[0xC]; + /* 58 */ +}; + +struct ModelRender_UnkStruct_4 { + /* 00 */ unk32 flags; + /* 04 */ void *mLcdcAddr; + /* 08 */ void *mUnk_08; // this attribute is related to UnkStruct_ov000_020c0c08 + /* 0c */ void *mUnkTransformFunc; + /* 10 */ void *mUnk_10; // also related to UnkStruct_ov000_020c0c08 + /* 14 */ void *mUnkMaterialFunc; + /* 18 */ void *mUnk_18; // also related to UnkStruct_ov000_020c0c08 + /* 1c */ void *mUnkVisibilityFunc; + /* 20 */ void *mUnkFunc_20; + /* 24 */ unk8 mUnk_24; + /* 25 */ unk8 mUnk_25; + /* 26 */ unk8 mUnk_26[2]; + /* 28 */ void *mUnk_28; + /* 2c */ ModelRender *mUnk_2c; // pointer to self? + /* 30 */ unk32 mUnk_30; + /* 34 */ ModelRender_UnkBoneMatrixStruct *unkBoneMatrixArray1; + /* 38 */ unk32 mUnk_38[3]; + /* 44 */ unk32 mUnk_44[2]; + /* 4c */ unk32 mUnk_4c[2]; + /* 54 */ +}; + +struct ModelRenderCommandsData { + /* 00 */ u8 command; + /* 04 */ ModelRender_UnkStruct_4 *unkStruct4; + /* 08 */ +}; + class ItemModel; class ModelRender : public SysObject { public: /* 00 (vtable) */ - /* 04 */ u32 mUnk_04; - /* 08 */ void *mLcdcAddr; - /* 0c */ s32 mUnk_0c; - /* 10 */ unk32 mUnk_10; - /* 14 */ s32 mUnk_14; - /* 18 */ unk32 mUnk_18; - /* 1c */ s32 mUnk_1c; - /* 20 */ unk8 mUnk_20[0x38]; - /* 58 */ void *mUnk_58; + /* 04 */ ModelRender_UnkStruct_4 mUnk_04; + /* 58 */ ModelRender_UnkBoneMatrixStruct *unkBoneMatrixArray2; /* 5c */ /* 00 */ virtual ~ModelRender(); /* 08 */ virtual void *GetLcdcAddress(); - /* 0c */ virtual void vfunc_0c(ItemModel *model); + /* 0c */ virtual void Init_ModelRender_UnkStruct_4(ItemModel *model); /* 10 */ virtual void SetTransform(Vec3p *scale, Mat3p *rotation, Vec3p *translation); /* 14 */ virtual void SetRotationTranslation(Mat3p *rotation, Vec3p *translation); /* 18 */ virtual void SetTranslation(Vec3p *translation); /* 1c */ virtual void PushGeometryCommands(); - /* 20 */ virtual void vfunc_20(); + /* 20 */ virtual void ExecRenderCommands(); // Reads the NSBMD Render Commands and push instructions to the FIFO /* 24 */ virtual void vfunc_24(UnkStruct_ov000_020c0c08 *param1); /* 28 */ virtual void vfunc_28(); /* 2c */ virtual void vfunc_2c(); /* 30 */ virtual void vfunc_30(); /* 34 */ virtual void vfunc_34(); /* 38 */ virtual void vfunc_38(); - /* 3c */ virtual void vfunc_3c(); + /* 3c */ virtual void vfunc_3c(ModelRenderCommandsData *renderData); /* 40 */ - ModelRender(ItemModel *param1); - void *func_ov000_020a9624(s32 param1); - void func_ov000_020a98e8(unk32 param1); - void func_ov000_020a990c(unk32 param1); - void func_ov000_020a9938(unk32 param1); - void func_ov000_020a9960(void *param1); - void func_ov000_020a9998(unk32 param1, unk32 param2); - void func_ov000_020a99c0(); + ModelRender(ItemModel *itemModel); + ModelRender_UnkBoneMatrixStruct *UnkGetBoneMatrix(s32 index); + s32 GetObjectIndex(char *objectName); + s32 GetMaterialIndex(char *materialName); + void InitBoneMatrixArrays(u32 idLength); + void SetUnkBoneMatrixArray1(ModelRender_UnkBoneMatrixStruct *boneMatrix); + void UnkInit_Struct4_Params(u8 param1, u8 param2); void func_ov000_020b413c(unk16 param1, Vec3p *param2); }; diff --git a/src/00_Core/Item/ItemManager.cpp b/src/00_Core/Item/ItemManager.cpp index c15eafe4..2e1f3c01 100644 --- a/src/00_Core/Item/ItemManager.cpp +++ b/src/00_Core/Item/ItemManager.cpp @@ -556,7 +556,7 @@ THUMB void ItemManager::LoadFanfareItem(ItemId id) { strcat(textureName, sSpecialItemModelNames[6]); model = LoadNsbTexturedModel(mFanfareItemModel, modelName, textureName, 0, 0, 0, true); } - mUnk_114->vfunc_0c(model); + mUnk_114->Init_ModelRender_UnkStruct_4(model); } THUMB bool ItemManager::GetFanfareItemScale(Vec3p *scale) const { diff --git a/src/00_Core/Render/ModelRender.cpp b/src/00_Core/Render/ModelRender.cpp index 92d32375..cd984739 100644 --- a/src/00_Core/Render/ModelRender.cpp +++ b/src/00_Core/Render/ModelRender.cpp @@ -1,25 +1,174 @@ #include "Render/ModelRender.hpp" +#include "DTCM/UnkStruct_027e037c.hpp" -ModelRender::ModelRender(ItemModel *param1) {} -ModelRender::~ModelRender() {} -void *ModelRender::GetLcdcAddress() {} -void ModelRender::vfunc_0c(ItemModel *model) {} -void *ModelRender::func_ov000_020a9624(s32 param1) {} -void ModelRender::SetTransform(Vec3p *scale, Mat3p *rotation, Vec3p *translation) {} -void ModelRender::SetRotationTranslation(Mat3p *rotation, Vec3p *translation) {} -void ModelRender::SetTranslation(Vec3p *translation) {} -void ModelRender::PushGeometryCommands() {} -void ModelRender::vfunc_20() {} -void ModelRender::vfunc_24(UnkStruct_ov000_020c0c08 *param1) {} -void ModelRender::vfunc_28() {} -void ModelRender::vfunc_2c() {} -void ModelRender::vfunc_34() {} -void ModelRender::vfunc_30() {} -void ModelRender::func_ov000_020a98e8(unk32 param1) {} -void ModelRender::func_ov000_020a990c(unk32 param1) {} -void ModelRender::func_ov000_020a9938(unk32 param1) {} -void ModelRender::func_ov000_020a9960(void *param1) {} -void ModelRender::vfunc_38() {} -void ModelRender::vfunc_3c() {} -void ModelRender::func_ov000_020a9998(unk32 param1, unk32 param2) {} -void ModelRender::func_ov000_020a99c0() {} +extern "C" void func_020189dc(ModelRender_UnkStruct_4 *unkStruct4, ItemModel *model); +extern "C" void func_02018c3c(ModelRender_UnkStruct_4 *unkStruct4, void *param2); +extern "C" void UnkInit_ModelRender_Struct4_Params(ModelRender_UnkStruct_4 *unkStruct4, + void (*func)(ModelRenderCommandsData *), unk32 param3, u8 param4, + u8 param5); +extern "C" void ExecModelRenderCommands(ModelRender_UnkStruct_4 *unkStruct4); +extern "C" void CopySingle288(Mat3p *src, Mat3p *dest); +extern "C" void SetGeometryScale(Vec3p *scale); +extern "C" void SetGeometryTranslation(Vec3p *translation); +extern "C" void PushGeometryCommand(u32 command, void *data, s32 length); +extern "C" void func_ov000_020c0d70(UnkStruct_ov000_020c0c08 *param1, ModelRender_UnkStruct_4 *param2); +extern "C" void func_ov000_020b3ea8(void *param1); +extern "C" unk32 func_0201e388(void *param1, const char *param2); +extern "C" u8 *GetModelUnknownHeader(ModelRender *modelRender); +extern "C" Mat3p gGeomMatrix; +extern "C" Vec3p gGeomTranslation; +extern "C" Vec3p gGeomScale; +extern "C" UnkStruct_027e037c data_027e037c; +extern "C" void *data_027e03c8; +extern "C" Vec3p gDefaultScale; +extern "C" Mat3p gDefaultMatrix; +extern "C" u32 *data_027e0ce0[]; + +THUMB ModelRender::ModelRender(ItemModel *itemModel) { + this->unkBoneMatrixArray2 = NULL; + this->Init_ModelRender_UnkStruct_4(itemModel); +} + +THUMB ModelRender::~ModelRender() { + if (this->unkBoneMatrixArray2 != NULL) { + SysObject::operator delete[](this->unkBoneMatrixArray2); + } + func_ov000_020b3ea8(this); +} + +ARM void *ModelRender::GetLcdcAddress() { + return mUnk_04.mLcdcAddr; +} + +void ModelRender::Init_ModelRender_UnkStruct_4(ItemModel *model) { + func_020189dc(&this->mUnk_04, model); +} + +ModelRender_UnkBoneMatrixStruct *ModelRender::UnkGetBoneMatrix(s32 index) { + if (this->unkBoneMatrixArray2 != NULL) { + return &this->unkBoneMatrixArray2[index]; + } + if (this->mUnk_04.unkBoneMatrixArray1 != NULL) { + return &this->mUnk_04.unkBoneMatrixArray1[index]; + } + return NULL; +} + +void ModelRender::SetTransform(Vec3p *scale, Mat3p *rotation, Vec3p *translation) { + SetGeometryScale(scale); + CopySingle288(rotation, &gGeomMatrix); + data_027e037c.flags = data_027e037c.flags & 0xffffff5b; + SetGeometryTranslation(translation); + this->PushGeometryCommands(); + SetGeometryScale(&gDefaultScale); + CopySingle288(&gDefaultMatrix, &gGeomMatrix); + data_027e037c.flags = data_027e037c.flags & 0xffffff5b; +} + +void ModelRender::SetRotationTranslation(Mat3p *rotation, Vec3p *translation) { + CopySingle288(rotation, &gGeomMatrix); + data_027e037c.flags = data_027e037c.flags & 0xffffff5b; + SetGeometryTranslation(translation); + this->PushGeometryCommands(); + CopySingle288(&gDefaultMatrix, &gGeomMatrix); + data_027e037c.flags = data_027e037c.flags & 0xffffff5b; +} + +void ModelRender::SetTranslation(Vec3p *translation) { + SetGeometryTranslation(translation); + this->PushGeometryCommands(); +} + +void ModelRender::PushGeometryCommands() { + PushGeometryCommand(0x1c, &gGeomTranslation.x, 3); + PushGeometryCommand(0x1a, &gGeomMatrix, 9); + PushGeometryCommand(0x1b, &gGeomScale.x, 3); + this->ExecRenderCommands(); + PushGeometryCommand(0x17, &data_027e03c8, 0xc); +} + +void ModelRender::ExecRenderCommands() { + ExecModelRenderCommands(&this->mUnk_04); +} + +void ModelRender::vfunc_24(UnkStruct_ov000_020c0c08 *param1) { + func_ov000_020c0d70(param1, &this->mUnk_04); +} + +void ModelRender::vfunc_28() { + while (this->mUnk_04.mUnk_10 != NULL) { + func_02018c3c(&this->mUnk_04, this->mUnk_04.mUnk_10); + } + while (this->mUnk_04.mUnk_08 != NULL) { + func_02018c3c(&this->mUnk_04, this->mUnk_04.mUnk_08); + } + while (this->mUnk_04.mUnk_18 != NULL) { + func_02018c3c(&this->mUnk_04, this->mUnk_04.mUnk_18); + } +} + +void ModelRender::vfunc_2c() { + while (this->mUnk_04.mUnk_10 != NULL) { + func_02018c3c(&this->mUnk_04, this->mUnk_04.mUnk_10); + } +} + +void ModelRender::vfunc_34() { + while (this->mUnk_04.mUnk_18 != NULL) { + func_02018c3c(&this->mUnk_04, this->mUnk_04.mUnk_18); + } +} + +void ModelRender::vfunc_30() { + while (this->mUnk_04.mUnk_08 != NULL) { + func_02018c3c(&this->mUnk_04, this->mUnk_04.mUnk_08); + } +} + +// An object is a subdivision of a model e.g.: link's arm, link's head, etc. +ARM s32 ModelRender::GetObjectIndex(char *objectName) { + char *model = (char *) GetLcdcAddress(); + void *objectList = model + 0x40; + unk32 index = func_0201e388(objectList, objectName); + return index; +} + +ARM s32 ModelRender::GetMaterialIndex(char *materialName) { + char *model = (char *) GetLcdcAddress(); + u32 materialsOffset = *(u32 *) ((u32) model + 8); + void *materialList = (void *) ((u32) model + materialsOffset + 4); + unk32 index = func_0201e388(materialList, materialName); + return index; +} + +THUMB void ModelRender::InitBoneMatrixArrays(u32 idLength) { + u32 *id = data_027e0ce0[1]; + u8 *unkPtr = GetModelUnknownHeader(this); + u8 boneMatrixCount = *(unkPtr + 3); + + ModelRender_UnkBoneMatrixStruct *boneMatrixArray = + (ModelRender_UnkBoneMatrixStruct *) SysObject::operator new[](boneMatrixCount * 0x58, id, idLength); + this->unkBoneMatrixArray2 = boneMatrixArray; + this->mUnk_04.unkBoneMatrixArray1 = boneMatrixArray; +} + +ARM void ModelRender::SetUnkBoneMatrixArray1(ModelRender_UnkBoneMatrixStruct *boneMatrix) { + this->mUnk_04.unkBoneMatrixArray1 = boneMatrix; +} + +void ModelRender::vfunc_38() { + this->mUnk_04.flags |= 3; + ExecModelRenderCommands(&this->mUnk_04); + this->mUnk_04.flags &= 0xfffffffd; +} + +void ModelRender::vfunc_3c(ModelRenderCommandsData *renderData) {} + +void func_ov000_020a99c0(ModelRenderCommandsData *renderData) { + renderData->unkStruct4->mUnk_2c->vfunc_3c(renderData); +} + +void ModelRender::UnkInit_Struct4_Params(u8 param1, u8 param2) { + this->mUnk_04.mUnk_2c = this; + UnkInit_ModelRender_Struct4_Params(&this->mUnk_04, &func_ov000_020a99c0, 0, param1, param2); +} \ No newline at end of file diff --git a/src/04_Load/Actor/Navi/ActorNavi_04.cpp b/src/04_Load/Actor/Navi/ActorNavi_04.cpp index 13bac706..d442f909 100644 --- a/src/04_Load/Actor/Navi/ActorNavi_04.cpp +++ b/src/04_Load/Actor/Navi/ActorNavi_04.cpp @@ -50,7 +50,7 @@ THUMB bool ActorNaviBase::Init() { ActorNaviBase_Unk3::ActorNaviBase_Unk3(ItemModel *param1) : ModelRender(param1) { - this->func_ov000_020a9998(6, 3); + this->UnkInit_Struct4_Params(6, 3); } THUMB ActorNavi::ActorNavi() : @@ -69,7 +69,7 @@ extern const ItemManager_Unk1 data_ov000_020dc7d0; THUMB bool ActorNavi::Init() { mUnk_2f0.func_ov000_020c0c44(gItemManager->func_ov00_020ad538(&data_ov000_020dc7d0)); mUnk_2f0.func_ov000_020c0e5c(0); - mUnk_294.func_ov000_020a9960(&mUnk_35c); + mUnk_294.SetUnkBoneMatrixArray1(&unkBoneMatrixStruct); mUnk_294.vfunc_24(&mUnk_2f0); mUnk_3c4 = ActorNaviBase::vfunc_c4(); mUnk_3c6 = ActorNaviBase::vfunc_c8(); diff --git a/src/58_Bombchu/Player/EquipBombchu.cpp b/src/58_Bombchu/Player/EquipBombchu.cpp index 8b28d754..d52dc6c7 100644 --- a/src/58_Bombchu/Player/EquipBombchu.cpp +++ b/src/58_Bombchu/Player/EquipBombchu.cpp @@ -87,8 +87,8 @@ static const ItemManager_Unk1 sEquipBombchu_Unk1 = { }; THUMB void EquipBombchu::vfunc_00() { - gModelRenderBombchu.vfunc_0c(gItemManager->GetItemModel(ItemModelId_Bombchu)); - gModelRenderBombchuPt.vfunc_0c(gItemManager->GetItemModel(ItemModelId_BombchuPt)); + gModelRenderBombchu.Init_ModelRender_UnkStruct_4(gItemManager->GetItemModel(ItemModelId_Bombchu)); + gModelRenderBombchuPt.Init_ModelRender_UnkStruct_4(gItemManager->GetItemModel(ItemModelId_BombchuPt)); data_ov058_0219b0a0.mUnk_08 = gItemManager->GetItemModel(ItemModelId_BombchuPt); data_ov058_0219b0a0.func_ov000_020c0c44(gItemManager->func_ov00_020ad538(&sEquipBombchu_Unk1)); data_ov058_0219b0a0.func_ov000_020c0e5c(0); diff --git a/src/59_Hammer/Actor/Navi/ActorNaviBase_59.cpp b/src/59_Hammer/Actor/Navi/ActorNaviBase_59.cpp index 07b8a4a5..9df98e3d 100644 --- a/src/59_Hammer/Actor/Navi/ActorNaviBase_59.cpp +++ b/src/59_Hammer/Actor/Navi/ActorNaviBase_59.cpp @@ -45,7 +45,7 @@ ARM void ActorNavi::func_ov059_0219aa08(bool param1) { this->mUnk_334.mUnk_00.x = ROUND_Q20(uVar4) | ((this->mUnk_344 >> 0x1F) * 0x666 + (lVar2 >> 0x20) + (~0x800 < uVar4)) * 0x100000; - Mat3p_MultiplyVec(&this->mUnk_334.mUnk_00, &this->mUnk_384, &this->mUnk_334.mUnk_00); + Mat3p_MultiplyVec(&this->mUnk_334.mUnk_00, &this->unkBoneMatrixStruct.mUnk_28, &this->mUnk_334.mUnk_00); Vec3p_RotateY(uVar3, &this->mUnk_334.mUnk_00); Vec3p_Add(&this->mUnk_334.mUnk_00, &VStack_24, &this->mUnk_334.mUnk_00); VStack_60.z = this->mUnk_334.mUnk_00.z;