From b82da95b5181ac8bbae38efb13e950d5e88a4caa Mon Sep 17 00:00:00 2001 From: chai Date: Fri, 23 Oct 2020 13:08:43 +0800 Subject: =?UTF-8?q?*=E7=A7=BB=E5=8A=A8amplify=20shader=20editor=E5=88=B0th?= =?UTF-8?q?ird=20party=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scripts/MfxObjectMaterialUpdater.cs | 79 ++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 Assets/ThirdParty/MaterializeFX/Scripts/MfxObjectMaterialUpdater.cs (limited to 'Assets/ThirdParty/MaterializeFX/Scripts/MfxObjectMaterialUpdater.cs') diff --git a/Assets/ThirdParty/MaterializeFX/Scripts/MfxObjectMaterialUpdater.cs b/Assets/ThirdParty/MaterializeFX/Scripts/MfxObjectMaterialUpdater.cs new file mode 100644 index 00000000..c828afd4 --- /dev/null +++ b/Assets/ThirdParty/MaterializeFX/Scripts/MfxObjectMaterialUpdater.cs @@ -0,0 +1,79 @@ +using System.Collections.Generic; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace Assets.MaterializeFX.Scripts +{ + internal sealed class MfxObjectMaterialUpdater + { + private readonly Renderer[] _renderers; + private readonly Dictionary _rendererToOriginalMaterialsMap = new Dictionary(); + private readonly List _mfxMaterials = new List(); + + public MfxObjectMaterialUpdater(GameObject targetObject, bool modifyChildren, bool replaceMaterials, Material mfxMaterialTemplate) + { + _renderers = modifyChildren ? targetObject.GetComponentsInChildren() : targetObject.GetComponents(); + + if (!replaceMaterials) + { + foreach (var renderer in _renderers) + foreach (var material in renderer.sharedMaterials) + _mfxMaterials.Add(material); + return; + } + + Replace(mfxMaterialTemplate); + } + + public void SetFloat(string propertyName, float value) + { + foreach (var mfxMaterial in _mfxMaterials) + mfxMaterial.SetFloat(propertyName, value); + } + + public void SetInt(string propertyName, int value) + { + foreach (var mfxMaterial in _mfxMaterials) + mfxMaterial.SetInt(propertyName, value); + } + + public void SetVector(string propertyName, Vector3 value) + { + foreach (var mfxMaterial in _mfxMaterials) + mfxMaterial.SetVector(propertyName, value); + } + + public void Replace(Material mfxMaterialTemplate) + { + _rendererToOriginalMaterialsMap.Clear(); + _mfxMaterials.Clear(); + + foreach (var renderer in _renderers) + { + var rendererSharedMaterials = renderer.sharedMaterials; + + _rendererToOriginalMaterialsMap[renderer] = rendererSharedMaterials; + var newMaterials = MfxMaterialUtil.ReplaceMaterialsToMfx(mfxMaterialTemplate, rendererSharedMaterials, false); + renderer.sharedMaterials = newMaterials.ToArray(); + _mfxMaterials.AddRange(newMaterials); + } + } + + public void Revert() + { + // ReSharper disable once ForCanBeConvertedToForeach + for (int i = 0; i < _renderers.Length; i++) + { + if (_rendererToOriginalMaterialsMap.ContainsKey(_renderers[i])) + _renderers[i].materials = _rendererToOriginalMaterialsMap[_renderers[i]]; + } + + _rendererToOriginalMaterialsMap.Clear(); + + foreach (var mfxMaterial in _mfxMaterials) + Object.DestroyImmediate(mfxMaterial); + + _mfxMaterials.Clear(); + } + } +} \ No newline at end of file -- cgit v1.1-26-g67d0