diff --git a/CodeWalker.Shaders/BasicPS.hlsl b/CodeWalker.Shaders/BasicPS.hlsl index ba3595c..51524c6 100644 --- a/CodeWalker.Shaders/BasicPS.hlsl +++ b/CodeWalker.Shaders/BasicPS.hlsl @@ -5,6 +5,7 @@ Texture2D Bumpmap : register(t2); Texture2D Specmap : register(t3); Texture2D Detailmap : register(t4); Texture2D Colourmap2 : register(t5); +Texture2D TintPalette : register(t6); SamplerState TextureSS : register(s0); @@ -19,7 +20,7 @@ cbuffer PSSceneVars : register(b0) cbuffer PSGeomVars : register(b2) { uint EnableTexture;//1+=diffuse1, 2+=diffuse2 - uint EnableTint; + uint EnableTint;//1=default, 2=weapons (use diffuse.a for tint lookup) uint EnableNormalMap; uint EnableSpecMap; uint EnableDetailMap; @@ -80,6 +81,15 @@ float4 main(VS_OUTPUT input) : SV_TARGET float4 c2 = Colourmap2.Sample(TextureSS, input.Texcoord1); c = c2.a * c2 + (1 - c2.a) * c; } + if (EnableTint == 2) + { + //weapon tint + float tx = (round(c.a * 255.009995) - 32.0) * 0.007813; //okay R* this is just silly + float ty = 0.03125 * 0.5;// //1;//what to use for Y value? cb12[2].w in R* shader + float4 c3 = TintPalette.Sample(TextureSS, float2(tx, ty)); + c.rgb *= c3.rgb; + c.a = 1; + } if (IsDistMap) c = float4(c.rgb*2, (c.r+c.g+c.b) - 1); if ((IsDecal == 0) && (c.a <= 0.33)) discard; @@ -93,7 +103,7 @@ float4 main(VS_OUTPUT input) : SV_TARGET } c.a = saturate(c.a*AlphaScale); } - if (EnableTint > 0) + if (EnableTint == 1) { c.rgb *= input.Tint.rgb; } diff --git a/CodeWalker.Shaders/ShadowPS.hlsl b/CodeWalker.Shaders/ShadowPS.hlsl index 705e6e1..da5639e 100644 --- a/CodeWalker.Shaders/ShadowPS.hlsl +++ b/CodeWalker.Shaders/ShadowPS.hlsl @@ -25,6 +25,7 @@ float4 main(VS_OUTPUT input) : SV_TARGET if (EnableTexture == 1) { float4 c = Colourmap.Sample(TextureSS, input.Texcoord); + if (EnableTint == 2) { c.a = 1; } if ((IsDecal == 0) && (c.a <= 0.33)) discard; if ((IsDecal == 1) && (c.a <= 0.0)) discard; } diff --git a/Rendering/Shaders/BasicShader.cs b/Rendering/Shaders/BasicShader.cs index 1e17935..3f81fb7 100644 --- a/Rendering/Shaders/BasicShader.cs +++ b/Rendering/Shaders/BasicShader.cs @@ -637,6 +637,7 @@ namespace CodeWalker.Rendering detltex = itex; break; case ShaderParamNames.TintPaletteSampler: + case ShaderParamNames.TextureSamplerDiffPal: tintpal = itex; if (tintpal.Key != null) { @@ -649,6 +650,7 @@ namespace CodeWalker.Rendering isdistmap = true; break; case ShaderParamNames.DiffuseSampler2: + case ShaderParamNames.DiffuseExtraSampler: texture2 = itex; break; case ShaderParamNames.heightSampler: @@ -710,6 +712,14 @@ namespace CodeWalker.Rendering case 1229591973://{trees_normal_spec_tnt.sps} if (usetint) tintflag = 2; //use 2nd vertex colour channel for tint... break; + case 3267631682: //weapon_normal_spec_detail_tnt.sps + case 14185869: //weapon_normal_spec_tnt.sps + break; //regular tinting? + case 231364109: //weapon_normal_spec_cutout_palette.sps + case 3294641629://weapon_normal_spec_detail_palette.sps + case 731050667: //weapon_normal_spec_palette.sps + if (usetint) { tintflag = 0; pstintflag = 2; } //use diffuse sampler alpha for tint lookup! + break; case 3880384844://{decal_spec_only.sps}w case 600733812://{decal_amb_only.sps} case 2842248626://{spec_decal.sps} @@ -799,6 +809,10 @@ namespace CodeWalker.Rendering { tintpal.SetVSResource(context, 0); } + if (pstintflag == 2) + { + tintpal.SetPSResource(context, 6); + } if (geom.BoneTransforms != null) diff --git a/Rendering/Shaders/ShadowShader.cs b/Rendering/Shaders/ShadowShader.cs index 2474b99..bdf57fc 100644 --- a/Rendering/Shaders/ShadowShader.cs +++ b/Rendering/Shaders/ShadowShader.cs @@ -323,6 +323,7 @@ namespace CodeWalker.Rendering uint windflag = 0; + uint tintflag = 0; var shaderFile = geom.DrawableGeom.Shader.FileName; switch (shaderFile.Hash) { @@ -335,13 +336,18 @@ namespace CodeWalker.Rendering case 4265705004://{trees_normal_diffspec.sps} windflag = 1; break; + case 231364109: //weapon_normal_spec_cutout_palette.sps + case 3294641629://weapon_normal_spec_detail_palette.sps + case 731050667: //weapon_normal_spec_palette.sps + tintflag = 2; //use diffuse sampler alpha for tint lookup! (ignore texture alpha in PS) + break; } GeomVars.Vars.EnableTexture = usediff ? 1u : 0u; - GeomVars.Vars.EnableTint = 0u;// usetint ? 1u : 0u; + GeomVars.Vars.EnableTint = tintflag;// usetint ? 1u : 0u; GeomVars.Vars.IsDecal = 0u;// DecalMode ? 1u : 0u; GeomVars.Vars.EnableWind = windflag; GeomVars.Vars.WindOverrideParams = geom.WindOverrideParams; diff --git a/Shaders/BasicPS.cso b/Shaders/BasicPS.cso index b2a88f6..9a0122e 100644 Binary files a/Shaders/BasicPS.cso and b/Shaders/BasicPS.cso differ diff --git a/Shaders/ShadowPS.cso b/Shaders/ShadowPS.cso index 78ab5de..c71baf7 100644 Binary files a/Shaders/ShadowPS.cso and b/Shaders/ShadowPS.cso differ