From 4db994cda9992a3ae68e3723973a8c095c7af483 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Mon, 18 Sep 2023 06:37:36 +0300 Subject: [PATCH] Remap FO76 shader types --- components/nif/property.cpp | 44 ++++++++++++++++++++++----------- components/nif/property.hpp | 3 ++- components/nifosg/nifloader.cpp | 1 + 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/components/nif/property.cpp b/components/nif/property.cpp index bb2a01e2dc..c5fc7a88b1 100644 --- a/components/nif/property.cpp +++ b/components/nif/property.cpp @@ -299,7 +299,32 @@ namespace Nif nif->skip(2); // Unknown } - // TODO: consider separating this switch for pre-FO76 and FO76+ + if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_F76) + { + // Remap FO76+ shader types to FO4 system so that we can actually use them + // TODO: NifTools spec doesn't do anything about the misplaced EyeEnvmap. Bug or feature? + switch (static_cast(mType)) + { + case BSLightingShaderType::ShaderType_Parallax: + mType = static_cast(BSLightingShaderType::ShaderType_FaceTint); + break; + case BSLightingShaderType::ShaderType_FaceTint: + mType = static_cast(BSLightingShaderType::ShaderType_SkinTint); + break; + case BSLightingShaderType::ShaderType_SkinTint: + mType = static_cast(BSLightingShaderType::ShaderType_HairTint); + break; + case BSLightingShaderType::ShaderType_TreeAnim: + mType = static_cast(BSLightingShaderType::ShaderType_EyeEnvmap); + break; + case BSLightingShaderType::ShaderType_Cloud: + mType = static_cast(BSLightingShaderType::ShaderType_Terrain); + break; + default: + break; + } + } + switch (static_cast(mType)) { case BSLightingShaderType::ShaderType_EnvMap: @@ -311,25 +336,14 @@ namespace Nif nif->read(mWetnessUseSSR); } break; - case BSLightingShaderType::ShaderType_FaceTint: - // Skin tint shader in FO76+ - if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_F76) - nif->read(mSkinTintColor); - break; case BSLightingShaderType::ShaderType_SkinTint: - if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_F76) - nif->read(mHairTintColor); - else if (nif->getBethVersion() <= 130) + if (nif->getBethVersion() <= NIFFile::BethVersion::BETHVER_FO4) mSkinTintColor = { nif->get(), 1.f }; - else if (nif->getBethVersion() <= 139) + else nif->read(mSkinTintColor); - // Hair tint shader in FO76+ - else if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_F76) - nif->read(mHairTintColor); break; case BSLightingShaderType::ShaderType_HairTint: - if (nif->getBethVersion() <= 139) - nif->read(mHairTintColor); + nif->read(mHairTintColor); break; case BSLightingShaderType::ShaderType_ParallaxOcc: mParallax.read(nif); diff --git a/components/nif/property.hpp b/components/nif/property.hpp index 6b91d8d3d5..f87384703c 100644 --- a/components/nif/property.hpp +++ b/components/nif/property.hpp @@ -190,7 +190,8 @@ namespace Nif ShaderType_Cloud = 17, ShaderType_LODNoise = 18, ShaderType_MultitexLandLODBlend = 19, - ShaderType_Dismemberment = 20 + ShaderType_Dismemberment = 20, + ShaderType_Terrain = 21, // FO76+, technically 17 }; enum BSLightingShaderFlags1 diff --git a/components/nifosg/nifloader.cpp b/components/nifosg/nifloader.cpp index 7498c1cf46..7a8fd6afb2 100644 --- a/components/nifosg/nifloader.cpp +++ b/components/nifosg/nifloader.cpp @@ -2103,6 +2103,7 @@ namespace NifOsg case Nif::BSLightingShaderType::ShaderType_LODNoise: case Nif::BSLightingShaderType::ShaderType_MultitexLandLODBlend: case Nif::BSLightingShaderType::ShaderType_Dismemberment: + case Nif::BSLightingShaderType::ShaderType_Terrain: Log(Debug::Warning) << "Unhandled BSLightingShaderType " << type << " in " << mFilename; return "bs/default"; }