From e2f54cb4f7ced013d8de680b3790f1d1c88dd0f3 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Wed, 10 Jun 2020 12:20:47 -0700 Subject: [PATCH] Fix tile parsing and decal rotation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Decals now respond to rotation and offset tools again • Fix tile value parsing • Fix broken normals when projecting on parts with no normal maps --- .../Plugins/ConformalDecals.dll | Bin 36352 -> 36352 bytes Source/ConformalDecals/DecalConfig.cs | 24 ++++++++++++++++++ .../ConformalDecals/ModuleConformalDecal.cs | 7 +++++ Source/ConformalDecals/ProjectionTarget.cs | 11 ++++---- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll index 0c420f6ba24ca78218ecf89d66c3717aec22a817..0174266830bc7cbff81db1449bf06c65a8675c9d 100644 GIT binary patch literal 36352 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⪻xVj%J^?wfH>6S@ zlT?oFWgd^=jVy~aLkSwQREv1@^6+>O%fvOzS1!XWPR6LL5*0I?V@giMQmN+haKG_D zAr#Cc{7($r>ChCVP{37{RMY^K-5M(M7>-CsU!=Lx6#%}YW-K3x2?Z+qp9k5CdMh$er z2VfCKLT*{^kt!z-I*h4-ObNk%RmWKl;}vy=T+uDTLMJ_pKEa*!4)OGJO0|7CqQszI zJ;%`(UVv11{JCPh^bmG99TMZeOUDeZ>p+5x1c6}O4e8!s6z%*XqqqohToK2GIG~6F z;RTv|CMNHY>JNw~9<-XJBPh7cT)<;HRttKh87+;mygB3%p5w3s%J}1m7EO(1<*EY5 zIYf8_Mu-$eU6HZZxU)sZHTIa!=-6vUj6(Q&-7y5*a{`YEJmQM+@Ch*X0He*w6=V`k z$axRAG=vP^4~ZbcXC}Xvsza~12v1n7!wpL3F`ted{5ud0`EK89voTy*Aaes=R*yfYF%m+A}Hi>3={6G1`vJ}5cE$^l1n|jHMiRABTYS3}C8vOBW~l)crpvt#v)~#_;ui5?_ABjs4-yjvp;z z??-e9X@?5ZI7e$38^KgJ)BA6KAb7x z-oDsBkr$=A&e=kF5BY*P&XPPe}Rf&%z0=@&Wr{ zz0|AC*3T`?^>Td7lxmrGTE7+OA$Z3U _shaderBlacklist; + + public static Texture2D BlankNormal => _blankNormal; public static bool IsBlacklisted(Shader shader) { return IsBlacklisted(shader.name); @@ -21,6 +25,24 @@ namespace ConformalDecals { } } + private static Texture2D MakeBlankNormal() { + Debug.Log("ConformalDecals: Generating neutral normal map texture"); + var width = 2; + var height = 2; + var color = new Color32(255, 128, 128, 128); + var colors = new Color32[] { color, color, color, color }; + + var tex = new Texture2D(width, height, TextureFormat.RGBA32, false); + for (var x = 0; x <= width; x++) { + for (var y = 0; y < height; y++) { + tex.SetPixels32(colors); + } + } + tex.Apply(); + + return tex; + } + public static void ModuleManagerPostLoad() { _shaderBlacklist = new List(); @@ -32,6 +54,8 @@ namespace ConformalDecals { ParseConfig(config.config); } } + + _blankNormal = MakeBlankNormal(); } } } \ No newline at end of file diff --git a/Source/ConformalDecals/ModuleConformalDecal.cs b/Source/ConformalDecals/ModuleConformalDecal.cs index 0acaba4..18af4fd 100644 --- a/Source/ConformalDecals/ModuleConformalDecal.cs +++ b/Source/ConformalDecals/ModuleConformalDecal.cs @@ -228,6 +228,12 @@ namespace ConformalDecals { } // handle texture tiling parameters + var tileString = node.GetValue("tile"); + this.Log(tileString); + if (!string.IsNullOrEmpty(tileString)) { + var tileValid = ParseExtensions.TryParseRect(tileString, out tileRect); + if (!tileValid) throw new FormatException($"Invalid rect value for tile '{tileString}'"); + } if (tileRect.x >= 0) { materialProperties.UpdateTile(tileRect); } @@ -338,6 +344,7 @@ namespace ConformalDecals { break; case ConstructionEventType.PartOffsetting: case ConstructionEventType.PartRotating: + UpdateScale(); break; } } diff --git a/Source/ConformalDecals/ProjectionTarget.cs b/Source/ConformalDecals/ProjectionTarget.cs index 405e9c7..519aef8 100644 --- a/Source/ConformalDecals/ProjectionTarget.cs +++ b/Source/ConformalDecals/ProjectionTarget.cs @@ -1,4 +1,3 @@ -using ConformalDecals.Util; using UnityEngine; using UnityEngine.Rendering; @@ -35,10 +34,8 @@ namespace ConformalDecals { _decalMPB.SetVector(DecalPropertyIDs._DecalNormal, decalNormal); _decalMPB.SetVector(DecalPropertyIDs._DecalTangent, decalTangent); - if (useBaseNormal && targetMaterial.HasProperty(DecalPropertyIDs._BumpMap)) { - var normal = targetMaterial.GetTexture(DecalPropertyIDs._BumpMap); - if (normal != null) { - + if (useBaseNormal) { + if (targetMaterial.HasProperty(DecalPropertyIDs._BumpMap)) { _decalMPB.SetTexture(DecalPropertyIDs._BumpMap, targetMaterial.GetTexture(DecalPropertyIDs._BumpMap)); var normalScale = targetMaterial.GetTextureScale(DecalPropertyIDs._BumpMap); @@ -46,6 +43,10 @@ namespace ConformalDecals { _decalMPB.SetVector(DecalPropertyIDs._BumpMap_ST, new Vector4(normalScale.x, normalScale.y, normalOffset.x, normalOffset.y)); } + else { + Debug.Log("Using blank normal"); + _decalMPB.SetTexture(DecalPropertyIDs._BumpMap, DecalConfig.BlankNormal); + } } }