diff --git a/Runtime/Graphics/CCubeRenderer.cpp b/Runtime/Graphics/CCubeRenderer.cpp index c966df2f2..e4014a8a2 100644 --- a/Runtime/Graphics/CCubeRenderer.cpp +++ b/Runtime/Graphics/CCubeRenderer.cpp @@ -315,13 +315,7 @@ void CCubeRenderer::AddStaticGeometry(const std::vector* } void CCubeRenderer::EnablePVS(const CPVSVisSet& set, u32 areaIdx) { - if (!xdc_) { - xc8_pvs.emplace(set); - xdc_ = true; - } else { - xc8_pvs.emplace(set); - } - + xc8_pvs.emplace(set); xe0_pvsAreaIdx = areaIdx; } diff --git a/Runtime/Graphics/CCubeRenderer.hpp b/Runtime/Graphics/CCubeRenderer.hpp index 7c0a96a97..75b64fa5f 100644 --- a/Runtime/Graphics/CCubeRenderer.hpp +++ b/Runtime/Graphics/CCubeRenderer.hpp @@ -61,8 +61,8 @@ private: void* xac_drawableCallbackUserData = nullptr; zeus::CPlane xb0_viewPlane{0.f, 1.f, 0.f, 0.f}; enum class EPVSMode : u8 { Mask, PVS, PVSAndMask } xc0_pvsMode = EPVSMode::Mask; + int xc4_; // ? std::optional xc8_pvs; - bool xdc_{}; u32 xe0_pvsAreaIdx = UINT32_MAX; CTexture xe4_blackTex{ETexelFormat::RGB565, 4, 4, 1, "Black Texture"}; std::unique_ptr x14c_reflectionTex; diff --git a/Runtime/Particle/CDecal.cpp b/Runtime/Particle/CDecal.cpp index a36ade61e..2f3c65632 100644 --- a/Runtime/Particle/CDecal.cpp +++ b/Runtime/Particle/CDecal.cpp @@ -256,6 +256,9 @@ void CDecal::RenderMdl() { desc.x38_DMDL->Draw(flags); } } + + CGraphics::SetCullMode(ERglCullMode::Front); + CTevCombiners::ResetStates(); } void CDecal::Render() { diff --git a/Runtime/World/CPlayer.cpp b/Runtime/World/CPlayer.cpp index 1c6046c67..0d6e1672a 100644 --- a/Runtime/World/CPlayer.cpp +++ b/Runtime/World/CPlayer.cpp @@ -976,7 +976,9 @@ void CPlayer::FluidFXThink(EFluidState state, CScriptWater& water, CStateManager case EFluidState::EnteredFluid: { bool doSplash = true; if (x4fc_flatMoveSpeed > 12.5f) { - const zeus::CVector3f lookDir = x34_transform.basis[1].normalized(); + zeus::CVector3f lookDir = x34_transform.basis[1]; + lookDir.z() = 0.f; + lookDir.normalize(); zeus::CVector3f dcVel = GetDampedClampedVelocityWR(); dcVel.z() = 0.f; if (lookDir.dot(dcVel.normalized()) > 0.75f) { @@ -1806,23 +1808,23 @@ void CPlayer::ProcessInput(const CFinalInput& input, CStateManager& mgr) { if (GetFrozenState()) { UpdateFrozenState(input, mgr); - } - if (GetFrozenState()) { - if (x258_movementState == EPlayerMovementState::OnGround || - x258_movementState == EPlayerMovementState::FallingMorphed) { + if (GetFrozenState()) { + if (x258_movementState == EPlayerMovementState::OnGround || + x258_movementState == EPlayerMovementState::FallingMorphed) { + return; + } + + const CFinalInput dummyInput; + if (x2f8_morphBallState == EPlayerMorphBallState::Morphed) { + x768_morphball->ComputeBallMovement(dummyInput, mgr, input.DeltaTime()); + x768_morphball->UpdateBallDynamics(mgr, input.DeltaTime()); + } else { + ComputeMovement(dummyInput, mgr, input.DeltaTime()); + } + return; } - - const CFinalInput dummyInput; - if (x2f8_morphBallState == EPlayerMorphBallState::Morphed) { - x768_morphball->ComputeBallMovement(dummyInput, mgr, input.DeltaTime()); - x768_morphball->UpdateBallDynamics(mgr, input.DeltaTime()); - } else { - ComputeMovement(dummyInput, mgr, input.DeltaTime()); - } - - return; } if (x760_controlsFrozen) { @@ -2125,7 +2127,7 @@ void CPlayer::Freeze(CStateManager& stateMgr, CAssetId steamTxtr, u16 sfx, CAsse } if (showMsg) { - const char16_t* msg = g_MainStringTable->GetString(int(x2f8_morphBallState >= EPlayerMorphBallState::Morphed) + 19); + const char16_t* msg = g_MainStringTable->GetString(x2f8_morphBallState != EPlayerMorphBallState::Morphed ? 19 : 20); const CHUDMemoParms parms(5.f, true, false, false); MP1::CSamusHud::DisplayHudMemo(msg, parms); } @@ -2610,7 +2612,7 @@ void CPlayer::Think(float dt, CStateManager& mgr) { x2b0_outOfWaterTicks += 1; } - x9c5_24_ = x9c4_24_visorChangeRequested; + x9c5_24_ = x9c4_31_inWaterMovement; x9c4_31_inWaterMovement = x9c5_25_splashUpdated; x9c5_25_splashUpdated = false; UpdateBombJumpStuff(); @@ -3060,15 +3062,16 @@ void CPlayer::UpdateGunState(const CFinalInput& input, CStateManager& mgr) { bool needsDraw = false; if (ControlMapper::GetDigitalInput(ControlMapper::ECommands::FireOrBomb, input) || ControlMapper::GetDigitalInput(ControlMapper::ECommands::MissileOrPowerBomb, input) || - x3b8_grappleState == EGrappleState::None || - (g_tweakPlayer->GetGunButtonTogglesHolster() && - ControlMapper::GetPressInput(ControlMapper::ECommands::ToggleHolster, input))) { + x3b8_grappleState == EGrappleState::None) { + needsDraw = true; + } else if (g_tweakPlayer->GetGunButtonTogglesHolster() && + ControlMapper::GetPressInput(ControlMapper::ECommands::ToggleHolster, input)) { needsDraw = true; } - if (x3b8_grappleState == EGrappleState::None && - (mgr.GetPlayerState()->GetCurrentVisor() == CPlayerState::EPlayerVisor::Scan || - mgr.GetPlayerState()->GetTransitioningVisor() == CPlayerState::EPlayerVisor::Scan)) { + if (x3b8_grappleState != EGrappleState::None || + mgr.GetPlayerState()->GetCurrentVisor() == CPlayerState::EPlayerVisor::Scan || + mgr.GetPlayerState()->GetTransitioningVisor() == CPlayerState::EPlayerVisor::Scan) { needsDraw = false; } @@ -3205,7 +3208,7 @@ void CPlayer::UpdateGunTransform(const zeus::CVector3f& gunPos, CStateManager& m viewGunPos = camXf.rotate(gunPos - zeus::CVector3f(0.f, 0.f, eyeHeight)) + GetEyePosition(); } - const zeus::CUnitVector3f rightDir(gunXf.basis[0]); + const zeus::CUnitVector3f rightDir(camXf.basis[0]); gunXf.origin = viewGunPos; switch (x498_gunHolsterState) { @@ -5500,11 +5503,11 @@ zeus::CVector3f CPlayer::CalculateLeftStickEdgePosition(float strafeInput, float } if (forwardInput < 0.f) { - f29 = -0.555f; + f29 = -f29; } const float f4 = zeus::clamp(-1.f, std::atan(std::fabs(forwardInput) / std::fabs(strafeInput)) / (M_PIF / 4.f), 1.f); - return zeus::CVector3f(f30 - f31, f29, 0.f) * f4 + zeus::CVector3f(f31, 0.f, 0.f); + return zeus::CVector3f(f31, 0.f, 0.f) + f4 * (zeus::CVector3f(f30, f29, 0.f) - zeus::CVector3f(f31, 0.f, 0.f)); } bool CPlayer::SidewaysDashAllowed(float strafeInput, float forwardInput, const CFinalInput& input, @@ -6204,11 +6207,10 @@ void CPlayer::DecrementEnvironmentDamage() { } void CPlayer::IncrementEnvironmentDamage() { - if (xa10_envDmgCounter != 0) { - xa10_envDmgCounter++; - } else { + if (xa10_envDmgCounter == 0) { xa14_envDmgCameraShakeTimer = 0.f; } + xa10_envDmgCounter++; } bool CPlayer::CheckSubmerged() const { diff --git a/Runtime/World/CPlayer.hpp b/Runtime/World/CPlayer.hpp index cda4c266c..98c15e1a1 100644 --- a/Runtime/World/CPlayer.hpp +++ b/Runtime/World/CPlayer.hpp @@ -154,7 +154,7 @@ private: u32 x2d0_curAcceleration = 1; float x2d4_accelerationChangeTimer = 0.f; zeus::CAABox x2d8_fpBounds; - float x2f0_ballTransHeight = 0.f; + float x2f0_ballTransHeight = 1.f; EPlayerCameraState x2f4_cameraState = EPlayerCameraState::FirstPerson; EPlayerMorphBallState x2f8_morphBallState = EPlayerMorphBallState::Unmorphed; EPlayerMorphBallState x2fc_spawnedMorphBallState = EPlayerMorphBallState::Unmorphed; @@ -223,7 +223,7 @@ private: zeus::CVector3f x500_lookDir = x34_transform.basis[1]; zeus::CVector3f x50c_moveDir = x34_transform.basis[1]; zeus::CVector3f x518_leaveMorphDir = x34_transform.basis[1]; - zeus::CVector3f x524_lastPosForDirCalc = x34_transform.basis[1]; + zeus::CVector3f x524_lastPosForDirCalc = x34_transform.origin; zeus::CVector3f x530_gunDir = x34_transform.basis[1]; float x53c_timeMoving = 0.f; zeus::CVector3f x540_controlDir = x34_transform.basis[1];