mirror of https://github.com/AxioDL/metaforce.git
CCubeRenderer: More function implementations
This commit is contained in:
parent
b55c7ebbe4
commit
8bb2f33a45
|
@ -217,7 +217,23 @@ void CCubeRenderer::GenerateReflectionTex() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCubeRenderer::GenerateFogVolumeRampTex() {
|
void CCubeRenderer::GenerateFogVolumeRampTex() {
|
||||||
// TODO
|
constexpr double fogVolFar = 750.0;
|
||||||
|
constexpr double fogVolNear = 0.2;
|
||||||
|
u8* data = x1b8_fogVolumeRamp.Lock();
|
||||||
|
u16 height = x1b8_fogVolumeRamp.GetHeight();
|
||||||
|
u16 width = x1b8_fogVolumeRamp.GetWidth();
|
||||||
|
for (size_t y = 0; y < height; ++y) {
|
||||||
|
for (size_t x = 0; x < width; ++x) {
|
||||||
|
const int tmp = int(y << 16 | x << 8 | 0x7f);
|
||||||
|
const double a =
|
||||||
|
zeus::clamp(0.0,
|
||||||
|
(-150.0 / (tmp / double(0xffffff) * (fogVolFar - fogVolNear) - fogVolFar) - fogVolNear) * 3.0 /
|
||||||
|
(fogVolFar - fogVolNear),
|
||||||
|
1.0);
|
||||||
|
data[y * width + x] = (a * a + a) / 2.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
x1b8_fogVolumeRamp.UnLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCubeRenderer::GenerateSphereRampTex() {
|
void CCubeRenderer::GenerateSphereRampTex() {
|
||||||
|
@ -231,7 +247,7 @@ void CCubeRenderer::GenerateSphereRampTex() {
|
||||||
(static_cast<float>(x) - halfRes) / halfRes,
|
(static_cast<float>(x) - halfRes) / halfRes,
|
||||||
(static_cast<float>(y) - halfRes) / halfRes,
|
(static_cast<float>(y) - halfRes) / halfRes,
|
||||||
};
|
};
|
||||||
data[y * height + x] = 255 - zeus::clamp(0.f, vec.canBeNormalized() ? vec.magnitude() : 0.f, 1.f) * 255;
|
data[y * width + x] = 255 - zeus::clamp(0.f, vec.canBeNormalized() ? vec.magnitude() : 0.f, 1.f) * 255;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
x220_sphereRamp.UnLock();
|
x220_sphereRamp.UnLock();
|
||||||
|
@ -255,7 +271,7 @@ void CCubeRenderer::ReallyDrawPhazonSuitEffect(const zeus::CColor& modColor, CTe
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCubeRenderer::DoPhazonSuitIndirectAlphaBlur(float blurRadius, float f2, const TLockedToken<CTexture>& indTex) {
|
void CCubeRenderer::DoPhazonSuitIndirectAlphaBlur(float blurRadius, float f2) {
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -526,7 +542,33 @@ void CCubeRenderer::RenderBucketItems(const CAreaListItem* item) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCubeRenderer::PostRenderFogs() {
|
void CCubeRenderer::PostRenderFogs() {
|
||||||
// TODO
|
for (const auto& warp : x2c4_spaceWarps) {
|
||||||
|
ReallyDrawSpaceWarp(warp.first, warp.second);
|
||||||
|
}
|
||||||
|
x2c4_spaceWarps.clear();
|
||||||
|
|
||||||
|
x2ac_fogVolumes.sort([](const CFogVolumeListItem& a, const CFogVolumeListItem& b) {
|
||||||
|
zeus::CAABox aabbA = a.x34_aabb.getTransformedAABox(a.x0_transform);
|
||||||
|
bool insideA =
|
||||||
|
aabbA.pointInside(zeus::CVector3f(CGraphics::g_ViewPoint.x(), CGraphics::g_ViewPoint.y(), aabbA.min.z()));
|
||||||
|
|
||||||
|
zeus::CAABox aabbB = b.x34_aabb.getTransformedAABox(b.x0_transform);
|
||||||
|
bool insideB =
|
||||||
|
aabbB.pointInside(zeus::CVector3f(CGraphics::g_ViewPoint.x(), CGraphics::g_ViewPoint.y(), aabbB.min.z()));
|
||||||
|
|
||||||
|
if (insideA != insideB) {
|
||||||
|
return insideA;
|
||||||
|
}
|
||||||
|
|
||||||
|
float dotA = aabbA.furthestPointAlongVector(CGraphics::g_ViewMatrix.basis[1]).dot(CGraphics::g_ViewMatrix.basis[1]);
|
||||||
|
float dotB = aabbB.furthestPointAlongVector(CGraphics::g_ViewMatrix.basis[1]).dot(CGraphics::g_ViewMatrix.basis[1]);
|
||||||
|
return dotA < dotB;
|
||||||
|
});
|
||||||
|
for (const CFogVolumeListItem& fog : x2ac_fogVolumes) {
|
||||||
|
CGraphics::SetModelMatrix(fog.x0_transform);
|
||||||
|
ReallyRenderFogVolume(fog.x30_color, fog.x34_aabb, fog.x4c_model.GetObj(), fog.x5c_skinnedModel);
|
||||||
|
}
|
||||||
|
x2ac_fogVolumes.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCubeRenderer::SetModelMatrix(const zeus::CTransform& xf) { CGraphics::SetModelMatrix(xf); }
|
void CCubeRenderer::SetModelMatrix(const zeus::CTransform& xf) { CGraphics::SetModelMatrix(xf); }
|
||||||
|
@ -714,11 +756,12 @@ void CCubeRenderer::BeginScene() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
x318_27_currentRGBA6 = x318_26_requestRGBA6;
|
||||||
if (!x318_31_persistRGBA6) {
|
if (!x318_31_persistRGBA6) {
|
||||||
x318_26_requestRGBA6 = false;
|
x318_26_requestRGBA6 = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// GXSetPixelFmt(x318_26_requestRGBA6, GX_ZC_LINEAR);
|
// GXSetPixelFmt(x318_27_currentRGBA6, GX_ZC_LINEAR);
|
||||||
GXSetAlphaUpdate(true);
|
GXSetAlphaUpdate(true);
|
||||||
GXSetDstAlpha(true, 0.f);
|
GXSetDstAlpha(true, 0.f);
|
||||||
CGraphics::BeginScene();
|
CGraphics::BeginScene();
|
||||||
|
@ -808,7 +851,9 @@ void CCubeRenderer::CacheReflection(IRenderer::TReflectionCallback cb, void* ctx
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCubeRenderer::DrawSpaceWarp(const zeus::CVector3f& pt, float strength) {
|
void CCubeRenderer::DrawSpaceWarp(const zeus::CVector3f& pt, float strength) {
|
||||||
// TODO
|
if (pt.z() < 1.f) {
|
||||||
|
ReallyDrawSpaceWarp(pt, strength);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCubeRenderer::DrawThermalModel(CModel& model, const zeus::CColor& multCol, const zeus::CColor& addCol,
|
void CCubeRenderer::DrawThermalModel(CModel& model, const zeus::CColor& multCol, const zeus::CColor& addCol,
|
||||||
|
@ -868,7 +913,8 @@ void CCubeRenderer::DrawModelFlat(CModel& model, const CModelFlags& flags, bool
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCubeRenderer::SetWireframeFlags(s32 flags) {
|
void CCubeRenderer::SetWireframeFlags(s32 flags) {
|
||||||
// TODO
|
CCubeModel::SetModelWireframe((flags & 0x1) != 0);
|
||||||
|
x318_25_drawWireframe = (flags & 0x2) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCubeRenderer::SetWorldFog(ERglFogMode mode, float startz, float endz, const zeus::CColor& color) {
|
void CCubeRenderer::SetWorldFog(ERglFogMode mode, float startz, float endz, const zeus::CColor& color) {
|
||||||
|
@ -877,7 +923,9 @@ void CCubeRenderer::SetWorldFog(ERglFogMode mode, float startz, float endz, cons
|
||||||
|
|
||||||
void CCubeRenderer::RenderFogVolume(const zeus::CColor& color, const zeus::CAABox& aabb,
|
void CCubeRenderer::RenderFogVolume(const zeus::CColor& color, const zeus::CAABox& aabb,
|
||||||
const TLockedToken<CModel>* model, const CSkinnedModel* sModel) {
|
const TLockedToken<CModel>* model, const CSkinnedModel* sModel) {
|
||||||
// TODO
|
if (!x318_28_disableFog) {
|
||||||
|
x2ac_fogVolumes.emplace_back(CGraphics::g_GXModelMatrix, color, aabb, model, sModel);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCubeRenderer::SetThermal(bool thermal, float level, const zeus::CColor& color) {
|
void CCubeRenderer::SetThermal(bool thermal, float level, const zeus::CColor& color) {
|
||||||
|
@ -1112,13 +1160,37 @@ void CCubeRenderer::PrepareDynamicLights(const std::vector<CLight>& lights) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCubeRenderer::AllocatePhazonSuitMaskTexture() {
|
void CCubeRenderer::AllocatePhazonSuitMaskTexture() {
|
||||||
// TODO
|
x318_26_requestRGBA6 = true;
|
||||||
|
if (!x314_phazonSuitMask) {
|
||||||
|
x314_phazonSuitMask = std::make_unique<CTexture>(ETexelFormat::I8, CGraphics::GetViewportWidth() / 4,
|
||||||
|
CGraphics::GetViewportHeight() / 4, 1, "Phazon Suit Mask"sv);
|
||||||
|
}
|
||||||
|
x310_phazonSuitMaskCountdown = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCubeRenderer::DrawPhazonSuitIndirectEffect(const zeus::CColor& nonIndirectMod,
|
void CCubeRenderer::DrawPhazonSuitIndirectEffect(const zeus::CColor& nonIndirectMod,
|
||||||
const TLockedToken<CTexture>& indTex, const zeus::CColor& indirectMod,
|
const TLockedToken<CTexture>& indTex, const zeus::CColor& indirectMod,
|
||||||
float blurRadius, float scale, float offX, float offY) {
|
float blurRadius, float scale, float offX, float offY) {
|
||||||
// TODO
|
if (x318_27_currentRGBA6 && x310_phazonSuitMaskCountdown != 0) {
|
||||||
|
const auto backupViewMatrix = CGraphics::g_ViewMatrix;
|
||||||
|
const auto backupProjectionState = CGraphics::GetProjectionState();
|
||||||
|
if (!x314_phazonSuitMask || x314_phazonSuitMask->GetWidth() != CGraphics::GetViewportWidth() / 4 ||
|
||||||
|
x314_phazonSuitMask->GetHeight() != CGraphics::GetViewportHeight() / 4) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DoPhazonSuitIndirectAlphaBlur(blurRadius, blurRadius);
|
||||||
|
// TODO copy into x314_phazonSuitMask
|
||||||
|
if (indTex) {
|
||||||
|
ReallyDrawPhazonSuitIndirectEffect(zeus::skWhite, *x314_phazonSuitMask, const_cast<CTexture&>(*indTex),
|
||||||
|
indirectMod, scale, offX, offY);
|
||||||
|
} else {
|
||||||
|
ReallyDrawPhazonSuitEffect(nonIndirectMod, *x314_phazonSuitMask);
|
||||||
|
}
|
||||||
|
// TODO unlock x314
|
||||||
|
CGraphics::SetViewPointMatrix(backupViewMatrix);
|
||||||
|
CGraphics::SetProjectionState(backupProjectionState);
|
||||||
|
x310_phazonSuitMaskCountdown = 2;
|
||||||
|
}
|
||||||
GXSetDstAlpha(false, 0.f);
|
GXSetDstAlpha(false, 0.f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1132,15 +1204,21 @@ CCubeRenderer::FindStaticGeometry(const std::vector<CMetroidModelInstance>* geom
|
||||||
[&](const CAreaListItem& item) { return item.x0_geometry == geometry; });
|
[&](const CAreaListItem& item) { return item.x0_geometry == geometry; });
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCubeRenderer::FindOverlappingWorldModels(std::vector<u32>& modelBits, const zeus::CAABox& aabb) const {}
|
void CCubeRenderer::FindOverlappingWorldModels(std::vector<u32>& modelBits, const zeus::CAABox& aabb) const {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
s32 CCubeRenderer::DrawOverlappingWorldModelIDs(s32 alphaVal, const std::vector<u32>& modelBits,
|
s32 CCubeRenderer::DrawOverlappingWorldModelIDs(s32 alphaVal, const std::vector<u32>& modelBits,
|
||||||
const zeus::CAABox& aabb) {
|
const zeus::CAABox& aabb) {
|
||||||
SetupRendererStates(true);
|
SetupRendererStates(true);
|
||||||
|
// TODO
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCubeRenderer::DrawOverlappingWorldModelShadows(s32 alphaVal, const std::vector<u32>& modelBits,
|
void CCubeRenderer::DrawOverlappingWorldModelShadows(s32 alphaVal, const std::vector<u32>& modelBits,
|
||||||
const zeus::CAABox& aabb, float alpha) {}
|
const zeus::CAABox& aabb, float alpha) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
void CCubeRenderer::SetupCGraphicsState() {
|
void CCubeRenderer::SetupCGraphicsState() {
|
||||||
CGraphics::DisableAllLights();
|
CGraphics::DisableAllLights();
|
||||||
|
@ -1193,6 +1271,16 @@ void CCubeRenderer::DoThermalModelDraw(CCubeModel& model, const zeus::CColor& mu
|
||||||
CGX::SetZMode(flags.x2_flags.IsSet(CModelFlagBits::DepthTest), GX::LEQUAL,
|
CGX::SetZMode(flags.x2_flags.IsSet(CModelFlagBits::DepthTest), GX::LEQUAL,
|
||||||
flags.x2_flags.IsSet(CModelFlagBits::DepthUpdate));
|
flags.x2_flags.IsSet(CModelFlagBits::DepthUpdate));
|
||||||
model.DrawFlat(positions, normals,
|
model.DrawFlat(positions, normals,
|
||||||
flags.x2_flags.IsSet(CModelFlagBits::Unknown1) ? ESurfaceSelection::Unsorted : ESurfaceSelection::All);
|
flags.x2_flags.IsSet(CModelFlagBits::ThermalUnsortedOnly) ? ESurfaceSelection::Unsorted
|
||||||
|
: ESurfaceSelection::All);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCubeRenderer::ReallyDrawSpaceWarp(const zeus::CVector3f& pt, float strength) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCubeRenderer::ReallyRenderFogVolume(const zeus::CColor& color, const zeus::CAABox& aabb, const CModel* model,
|
||||||
|
const CSkinnedModel* sModel) {
|
||||||
|
// TODO
|
||||||
}
|
}
|
||||||
} // namespace metaforce
|
} // namespace metaforce
|
||||||
|
|
|
@ -102,7 +102,10 @@ private:
|
||||||
void ReallyDrawPhazonSuitIndirectEffect(const zeus::CColor& vertColor, CTexture& maskTex, CTexture& indTex,
|
void ReallyDrawPhazonSuitIndirectEffect(const zeus::CColor& vertColor, CTexture& maskTex, CTexture& indTex,
|
||||||
const zeus::CColor& modColor, float scale, float offX, float offY);
|
const zeus::CColor& modColor, float scale, float offX, float offY);
|
||||||
void ReallyDrawPhazonSuitEffect(const zeus::CColor& modColor, CTexture& maskTex);
|
void ReallyDrawPhazonSuitEffect(const zeus::CColor& modColor, CTexture& maskTex);
|
||||||
void DoPhazonSuitIndirectAlphaBlur(float blurRadius, float f2, const TLockedToken<CTexture>& indTex);
|
void DoPhazonSuitIndirectAlphaBlur(float blurRadius, float f2);
|
||||||
|
void ReallyDrawSpaceWarp(const zeus::CVector3f& pt, float strength);
|
||||||
|
void ReallyRenderFogVolume(const zeus::CColor& color, const zeus::CAABox& aabb, const CModel* model,
|
||||||
|
const CSkinnedModel* sModel);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CCubeRenderer(IObjectStore& store, IFactory& resFac);
|
CCubeRenderer(IObjectStore& store, IFactory& resFac);
|
||||||
|
|
|
@ -20,7 +20,7 @@ enum class CModelFlagBits : u16 {
|
||||||
DepthGreater = 0x8,
|
DepthGreater = 0x8,
|
||||||
DepthNonInclusive = 0x10,
|
DepthNonInclusive = 0x10,
|
||||||
DrawNormal = 0x20,
|
DrawNormal = 0x20,
|
||||||
Unknown1 = 0x40,
|
ThermalUnsortedOnly = 0x40,
|
||||||
};
|
};
|
||||||
using CModelFlagsFlags = Flags<CModelFlagBits>;
|
using CModelFlagsFlags = Flags<CModelFlagBits>;
|
||||||
|
|
||||||
|
|
|
@ -617,9 +617,9 @@ void CRidley::PreRender(CStateManager& mgr, const zeus::CFrustum& frustum) {
|
||||||
CPlayerState::EPlayerVisor r28 = mgr.GetPlayerState()->GetActiveVisor(mgr);
|
CPlayerState::EPlayerVisor r28 = mgr.GetPlayerState()->GetActiveVisor(mgr);
|
||||||
bool atLastMat = GetModelData()->GetNumMaterialSets() == (matSet + 1);
|
bool atLastMat = GetModelData()->GetNumMaterialSets() == (matSet + 1);
|
||||||
if (r28 == CPlayerState::EPlayerVisor::Thermal && atLastMat) {
|
if (r28 == CPlayerState::EPlayerVisor::Thermal && atLastMat) {
|
||||||
xb4_drawFlags.x2_flags |= CModelFlagBits::Unknown1;
|
xb4_drawFlags.x2_flags |= CModelFlagBits::ThermalUnsortedOnly;
|
||||||
} else {
|
} else {
|
||||||
xb4_drawFlags.x2_flags &= CModelFlagBits::Unknown1;
|
xb4_drawFlags.x2_flags &= CModelFlagBits::ThermalUnsortedOnly;
|
||||||
}
|
}
|
||||||
xb4_drawFlags.x1_matSetIdx = matSet;
|
xb4_drawFlags.x1_matSetIdx = matSet;
|
||||||
|
|
||||||
|
|
|
@ -1616,6 +1616,7 @@ void CMorphBall::PreRender(CStateManager& mgr, const zeus::CFrustum& frustum) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SCOPED_GRAPHICS_DEBUG_GROUP("CMorphBall::PreRender", zeus::skBlue);
|
||||||
x0_player.GetActorLights()->SetFindShadowLight(x1e44_damageEffect < 0.25f);
|
x0_player.GetActorLights()->SetFindShadowLight(x1e44_damageEffect < 0.25f);
|
||||||
x0_player.GetActorLights()->SetShadowDynamicRangeThreshold(0.05f);
|
x0_player.GetActorLights()->SetShadowDynamicRangeThreshold(0.05f);
|
||||||
x0_player.GetActorLights()->SetDirty();
|
x0_player.GetActorLights()->SetDirty();
|
||||||
|
|
|
@ -21,13 +21,14 @@ void CMorphBallShadow::GatherAreas(const CStateManager& mgr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMorphBallShadow::RenderIdBuffer(const zeus::CAABox& aabb, const CStateManager& mgr, CPlayer& player) {
|
void CMorphBallShadow::RenderIdBuffer(const zeus::CAABox& aabb, const CStateManager& mgr, CPlayer& player) {
|
||||||
|
SCOPED_GRAPHICS_DEBUG_GROUP("CMorphBallShadow::RenderIdBuffer", zeus::skBlue);
|
||||||
xb8_shadowVolume = aabb;
|
xb8_shadowVolume = aabb;
|
||||||
x0_actors.clear();
|
x0_actors.clear();
|
||||||
x18_areas.clear();
|
x18_areas.clear();
|
||||||
x30_worldModelBits.clear();
|
x30_worldModelBits.clear();
|
||||||
g_Renderer->x318_26_requestRGBA6 = true;
|
g_Renderer->x318_26_requestRGBA6 = true;
|
||||||
|
|
||||||
if (!g_Renderer->x318_27_currentRGBA6) {
|
if (true /* TODO */ || !g_Renderer->x318_27_currentRGBA6) {
|
||||||
xd0_hasIds = false;
|
xd0_hasIds = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -386,7 +386,6 @@ void CScriptPlayerActor::PreRender(CStateManager& mgr, const zeus::CFrustum& fru
|
||||||
if (x2e8_suitRes.GetCharacterNodeId() == 3) {
|
if (x2e8_suitRes.GetCharacterNodeId() == 3) {
|
||||||
g_Renderer->AllocatePhazonSuitMaskTexture();
|
g_Renderer->AllocatePhazonSuitMaskTexture();
|
||||||
}
|
}
|
||||||
// TODO xb4_drawFlags.m_extendedShader = EExtendedShader::LightingCubeReflection;
|
|
||||||
CScriptActor::PreRender(mgr, frustum);
|
CScriptActor::PreRender(mgr, frustum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue