CModelShaders: Split Thermal into ThermalModel, ThermalStatic extended shaders

This semi-hacky approach will be replaced with future hsh work
This commit is contained in:
Luke Street 2020-12-18 06:07:53 -05:00
parent 1e0bdce5a3
commit 168eb6ac39
11 changed files with 59 additions and 19 deletions

View File

@ -292,7 +292,7 @@ void CModelData::RenderThermal(const zeus::CColor& mulColor, const zeus::CColor&
CModelFlags drawFlags = flags; CModelFlags drawFlags = flags;
drawFlags.x4_color *= mulColor; drawFlags.x4_color *= mulColor;
drawFlags.addColor = addColor; drawFlags.addColor = addColor;
drawFlags.m_extendedShader = EExtendedShader::Thermal; drawFlags.m_extendedShader = EExtendedShader::ThermalModel;
if (x10_animData) { if (x10_animData) {
CSkinnedModel& model = PickAnimatedModel(EWhichModel::ThermalHot); CSkinnedModel& model = PickAnimatedModel(EWhichModel::ThermalHot);

View File

@ -1126,7 +1126,7 @@ void CBooRenderer::DrawSpaceWarp(const zeus::CVector3f& pt, float strength) {
void CBooRenderer::DrawThermalModel(const CModel& model, const zeus::CColor& mulCol, const zeus::CColor& addCol) { void CBooRenderer::DrawThermalModel(const CModel& model, const zeus::CColor& mulCol, const zeus::CColor& addCol) {
SCOPED_GRAPHICS_DEBUG_GROUP("CBooRenderer::DrawThermalModel", zeus::skPurple); SCOPED_GRAPHICS_DEBUG_GROUP("CBooRenderer::DrawThermalModel", zeus::skPurple);
CModelFlags flags; CModelFlags flags;
flags.m_extendedShader = EExtendedShader::Thermal; flags.m_extendedShader = EExtendedShader::ThermalModel;
flags.x4_color = mulCol; flags.x4_color = mulCol;
flags.addColor = addCol; flags.addColor = addCol;
model.UpdateLastFrame(); model.UpdateLastFrame();
@ -1181,6 +1181,7 @@ void CBooRenderer::SetThermal(bool thermal, float level, const zeus::CColor& col
x2f4_thermColor = color; x2f4_thermColor = color;
CDecal::SetMoveRedToAlphaBuffer(false); CDecal::SetMoveRedToAlphaBuffer(false);
CElementGen::SetMoveRedToAlphaBuffer(false); CElementGen::SetMoveRedToAlphaBuffer(false);
m_thermalHotPass = false;
} }
void CBooRenderer::SetThermalColdScale(float scale) { x2f8_thermColdScale = zeus::clamp(0.f, scale, 1.f); } void CBooRenderer::SetThermalColdScale(float scale) { x2f8_thermColdScale = zeus::clamp(0.f, scale, 1.f); }

View File

@ -30,6 +30,7 @@ struct CModelFlags {
u8 x1_matSetIdx = 0; u8 x1_matSetIdx = 0;
EExtendedShader m_extendedShader = EExtendedShader::Lighting; EExtendedShader m_extendedShader = EExtendedShader::Lighting;
bool m_noCull = false; bool m_noCull = false;
bool m_noZTest = false;
bool m_noZWrite = false; bool m_noZWrite = false;
bool m_depthGreater = false; bool m_depthGreater = false;
u16 x2_flags = 0; /* Flags */ u16 x2_flags = 0; /* Flags */
@ -46,7 +47,7 @@ struct CModelFlags {
} }
/* Flags /* Flags
0x1: depth equal 0x1: depth lequal
0x2: depth update 0x2: depth update
0x4: render without texture lock 0x4: render without texture lock
0x8: depth greater 0x8: depth greater

View File

@ -368,7 +368,10 @@ CBooModel::ModelInstance* CBooModel::PushNewModelInstance(int sharedLayoutBuf) {
EExtendedShader idx{}; EExtendedShader idx{};
for (const auto& pipeline : *pipelines) { for (const auto& pipeline : *pipelines) {
if (idx == EExtendedShader::Thermal) { if (idx == EExtendedShader::ThermalModel ||
idx == EExtendedShader::ThermalModelNoZTestNoZWrite ||
idx == EExtendedShader::ThermalStatic ||
idx == EExtendedShader::ThermalStaticNoZWrite) {
texs[8] = g_Renderer->x220_sphereRamp.get(); texs[8] = g_Renderer->x220_sphereRamp.get();
} else if (idx == EExtendedShader::MorphBallShadow) { } else if (idx == EExtendedShader::MorphBallShadow) {
texs[8] = g_Renderer->m_ballShadowId.get(); texs[8] = g_Renderer->m_ballShadowId.get();
@ -576,9 +579,11 @@ static EExtendedShader ResolveExtendedShader(const MaterialSet::Material& data,
EExtendedShader extended = EExtendedShader::Flat; EExtendedShader extended = EExtendedShader::Flat;
if (intermediateExtended == EExtendedShader::Lighting) { if (intermediateExtended == EExtendedShader::Lighting) {
/* Transform lighting into thermal cold if the thermal visor is active */ /* Transform lighting into thermal if the thermal visor is active */
if (g_Renderer->IsThermalVisorHotPass()) if (g_Renderer->IsThermalVisorHotPass())
return noZWrite ? EExtendedShader::LightingAlphaWriteNoZTestNoZWrite : EExtendedShader::LightingAlphaWrite; return flags.m_noZTest
? EExtendedShader::LightingAlphaWriteNoZTestNoZWrite
: (noZWrite ? EExtendedShader::ThermalStaticNoZWrite : EExtendedShader::ThermalStatic);
else if (g_Renderer->IsThermalVisorActive()) else if (g_Renderer->IsThermalVisorActive())
return EExtendedShader::ThermalCold; return EExtendedShader::ThermalCold;
if (data.blendMode == MaterialSet::Material::BlendMaterial::BlendMode::Opaque) { if (data.blendMode == MaterialSet::Material::BlendMaterial::BlendMode::Opaque) {
@ -621,6 +626,8 @@ static EExtendedShader ResolveExtendedShader(const MaterialSet::Material& data,
} else { } else {
extended = EExtendedShader::Lighting; extended = EExtendedShader::Lighting;
} }
} else if (intermediateExtended == EExtendedShader::ThermalModel) {
extended = flags.m_noZTest ? EExtendedShader::ThermalModelNoZTestNoZWrite : EExtendedShader::ThermalModel;
} else if (intermediateExtended < EExtendedShader::MAX) { } else if (intermediateExtended < EExtendedShader::MAX) {
extended = intermediateExtended; extended = intermediateExtended;
} }
@ -810,7 +817,10 @@ void CBooModel::UVAnimationBuffer::Update(u8*& bufOut, const MaterialSet* matSet
} }
std::optional<std::array<zeus::CMatrix4f, 2>> specialMtxOut; std::optional<std::array<zeus::CMatrix4f, 2>> specialMtxOut;
if (flags.m_extendedShader == EExtendedShader::Thermal) { if (flags.m_extendedShader == EExtendedShader::ThermalModel ||
flags.m_extendedShader == EExtendedShader::ThermalModelNoZTestNoZWrite ||
flags.m_extendedShader == EExtendedShader::ThermalStatic ||
flags.m_extendedShader == EExtendedShader::ThermalStaticNoZWrite) {
/* Special Mode0 matrix for exclusive Thermal Visor use */ /* Special Mode0 matrix for exclusive Thermal Visor use */
specialMtxOut.emplace(); specialMtxOut.emplace();
@ -1022,7 +1032,8 @@ boo::ObjToken<boo::IGraphicsBufferD> CBooModel::UpdateUniformData(const CModelFl
u8* dataOut = reinterpret_cast<u8*>(inst->m_uniformBuffer->map(m_uniformDataSize)); u8* dataOut = reinterpret_cast<u8*>(inst->m_uniformBuffer->map(m_uniformDataSize));
u8* dataCur = dataOut; u8* dataCur = dataOut;
if (flags.m_extendedShader == EExtendedShader::Thermal) /* Thermal Model (same as UV Mode 0) */ if (flags.m_extendedShader == EExtendedShader::ThermalModel ||
flags.m_extendedShader == EExtendedShader::ThermalModelNoZTestNoZWrite) /* Thermal Model (same as UV Mode 0) */
{ {
CModelShaders::ThermalUniform& thermalOut = *reinterpret_cast<CModelShaders::ThermalUniform*>(dataCur); CModelShaders::ThermalUniform& thermalOut = *reinterpret_cast<CModelShaders::ThermalUniform*>(dataCur);
thermalOut.mulColor = flags.x4_color; thermalOut.mulColor = flags.x4_color;

View File

@ -86,9 +86,18 @@ static std::array<hecl::Backend::ExtensionSlot, size_t(EExtendedShader::MAX)> g_
/* Normal lit shading */ /* Normal lit shading */
{0, nullptr, hecl::Backend::BlendFactor::Original, hecl::Backend::BlendFactor::Original, {0, nullptr, hecl::Backend::BlendFactor::Original, hecl::Backend::BlendFactor::Original,
hecl::Backend::ZTest::Original, hecl::Backend::CullMode::Backface, false, false, true}, hecl::Backend::ZTest::Original, hecl::Backend::CullMode::Backface, false, false, true},
/* Thermal Visor shading */ /* Thermal model shading */
{1, ThermalTextures.data(), hecl::Backend::BlendFactor::One, hecl::Backend::BlendFactor::One, {1, ThermalTextures.data(), hecl::Backend::BlendFactor::One, hecl::Backend::BlendFactor::One,
hecl::Backend::ZTest::Original, hecl::Backend::CullMode::Backface, false, false, false, true}, hecl::Backend::ZTest::Original, hecl::Backend::CullMode::Backface, false, false, false, true},
/* Thermal model shading without Z-test or Z-write */
{1, ThermalTextures.data(), hecl::Backend::BlendFactor::One, hecl::Backend::BlendFactor::One,
hecl::Backend::ZTest::None, hecl::Backend::CullMode::Backface, true, false, false, true},
/* Thermal static shading */
{0, nullptr, hecl::Backend::BlendFactor::SrcAlpha, hecl::Backend::BlendFactor::One,
hecl::Backend::ZTest::Original, hecl::Backend::CullMode::Backface, false, false, false, true, false, false, true},
/* Thermal static shading without Z-write */
{0, nullptr, hecl::Backend::BlendFactor::SrcAlpha, hecl::Backend::BlendFactor::One,
hecl::Backend::ZTest::Original, hecl::Backend::CullMode::Backface, true, false, false, true, false, false, false},
/* Forced alpha shading */ /* Forced alpha shading */
{0, nullptr, hecl::Backend::BlendFactor::SrcAlpha, hecl::Backend::BlendFactor::InvSrcAlpha, {0, nullptr, hecl::Backend::BlendFactor::SrcAlpha, hecl::Backend::BlendFactor::InvSrcAlpha,
hecl::Backend::ZTest::Original, hecl::Backend::CullMode::Backface, false, false, true}, hecl::Backend::ZTest::Original, hecl::Backend::CullMode::Backface, false, false, true},
@ -166,7 +175,10 @@ static std::array<hecl::Backend::ExtensionSlot, size_t(EExtendedShader::MAX)> g_
constexpr std::array<const char*, size_t(EExtendedShader::MAX)> ShaderMacros{ constexpr std::array<const char*, size_t(EExtendedShader::MAX)> ShaderMacros{
"URDE_LIGHTING", "URDE_LIGHTING",
"URDE_LIGHTING", "URDE_LIGHTING",
"URDE_THERMAL_HOT", "URDE_THERMAL_MODEL",
"URDE_THERMAL_MODEL",
"URDE_THERMAL_STATIC",
"URDE_THERMAL_STATIC",
"URDE_LIGHTING", "URDE_LIGHTING",
"URDE_LIGHTING", "URDE_LIGHTING",
"URDE_SOLID", "URDE_SOLID",

View File

@ -24,7 +24,10 @@ class CLight;
enum class EExtendedShader : uint8_t { enum class EExtendedShader : uint8_t {
Flat, Flat,
Lighting, Lighting,
Thermal, ThermalModel,
ThermalModelNoZTestNoZWrite,
ThermalStatic,
ThermalStaticNoZWrite,
ForcedAlpha, ForcedAlpha,
ForcedAdditive, ForcedAdditive,
SolidColor, SolidColor,

View File

@ -2,6 +2,7 @@
#include <array> #include <array>
#include "Runtime/Graphics/CBooRenderer.hpp"
#include "Runtime/Graphics/CGraphics.hpp" #include "Runtime/Graphics/CGraphics.hpp"
#include "Runtime/Graphics/CTexture.hpp" #include "Runtime/Graphics/CTexture.hpp"

View File

@ -146,7 +146,7 @@ vec3 LightingFunc() {
} }
#endif #endif
#if defined(URDE_THERMAL_HOT) #if defined(URDE_THERMAL_MODEL)
vec3 LightingFunc() { vec3 LightingFunc() {
return vec3(1.0); return vec3(1.0);
} }
@ -156,7 +156,7 @@ UBINDING2 uniform ThermalUniform {
}; };
#endif #endif
#if defined(URDE_THERMAL_COLD) #if defined(URDE_THERMAL_COLD) || defined(URDE_THERMAL_STATIC)
vec3 LightingFunc() { vec3 LightingFunc() {
return vec3(1.0); return vec3(1.0);
} }
@ -268,7 +268,7 @@ vec4 PostFunc(vec4 colorIn) {
} }
#endif #endif
#if defined(URDE_THERMAL_HOT) #if defined(URDE_THERMAL_MODEL)
vec4 PostFunc(vec4 colorIn) { vec4 PostFunc(vec4 colorIn) {
return texture(extTex0, vtf.extUvs[0]).rrrr * tmulColor + taddColor; return texture(extTex0, vtf.extUvs[0]).rrrr * tmulColor + taddColor;
} }
@ -280,6 +280,12 @@ vec4 PostFunc(vec4 colorIn) {
} }
#endif #endif
#if defined(URDE_THERMAL_STATIC)
vec4 PostFunc(vec4 colorIn) {
return colorIn;
}
#endif
#if defined(URDE_SOLID) #if defined(URDE_SOLID)
vec4 PostFunc(vec4 colorIn) { vec4 PostFunc(vec4 colorIn) {
return solidColor; return solidColor;

View File

@ -145,7 +145,7 @@ float3 LightingFunc(in VertToFrag vtf) {
} }
#endif #endif
#if defined(URDE_THERMAL_HOT) #if defined(URDE_THERMAL_MODEL)
float3 LightingFunc(in VertToFrag vtf) { float3 LightingFunc(in VertToFrag vtf) {
return float3(1.0, 1.0, 1.0); return float3(1.0, 1.0, 1.0);
} }
@ -267,7 +267,7 @@ float4 PostFunc(in VertToFrag vtf, float4 colorIn) {
} }
#endif #endif
#if defined(URDE_THERMAL_HOT) #if defined(URDE_THERMAL_MODEL)
float4 PostFunc(in VertToFrag vtf, float4 colorIn) { float4 PostFunc(in VertToFrag vtf, float4 colorIn) {
return extTex0.Sample(samp, vtf.extUvs[0]).rrrr * tmulColor + taddColor; return extTex0.Sample(samp, vtf.extUvs[0]).rrrr * tmulColor + taddColor;
} }

View File

@ -126,7 +126,7 @@ float3 LightingFunc(thread VertToFrag& vtf, constant LightingUniform& lu, textur
} }
#endif #endif
#if defined(URDE_THERMAL_HOT) #if defined(URDE_THERMAL_MODEL)
struct LightingUniform { struct LightingUniform {
float4 tmulColor; float4 tmulColor;
float4 taddColor; float4 taddColor;
@ -251,7 +251,7 @@ float4 PostFunc(thread VertToFrag& vtf, constant LightingUniform& lu,
} }
#endif #endif
#if defined(URDE_THERMAL_HOT) #if defined(URDE_THERMAL_MODEL)
float4 PostFunc(thread VertToFrag& vtf, constant LightingUniform& lu, float4 PostFunc(thread VertToFrag& vtf, constant LightingUniform& lu,
texture2d<float> extTex0, texture2d<float> extTex1, texture2d<float> extTex2, texture2d<float> extTex0, texture2d<float> extTex1, texture2d<float> extTex2,
sampler samp, sampler clampSamp, sampler clampEdgeSamp, float4 colorIn) { sampler samp, sampler clampSamp, sampler clampEdgeSamp, float4 colorIn) {

View File

@ -265,7 +265,12 @@ fragment float4 fmain(VertToFrag vtf [[ stage_in ]],
#srcfac one #srcfac one
#dstfac zero #dstfac zero
#colorwrite false #colorwrite false
#depthtest gequal #alphawrite true
#depthwrite false
#culling none
#depthtest none
#primitive tristrips
#overwritealpha true
#vertex glsl #vertex glsl
layout(location=0) in vec4 posIn; layout(location=0) in vec4 posIn;