mirror of
https://github.com/PrimeDecomp/prime.git
synced 2025-08-31 02:10:15 +00:00
Add CFluidPlaneManager
This commit is contained in:
parent
d3012caa5c
commit
d53f80e881
111
src/MetroidPrime/CFluidPlaneManager.cpp
Normal file
111
src/MetroidPrime/CFluidPlaneManager.cpp
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
#include "MetroidPrime/CFluidPlaneManager.hpp"
|
||||||
|
|
||||||
|
#include "MetroidPrime/CRipple.hpp"
|
||||||
|
#include "MetroidPrime/CRippleManager.hpp"
|
||||||
|
#include "MetroidPrime/CStateManager.hpp"
|
||||||
|
#include "MetroidPrime/ScriptObjects/CScriptWater.hpp"
|
||||||
|
|
||||||
|
#include "Kyoto/CResFactory.hpp"
|
||||||
|
#include "Kyoto/CSimplePool.hpp"
|
||||||
|
#include "Kyoto/Math/CMath.hpp"
|
||||||
|
#include "Kyoto/SObjectTag.hpp"
|
||||||
|
#include "MetroidPrime/TCastTo.hpp"
|
||||||
|
#include "MetroidPrime/Tweaks/CTweakGame.hpp"
|
||||||
|
#include "rstl/math.hpp"
|
||||||
|
|
||||||
|
const float CFluidPlane::kRippleIntensityRange = 1.f;
|
||||||
|
|
||||||
|
uint fn_8012F098() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
CFluidPlane::CFluidPlane(const CAssetId texPattern1, const CAssetId texPattern2,
|
||||||
|
const CAssetId texColor, const float alpha, const EFluidType fluidType,
|
||||||
|
const float rippleIntensity, const CFluidUVMotion& motion)
|
||||||
|
: x4_texPattern1Id(texPattern1)
|
||||||
|
, x8_texPattern2Id(texPattern2)
|
||||||
|
, xc_texColorId(texColor)
|
||||||
|
, x40_alpha(alpha)
|
||||||
|
, x44_fluidType(fluidType)
|
||||||
|
, x48_rippleIntensity(rippleIntensity)
|
||||||
|
, x4c_uvMotion(motion) {
|
||||||
|
if (gpResourceFactory->GetResourceTypeById(x4_texPattern1Id) == FourCC('TXTR')) {
|
||||||
|
x10_texPattern1 = gpSimplePool->GetObj(SObjectTag(FourCC('TXTR'), x4_texPattern1Id));
|
||||||
|
}
|
||||||
|
if (gpResourceFactory->GetResourceTypeById(x8_texPattern2Id) == FourCC('TXTR')) {
|
||||||
|
x20_texPattern2 = gpSimplePool->GetObj(SObjectTag(FourCC('TXTR'), x8_texPattern2Id));
|
||||||
|
}
|
||||||
|
if (gpResourceFactory->GetResourceTypeById(xc_texColorId) == FourCC('TXTR')) {
|
||||||
|
x30_texColor = gpSimplePool->GetObj(SObjectTag(FourCC('TXTR'), xc_texColorId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CFluidPlane::~CFluidPlane() {}
|
||||||
|
|
||||||
|
float CFluidPlane::CalculateRippleIntensity(float base) const {
|
||||||
|
float mul;
|
||||||
|
switch (x44_fluidType) {
|
||||||
|
case kFT_NormalWater:
|
||||||
|
mul = gpTweakGame->GetRippleIntensityNormal();
|
||||||
|
break;
|
||||||
|
case kFT_PoisonWater:
|
||||||
|
mul = gpTweakGame->GetRippleIntensityPoison();
|
||||||
|
break;
|
||||||
|
case kFT_Lava:
|
||||||
|
mul = gpTweakGame->GetRippleIntensityLava();
|
||||||
|
break;
|
||||||
|
case kFT_PhazonFluid:
|
||||||
|
case kFT_Four:
|
||||||
|
mul = 0.8f;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
mul = 1.f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
float intensityRange = GetRippleIntensityRange();
|
||||||
|
float ret =
|
||||||
|
base * mul * ((intensityRange * (1.f - x48_rippleIntensity) + 1.f) - (intensityRange * 0.5f));
|
||||||
|
ret = rstl::min_val(rstl::max_val(ret, 0.f), 1.f);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
float CFluidPlane::GetRippleScaleFromKineticEnergy(float baseI, float velDot) {
|
||||||
|
float tmp = CMath::FastSqrtF(0.5f * baseI * velDot * velDot);
|
||||||
|
if (tmp >= 160.f) {
|
||||||
|
return 1.f;
|
||||||
|
}
|
||||||
|
return tmp * (1.f / 160.f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CFluidPlane::AddRipple(const float mag, const TUniqueId rippler, const CVector3f& center,
|
||||||
|
const CScriptWater& water, CStateManager& mgr) {
|
||||||
|
if (!water.CanRippleAtPoint(center)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const float intensity = CalculateRippleIntensity(mag);
|
||||||
|
mgr.FluidPlaneManager()->RippleManager().AddRipple(CRipple(rippler, center, intensity));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CFluidPlane::AddRipple(const float mag, const TUniqueId rippler, const CVector3f& center,
|
||||||
|
const CVector3f& velocity, const CScriptWater& water,
|
||||||
|
CStateManager& mgr, const CVector3f& upVec) {
|
||||||
|
if (!water.CanRippleAtPoint(center)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float intensity = CalculateRippleIntensity(
|
||||||
|
GetRippleScaleFromKineticEnergy(mag, CVector3f::Dot(upVec, velocity)));
|
||||||
|
mgr.FluidPlaneManager()->RippleManager().AddRipple(CRipple(rippler, center, intensity));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CFluidPlane::AddRipple(const CRipple& ripple, const CScriptWater& water, CStateManager& mgr) {
|
||||||
|
if (!water.CanRippleAtPoint(ripple.GetCenter())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mgr.FluidPlaneManager()->RippleManager().AddRipple(ripple);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CFluidPlane::Render(const CStateManager& mgr, const CAABox&, const CFrustumPlanes&,
|
||||||
|
const CRippleManager&, const CVector3f&) {}
|
Loading…
x
Reference in New Issue
Block a user