[unity] Fixed transition blending of Deform timeline. Led to difference of vertex location to reference implementation after animation transition. Closes #1525.

This commit is contained in:
Harald Csaszar 2019-10-18 15:17:24 +02:00
parent 5b98c80d32
commit 8b9c9314f2
2 changed files with 13 additions and 14 deletions

View File

@ -1064,7 +1064,7 @@ namespace Spine {
case MixBlend.Setup: case MixBlend.Setup:
deformArray.Clear(); deformArray.Clear();
return; return;
case MixBlend.Replace: case MixBlend.First:
if (alpha == 1) { if (alpha == 1) {
deformArray.Clear(); deformArray.Clear();
return; return;

View File

@ -76,8 +76,7 @@ namespace Spine {
protected AnimationStateData data; protected AnimationStateData data;
private readonly ExposedList<TrackEntry> tracks = new ExposedList<TrackEntry>(); private readonly ExposedList<TrackEntry> tracks = new ExposedList<TrackEntry>();
private readonly ExposedList<Event> events = new ExposedList<Event>(); private readonly ExposedList<Event> events = new ExposedList<Event>();
// difference to libgdx reference: delegates are used for event callbacks instead of 'final SnapshotArray<AnimationStateListener> listeners'.
// difference to libgdx reference: delegates are used for event callbacks instead of 'Array<AnimationStateListener> listeners'.
internal void OnStart (TrackEntry entry) { if (Start != null) Start(entry); } internal void OnStart (TrackEntry entry) { if (Start != null) Start(entry); }
internal void OnInterrupt (TrackEntry entry) { if (Interrupt != null) Interrupt(entry); } internal void OnInterrupt (TrackEntry entry) { if (Interrupt != null) Interrupt(entry); }
internal void OnEnd (TrackEntry entry) { if (End != null) End(entry); } internal void OnEnd (TrackEntry entry) { if (End != null) End(entry); }
@ -85,12 +84,12 @@ namespace Spine {
internal void OnComplete (TrackEntry entry) { if (Complete != null) Complete(entry); } internal void OnComplete (TrackEntry entry) { if (Complete != null) Complete(entry); }
internal void OnEvent (TrackEntry entry, Event e) { if (Event != null) Event(entry, e); } internal void OnEvent (TrackEntry entry, Event e) { if (Event != null) Event(entry, e); }
public delegate void TrackEntryDelegate(TrackEntry trackEntry); public delegate void TrackEntryDelegate (TrackEntry trackEntry);
public event TrackEntryDelegate Start, Interrupt, End, Dispose, Complete; public event TrackEntryDelegate Start, Interrupt, End, Dispose, Complete;
public delegate void TrackEntryEventDelegate(TrackEntry trackEntry, Event e); public delegate void TrackEntryEventDelegate (TrackEntry trackEntry, Event e);
public event TrackEntryEventDelegate Event; public event TrackEntryEventDelegate Event;
// end of difference
private readonly EventQueue queue; // Initialized by constructor. private readonly EventQueue queue; // Initialized by constructor.
private readonly HashSet<int> propertyIDs = new HashSet<int>(); private readonly HashSet<int> propertyIDs = new HashSet<int>();
private bool animationsChanged; private bool animationsChanged;
@ -98,7 +97,7 @@ namespace Spine {
private readonly Pool<TrackEntry> trackEntryPool = new Pool<TrackEntry>(); private readonly Pool<TrackEntry> trackEntryPool = new Pool<TrackEntry>();
public AnimationState(AnimationStateData data) { public AnimationState (AnimationStateData data) {
if (data == null) throw new ArgumentNullException("data", "data cannot be null."); if (data == null) throw new ArgumentNullException("data", "data cannot be null.");
this.data = data; this.data = data;
this.queue = new EventQueue( this.queue = new EventQueue(
@ -233,8 +232,8 @@ namespace Spine {
} else { } else {
var timelineMode = current.timelineMode.Items; var timelineMode = current.timelineMode.Items;
bool firstFrame = current.timelinesRotation.Count == 0; bool firstFrame = current.timelinesRotation.Count != timelineCount << 1;
if (firstFrame) current.timelinesRotation.EnsureCapacity(timelines.Count << 1); if (firstFrame) current.timelinesRotation.Resize(timelines.Count << 1);
var timelinesRotation = current.timelinesRotation.Items; var timelinesRotation = current.timelinesRotation.Items;
for (int ii = 0; ii < timelineCount; ii++) { for (int ii = 0; ii < timelineCount; ii++) {
@ -242,8 +241,8 @@ namespace Spine {
MixBlend timelineBlend = (timelineMode[ii] & AnimationState.NotLast - 1) == AnimationState.Subsequent ? blend : MixBlend.Setup; MixBlend timelineBlend = (timelineMode[ii] & AnimationState.NotLast - 1) == AnimationState.Subsequent ? blend : MixBlend.Setup;
var rotateTimeline = timeline as RotateTimeline; var rotateTimeline = timeline as RotateTimeline;
if (rotateTimeline != null) if (rotateTimeline != null)
ApplyRotateTimeline(rotateTimeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, ApplyRotateTimeline(rotateTimeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation,
firstFrame); ii << 1, firstFrame);
else else
timeline.Apply(skeleton, animationLast, animationTime, events, mix, timelineBlend, MixDirection.In); timeline.Apply(skeleton, animationLast, animationTime, events, mix, timelineBlend, MixDirection.In);
} }
@ -287,7 +286,7 @@ namespace Spine {
var timelineMode = from.timelineMode.Items; var timelineMode = from.timelineMode.Items;
var timelineHoldMix = from.timelineHoldMix.Items; var timelineHoldMix = from.timelineHoldMix.Items;
bool firstFrame = from.timelinesRotation.Count == 0; bool firstFrame = from.timelinesRotation.Count != timelineCount << 1;
if (firstFrame) from.timelinesRotation.Resize(timelines.Count << 1); // from.timelinesRotation.setSize if (firstFrame) from.timelinesRotation.Resize(timelines.Count << 1); // from.timelinesRotation.setSize
var timelinesRotation = from.timelinesRotation.Items; var timelinesRotation = from.timelinesRotation.Items;
@ -325,8 +324,8 @@ namespace Spine {
var rotateTimeline = timeline as RotateTimeline; var rotateTimeline = timeline as RotateTimeline;
if (rotateTimeline != null) { if (rotateTimeline != null) {
ApplyRotateTimeline(rotateTimeline, skeleton, animationTime, alpha, timelineBlend, timelinesRotation, i << 1, ApplyRotateTimeline(rotateTimeline, skeleton, animationTime, alpha, timelineBlend, timelinesRotation,
firstFrame); i << 1, firstFrame);
} else { } else {
if (timelineBlend == MixBlend.Setup) { if (timelineBlend == MixBlend.Setup) {
if (timeline is AttachmentTimeline) { if (timeline is AttachmentTimeline) {