From 62bdd151e1468e8da0ff47be74e6f738b6f9b7c3 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Fri, 9 Oct 2020 19:30:59 -0700 Subject: [PATCH] Refactor to rearrange initialization code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Add matrix parsing code • Add target serialization • Rearrange initialization to allow loading targets from config soon --- .../Plugins/ConformalDecals.dll | Bin 83456 -> 85504 bytes .../ConformalDecals/ModuleConformalDecal.cs | 130 ++++++++------- Source/ConformalDecals/ModuleConformalFlag.cs | 3 +- Source/ConformalDecals/ModuleConformalText.cs | 80 ++++----- Source/ConformalDecals/ProjectionTarget.cs | 152 +++++++++++++----- Source/ConformalDecals/Util/ParseUtil.cs | 30 ++++ 6 files changed, 244 insertions(+), 151 deletions(-) diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index 71f814c91823d4c3387a463b94f875e43b22538d..a28242fb21a008f194efe72d9d64d82bc955662c 100644 GIT binary patch literal 85504 zcmeFad7KnQ(l?%2)m`1wJy&%HE$t9UHl*Lp1Lt&8`$y1O2$_-XPhHUA%qYAe)&a+dvT@T7*2mZX-9Es?fs?V&Z6gf+$$$O*W}zw8uS32aS0TzdZz#P9p~-~UjB?=VXNuXU6Dj>)xN4A4 z_?-s6lPCkeZ;~N){9P$UF>q(hk>bD|%YF^66C&s-4+7rX12-<3yL1uYZF@jplyO_N z-Yyx?vl}z5nWKPU-Jm0P)ZVyyeq+#GjhVR%91xPO0y?t|CU&A5=c&fod&sW%k#2_Y z3vmhB`jikIYck1iO1c}iEkr2kUTfOG$(O8YgM-lp5`4+VHdxx{^drKWwg92J8|{2; zGMpsPb_iXXY-*z(Hk=d@3K1J%3e+LpB5mk!pAi*K8fEFIX=OhLVv5hoenHnn(yW-` ztC$i;HLlkeS1^mPWUALd^$aVS0k?%lrUa?o2wZD_B+En>$a)5KplIY2(%s1PB9b=f z)#nsyg^_6{#4lp;W7*?-VWHq=_2y1o=FPXmF%#G=y{ANMf336AZqUufo?EsY=B=t2)S4!b0IZu z8X8v>stQMqI>ZK1*WMwqVSrH0n(nAt9}iy5*Mz=S>1(yRmRNzBcWXTX~~=!mgP}*cclj&euk~K+FqtAgl3~ zbWwl}t6J^oF=!nd5D?vvg{wwtYum|-TF0|;nI6zADz{f+tQb+5nFTOM4jh$g}Aeh|~G$q08Ubr}LqErlCxDSAcFAHb%+4~|N^XGB! zL5;H_{tA0Pl%{JkhcN%SdHys~hQ9>|jaWO-T+or`KF~x1-18C=QO}n?6q%XGILm1) z2ct!R4+897f-~%i5E~6din9B&rpu2+G3RIG2*X7Oc#0@LBgYua!2n5t*AXOQG7%P$C6!W*!XVl2lNA;M_lI+*%W z{3}JCez+gt_8Cexs=-VBos12T0%3-Kna9XXXmqH(2xXa9^I(X;FY+Lm`!YY|!D0f7 zd~RKgY+t5V9)xsXW^^7bBXDLO#I(SdL2%b{BLr^Bg9ybuhNYOHb!
ZQB2!Iwhz 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 diff --git a/Source/ConformalDecals/ModuleConformalDecal.cs b/Source/ConformalDecals/ModuleConformalDecal.cs index d7be8b1..b5a8b78 100644 --- a/Source/ConformalDecals/ModuleConformalDecal.cs +++ b/Source/ConformalDecals/ModuleConformalDecal.cs @@ -220,10 +220,15 @@ namespace ConformalDecals { if (HighLogic.LoadedSceneIsEditor) { UpdateTweakables(); + UpdateTextures(); + UpdateScale(); + UpdateTargets(); } - - if (HighLogic.LoadedSceneIsGame) { - UpdateProjection(); + else if (HighLogic.LoadedSceneIsFlight) { + UpdateTextures(); + UpdateScale(); + UpdateTargets(); + //TODO: Target loading } else { scale = defaultScale; @@ -231,6 +236,9 @@ namespace ConformalDecals { opacity = defaultOpacity; cutoff = defaultCutoff; wear = defaultWear; + + UpdateTextures(); + UpdateScale(); // QUEUE PART FOR ICON FIXING IN VAB DecalIconFixer.QueuePart(part.name); @@ -239,7 +247,8 @@ namespace ConformalDecals { /// public override void OnIconCreate() { - UpdateProjection(); + UpdateTextures(); + UpdateScale(); } /// @@ -306,11 +315,13 @@ namespace ConformalDecals { protected void OnProjectionTweakEvent(BaseField field, object obj) { // scale or depth values have been changed, so update scale // and update projection matrices if attached - UpdateProjection(); + UpdateScale(); + UpdateTargets(); foreach (var counterpart in part.symmetryCounterparts) { var decal = counterpart.GetComponent(); - decal.UpdateProjection(); + decal.UpdateScale(); + decal.UpdateTargets(); } } @@ -333,7 +344,7 @@ namespace ConformalDecals { protected void OnVariantApplied(Part eventPart, PartVariant variant) { if (_isAttached && eventPart == part.parent) { - UpdateProjection(); + UpdateTargets(); } } @@ -348,7 +359,8 @@ namespace ConformalDecals { break; case ConstructionEventType.PartOffsetting: case ConstructionEventType.PartRotating: - UpdateProjection(); + UpdateScale(); + UpdateTargets(); break; } } @@ -379,7 +391,8 @@ namespace ConformalDecals { Camera.onPreCull += Render; UpdateMaterials(); - UpdateProjection(); + UpdateScale(); + UpdateTargets(); } protected virtual void OnDetach() { @@ -395,57 +408,12 @@ namespace ConformalDecals { Camera.onPreCull -= Render; UpdateMaterials(); - UpdateProjection(); + UpdateScale(); } - protected void UpdateProjection() { - // Update projection targets - if (_targets == null) { - _targets = new List(); - } - else { - _targets.Clear(); - } - - if (_isAttached) { - IEnumerable targetParts; - if (projectMultiple) { - if (HighLogic.LoadedSceneIsFlight) { - targetParts = part.vessel.parts; - } - else { - targetParts = EditorLogic.fetch.ship.parts; - } - } - else { - targetParts = new[] {part.parent}; - } - - foreach (var targetPart in targetParts) { - if (targetPart.GetComponent() != null) continue; // skip other decals - - foreach (var targetRenderer in targetPart.FindModelComponents()) { - // skip disabled renderers - if (targetRenderer.gameObject.activeInHierarchy == false) continue; - - // skip blacklisted shaders - if (DecalConfig.IsBlacklisted(targetRenderer.material.shader)) continue; - - var meshFilter = targetRenderer.GetComponent(); - if (meshFilter == null) continue; // object has a meshRenderer with no filter, invalid - var mesh = meshFilter.sharedMesh; - if (mesh == null) continue; // object has a null mesh, invalid - - // create new ProjectionTarget to represent the renderer - var target = new ProjectionTarget(targetPart, targetRenderer, mesh); - - // add the target to the list - _targets.Add(target); - } - } - } + protected void UpdateScale() { - // Update projection matrix + // Update scale and depth scale = Mathf.Max(0.01f, scale); depth = Mathf.Max(0.01f, depth); var aspectRatio = materialProperties.AspectRatio; @@ -479,17 +447,20 @@ namespace ConformalDecals { materialProperties.UpdateScale(size); if (_isAttached) { + // Update projection targets + if (_targets == null) { + _targets = new List(); + } + else { + _targets.Clear(); + } + // update orthogonal matrix _orthoMatrix = Matrix4x4.identity; _orthoMatrix[0, 3] = 0.5f; _orthoMatrix[1, 3] = 0.5f; decalProjectorTransform.localScale = new Vector3(size.x, size.y, depth); - - // update projection - foreach (var target in _targets) { - target.Project(_orthoMatrix, decalProjectorTransform, _boundsRenderer.bounds, useBaseNormal); - } } else { // rescale preview model @@ -502,6 +473,41 @@ namespace ConformalDecals { } } + protected void UpdateTargets() { + if (!_isAttached) return; + + IEnumerable targetParts; + if (projectMultiple) { + targetParts = HighLogic.LoadedSceneIsFlight ? part.vessel.parts : EditorLogic.fetch.ship.parts; + } + else { + targetParts = new[] {part.parent}; + } + + foreach (var targetPart in targetParts) { + if (targetPart.GetComponent() != null) continue; // skip other decals + + foreach (var renderer in targetPart.FindModelComponents()) { + var target = renderer.transform; + var filter = target.GetComponent(); + + // check if the target has any missing data + if (!ProjectionTarget.ValidateTarget(target, renderer, filter)) continue; + + // check bounds for intersection + if (_boundsRenderer.bounds.Intersects(renderer.bounds)) { + // create new ProjectionTarget to represent the renderer + var projectionTarget = new ProjectionTarget(targetPart, target, renderer, filter, _orthoMatrix, decalProjectorTransform, useBaseNormal); + + // add the target to the list + _targets.Add(projectionTarget); + } + } + } + } + + protected virtual void UpdateTextures() { } + protected virtual void UpdateMaterials() { materialProperties.UpdateMaterials(); materialProperties.SetOpacity(opacity); diff --git a/Source/ConformalDecals/ModuleConformalFlag.cs b/Source/ConformalDecals/ModuleConformalFlag.cs index 4142a9a..cc11d07 100644 --- a/Source/ConformalDecals/ModuleConformalFlag.cs +++ b/Source/ConformalDecals/ModuleConformalFlag.cs @@ -95,7 +95,8 @@ namespace ConformalDecals { materialProperties.AddOrGetTextureProperty("_Decal", true).TextureUrl = newFlagUrl; UpdateMaterials(); - UpdateProjection(); + UpdateScale(); + UpdateTargets(); } private void SetFlagSymmetryCounterparts(string newFlagUrl) { diff --git a/Source/ConformalDecals/ModuleConformalText.cs b/Source/ConformalDecals/ModuleConformalText.cs index 7d97e2f..fdd9cb1 100644 --- a/Source/ConformalDecals/ModuleConformalText.cs +++ b/Source/ConformalDecals/ModuleConformalText.cs @@ -98,8 +98,6 @@ namespace ConformalDecals { public override void OnLoad(ConfigNode node) { base.OnLoad(node); OnAfterDeserialize(); - - UpdateTextRecursive(); } public override void OnSave(ConfigNode node) { @@ -107,15 +105,22 @@ namespace ConformalDecals { base.OnSave(node); } - public override void OnStart(StartState state) { - base.OnStart(state); - - UpdateTextRecursive(); - } - public override void OnAwake() { base.OnAwake(); + _font = DecalConfig.GetFont(fontName); + _style = new DecalTextStyle((FontStyles) style, vertical, lineSpacing, charSpacing); + + if (!ParseUtil.TryParseColor32(fillColor, out _fillColor)) { + Logging.LogWarning($"Improperly formatted color value for fill: '{fillColor}'"); + _fillColor = Color.magenta; + } + + if (!ParseUtil.TryParseColor32(outlineColor, out _outlineColor)) { + Logging.LogWarning($"Improperly formatted color value for outline: '{outlineColor}'"); + _outlineColor = Color.magenta; + } + _decalTextureProperty = materialProperties.AddOrGetTextureProperty("_Decal", true); _fillEnabledProperty = materialProperties.AddOrGetProperty("DECAL_FILL"); @@ -130,7 +135,22 @@ namespace ConformalDecals { text = newText; _font = newFont; _style = newStyle; - UpdateTextRecursive(); + UpdateTextures(); + UpdateScale(); + UpdateTargets(); + + foreach (var counterpart in part.symmetryCounterparts) { + var decal = counterpart.GetComponent(); + decal.text = text; + decal._font = _font; + decal._style = _style; + + decal._currentJob = _currentJob; + decal._currentText = _currentText; + decal.UpdateTextures(); + decal.UpdateScale(); + decal.UpdateTargets(); + } } public void OnFillColorUpdate(Color rgb, Util.ColorHSV hsv) { @@ -207,20 +227,7 @@ namespace ConformalDecals { outlineColor = _outlineColor.ToHexString(); } - public void OnAfterDeserialize() { - _font = DecalConfig.GetFont(fontName); - _style = new DecalTextStyle((FontStyles) style, vertical, lineSpacing, charSpacing); - - if (!ParseUtil.TryParseColor32(fillColor, out _fillColor)) { - Logging.LogWarning($"Improperly formatted color value for fill: '{fillColor}'"); - _fillColor = Color.magenta; - } - - if (!ParseUtil.TryParseColor32(outlineColor, out _outlineColor)) { - Logging.LogWarning($"Improperly formatted color value for outline: '{outlineColor}'"); - _outlineColor = Color.magenta; - } - } + public void OnAfterDeserialize() {} public override void OnDestroy() { if (HighLogic.LoadedSceneIsGame && _currentText != null) TextRenderer.UnregisterText(_currentText); @@ -237,41 +244,16 @@ namespace ConformalDecals { base.OnDetach(); } - private void UpdateTextRecursive() { - UpdateText(); - - foreach (var counterpart in part.symmetryCounterparts) { - var decal = counterpart.GetComponent(); - decal.text = text; - decal._font = _font; - decal._style = _style; - - decal._currentJob = _currentJob; - decal._currentText = _currentText; - decal.UpdateText(); - } - } - - private void UpdateText() { + protected override void UpdateTextures() { // Render text var newText = new DecalText(text, _font, _style); var output = TextRenderer.UpdateTextNow(_currentText, newText); _currentText = newText; - UpdateTexture(output); - - // TODO: ASYNC RENDERING - // var newText = new DecalText(text, _font, _style); - // _currentJob = TextRenderer.UpdateText(_currentText, newText, UpdateTexture); - // _currentText = newText; - } - - public void UpdateTexture(TextRenderOutput output) { _decalTextureProperty.Texture = output.Texture; _decalTextureProperty.SetTile(output.Window); UpdateMaterials(); - UpdateProjection(); } protected override void UpdateMaterials() { diff --git a/Source/ConformalDecals/ProjectionTarget.cs b/Source/ConformalDecals/ProjectionTarget.cs index 95ca253..007b50a 100644 --- a/Source/ConformalDecals/ProjectionTarget.cs +++ b/Source/ConformalDecals/ProjectionTarget.cs @@ -1,70 +1,144 @@ +using System; +using System.Text; +using ConformalDecals.Util; +using UniLinq; using UnityEngine; using UnityEngine.Rendering; namespace ConformalDecals { public class ProjectionTarget { // Target object data - public readonly Transform target; - public readonly Part targetPart; - - private readonly Renderer _targetRenderer; - private readonly Mesh _targetMesh; - private bool _projectionEnabled; + private readonly Transform _target; + private readonly Part _targetPart; + private readonly Mesh _targetMesh; + private readonly Matrix4x4 _decalMatrix; + private readonly Vector3 _decalNormal; + private readonly Vector3 _decalTangent; + private readonly bool _useBaseNormal; // property block private readonly MaterialPropertyBlock _decalMPB; - public ProjectionTarget(Part targetPart, MeshRenderer targetRenderer, Mesh targetMesh) { - this.targetPart = targetPart; - this.target = targetRenderer.transform; - _targetRenderer = targetRenderer; - _targetMesh = targetMesh; + public ProjectionTarget(Part targetPart, Transform target, MeshRenderer renderer, MeshFilter filter, + Matrix4x4 orthoMatrix, Transform projector, bool useBaseNormal) { + + _targetPart = targetPart; + _target = target; + _targetMesh = filter.sharedMesh; + _useBaseNormal = useBaseNormal; _decalMPB = new MaterialPropertyBlock(); + + var projectorToTargetMatrix = target.worldToLocalMatrix * projector.localToWorldMatrix; + + _decalMatrix = orthoMatrix * projectorToTargetMatrix.inverse; + _decalNormal = projectorToTargetMatrix.MultiplyVector(Vector3.back).normalized; + _decalTangent = projectorToTargetMatrix.MultiplyVector(Vector3.right).normalized; + + SetupMPB(renderer.sharedMaterial); } - public void Project(Matrix4x4 orthoMatrix, Transform projector, Bounds projectorBounds, bool useBaseNormal) { + public ProjectionTarget(ConfigNode node, Vessel vessel, bool useBaseNormal) { + var flightID = (uint) ParseUtil.ParseInt(node, "part"); + var targetPath = ParseUtil.ParseString(node, "targetPath"); + var targetName = ParseUtil.ParseString(node, "targetName"); + + _decalMatrix = ParseUtil.ParseMatrix4x4(node, "decalMatrix"); + _decalNormal = ParseUtil.ParseVector3(node, "decalNormal"); + _decalTangent = ParseUtil.ParseVector3(node, "decalTangent"); + _useBaseNormal = useBaseNormal; + _decalMPB = new MaterialPropertyBlock(); - if (projectorBounds.Intersects(_targetRenderer.bounds)) { - _projectionEnabled = true; - var targetMaterial = _targetRenderer.sharedMaterial; - var projectorToTargetMatrix = target.worldToLocalMatrix * projector.localToWorldMatrix; + _targetPart = vessel[flightID]; + if (_targetPart == null) throw new IndexOutOfRangeException("Vessel returned null part"); + _target = LoadTransformPath(targetPath, _targetPart.transform); + if (_target.name != targetName) throw new FormatException("Target name does not match"); - var projectionMatrix = orthoMatrix * projectorToTargetMatrix.inverse; - var decalNormal = projectorToTargetMatrix.MultiplyVector(Vector3.back).normalized; - var decalTangent = projectorToTargetMatrix.MultiplyVector(Vector3.right).normalized; + var renderer = _target.GetComponent(); + var filter = _target.GetComponent(); - _decalMPB.SetMatrix(DecalPropertyIDs._ProjectionMatrix, projectionMatrix); - _decalMPB.SetVector(DecalPropertyIDs._DecalNormal, decalNormal); - _decalMPB.SetVector(DecalPropertyIDs._DecalTangent, decalTangent); + if (!ValidateTarget(_target, renderer, filter)) throw new FormatException("Invalid target"); - if (useBaseNormal && targetMaterial.HasProperty(DecalPropertyIDs._BumpMap)) { - _decalMPB.SetTexture(DecalPropertyIDs._BumpMap, targetMaterial.GetTexture(DecalPropertyIDs._BumpMap)); + _targetMesh = filter.sharedMesh; - var normalScale = targetMaterial.GetTextureScale(DecalPropertyIDs._BumpMap); - var normalOffset = targetMaterial.GetTextureOffset(DecalPropertyIDs._BumpMap); + SetupMPB(renderer.sharedMaterial); + } - _decalMPB.SetVector(DecalPropertyIDs._BumpMap_ST, new Vector4(normalScale.x, normalScale.y, normalOffset.x, normalOffset.y)); - } - else { - _decalMPB.SetTexture(DecalPropertyIDs._BumpMap, DecalConfig.BlankNormal); - } + private void SetupMPB(Material targetMaterial) { + _decalMPB.SetMatrix(DecalPropertyIDs._ProjectionMatrix, _decalMatrix); + _decalMPB.SetVector(DecalPropertyIDs._DecalNormal, _decalNormal); + _decalMPB.SetVector(DecalPropertyIDs._DecalTangent, _decalTangent); + + if (_useBaseNormal && targetMaterial.HasProperty(DecalPropertyIDs._BumpMap)) { + _decalMPB.SetTexture(DecalPropertyIDs._BumpMap, targetMaterial.GetTexture(DecalPropertyIDs._BumpMap)); + + var normalScale = targetMaterial.GetTextureScale(DecalPropertyIDs._BumpMap); + var normalOffset = targetMaterial.GetTextureOffset(DecalPropertyIDs._BumpMap); + + _decalMPB.SetVector(DecalPropertyIDs._BumpMap_ST, new Vector4(normalScale.x, normalScale.y, normalOffset.x, normalOffset.y)); } else { - _projectionEnabled = false; + _decalMPB.SetTexture(DecalPropertyIDs._BumpMap, DecalConfig.BlankNormal); } } - public bool Render(Material decalMaterial, MaterialPropertyBlock partMPB, Camera camera) { - if (_projectionEnabled) { - _decalMPB.SetFloat(PropertyIDs._RimFalloff, partMPB.GetFloat(PropertyIDs._RimFalloff)); - _decalMPB.SetColor(PropertyIDs._RimColor, partMPB.GetColor(PropertyIDs._RimColor)); + public void Render(Material decalMaterial, MaterialPropertyBlock partMPB, Camera camera) { + _decalMPB.SetFloat(PropertyIDs._RimFalloff, partMPB.GetFloat(PropertyIDs._RimFalloff)); + _decalMPB.SetColor(PropertyIDs._RimColor, partMPB.GetColor(PropertyIDs._RimColor)); + + Graphics.DrawMesh(_targetMesh, _target.localToWorldMatrix, decalMaterial, 0, camera, 0, _decalMPB, ShadowCastingMode.Off, true); + } + + public ConfigNode Save() { + var node = new ConfigNode("TARGET"); + node.AddValue("part", _targetPart.flightID); + node.AddValue("decalMatrix", _decalMatrix); + node.AddValue("decalNormal", _decalNormal); + node.AddValue("decalTangent", _decalTangent); + node.AddValue("targetPath", SaveTransformPath(_target, _targetPart.transform)); // used to find the target transform + node.AddValue("targetName", _target.name); // used to validate the mesh has not changed since last load + + return node; + } + + + public static bool ValidateTarget(Transform target, MeshRenderer renderer, MeshFilter filter) { + if (renderer == null) return false; + if (filter == null) return false; + if (!target.gameObject.activeInHierarchy) return false; + + var material = renderer.material; + if (material == null) return false; + if (DecalConfig.IsBlacklisted(material.shader)) return false; + + if (filter.sharedMesh == null) return false; + + return true; + } + + private static string SaveTransformPath(Transform leaf, Transform root) { + var builder = new StringBuilder(leaf.name); + var current = leaf.parent; + + while (current != root) { + builder.Insert(0, "/"); + builder.Insert(0, current.GetSiblingIndex()); + current = current.parent; + if (current == null) throw new FormatException("Leaf does not exist as a child of root"); + } + + return builder.ToString(); + } - Graphics.DrawMesh(_targetMesh, target.localToWorldMatrix, decalMaterial, 0, camera, 0, _decalMPB, ShadowCastingMode.Off, true); + private static Transform LoadTransformPath(string path, Transform root) { + var indices = path.Split('/').Select(int.Parse); + var current = root; - return true; + foreach (var index in indices) { + if (index > current.childCount) throw new FormatException("Child index path is invalid"); + current = current.GetChild(index); } - return false; + return current; } } } \ No newline at end of file diff --git a/Source/ConformalDecals/Util/ParseUtil.cs b/Source/ConformalDecals/Util/ParseUtil.cs index 5a712c7..1a883d1 100644 --- a/Source/ConformalDecals/Util/ParseUtil.cs +++ b/Source/ConformalDecals/Util/ParseUtil.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Reflection; +using UniLinq; using UnityEngine; namespace ConformalDecals.Util { @@ -100,6 +101,15 @@ namespace ConformalDecals.Util { return ParseValueIndirect(ref value, node, valueName, ParseExtensions.TryParseVector3); } + public static Matrix4x4 ParseMatrix4x4(ConfigNode node, string valueName, bool isOptional = false, Matrix4x4 defaultValue = default) { + return ParseValue(node, valueName, ParseUtil.TryParseMatrix4x4, isOptional, defaultValue); + } + + public static bool ParseMatrix4x4Indirect(ref Matrix4x4 value, ConfigNode node, string valueName) { + return ParseValueIndirect(ref value, node, valueName, ParseUtil.TryParseMatrix4x4); + + } + public static T ParseValue(ConfigNode node, string valueName, TryParseDelegate tryParse, bool isOptional = false, T defaultValue = default) { string valueString = node.GetValue(valueName); @@ -139,6 +149,26 @@ namespace ConformalDecals.Util { throw new FormatException($"Improperly formatted {typeof(T)} value for {valueName} : '{valueString}"); } + public static bool TryParseMatrix4x4(string valueString, out Matrix4x4 value) { + value = new Matrix4x4(); + + var split = valueString.Split(Separator, StringSplitOptions.RemoveEmptyEntries); + for (int i = 0; i < split.Length; i++) { + split[i] = split[i].Trim(); + } + + if (split.Length != 16) return false; + int index = 0; + for (int row = 0; row < 4; row++) { + for (int col = 0; col < 4; col++) { + if (!float.TryParse(split[index], out float component)) return false; + value[row, col] = component; + } + } + + return true; + } + public static bool TryParseHexColor(string valueString, out Color32 value) { value = new Color32(0, 0, 0, byte.MaxValue);