Skip to content

Commit

Permalink
[csharp] Fixed mixing unweighted meshes that aren't keyed on frame ze…
Browse files Browse the repository at this point in the history
…ro. a8e1faf
  • Loading branch information
pharan committed Jun 22, 2017
1 parent f9a4107 commit 4e7a409
Showing 1 changed file with 31 additions and 15 deletions.
46 changes: 31 additions & 15 deletions spine-csharp/src/Animation.cs
Expand Up @@ -797,6 +797,8 @@ public class AttachmentTimeline : Timeline {
}

public class DeformTimeline : CurveTimeline {
static float[] zeros = new float[64];

internal int slotIndex;
internal float[] frames;
internal float[][] frameVertices;
Expand Down Expand Up @@ -825,43 +827,58 @@ public DeformTimeline (int frameCount)

override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList<Event> firedEvents, float alpha, MixPose pose, MixDirection direction) {
Slot slot = skeleton.slots.Items[slotIndex];
VertexAttachment slotAttachment = slot.attachment as VertexAttachment;
if (slotAttachment == null || !slotAttachment.ApplyDeform(attachment)) return;
VertexAttachment vertexAttachment = slot.attachment as VertexAttachment;
if (vertexAttachment == null || !vertexAttachment.ApplyDeform(attachment)) return;

var verticesArray = slot.attachmentVertices;
float[][] frameVertices = this.frameVertices;
int vertexCount = frameVertices[0].Length;
if (verticesArray.Count != vertexCount && pose != MixPose.Setup) alpha = 1; // Don't mix from uninitialized slot vertices.
// verticesArray.SetSize(vertexCount) // Ensure size and preemptively set count.
if (verticesArray.Capacity < vertexCount) verticesArray.Capacity = vertexCount;
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;
if (time < frames[0]) {

switch (pose) {
case MixPose.Setup:
verticesArray.Clear();
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);
return;
case MixPose.Current:
alpha = 1 - alpha;
for (int i = 0; i < vertexCount; i++)
vertices[i] *= alpha;

if (alpha == 1) return;
if (vertexAttachment.bones == null) {
// Unweighted vertex positions.
float[] setupVertices = vertexAttachment.vertices;
for (int i = 0; i < vertexCount; i++)
vertices[i] += (setupVertices[i] - vertices[i]) * alpha;
} else {
// Weighted deform offsets.
alpha = 1 - alpha;
for (int i = 0; i < vertexCount; i++)
vertices[i] *= alpha;
}
return;
default:
return;
}
return;
}


}

if (time >= frames[frames.Length - 1]) { // Time is after last frame.
float[] lastVertices = frameVertices[frames.Length - 1];
if (alpha == 1) {
// Vertex positions or deform offsets, no alpha.
Array.Copy(lastVertices, 0, vertices, 0, vertexCount);
} else if (pose == MixPose.Setup) {
VertexAttachment vertexAttachment = slotAttachment;
if (vertexAttachment.bones == null) {
// Unweighted vertex positions, with alpha.
float[] setupVertices = vertexAttachment.vertices;
Expand Down Expand Up @@ -896,7 +913,6 @@ public DeformTimeline (int frameCount)
vertices[i] = prev + (nextVertices[i] - prev) * percent;
}
} else if (pose == MixPose.Setup) {
VertexAttachment vertexAttachment = (VertexAttachment)slotAttachment;
if (vertexAttachment.bones == null) {
// Unweighted vertex positions, with alpha.
var setupVertices = vertexAttachment.vertices;
Expand Down

0 comments on commit 4e7a409

Please sign in to comment.