From 62035f1dba2bb7bb5707fdf20b7535d9108e4cea Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Thu, 24 Oct 2024 14:58:22 -0700 Subject: [PATCH] CMoviePlayer progress --- config/GM8E01_00/symbols.txt | 4 +- config/GM8E01_01/splits.txt | 4 +- config/GM8E01_01/symbols.txt | 11 +- include/Kyoto/Graphics/CMoviePlayer.hpp | 26 ++-- include/Kyoto/Math/CQuaternion.hpp | 1 + include/Kyoto/Math/CRelAngle.hpp | 2 +- include/MetroidPrime/CModelData.hpp | 2 +- src/Kyoto/Graphics/CCubeMoviePlayer.cpp | 116 ++++++++++++++++++ src/Kyoto/Graphics/DolphinCModel.cpp | 86 +++++++++++++ src/Kyoto/Math/CMatrix3f.cpp | 153 ++++++++++++++++++++++++ src/Kyoto/Math/CQuaternion.cpp | 10 +- 11 files changed, 396 insertions(+), 19 deletions(-) create mode 100644 src/Kyoto/Graphics/CCubeMoviePlayer.cpp create mode 100644 src/Kyoto/Graphics/DolphinCModel.cpp create mode 100644 src/Kyoto/Math/CMatrix3f.cpp diff --git a/config/GM8E01_00/symbols.txt b/config/GM8E01_00/symbols.txt index 51752889..a1e0cda6 100644 --- a/config/GM8E01_00/symbols.txt +++ b/config/GM8E01_00/symbols.txt @@ -6574,7 +6574,7 @@ DisintegrateDraw__10CModelDataFRC13CStateManagerRC12CTransform4fRC8CTextureRC6CC DisintegrateDraw__10CModelDataF11EWhichModelRC12CTransform4fRC8CTextureRC6CColor = .text:0x8011615C; // type:function size:0x144 scope:global RenderThermal__10CModelDataCFRC12CTransform4fRC6CColorRC6CColorRC11CModelFlags = .text:0x801162A0; // type:function size:0x114 scope:global RenderThermal__10CModelDataCFPCfPCfRC6CColorRC6CColorRC11CModelFlags = .text:0x801163B4; // type:function size:0x50 scope:global -ThermalDraw__10CModelDataRC6CColorRC6CColorRC11CModelFlags = .text:0x80116404; // type:function size:0x44 scope:global +ThermalDraw__10CModelDataFRC6CColorRC6CColorRC11CModelFlags = .text:0x80116404; // type:function size:0x44 scope:global MultipassDrawCallback__10CModelDataFPCfPCfPC21SMultipassDrawContext = .text:0x80116448; // type:function size:0x70 scope:global MultiLightingDrawCallback__10CModelDataFPCfPCfPC25SMultiLightingDrawContext = .text:0x801164B8; // type:function size:0x188 scope:global FlatDrawCallback__10CModelDataFPCfPCfPC16SFlatDrawContext = .text:0x80116640; // type:function size:0x4C scope:global @@ -15043,7 +15043,7 @@ __dt__Q24rstl56vector,Q24rstl17rmemory_allocator>Fv = .tex PumpIndexLoad__12CMoviePlayerFv = .text:0x8035CA80; // type:function size:0x49C scope:global __ct__12CMoviePlayerFPCcfb = .text:0x8035CF1C; // type:function size:0x204 scope:global MyTHPYuv2RgbTextureSetup__FPvPvPvUsUs = .text:0x8035D120; // type:function size:0x174 scope:global -MyTHPGXYuv2RgbSetup__Fb = .text:0x8035D294; // type:function size:0x51C scope:global +MyTHPGXYuv2RgbSetup__Fbb = .text:0x8035D294; // type:function size:0x51C scope:global MyTHPGXRestore__Fv = .text:0x8035D7B0; // type:function size:0x84 scope:global reserve__Q24rstl67vectorFi = .text:0x8035D834; // type:function size:0x144 scope:global construct__4rstlFPvRCQ212CMoviePlayer14CTHPTextureSet = .text:0x8035D978; // type:function size:0x90 scope:global diff --git a/config/GM8E01_01/splits.txt b/config/GM8E01_01/splits.txt index 7dec2a4a..0eb63903 100644 --- a/config/GM8E01_01/splits.txt +++ b/config/GM8E01_01/splits.txt @@ -22,7 +22,7 @@ MetroidPrime/main.cpp: .data start:0x803D8F40 end:0x803D9088 .bss start:0x803F7740 end:0x80457AD8 .sdata start:0x805A6DA0 end:0x805A6DB0 - .sbss start:0x805A8E00 end:0x805A8E38 + .sbss start:0x805A8E00 end:0x805A8E58 .sdata2 start:0x805A9F00 end:0x805A9F68 MetroidPrime/Cameras/CCameraManager.cpp: @@ -4298,7 +4298,7 @@ musyx/runtime/hw_aramdma.c: musyx/runtime/hw_dolphin.c: .text start:0x803B4E18 end:0x803B5310 - .bss start:0x80567A80 end:0x80569AE8 + .bss start:0x80567A80 end:0x80569AE0 .sbss start:0x805A9D50 end:0x805A9D78 musyx/runtime/hw_memory.c: diff --git a/config/GM8E01_01/symbols.txt b/config/GM8E01_01/symbols.txt index 0b59eb36..cebf47c8 100644 --- a/config/GM8E01_01/symbols.txt +++ b/config/GM8E01_01/symbols.txt @@ -6576,7 +6576,7 @@ DisintegrateDraw__10CModelDataFRC13CStateManagerRC12CTransform4fRC8CTextureRC6CC DisintegrateDraw__10CModelDataF11EWhichModelRC12CTransform4fRC8CTextureRC6CColor = .text:0x801161D8; // type:function size:0x144 scope:global RenderThermal__10CModelDataCFRC12CTransform4fRC6CColorRC6CColorRC11CModelFlags = .text:0x8011631C; // type:function size:0x114 scope:global RenderThermal__10CModelDataCFPCfPCfRC6CColorRC6CColorRC11CModelFlags = .text:0x80116430; // type:function size:0x50 scope:global -ThermalDraw__10CModelDataRC6CColorRC6CColorRC11CModelFlags = .text:0x80116480; // type:function size:0x44 scope:global +ThermalDraw__10CModelDataFRC6CColorRC6CColorRC11CModelFlags = .text:0x80116480; // type:function size:0x44 scope:global MultipassDrawCallback__10CModelDataFPCfPCfPC21SMultipassDrawContext = .text:0x801164C4; // type:function size:0x70 scope:global MultiLightingDrawCallback__10CModelDataFPCfPCfPC25SMultiLightingDrawContext = .text:0x80116534; // type:function size:0x188 scope:global FlatDrawCallback__10CModelDataFPCfPCfPC16SFlatDrawContext = .text:0x801166BC; // type:function size:0x4C scope:global @@ -15058,7 +15058,7 @@ __dt__Q24rstl56vector,Q24rstl17rmemory_allocator>Fv = .tex PumpIndexLoad__12CMoviePlayerFv = .text:0x8035CC5C; // type:function size:0x49C scope:global __ct__12CMoviePlayerFPCcfb = .text:0x8035D0F8; // type:function size:0x204 scope:global MyTHPYuv2RgbTextureSetup__FPvPvPvUsUs = .text:0x8035D2FC; // type:function size:0x174 scope:global -MyTHPGXYuv2RgbSetup__Fb = .text:0x8035D470; // type:function size:0x51C scope:global +MyTHPGXYuv2RgbSetup__Fbb = .text:0x8035D470; // type:function size:0x51C scope:global MyTHPGXRestore__Fv = .text:0x8035D98C; // type:function size:0x84 scope:global reserve__Q24rstl67vectorFi = .text:0x8035DA10; // type:function size:0x144 scope:global construct__4rstlFPvRCQ212CMoviePlayer14CTHPTextureSet = .text:0x8035DB54; // type:function size:0x90 scope:global @@ -19388,7 +19388,8 @@ aramQueueLo = .bss:0x80567170; // type:object size:0x284 scope:local aramQueueHi = .bss:0x805673F4; // type:object size:0x284 scope:local aramStreamBuffers = .bss:0x80567678; // type:object size:0x400 scope:local data:4byte dsp_task = .bss:0x80567A80; // type:object size:0x50 scope:local -dram_image = .bss:0x80567AE0; // type:object size:0x2008 scope:local +dram_image = .bss:0x80567AE0; // type:object size:0x2000 scope:local +dummy = .bss:0x80569AE0; // type:object size:0x8 scope:global __block_for_run_callback = .bss:0x80569AE8; // type:object size:0x30 scope:local __block_for_prep_callback = .bss:0x80569B18; // type:object size:0x30 scope:local __block_for_stream_status = .bss:0x80569B48; // type:object size:0x30 scope:local @@ -21532,8 +21533,8 @@ lbl_805A8C68 = .sbss:0x805A8E48; // type:object size:0x4 scope:global data:4byte lbl_805A8C6C = .sbss:0x805A8E4C; // type:object size:0x1 scope:global data:byte lbl_805A8C70 = .sbss:0x805A8E50; // type:object size:0x4 scope:global data:4byte lbl_805A8C74 = .sbss:0x805A8E54; // type:object size:0x1 scope:global data:byte -lbl_805A8C78 = .sbss:0x805A8E58; // type:object size:0x1 scope:global data:byte -lbl_805A8C7C = .sbss:0x805A8E5C; // type:object size:0x4 scope:global data:4byte +gUseSurfaceHack = .sbss:0x805A8E58; // type:object size:0x1 scope:global data:byte +gSR_Hack = .sbss:0x805A8E5C; // type:object size:0x4 scope:global data:4byte init$1101 = .sbss:0x805A8E60; // type:object size:0x1 scope:global data:byte lbl_805A8C81 = .sbss:0x805A8E61; // type:object size:0x1 scope:global data:byte lbl_805A8C84 = .sbss:0x805A8E64; // type:object size:0x4 scope:global data:float diff --git a/include/Kyoto/Graphics/CMoviePlayer.hpp b/include/Kyoto/Graphics/CMoviePlayer.hpp index c03e8447..bbd81a51 100644 --- a/include/Kyoto/Graphics/CMoviePlayer.hpp +++ b/include/Kyoto/Graphics/CMoviePlayer.hpp @@ -1,20 +1,32 @@ #ifndef _CMOVIEPLAYER #define _CMOVIEPLAYER +#include "Kyoto/CDvdFile.hpp" #include "types.h" class CMoviePlayer { public: - static void SetSfxVolume(uchar); + static void SetSfxVolume(uchar); - CMoviePlayer(const char*, float, bool, bool); - ~CMoviePlayer(); + CMoviePlayer(const char*, float, bool, bool); + ~CMoviePlayer(); - void Update(float); - bool DrawVideo() const; + void Update(float); + bool DrawVideo() const; - private: - char x0_pad[0x100]; +private: + CDvdFile x0_movieFile; + uint x84_; + uint x88_; + uint x8c_; + uchar x90_; + uint x94_; + uint x98_; + uint x9c_; + uint xa0_; + uint xa4_; + uint xa8_; + // char x0_pad[0x100]; }; #endif // _CMOVIEPLAYER diff --git a/include/Kyoto/Math/CQuaternion.hpp b/include/Kyoto/Math/CQuaternion.hpp index 68d60f14..59669feb 100644 --- a/include/Kyoto/Math/CQuaternion.hpp +++ b/include/Kyoto/Math/CQuaternion.hpp @@ -12,6 +12,7 @@ class CNUQuaternion; class CQuaternion { public: + CQuaternion(CInputStream& in); CQuaternion(float w, float x, float y, float z) : w(w), imaginary(x, y, z) {} CQuaternion(float w, const CVector3f& imaginary) : w(w), imaginary(imaginary) {} diff --git a/include/Kyoto/Math/CRelAngle.hpp b/include/Kyoto/Math/CRelAngle.hpp index d4538059..926e3315 100644 --- a/include/Kyoto/Math/CRelAngle.hpp +++ b/include/Kyoto/Math/CRelAngle.hpp @@ -7,6 +7,7 @@ class CRelAngle { public: + CRelAngle(float rad) : x0_angle(rad) {} float AsDegrees() const { return x0_angle * (180.f / M_PIF); } float AsRadians() const { return x0_angle; } // ArcCosine__9CRelAngleFf weak @@ -34,7 +35,6 @@ public: static CRelAngle FromRadians(float rad) { return CRelAngle(rad); } private: - CRelAngle(float rad) : x0_angle(rad) {} float x0_angle; }; diff --git a/include/MetroidPrime/CModelData.hpp b/include/MetroidPrime/CModelData.hpp index 42a997a5..4b564567 100644 --- a/include/MetroidPrime/CModelData.hpp +++ b/include/MetroidPrime/CModelData.hpp @@ -66,7 +66,7 @@ public: CModelData(); CModelData(const CAnimRes&); CModelData(const CStaticRes&); - // CModelData(const CModelData& other); + CModelData(const CModelData& other); ~CModelData(); CAdvancementDeltas AdvanceAnimation(float dt, CStateManager& mgr, TAreaId aid, bool advTree); diff --git a/src/Kyoto/Graphics/CCubeMoviePlayer.cpp b/src/Kyoto/Graphics/CCubeMoviePlayer.cpp new file mode 100644 index 00000000..9df0c56f --- /dev/null +++ b/src/Kyoto/Graphics/CCubeMoviePlayer.cpp @@ -0,0 +1,116 @@ +#include +#include +#include + +const char skInterlacePattern[32] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static void MyTHPGXRestore() { + CGX::SetZMode(TRUE, GX_ALWAYS, FALSE); + CGX::SetBlendMode(GX_BM_NONE, GX_BL_ONE, GX_BL_ZERO, GX_LO_SET); + CGX::SetNumTexGens(1); + CGX::SetNumChans(0); + CGX::SetNumTevStages(1); + CGX::SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); + CGX::SetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0); +} + +static void MyTHPGXYuv2RgbSetup(bool r29, bool r30) { + GXVtxDescList attr[3] = { + {GX_VA_POS, GX_DIRECT}, + {GX_VA_TEX0, GX_DIRECT}, + {GX_VA_NULL, GX_NONE}, + }; + CGX::SetZMode(TRUE, GX_ALWAYS, FALSE); + CGX::SetBlendMode(GX_BM_NONE, GX_BL_ONE, GX_BL_ZERO, GX_LO_CLEAR); + CGX::SetNumChans(0); + CGX::SetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY, FALSE, GX_PTIDENTITY); + CGX::SetTexCoordGen(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY, FALSE, GX_PTIDENTITY); + + if (r30) { + CGX::SetNumTexGens(2); + CGX::SetNumTevStages(4); + } else { + CGX::SetNumTexGens(3); + CGX::SetTexCoordGen(GX_TEXCOORD2, GX_TG_MTX2x4, GX_TG_POS, GX_TEXMTX0, FALSE, GX_PTIDENTITY); + + float n = r29 ? 0.25f : 0.f; + float mtx[8] = {0.125f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.25f, n}; + GXLoadTexMtxImm((MtxPtr)mtx, GX_TEXMTX0, GX_MTX2x4); + GXTexObj obj; + GXInitTexObj(&obj, skInterlacePattern, 8, 4, GX_TF_I8, GX_REPEAT, GX_REPEAT, FALSE); + GXInitTexObjLOD(&obj, GX_NEAR, GX_NEAR, 0.f, 0.f, 0.f, FALSE, FALSE, GX_ANISO_1); + GXLoadTexObj(&obj, GX_TEXMAP3); + CTexture::InvalidateTexmap(GX_TEXMAP3); + CGX::SetTevOrder(GX_TEVSTAGE4, GX_TEXCOORD2, GX_TEXMAP3, GX_COLOR_NULL); + CGX::SetStandardTevColorAlphaOp(GX_TEVSTAGE4); + CGX::SetTevColorIn(GX_TEVSTAGE4, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_CPREV); + CGX::SetTevAlphaIn(GX_TEVSTAGE4, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_TEXA); + CGX::SetAlphaCompare(GX_LESS, 128, GX_AOP_AND, GX_ALWAYS, 0); + CGX::SetNumTevStages(5); + } + + CGX::SetVtxDescv(attr); + GXSetColorUpdate(TRUE); + GXSetAlphaUpdate(FALSE); + GXInvalidateTexAll(); + GXSetVtxAttrFmt(GX_VTXFMT7, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0); + GXSetVtxAttrFmt(GX_VTXFMT7, GX_VA_TEX0, GX_CLR_RGBA, GX_RGBX8, 0); + CGX::SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR_NULL); + CGX::SetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_TEXC, GX_CC_KONST, GX_CC_C0); + CGX::SetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, false, GX_TEVPREV); + CGX::SetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_TEXA, GX_CA_KONST, GX_CA_A0); + CGX::SetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_SUB, GX_TB_ZERO, GX_CS_SCALE_1, false, GX_TEVPREV); + CGX::SetTevKColorSel(GX_TEVSTAGE0, GX_TEV_KCSEL_K0); + CGX::SetTevKAlphaSel(GX_TEVSTAGE0, GX_TEV_KASEL_K0_A); + CGX::SetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, GX_TEXMAP2, GX_COLOR_NULL); + CGX::SetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_TEXC, GX_CC_KONST, GX_CC_CPREV); + CGX::SetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_2, false, GX_TEVPREV); + CGX::SetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_TEXA, GX_CA_KONST, GX_CA_APREV); + CGX::SetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_SUB, GX_TB_ZERO, GX_CS_SCALE_1, false, GX_TEVPREV); + CGX::SetTevKColorSel(GX_TEVSTAGE1, GX_TEV_KCSEL_K1); + CGX::SetTevKAlphaSel(GX_TEVSTAGE1, GX_TEV_KASEL_K1_A); + CGX::SetTevOrder(GX_TEVSTAGE2, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); + CGX::SetTevColorIn(GX_TEVSTAGE2, GX_CC_ZERO, GX_CC_TEXC, GX_CC_ONE, GX_CC_CPREV); + CGX::SetTevColorOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, true, GX_TEVPREV); + CGX::SetTevAlphaIn(GX_TEVSTAGE2, GX_CA_TEXA, GX_CA_ZERO, GX_CA_ZERO, GX_CA_APREV); + CGX::SetTevAlphaOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, true, GX_TEVPREV); + CGX::SetTevOrder(GX_TEVSTAGE3, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL); + CGX::SetTevColorIn(GX_TEVSTAGE3, GX_CC_APREV, GX_CC_CPREV, GX_CC_KONST, GX_CC_ZERO); + CGX::SetTevColorOp(GX_TEVSTAGE3, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, true, GX_TEVPREV); + CGX::SetTevAlphaIn(GX_TEVSTAGE3, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); + CGX::SetTevAlphaOp(GX_TEVSTAGE3, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, true, GX_TEVPREV); + CGX::SetTevKColorSel(GX_TEVSTAGE3, GX_TEV_KCSEL_K2); + GXSetTevColorS10(GX_TEVREG0, (GXColorS10){-90, 0, -114, 135}); + CGX::SetTevKColor(GX_KCOLOR0, (GXColor){0, 0, 226, 88}); + CGX::SetTevKColor(GX_KCOLOR1, (GXColor){179, 0, 0, 182}); + CGX::SetTevKColor(GX_KCOLOR2, (GXColor){255, 0, 255, 128}); +} + +static void MyTHPYuv2RgbTextureSetup(void* y, void* u, void* v, ushort width, ushort height) { + GXTexObj yTex; + GXInitTexObj(&yTex, y, width, height, GX_TF_I8, GX_CLAMP, GX_CLAMP, FALSE); + GXInitTexObjLOD(&yTex, GX_NEAR, GX_NEAR, 0.f, 0.f, 0.f, FALSE, FALSE, GX_ANISO_1); + GXLoadTexObj(&yTex, GX_TEXMAP0); + + GXTexObj uTex; + GXInitTexObj(&uTex, u, width / 2, height / 2, GX_TF_I8, GX_CLAMP, GX_CLAMP, FALSE); + GXInitTexObjLOD(&uTex, GX_NEAR, GX_NEAR, 0.f, 0.f, 0.f, FALSE, FALSE, GX_ANISO_1); + GXLoadTexObj(&uTex, GX_TEXMAP1); + + GXTexObj vTex; + GXInitTexObj(&vTex, v, (s16)(width / 2), height / 2, GX_TF_I8, GX_CLAMP, GX_CLAMP, FALSE); + GXInitTexObjLOD(&vTex, GX_NEAR, GX_NEAR, 0.f, 0.f, 0.f, FALSE, FALSE, GX_ANISO_1); + GXLoadTexObj(&vTex, GX_TEXMAP2); + + CTexture::InvalidateTexmap(GX_TEXMAP0); + CTexture::InvalidateTexmap(GX_TEXMAP1); + CTexture::InvalidateTexmap(GX_TEXMAP2); +} + +CMoviePlayer::CMoviePlayer(const char* filepath, float fps, bool a, bool b) +: x0_movieFile(filepath) { + +} diff --git a/src/Kyoto/Graphics/DolphinCModel.cpp b/src/Kyoto/Graphics/DolphinCModel.cpp new file mode 100644 index 00000000..9e8240e0 --- /dev/null +++ b/src/Kyoto/Graphics/DolphinCModel.cpp @@ -0,0 +1,86 @@ +#include "Kyoto/Alloc/CMemory.hpp" +#include "Kyoto/Graphics/CCubeModel.hpp" +#include "Kyoto/Graphics/CCubeSurface.hpp" +#include "Kyoto/Math/CAABox.hpp" +#include "Kyoto/Math/CVector2f.hpp" +#include "dolphin/os/OSCache.h" +#include "dolphin/types.h" +#include + +#include +#include + +uint CModel::sTotalMemory = 0; +CModel* CModel::sThisFrameList = nullptr; +CModel* CModel::sOneFrameList = nullptr; +CModel* CModel::sTwoFrameList = nullptr; + +static uchar* MemoryFromPartData(uchar** dataCur, int** secSizeCur) { + uchar* ret = **secSizeCur != 0 ? *dataCur : nullptr; + (*dataCur) += **secSizeCur; + (*secSizeCur)++; + return ret; +} + +CModel::CModel(const rstl::auto_ptr< uchar >& data, int length, IObjectStore& store) +: x0_data(data) +, x4_dataLen(length) +, x28_modelInstance(nullptr) +, x2c_currentMatxIdx(0) +, x2e_lastMaterialFrame(0) +, x30_prev(nullptr) +, x34_next(sThisFrameList) +, x38_lastFrame(CGraphics::GetFrameCounter() - 2) { + + uint sectionSizeStart = 0x2c; + uchar* dataPtr = data.get(); + uint flags = *(uint*)(dataPtr + 8); + if (*(uint*)(dataPtr + 4) == 1) { + sectionSizeStart = 0x28; + } + + int* secSizeCur = (int*)(dataPtr + sectionSizeStart); + uint numMatSets = 1; + if (*(uint*)(dataPtr + 4) > 1) { + numMatSets = *(uint*)(dataPtr + 0x28); + } + uchar* dataCur = dataPtr + (((sectionSizeStart + *(uint*)(dataPtr + 0x24) * 4) + 31) & ~31); + x18_matSets.reserve(numMatSets); + for (uint i = 0; i < numMatSets; ++i) { + x18_matSets.push_back(SShader(MemoryFromPartData(&dataCur, &secSizeCur))); + SShader& shader = x18_matSets.back(); + CCubeModel::MakeTexturesFromMats(shader.x10_data, shader.x0_textures, store, true); + x4_dataLen += shader.x0_textures.size() * 12; + } + + CVector3f* positions = reinterpret_cast< CVector3f* >(MemoryFromPartData(&dataCur, &secSizeCur)); + CVector3f* normals = reinterpret_cast< CVector3f* >(MemoryFromPartData(&dataCur, &secSizeCur)); + uint* vtxColors = reinterpret_cast< uint* >(MemoryFromPartData(&dataCur, &secSizeCur)); + CVector2f* floatUvs = reinterpret_cast< CVector2f* >(MemoryFromPartData(&dataCur, &secSizeCur)); + ushort* shortUvs = nullptr; + if ((flags >> 2) & 1) { + shortUvs = reinterpret_cast< ushort* >(MemoryFromPartData(&dataCur, &secSizeCur)); + } + + uint* surfaceInfo = reinterpret_cast< uint* >(MemoryFromPartData(&dataCur, &secSizeCur)); + uint surfaceCount = *surfaceInfo; + x8_surfaces.reserve(surfaceCount); + + for (int i = 0; i < surfaceCount; ++i) { + x8_surfaces.push_back( + reinterpret_cast< CCubeSurface* >(MemoryFromPartData(&dataCur, &secSizeCur))); + } + + SShader& shader = x18_matSets.front(); + const CAABox* box = reinterpret_cast< const CAABox* >(dataPtr + 8); + x28_modelInstance = + rs_new CCubeModel(&x8_surfaces, &shader.x0_textures, shader.x10_data, positions, normals, + vtxColors, floatUvs, shortUvs, *box, (flags >> 1) & 1, true, -1); + sThisFrameList = this; + if (x34_next != nullptr) { + x34_next->x30_prev = this; + } + x4_dataLen += x8_surfaces.size() * 4; + sTotalMemory += x4_dataLen; + DCFlushRange(x0_data.get(), x4_dataLen); +} diff --git a/src/Kyoto/Math/CMatrix3f.cpp b/src/Kyoto/Math/CMatrix3f.cpp new file mode 100644 index 00000000..e7db293f --- /dev/null +++ b/src/Kyoto/Math/CMatrix3f.cpp @@ -0,0 +1,153 @@ +#include "Kyoto/Math/CRelAngle.hpp" +#include "Kyoto/Math/CVector3f.hpp" +#include "Kyoto/Streams/CInputStream.hpp" +#include + +const CMatrix3f CMatrix3f::sIdentity = CMatrix3f(1.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 1.f); + +CMatrix3f::CMatrix3f(const CVector3f& _m0, const CVector3f& _m1, const CVector3f& _m2) +: m00(_m0.GetX()) +, m01(_m0.GetY()) +, m02(_m0.GetZ()) +, m10(_m1.GetX()) +, m11(_m1.GetY()) +, m12(_m1.GetZ()) +, m20(_m2.GetX()) +, m21(_m2.GetY()) +, m22(_m2.GetZ()) {} + +CMatrix3f::CMatrix3f(const CMatrix3f& left, float leftScale, const CMatrix3f& right, + float rightScale) { + m00 = left.m00 * leftScale + right.m00 * rightScale; + m01 = left.m01 * leftScale + right.m01 * rightScale; + m02 = left.m02 * leftScale + right.m02 * rightScale; + m10 = left.m10 * leftScale + right.m10 * rightScale; + m11 = left.m11 * leftScale + right.m11 * rightScale; + m12 = left.m12 * leftScale + right.m12 * rightScale; + m20 = left.m20 * leftScale + right.m20 * rightScale; + m21 = left.m21 * leftScale + right.m21 * rightScale; + m22 = left.m22 * leftScale + right.m22 * rightScale; +} + +CMatrix3f::CMatrix3f(CInputStream& in) { + m00 = in.ReadFloat(); + m01 = in.ReadFloat(); + m02 = in.ReadFloat(); + m10 = in.ReadFloat(); + m11 = in.ReadFloat(); + m12 = in.ReadFloat(); + m20 = in.ReadFloat(); + m21 = in.ReadFloat(); + m22 = in.ReadFloat(); +} + +void CMatrix3f::RotateY(const CRelAngle& angle) { + const float dVar1 = sin(angle.AsRadians()); + const float dVar2 = cos(angle.AsRadians()); + m00 = dVar2; + m01 = 0.f; + m02 = dVar1; + m10 = 0.f; + m11 = 1.f; + m12 = 0.f; + m20 = -dVar1; + m21 = 0.f; + m22 = dVar2; +} + +void CMatrix3f::RotateZ(const CRelAngle& angle) { + const float dVar1 = sin(angle.AsRadians()); + const float dVar2 = cos(angle.AsRadians()); + m00 = dVar2; + m01 = -dVar1; + m02 = 0.f; + m10 = dVar1; + m11 = dVar2; + m12 = 0.f; + m20 = 0.f; + m21 = 0.f; + m22 = 1.f; +} + +CMatrix3f CMatrix3f::Orthonormalized() const { + CVector3f local_20(m00, m10, m20); + local_20.Normalize(); + CVector3f local_2c(m01, m11, m21); + local_2c.Normalize(); + CVector3f local_38 = CVector3f::Cross(local_20, local_2c); + local_38.Normalize(); + local_2c = CVector3f::Cross(local_38, local_20); + local_2c.Normalize(); + return CMatrix3f(local_20, local_2c, local_38); +} + +const CVector3f CMatrix3f::operator*(const CVector3f& vec) const { + const float x = vec.GetX() * Get00() + vec.GetY() * Get01() + vec.GetZ() * Get02(); + const float y = vec.GetX() * Get10() + vec.GetY() * Get11() + vec.GetZ() * Get12(); + const float z = vec.GetX() * Get20() + vec.GetY() * Get21() + vec.GetZ() * Get22(); + return CVector3f(x, y, z); +} + +const CMatrix3f CMatrix3f::operator*(const CMatrix3f& mat) const { + //(__return_storage_ptr__->x).x = m00 * otherm00 + m01 * otherm10 + m02 * otherm20; + const float _m00 = m00 * mat.m00 + m01 * mat.m10 + m02 * mat.m20; + //(__return_storage_ptr__->x).y = m00 * otherm01 + m01 * other.m11 + m02 * other.m21; + const float _m01 = m00 * mat.m01 + m01 * mat.m11 + m02 * mat.m21; + //(__return_storage_ptr__->x).z = m00 * otherm02 + m01 * otherm12 + m02 * otherm22; + const float _m02 = m00 * mat.m02 + m01 * mat.m12 + m02 * mat.m22; + //(__return_storage_ptr__->y).x = m10 * otherm00 + m11 * otherm10 + m12 * otherm20; + const float _m10 = m10 * mat.m02 + m11 * mat.m10 + m12 * mat.m20; + //(__return_storage_ptr__->y).y = m10 * otherm01 + m11 * otherm11 + m12 * otherm21; + const float _m11 = m10 * mat.m01 + m11 * mat.m11 + m12 * mat.m21; + //(__return_storage_ptr__->y).z = m10 * otherm02 + m11 * otherm12 + m12 * otherm22; + const float _m12 = m10 * mat.m02 + m11 * mat.m12 + m12 * mat.m22; + //(__return_storage_ptr__->z).x = m20 * otherm00 + m21 * otherm10 + m22 * otherm20; + const float _m20 = m20 * mat.m00 + m21 * mat.m10 + m22 * mat.m20; + //(__return_storage_ptr__->z).y = m20 * otherm01 + m21 * otherm11 + m22 * otherm21; + const float _m21 = m20 * mat.m01 + m21 * mat.m11 + m22 * mat.m21; + //(__return_storage_ptr__->z).z = m20 * otherm02 + m21 * otherm12 + m22 * otherm22; + const float _m22 = m20 * mat.m02 + m21 * mat.m12 + m22 * mat.m22; + + return CMatrix3f(_m00, _m01, _m02, _m10, _m11, _m12, _m20, _m21, _m22); +} + +float CMatrix3f::Determinant() const { + return m00 * (m11 * m22 - m12 * m21) + m01 * (m12 * m20 - m10 * m22) + + m02 * (m10 * m21 - m11 * m20); +} + +void CMatrix3f::AddScaledMatrix(const CMatrix3f& mat, float scale) { + m00 = mat.m00 * scale + m00; + m01 = mat.m01 * scale + m01; + m02 = mat.m02 * scale + m02; + m10 = mat.m10 * scale + m10; + m11 = mat.m11 * scale + m11; + m12 = mat.m12 * scale + m12; + m20 = mat.m20 * scale + m20; + m21 = mat.m21 * scale + m21; + m22 = mat.m22 * scale + m22; +} + +CMatrix3f::CMatrix3f(const CMatrix3f& other) { + m00 = other.m00; + m01 = other.m01; + m02 = other.m02; + m10 = other.m10; + m11 = other.m11; + m12 = other.m12; + m20 = other.m20; + m21 = other.m21; + m22 = other.m22; +} + +const CMatrix3f& CMatrix3f::operator=(const CMatrix3f& other) { + m00 = other.m00; + m01 = other.m01; + m02 = other.m02; + m10 = other.m10; + m11 = other.m11; + m12 = other.m12; + m20 = other.m20; + m21 = other.m21; + m22 = other.m22; +} diff --git a/src/Kyoto/Math/CQuaternion.cpp b/src/Kyoto/Math/CQuaternion.cpp index d2865a16..f6646032 100644 --- a/src/Kyoto/Math/CQuaternion.cpp +++ b/src/Kyoto/Math/CQuaternion.cpp @@ -2,9 +2,17 @@ #include "Kyoto/Math/CRelAngle.hpp" #include "Kyoto/Math/CUnitVector3f.hpp" +#include "Kyoto/Streams/CInputStream.hpp" + +const CQuaternion CQuaternion::sNoRotation = CQuaternion(1.f, CVector3f(0.f, 0.f, 0.f)); +static const CVector3f XAxis(1.f, 0.f, 0.f); +static const CVector3f YAxis(0.f, 1.f, 0.f); +static const CVector3f ZAxis(0.f, 0.f, 1.f); + +CQuaternion::CQuaternion(CInputStream& in) : w(in.ReadFloat()), imaginary(in) {} CQuaternion CQuaternion::AxisAngle(const CUnitVector3f& axis, const CRelAngle& angle) { - float w = cosine(angle / 2.f); + double w = cos(angle.AsRadians() / 2.f); CVector3f vec = axis * sine(angle / 2.f); return CQuaternion(w, vec); }