[csharp] Don't mix from uninitialized vertices. See https://github.com/EsotericSoftware/spine-runtimes/issues/1016

This commit is contained in:
John 2017-10-11 17:09:59 +08:00 committed by GitHub
parent f31d98506c
commit 4277027e0d

View File

@ -797,8 +797,6 @@ namespace Spine {
}
public class DeformTimeline : CurveTimeline {
static float[] zeros = new float[64];
internal int slotIndex;
internal float[] frames;
internal float[][] frameVertices;
@ -831,30 +829,30 @@ namespace Spine {
if (vertexAttachment == null || !vertexAttachment.ApplyDeform(attachment)) return;
var verticesArray = slot.attachmentVertices;
if (verticesArray.Count == 0) alpha = 1;
float[][] frameVertices = this.frameVertices;
int vertexCount = frameVertices[0].Length;
if (verticesArray.Capacity < vertexCount) verticesArray.Capacity = vertexCount; // verticesArray.SetSize(vertexCount) // Ensure size and preemptively set count.
verticesArray.Count = vertexCount;
float[] vertices = verticesArray.Items;
float[] frames = this.frames;
float[] vertices;
if (time < frames[0]) {
switch (pose) {
case MixPose.Setup:
float[] zeroVertices;
if (vertexAttachment.bones == null) {
// Unweighted vertex positions (setup pose).
zeroVertices = vertexAttachment.vertices;
} else {
// Weighted deform offsets (zeros).
zeroVertices = DeformTimeline.zeros;
if (zeroVertices.Length < vertexCount) DeformTimeline.zeros = zeroVertices = new float[vertexCount];
}
Array.Copy(zeroVertices, 0, vertices, 0, vertexCount);
verticesArray.Clear();
return;
case MixPose.Current:
if (alpha == 1) return;
if (alpha == 1) {
verticesArray.Clear();
return;
}
// verticesArray.SetSize(vertexCount) // Ensure size and preemptively set count.
if (verticesArray.Capacity < vertexCount) verticesArray.Capacity = vertexCount;
verticesArray.Count = vertexCount;
vertices = verticesArray.Items;
if (vertexAttachment.bones == null) {
// Unweighted vertex positions.
float[] setupVertices = vertexAttachment.vertices;
@ -873,6 +871,11 @@ namespace Spine {
}
// verticesArray.SetSize(vertexCount) // Ensure size and preemptively set count.
if (verticesArray.Capacity < vertexCount) verticesArray.Capacity = vertexCount;
verticesArray.Count = vertexCount;
vertices = verticesArray.Items;
if (time >= frames[frames.Length - 1]) { // Time is after last frame.
float[] lastVertices = frameVertices[frames.Length - 1];
if (alpha == 1) {