From 917e9e0b320775634dc2e710f7deac74fd0822f0 Mon Sep 17 00:00:00 2001 From: chai Date: Thu, 22 Oct 2020 23:30:02 +0800 Subject: * amplify shader editor --- .../Scripts/MfxObjectMaterialUpdater.cs | 79 ++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 Assets/MaterializeFX/Scripts/MfxObjectMaterialUpdater.cs (limited to 'Assets/MaterializeFX/Scripts/MfxObjectMaterialUpdater.cs') diff --git a/Assets/MaterializeFX/Scripts/MfxObjectMaterialUpdater.cs b/Assets/MaterializeFX/Scripts/MfxObjectMaterialUpdater.cs new file mode 100644 index 00000000..c828afd4 --- /dev/null +++ b/Assets/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