2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-12-09 17:07:41 +00:00

Initial fog rendering

This commit is contained in:
Jack Andersen
2016-08-07 18:48:18 -10:00
parent 9b9eed39f4
commit a910ddd912
16 changed files with 335 additions and 92 deletions

View File

@@ -177,33 +177,98 @@ void CAreaRenderOctTree::FindOverlappingModels(std::vector<u32>& out, const zeus
void CGameArea::CAreaFog::SetCurrent() const
{
g_Renderer->SetWorldFog(x0_fogMode, x4_rangeCur[0], x4_rangeCur[1], x1c_colorCur);
}
void CGameArea::CAreaFog::Update(float dt)
{
if (x0_fogMode == ERglFogMode::None)
return;
if (x1c_colorCur == x28_colorTarget && x4_rangeCur == xc_rangeTarget)
return;
float colorDelta = x34_colorDelta * dt;
zeus::CVector2f rangeDelta = x14_rangeDelta * dt;
for (int i=0 ; i<3 ; ++i)
{
float delta = x28_colorTarget[i] - x1c_colorCur[i];
if (std::fabs(delta) <= colorDelta)
{
x1c_colorCur[i] = x28_colorTarget[i];
}
else
{
if (delta < 0.f)
x1c_colorCur[i] -= colorDelta;
else
x1c_colorCur[i] += colorDelta;
}
}
for (int i=0 ; i<2 ; ++i)
{
float delta = xc_rangeTarget[i] - x4_rangeCur[i];
if (std::fabs(delta) <= rangeDelta[i])
{
x4_rangeCur[i] = xc_rangeTarget[i];
}
else
{
if (delta < 0.f)
x4_rangeCur[i] -= rangeDelta[i];
else
x4_rangeCur[i] += rangeDelta[i];
}
}
}
void CGameArea::CAreaFog::RollFogOut(float, float, const zeus::CColor& color)
void CGameArea::CAreaFog::RollFogOut(float rangeDelta, float colorDelta, const zeus::CColor& color)
{
x14_rangeDelta = {rangeDelta, rangeDelta * 2.f};
xc_rangeTarget = {4096.f, 4096.f};
x34_colorDelta = colorDelta;
x28_colorTarget = color;
}
void CGameArea::CAreaFog::FadeFog(ERglFogMode,
void CGameArea::CAreaFog::FadeFog(ERglFogMode mode,
const zeus::CColor& color, const zeus::CVector2f& vec1,
float, const zeus::CVector2f& vec2)
float speed, const zeus::CVector2f& vec2)
{
if (x0_fogMode == ERglFogMode::None)
{
x1c_colorCur = color;
x28_colorTarget = color;
x4_rangeCur = {vec1[1], vec1[1]};
xc_rangeTarget = vec1;
}
else
{
x28_colorTarget = color;
xc_rangeTarget = vec1;
}
x0_fogMode = mode;
x34_colorDelta = speed;
x14_rangeDelta = vec2;
}
void CGameArea::CAreaFog::SetFogExplicit(ERglFogMode, const zeus::CColor& color, const zeus::CVector2f& vec)
void CGameArea::CAreaFog::SetFogExplicit(ERglFogMode mode, const zeus::CColor& color, const zeus::CVector2f& range)
{
x0_fogMode = mode;
x1c_colorCur = color;
x28_colorTarget = color;
x4_rangeCur = range;
xc_rangeTarget = range;
}
bool CGameArea::CAreaFog::IsFogDisabled() const
{
return true;
return x0_fogMode == ERglFogMode::None;
}
void CGameArea::CAreaFog::DisableFog()
{
x0_fogMode = ERglFogMode::None;
}
static std::vector<SObjectTag> ReadDependencyList(CInputStream& in)
@@ -257,38 +322,37 @@ bool CDummyGameArea::IGetScriptingMemoryAlways() const
TAreaId CDummyGameArea::IGetAreaId() const
{
return 0;
return x10_areaId;
}
ResId CDummyGameArea::IGetAreaAssetId() const
{
return 0;
return xc_mrea;
}
bool CDummyGameArea::IIsActive() const
{
return false;
return true;
}
TAreaId CDummyGameArea::IGetAttachedAreaId(int) const
TAreaId CDummyGameArea::IGetAttachedAreaId(int idx) const
{
return 0;
return x44_attachedAreaIndices[idx];
}
u32 CDummyGameArea::IGetNumAttachedAreas() const
{
return 0;
return x44_attachedAreaIndices.size();
}
ResId CDummyGameArea::IGetStringTableAssetId() const
{
return 0;
return x8_nameSTRG;
}
static zeus::CTransform identityXf(zeus::CMatrix3f::skIdentityMatrix3f);
const zeus::CTransform& CDummyGameArea::IGetTM() const
{
return identityXf;
return x14_transform;
}
CGameArea::CGameArea(CInputStream& in, int idx, int mlvlVersion)
@@ -357,24 +421,24 @@ bool CGameArea::IIsActive() const
return false;
}
TAreaId CGameArea::IGetAttachedAreaId(int) const
TAreaId CGameArea::IGetAttachedAreaId(int idx) const
{
return 0;
return x8c_attachedAreaIndices[idx];
}
u32 CGameArea::IGetNumAttachedAreas() const
{
return 0;
return x8c_attachedAreaIndices.size();
}
ResId CGameArea::IGetStringTableAssetId() const
{
return 0;
return x8_nameSTRG;
}
const zeus::CTransform& CGameArea::IGetTM() const
{
return identityXf;
return xc_transform;
}
bool CGameArea::DoesAreaNeedEnvFx() const
@@ -469,17 +533,93 @@ void CGameArea::SetChain(CGameArea* other, int)
{
}
void CGameArea::StartStreamingMainArea()
bool CGameArea::StartStreamingMainArea()
{
if (xf0_24_postConstructed)
return false;
switch (xf4_phase)
{
case Phase::LoadHeader:
{
x110_mreaSecBufs.reserve(3);
AllocNewAreaData(0, 96);
x12c_postConstructed.reset(new CPostConstructed());
xf4_phase = Phase::LoadSecSizes;
break;
}
case Phase::LoadSecSizes:
{
CullDeadAreaRequests();
if (xf8_loadTransactions.size())
break;
MREAHeader header = VerifyHeader();
AllocNewAreaData(x110_mreaSecBufs[0].second, ROUND_UP_32(header.secCount * 4));
xf4_phase = Phase::ReserveSections;
break;
}
case Phase::ReserveSections:
{
CullDeadAreaRequests();
if (xf8_loadTransactions.size())
break;
x110_mreaSecBufs.reserve(GetNumPartSizes() + 2);
x124_secCount = 0;
x128_mreaDataOffset = x110_mreaSecBufs[0].second + x110_mreaSecBufs[1].second;
xf4_phase = Phase::LoadDataSections;
break;
}
case Phase::LoadDataSections:
{
CullDeadAreaRequests();
u32 totalSz = 0;
u32 secCount = GetNumPartSizes();
for (int i=2 ; i<secCount ; ++i)
totalSz += hecl::SBig(reinterpret_cast<u32*>(x110_mreaSecBufs[1].first.get())[i]);
AllocNewAreaData(x128_mreaDataOffset, totalSz);
m_resolvedBufs.reserve(secCount);
m_resolvedBufs.emplace_back(x110_mreaSecBufs[0].first.get(), x110_mreaSecBufs[0].second);
m_resolvedBufs.emplace_back(x110_mreaSecBufs[1].first.get(), x110_mreaSecBufs[1].second);
u32 curOff = 0;
for (int i=2 ; i<secCount ; ++i)
{
u32 size = hecl::SBig(reinterpret_cast<u32*>(x110_mreaSecBufs[1].first.get())[i]);
m_resolvedBufs.emplace_back(x110_mreaSecBufs[2].first.get() + curOff, size);
curOff += size;
}
xf4_phase = Phase::WaitForFinish;
break;
}
case Phase::WaitForFinish:
{
CullDeadAreaRequests();
if (xf8_loadTransactions.size())
break;
return false;
}
default: break;
}
return true;
}
u32 CGameArea::GetNumPartSizes() const
{
return 0;
return hecl::SBig(*reinterpret_cast<u32*>(x110_mreaSecBufs[0].first.get() + 60));
}
void CGameArea::AllocNewAreaData(int, int)
void CGameArea::AllocNewAreaData(int offset, int size)
{
x110_mreaSecBufs.emplace_back(new u8[size], size);
xf8_loadTransactions.push_back(
static_cast<ProjectResourceFactoryBase*>(g_ResFactory)->
LoadResourcePartAsync(SObjectTag{FOURCC('MREA'), x84_mrea}, size, offset,
x110_mreaSecBufs.back().first));
}
void CGameArea::Invalidate(CStateManager& mgr)
@@ -488,6 +628,15 @@ void CGameArea::Invalidate(CStateManager& mgr)
void CGameArea::CullDeadAreaRequests()
{
for (auto it = xf8_loadTransactions.begin() ; it != xf8_loadTransactions.end() ;)
{
if ((*it)->m_complete)
{
it = xf8_loadTransactions.erase(it);
continue;
}
++it;
}
}
void CGameArea::StartStreamIn(CStateManager& mgr)
@@ -629,6 +778,8 @@ void CGameArea::PostConstructArea()
void CGameArea::FillInStaticGeometry()
{
x12c_postConstructed->x4c_insts.clear();
}
void CGameArea::VerifyTokenList(CStateManager& stateMgr)