Improved material overrides (#536)

* per-material material overrides, separate MonoBehaviour for setting overrides from inspector

* clean-up and fix SkeletonRendererMaterialOverride

* SkeletonRendererCustomMaterials: initialize SkeletonRenderer to ensure skeletonRenderer.skeleton != null

* rename SkeletonRendererCustomMaterials folder for consistency
This commit is contained in:
Serhii Yolkin 2016-04-13 18:56:32 +02:00 committed by John
parent ba5e4073c3
commit a634d39765
6 changed files with 222 additions and 0 deletions

View File

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

View File

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

View File

@ -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();
}
}
}
}

View File

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

View File

@ -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;
}
}
}

View File

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