瀏覽代碼

Merge remote-tracking branch 'origin/master'

NathanSweet 9 年之前
父節點
當前提交
825a0d8c7c

+ 7 - 0
spine-unity/Assets/spine-unity/Modules/CustomMaterials.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: a7236dbdc6a4e5a4989483dac97aee0b
+folderAsset: yes
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 7 - 0
spine-unity/Assets/spine-unity/Modules/CustomMaterials/Editor.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 99abd7478ddde384cbf86f2ecd396900
+folderAsset: yes
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 27 - 0
spine-unity/Assets/spine-unity/Modules/CustomMaterials/Editor/SkeletonRendererCustomMaterialsInspector.cs

@@ -0,0 +1,27 @@
+/*****************************************************************************
+ * SkeletonRendererCustomMaterialsInspector created by Lost Polygon
+ * Full irrevocable rights and permissions granted to Esoteric Software
+*****************************************************************************/
+
+using UnityEditor;
+
+namespace Spine.Unity.Editor {
+	[CustomEditor(typeof(SkeletonRendererCustomMaterials))]
+	public class SkeletonRendererCustomMaterialsInspector : UnityEditor.Editor {
+		public override void OnInspectorGUI() {
+			SkeletonRendererCustomMaterials obj = (SkeletonRendererCustomMaterials) target;
+
+			// Just draw the default inspector and reapply overrides on any change
+			EditorGUI.BeginChangeCheck();
+			{
+				DrawDefaultInspector();
+			}
+			if (EditorGUI.EndChangeCheck()) {
+				obj.RemoveCustomMaterialOverrides();
+				obj.RemoveCustomSlotMaterials();
+				obj.SetCustomMaterialOverrides();
+				obj.SetCustomSlotMaterials();
+			}
+		}
+	}
+}

+ 10 - 0
spine-unity/Assets/spine-unity/Modules/CustomMaterials/Editor/SkeletonRendererCustomMaterialsInspector.cs.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: e70f7f2a241d6d34aafd6a4a52a368d0
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 161 - 0
spine-unity/Assets/spine-unity/Modules/CustomMaterials/SkeletonRendererCustomMaterials.cs

