diff --git a/Runtime/CMemoryCardSys.cpp b/Runtime/CMemoryCardSys.cpp index f2a5096fb..690b913dc 100644 --- a/Runtime/CMemoryCardSys.cpp +++ b/Runtime/CMemoryCardSys.cpp @@ -585,4 +585,10 @@ void CMemoryCardSys::CommitToDisk(kabufuda::ECardSlot port) card.commit(); } +void CMemoryCardSys::Shutdown() +{ + UnmountCard(kabufuda::ECardSlot::SlotA); + UnmountCard(kabufuda::ECardSlot::SlotB); +} + } diff --git a/Runtime/CMemoryCardSys.hpp b/Runtime/CMemoryCardSys.hpp index 701543636..08781443e 100644 --- a/Runtime/CMemoryCardSys.hpp +++ b/Runtime/CMemoryCardSys.hpp @@ -63,6 +63,7 @@ class CMemoryCardSys std::vector> xc_memoryWorlds; /* MLVL as key */ std::experimental::optional> x1c_worldInter; /* used to be auto_ptr of vector */ std::vector> x20_scanStates; + public: static kabufuda::SystemString ResolveDolphinCardPath(kabufuda::ECardSlot slot); @@ -174,6 +175,7 @@ public: static ECardResult FormatCard(kabufuda::ECardSlot port); static void CommitToDisk(kabufuda::ECardSlot port); + static void Shutdown(); }; } diff --git a/Runtime/Graphics/CBooRenderer.cpp b/Runtime/Graphics/CBooRenderer.cpp index 6be14092b..df931e8d5 100644 --- a/Runtime/Graphics/CBooRenderer.cpp +++ b/Runtime/Graphics/CBooRenderer.cpp @@ -4,6 +4,8 @@ #include "CTexture.hpp" #include "CModel.hpp" #include "Particle/CParticleGen.hpp" +#include "Particle/CDecal.hpp" +#include "Particle/CElementGen.hpp" #include "CMetroidModelInstance.hpp" #include "Collision/CAreaOctTree.hpp" @@ -652,6 +654,8 @@ void CBooRenderer::SetThermal(bool thermal, float level, const zeus::CColor& col x318_29_thermalVisor = thermal; x2f0_thermalVisorLevel = level; x2f4_thermColor = color; + CDecal::SetMoveRedToAlphaBuffer(false); + CElementGen::SetMoveRedToAlphaBuffer(false); } void CBooRenderer::SetThermalColdScale(float scale) @@ -680,6 +684,8 @@ void CBooRenderer::DoThermalBlendCold() m_thermColdFilter.setShift(x2a8_thermalRand.Next() % 32); m_thermColdFilter.draw(); + CElementGen::SetMoveRedToAlphaBuffer(true); + CDecal::SetMoveRedToAlphaBuffer(true); } void CBooRenderer::DoThermalBlendHot() diff --git a/Runtime/MP1/MP1.cpp b/Runtime/MP1/MP1.cpp index 2dcab9573..a5c046f3e 100644 --- a/Runtime/MP1/MP1.cpp +++ b/Runtime/MP1/MP1.cpp @@ -66,6 +66,7 @@ void CGameArchitectureSupport::UpdateTicks() void CGameArchitectureSupport::Update() { g_GameState->GetWorldTransitionManager()->TouchModels(); + x30_inputGenerator.Update(1 / 60.f, x4_archQueue); x4_archQueue.Push(MakeMsg::CreateFrameBegin(EArchMsgTarget::Game, x78_)); x58_ioWinManager.PumpMessages(x4_archQueue); } @@ -282,6 +283,7 @@ void CMain::ShutdownSubsystems() CDecalManager::Shutdown(); CElementGen::Shutdown(); CAnimData::FreeCache(); + CMemoryCardSys::Shutdown(); } void CMain::Shutdown() diff --git a/Runtime/Particle/CDecal.cpp b/Runtime/Particle/CDecal.cpp index 6a44316a2..5768944fd 100644 --- a/Runtime/Particle/CDecal.cpp +++ b/Runtime/Particle/CDecal.cpp @@ -2,6 +2,8 @@ namespace urde { +CRandom16 CDecal::sDecalRandom(99); +bool CDecal::sMoveRedToAphaBuffer = false; CDecal::CDecal(const TToken& desc, const zeus::CTransform& xf) : x0_description(desc), @@ -11,11 +13,25 @@ CDecal::CDecal(const TToken& desc, const zeus::CTransform& xf { CGlobalRandom gr(sDecalRandom); - InitQuad(x3c_decalQuad1, x0_description.GetObj()->x0_Quad); - InitQuad(x48_decalQuad2, x0_description.GetObj()->x1c_Quad); + x5c_31_quad1Invalid = InitQuad(x3c_decalQuad1, x0_description.GetObj()->x0_Quad); + x5c_30_quad2Invalid = InitQuad(x48_decalQuad2, x0_description.GetObj()->x1c_Quad); + + CDecalDescription* d = x0_description.GetObj(); + if (d->x38_DMDL) + { + if (d->x48_DLFT) + d->x48_DLFT->GetValue(0, x54_lifetime); + else + x54_lifetime = 0x7FFFFF; + + if (d->x50_DMRT) + d->x50_DMRT->GetValue(0, x60_rotation); + } + else + x5c_29_modelInvalid = true; } -void CDecal::InitQuad(CDecal::CQuadDecal& quad, const CDecalDescription::SQuadDescr& desc) +bool CDecal::InitQuad(CDecal::CQuadDecal& quad, const CDecalDescription::SQuadDescr& desc) { if (desc.x14_TEX) { @@ -26,18 +42,34 @@ void CDecal::InitQuad(CDecal::CQuadDecal& quad, const CDecalDescription::SQuadDe if (desc.x8_ROT) { desc.x8_ROT->GetValue(0, quad.x8_rotation); - u32 r0 = (quad._dummy >> 25) & 1; - r0 &= desc.x8_ROT->IsConstant(); - quad._dummy = (quad._dummy & ~0x80) | ((r0 << 7) & 0x80); + quad.x0_24_invalid = desc.x8_ROT->IsConstant(); } if (desc.x4_SZE) { - + quad.x0_24_invalid = desc.x4_SZE->IsConstant(); + float size = 1.f; + desc.x4_SZE->GetValue(0, size); + quad.x0_24_invalid = size <= 1.f; } + + if (desc.xc_OFF) + quad.x0_24_invalid = desc.xc_OFF->IsFastConstant(); + return false; } - else - quad.x0_24_ = false; + + quad.x0_24_invalid = false; + return true; } + +void CDecal::SetGlobalSeed(u16 seed) +{ + sDecalRandom.SetSeed(seed); +} + +void CDecal::SetMoveRedToAlphaBuffer(bool move) +{ + sMoveRedToAphaBuffer = move; +} } diff --git a/Runtime/Particle/CDecal.hpp b/Runtime/Particle/CDecal.hpp index 59f63ff03..c7b822553 100644 --- a/Runtime/Particle/CDecal.hpp +++ b/Runtime/Particle/CDecal.hpp @@ -18,7 +18,7 @@ public: { struct { - bool x0_24_ : 1; + bool x0_24_invalid : 1; }; u32 _dummy = 0; }; @@ -28,7 +28,7 @@ public: : x4_lifetime(i), x8_rotation(f) { - x0_24_ = true; + x0_24_invalid = true; } }; private: @@ -39,11 +39,20 @@ private: zeus::CTransform xc_transform; CQuadDecal x3c_decalQuad1; CQuadDecal x48_decalQuad2; - u32 x54_ = 0; - u32 x58_ = 0; - u32 x5c_ = 0; - zeus::CVector3f x60_; - void InitQuad(CQuadDecal&, const CDecalDescription::SQuadDescr&); + s32 x54_lifetime = 0; + s32 x58_frameIdx = 0; + union + { + struct + { + bool x5c_31_quad1Invalid : 1; + bool x5c_30_quad2Invalid : 1; + bool x5c_29_modelInvalid : 1; + }; + u32 x5c_dummy = 0; + }; + zeus::CVector3f x60_rotation; + bool InitQuad(CQuadDecal&, const CDecalDescription::SQuadDescr&); public: CDecal(const TToken&, const zeus::CTransform&); bool IsDone() const; diff --git a/Runtime/Particle/CElementGen.cpp b/Runtime/Particle/CElementGen.cpp index 96799ba04..9e4fe441f 100644 --- a/Runtime/Particle/CElementGen.cpp +++ b/Runtime/Particle/CElementGen.cpp @@ -21,7 +21,7 @@ int CElementGen::g_ParticleAliveCount; int CElementGen::g_ParticleSystemAliveCount; s32 CElementGen::g_FreeIndex; bool CElementGen::g_StaticListInitialized = false; -bool CElementGen::g_MoveRedToAlphaBuffer = false; +bool CElementGen::sMoveRedToAlphaBuffer = false; CElementGen::CParticle* CElementGen::g_currentParticle = nullptr; static rstl::reserved_vector g_StaticParticleList; static rstl::reserved_vector g_StaticFreeList; @@ -1273,7 +1273,7 @@ void CElementGen::RenderModels() if (desc->x45_24_x31_26_PMUS) { - if (g_MoveRedToAlphaBuffer && desc->x44_31_x31_25_PMAB && desc->x54_x40_TEXR) + if (sMoveRedToAlphaBuffer && desc->x44_31_x31_25_PMAB && desc->x54_x40_TEXR) moveRedToAlphaBuffer = true; if (desc->x44_31_x31_25_PMAB) @@ -1638,7 +1638,7 @@ void CElementGen::RenderParticles() } bool moveRedToAlphaBuffer = false; - if (g_MoveRedToAlphaBuffer && x224_26_AAPH) + if (sMoveRedToAlphaBuffer && x224_26_AAPH) moveRedToAlphaBuffer = true; if (moveRedToAlphaBuffer) @@ -2321,4 +2321,9 @@ void CElementGen::Reset() x225_28_warmedUp = false; } +void CElementGen::SetMoveRedToAlphaBuffer(bool move) +{ + sMoveRedToAlphaBuffer = move; +} + } diff --git a/Runtime/Particle/CElementGen.hpp b/Runtime/Particle/CElementGen.hpp index 20caf3b18..3339a9dad 100644 --- a/Runtime/Particle/CElementGen.hpp +++ b/Runtime/Particle/CElementGen.hpp @@ -172,7 +172,7 @@ public: static bool g_StaticListInitialized; static int g_ParticleAliveCount; static int g_ParticleSystemAliveCount; - static bool g_MoveRedToAlphaBuffer; + static bool sMoveRedToAlphaBuffer; static void Initialize(); static void Shutdown(); @@ -239,6 +239,8 @@ public: bool GetParticleEmission() const; void DestroyParticles(); void Reset(); + + static void SetMoveRedToAlphaBuffer(bool); }; ENABLE_BITWISE_ENUM(CElementGen::EOptionalSystemFlags) diff --git a/Runtime/Particle/CParticleDataFactory.hpp b/Runtime/Particle/CParticleDataFactory.hpp index ae9e188ab..db63677e4 100644 --- a/Runtime/Particle/CParticleDataFactory.hpp +++ b/Runtime/Particle/CParticleDataFactory.hpp @@ -31,6 +31,7 @@ struct SParticleModel SParticleModel() = default; SParticleModel(CToken&& tok, bool found) : m_token(std::move(tok)), m_found(found) {} + operator bool() const { return m_found; } }; struct SChildGeneratorDesc @@ -41,6 +42,7 @@ struct SChildGeneratorDesc SChildGeneratorDesc() = default; SChildGeneratorDesc(CToken&& tok, bool found) : m_token(std::move(tok)), m_found(found) {} + operator bool() const { return m_found; } }; struct SSwooshGeneratorDesc @@ -51,6 +53,7 @@ struct SSwooshGeneratorDesc SSwooshGeneratorDesc() = default; SSwooshGeneratorDesc(CToken&& tok, bool found) : m_token(std::move(tok)), m_found(found) {} + operator bool() const { return m_found; } }; struct SElectricGeneratorDesc @@ -61,6 +64,7 @@ struct SElectricGeneratorDesc SElectricGeneratorDesc() = default; SElectricGeneratorDesc(CToken&& tok, bool found) : m_token(std::move(tok)), m_found(found) {} + operator bool() const { return m_found; } }; class CParticleDataFactory