diff --git a/src/MetroidPrime/ScriptObjects/CScriptSpecialFunction.cpp b/src/MetroidPrime/ScriptObjects/CScriptSpecialFunction.cpp index b706fc41..09c95cc1 100644 --- a/src/MetroidPrime/ScriptObjects/CScriptSpecialFunction.cpp +++ b/src/MetroidPrime/ScriptObjects/CScriptSpecialFunction.cpp @@ -67,8 +67,6 @@ CScriptSpecialFunction::CScriptSpecialFunction( } } -void CScriptSpecialFunction::Accept(IVisitor& visitor) { visitor.Visit(*this); } - void CScriptSpecialFunction::Think(float dt, CStateManager& mgr) { if (!GetActive()) { return; @@ -134,6 +132,49 @@ void CScriptSpecialFunction::Think(float dt, CStateManager& mgr) { } } +void CScriptSpecialFunction::AddToRenderer(const CFrustumPlanes&, CStateManager& mgr) { + if (!GetActive()) { + return; + } + + if (xe8_function == kSF_FogVolume && x1e4_30_) { + EnsureRendered(mgr); + } +} + +void CScriptSpecialFunction::PreRender(CStateManager&, const CFrustumPlanes& frustum) { + switch (xe8_function) { + case kSF_FogVolume: + case kSF_ViewFrustumTester: { + if (!GetActive()) { + break; + } + + bool val; + if (xe8_function == kSF_FogVolume) { + CVector3f pos = GetTranslation(); + CVector3f max = pos + x10c_vector3f; + max[kDZ] += xfc_float1; + CAABox aabb(pos - x10c_vector3f, max); + val = frustum.BoxInFrustumPlanes(aabb); + } else { + val = frustum.PointInFrustumPlanes(GetTranslation()); + } + + if (x1e4_30_ == val) { + break; + } + if (val) { + x1e4_28_frustumEntered = true; + } else { + x1e4_29_frustumExited = true; + } + x1e4_30_ = val; + break; + } + } +} + // constexpr std::array fxTranslation{ // ERumbleFxId::Twenty, ERumbleFxId::One, ERumbleFxId::TwentyOne, // ERumbleFxId::TwentyTwo, ERumbleFxId::TwentyThree, ERumbleFxId::Zero, @@ -521,65 +562,9 @@ void CScriptSpecialFunction::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId } } -void CScriptSpecialFunction::PreRender(CStateManager&, const CFrustumPlanes& frustum) { - switch (xe8_function) { - case kSF_FogVolume: - case kSF_ViewFrustumTester: { - if (!GetActive()) { - break; - } - - bool val; - if (xe8_function == kSF_FogVolume) { - CVector3f pos = GetTranslation(); - CVector3f max = pos + x10c_vector3f; - max[kDZ] += xfc_float1; - CAABox aabb(pos - x10c_vector3f, max); - val = frustum.BoxInFrustumPlanes(aabb); - } else { - val = frustum.PointInFrustumPlanes(GetTranslation()); - } - - if (x1e4_30_ == val) { - break; - } - if (val) { - x1e4_28_frustumEntered = true; - } else { - x1e4_29_frustumExited = true; - } - x1e4_30_ = val; - break; - } - } -} - -void CScriptSpecialFunction::AddToRenderer(const CFrustumPlanes&, CStateManager& mgr) { - if (!GetActive()) { - return; - } - - if (xe8_function == kSF_FogVolume && x1e4_30_) { - EnsureRendered(mgr); - } -} - -void CScriptSpecialFunction::Render(CStateManager& mgr) { - if (xe8_function == kSF_FogVolume) { - /* TODO - const float z = mgr.IntegrateVisorFog(xfc_float1 * std::sin(CGraphics::GetSecondsMod900())); - if (z > 0.f) { - CVector3f max = GetTranslation() + x10c_vector3f; - max.SetZ(max.GetZ() + z); - const CAABox box(GetTranslation() - x10c_vector3f, max); - const CTransform4f modelMtx = CTransform4f::Translate(box.center()) * - CTransform4f::Scale(box.extents()); g_Renderer->SetModelMatrix(modelMtx); - g_Renderer->RenderFogVolume(x118_color, zeus::CAABox(-1.f, 1.f), nullptr, nullptr); - } - */ - } else { - CActor::Render(mgr); - } +bool CScriptSpecialFunction::ShouldSkipCinematic(CStateManager& stateMgr) const { + return gpGameState->SystemOptions().GetCinematicState(stateMgr.GetWorld()->IGetWorldAssetId(), + GetEditorId()); } void CScriptSpecialFunction::SkipCinematic(CStateManager& stateMgr) { @@ -587,6 +572,8 @@ void CScriptSpecialFunction::SkipCinematic(CStateManager& stateMgr) { stateMgr.SetSkipCinematicSpecialFunction(kInvalidUniqueId); } +void CScriptSpecialFunction::Accept(IVisitor& visitor) { visitor.Visit(*this); } + void CScriptSpecialFunction::RingScramble(CStateManager& mgr) { SendScriptMsgs(kSS_Zero, mgr, kSM_None); x1a8_ringState = kRS_Scramble; @@ -600,6 +587,19 @@ void CScriptSpecialFunction::RingScramble(CStateManager& mgr) { } } +void CScriptSpecialFunction::ThinkSaveStation(float, CStateManager& mgr) { + if (!x1e5_24_doSave || mgr.GetDeferredStateTransition() == kSMT_SaveGame) { + return; + } + + x1e5_24_doSave = false; + if (mgr.GetInSaveUI()) { + SendScriptMsgs(kSS_MaxReached, mgr, kSM_None); + } else { + SendScriptMsgs(kSS_Zero, mgr, kSM_None); + } +} + void CScriptSpecialFunction::ThinkIntroBossRingController(float dt, CStateManager& mgr) { if (x1a8_ringState != kRS_Breakup) { for (rstl::vector< SRingController >::iterator it = x198_ringControllers.begin(); @@ -896,6 +896,24 @@ void CScriptSpecialFunction::ThinkObjectFollowObject(float, CStateManager& mgr) } } +void CScriptSpecialFunction::Render(CStateManager& mgr) { + if (xe8_function == kSF_FogVolume) { + /* TODO + const float z = mgr.IntegrateVisorFog(xfc_float1 * std::sin(CGraphics::GetSecondsMod900())); + if (z > 0.f) { + CVector3f max = GetTranslation() + x10c_vector3f; + max.SetZ(max.GetZ() + z); + const CAABox box(GetTranslation() - x10c_vector3f, max); + const CTransform4f modelMtx = CTransform4f::Translate(box.center()) * + CTransform4f::Scale(box.extents()); g_Renderer->SetModelMatrix(modelMtx); + g_Renderer->RenderFogVolume(x118_color, zeus::CAABox(-1.f, 1.f), nullptr, nullptr); + } + */ + } else { + CActor::Render(mgr); + } +} + void CScriptSpecialFunction::ThinkChaffTarget(float dt, CStateManager& mgr) { /* const zeus::CAABox box(5.f - GetTranslation(), 5.f + GetTranslation()); @@ -934,49 +952,6 @@ void CScriptSpecialFunction::ThinkChaffTarget(float dt, CStateManager& mgr) { */ } -void CScriptSpecialFunction::ThinkActorScale(float dt, CStateManager& mgr) { - const float deltaScale = dt * xfc_float1; - - for (rstl::vector< SConnection >::const_iterator conn = GetConnectionList().begin(); - conn != GetConnectionList().end(); ++conn) { - if (conn->x0_state != kSS_Play || conn->x4_msg != kSM_Activate) { - continue; - } - - if (CActor* act = TCastToPtr< CActor >(mgr.ObjectById(mgr.GetIdForScript(conn->x8_objId)))) { - CModelData* mData = act->ModelData(); - if (mData && (mData->HasAnimData() || mData->HasNormalModel())) { - CVector3f scale = mData->GetScale(); - - if (deltaScale > 0.f) { - scale = CVector3f(rstl::min_val(deltaScale + scale.GetX(), x100_float2), - rstl::min_val(deltaScale + scale.GetY(), x100_float2), - rstl::min_val(deltaScale + scale.GetZ(), x100_float2)); - } else { - scale = CVector3f(rstl::max_val(deltaScale + scale.GetX(), x100_float2), - rstl::max_val(deltaScale + scale.GetY(), x100_float2), - rstl::max_val(deltaScale + scale.GetZ(), x100_float2)); - } - - mData->SetScale(scale); - } - } - } -} - -void CScriptSpecialFunction::ThinkSaveStation(float, CStateManager& mgr) { - if (!x1e5_24_doSave || mgr.GetDeferredStateTransition() == kSMT_SaveGame) { - return; - } - - x1e5_24_doSave = false; - if (mgr.GetInSaveUI()) { - SendScriptMsgs(kSS_MaxReached, mgr, kSM_None); - } else { - SendScriptMsgs(kSS_Zero, mgr, kSM_None); - } -} - void CScriptSpecialFunction::ThinkRainSimulator(float, CStateManager& mgr) { if ((float(mgr.GetInputFrameIdx()) / 3600.f) < 0.5f) { SendScriptMsgs(kSS_MaxReached, mgr, kSM_None); @@ -1027,6 +1002,36 @@ void CScriptSpecialFunction::ThinkAreaDamage(float dt, CStateManager& mgr) { CVector3f::Zero()); } +void CScriptSpecialFunction::ThinkActorScale(float dt, CStateManager& mgr) { + const float deltaScale = dt * xfc_float1; + + for (rstl::vector< SConnection >::const_iterator conn = GetConnectionList().begin(); + conn != GetConnectionList().end(); ++conn) { + if (conn->x0_state != kSS_Play || conn->x4_msg != kSM_Activate) { + continue; + } + + if (CActor* act = TCastToPtr< CActor >(mgr.ObjectById(mgr.GetIdForScript(conn->x8_objId)))) { + CModelData* mData = act->ModelData(); + if (mData && (mData->HasAnimData() || mData->HasNormalModel())) { + CVector3f scale = mData->GetScale(); + + if (deltaScale > 0.f) { + scale = CVector3f(rstl::min_val(deltaScale + scale.GetX(), x100_float2), + rstl::min_val(deltaScale + scale.GetY(), x100_float2), + rstl::min_val(deltaScale + scale.GetZ(), x100_float2)); + } else { + scale = CVector3f(rstl::max_val(deltaScale + scale.GetX(), x100_float2), + rstl::max_val(deltaScale + scale.GetY(), x100_float2), + rstl::max_val(deltaScale + scale.GetZ(), x100_float2)); + } + + mData->SetScale(scale); + } + } + } +} + void CScriptSpecialFunction::ThinkPlayerInArea(float dt, CStateManager& mgr) { if (mgr.GetPlayer()->GetAreaIdAlways() == GetAreaIdAlways()) { if (x1e5_25_playerInArea) { @@ -1041,11 +1046,6 @@ void CScriptSpecialFunction::ThinkPlayerInArea(float dt, CStateManager& mgr) { } } -bool CScriptSpecialFunction::ShouldSkipCinematic(CStateManager& stateMgr) const { - return gpGameState->SystemOptions().GetCinematicState(stateMgr.GetWorld()->IGetWorldAssetId(), - GetEditorId()); -} - void CScriptSpecialFunction::DeleteEmitter(const CSfxHandle& handle) { if (!handle) { return;