@@ -0,0 +1,161 @@
+/*****************************************************************************
+ * SkeletonRendererCustomMaterials created by Lost Polygon
+ * Full irrevocable rights and permissions granted to Esoteric Software
+*****************************************************************************/
+
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Spine.Unity {
+	[ExecuteInEditMode]
+	public class SkeletonRendererCustomMaterials : MonoBehaviour {
+		public SkeletonRenderer skeletonRenderer;
+
+		[SerializeField]
+		private List<SlotMaterialOverride> customSlotMaterials = new List<SlotMaterialOverride>();
+
+		[SerializeField]
+		private List<AtlasMaterialOverride> customMaterialOverrides = new List<AtlasMaterialOverride>();
+
+		public List<SlotMaterialOverride> CustomSlotMaterials {
+			get { return customSlotMaterials; }
+		}
+
+		public List<AtlasMaterialOverride> CustomMaterialOverrides {
+			get { return customMaterialOverrides; }
+		}
+
+		public void SetCustomSlotMaterials() {
+			if (skeletonRenderer == null) {
+				Debug.LogError("skeletonRenderer == null");
+				return;
+			}
+
+			for (int i = 0; i < customSlotMaterials.Count; i++) {
+				SlotMaterialOverride slotMaterialOverride = customSlotMaterials[i];
+				if (slotMaterialOverride.overrideDisabled || string.IsNullOrEmpty(slotMaterialOverride.slotName))
+					continue;
+
+				Slot slotObject = skeletonRenderer.skeleton.FindSlot(slotMaterialOverride.slotName);
+				skeletonRenderer.CustomSlotMaterials[slotObject] = slotMaterialOverride.material;
+			}
+		}
+
+		public void RemoveCustomSlotMaterials() {
+			if (skeletonRenderer == null) {
+				Debug.LogError("skeletonRenderer == null");
+				return;
+			}
+
+			for (int i = 0; i < customSlotMaterials.Count; i++) {
+				SlotMaterialOverride slotMaterialOverride = customSlotMaterials[i];
+				if (string.IsNullOrEmpty(slotMaterialOverride.slotName))
+					continue;
+
+				Slot slotObject = skeletonRenderer.skeleton.FindSlot(slotMaterialOverride.slotName);
+
+				Material currentMaterial;
+				if (!skeletonRenderer.CustomSlotMaterials.TryGetValue(slotObject, out currentMaterial))
+					continue;
+
+				// Do not revert the material if it was changed by something else
+				if (currentMaterial != slotMaterialOverride.material)
+					continue;
+
+				skeletonRenderer.CustomSlotMaterials.Remove(slotObject);
+			}
+		}
+
+		public void SetCustomMaterialOverrides() {
+			if (skeletonRenderer == null) {
+				Debug.LogError("skeletonRenderer == null");
+				return;
+			}
+
+			for (int i = 0; i < customMaterialOverrides.Count; i++) {
+				AtlasMaterialOverride atlasMaterialOverride = customMaterialOverrides[i];
+				if (atlasMaterialOverride.overrideDisabled)
+					continue;
+
+				skeletonRenderer.CustomMaterialOverride[atlasMaterialOverride.originalMaterial] = atlasMaterialOverride.replacementMaterial;
+			}
+		}
+
+		public void RemoveCustomMaterialOverrides() {
+			if (skeletonRenderer == null) {
+				Debug.LogError("skeletonRenderer == null");
+				return;
+			}
+
+			for (int i = 0; i < customMaterialOverrides.Count; i++) {
+				AtlasMaterialOverride atlasMaterialOverride = customMaterialOverrides[i];
+				Material currentMaterial;
+				if (!skeletonRenderer.CustomMaterialOverride.TryGetValue(atlasMaterialOverride.originalMaterial, out currentMaterial))
+					continue;
+
+				// Do not revert the material if it was changed by something else
+				if (currentMaterial != atlasMaterialOverride.replacementMaterial)
+					continue;
+
+				skeletonRenderer.CustomMaterialOverride.Remove(atlasMaterialOverride.originalMaterial);
+			}
+		}
+
+		private void OnEnable() {
+			if (skeletonRenderer == null) {
+				skeletonRenderer = GetComponent<SkeletonRenderer>();
+			}
+
+            skeletonRenderer.Initialize(false);
+			SetCustomMaterialOverrides();
+			SetCustomSlotMaterials();
+		}
+
+		private void OnDisable() {
+			RemoveCustomMaterialOverrides();
+			RemoveCustomSlotMaterials();
+		}
+
+		private void Reset() {
+			skeletonRenderer = GetComponent<SkeletonRenderer>();
+
+			// Populate atlas list
+			if (skeletonRenderer != null && skeletonRenderer.skeletonDataAsset != null) {
+				AtlasAsset[] atlasAssets = skeletonRenderer.skeletonDataAsset.atlasAssets;
+
+				List<AtlasMaterialOverride> initialAtlasMaterialOverrides = new List<AtlasMaterialOverride>();
+				foreach (AtlasAsset atlasAsset in atlasAssets) {
+					foreach (Material atlasMaterial in atlasAsset.materials) {
+						AtlasMaterialOverride atlasMaterialOverride = new AtlasMaterialOverride();
+						atlasMaterialOverride.overrideDisabled = true;
+						atlasMaterialOverride.originalMaterial = atlasMaterial;
+
+						initialAtlasMaterialOverrides.Add(atlasMaterialOverride);
+					}
+				}
+
+				customMaterialOverrides = initialAtlasMaterialOverrides;
+			}
+		}
+
+		[Serializable]
+		public class MaterialOverride {
+			public bool overrideDisabled;
+		}
+
+		[Serializable]
+		public class SlotMaterialOverride : MaterialOverride {
+			[SpineSlot]
+			public string slotName;
+
+			public Material material;
+		}
+
+		[Serializable]
+		public class AtlasMaterialOverride : MaterialOverride {
+			public Material originalMaterial;
+			public Material replacementMaterial;
+		}
+	}
+}

+ 10 - 0
spine-unity/Assets/spine-unity/Modules/CustomMaterials/SkeletonRendererCustomMaterials.cs.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 26947ae098a8447408d80c0c86e35b48
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: