[unity] Fixed SkeletonGraphic with multiple materials displaying white square and issuing error when number of renderers changes in SkeletonGraphic.Rebuild. Closes #1826.

This commit is contained in:
Harald Csaszar 2021-01-08 17:59:18 +01:00
parent e95e130e9b
commit 82a0de85bc

View File

@ -72,6 +72,8 @@ namespace Spine.Unity {
public bool unscaledTime; public bool unscaledTime;
public bool allowMultipleCanvasRenderers = false; public bool allowMultipleCanvasRenderers = false;
public List<CanvasRenderer> canvasRenderers = new List<CanvasRenderer>(); public List<CanvasRenderer> canvasRenderers = new List<CanvasRenderer>();
protected List<RawImage> rawImages = new List<RawImage>();
protected int usedRenderersCount = 0;
// Submesh Separation // Submesh Separation
public const string SeparatorPartGameObjectName = "Part"; public const string SeparatorPartGameObjectName = "Part";
@ -200,6 +202,7 @@ namespace Spine.Unity {
protected override void Awake () { protected override void Awake () {
base.Awake (); base.Awake ();
SyncRawImagesWithCanvasRenderers();
if (!this.IsValid) { if (!this.IsValid) {
#if UNITY_EDITOR #if UNITY_EDITOR
// workaround for special import case of open scene where OnValidate and Awake are // workaround for special import case of open scene where OnValidate and Awake are
@ -217,7 +220,7 @@ namespace Spine.Unity {
public override void Rebuild (CanvasUpdate update) { public override void Rebuild (CanvasUpdate update) {
base.Rebuild(update); base.Rebuild(update);
if (canvasRenderer.cull) return; if (canvasRenderer.cull) return;
if (update == CanvasUpdate.PreRender) UpdateMesh(); if (update == CanvasUpdate.PreRender) UpdateMesh(keepRendererCount : true);
if (allowMultipleCanvasRenderers) canvasRenderer.Clear(); if (allowMultipleCanvasRenderers) canvasRenderer.Clear();
} }
@ -253,6 +256,12 @@ namespace Spine.Unity {
ApplyAnimation(); ApplyAnimation();
} }
protected void SyncRawImagesWithCanvasRenderers () {
rawImages.Clear();
foreach (var canvasRenderer in canvasRenderers)
rawImages.Add(canvasRenderer.GetComponent<RawImage>());
}
protected void UpdateAnimationStatus (float deltaTime) { protected void UpdateAnimationStatus (float deltaTime) {
deltaTime *= timeScale; deltaTime *= timeScale;
skeleton.Update(deltaTime); skeleton.Update(deltaTime);
@ -264,7 +273,7 @@ namespace Spine.Unity {
BeforeApply(this); BeforeApply(this);
if (updateMode != UpdateMode.OnlyEventTimelines) if (updateMode != UpdateMode.OnlyEventTimelines)
state.Apply(skeleton); state.Apply(skeleton);
else else
state.ApplyEventTimelinesOnly(skeleton); state.ApplyEventTimelinesOnly(skeleton);
@ -452,6 +461,7 @@ namespace Spine.Unity {
} }
} }
canvasRenderers = newList; canvasRenderers = newList;
SyncRawImagesWithCanvasRenderers();
} }
public void Initialize (bool overwrite) { public void Initialize (bool overwrite) {
@ -503,7 +513,7 @@ namespace Spine.Unity {
OnRebuild(this); OnRebuild(this);
} }
public void UpdateMesh () { public void UpdateMesh (bool keepRendererCount = false) {
if (!this.IsValid) return; if (!this.IsValid) return;
skeleton.SetColor(this.color); skeleton.SetColor(this.color);
@ -513,7 +523,7 @@ namespace Spine.Unity {
UpdateMeshSingleCanvasRenderer(); UpdateMeshSingleCanvasRenderer();
} }
else { else {
UpdateMeshMultipleCanvasRenderers(currentInstructions); UpdateMeshMultipleCanvasRenderers(currentInstructions, keepRendererCount);
} }
if (OnMeshAndMaterialsUpdated != null) if (OnMeshAndMaterialsUpdated != null)
@ -574,15 +584,18 @@ namespace Spine.Unity {
} }
//this.UpdateMaterial(); // note: This would allocate memory. //this.UpdateMaterial(); // note: This would allocate memory.
usedRenderersCount = 0;
} }
protected void UpdateMeshMultipleCanvasRenderers (SkeletonRendererInstruction currentInstructions) { protected void UpdateMeshMultipleCanvasRenderers (SkeletonRendererInstruction currentInstructions, bool keepRendererCount) {
MeshGenerator.GenerateSkeletonRendererInstruction(currentInstructions, skeleton, null, MeshGenerator.GenerateSkeletonRendererInstruction(currentInstructions, skeleton, null,
enableSeparatorSlots ? separatorSlots : null, enableSeparatorSlots ? separatorSlots : null,
enableSeparatorSlots ? separatorSlots.Count > 0 : false, enableSeparatorSlots ? separatorSlots.Count > 0 : false,
false); false);
int submeshCount = currentInstructions.submeshInstructions.Count; int submeshCount = currentInstructions.submeshInstructions.Count;
if (keepRendererCount && submeshCount != usedRenderersCount)
return;
EnsureCanvasRendererCount(submeshCount); EnsureCanvasRendererCount(submeshCount);
EnsureMeshesCount(submeshCount); EnsureMeshesCount(submeshCount);
EnsureSeparatorPartCount(); EnsureSeparatorPartCount();
@ -618,7 +631,10 @@ namespace Spine.Unity {
var submeshMaterial = submeshInstructionItem.material; var submeshMaterial = submeshInstructionItem.material;
var canvasRenderer = canvasRenderers[i]; var canvasRenderer = canvasRenderers[i];
canvasRenderer.gameObject.SetActive(true); if (i >= usedRenderersCount) {
canvasRenderer.gameObject.SetActive(true);
rawImages[i].Rebuild(CanvasUpdate.PreRender);
}
canvasRenderer.SetMesh(targetMesh); canvasRenderer.SetMesh(targetMesh);
canvasRenderer.materialCount = 1; canvasRenderer.materialCount = 1;
@ -647,6 +663,7 @@ namespace Spine.Unity {
} }
DisableUnusedCanvasRenderers(usedCount : submeshCount); DisableUnusedCanvasRenderers(usedCount : submeshCount);
usedRenderersCount = submeshCount;
} }
protected void EnsureCanvasRendererCount (int targetCount) { protected void EnsureCanvasRendererCount (int targetCount) {
@ -663,6 +680,7 @@ namespace Spine.Unity {
var rawImage = go.AddComponent<RawImage>(); var rawImage = go.AddComponent<RawImage>();
rawImage.maskable = this.maskable; rawImage.maskable = this.maskable;
rawImage.raycastTarget = false; rawImage.raycastTarget = false;
rawImages.Add(rawImage);
} }
} }