diff --git a/Rendering/Renderable.cs b/Rendering/Renderable.cs index 174204e..1e29636 100644 --- a/Rendering/Renderable.cs +++ b/Rendering/Renderable.cs @@ -386,6 +386,7 @@ namespace CodeWalker.Rendering public Vector4 WindOverrideParams { get; set; } = Vector4.One; public Vector4 globalAnimUV0 { get; set; } = Vector4.Zero; public Vector4 globalAnimUV1 { get; set; } = Vector4.Zero; + public Vector4 DirtDecalMask { get; set; } = Vector4.Zero; public bool SpecOnly { get; set; } = false; public float WaveOffset { get; set; } = 0; //for terrainfoam public float WaterHeight { get; set; } = 0; //for terrainfoam @@ -583,6 +584,9 @@ namespace CodeWalker.Rendering case MetaName.HeightOpacity: HeightOpacity = ((Vector4)param.Data).X; break; + case MetaName.DirtDecalMask: + DirtDecalMask = ((Vector4)param.Data); + break; } } diff --git a/Rendering/Shaders/BasicShader.cs b/Rendering/Shaders/BasicShader.cs index e798c2d..cca0412 100644 --- a/Rendering/Shaders/BasicShader.cs +++ b/Rendering/Shaders/BasicShader.cs @@ -73,6 +73,7 @@ namespace CodeWalker.Rendering public float specularFresnel; public float wetnessMultiplier; public uint SpecOnly; + public Vector4 TextureAlphaMask; } public struct BasicShaderInstGlobalMatrix { @@ -588,8 +589,11 @@ namespace CodeWalker.Rendering uint tintflag = 0; if (usetint) tintflag = 1; + Vector4 textureAlphaMask = Vector4.Zero; + uint decalflag = DecalMode ? 1u : 0u; uint windflag = geom.EnableWind ? 1u : 0u; uint emflag = geom.IsEmissive ? 1u : 0u; + uint pstintflag = tintflag; var shaderName = geom.DrawableGeom.Shader.Name; var shaderFile = geom.DrawableGeom.Shader.FileName; switch (shaderFile.Hash) @@ -606,9 +610,12 @@ namespace CodeWalker.Rendering case 2706821972://{mirror_decal.sps} //if (RenderMode == WorldRenderMode.Default) usediff = false; break; + case 2655725442://{decal_dirt.sps} + textureAlphaMask = geom.DirtDecalMask; + decalflag = 2; + break; } - uint pstintflag = tintflag; if (VSEntityVars.Vars.IsInstanced>0) { pstintflag = 1; @@ -631,7 +638,7 @@ namespace CodeWalker.Rendering PSGeomVars.Vars.EnableNormalMap = usebump ? 1u : 0u; PSGeomVars.Vars.EnableSpecMap = usespec ? 1u : 0u; PSGeomVars.Vars.EnableDetailMap = usedetl ? 1u : 0u; - PSGeomVars.Vars.IsDecal = DecalMode ? 1u : 0u; + PSGeomVars.Vars.IsDecal = decalflag; PSGeomVars.Vars.IsEmissive = emflag; PSGeomVars.Vars.IsDistMap = isdistmap ? 1u : 0u; PSGeomVars.Vars.bumpiness = geom.bumpiness; @@ -645,6 +652,7 @@ namespace CodeWalker.Rendering PSGeomVars.Vars.specularFresnel = geom.specularFresnel; PSGeomVars.Vars.wetnessMultiplier = geom.wetnessMultiplier; PSGeomVars.Vars.SpecOnly = geom.SpecOnly ? 1u : 0u; + PSGeomVars.Vars.TextureAlphaMask = textureAlphaMask; PSGeomVars.Update(context); PSGeomVars.SetPSCBuffer(context, 2); @@ -752,6 +760,7 @@ namespace CodeWalker.Rendering PSGeomVars.Vars.specularFresnel = 1.0f; PSGeomVars.Vars.wetnessMultiplier = 0.0f; PSGeomVars.Vars.SpecOnly = 0; + PSGeomVars.Vars.TextureAlphaMask = Vector4.Zero; PSGeomVars.Update(context); PSGeomVars.SetPSCBuffer(context, 2); diff --git a/Shaders/BasicPS.cso b/Shaders/BasicPS.cso index c9d9284..70a6f78 100644 Binary files a/Shaders/BasicPS.cso and b/Shaders/BasicPS.cso differ diff --git a/Shaders/BasicPS.hlsl b/Shaders/BasicPS.hlsl index f55adfd..ca600f4 100644 --- a/Shaders/BasicPS.hlsl +++ b/Shaders/BasicPS.hlsl @@ -36,6 +36,7 @@ cbuffer PSGeomVars : register(b2) float specularFresnel; float wetnessMultiplier; uint SpecOnly; + float4 TextureAlphaMask; } @@ -77,6 +78,12 @@ float4 main(VS_OUTPUT input) : SV_TARGET if ((IsDecal == 0) && (c.a <= 0.33)) discard; if ((IsDecal == 1) && (c.a <= 0.0)) discard; if(IsDecal==0) c.a = 1; + if (IsDecal == 2) + { + float4 mask = TextureAlphaMask * c; + c.a = saturate(mask.r + mask.g + mask.b + mask.a); + c.rgb = 0; + } c.a = saturate(c.a*AlphaScale); } if (EnableTint > 0) diff --git a/Todo.txt b/Todo.txt index 226e7e1..df52606 100644 --- a/Todo.txt +++ b/Todo.txt @@ -101,13 +101,13 @@ done: [v.29] -Improved selected MLO instance display - portals, limbo room New Project Window RPF Explorer drag & drop Show vehicle wheels Snap to ground, snap to grid CodeWalker.Core library Improved GTA folder management +Improved selected MLO instance display - portals, limbo room entitySets - like mapDataGroups but for interiors..... in Mlo data World view - delete key - delete item! RPF Explorer Edit mode diff --git a/WorldForm.cs b/WorldForm.cs index 5aebede..8814803 100644 --- a/WorldForm.cs +++ b/WorldForm.cs @@ -53,7 +53,7 @@ namespace CodeWalker bool rendermaps = false; bool renderworld = false; int startupviewmode = 0; //0=world, 1=ymap, 2=model - string modelname = "dt1_tc_dufo_core";//"dt1_11_fount_decal";// + string modelname = "dt1_tc_dufo_core";//"dt1_11_fount_decal";//"v_22_overlays";// string[] ymaplist; Vector3 prevworldpos = new Vector3(0, 0, 100); //also the start pos