diff --git a/spine-unity/Assets/spine-unity/SkeletonRenderer.cs b/spine-unity/Assets/spine-unity/SkeletonRenderer.cs index 4cf20e743..2c9afe39e 100644 --- a/spine-unity/Assets/spine-unity/SkeletonRenderer.cs +++ b/spine-unity/Assets/spine-unity/SkeletonRenderer.cs @@ -31,6 +31,7 @@ #define SPINE_OPTIONAL_NORMALS #define SPINE_OPTIONAL_FRONTFACING #define SPINE_OPTIONAL_RENDEROVERRIDE +#define SPINE_OPTIONAL_MATERIALOVERRIDE //#define SPINE_OPTIONAL_SUBMESHRENDERER // Deprecated using System; @@ -96,29 +97,31 @@ namespace Spine.Unity { private Spine.Unity.Modules.SkeletonUtilitySubmeshRenderer[] submeshRenderers; #endif + #if SPINE_OPTIONAL_MATERIALOVERRIDE + [System.NonSerialized] readonly Dictionary customMaterialOverride = new Dictionary(); + public Dictionary CustomMaterialOverride { get { return customMaterialOverride; } } + #endif + // Custom Slot Material [System.NonSerialized] readonly Dictionary customSlotMaterials = new Dictionary(); public Dictionary CustomSlotMaterials { get { return customSlotMaterials; } } #endregion - [System.NonSerialized] public bool valid; - [System.NonSerialized] public Skeleton skeleton; - MeshRenderer meshRenderer; MeshFilter meshFilter; + [System.NonSerialized] public bool valid; + [System.NonSerialized] public Skeleton skeleton; + Spine.Unity.DoubleBuffered doubleBufferedMesh; readonly SmartMesh.Instruction currentInstructions = new SmartMesh.Instruction(); readonly ExposedList submeshes = new ExposedList(); - + readonly ExposedList submeshMaterials = new ExposedList(); + Material[] sharedMaterials = new Material[0]; float[] tempVertices = new float[8]; Vector3[] vertices; Color32[] colors; Vector2[] uvs; - - readonly ExposedList submeshMaterials = new ExposedList(); - Material[] sharedMaterials = new Material[0]; - #if SPINE_OPTIONAL_NORMALS Vector3[] normals; Vector4[] tangents; @@ -254,7 +257,7 @@ namespace Spine.Unity { var workingSubmeshInstructions = workingInstruction.submeshInstructions; // Items array should not be cached. There is dynamic writing to this list. workingSubmeshInstructions.Clear(false); - bool isCustomMaterialsPopulated = customSlotMaterials.Count > 0; + bool isCustomSlotMaterialsPopulated = customSlotMaterials.Count > 0; int vertexCount = 0; int submeshVertexCount = 0; @@ -302,7 +305,7 @@ namespace Spine.Unity { // Material material = (Material)((AtlasRegion)rendererObject).page.rendererObject; // For no customSlotMaterials Material material; - if (isCustomMaterialsPopulated) { + if (isCustomSlotMaterialsPopulated) { if (!customSlotMaterials.TryGetValue(slot, out material)) { material = (Material)((AtlasRegion)rendererObject).page.rendererObject; } @@ -360,6 +363,24 @@ namespace Spine.Unity { workingInstruction.frontFacing = this.frontFacing; #endif + // STEP 1.9. Post-process workingInstructions. + + #if SPINE_OPTIONAL_MATERIALOVERRIDE + // Material overrides are done here so they can be applied per submesh instead of per slot + // but they will still be passed through the GenerateMeshOverride delegate, + // and will still go through the normal material match check step in STEP 3. + if (customMaterialOverride.Count > 0) { // isCustomMaterialOverridePopulated + var workingSubmeshInstructionsItems = workingSubmeshInstructions.Items; + for (int i = 0; i < workingSubmeshInstructions.Count; i++) { + var m = workingSubmeshInstructionsItems[i].material; + Material mo; + if (customMaterialOverride.TryGetValue(m, out mo)) { + workingSubmeshInstructionsItems[i].material = mo; + } + } + } + #endif + #if SPINE_OPTIONAL_RENDEROVERRIDE if (this.generateMeshOverride != null) { this.generateMeshOverride(workingInstruction); @@ -616,6 +637,11 @@ namespace Spine.Unity { currentMesh.vertices = vertices; currentMesh.colors32 = colors; currentMesh.uv = uvs; + + Vector3 meshBoundsExtents = meshBoundsMax - meshBoundsMin; + Vector3 meshBoundsCenter = meshBoundsMin + meshBoundsExtents * 0.5f; + currentMesh.bounds = new Bounds(meshBoundsCenter, meshBoundsExtents); + var currentSmartMeshInstructionUsed = currentSmartMesh.instructionUsed; #if SPINE_OPTIONAL_NORMALS if (currentSmartMeshInstructionUsed.vertexCount < vertexCount) { @@ -660,10 +686,6 @@ namespace Spine.Unity { currentMesh.SetTriangles(submeshes.Items[i].triangles, i); } - Vector3 meshBoundsExtents = meshBoundsMax - meshBoundsMin; - Vector3 meshBoundsCenter = meshBoundsMin + meshBoundsExtents * 0.5f; - currentMesh.bounds = new Bounds(meshBoundsCenter, meshBoundsExtents); - // CheckIfMustUpdateMaterialArray (last pushed materials vs currently parsed materials) // Needs to check against the Working Submesh Instructions Materials instead of the cached submeshMaterials. {