From cf8d6a0cd710bbfc828442b2ff3ab0965465fd09 Mon Sep 17 00:00:00 2001 From: Tim <15017472+doodlum@users.noreply.github.com> Date: Sat, 12 Jul 2025 23:18:34 +0100 Subject: [PATCH 1/6] fix(extended translucency): only enable on alpha blended materials --- src/Features/ExtendedTranslucency.cpp | 37 ++++++++++++++++----------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/src/Features/ExtendedTranslucency.cpp b/src/Features/ExtendedTranslucency.cpp index 6bf210db1e..d51f64ec31 100644 --- a/src/Features/ExtendedTranslucency.cpp +++ b/src/Features/ExtendedTranslucency.cpp @@ -23,23 +23,30 @@ void ExtendedTranslucency::BSLightingShader_SetupGeometry(RE::BSRenderPass* pass { globals::state->currentExtraFeatureDescriptor &= ~(ExtraFeatureDescriptorMask << ExtraFeatureDescriptorShift); // TODO: PERFORMANCE: Caching the feature descriptor in map if this get more complex - if (auto* data = pass->geometry->GetExtraData(NiExtraDataName_AnisotropicAlphaMaterial)) { - static const REL::Relocation NiIntegerExtraDataRTTI{ RE::NiIntegerExtraData::Ni_RTTI }; - // netimmerse_cast(data) seems not working here - if (data->GetRTTI() == NiIntegerExtraDataRTTI.get()) { - uint32_t material = static_cast(static_cast(data)->value) & ExtraFeatureDescriptorMask; - if (material == MaterialModel::Disabled) { - // MaterialModel::Disabled (0) is the flag when this extra does not exist - // And it will let the effect use default settings instead of force disable it - // Ensure this is disabled by using the ForceDisabled flag - material = MaterialModel::ForceDisabled; + auto& unknownProperty = pass->geometry->GetGeometryRuntimeData().properties[RE::BSGeometry::States::kProperty]; + static const REL::Relocation NiAlphaPropertyRTTI{ RE::NiAlphaProperty::Ni_RTTI }; + auto alphaProperty = unknownProperty->GetRTTI() == NiAlphaPropertyRTTI.get() ? static_cast(unknownProperty.get()) : nullptr; + // Check alpha property exists and blending is enabled + if (alphaProperty && alphaProperty->GetAlphaBlending()){ + if (auto* data = pass->geometry->GetExtraData(NiExtraDataName_AnisotropicAlphaMaterial)) { + static const REL::Relocation NiIntegerExtraDataRTTI{ RE::NiIntegerExtraData::Ni_RTTI }; + if (data->GetRTTI() == NiIntegerExtraDataRTTI.get()) { + uint32_t material = static_cast(static_cast(data)->value) & ExtraFeatureDescriptorMask; + if (material == MaterialModel::Disabled) { + // MaterialModel::Disabled (0) is the flag when this extra does not exist + // And it will let the effect use default settings instead of force disable it + // Ensure this is disabled by using the ForceDisabled flag + material = MaterialModel::ForceDisabled; + } + globals::state->currentExtraFeatureDescriptor |= (material << ExtraFeatureDescriptorShift); + + // TODO: Per-material settings from Nif + // Mods supporting this feature should adjust their alpha value in texture already + // And the texture should be adjusted based on full strength param } - globals::state->currentExtraFeatureDescriptor |= (material << ExtraFeatureDescriptorShift); - - // TODO: Per-material settings from Nif - // Mods supporting this feature should adjust their alpha value in texture already - // And the texture should be adjusted based on full strength param } + } else { + globals::state->currentExtraFeatureDescriptor |= ((MaterialModel::ForceDisabled) << ExtraFeatureDescriptorShift); } } From 3b93cc803923cbb1dd03d91b389733603866d7ee Mon Sep 17 00:00:00 2001 From: Tim <15017472+doodlum@users.noreply.github.com> Date: Sat, 12 Jul 2025 23:25:22 +0100 Subject: [PATCH 2/6] fix: crash --- src/Features/ExtendedTranslucency.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Features/ExtendedTranslucency.cpp b/src/Features/ExtendedTranslucency.cpp index d51f64ec31..9ba642cd31 100644 --- a/src/Features/ExtendedTranslucency.cpp +++ b/src/Features/ExtendedTranslucency.cpp @@ -25,7 +25,7 @@ void ExtendedTranslucency::BSLightingShader_SetupGeometry(RE::BSRenderPass* pass // TODO: PERFORMANCE: Caching the feature descriptor in map if this get more complex auto& unknownProperty = pass->geometry->GetGeometryRuntimeData().properties[RE::BSGeometry::States::kProperty]; static const REL::Relocation NiAlphaPropertyRTTI{ RE::NiAlphaProperty::Ni_RTTI }; - auto alphaProperty = unknownProperty->GetRTTI() == NiAlphaPropertyRTTI.get() ? static_cast(unknownProperty.get()) : nullptr; + auto alphaProperty = unknownProperty && unknownProperty->GetRTTI() == NiAlphaPropertyRTTI.get() ? static_cast(unknownProperty.get()) : nullptr; // Check alpha property exists and blending is enabled if (alphaProperty && alphaProperty->GetAlphaBlending()){ if (auto* data = pass->geometry->GetExtraData(NiExtraDataName_AnisotropicAlphaMaterial)) { From 341eb75e606c418700857678289d5349726e79e8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 12 Jul 2025 22:26:40 +0000 Subject: [PATCH 3/6] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20pre-commit.?= =?UTF-8?q?ci=20formatting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Automated formatting by clang-format, prettier, and other hooks. See https://pre-commit.ci for details. --- src/Features/ExtendedTranslucency.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Features/ExtendedTranslucency.cpp b/src/Features/ExtendedTranslucency.cpp index d51f64ec31..3eade3b6a8 100644 --- a/src/Features/ExtendedTranslucency.cpp +++ b/src/Features/ExtendedTranslucency.cpp @@ -27,7 +27,7 @@ void ExtendedTranslucency::BSLightingShader_SetupGeometry(RE::BSRenderPass* pass static const REL::Relocation NiAlphaPropertyRTTI{ RE::NiAlphaProperty::Ni_RTTI }; auto alphaProperty = unknownProperty->GetRTTI() == NiAlphaPropertyRTTI.get() ? static_cast(unknownProperty.get()) : nullptr; // Check alpha property exists and blending is enabled - if (alphaProperty && alphaProperty->GetAlphaBlending()){ + if (alphaProperty && alphaProperty->GetAlphaBlending()) { if (auto* data = pass->geometry->GetExtraData(NiExtraDataName_AnisotropicAlphaMaterial)) { static const REL::Relocation NiIntegerExtraDataRTTI{ RE::NiIntegerExtraData::Ni_RTTI }; if (data->GetRTTI() == NiIntegerExtraDataRTTI.get()) { From 70b1d558fdf2ef35b0d705a844e766d102870281 Mon Sep 17 00:00:00 2001 From: Tim <15017472+doodlum@users.noreply.github.com> Date: Sat, 12 Jul 2025 23:34:17 +0100 Subject: [PATCH 4/6] fix: force disabled value matching shaders --- src/Features/ExtendedTranslucency.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Features/ExtendedTranslucency.h b/src/Features/ExtendedTranslucency.h index 72c2d08c33..bc78d25a44 100644 --- a/src/Features/ExtendedTranslucency.h +++ b/src/Features/ExtendedTranslucency.h @@ -35,7 +35,7 @@ struct ExtendedTranslucency final : Feature RimLight = 1, // Similar effect like rim light IsotropicFabric = 2, // 1D fabric model, respect normal map AnisotropicFabric = 3, // 2D fabric model alone tangent and binormal, ignores normal map - ForceDisabled = 7, // In ExtraFeatureDescriptor, value >= 4 means 'Disabled' + ForceDisabled = 4, // In ExtraFeatureDescriptor, value >= 4 means 'Disabled' }; static constexpr uint32_t ExtraFeatureDescriptorShift = 6; From 07943a65b5f3a5a07267286f209417d551c69e5e Mon Sep 17 00:00:00 2001 From: Tim <15017472+doodlum@users.noreply.github.com> Date: Sat, 12 Jul 2025 23:40:14 +0100 Subject: [PATCH 5/6] refactor: move code into branch --- package/Shaders/Lighting.hlsl | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index c1ff12e6f1..389e1322cd 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -3312,19 +3312,20 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if defined(ANISOTROPIC_ALPHA) // Uniform alpha material settings uint AlphaMaterialModel = ExtendedTranslucency::GetMaterialModelFromDescriptor(Permutation::ExtraFeatureDescriptor); - float AlphaMaterialReduction = 0.f; - float AlphaMaterialSoftness = 0.f; - float AlphaMaterialStrength = 0.f; - if (AlphaMaterialModel == ExtendedTranslucency::MaterialModel::Default) { - AlphaMaterialModel = SharedData::extendedTranslucencySettings.MaterialModel; - AlphaMaterialReduction = SharedData::extendedTranslucencySettings.Reduction; - AlphaMaterialSoftness = SharedData::extendedTranslucencySettings.Softness; - AlphaMaterialStrength = SharedData::extendedTranslucencySettings.Strength; - } - [branch] if (ExtendedTranslucency::IsValidMaterial(AlphaMaterialModel)) { if (alpha >= 0.0156862754 && alpha < 1.0) { + float AlphaMaterialReduction = 0.f; + float AlphaMaterialSoftness = 0.f; + float AlphaMaterialStrength = 0.f; + + if (AlphaMaterialModel == ExtendedTranslucency::MaterialModel::Default) { + AlphaMaterialModel = SharedData::extendedTranslucencySettings.MaterialModel; + AlphaMaterialReduction = SharedData::extendedTranslucencySettings.Reduction; + AlphaMaterialSoftness = SharedData::extendedTranslucencySettings.Softness; + AlphaMaterialStrength = SharedData::extendedTranslucencySettings.Strength; + } + float originalAlpha = alpha; alpha = alpha * (1.0 - AlphaMaterialReduction); [branch] if (AlphaMaterialModel == ExtendedTranslucency::MaterialModel::AnisotropicFabric) From 286fa52d8e285be83fb56b3c2fb07f5fe47f39c4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 12 Jul 2025 22:45:53 +0000 Subject: [PATCH 6/6] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20pre-commit.?= =?UTF-8?q?ci=20formatting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Automated formatting by clang-format, prettier, and other hooks. See https://pre-commit.ci for details. --- package/Shaders/Lighting.hlsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 389e1322cd..660fac240b 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -3318,7 +3318,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) float AlphaMaterialReduction = 0.f; float AlphaMaterialSoftness = 0.f; float AlphaMaterialStrength = 0.f; - + if (AlphaMaterialModel == ExtendedTranslucency::MaterialModel::Default) { AlphaMaterialModel = SharedData::extendedTranslucencySettings.MaterialModel; AlphaMaterialReduction = SharedData::extendedTranslucencySettings.Reduction;