mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2025-12-20 17:26:01 +08:00
[unity] Fixed SkeletonRenderTexture and SkeletonGraphicRenderTexture issues when mesh is empty. Closes #2529.
This commit is contained in:
parent
e39ed25240
commit
98a9deb5df
@ -67,6 +67,19 @@ namespace Spine.Unity.Examples {
|
|||||||
protected SkeletonSubmeshGraphic quadMaskableGraphic;
|
protected SkeletonSubmeshGraphic quadMaskableGraphic;
|
||||||
protected readonly Vector3[] worldCorners = new Vector3[4];
|
protected readonly Vector3[] worldCorners = new Vector3[4];
|
||||||
|
|
||||||
|
public void ResetMeshRendererMaterials () {
|
||||||
|
meshRendererMaterialForTexture.Clear();
|
||||||
|
AtlasAssetBase[] atlasAssets = skeletonGraphic.SkeletonDataAsset.atlasAssets;
|
||||||
|
for (int i = 0; i < atlasAssets.Length; ++i) {
|
||||||
|
foreach (Material material in atlasAssets[i].Materials) {
|
||||||
|
if (material.mainTexture != null) {
|
||||||
|
meshRendererMaterialForTexture.Add(
|
||||||
|
new TextureMaterialPair(material.mainTexture, material));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected override void Awake () {
|
protected override void Awake () {
|
||||||
base.Awake();
|
base.Awake();
|
||||||
skeletonGraphic = this.GetComponent<SkeletonGraphic>();
|
skeletonGraphic = this.GetComponent<SkeletonGraphic>();
|
||||||
@ -97,16 +110,7 @@ namespace Spine.Unity.Examples {
|
|||||||
|
|
||||||
void Reset () {
|
void Reset () {
|
||||||
skeletonGraphic = this.GetComponent<SkeletonGraphic>();
|
skeletonGraphic = this.GetComponent<SkeletonGraphic>();
|
||||||
AtlasAssetBase[] atlasAssets = skeletonGraphic.SkeletonDataAsset.atlasAssets;
|
ResetMeshRendererMaterials();
|
||||||
for (int i = 0; i < atlasAssets.Length; ++i) {
|
|
||||||
foreach (Material material in atlasAssets[i].Materials) {
|
|
||||||
if (material.mainTexture != null) {
|
|
||||||
meshRendererMaterialForTexture.Add(
|
|
||||||
new TextureMaterialPair(material.mainTexture, material));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
string[] assets = UnityEditor.AssetDatabase.FindAssets("t:material RenderQuadGraphicMaterial");
|
string[] assets = UnityEditor.AssetDatabase.FindAssets("t:material RenderQuadGraphicMaterial");
|
||||||
if (assets.Length > 0) {
|
if (assets.Length > 0) {
|
||||||
@ -122,6 +126,7 @@ namespace Spine.Unity.Examples {
|
|||||||
skeletonGraphic.AssignMeshOverrideMultipleRenderers += RenderMultipleMeshesToRenderTexture;
|
skeletonGraphic.AssignMeshOverrideMultipleRenderers += RenderMultipleMeshesToRenderTexture;
|
||||||
skeletonGraphic.disableMeshAssignmentOnOverride = true;
|
skeletonGraphic.disableMeshAssignmentOnOverride = true;
|
||||||
skeletonGraphic.OnMeshAndMaterialsUpdated += RenderOntoQuad;
|
skeletonGraphic.OnMeshAndMaterialsUpdated += RenderOntoQuad;
|
||||||
|
skeletonGraphic.OnAnimationRebuild += OnRebuild;
|
||||||
List<CanvasRenderer> canvasRenderers = skeletonGraphic.canvasRenderers;
|
List<CanvasRenderer> canvasRenderers = skeletonGraphic.canvasRenderers;
|
||||||
for (int i = 0; i < canvasRenderers.Count; ++i)
|
for (int i = 0; i < canvasRenderers.Count; ++i)
|
||||||
canvasRenderers[i].cull = true;
|
canvasRenderers[i].cull = true;
|
||||||
@ -136,6 +141,7 @@ namespace Spine.Unity.Examples {
|
|||||||
skeletonGraphic.AssignMeshOverrideMultipleRenderers -= RenderMultipleMeshesToRenderTexture;
|
skeletonGraphic.AssignMeshOverrideMultipleRenderers -= RenderMultipleMeshesToRenderTexture;
|
||||||
skeletonGraphic.disableMeshAssignmentOnOverride = false;
|
skeletonGraphic.disableMeshAssignmentOnOverride = false;
|
||||||
skeletonGraphic.OnMeshAndMaterialsUpdated -= RenderOntoQuad;
|
skeletonGraphic.OnMeshAndMaterialsUpdated -= RenderOntoQuad;
|
||||||
|
skeletonGraphic.OnAnimationRebuild -= OnRebuild;
|
||||||
List<CanvasRenderer> canvasRenderers = skeletonGraphic.canvasRenderers;
|
List<CanvasRenderer> canvasRenderers = skeletonGraphic.canvasRenderers;
|
||||||
for (int i = 0; i < canvasRenderers.Count; ++i)
|
for (int i = 0; i < canvasRenderers.Count; ++i)
|
||||||
canvasRenderers[i].cull = false;
|
canvasRenderers[i].cull = false;
|
||||||
@ -156,6 +162,10 @@ namespace Spine.Unity.Examples {
|
|||||||
AssignAtQuad();
|
AssignAtQuad();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OnRebuild (ISkeletonAnimation skeletonGraphic) {
|
||||||
|
ResetMeshRendererMaterials();
|
||||||
|
}
|
||||||
|
|
||||||
protected void PrepareForMesh () {
|
protected void PrepareForMesh () {
|
||||||
// We need to get the min/max of all four corners, rotation of the skeleton
|
// We need to get the min/max of all four corners, rotation of the skeleton
|
||||||
// in combination with perspective projection otherwise might lead to incorrect
|
// in combination with perspective projection otherwise might lead to incorrect
|
||||||
@ -207,6 +217,7 @@ namespace Spine.Unity.Examples {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void RenderSingleMeshToRenderTexture (Mesh mesh, Material graphicMaterial, Texture texture) {
|
protected void RenderSingleMeshToRenderTexture (Mesh mesh, Material graphicMaterial, Texture texture) {
|
||||||
|
if (mesh.subMeshCount == 0) return;
|
||||||
Material meshRendererMaterial = MeshRendererMaterialForTexture(texture);
|
Material meshRendererMaterial = MeshRendererMaterialForTexture(texture);
|
||||||
foreach (int shaderPass in shaderPasses)
|
foreach (int shaderPass in shaderPasses)
|
||||||
commandBuffer.DrawMesh(mesh, transform.localToWorldMatrix, meshRendererMaterial, 0, shaderPass);
|
commandBuffer.DrawMesh(mesh, transform.localToWorldMatrix, meshRendererMaterial, 0, shaderPass);
|
||||||
@ -217,9 +228,12 @@ namespace Spine.Unity.Examples {
|
|||||||
Mesh[] meshes, Material[] graphicMaterials, Texture[] textures) {
|
Mesh[] meshes, Material[] graphicMaterials, Texture[] textures) {
|
||||||
|
|
||||||
for (int i = 0; i < meshCount; ++i) {
|
for (int i = 0; i < meshCount; ++i) {
|
||||||
|
Mesh mesh = meshes[i];
|
||||||
|
if (mesh.subMeshCount == 0) continue;
|
||||||
|
|
||||||
Material meshRendererMaterial = MeshRendererMaterialForTexture(textures[i]);
|
Material meshRendererMaterial = MeshRendererMaterialForTexture(textures[i]);
|
||||||
foreach (int shaderPass in shaderPasses)
|
foreach (int shaderPass in shaderPasses)
|
||||||
commandBuffer.DrawMesh(meshes[i], transform.localToWorldMatrix, meshRendererMaterial, 0, shaderPass);
|
commandBuffer.DrawMesh(mesh, transform.localToWorldMatrix, meshRendererMaterial, 0, shaderPass);
|
||||||
}
|
}
|
||||||
Graphics.ExecuteCommandBuffer(commandBuffer);
|
Graphics.ExecuteCommandBuffer(commandBuffer);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -128,6 +128,11 @@ namespace Spine.Unity.Examples {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RenderOntoQuad (SkeletonRenderer skeletonRenderer) {
|
void RenderOntoQuad (SkeletonRenderer skeletonRenderer) {
|
||||||
|
Vector3 size = meshFilter.sharedMesh.bounds.size;
|
||||||
|
if (size.x == 0f || size.y == 0f) {
|
||||||
|
AssignNullMeshAtQuad();
|
||||||
|
return;
|
||||||
|
}
|
||||||
PrepareForMesh();
|
PrepareForMesh();
|
||||||
RenderToRenderTexture();
|
RenderToRenderTexture();
|
||||||
AssignAtQuad();
|
AssignAtQuad();
|
||||||
@ -198,6 +203,10 @@ namespace Spine.Unity.Examples {
|
|||||||
quadMeshRenderer.sharedMaterial.mainTexture = this.renderTexture;
|
quadMeshRenderer.sharedMaterial.mainTexture = this.renderTexture;
|
||||||
quadMeshRenderer.sharedMaterial.color = color;
|
quadMeshRenderer.sharedMaterial.color = color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void AssignNullMeshAtQuad () {
|
||||||
|
quadMeshFilter.mesh = null;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
"name": "com.esotericsoftware.spine.spine-unity-examples",
|
"name": "com.esotericsoftware.spine.spine-unity-examples",
|
||||||
"displayName": "spine-unity Runtime Examples",
|
"displayName": "spine-unity Runtime Examples",
|
||||||
"description": "This plugin provides example scenes and scripts for the spine-unity runtime.",
|
"description": "This plugin provides example scenes and scripts for the spine-unity runtime.",
|
||||||
"version": "4.2.30",
|
"version": "4.2.31",
|
||||||
"unity": "2018.3",
|
"unity": "2018.3",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Esoteric Software",
|
"name": "Esoteric Software",
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
"name": "com.esotericsoftware.spine.spine-unity",
|
"name": "com.esotericsoftware.spine.spine-unity",
|
||||||
"displayName": "spine-unity Runtime",
|
"displayName": "spine-unity Runtime",
|
||||||
"description": "This plugin provides the spine-unity runtime core.",
|
"description": "This plugin provides the spine-unity runtime core.",
|
||||||
"version": "4.2.63",
|
"version": "4.2.64",
|
||||||
"unity": "2018.3",
|
"unity": "2018.3",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Esoteric Software",
|
"name": "Esoteric Software",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user