mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-25 22:23:42 +08:00
Merge branch '3.7-beta' into 3.7-beta-cpp
This commit is contained in:
commit
939cecdd0f
Binary file not shown.
@ -38,8 +38,8 @@ package spine.animation {
|
|||||||
public class AnimationState {
|
public class AnimationState {
|
||||||
public static var SUBSEQUENT : int = 0;
|
public static var SUBSEQUENT : int = 0;
|
||||||
public static var FIRST : int = 1;
|
public static var FIRST : int = 1;
|
||||||
public static var DIP : int = 2;
|
public static var HOLD : int = 2;
|
||||||
public static var DIP_MIX : int = 3;
|
public static var HOLD_MIX : int = 3;
|
||||||
internal static var emptyAnimation : Animation = new Animation("<empty>", new Vector.<Timeline>(), 0);
|
internal static var emptyAnimation : Animation = new Animation("<empty>", new Vector.<Timeline>(), 0);
|
||||||
public var data : AnimationStateData;
|
public var data : AnimationStateData;
|
||||||
public var tracks : Vector.<TrackEntry> = new Vector.<TrackEntry>();
|
public var tracks : Vector.<TrackEntry> = new Vector.<TrackEntry>();
|
||||||
@ -112,6 +112,7 @@ package spine.animation {
|
|||||||
// End mixing from entries once all have completed.
|
// End mixing from entries once all have completed.
|
||||||
var from : TrackEntry = current.mixingFrom;
|
var from : TrackEntry = current.mixingFrom;
|
||||||
current.mixingFrom = null;
|
current.mixingFrom = null;
|
||||||
|
if (from != null) from.mixingTo = null;
|
||||||
while (from != null) {
|
while (from != null) {
|
||||||
queue.end(from);
|
queue.end(from);
|
||||||
from = from.mixingFrom;
|
from = from.mixingFrom;
|
||||||
@ -138,6 +139,7 @@ package spine.animation {
|
|||||||
// Require totalAlpha == 0 to ensure mixing is complete, unless mixDuration == 0 (the transition is a single frame).
|
// Require totalAlpha == 0 to ensure mixing is complete, unless mixDuration == 0 (the transition is a single frame).
|
||||||
if (from.totalAlpha == 0 || to.mixDuration == 0) {
|
if (from.totalAlpha == 0 || to.mixDuration == 0) {
|
||||||
to.mixingFrom = from.mixingFrom;
|
to.mixingFrom = from.mixingFrom;
|
||||||
|
if (from.mixingFrom != null) from.mixingFrom.mixingTo = to;
|
||||||
to.interruptAlpha = from.interruptAlpha;
|
to.interruptAlpha = from.interruptAlpha;
|
||||||
queue.end(from);
|
queue.end(from);
|
||||||
}
|
}
|
||||||
@ -174,11 +176,11 @@ package spine.animation {
|
|||||||
var timelineCount : int = current.animation.timelines.length;
|
var timelineCount : int = current.animation.timelines.length;
|
||||||
var timelines : Vector.<Timeline> = current.animation.timelines;
|
var timelines : Vector.<Timeline> = current.animation.timelines;
|
||||||
var ii : int = 0;
|
var ii : int = 0;
|
||||||
if (mix == 1 || blend == MixBlend.add) {
|
if (i == 0 && (mix == 1 || blend == MixBlend.add)) {
|
||||||
for (ii = 0; ii < timelineCount; ii++)
|
for (ii = 0; ii < timelineCount; ii++)
|
||||||
Timeline(timelines[ii]).apply(skeleton, animationLast, animationTime, events, mix, blend, MixDirection.In);
|
Timeline(timelines[ii]).apply(skeleton, animationLast, animationTime, events, mix, blend, MixDirection.In);
|
||||||
} else {
|
} else {
|
||||||
var timelineData : Vector.<int> = current.timelineData;
|
var timelineMode : Vector.<int> = current.timelineMode;
|
||||||
|
|
||||||
var firstFrame : Boolean = current.timelinesRotation.length == 0;
|
var firstFrame : Boolean = current.timelinesRotation.length == 0;
|
||||||
if (firstFrame) current.timelinesRotation.length = timelineCount << 1;
|
if (firstFrame) current.timelinesRotation.length = timelineCount << 1;
|
||||||
@ -186,7 +188,7 @@ package spine.animation {
|
|||||||
|
|
||||||
for (ii = 0; ii < timelineCount; ii++) {
|
for (ii = 0; ii < timelineCount; ii++) {
|
||||||
var timeline : Timeline = timelines[ii];
|
var timeline : Timeline = timelines[ii];
|
||||||
var timelineBlend : MixBlend = timelineData[ii] == AnimationState.SUBSEQUENT ? blend : MixBlend.setup;
|
var timelineBlend : MixBlend = timelineMode[ii] == AnimationState.SUBSEQUENT ? blend : MixBlend.setup;
|
||||||
if (timeline is RotateTimeline) {
|
if (timeline is RotateTimeline) {
|
||||||
applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
|
applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
|
||||||
} else
|
} else
|
||||||
@ -222,15 +224,15 @@ package spine.animation {
|
|||||||
var animationLast : Number = from.animationLast, animationTime : Number = from.getAnimationTime();
|
var animationLast : Number = from.animationLast, animationTime : Number = from.getAnimationTime();
|
||||||
var timelineCount : int = from.animation.timelines.length;
|
var timelineCount : int = from.animation.timelines.length;
|
||||||
var timelines : Vector.<Timeline> = from.animation.timelines;
|
var timelines : Vector.<Timeline> = from.animation.timelines;
|
||||||
var alphaDip : Number = from.alpha * to.interruptAlpha;
|
var alphaHold : Number = from.alpha * to.interruptAlpha;
|
||||||
var alphaMix : Number = alphaDip * (1 - mix);
|
var alphaMix : Number = alphaHold * (1 - mix);
|
||||||
var i : int = 0;
|
var i : int = 0;
|
||||||
if (blend == MixBlend.add) {
|
if (blend == MixBlend.add) {
|
||||||
for (i = 0; i < timelineCount; i++)
|
for (i = 0; i < timelineCount; i++)
|
||||||
timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, MixDirection.Out);
|
timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, MixDirection.Out);
|
||||||
} else {
|
} else {
|
||||||
var timelineData : Vector.<int> = from.timelineData;
|
var timelineMode : Vector.<int> = from.timelineMode;
|
||||||
var timelineDipMix : Vector.<TrackEntry> = from.timelineDipMix;
|
var timelineHoldMix : Vector.<TrackEntry> = from.timelineHoldMix;
|
||||||
|
|
||||||
var firstFrame : Boolean = from.timelinesRotation.length == 0;
|
var firstFrame : Boolean = from.timelinesRotation.length == 0;
|
||||||
if (firstFrame) from.timelinesRotation.length = timelineCount << 1;
|
if (firstFrame) from.timelinesRotation.length = timelineCount << 1;
|
||||||
@ -241,7 +243,7 @@ package spine.animation {
|
|||||||
var timeline : Timeline = timelines[i];
|
var timeline : Timeline = timelines[i];
|
||||||
var timelineBlend: MixBlend;
|
var timelineBlend: MixBlend;
|
||||||
var alpha : Number = 0;
|
var alpha : Number = 0;
|
||||||
switch (timelineData[i]) {
|
switch (timelineMode[i]) {
|
||||||
case SUBSEQUENT:
|
case SUBSEQUENT:
|
||||||
if (!attachments && timeline is AttachmentTimeline) continue;
|
if (!attachments && timeline is AttachmentTimeline) continue;
|
||||||
if (!drawOrder && timeline is DrawOrderTimeline) continue;
|
if (!drawOrder && timeline is DrawOrderTimeline) continue;
|
||||||
@ -252,14 +254,14 @@ package spine.animation {
|
|||||||
timelineBlend = MixBlend.setup;
|
timelineBlend = MixBlend.setup;
|
||||||
alpha = alphaMix;
|
alpha = alphaMix;
|
||||||
break;
|
break;
|
||||||
case DIP:
|
case HOLD:
|
||||||
timelineBlend = MixBlend.setup;
|
timelineBlend = MixBlend.setup;
|
||||||
alpha = alphaDip;
|
alpha = alphaHold;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
timelineBlend = MixBlend.setup;
|
timelineBlend = MixBlend.setup;
|
||||||
var dipMix : TrackEntry = timelineDipMix[i];
|
var holdMix : TrackEntry = timelineHoldMix[i];
|
||||||
alpha = alphaDip * Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration);
|
alpha = alphaHold * Math.max(0, 1 - holdMix.mixTime / holdMix.mixDuration);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
from.totalAlpha += alpha;
|
from.totalAlpha += alpha;
|
||||||
@ -399,6 +401,7 @@ package spine.animation {
|
|||||||
if (from == null) break;
|
if (from == null) break;
|
||||||
queue.end(from);
|
queue.end(from);
|
||||||
entry.mixingFrom = null;
|
entry.mixingFrom = null;
|
||||||
|
entry.mixingTo = null;
|
||||||
entry = from;
|
entry = from;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -414,6 +417,7 @@ package spine.animation {
|
|||||||
if (from != null) {
|
if (from != null) {
|
||||||
if (interrupt) queue.interrupt(from);
|
if (interrupt) queue.interrupt(from);
|
||||||
current.mixingFrom = from;
|
current.mixingFrom = from;
|
||||||
|
from.mixingTo = current;
|
||||||
current.mixTime = 0;
|
current.mixTime = 0;
|
||||||
|
|
||||||
// Store the interrupted mix percentage.
|
// Store the interrupted mix percentage.
|
||||||
@ -529,6 +533,7 @@ package spine.animation {
|
|||||||
entry.trackIndex = trackIndex;
|
entry.trackIndex = trackIndex;
|
||||||
entry.animation = animation;
|
entry.animation = animation;
|
||||||
entry.loop = loop;
|
entry.loop = loop;
|
||||||
|
entry.holdPrevious = false;
|
||||||
|
|
||||||
entry.eventThreshold = 0;
|
entry.eventThreshold = 0;
|
||||||
entry.attachmentThreshold = 0;
|
entry.attachmentThreshold = 0;
|
||||||
@ -565,14 +570,69 @@ package spine.animation {
|
|||||||
private function _animationsChanged() : void {
|
private function _animationsChanged() : void {
|
||||||
animationsChanged = false;
|
animationsChanged = false;
|
||||||
|
|
||||||
var propertyIDs : Dictionary = this.propertyIDs = new Dictionary();
|
propertyIDs = new Dictionary();
|
||||||
var mixingTo : Vector.<TrackEntry> = this.mixingTo;
|
|
||||||
for (var i : int = 0, n : int = tracks.length; i < n; i++) {
|
for (var i : int = 0, n : int = tracks.length; i < n; i++) {
|
||||||
var entry : TrackEntry = tracks[i];
|
var entry : TrackEntry = tracks[i];
|
||||||
if (entry != null && (i == 0 || entry.mixBlend != MixBlend.add))
|
if (entry == null) continue;
|
||||||
entry.setTimelineData(null, mixingTo, propertyIDs);
|
while (entry.mixingFrom != null)
|
||||||
|
entry = entry.mixingFrom;
|
||||||
|
do {
|
||||||
|
if (entry.mixingTo == null || entry.mixBlend != MixBlend.add) setTimelineModes(entry);
|
||||||
|
entry = entry.mixingTo;
|
||||||
|
} while (entry != null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function setTimelineModes (entry: TrackEntry) {
|
||||||
|
var to: TrackEntry = entry.mixingTo;
|
||||||
|
var timelines : Vector.<Timeline> = entry.animation.timelines;
|
||||||
|
var timelinesCount : int = entry.animation.timelines.length;
|
||||||
|
var timelineMode : Vector.<int> = entry.timelineMode;
|
||||||
|
timelineMode.length = timelinesCount;
|
||||||
|
var timelineHoldMix : Vector.<TrackEntry> = entry.timelineHoldMix;
|
||||||
|
timelineHoldMix.length = 0;
|
||||||
|
var propertyIDs: Dictionary = this.propertyIDs;
|
||||||
|
|
||||||
|
if (to != null && to.holdPrevious) {
|
||||||
|
for (var i : int = 0; i < timelinesCount; i++) {
|
||||||
|
propertyIDs[timelines[i].getPropertyId().toString()] = true;
|
||||||
|
timelineMode[i] = HOLD;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
outer:
|
||||||
|
for (var i : int = 0; i < timelinesCount; i++) {
|
||||||
|
var intId : int = timelines[i].getPropertyId();
|
||||||
|
var id : String = intId.toString();
|
||||||
|
var contained: Object = propertyIDs[id];
|
||||||
|
propertyIDs[id] = true;
|
||||||
|
if (contained != null) {
|
||||||
|
timelineMode[i] = AnimationState.SUBSEQUENT;
|
||||||
|
} else if (to == null || !hasTimeline(to, intId)) {
|
||||||
|
timelineMode[i] = AnimationState.FIRST;
|
||||||
|
} else {
|
||||||
|
for (var next : TrackEntry = to.mixingTo; next != null; next = next.mixingTo) {
|
||||||
|
if (hasTimeline(next, intId)) continue;
|
||||||
|
if (entry.mixDuration > 0) {
|
||||||
|
timelineMode[i] = AnimationState.HOLD_MIX;
|
||||||
|
timelineHoldMix[i] = entry;
|
||||||
|
continue outer;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
timelineMode[i] = AnimationState.HOLD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function hasTimeline (entry: TrackEntry, id : int) : Boolean {
|
||||||
|
var timelines : Vector.<Timeline> = entry.animation.timelines;
|
||||||
|
for (var i : int = 0, n : int = entry.animation.timelines.length; i < n; i++)
|
||||||
|
if (timelines[i].getPropertyId() == id) return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public function getCurrent(trackIndex : int) : TrackEntry {
|
public function getCurrent(trackIndex : int) : TrackEntry {
|
||||||
if (trackIndex >= tracks.length) return null;
|
if (trackIndex >= tracks.length) return null;
|
||||||
|
|||||||
@ -34,7 +34,7 @@ package spine.animation {
|
|||||||
|
|
||||||
public class TrackEntry implements Poolable {
|
public class TrackEntry implements Poolable {
|
||||||
public var animation : Animation;
|
public var animation : Animation;
|
||||||
public var next : TrackEntry, mixingFrom : TrackEntry;
|
public var next : TrackEntry, mixingFrom : TrackEntry, mixingTo: TrackEntry;
|
||||||
public var onStart : Listeners = new Listeners();
|
public var onStart : Listeners = new Listeners();
|
||||||
public var onInterrupt : Listeners = new Listeners();
|
public var onInterrupt : Listeners = new Listeners();
|
||||||
public var onEnd : Listeners = new Listeners();
|
public var onEnd : Listeners = new Listeners();
|
||||||
@ -42,14 +42,14 @@ package spine.animation {
|
|||||||
public var onComplete : Listeners = new Listeners();
|
public var onComplete : Listeners = new Listeners();
|
||||||
public var onEvent : Listeners = new Listeners();
|
public var onEvent : Listeners = new Listeners();
|
||||||
public var trackIndex : int;
|
public var trackIndex : int;
|
||||||
public var loop : Boolean;
|
public var loop : Boolean, holdPrevious: Boolean;
|
||||||
public var eventThreshold : Number, attachmentThreshold : Number, drawOrderThreshold : Number;
|
public var eventThreshold : Number, attachmentThreshold : Number, drawOrderThreshold : Number;
|
||||||
public var animationStart : Number, animationEnd : Number, animationLast : Number, nextAnimationLast : Number;
|
public var animationStart : Number, animationEnd : Number, animationLast : Number, nextAnimationLast : Number;
|
||||||
public var delay : Number, trackTime : Number, trackLast : Number, nextTrackLast : Number, trackEnd : Number, timeScale : Number;
|
public var delay : Number, trackTime : Number, trackLast : Number, nextTrackLast : Number, trackEnd : Number, timeScale : Number;
|
||||||
public var alpha : Number, mixTime : Number, mixDuration : Number, interruptAlpha : Number, totalAlpha : Number = 0;
|
public var alpha : Number, mixTime : Number, mixDuration : Number, interruptAlpha : Number, totalAlpha : Number = 0;
|
||||||
public var mixBlend: MixBlend = MixBlend.replace;
|
public var mixBlend: MixBlend = MixBlend.replace;
|
||||||
public var timelineData : Vector.<int> = new Vector.<int>();
|
public var timelineMode : Vector.<int> = new Vector.<int>();
|
||||||
public var timelineDipMix : Vector.<TrackEntry> = new Vector.<TrackEntry>();
|
public var timelineHoldMix : Vector.<TrackEntry> = new Vector.<TrackEntry>();
|
||||||
public var timelinesRotation : Vector.<Number> = new Vector.<Number>();
|
public var timelinesRotation : Vector.<Number> = new Vector.<Number>();
|
||||||
|
|
||||||
public function TrackEntry() {
|
public function TrackEntry() {
|
||||||
@ -67,6 +67,7 @@ package spine.animation {
|
|||||||
public function reset() : void {
|
public function reset() : void {
|
||||||
next = null;
|
next = null;
|
||||||
mixingFrom = null;
|
mixingFrom = null;
|
||||||
|
mixingTo = null;
|
||||||
animation = null;
|
animation = null;
|
||||||
onStart.listeners.length = 0;
|
onStart.listeners.length = 0;
|
||||||
onInterrupt.listeners.length = 0;
|
onInterrupt.listeners.length = 0;
|
||||||
@ -74,60 +75,10 @@ package spine.animation {
|
|||||||
onDispose.listeners.length = 0;
|
onDispose.listeners.length = 0;
|
||||||
onComplete.listeners.length = 0;
|
onComplete.listeners.length = 0;
|
||||||
onEvent.listeners.length = 0;
|
onEvent.listeners.length = 0;
|
||||||
timelineData.length = 0;
|
timelineMode.length = 0;
|
||||||
timelineDipMix.length = 0;
|
timelineHoldMix.length = 0;
|
||||||
timelinesRotation.length = 0;
|
timelinesRotation.length = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setTimelineData (to: TrackEntry, mixingToArray : Vector.<TrackEntry>, propertyIDs : Dictionary) : TrackEntry {
|
|
||||||
if (to != null) mixingToArray.push(to);
|
|
||||||
var lastEntry : TrackEntry = mixingFrom != null ? mixingFrom.setTimelineData(this, mixingToArray, propertyIDs) : this;
|
|
||||||
if (to != null) mixingToArray.pop();
|
|
||||||
|
|
||||||
var mixingTo : Vector.<TrackEntry> = mixingToArray;
|
|
||||||
var mixingToLast : int = mixingToArray.length - 1;
|
|
||||||
var timelines : Vector.<Timeline> = animation.timelines;
|
|
||||||
var timelinesCount : int = animation.timelines.length;
|
|
||||||
var timelineData : Vector.<int> = this.timelineData;
|
|
||||||
timelineData.length = timelinesCount;
|
|
||||||
this.timelineDipMix.length = 0;
|
|
||||||
var timelineDipMix : Vector.<TrackEntry> = this.timelineDipMix;
|
|
||||||
timelineDipMix.length = timelinesCount;
|
|
||||||
|
|
||||||
outer:
|
|
||||||
for (var i : int = 0; i < timelinesCount; i++) {
|
|
||||||
var intId : int = timelines[i].getPropertyId();
|
|
||||||
var id : String = intId.toString();
|
|
||||||
var contained: Object = propertyIDs[id];
|
|
||||||
propertyIDs[id] = true;
|
|
||||||
if (contained != null) {
|
|
||||||
timelineData[i] = AnimationState.SUBSEQUENT;
|
|
||||||
} else if (to == null || !to.hasTimeline(intId)) {
|
|
||||||
timelineData[i] = AnimationState.FIRST;
|
|
||||||
} else {
|
|
||||||
for (var ii : int = mixingToLast; ii >= 0; ii--) {
|
|
||||||
var entry : TrackEntry = mixingTo[ii];
|
|
||||||
if (!entry.hasTimeline(intId)) {
|
|
||||||
if (entry.mixDuration > 0) {
|
|
||||||
timelineData[i] = AnimationState.DIP_MIX;
|
|
||||||
timelineDipMix[i] = entry;
|
|
||||||
continue outer;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
timelineData[i] = AnimationState.DIP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return lastEntry;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function hasTimeline (id : int) : Boolean {
|
|
||||||
var timelines : Vector.<Timeline> = animation.timelines;
|
|
||||||
for (var i : int = 0, n : int = animation.timelines.length; i < n; i++)
|
|
||||||
if (timelines[i].getPropertyId() == id) return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function resetRotationDirection() : void {
|
public function resetRotationDirection() : void {
|
||||||
timelinesRotation.length = 0;
|
timelinesRotation.length = 0;
|
||||||
|
|||||||
@ -36,7 +36,7 @@ namespace Spine {
|
|||||||
static readonly Animation EmptyAnimation = new Animation("<empty>", new ExposedList<Timeline>(), 0);
|
static readonly Animation EmptyAnimation = new Animation("<empty>", new ExposedList<Timeline>(), 0);
|
||||||
internal const int Subsequent = 0, First = 1, Hold = 2, HoldMix = 3;
|
internal const int Subsequent = 0, First = 1, Hold = 2, HoldMix = 3;
|
||||||
|
|
||||||
private AnimationStateData data;
|
protected AnimationStateData data;
|
||||||
|
|
||||||
private readonly Pool<TrackEntry> trackEntryPool = new Pool<TrackEntry>();
|
private readonly Pool<TrackEntry> trackEntryPool = new Pool<TrackEntry>();
|
||||||
private readonly ExposedList<TrackEntry> tracks = new ExposedList<TrackEntry>();
|
private readonly ExposedList<TrackEntry> tracks = new ExposedList<TrackEntry>();
|
||||||
@ -49,6 +49,7 @@ namespace Spine {
|
|||||||
private float timeScale = 1;
|
private float timeScale = 1;
|
||||||
|
|
||||||
public AnimationStateData Data { get { return data; } }
|
public AnimationStateData Data { get { return data; } }
|
||||||
|
|
||||||
/// <summary>A list of tracks that have animations, which may contain nulls.</summary>
|
/// <summary>A list of tracks that have animations, which may contain nulls.</summary>
|
||||||
public ExposedList<TrackEntry> Tracks { get { return tracks; } }
|
public ExposedList<TrackEntry> Tracks { get { return tracks; } }
|
||||||
public float TimeScale { get { return timeScale; } set { timeScale = value; } }
|
public float TimeScale { get { return timeScale; } set { timeScale = value; } }
|
||||||
@ -70,7 +71,7 @@ namespace Spine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Increments the track entry times, setting queued animations as current if needed</summary>
|
/// Increments the track entry trackTimes, setting queued animations as current if needed</summary>
|
||||||
/// <param name="delta">delta time</param>
|
/// <param name="delta">delta time</param>
|
||||||
public void Update (float delta) {
|
public void Update (float delta) {
|
||||||
delta *= timeScale;
|
delta *= timeScale;
|
||||||
@ -109,7 +110,6 @@ namespace Spine {
|
|||||||
} else if (current.trackLast >= current.trackEnd && current.mixingFrom == null) {
|
} else if (current.trackLast >= current.trackEnd && current.mixingFrom == null) {
|
||||||
// Clear the track when there is no next entry, the track end time is reached, and there is no mixingFrom.
|
// Clear the track when there is no next entry, the track end time is reached, and there is no mixingFrom.
|
||||||
tracksItems[i] = null;
|
tracksItems[i] = null;
|
||||||
|
|
||||||
queue.End(current);
|
queue.End(current);
|
||||||
DisposeNext(current);
|
DisposeNext(current);
|
||||||
continue;
|
continue;
|
||||||
@ -166,7 +166,6 @@ namespace Spine {
|
|||||||
if (animationsChanged) AnimationsChanged();
|
if (animationsChanged) AnimationsChanged();
|
||||||
|
|
||||||
var events = this.events;
|
var events = this.events;
|
||||||
|
|
||||||
bool applied = false;
|
bool applied = false;
|
||||||
var tracksItems = tracks.Items;
|
var tracksItems = tracks.Items;
|
||||||
for (int i = 0, m = tracks.Count; i < m; i++) {
|
for (int i = 0, m = tracks.Count; i < m; i++) {
|
||||||
@ -174,6 +173,7 @@ namespace Spine {
|
|||||||
if (current == null || current.delay > 0) continue;
|
if (current == null || current.delay > 0) continue;
|
||||||
applied = true;
|
applied = true;
|
||||||
|
|
||||||
|
// Track 0 animations aren't for layering, so do not show the previously applied animations before the first key.
|
||||||
MixBlend blend = i == 0 ? MixBlend.First : current.mixBlend;
|
MixBlend blend = i == 0 ? MixBlend.First : current.mixBlend;
|
||||||
|
|
||||||
// Apply mixing from entries first.
|
// Apply mixing from entries first.
|
||||||
@ -242,7 +242,7 @@ namespace Spine {
|
|||||||
|
|
||||||
if (blend == MixBlend.Add) {
|
if (blend == MixBlend.Add) {
|
||||||
for (int i = 0; i < timelineCount; i++)
|
for (int i = 0; i < timelineCount; i++)
|
||||||
(timelinesItems[i]).Apply(skeleton, animationLast, animationTime, eventBuffer, alphaMix, blend, MixDirection.Out);
|
timelinesItems[i].Apply(skeleton, animationLast, animationTime, eventBuffer, alphaMix, blend, MixDirection.Out);
|
||||||
} else {
|
} else {
|
||||||
var timelineMode = from.timelineMode.Items;
|
var timelineMode = from.timelineMode.Items;
|
||||||
var timelineHoldMix = from.timelineHoldMix.Items;
|
var timelineHoldMix = from.timelineHoldMix.Items;
|
||||||
@ -258,10 +258,8 @@ namespace Spine {
|
|||||||
float alpha;
|
float alpha;
|
||||||
switch (timelineMode[i]) {
|
switch (timelineMode[i]) {
|
||||||
case AnimationState.Subsequent:
|
case AnimationState.Subsequent:
|
||||||
if (!attachments && timeline is AttachmentTimeline)
|
if (!attachments && timeline is AttachmentTimeline) continue;
|
||||||
continue;
|
if (!drawOrder && timeline is DrawOrderTimeline) continue;
|
||||||
if (!drawOrder && timeline is DrawOrderTimeline)
|
|
||||||
continue;
|
|
||||||
timelineBlend = blend;
|
timelineBlend = blend;
|
||||||
alpha = alphaMix;
|
alpha = alphaMix;
|
||||||
break;
|
break;
|
||||||
@ -446,7 +444,7 @@ namespace Spine {
|
|||||||
if (from != null) {
|
if (from != null) {
|
||||||
if (interrupt) queue.Interrupt(from);
|
if (interrupt) queue.Interrupt(from);
|
||||||
current.mixingFrom = from;
|
current.mixingFrom = from;
|
||||||
current.mixingTo = current;
|
from.mixingTo = current;
|
||||||
current.mixTime = 0;
|
current.mixTime = 0;
|
||||||
|
|
||||||
// Store interrupted mix percentage.
|
// Store interrupted mix percentage.
|
||||||
@ -640,7 +638,7 @@ namespace Spine {
|
|||||||
private void AnimationsChanged () {
|
private void AnimationsChanged () {
|
||||||
animationsChanged = false;
|
animationsChanged = false;
|
||||||
|
|
||||||
this.propertyIDs.Clear();
|
propertyIDs.Clear();
|
||||||
|
|
||||||
var tracksItems = tracks.Items;
|
var tracksItems = tracks.Items;
|
||||||
for (int i = 0, n = tracks.Count; i < n; i++) {
|
for (int i = 0, n = tracks.Count; i < n; i++) {
|
||||||
@ -659,7 +657,7 @@ namespace Spine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void SetTimelineModes (TrackEntry entry) {
|
private void SetTimelineModes (TrackEntry entry) {
|
||||||
var to = entry.mixingTo;
|
TrackEntry to = entry.mixingTo;
|
||||||
var timelines = entry.animation.timelines.Items;
|
var timelines = entry.animation.timelines.Items;
|
||||||
int timelinesCount = entry.animation.timelines.Count;
|
int timelinesCount = entry.animation.timelines.Count;
|
||||||
var timelineMode = entry.timelineMode.Resize(timelinesCount).Items; //timelineMode.setSize(timelinesCount);
|
var timelineMode = entry.timelineMode.Resize(timelinesCount).Items; //timelineMode.setSize(timelinesCount);
|
||||||
@ -694,7 +692,7 @@ namespace Spine {
|
|||||||
}
|
}
|
||||||
timelineMode[i] = AnimationState.Hold;
|
timelineMode[i] = AnimationState.Hold;
|
||||||
}
|
}
|
||||||
continue_outer: {}
|
continue_outer: {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -750,6 +748,7 @@ namespace Spine {
|
|||||||
public void Reset () {
|
public void Reset () {
|
||||||
next = null;
|
next = null;
|
||||||
mixingFrom = null;
|
mixingFrom = null;
|
||||||
|
mixingTo = null;
|
||||||
animation = null;
|
animation = null;
|
||||||
timelineMode.Clear();
|
timelineMode.Clear();
|
||||||
timelineHoldMix.Clear();
|
timelineHoldMix.Clear();
|
||||||
@ -763,13 +762,6 @@ namespace Spine {
|
|||||||
Event = null;
|
Event = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HasTimeline (int id) {
|
|
||||||
var timelines = animation.timelines.Items;
|
|
||||||
for (int i = 0, n = animation.timelines.Count; i < n; i++)
|
|
||||||
if (timelines[i].PropertyId == id) return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>The index of the track where this entry is either current or queued.</summary>
|
/// <summary>The index of the track where this entry is either current or queued.</summary>
|
||||||
public int TrackIndex { get { return trackIndex; } }
|
public int TrackIndex { get { return trackIndex; } }
|
||||||
|
|
||||||
|
|||||||
@ -283,8 +283,12 @@ namespace Spine {
|
|||||||
public TextureFilter magFilter;
|
public TextureFilter magFilter;
|
||||||
public TextureWrap uWrap;
|
public TextureWrap uWrap;
|
||||||
public TextureWrap vWrap;
|
public TextureWrap vWrap;
|
||||||
public Object rendererObject;
|
public object rendererObject;
|
||||||
public int width, height;
|
public int width, height;
|
||||||
|
|
||||||
|
public AtlasPage Clone () {
|
||||||
|
return MemberwiseClone() as AtlasPage;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class AtlasRegion {
|
public class AtlasRegion {
|
||||||
@ -298,6 +302,10 @@ namespace Spine {
|
|||||||
public bool rotate;
|
public bool rotate;
|
||||||
public int[] splits;
|
public int[] splits;
|
||||||
public int[] pads;
|
public int[] pads;
|
||||||
|
|
||||||
|
public AtlasRegion Clone () {
|
||||||
|
return MemberwiseClone() as AtlasRegion;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface TextureLoader {
|
public interface TextureLoader {
|
||||||
|
|||||||
@ -45,6 +45,6 @@ namespace Spine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public interface IHasRendererObject {
|
public interface IHasRendererObject {
|
||||||
object RendererObject { get; }
|
object RendererObject { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -202,6 +202,20 @@ public class Animation {
|
|||||||
twoColor
|
twoColor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static public interface BoneTimeline extends Timeline {
|
||||||
|
public void setBoneIndex (int index);
|
||||||
|
|
||||||
|
/** The index of the slot in {@link Skeleton#getSlots()} that will be changed. */
|
||||||
|
public int getBoneIndex ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static public interface SlotTimeline extends Timeline {
|
||||||
|
public void setSlotIndex (int index);
|
||||||
|
|
||||||
|
/** The index of the slot in {@link Skeleton#getSlots()} that will be changed. */
|
||||||
|
public int getSlotIndex ();
|
||||||
|
}
|
||||||
|
|
||||||
/** The base class for timelines that use interpolation between key frame values. */
|
/** The base class for timelines that use interpolation between key frame values. */
|
||||||
abstract static public class CurveTimeline implements Timeline {
|
abstract static public class CurveTimeline implements Timeline {
|
||||||
static public final float LINEAR = 0, STEPPED = 1, BEZIER = 2;
|
static public final float LINEAR = 0, STEPPED = 1, BEZIER = 2;
|
||||||
@ -290,7 +304,7 @@ public class Animation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Changes a bone's local {@link Bone#getRotation()}. */
|
/** Changes a bone's local {@link Bone#getRotation()}. */
|
||||||
static public class RotateTimeline extends CurveTimeline {
|
static public class RotateTimeline extends CurveTimeline implements BoneTimeline {
|
||||||
static public final int ENTRIES = 2;
|
static public final int ENTRIES = 2;
|
||||||
static final int PREV_TIME = -2, PREV_ROTATION = -1;
|
static final int PREV_TIME = -2, PREV_ROTATION = -1;
|
||||||
static final int ROTATION = 1;
|
static final int ROTATION = 1;
|
||||||
@ -386,7 +400,7 @@ public class Animation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Changes a bone's local {@link Bone#getX()} and {@link Bone#getY()}. */
|
/** Changes a bone's local {@link Bone#getX()} and {@link Bone#getY()}. */
|
||||||
static public class TranslateTimeline extends CurveTimeline {
|
static public class TranslateTimeline extends CurveTimeline implements BoneTimeline {
|
||||||
static public final int ENTRIES = 3;
|
static public final int ENTRIES = 3;
|
||||||
static final int PREV_TIME = -3, PREV_X = -2, PREV_Y = -1;
|
static final int PREV_TIME = -3, PREV_X = -2, PREV_Y = -1;
|
||||||
static final int X = 1, Y = 2;
|
static final int X = 1, Y = 2;
|
||||||
@ -641,7 +655,7 @@ public class Animation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Changes a slot's {@link Slot#getColor()}. */
|
/** Changes a slot's {@link Slot#getColor()}. */
|
||||||
static public class ColorTimeline extends CurveTimeline {
|
static public class ColorTimeline extends CurveTimeline implements SlotTimeline {
|
||||||
static public final int ENTRIES = 5;
|
static public final int ENTRIES = 5;
|
||||||
static private final int PREV_TIME = -5, PREV_R = -4, PREV_G = -3, PREV_B = -2, PREV_A = -1;
|
static private final int PREV_TIME = -5, PREV_R = -4, PREV_G = -3, PREV_B = -2, PREV_A = -1;
|
||||||
static private final int R = 1, G = 2, B = 3, A = 4;
|
static private final int R = 1, G = 2, B = 3, A = 4;
|
||||||
@ -735,7 +749,7 @@ public class Animation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Changes a slot's {@link Slot#getColor()} and {@link Slot#getDarkColor()} for two color tinting. */
|
/** Changes a slot's {@link Slot#getColor()} and {@link Slot#getDarkColor()} for two color tinting. */
|
||||||
static public class TwoColorTimeline extends CurveTimeline {
|
static public class TwoColorTimeline extends CurveTimeline implements SlotTimeline {
|
||||||
static public final int ENTRIES = 8;
|
static public final int ENTRIES = 8;
|
||||||
static private final int PREV_TIME = -8, PREV_R = -7, PREV_G = -6, PREV_B = -5, PREV_A = -4;
|
static private final int PREV_TIME = -8, PREV_R = -7, PREV_G = -6, PREV_B = -5, PREV_A = -4;
|
||||||
static private final int PREV_R2 = -3, PREV_G2 = -2, PREV_B2 = -1;
|
static private final int PREV_R2 = -3, PREV_G2 = -2, PREV_B2 = -1;
|
||||||
@ -849,7 +863,7 @@ public class Animation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Changes a slot's {@link Slot#getAttachment()}. */
|
/** Changes a slot's {@link Slot#getAttachment()}. */
|
||||||
static public class AttachmentTimeline implements Timeline {
|
static public class AttachmentTimeline implements SlotTimeline {
|
||||||
int slotIndex;
|
int slotIndex;
|
||||||
final float[] frames; // time, ...
|
final float[] frames; // time, ...
|
||||||
final String[] attachmentNames;
|
final String[] attachmentNames;
|
||||||
@ -925,7 +939,7 @@ public class Animation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Changes a slot's {@link Slot#getAttachmentVertices()} to deform a {@link VertexAttachment}. */
|
/** Changes a slot's {@link Slot#getAttachmentVertices()} to deform a {@link VertexAttachment}. */
|
||||||
static public class DeformTimeline extends CurveTimeline {
|
static public class DeformTimeline extends CurveTimeline implements SlotTimeline {
|
||||||
int slotIndex;
|
int slotIndex;
|
||||||
VertexAttachment attachment;
|
VertexAttachment attachment;
|
||||||
private final float[] frames; // time, ...
|
private final float[] frames; // time, ...
|
||||||
|
|||||||
Binary file not shown.
@ -69,6 +69,7 @@ package spine.examples {
|
|||||||
var skeletonData : SkeletonData = json.readSkeletonData(new SpineboyJson());
|
var skeletonData : SkeletonData = json.readSkeletonData(new SpineboyJson());
|
||||||
|
|
||||||
var stateData : AnimationStateData = new AnimationStateData(skeletonData);
|
var stateData : AnimationStateData = new AnimationStateData(skeletonData);
|
||||||
|
stateData.setMixByName("walk", "run", 0.4);
|
||||||
stateData.setMixByName("run", "jump", 0.4);
|
stateData.setMixByName("run", "jump", 0.4);
|
||||||
stateData.setMixByName("jump", "run", 0.4);
|
stateData.setMixByName("jump", "run", 0.4);
|
||||||
stateData.setMixByName("jump", "jump", 0.4);
|
stateData.setMixByName("jump", "jump", 0.4);
|
||||||
|
|||||||
Binary file not shown.
15
spine-ts/build/spine-all.d.ts
vendored
15
spine-ts/build/spine-all.d.ts
vendored
@ -244,15 +244,14 @@ declare module spine {
|
|||||||
static emptyAnimation: Animation;
|
static emptyAnimation: Animation;
|
||||||
static SUBSEQUENT: number;
|
static SUBSEQUENT: number;
|
||||||
static FIRST: number;
|
static FIRST: number;
|
||||||
static DIP: number;
|
static HOLD: number;
|
||||||
static DIP_MIX: number;
|
static HOLD_MIX: number;
|
||||||
data: AnimationStateData;
|
data: AnimationStateData;
|
||||||
tracks: TrackEntry[];
|
tracks: TrackEntry[];
|
||||||
events: Event[];
|
events: Event[];
|
||||||
listeners: AnimationStateListener2[];
|
listeners: AnimationStateListener2[];
|
||||||
queue: EventQueue;
|
queue: EventQueue;
|
||||||
propertyIDs: IntSet;
|
propertyIDs: IntSet;
|
||||||
mixingTo: TrackEntry[];
|
|
||||||
animationsChanged: boolean;
|
animationsChanged: boolean;
|
||||||
timeScale: number;
|
timeScale: number;
|
||||||
trackEntryPool: Pool<TrackEntry>;
|
trackEntryPool: Pool<TrackEntry>;
|
||||||
@ -277,6 +276,8 @@ declare module spine {
|
|||||||
trackEntry(trackIndex: number, animation: Animation, loop: boolean, last: TrackEntry): TrackEntry;
|
trackEntry(trackIndex: number, animation: Animation, loop: boolean, last: TrackEntry): TrackEntry;
|
||||||
disposeNext(entry: TrackEntry): void;
|
disposeNext(entry: TrackEntry): void;
|
||||||
_animationsChanged(): void;
|
_animationsChanged(): void;
|
||||||
|
setTimelineModes(entry: TrackEntry): void;
|
||||||
|
hasTimeline(entry: TrackEntry, id: number): boolean;
|
||||||
getCurrent(trackIndex: number): TrackEntry;
|
getCurrent(trackIndex: number): TrackEntry;
|
||||||
addListener(listener: AnimationStateListener2): void;
|
addListener(listener: AnimationStateListener2): void;
|
||||||
removeListener(listener: AnimationStateListener2): void;
|
removeListener(listener: AnimationStateListener2): void;
|
||||||
@ -287,9 +288,11 @@ declare module spine {
|
|||||||
animation: Animation;
|
animation: Animation;
|
||||||
next: TrackEntry;
|
next: TrackEntry;
|
||||||
mixingFrom: TrackEntry;
|
mixingFrom: TrackEntry;
|
||||||
|
mixingTo: TrackEntry;
|
||||||
listener: AnimationStateListener2;
|
listener: AnimationStateListener2;
|
||||||
trackIndex: number;
|
trackIndex: number;
|
||||||
loop: boolean;
|
loop: boolean;
|
||||||
|
holdPrevious: boolean;
|
||||||
eventThreshold: number;
|
eventThreshold: number;
|
||||||
attachmentThreshold: number;
|
attachmentThreshold: number;
|
||||||
drawOrderThreshold: number;
|
drawOrderThreshold: number;
|
||||||
@ -309,12 +312,10 @@ declare module spine {
|
|||||||
interruptAlpha: number;
|
interruptAlpha: number;
|
||||||
totalAlpha: number;
|
totalAlpha: number;
|
||||||
mixBlend: MixBlend;
|
mixBlend: MixBlend;
|
||||||
timelineData: number[];
|
timelineMode: number[];
|
||||||
timelineDipMix: TrackEntry[];
|
timelineHoldMix: TrackEntry[];
|
||||||
timelinesRotation: number[];
|
timelinesRotation: number[];
|
||||||
reset(): void;
|
reset(): void;
|
||||||
setTimelineData(to: TrackEntry, mixingToArray: Array<TrackEntry>, propertyIDs: IntSet): TrackEntry;
|
|
||||||
hasTimeline(id: number): boolean;
|
|
||||||
getAnimationTime(): number;
|
getAnimationTime(): number;
|
||||||
setAnimationLast(animationLast: number): void;
|
setAnimationLast(animationLast: number): void;
|
||||||
isComplete(): boolean;
|
isComplete(): boolean;
|
||||||
|
|||||||
@ -1303,7 +1303,6 @@ var spine;
|
|||||||
this.listeners = new Array();
|
this.listeners = new Array();
|
||||||
this.queue = new EventQueue(this);
|
this.queue = new EventQueue(this);
|
||||||
this.propertyIDs = new spine.IntSet();
|
this.propertyIDs = new spine.IntSet();
|
||||||
this.mixingTo = new Array();
|
|
||||||
this.animationsChanged = false;
|
this.animationsChanged = false;
|
||||||
this.timeScale = 1;
|
this.timeScale = 1;
|
||||||
this.trackEntryPool = new spine.Pool(function () { return new TrackEntry(); });
|
this.trackEntryPool = new spine.Pool(function () { return new TrackEntry(); });
|
||||||
@ -1350,6 +1349,8 @@ var spine;
|
|||||||
if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
|
if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
|
||||||
var from = current.mixingFrom;
|
var from = current.mixingFrom;
|
||||||
current.mixingFrom = null;
|
current.mixingFrom = null;
|
||||||
|
if (from != null)
|
||||||
|
from.mixingTo = null;
|
||||||
while (from != null) {
|
while (from != null) {
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
from = from.mixingFrom;
|
from = from.mixingFrom;
|
||||||
@ -1369,6 +1370,8 @@ var spine;
|
|||||||
if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
|
if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
|
||||||
if (from.totalAlpha == 0 || to.mixDuration == 0) {
|
if (from.totalAlpha == 0 || to.mixDuration == 0) {
|
||||||
to.mixingFrom = from.mixingFrom;
|
to.mixingFrom = from.mixingFrom;
|
||||||
|
if (from.mixingFrom != null)
|
||||||
|
from.mixingFrom.mixingTo = to;
|
||||||
to.interruptAlpha = from.interruptAlpha;
|
to.interruptAlpha = from.interruptAlpha;
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
}
|
}
|
||||||
@ -1400,19 +1403,19 @@ var spine;
|
|||||||
var animationLast = current.animationLast, animationTime = current.getAnimationTime();
|
var animationLast = current.animationLast, animationTime = current.getAnimationTime();
|
||||||
var timelineCount = current.animation.timelines.length;
|
var timelineCount = current.animation.timelines.length;
|
||||||
var timelines = current.animation.timelines;
|
var timelines = current.animation.timelines;
|
||||||
if (mix == 1 || blend == spine.MixBlend.add) {
|
if (i == 0 && (mix == 1 || blend == spine.MixBlend.add)) {
|
||||||
for (var ii = 0; ii < timelineCount; ii++)
|
for (var ii = 0; ii < timelineCount; ii++)
|
||||||
timelines[ii].apply(skeleton, animationLast, animationTime, events, mix, blend, spine.MixDirection["in"]);
|
timelines[ii].apply(skeleton, animationLast, animationTime, events, mix, blend, spine.MixDirection["in"]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var timelineData = current.timelineData;
|
var timelineMode = current.timelineMode;
|
||||||
var firstFrame = current.timelinesRotation.length == 0;
|
var firstFrame = current.timelinesRotation.length == 0;
|
||||||
if (firstFrame)
|
if (firstFrame)
|
||||||
spine.Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null);
|
spine.Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null);
|
||||||
var timelinesRotation = current.timelinesRotation;
|
var timelinesRotation = current.timelinesRotation;
|
||||||
for (var ii = 0; ii < timelineCount; ii++) {
|
for (var ii = 0; ii < timelineCount; ii++) {
|
||||||
var timeline = timelines[ii];
|
var timeline = timelines[ii];
|
||||||
var timelineBlend = timelineData[ii] == AnimationState.SUBSEQUENT ? blend : spine.MixBlend.setup;
|
var timelineBlend = timelineMode[ii] == AnimationState.SUBSEQUENT ? blend : spine.MixBlend.setup;
|
||||||
if (timeline instanceof spine.RotateTimeline) {
|
if (timeline instanceof spine.RotateTimeline) {
|
||||||
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
|
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
|
||||||
}
|
}
|
||||||
@ -1452,14 +1455,14 @@ var spine;
|
|||||||
var animationLast = from.animationLast, animationTime = from.getAnimationTime();
|
var animationLast = from.animationLast, animationTime = from.getAnimationTime();
|
||||||
var timelineCount = from.animation.timelines.length;
|
var timelineCount = from.animation.timelines.length;
|
||||||
var timelines = from.animation.timelines;
|
var timelines = from.animation.timelines;
|
||||||
var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix);
|
var alphaHold = from.alpha * to.interruptAlpha, alphaMix = alphaHold * (1 - mix);
|
||||||
if (blend == spine.MixBlend.add) {
|
if (blend == spine.MixBlend.add) {
|
||||||
for (var i = 0; i < timelineCount; i++)
|
for (var i = 0; i < timelineCount; i++)
|
||||||
timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, spine.MixDirection.out);
|
timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, spine.MixDirection.out);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var timelineData = from.timelineData;
|
var timelineMode = from.timelineMode;
|
||||||
var timelineDipMix = from.timelineDipMix;
|
var timelineHoldMix = from.timelineHoldMix;
|
||||||
var firstFrame = from.timelinesRotation.length == 0;
|
var firstFrame = from.timelinesRotation.length == 0;
|
||||||
if (firstFrame)
|
if (firstFrame)
|
||||||
spine.Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null);
|
spine.Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null);
|
||||||
@ -1469,7 +1472,7 @@ var spine;
|
|||||||
var timeline = timelines[i];
|
var timeline = timelines[i];
|
||||||
var timelineBlend;
|
var timelineBlend;
|
||||||
var alpha = 0;
|
var alpha = 0;
|
||||||
switch (timelineData[i]) {
|
switch (timelineMode[i]) {
|
||||||
case AnimationState.SUBSEQUENT:
|
case AnimationState.SUBSEQUENT:
|
||||||
if (!attachments && timeline instanceof spine.AttachmentTimeline)
|
if (!attachments && timeline instanceof spine.AttachmentTimeline)
|
||||||
continue;
|
continue;
|
||||||
@ -1482,14 +1485,14 @@ var spine;
|
|||||||
timelineBlend = spine.MixBlend.setup;
|
timelineBlend = spine.MixBlend.setup;
|
||||||
alpha = alphaMix;
|
alpha = alphaMix;
|
||||||
break;
|
break;
|
||||||
case AnimationState.DIP:
|
case AnimationState.HOLD:
|
||||||
timelineBlend = spine.MixBlend.setup;
|
timelineBlend = spine.MixBlend.setup;
|
||||||
alpha = alphaDip;
|
alpha = alphaHold;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
timelineBlend = spine.MixBlend.setup;
|
timelineBlend = spine.MixBlend.setup;
|
||||||
var dipMix = timelineDipMix[i];
|
var holdMix = timelineHoldMix[i];
|
||||||
alpha = alphaDip * Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration);
|
alpha = alphaHold * Math.max(0, 1 - holdMix.mixTime / holdMix.mixDuration);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
from.totalAlpha += alpha;
|
from.totalAlpha += alpha;
|
||||||
@ -1619,6 +1622,7 @@ var spine;
|
|||||||
break;
|
break;
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
entry.mixingFrom = null;
|
entry.mixingFrom = null;
|
||||||
|
entry.mixingTo = null;
|
||||||
entry = from;
|
entry = from;
|
||||||
}
|
}
|
||||||
this.tracks[current.trackIndex] = null;
|
this.tracks[current.trackIndex] = null;
|
||||||
@ -1631,6 +1635,7 @@ var spine;
|
|||||||
if (interrupt)
|
if (interrupt)
|
||||||
this.queue.interrupt(from);
|
this.queue.interrupt(from);
|
||||||
current.mixingFrom = from;
|
current.mixingFrom = from;
|
||||||
|
from.mixingTo = current;
|
||||||
current.mixTime = 0;
|
current.mixTime = 0;
|
||||||
if (from.mixingFrom != null && from.mixDuration > 0)
|
if (from.mixingFrom != null && from.mixDuration > 0)
|
||||||
current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration);
|
current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration);
|
||||||
@ -1740,6 +1745,7 @@ var spine;
|
|||||||
entry.trackIndex = trackIndex;
|
entry.trackIndex = trackIndex;
|
||||||
entry.animation = animation;
|
entry.animation = animation;
|
||||||
entry.loop = loop;
|
entry.loop = loop;
|
||||||
|
entry.holdPrevious = false;
|
||||||
entry.eventThreshold = 0;
|
entry.eventThreshold = 0;
|
||||||
entry.attachmentThreshold = 0;
|
entry.attachmentThreshold = 0;
|
||||||
entry.drawOrderThreshold = 0;
|
entry.drawOrderThreshold = 0;
|
||||||
@ -1769,15 +1775,63 @@ var spine;
|
|||||||
};
|
};
|
||||||
AnimationState.prototype._animationsChanged = function () {
|
AnimationState.prototype._animationsChanged = function () {
|
||||||
this.animationsChanged = false;
|
this.animationsChanged = false;
|
||||||
var propertyIDs = this.propertyIDs;
|
this.propertyIDs.clear();
|
||||||
propertyIDs.clear();
|
|
||||||
var mixingTo = this.mixingTo;
|
|
||||||
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
||||||
var entry = this.tracks[i];
|
var entry = this.tracks[i];
|
||||||
if (entry != null && (i == 0 || entry.mixBlend != spine.MixBlend.add))
|
if (entry == null)
|
||||||
entry.setTimelineData(null, mixingTo, propertyIDs);
|
continue;
|
||||||
|
while (entry.mixingFrom != null)
|
||||||
|
entry = entry.mixingFrom;
|
||||||
|
do {
|
||||||
|
if (entry.mixingFrom == null || entry.mixBlend != spine.MixBlend.add)
|
||||||
|
this.setTimelineModes(entry);
|
||||||
|
entry = entry.mixingTo;
|
||||||
|
} while (entry != null);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
AnimationState.prototype.setTimelineModes = function (entry) {
|
||||||
|
var to = entry.mixingTo;
|
||||||
|
var timelines = entry.animation.timelines;
|
||||||
|
var timelinesCount = entry.animation.timelines.length;
|
||||||
|
var timelineMode = spine.Utils.setArraySize(entry.timelineMode, timelinesCount);
|
||||||
|
entry.timelineHoldMix.length = 0;
|
||||||
|
var timelineDipMix = spine.Utils.setArraySize(entry.timelineHoldMix, timelinesCount);
|
||||||
|
var propertyIDs = this.propertyIDs;
|
||||||
|
if (to != null && to.holdPrevious) {
|
||||||
|
for (var i_16 = 0; i_16 < timelinesCount; i_16++) {
|
||||||
|
propertyIDs.add(timelines[i_16].getPropertyId());
|
||||||
|
timelineMode[i_16] = AnimationState.HOLD;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
outer: for (var i = 0; i < timelinesCount; i++) {
|
||||||
|
var id = timelines[i].getPropertyId();
|
||||||
|
if (!propertyIDs.add(id))
|
||||||
|
timelineMode[i] = AnimationState.SUBSEQUENT;
|
||||||
|
else if (to == null || !this.hasTimeline(to, id))
|
||||||
|
timelineMode[i] = AnimationState.FIRST;
|
||||||
|
else {
|
||||||
|
for (var next = to.mixingTo; next != null; next = next.mixingTo) {
|
||||||
|
if (this.hasTimeline(next, id))
|
||||||
|
continue;
|
||||||
|
if (entry.mixDuration > 0) {
|
||||||
|
timelineMode[i] = AnimationState.HOLD_MIX;
|
||||||
|
timelineDipMix[i] = next;
|
||||||
|
continue outer;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
timelineMode[i] = AnimationState.HOLD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
AnimationState.prototype.hasTimeline = function (entry, id) {
|
||||||
|
var timelines = entry.animation.timelines;
|
||||||
|
for (var i = 0, n = timelines.length; i < n; i++)
|
||||||
|
if (timelines[i].getPropertyId() == id)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
};
|
||||||
AnimationState.prototype.getCurrent = function (trackIndex) {
|
AnimationState.prototype.getCurrent = function (trackIndex) {
|
||||||
if (trackIndex >= this.tracks.length)
|
if (trackIndex >= this.tracks.length)
|
||||||
return null;
|
return null;
|
||||||
@ -1802,69 +1856,28 @@ var spine;
|
|||||||
AnimationState.emptyAnimation = new spine.Animation("<empty>", [], 0);
|
AnimationState.emptyAnimation = new spine.Animation("<empty>", [], 0);
|
||||||
AnimationState.SUBSEQUENT = 0;
|
AnimationState.SUBSEQUENT = 0;
|
||||||
AnimationState.FIRST = 1;
|
AnimationState.FIRST = 1;
|
||||||
AnimationState.DIP = 2;
|
AnimationState.HOLD = 2;
|
||||||
AnimationState.DIP_MIX = 3;
|
AnimationState.HOLD_MIX = 3;
|
||||||
return AnimationState;
|
return AnimationState;
|
||||||
}());
|
}());
|
||||||
spine.AnimationState = AnimationState;
|
spine.AnimationState = AnimationState;
|
||||||
var TrackEntry = (function () {
|
var TrackEntry = (function () {
|
||||||
function TrackEntry() {
|
function TrackEntry() {
|
||||||
this.mixBlend = spine.MixBlend.replace;
|
this.mixBlend = spine.MixBlend.replace;
|
||||||
this.timelineData = new Array();
|
this.timelineMode = new Array();
|
||||||
this.timelineDipMix = new Array();
|
this.timelineHoldMix = new Array();
|
||||||
this.timelinesRotation = new Array();
|
this.timelinesRotation = new Array();
|
||||||
}
|
}
|
||||||
TrackEntry.prototype.reset = function () {
|
TrackEntry.prototype.reset = function () {
|
||||||
this.next = null;
|
this.next = null;
|
||||||
this.mixingFrom = null;
|
this.mixingFrom = null;
|
||||||
|
this.mixingTo = null;
|
||||||
this.animation = null;
|
this.animation = null;
|
||||||
this.listener = null;
|
this.listener = null;
|
||||||
this.timelineData.length = 0;
|
this.timelineMode.length = 0;
|
||||||
this.timelineDipMix.length = 0;
|
this.timelineHoldMix.length = 0;
|
||||||
this.timelinesRotation.length = 0;
|
this.timelinesRotation.length = 0;
|
||||||
};
|
};
|
||||||
TrackEntry.prototype.setTimelineData = function (to, mixingToArray, propertyIDs) {
|
|
||||||
if (to != null)
|
|
||||||
mixingToArray.push(to);
|
|
||||||
var lastEntry = this.mixingFrom != null ? this.mixingFrom.setTimelineData(this, mixingToArray, propertyIDs) : this;
|
|
||||||
if (to != null)
|
|
||||||
mixingToArray.pop();
|
|
||||||
var mixingTo = mixingToArray;
|
|
||||||
var mixingToLast = mixingToArray.length - 1;
|
|
||||||
var timelines = this.animation.timelines;
|
|
||||||
var timelinesCount = this.animation.timelines.length;
|
|
||||||
var timelineData = spine.Utils.setArraySize(this.timelineData, timelinesCount);
|
|
||||||
this.timelineDipMix.length = 0;
|
|
||||||
var timelineDipMix = spine.Utils.setArraySize(this.timelineDipMix, timelinesCount);
|
|
||||||
outer: for (var i = 0; i < timelinesCount; i++) {
|
|
||||||
var id = timelines[i].getPropertyId();
|
|
||||||
if (!propertyIDs.add(id))
|
|
||||||
timelineData[i] = AnimationState.SUBSEQUENT;
|
|
||||||
else if (to == null || !to.hasTimeline(id))
|
|
||||||
timelineData[i] = AnimationState.FIRST;
|
|
||||||
else {
|
|
||||||
for (var ii = mixingToLast; ii >= 0; ii--) {
|
|
||||||
var entry = mixingTo[ii];
|
|
||||||
if (!entry.hasTimeline(id)) {
|
|
||||||
if (entry.mixDuration > 0) {
|
|
||||||
timelineData[i] = AnimationState.DIP_MIX;
|
|
||||||
timelineDipMix[i] = entry;
|
|
||||||
continue outer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
timelineData[i] = AnimationState.DIP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return lastEntry;
|
|
||||||
};
|
|
||||||
TrackEntry.prototype.hasTimeline = function (id) {
|
|
||||||
var timelines = this.animation.timelines;
|
|
||||||
for (var i = 0, n = timelines.length; i < n; i++)
|
|
||||||
if (timelines[i].getPropertyId() == id)
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
TrackEntry.prototype.getAnimationTime = function () {
|
TrackEntry.prototype.getAnimationTime = function () {
|
||||||
if (this.loop) {
|
if (this.loop) {
|
||||||
var duration = this.animationEnd - this.animationStart;
|
var duration = this.animationEnd - this.animationStart;
|
||||||
@ -7266,8 +7279,8 @@ var spine;
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
var listeners = _this.listeners;
|
var listeners = _this.listeners;
|
||||||
for (var i_16 = 0; i_16 < listeners.length; i_16++) {
|
for (var i_17 = 0; i_17 < listeners.length; i_17++) {
|
||||||
listeners[i_16].down(_this.currTouch.x, _this.currTouch.y);
|
listeners[i_17].down(_this.currTouch.x, _this.currTouch.y);
|
||||||
}
|
}
|
||||||
console.log("Start " + _this.currTouch.x + ", " + _this.currTouch.y);
|
console.log("Start " + _this.currTouch.x + ", " + _this.currTouch.y);
|
||||||
_this.lastX = _this.currTouch.x;
|
_this.lastX = _this.currTouch.x;
|
||||||
@ -7276,29 +7289,6 @@ var spine;
|
|||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
}, false);
|
}, false);
|
||||||
element.addEventListener("touchend", function (ev) {
|
element.addEventListener("touchend", function (ev) {
|
||||||
var touches = ev.changedTouches;
|
|
||||||
for (var i = 0; i < touches.length; i++) {
|
|
||||||
var touch = touches[i];
|
|
||||||
if (_this.currTouch.identifier === touch.identifier) {
|
|
||||||
var rect = element.getBoundingClientRect();
|
|
||||||
var x = _this.currTouch.x = touch.clientX - rect.left;
|
|
||||||
var y = _this.currTouch.y = touch.clientY - rect.top;
|
|
||||||
_this.touchesPool.free(_this.currTouch);
|
|
||||||
var listeners = _this.listeners;
|
|
||||||
for (var i_17 = 0; i_17 < listeners.length; i_17++) {
|
|
||||||
listeners[i_17].up(x, y);
|
|
||||||
}
|
|
||||||
console.log("End " + x + ", " + y);
|
|
||||||
_this.lastX = x;
|
|
||||||
_this.lastY = y;
|
|
||||||
_this.buttonDown = false;
|
|
||||||
_this.currTouch = null;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ev.preventDefault();
|
|
||||||
}, false);
|
|
||||||
element.addEventListener("touchcancel", function (ev) {
|
|
||||||
var touches = ev.changedTouches;
|
var touches = ev.changedTouches;
|
||||||
for (var i = 0; i < touches.length; i++) {
|
for (var i = 0; i < touches.length; i++) {
|
||||||
var touch = touches[i];
|
var touch = touches[i];
|
||||||
@ -7321,6 +7311,29 @@ var spine;
|
|||||||
}
|
}
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
}, false);
|
}, false);
|
||||||
|
element.addEventListener("touchcancel", function (ev) {
|
||||||
|
var touches = ev.changedTouches;
|
||||||
|
for (var i = 0; i < touches.length; i++) {
|
||||||
|
var touch = touches[i];
|
||||||
|
if (_this.currTouch.identifier === touch.identifier) {
|
||||||
|
var rect = element.getBoundingClientRect();
|
||||||
|
var x = _this.currTouch.x = touch.clientX - rect.left;
|
||||||
|
var y = _this.currTouch.y = touch.clientY - rect.top;
|
||||||
|
_this.touchesPool.free(_this.currTouch);
|
||||||
|
var listeners = _this.listeners;
|
||||||
|
for (var i_19 = 0; i_19 < listeners.length; i_19++) {
|
||||||
|
listeners[i_19].up(x, y);
|
||||||
|
}
|
||||||
|
console.log("End " + x + ", " + y);
|
||||||
|
_this.lastX = x;
|
||||||
|
_this.lastY = y;
|
||||||
|
_this.buttonDown = false;
|
||||||
|
_this.currTouch = null;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ev.preventDefault();
|
||||||
|
}, false);
|
||||||
element.addEventListener("touchmove", function (ev) {
|
element.addEventListener("touchmove", function (ev) {
|
||||||
if (_this.currTouch == null)
|
if (_this.currTouch == null)
|
||||||
return;
|
return;
|
||||||
@ -7332,8 +7345,8 @@ var spine;
|
|||||||
var x = touch.clientX - rect.left;
|
var x = touch.clientX - rect.left;
|
||||||
var y = touch.clientY - rect.top;
|
var y = touch.clientY - rect.top;
|
||||||
var listeners = _this.listeners;
|
var listeners = _this.listeners;
|
||||||
for (var i_19 = 0; i_19 < listeners.length; i_19++) {
|
for (var i_20 = 0; i_20 < listeners.length; i_20++) {
|
||||||
listeners[i_19].dragged(x, y);
|
listeners[i_20].dragged(x, y);
|
||||||
}
|
}
|
||||||
console.log("Drag " + x + ", " + y);
|
console.log("Drag " + x + ", " + y);
|
||||||
_this.lastX = _this.currTouch.x = x;
|
_this.lastX = _this.currTouch.x = x;
|
||||||
@ -9183,11 +9196,11 @@ var spine;
|
|||||||
var nn = clip.worldVerticesLength;
|
var nn = clip.worldVerticesLength;
|
||||||
var world = this.temp = spine.Utils.setArraySize(this.temp, nn, 0);
|
var world = this.temp = spine.Utils.setArraySize(this.temp, nn, 0);
|
||||||
clip.computeWorldVertices(slot, 0, nn, world, 0, 2);
|
clip.computeWorldVertices(slot, 0, nn, world, 0, 2);
|
||||||
for (var i_20 = 0, n_2 = world.length; i_20 < n_2; i_20 += 2) {
|
for (var i_21 = 0, n_2 = world.length; i_21 < n_2; i_21 += 2) {
|
||||||
var x = world[i_20];
|
var x = world[i_21];
|
||||||
var y = world[i_20 + 1];
|
var y = world[i_21 + 1];
|
||||||
var x2 = world[(i_20 + 2) % world.length];
|
var x2 = world[(i_21 + 2) % world.length];
|
||||||
var y2 = world[(i_20 + 3) % world.length];
|
var y2 = world[(i_21 + 3) % world.length];
|
||||||
shapes.line(x, y, x2, y2);
|
shapes.line(x, y, x2, y2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
15
spine-ts/build/spine-canvas.d.ts
vendored
15
spine-ts/build/spine-canvas.d.ts
vendored
@ -244,15 +244,14 @@ declare module spine {
|
|||||||
static emptyAnimation: Animation;
|
static emptyAnimation: Animation;
|
||||||
static SUBSEQUENT: number;
|
static SUBSEQUENT: number;
|
||||||
static FIRST: number;
|
static FIRST: number;
|
||||||
static DIP: number;
|
static HOLD: number;
|
||||||
static DIP_MIX: number;
|
static HOLD_MIX: number;
|
||||||
data: AnimationStateData;
|
data: AnimationStateData;
|
||||||
tracks: TrackEntry[];
|
tracks: TrackEntry[];
|
||||||
events: Event[];
|
events: Event[];
|
||||||
listeners: AnimationStateListener2[];
|
listeners: AnimationStateListener2[];
|
||||||
queue: EventQueue;
|
queue: EventQueue;
|
||||||
propertyIDs: IntSet;
|
propertyIDs: IntSet;
|
||||||
mixingTo: TrackEntry[];
|
|
||||||
animationsChanged: boolean;
|
animationsChanged: boolean;
|
||||||
timeScale: number;
|
timeScale: number;
|
||||||
trackEntryPool: Pool<TrackEntry>;
|
trackEntryPool: Pool<TrackEntry>;
|
||||||
@ -277,6 +276,8 @@ declare module spine {
|
|||||||
trackEntry(trackIndex: number, animation: Animation, loop: boolean, last: TrackEntry): TrackEntry;
|
trackEntry(trackIndex: number, animation: Animation, loop: boolean, last: TrackEntry): TrackEntry;
|
||||||
disposeNext(entry: TrackEntry): void;
|
disposeNext(entry: TrackEntry): void;
|
||||||
_animationsChanged(): void;
|
_animationsChanged(): void;
|
||||||
|
setTimelineModes(entry: TrackEntry): void;
|
||||||
|
hasTimeline(entry: TrackEntry, id: number): boolean;
|
||||||
getCurrent(trackIndex: number): TrackEntry;
|
getCurrent(trackIndex: number): TrackEntry;
|
||||||
addListener(listener: AnimationStateListener2): void;
|
addListener(listener: AnimationStateListener2): void;
|
||||||
removeListener(listener: AnimationStateListener2): void;
|
removeListener(listener: AnimationStateListener2): void;
|
||||||
@ -287,9 +288,11 @@ declare module spine {
|
|||||||
animation: Animation;
|
animation: Animation;
|
||||||
next: TrackEntry;
|
next: TrackEntry;
|
||||||
mixingFrom: TrackEntry;
|
mixingFrom: TrackEntry;
|
||||||
|
mixingTo: TrackEntry;
|
||||||
listener: AnimationStateListener2;
|
listener: AnimationStateListener2;
|
||||||
trackIndex: number;
|
trackIndex: number;
|
||||||
loop: boolean;
|
loop: boolean;
|
||||||
|
holdPrevious: boolean;
|
||||||
eventThreshold: number;
|
eventThreshold: number;
|
||||||
attachmentThreshold: number;
|
attachmentThreshold: number;
|
||||||
drawOrderThreshold: number;
|
drawOrderThreshold: number;
|
||||||
@ -309,12 +312,10 @@ declare module spine {
|
|||||||
interruptAlpha: number;
|
interruptAlpha: number;
|
||||||
totalAlpha: number;
|
totalAlpha: number;
|
||||||
mixBlend: MixBlend;
|
mixBlend: MixBlend;
|
||||||
timelineData: number[];
|
timelineMode: number[];
|
||||||
timelineDipMix: TrackEntry[];
|
timelineHoldMix: TrackEntry[];
|
||||||
timelinesRotation: number[];
|
timelinesRotation: number[];
|
||||||
reset(): void;
|
reset(): void;
|
||||||
setTimelineData(to: TrackEntry, mixingToArray: Array<TrackEntry>, propertyIDs: IntSet): TrackEntry;
|
|
||||||
hasTimeline(id: number): boolean;
|
|
||||||
getAnimationTime(): number;
|
getAnimationTime(): number;
|
||||||
setAnimationLast(animationLast: number): void;
|
setAnimationLast(animationLast: number): void;
|
||||||
isComplete(): boolean;
|
isComplete(): boolean;
|
||||||
|
|||||||
@ -1303,7 +1303,6 @@ var spine;
|
|||||||
this.listeners = new Array();
|
this.listeners = new Array();
|
||||||
this.queue = new EventQueue(this);
|
this.queue = new EventQueue(this);
|
||||||
this.propertyIDs = new spine.IntSet();
|
this.propertyIDs = new spine.IntSet();
|
||||||
this.mixingTo = new Array();
|
|
||||||
this.animationsChanged = false;
|
this.animationsChanged = false;
|
||||||
this.timeScale = 1;
|
this.timeScale = 1;
|
||||||
this.trackEntryPool = new spine.Pool(function () { return new TrackEntry(); });
|
this.trackEntryPool = new spine.Pool(function () { return new TrackEntry(); });
|
||||||
@ -1350,6 +1349,8 @@ var spine;
|
|||||||
if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
|
if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
|
||||||
var from = current.mixingFrom;
|
var from = current.mixingFrom;
|
||||||
current.mixingFrom = null;
|
current.mixingFrom = null;
|
||||||
|
if (from != null)
|
||||||
|
from.mixingTo = null;
|
||||||
while (from != null) {
|
while (from != null) {
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
from = from.mixingFrom;
|
from = from.mixingFrom;
|
||||||
@ -1369,6 +1370,8 @@ var spine;
|
|||||||
if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
|
if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
|
||||||
if (from.totalAlpha == 0 || to.mixDuration == 0) {
|
if (from.totalAlpha == 0 || to.mixDuration == 0) {
|
||||||
to.mixingFrom = from.mixingFrom;
|
to.mixingFrom = from.mixingFrom;
|
||||||
|
if (from.mixingFrom != null)
|
||||||
|
from.mixingFrom.mixingTo = to;
|
||||||
to.interruptAlpha = from.interruptAlpha;
|
to.interruptAlpha = from.interruptAlpha;
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
}
|
}
|
||||||
@ -1400,19 +1403,19 @@ var spine;
|
|||||||
var animationLast = current.animationLast, animationTime = current.getAnimationTime();
|
var animationLast = current.animationLast, animationTime = current.getAnimationTime();
|
||||||
var timelineCount = current.animation.timelines.length;
|
var timelineCount = current.animation.timelines.length;
|
||||||
var timelines = current.animation.timelines;
|
var timelines = current.animation.timelines;
|
||||||
if (mix == 1 || blend == spine.MixBlend.add) {
|
if (i == 0 && (mix == 1 || blend == spine.MixBlend.add)) {
|
||||||
for (var ii = 0; ii < timelineCount; ii++)
|
for (var ii = 0; ii < timelineCount; ii++)
|
||||||
timelines[ii].apply(skeleton, animationLast, animationTime, events, mix, blend, spine.MixDirection["in"]);
|
timelines[ii].apply(skeleton, animationLast, animationTime, events, mix, blend, spine.MixDirection["in"]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var timelineData = current.timelineData;
|
var timelineMode = current.timelineMode;
|
||||||
var firstFrame = current.timelinesRotation.length == 0;
|
var firstFrame = current.timelinesRotation.length == 0;
|
||||||
if (firstFrame)
|
if (firstFrame)
|
||||||
spine.Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null);
|
spine.Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null);
|
||||||
var timelinesRotation = current.timelinesRotation;
|
var timelinesRotation = current.timelinesRotation;
|
||||||
for (var ii = 0; ii < timelineCount; ii++) {
|
for (var ii = 0; ii < timelineCount; ii++) {
|
||||||
var timeline = timelines[ii];
|
var timeline = timelines[ii];
|
||||||
var timelineBlend = timelineData[ii] == AnimationState.SUBSEQUENT ? blend : spine.MixBlend.setup;
|
var timelineBlend = timelineMode[ii] == AnimationState.SUBSEQUENT ? blend : spine.MixBlend.setup;
|
||||||
if (timeline instanceof spine.RotateTimeline) {
|
if (timeline instanceof spine.RotateTimeline) {
|
||||||
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
|
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
|
||||||
}
|
}
|
||||||
@ -1452,14 +1455,14 @@ var spine;
|
|||||||
var animationLast = from.animationLast, animationTime = from.getAnimationTime();
|
var animationLast = from.animationLast, animationTime = from.getAnimationTime();
|
||||||
var timelineCount = from.animation.timelines.length;
|
var timelineCount = from.animation.timelines.length;
|
||||||
var timelines = from.animation.timelines;
|
var timelines = from.animation.timelines;
|
||||||
var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix);
|
var alphaHold = from.alpha * to.interruptAlpha, alphaMix = alphaHold * (1 - mix);
|
||||||
if (blend == spine.MixBlend.add) {
|
if (blend == spine.MixBlend.add) {
|
||||||
for (var i = 0; i < timelineCount; i++)
|
for (var i = 0; i < timelineCount; i++)
|
||||||
timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, spine.MixDirection.out);
|
timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, spine.MixDirection.out);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var timelineData = from.timelineData;
|
var timelineMode = from.timelineMode;
|
||||||
var timelineDipMix = from.timelineDipMix;
|
var timelineHoldMix = from.timelineHoldMix;
|
||||||
var firstFrame = from.timelinesRotation.length == 0;
|
var firstFrame = from.timelinesRotation.length == 0;
|
||||||
if (firstFrame)
|
if (firstFrame)
|
||||||
spine.Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null);
|
spine.Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null);
|
||||||
@ -1469,7 +1472,7 @@ var spine;
|
|||||||
var timeline = timelines[i];
|
var timeline = timelines[i];
|
||||||
var timelineBlend;
|
var timelineBlend;
|
||||||
var alpha = 0;
|
var alpha = 0;
|
||||||
switch (timelineData[i]) {
|
switch (timelineMode[i]) {
|
||||||
case AnimationState.SUBSEQUENT:
|
case AnimationState.SUBSEQUENT:
|
||||||
if (!attachments && timeline instanceof spine.AttachmentTimeline)
|
if (!attachments && timeline instanceof spine.AttachmentTimeline)
|
||||||
continue;
|
continue;
|
||||||
@ -1482,14 +1485,14 @@ var spine;
|
|||||||
timelineBlend = spine.MixBlend.setup;
|
timelineBlend = spine.MixBlend.setup;
|
||||||
alpha = alphaMix;
|
alpha = alphaMix;
|
||||||
break;
|
break;
|
||||||
case AnimationState.DIP:
|
case AnimationState.HOLD:
|
||||||
timelineBlend = spine.MixBlend.setup;
|
timelineBlend = spine.MixBlend.setup;
|
||||||
alpha = alphaDip;
|
alpha = alphaHold;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
timelineBlend = spine.MixBlend.setup;
|
timelineBlend = spine.MixBlend.setup;
|
||||||
var dipMix = timelineDipMix[i];
|
var holdMix = timelineHoldMix[i];
|
||||||
alpha = alphaDip * Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration);
|
alpha = alphaHold * Math.max(0, 1 - holdMix.mixTime / holdMix.mixDuration);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
from.totalAlpha += alpha;
|
from.totalAlpha += alpha;
|
||||||
@ -1619,6 +1622,7 @@ var spine;
|
|||||||
break;
|
break;
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
entry.mixingFrom = null;
|
entry.mixingFrom = null;
|
||||||
|
entry.mixingTo = null;
|
||||||
entry = from;
|
entry = from;
|
||||||
}
|
}
|
||||||
this.tracks[current.trackIndex] = null;
|
this.tracks[current.trackIndex] = null;
|
||||||
@ -1631,6 +1635,7 @@ var spine;
|
|||||||
if (interrupt)
|
if (interrupt)
|
||||||
this.queue.interrupt(from);
|
this.queue.interrupt(from);
|
||||||
current.mixingFrom = from;
|
current.mixingFrom = from;
|
||||||
|
from.mixingTo = current;
|
||||||
current.mixTime = 0;
|
current.mixTime = 0;
|
||||||
if (from.mixingFrom != null && from.mixDuration > 0)
|
if (from.mixingFrom != null && from.mixDuration > 0)
|
||||||
current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration);
|
current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration);
|
||||||
@ -1740,6 +1745,7 @@ var spine;
|
|||||||
entry.trackIndex = trackIndex;
|
entry.trackIndex = trackIndex;
|
||||||
entry.animation = animation;
|
entry.animation = animation;
|
||||||
entry.loop = loop;
|
entry.loop = loop;
|
||||||
|
entry.holdPrevious = false;
|
||||||
entry.eventThreshold = 0;
|
entry.eventThreshold = 0;
|
||||||
entry.attachmentThreshold = 0;
|
entry.attachmentThreshold = 0;
|
||||||
entry.drawOrderThreshold = 0;
|
entry.drawOrderThreshold = 0;
|
||||||
@ -1769,15 +1775,63 @@ var spine;
|
|||||||
};
|
};
|
||||||
AnimationState.prototype._animationsChanged = function () {
|
AnimationState.prototype._animationsChanged = function () {
|
||||||
this.animationsChanged = false;
|
this.animationsChanged = false;
|
||||||
var propertyIDs = this.propertyIDs;
|
this.propertyIDs.clear();
|
||||||
propertyIDs.clear();
|
|
||||||
var mixingTo = this.mixingTo;
|
|
||||||
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
||||||
var entry = this.tracks[i];
|
var entry = this.tracks[i];
|
||||||
if (entry != null && (i == 0 || entry.mixBlend != spine.MixBlend.add))
|
if (entry == null)
|
||||||
entry.setTimelineData(null, mixingTo, propertyIDs);
|
continue;
|
||||||
|
while (entry.mixingFrom != null)
|
||||||
|
entry = entry.mixingFrom;
|
||||||
|
do {
|
||||||
|
if (entry.mixingFrom == null || entry.mixBlend != spine.MixBlend.add)
|
||||||
|
this.setTimelineModes(entry);
|
||||||
|
entry = entry.mixingTo;
|
||||||
|
} while (entry != null);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
AnimationState.prototype.setTimelineModes = function (entry) {
|
||||||
|
var to = entry.mixingTo;
|
||||||
|
var timelines = entry.animation.timelines;
|
||||||
|
var timelinesCount = entry.animation.timelines.length;
|
||||||
|
var timelineMode = spine.Utils.setArraySize(entry.timelineMode, timelinesCount);
|
||||||
|
entry.timelineHoldMix.length = 0;
|
||||||
|
var timelineDipMix = spine.Utils.setArraySize(entry.timelineHoldMix, timelinesCount);
|
||||||
|
var propertyIDs = this.propertyIDs;
|
||||||
|
if (to != null && to.holdPrevious) {
|
||||||
|
for (var i_16 = 0; i_16 < timelinesCount; i_16++) {
|
||||||
|
propertyIDs.add(timelines[i_16].getPropertyId());
|
||||||
|
timelineMode[i_16] = AnimationState.HOLD;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
outer: for (var i = 0; i < timelinesCount; i++) {
|
||||||
|
var id = timelines[i].getPropertyId();
|
||||||
|
if (!propertyIDs.add(id))
|
||||||
|
timelineMode[i] = AnimationState.SUBSEQUENT;
|
||||||
|
else if (to == null || !this.hasTimeline(to, id))
|
||||||
|
timelineMode[i] = AnimationState.FIRST;
|
||||||
|
else {
|
||||||
|
for (var next = to.mixingTo; next != null; next = next.mixingTo) {
|
||||||
|
if (this.hasTimeline(next, id))
|
||||||
|
continue;
|
||||||
|
if (entry.mixDuration > 0) {
|
||||||
|
timelineMode[i] = AnimationState.HOLD_MIX;
|
||||||
|
timelineDipMix[i] = next;
|
||||||
|
continue outer;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
timelineMode[i] = AnimationState.HOLD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
AnimationState.prototype.hasTimeline = function (entry, id) {
|
||||||
|
var timelines = entry.animation.timelines;
|
||||||
|
for (var i = 0, n = timelines.length; i < n; i++)
|
||||||
|
if (timelines[i].getPropertyId() == id)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
};
|
||||||
AnimationState.prototype.getCurrent = function (trackIndex) {
|
AnimationState.prototype.getCurrent = function (trackIndex) {
|
||||||
if (trackIndex >= this.tracks.length)
|
if (trackIndex >= this.tracks.length)
|
||||||
return null;
|
return null;
|
||||||
@ -1802,69 +1856,28 @@ var spine;
|
|||||||
AnimationState.emptyAnimation = new spine.Animation("<empty>", [], 0);
|
AnimationState.emptyAnimation = new spine.Animation("<empty>", [], 0);
|
||||||
AnimationState.SUBSEQUENT = 0;
|
AnimationState.SUBSEQUENT = 0;
|
||||||
AnimationState.FIRST = 1;
|
AnimationState.FIRST = 1;
|
||||||
AnimationState.DIP = 2;
|
AnimationState.HOLD = 2;
|
||||||
AnimationState.DIP_MIX = 3;
|
AnimationState.HOLD_MIX = 3;
|
||||||
return AnimationState;
|
return AnimationState;
|
||||||
}());
|
}());
|
||||||
spine.AnimationState = AnimationState;
|
spine.AnimationState = AnimationState;
|
||||||
var TrackEntry = (function () {
|
var TrackEntry = (function () {
|
||||||
function TrackEntry() {
|
function TrackEntry() {
|
||||||
this.mixBlend = spine.MixBlend.replace;
|
this.mixBlend = spine.MixBlend.replace;
|
||||||
this.timelineData = new Array();
|
this.timelineMode = new Array();
|
||||||
this.timelineDipMix = new Array();
|
this.timelineHoldMix = new Array();
|
||||||
this.timelinesRotation = new Array();
|
this.timelinesRotation = new Array();
|
||||||
}
|
}
|
||||||
TrackEntry.prototype.reset = function () {
|
TrackEntry.prototype.reset = function () {
|
||||||
this.next = null;
|
this.next = null;
|
||||||
this.mixingFrom = null;
|
this.mixingFrom = null;
|
||||||
|
this.mixingTo = null;
|
||||||
this.animation = null;
|
this.animation = null;
|
||||||
this.listener = null;
|
this.listener = null;
|
||||||
this.timelineData.length = 0;
|
this.timelineMode.length = 0;
|
||||||
this.timelineDipMix.length = 0;
|
this.timelineHoldMix.length = 0;
|
||||||
this.timelinesRotation.length = 0;
|
this.timelinesRotation.length = 0;
|
||||||
};
|
};
|
||||||
TrackEntry.prototype.setTimelineData = function (to, mixingToArray, propertyIDs) {
|
|
||||||
if (to != null)
|
|
||||||
mixingToArray.push(to);
|
|
||||||
var lastEntry = this.mixingFrom != null ? this.mixingFrom.setTimelineData(this, mixingToArray, propertyIDs) : this;
|
|
||||||
if (to != null)
|
|
||||||
mixingToArray.pop();
|
|
||||||
var mixingTo = mixingToArray;
|
|
||||||
var mixingToLast = mixingToArray.length - 1;
|
|
||||||
var timelines = this.animation.timelines;
|
|
||||||
var timelinesCount = this.animation.timelines.length;
|
|
||||||
var timelineData = spine.Utils.setArraySize(this.timelineData, timelinesCount);
|
|
||||||
this.timelineDipMix.length = 0;
|
|
||||||
var timelineDipMix = spine.Utils.setArraySize(this.timelineDipMix, timelinesCount);
|
|
||||||
outer: for (var i = 0; i < timelinesCount; i++) {
|
|
||||||
var id = timelines[i].getPropertyId();
|
|
||||||
if (!propertyIDs.add(id))
|
|
||||||
timelineData[i] = AnimationState.SUBSEQUENT;
|
|
||||||
else if (to == null || !to.hasTimeline(id))
|
|
||||||
timelineData[i] = AnimationState.FIRST;
|
|
||||||
else {
|
|
||||||
for (var ii = mixingToLast; ii >= 0; ii--) {
|
|
||||||
var entry = mixingTo[ii];
|
|
||||||
if (!entry.hasTimeline(id)) {
|
|
||||||
if (entry.mixDuration > 0) {
|
|
||||||
timelineData[i] = AnimationState.DIP_MIX;
|
|
||||||
timelineDipMix[i] = entry;
|
|
||||||
continue outer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
timelineData[i] = AnimationState.DIP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return lastEntry;
|
|
||||||
};
|
|
||||||
TrackEntry.prototype.hasTimeline = function (id) {
|
|
||||||
var timelines = this.animation.timelines;
|
|
||||||
for (var i = 0, n = timelines.length; i < n; i++)
|
|
||||||
if (timelines[i].getPropertyId() == id)
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
TrackEntry.prototype.getAnimationTime = function () {
|
TrackEntry.prototype.getAnimationTime = function () {
|
||||||
if (this.loop) {
|
if (this.loop) {
|
||||||
var duration = this.animationEnd - this.animationStart;
|
var duration = this.animationEnd - this.animationStart;
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
15
spine-ts/build/spine-core.d.ts
vendored
15
spine-ts/build/spine-core.d.ts
vendored
@ -244,15 +244,14 @@ declare module spine {
|
|||||||
static emptyAnimation: Animation;
|
static emptyAnimation: Animation;
|
||||||
static SUBSEQUENT: number;
|
static SUBSEQUENT: number;
|
||||||
static FIRST: number;
|
static FIRST: number;
|
||||||
static DIP: number;
|
static HOLD: number;
|
||||||
static DIP_MIX: number;
|
static HOLD_MIX: number;
|
||||||
data: AnimationStateData;
|
data: AnimationStateData;
|
||||||
tracks: TrackEntry[];
|
tracks: TrackEntry[];
|
||||||
events: Event[];
|
events: Event[];
|
||||||
listeners: AnimationStateListener2[];
|
listeners: AnimationStateListener2[];
|
||||||
queue: EventQueue;
|
queue: EventQueue;
|
||||||
propertyIDs: IntSet;
|
propertyIDs: IntSet;
|
||||||
mixingTo: TrackEntry[];
|
|
||||||
animationsChanged: boolean;
|
animationsChanged: boolean;
|
||||||
timeScale: number;
|
timeScale: number;
|
||||||
trackEntryPool: Pool<TrackEntry>;
|
trackEntryPool: Pool<TrackEntry>;
|
||||||
@ -277,6 +276,8 @@ declare module spine {
|
|||||||
trackEntry(trackIndex: number, animation: Animation, loop: boolean, last: TrackEntry): TrackEntry;
|
trackEntry(trackIndex: number, animation: Animation, loop: boolean, last: TrackEntry): TrackEntry;
|
||||||
disposeNext(entry: TrackEntry): void;
|
disposeNext(entry: TrackEntry): void;
|
||||||
_animationsChanged(): void;
|
_animationsChanged(): void;
|
||||||
|
setTimelineModes(entry: TrackEntry): void;
|
||||||
|
hasTimeline(entry: TrackEntry, id: number): boolean;
|
||||||
getCurrent(trackIndex: number): TrackEntry;
|
getCurrent(trackIndex: number): TrackEntry;
|
||||||
addListener(listener: AnimationStateListener2): void;
|
addListener(listener: AnimationStateListener2): void;
|
||||||
removeListener(listener: AnimationStateListener2): void;
|
removeListener(listener: AnimationStateListener2): void;
|
||||||
@ -287,9 +288,11 @@ declare module spine {
|
|||||||
animation: Animation;
|
animation: Animation;
|
||||||
next: TrackEntry;
|
next: TrackEntry;
|
||||||
mixingFrom: TrackEntry;
|
mixingFrom: TrackEntry;
|
||||||
|
mixingTo: TrackEntry;
|
||||||
listener: AnimationStateListener2;
|
listener: AnimationStateListener2;
|
||||||
trackIndex: number;
|
trackIndex: number;
|
||||||
loop: boolean;
|
loop: boolean;
|
||||||
|
holdPrevious: boolean;
|
||||||
eventThreshold: number;
|
eventThreshold: number;
|
||||||
attachmentThreshold: number;
|
attachmentThreshold: number;
|
||||||
drawOrderThreshold: number;
|
drawOrderThreshold: number;
|
||||||
@ -309,12 +312,10 @@ declare module spine {
|
|||||||
interruptAlpha: number;
|
interruptAlpha: number;
|
||||||
totalAlpha: number;
|
totalAlpha: number;
|
||||||
mixBlend: MixBlend;
|
mixBlend: MixBlend;
|
||||||
timelineData: number[];
|
timelineMode: number[];
|
||||||
timelineDipMix: TrackEntry[];
|
timelineHoldMix: TrackEntry[];
|
||||||
timelinesRotation: number[];
|
timelinesRotation: number[];
|
||||||
reset(): void;
|
reset(): void;
|
||||||
setTimelineData(to: TrackEntry, mixingToArray: Array<TrackEntry>, propertyIDs: IntSet): TrackEntry;
|
|
||||||
hasTimeline(id: number): boolean;
|
|
||||||
getAnimationTime(): number;
|
getAnimationTime(): number;
|
||||||
setAnimationLast(animationLast: number): void;
|
setAnimationLast(animationLast: number): void;
|
||||||
isComplete(): boolean;
|
isComplete(): boolean;
|
||||||
|
|||||||
@ -1303,7 +1303,6 @@ var spine;
|
|||||||
this.listeners = new Array();
|
this.listeners = new Array();
|
||||||
this.queue = new EventQueue(this);
|
this.queue = new EventQueue(this);
|
||||||
this.propertyIDs = new spine.IntSet();
|
this.propertyIDs = new spine.IntSet();
|
||||||
this.mixingTo = new Array();
|
|
||||||
this.animationsChanged = false;
|
this.animationsChanged = false;
|
||||||
this.timeScale = 1;
|
this.timeScale = 1;
|
||||||
this.trackEntryPool = new spine.Pool(function () { return new TrackEntry(); });
|
this.trackEntryPool = new spine.Pool(function () { return new TrackEntry(); });
|
||||||
@ -1350,6 +1349,8 @@ var spine;
|
|||||||
if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
|
if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
|
||||||
var from = current.mixingFrom;
|
var from = current.mixingFrom;
|
||||||
current.mixingFrom = null;
|
current.mixingFrom = null;
|
||||||
|
if (from != null)
|
||||||
|
from.mixingTo = null;
|
||||||
while (from != null) {
|
while (from != null) {
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
from = from.mixingFrom;
|
from = from.mixingFrom;
|
||||||
@ -1369,6 +1370,8 @@ var spine;
|
|||||||
if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
|
if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
|
||||||
if (from.totalAlpha == 0 || to.mixDuration == 0) {
|
if (from.totalAlpha == 0 || to.mixDuration == 0) {
|
||||||
to.mixingFrom = from.mixingFrom;
|
to.mixingFrom = from.mixingFrom;
|
||||||
|
if (from.mixingFrom != null)
|
||||||
|
from.mixingFrom.mixingTo = to;
|
||||||
to.interruptAlpha = from.interruptAlpha;
|
to.interruptAlpha = from.interruptAlpha;
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
}
|
}
|
||||||
@ -1400,19 +1403,19 @@ var spine;
|
|||||||
var animationLast = current.animationLast, animationTime = current.getAnimationTime();
|
var animationLast = current.animationLast, animationTime = current.getAnimationTime();
|
||||||
var timelineCount = current.animation.timelines.length;
|
var timelineCount = current.animation.timelines.length;
|
||||||
var timelines = current.animation.timelines;
|
var timelines = current.animation.timelines;
|
||||||
if (mix == 1 || blend == spine.MixBlend.add) {
|
if (i == 0 && (mix == 1 || blend == spine.MixBlend.add)) {
|
||||||
for (var ii = 0; ii < timelineCount; ii++)
|
for (var ii = 0; ii < timelineCount; ii++)
|
||||||
timelines[ii].apply(skeleton, animationLast, animationTime, events, mix, blend, spine.MixDirection["in"]);
|
timelines[ii].apply(skeleton, animationLast, animationTime, events, mix, blend, spine.MixDirection["in"]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var timelineData = current.timelineData;
|
var timelineMode = current.timelineMode;
|
||||||
var firstFrame = current.timelinesRotation.length == 0;
|
var firstFrame = current.timelinesRotation.length == 0;
|
||||||
if (firstFrame)
|
if (firstFrame)
|
||||||
spine.Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null);
|
spine.Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null);
|
||||||
var timelinesRotation = current.timelinesRotation;
|
var timelinesRotation = current.timelinesRotation;
|
||||||
for (var ii = 0; ii < timelineCount; ii++) {
|
for (var ii = 0; ii < timelineCount; ii++) {
|
||||||
var timeline = timelines[ii];
|
var timeline = timelines[ii];
|
||||||
var timelineBlend = timelineData[ii] == AnimationState.SUBSEQUENT ? blend : spine.MixBlend.setup;
|
var timelineBlend = timelineMode[ii] == AnimationState.SUBSEQUENT ? blend : spine.MixBlend.setup;
|
||||||
if (timeline instanceof spine.RotateTimeline) {
|
if (timeline instanceof spine.RotateTimeline) {
|
||||||
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
|
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
|
||||||
}
|
}
|
||||||
@ -1452,14 +1455,14 @@ var spine;
|
|||||||
var animationLast = from.animationLast, animationTime = from.getAnimationTime();
|
var animationLast = from.animationLast, animationTime = from.getAnimationTime();
|
||||||
var timelineCount = from.animation.timelines.length;
|
var timelineCount = from.animation.timelines.length;
|
||||||
var timelines = from.animation.timelines;
|
var timelines = from.animation.timelines;
|
||||||
var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix);
|
var alphaHold = from.alpha * to.interruptAlpha, alphaMix = alphaHold * (1 - mix);
|
||||||
if (blend == spine.MixBlend.add) {
|
if (blend == spine.MixBlend.add) {
|
||||||
for (var i = 0; i < timelineCount; i++)
|
for (var i = 0; i < timelineCount; i++)
|
||||||
timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, spine.MixDirection.out);
|
timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, spine.MixDirection.out);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var timelineData = from.timelineData;
|
var timelineMode = from.timelineMode;
|
||||||
var timelineDipMix = from.timelineDipMix;
|
var timelineHoldMix = from.timelineHoldMix;
|
||||||
var firstFrame = from.timelinesRotation.length == 0;
|
var firstFrame = from.timelinesRotation.length == 0;
|
||||||
if (firstFrame)
|
if (firstFrame)
|
||||||
spine.Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null);
|
spine.Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null);
|
||||||
@ -1469,7 +1472,7 @@ var spine;
|
|||||||
var timeline = timelines[i];
|
var timeline = timelines[i];
|
||||||
var timelineBlend;
|
var timelineBlend;
|
||||||
var alpha = 0;
|
var alpha = 0;
|
||||||
switch (timelineData[i]) {
|
switch (timelineMode[i]) {
|
||||||
case AnimationState.SUBSEQUENT:
|
case AnimationState.SUBSEQUENT:
|
||||||
if (!attachments && timeline instanceof spine.AttachmentTimeline)
|
if (!attachments && timeline instanceof spine.AttachmentTimeline)
|
||||||
continue;
|
continue;
|
||||||
@ -1482,14 +1485,14 @@ var spine;
|
|||||||
timelineBlend = spine.MixBlend.setup;
|
timelineBlend = spine.MixBlend.setup;
|
||||||
alpha = alphaMix;
|
alpha = alphaMix;
|
||||||
break;
|
break;
|
||||||
case AnimationState.DIP:
|
case AnimationState.HOLD:
|
||||||
timelineBlend = spine.MixBlend.setup;
|
timelineBlend = spine.MixBlend.setup;
|
||||||
alpha = alphaDip;
|
alpha = alphaHold;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
timelineBlend = spine.MixBlend.setup;
|
timelineBlend = spine.MixBlend.setup;
|
||||||
var dipMix = timelineDipMix[i];
|
var holdMix = timelineHoldMix[i];
|
||||||
alpha = alphaDip * Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration);
|
alpha = alphaHold * Math.max(0, 1 - holdMix.mixTime / holdMix.mixDuration);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
from.totalAlpha += alpha;
|
from.totalAlpha += alpha;
|
||||||
@ -1619,6 +1622,7 @@ var spine;
|
|||||||
break;
|
break;
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
entry.mixingFrom = null;
|
entry.mixingFrom = null;
|
||||||
|
entry.mixingTo = null;
|
||||||
entry = from;
|
entry = from;
|
||||||
}
|
}
|
||||||
this.tracks[current.trackIndex] = null;
|
this.tracks[current.trackIndex] = null;
|
||||||
@ -1631,6 +1635,7 @@ var spine;
|
|||||||
if (interrupt)
|
if (interrupt)
|
||||||
this.queue.interrupt(from);
|
this.queue.interrupt(from);
|
||||||
current.mixingFrom = from;
|
current.mixingFrom = from;
|
||||||
|
from.mixingTo = current;
|
||||||
current.mixTime = 0;
|
current.mixTime = 0;
|
||||||
if (from.mixingFrom != null && from.mixDuration > 0)
|
if (from.mixingFrom != null && from.mixDuration > 0)
|
||||||
current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration);
|
current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration);
|
||||||
@ -1740,6 +1745,7 @@ var spine;
|
|||||||
entry.trackIndex = trackIndex;
|
entry.trackIndex = trackIndex;
|
||||||
entry.animation = animation;
|
entry.animation = animation;
|
||||||
entry.loop = loop;
|
entry.loop = loop;
|
||||||
|
entry.holdPrevious = false;
|
||||||
entry.eventThreshold = 0;
|
entry.eventThreshold = 0;
|
||||||
entry.attachmentThreshold = 0;
|
entry.attachmentThreshold = 0;
|
||||||
entry.drawOrderThreshold = 0;
|
entry.drawOrderThreshold = 0;
|
||||||
@ -1769,15 +1775,63 @@ var spine;
|
|||||||
};
|
};
|
||||||
AnimationState.prototype._animationsChanged = function () {
|
AnimationState.prototype._animationsChanged = function () {
|
||||||
this.animationsChanged = false;
|
this.animationsChanged = false;
|
||||||
var propertyIDs = this.propertyIDs;
|
this.propertyIDs.clear();
|
||||||
propertyIDs.clear();
|
|
||||||
var mixingTo = this.mixingTo;
|
|
||||||
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
||||||
var entry = this.tracks[i];
|
var entry = this.tracks[i];
|
||||||
if (entry != null && (i == 0 || entry.mixBlend != spine.MixBlend.add))
|
if (entry == null)
|
||||||
entry.setTimelineData(null, mixingTo, propertyIDs);
|
continue;
|
||||||
|
while (entry.mixingFrom != null)
|
||||||
|
entry = entry.mixingFrom;
|
||||||
|
do {
|
||||||
|
if (entry.mixingFrom == null || entry.mixBlend != spine.MixBlend.add)
|
||||||
|
this.setTimelineModes(entry);
|
||||||
|
entry = entry.mixingTo;
|
||||||
|
} while (entry != null);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
AnimationState.prototype.setTimelineModes = function (entry) {
|
||||||
|
var to = entry.mixingTo;
|
||||||
|
var timelines = entry.animation.timelines;
|
||||||
|
var timelinesCount = entry.animation.timelines.length;
|
||||||
|
var timelineMode = spine.Utils.setArraySize(entry.timelineMode, timelinesCount);
|
||||||
|
entry.timelineHoldMix.length = 0;
|
||||||
|
var timelineDipMix = spine.Utils.setArraySize(entry.timelineHoldMix, timelinesCount);
|
||||||
|
var propertyIDs = this.propertyIDs;
|
||||||
|
if (to != null && to.holdPrevious) {
|
||||||
|
for (var i_16 = 0; i_16 < timelinesCount; i_16++) {
|
||||||
|
propertyIDs.add(timelines[i_16].getPropertyId());
|
||||||
|
timelineMode[i_16] = AnimationState.HOLD;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
outer: for (var i = 0; i < timelinesCount; i++) {
|
||||||
|
var id = timelines[i].getPropertyId();
|
||||||
|
if (!propertyIDs.add(id))
|
||||||
|
timelineMode[i] = AnimationState.SUBSEQUENT;
|
||||||
|
else if (to == null || !this.hasTimeline(to, id))
|
||||||
|
timelineMode[i] = AnimationState.FIRST;
|
||||||
|
else {
|
||||||
|
for (var next = to.mixingTo; next != null; next = next.mixingTo) {
|
||||||
|
if (this.hasTimeline(next, id))
|
||||||
|
continue;
|
||||||
|
if (entry.mixDuration > 0) {
|
||||||
|
timelineMode[i] = AnimationState.HOLD_MIX;
|
||||||
|
timelineDipMix[i] = next;
|
||||||
|
continue outer;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
timelineMode[i] = AnimationState.HOLD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
AnimationState.prototype.hasTimeline = function (entry, id) {
|
||||||
|
var timelines = entry.animation.timelines;
|
||||||
|
for (var i = 0, n = timelines.length; i < n; i++)
|
||||||
|
if (timelines[i].getPropertyId() == id)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
};
|
||||||
AnimationState.prototype.getCurrent = function (trackIndex) {
|
AnimationState.prototype.getCurrent = function (trackIndex) {
|
||||||
if (trackIndex >= this.tracks.length)
|
if (trackIndex >= this.tracks.length)
|
||||||
return null;
|
return null;
|
||||||
@ -1802,69 +1856,28 @@ var spine;
|
|||||||
AnimationState.emptyAnimation = new spine.Animation("<empty>", [], 0);
|
AnimationState.emptyAnimation = new spine.Animation("<empty>", [], 0);
|
||||||
AnimationState.SUBSEQUENT = 0;
|
AnimationState.SUBSEQUENT = 0;
|
||||||
AnimationState.FIRST = 1;
|
AnimationState.FIRST = 1;
|
||||||
AnimationState.DIP = 2;
|
AnimationState.HOLD = 2;
|
||||||
AnimationState.DIP_MIX = 3;
|
AnimationState.HOLD_MIX = 3;
|
||||||
return AnimationState;
|
return AnimationState;
|
||||||
}());
|
}());
|
||||||
spine.AnimationState = AnimationState;
|
spine.AnimationState = AnimationState;
|
||||||
var TrackEntry = (function () {
|
var TrackEntry = (function () {
|
||||||
function TrackEntry() {
|
function TrackEntry() {
|
||||||
this.mixBlend = spine.MixBlend.replace;
|
this.mixBlend = spine.MixBlend.replace;
|
||||||
this.timelineData = new Array();
|
this.timelineMode = new Array();
|
||||||
this.timelineDipMix = new Array();
|
this.timelineHoldMix = new Array();
|
||||||
this.timelinesRotation = new Array();
|
this.timelinesRotation = new Array();
|
||||||
}
|
}
|
||||||
TrackEntry.prototype.reset = function () {
|
TrackEntry.prototype.reset = function () {
|
||||||
this.next = null;
|
this.next = null;
|
||||||
this.mixingFrom = null;
|
this.mixingFrom = null;
|
||||||
|
this.mixingTo = null;
|
||||||
this.animation = null;
|
this.animation = null;
|
||||||
this.listener = null;
|
this.listener = null;
|
||||||
this.timelineData.length = 0;
|
this.timelineMode.length = 0;
|
||||||
this.timelineDipMix.length = 0;
|
this.timelineHoldMix.length = 0;
|
||||||
this.timelinesRotation.length = 0;
|
this.timelinesRotation.length = 0;
|
||||||
};
|
};
|
||||||
TrackEntry.prototype.setTimelineData = function (to, mixingToArray, propertyIDs) {
|
|
||||||
if (to != null)
|
|
||||||
mixingToArray.push(to);
|
|
||||||
var lastEntry = this.mixingFrom != null ? this.mixingFrom.setTimelineData(this, mixingToArray, propertyIDs) : this;
|
|
||||||
if (to != null)
|
|
||||||
mixingToArray.pop();
|
|
||||||
var mixingTo = mixingToArray;
|
|
||||||
var mixingToLast = mixingToArray.length - 1;
|
|
||||||
var timelines = this.animation.timelines;
|
|
||||||
var timelinesCount = this.animation.timelines.length;
|
|
||||||
var timelineData = spine.Utils.setArraySize(this.timelineData, timelinesCount);
|
|
||||||
this.timelineDipMix.length = 0;
|
|
||||||
var timelineDipMix = spine.Utils.setArraySize(this.timelineDipMix, timelinesCount);
|
|
||||||
outer: for (var i = 0; i < timelinesCount; i++) {
|
|
||||||
var id = timelines[i].getPropertyId();
|
|
||||||
if (!propertyIDs.add(id))
|
|
||||||
timelineData[i] = AnimationState.SUBSEQUENT;
|
|
||||||
else if (to == null || !to.hasTimeline(id))
|
|
||||||
timelineData[i] = AnimationState.FIRST;
|
|
||||||
else {
|
|
||||||
for (var ii = mixingToLast; ii >= 0; ii--) {
|
|
||||||
var entry = mixingTo[ii];
|
|
||||||
if (!entry.hasTimeline(id)) {
|
|
||||||
if (entry.mixDuration > 0) {
|
|
||||||
timelineData[i] = AnimationState.DIP_MIX;
|
|
||||||
timelineDipMix[i] = entry;
|
|
||||||
continue outer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
timelineData[i] = AnimationState.DIP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return lastEntry;
|
|
||||||
};
|
|
||||||
TrackEntry.prototype.hasTimeline = function (id) {
|
|
||||||
var timelines = this.animation.timelines;
|
|
||||||
for (var i = 0, n = timelines.length; i < n; i++)
|
|
||||||
if (timelines[i].getPropertyId() == id)
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
TrackEntry.prototype.getAnimationTime = function () {
|
TrackEntry.prototype.getAnimationTime = function () {
|
||||||
if (this.loop) {
|
if (this.loop) {
|
||||||
var duration = this.animationEnd - this.animationStart;
|
var duration = this.animationEnd - this.animationStart;
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
15
spine-ts/build/spine-threejs.d.ts
vendored
15
spine-ts/build/spine-threejs.d.ts
vendored
@ -244,15 +244,14 @@ declare module spine {
|
|||||||
static emptyAnimation: Animation;
|
static emptyAnimation: Animation;
|
||||||
static SUBSEQUENT: number;
|
static SUBSEQUENT: number;
|
||||||
static FIRST: number;
|
static FIRST: number;
|
||||||
static DIP: number;
|
static HOLD: number;
|
||||||
static DIP_MIX: number;
|
static HOLD_MIX: number;
|
||||||
data: AnimationStateData;
|
data: AnimationStateData;
|
||||||
tracks: TrackEntry[];
|
tracks: TrackEntry[];
|
||||||
events: Event[];
|
events: Event[];
|
||||||
listeners: AnimationStateListener2[];
|
listeners: AnimationStateListener2[];
|
||||||
queue: EventQueue;
|
queue: EventQueue;
|
||||||
propertyIDs: IntSet;
|
propertyIDs: IntSet;
|
||||||
mixingTo: TrackEntry[];
|
|
||||||
animationsChanged: boolean;
|
animationsChanged: boolean;
|
||||||
timeScale: number;
|
timeScale: number;
|
||||||
trackEntryPool: Pool<TrackEntry>;
|
trackEntryPool: Pool<TrackEntry>;
|
||||||
@ -277,6 +276,8 @@ declare module spine {
|
|||||||
trackEntry(trackIndex: number, animation: Animation, loop: boolean, last: TrackEntry): TrackEntry;
|
trackEntry(trackIndex: number, animation: Animation, loop: boolean, last: TrackEntry): TrackEntry;
|
||||||
disposeNext(entry: TrackEntry): void;
|
disposeNext(entry: TrackEntry): void;
|
||||||
_animationsChanged(): void;
|
_animationsChanged(): void;
|
||||||
|
setTimelineModes(entry: TrackEntry): void;
|
||||||
|
hasTimeline(entry: TrackEntry, id: number): boolean;
|
||||||
getCurrent(trackIndex: number): TrackEntry;
|
getCurrent(trackIndex: number): TrackEntry;
|
||||||
addListener(listener: AnimationStateListener2): void;
|
addListener(listener: AnimationStateListener2): void;
|
||||||
removeListener(listener: AnimationStateListener2): void;
|
removeListener(listener: AnimationStateListener2): void;
|
||||||
@ -287,9 +288,11 @@ declare module spine {
|
|||||||
animation: Animation;
|
animation: Animation;
|
||||||
next: TrackEntry;
|
next: TrackEntry;
|
||||||
mixingFrom: TrackEntry;
|
mixingFrom: TrackEntry;
|
||||||
|
mixingTo: TrackEntry;
|
||||||
listener: AnimationStateListener2;
|
listener: AnimationStateListener2;
|
||||||
trackIndex: number;
|
trackIndex: number;
|
||||||
loop: boolean;
|
loop: boolean;
|
||||||
|
holdPrevious: boolean;
|
||||||
eventThreshold: number;
|
eventThreshold: number;
|
||||||
attachmentThreshold: number;
|
attachmentThreshold: number;
|
||||||
drawOrderThreshold: number;
|
drawOrderThreshold: number;
|
||||||
@ -309,12 +312,10 @@ declare module spine {
|
|||||||
interruptAlpha: number;
|
interruptAlpha: number;
|
||||||
totalAlpha: number;
|
totalAlpha: number;
|
||||||
mixBlend: MixBlend;
|
mixBlend: MixBlend;
|
||||||
timelineData: number[];
|
timelineMode: number[];
|
||||||
timelineDipMix: TrackEntry[];
|
timelineHoldMix: TrackEntry[];
|
||||||
timelinesRotation: number[];
|
timelinesRotation: number[];
|
||||||
reset(): void;
|
reset(): void;
|
||||||
setTimelineData(to: TrackEntry, mixingToArray: Array<TrackEntry>, propertyIDs: IntSet): TrackEntry;
|
|
||||||
hasTimeline(id: number): boolean;
|
|
||||||
getAnimationTime(): number;
|
getAnimationTime(): number;
|
||||||
setAnimationLast(animationLast: number): void;
|
setAnimationLast(animationLast: number): void;
|
||||||
isComplete(): boolean;
|
isComplete(): boolean;
|
||||||
|
|||||||
@ -1303,7 +1303,6 @@ var spine;
|
|||||||
this.listeners = new Array();
|
this.listeners = new Array();
|
||||||
this.queue = new EventQueue(this);
|
this.queue = new EventQueue(this);
|
||||||
this.propertyIDs = new spine.IntSet();
|
this.propertyIDs = new spine.IntSet();
|
||||||
this.mixingTo = new Array();
|
|
||||||
this.animationsChanged = false;
|
this.animationsChanged = false;
|
||||||
this.timeScale = 1;
|
this.timeScale = 1;
|
||||||
this.trackEntryPool = new spine.Pool(function () { return new TrackEntry(); });
|
this.trackEntryPool = new spine.Pool(function () { return new TrackEntry(); });
|
||||||
@ -1350,6 +1349,8 @@ var spine;
|
|||||||
if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
|
if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
|
||||||
var from = current.mixingFrom;
|
var from = current.mixingFrom;
|
||||||
current.mixingFrom = null;
|
current.mixingFrom = null;
|
||||||
|
if (from != null)
|
||||||
|
from.mixingTo = null;
|
||||||
while (from != null) {
|
while (from != null) {
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
from = from.mixingFrom;
|
from = from.mixingFrom;
|
||||||
@ -1369,6 +1370,8 @@ var spine;
|
|||||||
if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
|
if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
|
||||||
if (from.totalAlpha == 0 || to.mixDuration == 0) {
|
if (from.totalAlpha == 0 || to.mixDuration == 0) {
|
||||||
to.mixingFrom = from.mixingFrom;
|
to.mixingFrom = from.mixingFrom;
|
||||||
|
if (from.mixingFrom != null)
|
||||||
|
from.mixingFrom.mixingTo = to;
|
||||||
to.interruptAlpha = from.interruptAlpha;
|
to.interruptAlpha = from.interruptAlpha;
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
}
|
}
|
||||||
@ -1400,19 +1403,19 @@ var spine;
|
|||||||
var animationLast = current.animationLast, animationTime = current.getAnimationTime();
|
var animationLast = current.animationLast, animationTime = current.getAnimationTime();
|
||||||
var timelineCount = current.animation.timelines.length;
|
var timelineCount = current.animation.timelines.length;
|
||||||
var timelines = current.animation.timelines;
|
var timelines = current.animation.timelines;
|
||||||
if (mix == 1 || blend == spine.MixBlend.add) {
|
if (i == 0 && (mix == 1 || blend == spine.MixBlend.add)) {
|
||||||
for (var ii = 0; ii < timelineCount; ii++)
|
for (var ii = 0; ii < timelineCount; ii++)
|
||||||
timelines[ii].apply(skeleton, animationLast, animationTime, events, mix, blend, spine.MixDirection["in"]);
|
timelines[ii].apply(skeleton, animationLast, animationTime, events, mix, blend, spine.MixDirection["in"]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var timelineData = current.timelineData;
|
var timelineMode = current.timelineMode;
|
||||||
var firstFrame = current.timelinesRotation.length == 0;
|
var firstFrame = current.timelinesRotation.length == 0;
|
||||||
if (firstFrame)
|
if (firstFrame)
|
||||||
spine.Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null);
|
spine.Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null);
|
||||||
var timelinesRotation = current.timelinesRotation;
|
var timelinesRotation = current.timelinesRotation;
|
||||||
for (var ii = 0; ii < timelineCount; ii++) {
|
for (var ii = 0; ii < timelineCount; ii++) {
|
||||||
var timeline = timelines[ii];
|
var timeline = timelines[ii];
|
||||||
var timelineBlend = timelineData[ii] == AnimationState.SUBSEQUENT ? blend : spine.MixBlend.setup;
|
var timelineBlend = timelineMode[ii] == AnimationState.SUBSEQUENT ? blend : spine.MixBlend.setup;
|
||||||
if (timeline instanceof spine.RotateTimeline) {
|
if (timeline instanceof spine.RotateTimeline) {
|
||||||
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
|
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
|
||||||
}
|
}
|
||||||
@ -1452,14 +1455,14 @@ var spine;
|
|||||||
var animationLast = from.animationLast, animationTime = from.getAnimationTime();
|
var animationLast = from.animationLast, animationTime = from.getAnimationTime();
|
||||||
var timelineCount = from.animation.timelines.length;
|
var timelineCount = from.animation.timelines.length;
|
||||||
var timelines = from.animation.timelines;
|
var timelines = from.animation.timelines;
|
||||||
var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix);
|
var alphaHold = from.alpha * to.interruptAlpha, alphaMix = alphaHold * (1 - mix);
|
||||||
if (blend == spine.MixBlend.add) {
|
if (blend == spine.MixBlend.add) {
|
||||||
for (var i = 0; i < timelineCount; i++)
|
for (var i = 0; i < timelineCount; i++)
|
||||||
timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, spine.MixDirection.out);
|
timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, spine.MixDirection.out);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var timelineData = from.timelineData;
|
var timelineMode = from.timelineMode;
|
||||||
var timelineDipMix = from.timelineDipMix;
|
var timelineHoldMix = from.timelineHoldMix;
|
||||||
var firstFrame = from.timelinesRotation.length == 0;
|
var firstFrame = from.timelinesRotation.length == 0;
|
||||||
if (firstFrame)
|
if (firstFrame)
|
||||||
spine.Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null);
|
spine.Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null);
|
||||||
@ -1469,7 +1472,7 @@ var spine;
|
|||||||
var timeline = timelines[i];
|
var timeline = timelines[i];
|
||||||
var timelineBlend;
|
var timelineBlend;
|
||||||
var alpha = 0;
|
var alpha = 0;
|
||||||
switch (timelineData[i]) {
|
switch (timelineMode[i]) {
|
||||||
case AnimationState.SUBSEQUENT:
|
case AnimationState.SUBSEQUENT:
|
||||||
if (!attachments && timeline instanceof spine.AttachmentTimeline)
|
if (!attachments && timeline instanceof spine.AttachmentTimeline)
|
||||||
continue;
|
continue;
|
||||||
@ -1482,14 +1485,14 @@ var spine;
|
|||||||
timelineBlend = spine.MixBlend.setup;
|
timelineBlend = spine.MixBlend.setup;
|
||||||
alpha = alphaMix;
|
alpha = alphaMix;
|
||||||
break;
|
break;
|
||||||
case AnimationState.DIP:
|
case AnimationState.HOLD:
|
||||||
timelineBlend = spine.MixBlend.setup;
|
timelineBlend = spine.MixBlend.setup;
|
||||||
alpha = alphaDip;
|
alpha = alphaHold;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
timelineBlend = spine.MixBlend.setup;
|
timelineBlend = spine.MixBlend.setup;
|
||||||
var dipMix = timelineDipMix[i];
|
var holdMix = timelineHoldMix[i];
|
||||||
alpha = alphaDip * Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration);
|
alpha = alphaHold * Math.max(0, 1 - holdMix.mixTime / holdMix.mixDuration);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
from.totalAlpha += alpha;
|
from.totalAlpha += alpha;
|
||||||
@ -1619,6 +1622,7 @@ var spine;
|
|||||||
break;
|
break;
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
entry.mixingFrom = null;
|
entry.mixingFrom = null;
|
||||||
|
entry.mixingTo = null;
|
||||||
entry = from;
|
entry = from;
|
||||||
}
|
}
|
||||||
this.tracks[current.trackIndex] = null;
|
this.tracks[current.trackIndex] = null;
|
||||||
@ -1631,6 +1635,7 @@ var spine;
|
|||||||
if (interrupt)
|
if (interrupt)
|
||||||
this.queue.interrupt(from);
|
this.queue.interrupt(from);
|
||||||
current.mixingFrom = from;
|
current.mixingFrom = from;
|
||||||
|
from.mixingTo = current;
|
||||||
current.mixTime = 0;
|
current.mixTime = 0;
|
||||||
if (from.mixingFrom != null && from.mixDuration > 0)
|
if (from.mixingFrom != null && from.mixDuration > 0)
|
||||||
current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration);
|
current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration);
|
||||||
@ -1740,6 +1745,7 @@ var spine;
|
|||||||
entry.trackIndex = trackIndex;
|
entry.trackIndex = trackIndex;
|
||||||
entry.animation = animation;
|
entry.animation = animation;
|
||||||
entry.loop = loop;
|
entry.loop = loop;
|
||||||
|
entry.holdPrevious = false;
|
||||||
entry.eventThreshold = 0;
|
entry.eventThreshold = 0;
|
||||||
entry.attachmentThreshold = 0;
|
entry.attachmentThreshold = 0;
|
||||||
entry.drawOrderThreshold = 0;
|
entry.drawOrderThreshold = 0;
|
||||||
@ -1769,15 +1775,63 @@ var spine;
|
|||||||
};
|
};
|
||||||
AnimationState.prototype._animationsChanged = function () {
|
AnimationState.prototype._animationsChanged = function () {
|
||||||
this.animationsChanged = false;
|
this.animationsChanged = false;
|
||||||
var propertyIDs = this.propertyIDs;
|
this.propertyIDs.clear();
|
||||||
propertyIDs.clear();
|
|
||||||
var mixingTo = this.mixingTo;
|
|
||||||
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
||||||
var entry = this.tracks[i];
|
var entry = this.tracks[i];
|
||||||
if (entry != null && (i == 0 || entry.mixBlend != spine.MixBlend.add))
|
if (entry == null)
|
||||||
entry.setTimelineData(null, mixingTo, propertyIDs);
|
continue;
|
||||||
|
while (entry.mixingFrom != null)
|
||||||
|
entry = entry.mixingFrom;
|
||||||
|
do {
|
||||||
|
if (entry.mixingFrom == null || entry.mixBlend != spine.MixBlend.add)
|
||||||
|
this.setTimelineModes(entry);
|
||||||
|
entry = entry.mixingTo;
|
||||||
|
} while (entry != null);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
AnimationState.prototype.setTimelineModes = function (entry) {
|
||||||
|
var to = entry.mixingTo;
|
||||||
|
var timelines = entry.animation.timelines;
|
||||||
|
var timelinesCount = entry.animation.timelines.length;
|
||||||
|
var timelineMode = spine.Utils.setArraySize(entry.timelineMode, timelinesCount);
|
||||||
|
entry.timelineHoldMix.length = 0;
|
||||||
|
var timelineDipMix = spine.Utils.setArraySize(entry.timelineHoldMix, timelinesCount);
|
||||||
|
var propertyIDs = this.propertyIDs;
|
||||||
|
if (to != null && to.holdPrevious) {
|
||||||
|
for (var i_16 = 0; i_16 < timelinesCount; i_16++) {
|
||||||
|
propertyIDs.add(timelines[i_16].getPropertyId());
|
||||||
|
timelineMode[i_16] = AnimationState.HOLD;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
outer: for (var i = 0; i < timelinesCount; i++) {
|
||||||
|
var id = timelines[i].getPropertyId();
|
||||||
|
if (!propertyIDs.add(id))
|
||||||
|
timelineMode[i] = AnimationState.SUBSEQUENT;
|
||||||
|
else if (to == null || !this.hasTimeline(to, id))
|
||||||
|
timelineMode[i] = AnimationState.FIRST;
|
||||||
|
else {
|
||||||
|
for (var next = to.mixingTo; next != null; next = next.mixingTo) {
|
||||||
|
if (this.hasTimeline(next, id))
|
||||||
|
continue;
|
||||||
|
if (entry.mixDuration > 0) {
|
||||||
|
timelineMode[i] = AnimationState.HOLD_MIX;
|
||||||
|
timelineDipMix[i] = next;
|
||||||
|
continue outer;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
timelineMode[i] = AnimationState.HOLD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
AnimationState.prototype.hasTimeline = function (entry, id) {
|
||||||
|
var timelines = entry.animation.timelines;
|
||||||
|
for (var i = 0, n = timelines.length; i < n; i++)
|
||||||
|
if (timelines[i].getPropertyId() == id)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
};
|
||||||
AnimationState.prototype.getCurrent = function (trackIndex) {
|
AnimationState.prototype.getCurrent = function (trackIndex) {
|
||||||
if (trackIndex >= this.tracks.length)
|
if (trackIndex >= this.tracks.length)
|
||||||
return null;
|
return null;
|
||||||
@ -1802,69 +1856,28 @@ var spine;
|
|||||||
AnimationState.emptyAnimation = new spine.Animation("<empty>", [], 0);
|
AnimationState.emptyAnimation = new spine.Animation("<empty>", [], 0);
|
||||||
AnimationState.SUBSEQUENT = 0;
|
AnimationState.SUBSEQUENT = 0;
|
||||||
AnimationState.FIRST = 1;
|
AnimationState.FIRST = 1;
|
||||||
AnimationState.DIP = 2;
|
AnimationState.HOLD = 2;
|
||||||
AnimationState.DIP_MIX = 3;
|
AnimationState.HOLD_MIX = 3;
|
||||||
return AnimationState;
|
return AnimationState;
|
||||||
}());
|
}());
|
||||||
spine.AnimationState = AnimationState;
|
spine.AnimationState = AnimationState;
|
||||||
var TrackEntry = (function () {
|
var TrackEntry = (function () {
|
||||||
function TrackEntry() {
|
function TrackEntry() {
|
||||||
this.mixBlend = spine.MixBlend.replace;
|
this.mixBlend = spine.MixBlend.replace;
|
||||||
this.timelineData = new Array();
|
this.timelineMode = new Array();
|
||||||
this.timelineDipMix = new Array();
|
this.timelineHoldMix = new Array();
|
||||||
this.timelinesRotation = new Array();
|
this.timelinesRotation = new Array();
|
||||||
}
|
}
|
||||||
TrackEntry.prototype.reset = function () {
|
TrackEntry.prototype.reset = function () {
|
||||||
this.next = null;
|
this.next = null;
|
||||||
this.mixingFrom = null;
|
this.mixingFrom = null;
|
||||||
|
this.mixingTo = null;
|
||||||
this.animation = null;
|
this.animation = null;
|
||||||
this.listener = null;
|
this.listener = null;
|
||||||
this.timelineData.length = 0;
|
this.timelineMode.length = 0;
|
||||||
this.timelineDipMix.length = 0;
|
this.timelineHoldMix.length = 0;
|
||||||
this.timelinesRotation.length = 0;
|
this.timelinesRotation.length = 0;
|
||||||
};
|
};
|
||||||
TrackEntry.prototype.setTimelineData = function (to, mixingToArray, propertyIDs) {
|
|
||||||
if (to != null)
|
|
||||||
mixingToArray.push(to);
|
|
||||||
var lastEntry = this.mixingFrom != null ? this.mixingFrom.setTimelineData(this, mixingToArray, propertyIDs) : this;
|
|
||||||
if (to != null)
|
|
||||||
mixingToArray.pop();
|
|
||||||
var mixingTo = mixingToArray;
|
|
||||||
var mixingToLast = mixingToArray.length - 1;
|
|
||||||
var timelines = this.animation.timelines;
|
|
||||||
var timelinesCount = this.animation.timelines.length;
|
|
||||||
var timelineData = spine.Utils.setArraySize(this.timelineData, timelinesCount);
|
|
||||||
this.timelineDipMix.length = 0;
|
|
||||||
var timelineDipMix = spine.Utils.setArraySize(this.timelineDipMix, timelinesCount);
|
|
||||||
outer: for (var i = 0; i < timelinesCount; i++) {
|
|
||||||
var id = timelines[i].getPropertyId();
|
|
||||||
if (!propertyIDs.add(id))
|
|
||||||
timelineData[i] = AnimationState.SUBSEQUENT;
|
|
||||||
else if (to == null || !to.hasTimeline(id))
|
|
||||||
timelineData[i] = AnimationState.FIRST;
|
|
||||||
else {
|
|
||||||
for (var ii = mixingToLast; ii >= 0; ii--) {
|
|
||||||
var entry = mixingTo[ii];
|
|
||||||
if (!entry.hasTimeline(id)) {
|
|
||||||
if (entry.mixDuration > 0) {
|
|
||||||
timelineData[i] = AnimationState.DIP_MIX;
|
|
||||||
timelineDipMix[i] = entry;
|
|
||||||
continue outer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
timelineData[i] = AnimationState.DIP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return lastEntry;
|
|
||||||
};
|
|
||||||
TrackEntry.prototype.hasTimeline = function (id) {
|
|
||||||
var timelines = this.animation.timelines;
|
|
||||||
for (var i = 0, n = timelines.length; i < n; i++)
|
|
||||||
if (timelines[i].getPropertyId() == id)
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
TrackEntry.prototype.getAnimationTime = function () {
|
TrackEntry.prototype.getAnimationTime = function () {
|
||||||
if (this.loop) {
|
if (this.loop) {
|
||||||
var duration = this.animationEnd - this.animationStart;
|
var duration = this.animationEnd - this.animationStart;
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
15
spine-ts/build/spine-webgl.d.ts
vendored
15
spine-ts/build/spine-webgl.d.ts
vendored
@ -244,15 +244,14 @@ declare module spine {
|
|||||||
static emptyAnimation: Animation;
|
static emptyAnimation: Animation;
|
||||||
static SUBSEQUENT: number;
|
static SUBSEQUENT: number;
|
||||||
static FIRST: number;
|
static FIRST: number;
|
||||||
static DIP: number;
|
static HOLD: number;
|
||||||
static DIP_MIX: number;
|
static HOLD_MIX: number;
|
||||||
data: AnimationStateData;
|
data: AnimationStateData;
|
||||||
tracks: TrackEntry[];
|
tracks: TrackEntry[];
|
||||||
events: Event[];
|
events: Event[];
|
||||||
listeners: AnimationStateListener2[];
|
listeners: AnimationStateListener2[];
|
||||||
queue: EventQueue;
|
queue: EventQueue;
|
||||||
propertyIDs: IntSet;
|
propertyIDs: IntSet;
|
||||||
mixingTo: TrackEntry[];
|
|
||||||
animationsChanged: boolean;
|
animationsChanged: boolean;
|
||||||
timeScale: number;
|
timeScale: number;
|
||||||
trackEntryPool: Pool<TrackEntry>;
|
trackEntryPool: Pool<TrackEntry>;
|
||||||
@ -277,6 +276,8 @@ declare module spine {
|
|||||||
trackEntry(trackIndex: number, animation: Animation, loop: boolean, last: TrackEntry): TrackEntry;
|
trackEntry(trackIndex: number, animation: Animation, loop: boolean, last: TrackEntry): TrackEntry;
|
||||||
disposeNext(entry: TrackEntry): void;
|
disposeNext(entry: TrackEntry): void;
|
||||||
_animationsChanged(): void;
|
_animationsChanged(): void;
|
||||||
|
setTimelineModes(entry: TrackEntry): void;
|
||||||
|
hasTimeline(entry: TrackEntry, id: number): boolean;
|
||||||
getCurrent(trackIndex: number): TrackEntry;
|
getCurrent(trackIndex: number): TrackEntry;
|
||||||
addListener(listener: AnimationStateListener2): void;
|
addListener(listener: AnimationStateListener2): void;
|
||||||
removeListener(listener: AnimationStateListener2): void;
|
removeListener(listener: AnimationStateListener2): void;
|
||||||
@ -287,9 +288,11 @@ declare module spine {
|
|||||||
animation: Animation;
|
animation: Animation;
|
||||||
next: TrackEntry;
|
next: TrackEntry;
|
||||||
mixingFrom: TrackEntry;
|
mixingFrom: TrackEntry;
|
||||||
|
mixingTo: TrackEntry;
|
||||||
listener: AnimationStateListener2;
|
listener: AnimationStateListener2;
|
||||||
trackIndex: number;
|
trackIndex: number;
|
||||||
loop: boolean;
|
loop: boolean;
|
||||||
|
holdPrevious: boolean;
|
||||||
eventThreshold: number;
|
eventThreshold: number;
|
||||||
attachmentThreshold: number;
|
attachmentThreshold: number;
|
||||||
drawOrderThreshold: number;
|
drawOrderThreshold: number;
|
||||||
@ -309,12 +312,10 @@ declare module spine {
|
|||||||
interruptAlpha: number;
|
interruptAlpha: number;
|
||||||
totalAlpha: number;
|
totalAlpha: number;
|
||||||
mixBlend: MixBlend;
|
mixBlend: MixBlend;
|
||||||
timelineData: number[];
|
timelineMode: number[];
|
||||||
timelineDipMix: TrackEntry[];
|
timelineHoldMix: TrackEntry[];
|
||||||
timelinesRotation: number[];
|
timelinesRotation: number[];
|
||||||
reset(): void;
|
reset(): void;
|
||||||
setTimelineData(to: TrackEntry, mixingToArray: Array<TrackEntry>, propertyIDs: IntSet): TrackEntry;
|
|
||||||
hasTimeline(id: number): boolean;
|
|
||||||
getAnimationTime(): number;
|
getAnimationTime(): number;
|
||||||
setAnimationLast(animationLast: number): void;
|
setAnimationLast(animationLast: number): void;
|
||||||
isComplete(): boolean;
|
isComplete(): boolean;
|
||||||
|
|||||||
@ -1303,7 +1303,6 @@ var spine;
|
|||||||
this.listeners = new Array();
|
this.listeners = new Array();
|
||||||
this.queue = new EventQueue(this);
|
this.queue = new EventQueue(this);
|
||||||
this.propertyIDs = new spine.IntSet();
|
this.propertyIDs = new spine.IntSet();
|
||||||
this.mixingTo = new Array();
|
|
||||||
this.animationsChanged = false;
|
this.animationsChanged = false;
|
||||||
this.timeScale = 1;
|
this.timeScale = 1;
|
||||||
this.trackEntryPool = new spine.Pool(function () { return new TrackEntry(); });
|
this.trackEntryPool = new spine.Pool(function () { return new TrackEntry(); });
|
||||||
@ -1350,6 +1349,8 @@ var spine;
|
|||||||
if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
|
if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
|
||||||
var from = current.mixingFrom;
|
var from = current.mixingFrom;
|
||||||
current.mixingFrom = null;
|
current.mixingFrom = null;
|
||||||
|
if (from != null)
|
||||||
|
from.mixingTo = null;
|
||||||
while (from != null) {
|
while (from != null) {
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
from = from.mixingFrom;
|
from = from.mixingFrom;
|
||||||
@ -1369,6 +1370,8 @@ var spine;
|
|||||||
if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
|
if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
|
||||||
if (from.totalAlpha == 0 || to.mixDuration == 0) {
|
if (from.totalAlpha == 0 || to.mixDuration == 0) {
|
||||||
to.mixingFrom = from.mixingFrom;
|
to.mixingFrom = from.mixingFrom;
|
||||||
|
if (from.mixingFrom != null)
|
||||||
|
from.mixingFrom.mixingTo = to;
|
||||||
to.interruptAlpha = from.interruptAlpha;
|
to.interruptAlpha = from.interruptAlpha;
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
}
|
}
|
||||||
@ -1400,19 +1403,19 @@ var spine;
|
|||||||
var animationLast = current.animationLast, animationTime = current.getAnimationTime();
|
var animationLast = current.animationLast, animationTime = current.getAnimationTime();
|
||||||
var timelineCount = current.animation.timelines.length;
|
var timelineCount = current.animation.timelines.length;
|
||||||
var timelines = current.animation.timelines;
|
var timelines = current.animation.timelines;
|
||||||
if (mix == 1 || blend == spine.MixBlend.add) {
|
if (i == 0 && (mix == 1 || blend == spine.MixBlend.add)) {
|
||||||
for (var ii = 0; ii < timelineCount; ii++)
|
for (var ii = 0; ii < timelineCount; ii++)
|
||||||
timelines[ii].apply(skeleton, animationLast, animationTime, events, mix, blend, spine.MixDirection["in"]);
|
timelines[ii].apply(skeleton, animationLast, animationTime, events, mix, blend, spine.MixDirection["in"]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var timelineData = current.timelineData;
|
var timelineMode = current.timelineMode;
|
||||||
var firstFrame = current.timelinesRotation.length == 0;
|
var firstFrame = current.timelinesRotation.length == 0;
|
||||||
if (firstFrame)
|
if (firstFrame)
|
||||||
spine.Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null);
|
spine.Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null);
|
||||||
var timelinesRotation = current.timelinesRotation;
|
var timelinesRotation = current.timelinesRotation;
|
||||||
for (var ii = 0; ii < timelineCount; ii++) {
|
for (var ii = 0; ii < timelineCount; ii++) {
|
||||||
var timeline = timelines[ii];
|
var timeline = timelines[ii];
|
||||||
var timelineBlend = timelineData[ii] == AnimationState.SUBSEQUENT ? blend : spine.MixBlend.setup;
|
var timelineBlend = timelineMode[ii] == AnimationState.SUBSEQUENT ? blend : spine.MixBlend.setup;
|
||||||
if (timeline instanceof spine.RotateTimeline) {
|
if (timeline instanceof spine.RotateTimeline) {
|
||||||
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
|
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
|
||||||
}
|
}
|
||||||
@ -1452,14 +1455,14 @@ var spine;
|
|||||||
var animationLast = from.animationLast, animationTime = from.getAnimationTime();
|
var animationLast = from.animationLast, animationTime = from.getAnimationTime();
|
||||||
var timelineCount = from.animation.timelines.length;
|
var timelineCount = from.animation.timelines.length;
|
||||||
var timelines = from.animation.timelines;
|
var timelines = from.animation.timelines;
|
||||||
var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix);
|
var alphaHold = from.alpha * to.interruptAlpha, alphaMix = alphaHold * (1 - mix);
|
||||||
if (blend == spine.MixBlend.add) {
|
if (blend == spine.MixBlend.add) {
|
||||||
for (var i = 0; i < timelineCount; i++)
|
for (var i = 0; i < timelineCount; i++)
|
||||||
timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, spine.MixDirection.out);
|
timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, spine.MixDirection.out);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var timelineData = from.timelineData;
|
var timelineMode = from.timelineMode;
|
||||||
var timelineDipMix = from.timelineDipMix;
|
var timelineHoldMix = from.timelineHoldMix;
|
||||||
var firstFrame = from.timelinesRotation.length == 0;
|
var firstFrame = from.timelinesRotation.length == 0;
|
||||||
if (firstFrame)
|
if (firstFrame)
|
||||||
spine.Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null);
|
spine.Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null);
|
||||||
@ -1469,7 +1472,7 @@ var spine;
|
|||||||
var timeline = timelines[i];
|
var timeline = timelines[i];
|
||||||
var timelineBlend;
|
var timelineBlend;
|
||||||
var alpha = 0;
|
var alpha = 0;
|
||||||
switch (timelineData[i]) {
|
switch (timelineMode[i]) {
|
||||||
case AnimationState.SUBSEQUENT:
|
case AnimationState.SUBSEQUENT:
|
||||||
if (!attachments && timeline instanceof spine.AttachmentTimeline)
|
if (!attachments && timeline instanceof spine.AttachmentTimeline)
|
||||||
continue;
|
continue;
|
||||||
@ -1482,14 +1485,14 @@ var spine;
|
|||||||
timelineBlend = spine.MixBlend.setup;
|
timelineBlend = spine.MixBlend.setup;
|
||||||
alpha = alphaMix;
|
alpha = alphaMix;
|
||||||
break;
|
break;
|
||||||
case AnimationState.DIP:
|
case AnimationState.HOLD:
|
||||||
timelineBlend = spine.MixBlend.setup;
|
timelineBlend = spine.MixBlend.setup;
|
||||||
alpha = alphaDip;
|
alpha = alphaHold;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
timelineBlend = spine.MixBlend.setup;
|
timelineBlend = spine.MixBlend.setup;
|
||||||
var dipMix = timelineDipMix[i];
|
var holdMix = timelineHoldMix[i];
|
||||||
alpha = alphaDip * Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration);
|
alpha = alphaHold * Math.max(0, 1 - holdMix.mixTime / holdMix.mixDuration);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
from.totalAlpha += alpha;
|
from.totalAlpha += alpha;
|
||||||
@ -1619,6 +1622,7 @@ var spine;
|
|||||||
break;
|
break;
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
entry.mixingFrom = null;
|
entry.mixingFrom = null;
|
||||||
|
entry.mixingTo = null;
|
||||||
entry = from;
|
entry = from;
|
||||||
}
|
}
|
||||||
this.tracks[current.trackIndex] = null;
|
this.tracks[current.trackIndex] = null;
|
||||||
@ -1631,6 +1635,7 @@ var spine;
|
|||||||
if (interrupt)
|
if (interrupt)
|
||||||
this.queue.interrupt(from);
|
this.queue.interrupt(from);
|
||||||
current.mixingFrom = from;
|
current.mixingFrom = from;
|
||||||
|
from.mixingTo = current;
|
||||||
current.mixTime = 0;
|
current.mixTime = 0;
|
||||||
if (from.mixingFrom != null && from.mixDuration > 0)
|
if (from.mixingFrom != null && from.mixDuration > 0)
|
||||||
current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration);
|
current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration);
|
||||||
@ -1740,6 +1745,7 @@ var spine;
|
|||||||
entry.trackIndex = trackIndex;
|
entry.trackIndex = trackIndex;
|
||||||
entry.animation = animation;
|
entry.animation = animation;
|
||||||
entry.loop = loop;
|
entry.loop = loop;
|
||||||
|
entry.holdPrevious = false;
|
||||||
entry.eventThreshold = 0;
|
entry.eventThreshold = 0;
|
||||||
entry.attachmentThreshold = 0;
|
entry.attachmentThreshold = 0;
|
||||||
entry.drawOrderThreshold = 0;
|
entry.drawOrderThreshold = 0;
|
||||||
@ -1769,15 +1775,63 @@ var spine;
|
|||||||
};
|
};
|
||||||
AnimationState.prototype._animationsChanged = function () {
|
AnimationState.prototype._animationsChanged = function () {
|
||||||
this.animationsChanged = false;
|
this.animationsChanged = false;
|
||||||
var propertyIDs = this.propertyIDs;
|
this.propertyIDs.clear();
|
||||||
propertyIDs.clear();
|
|
||||||
var mixingTo = this.mixingTo;
|
|
||||||
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
||||||
var entry = this.tracks[i];
|
var entry = this.tracks[i];
|
||||||
if (entry != null && (i == 0 || entry.mixBlend != spine.MixBlend.add))
|
if (entry == null)
|
||||||
entry.setTimelineData(null, mixingTo, propertyIDs);
|
continue;
|
||||||
|
while (entry.mixingFrom != null)
|
||||||
|
entry = entry.mixingFrom;
|
||||||
|
do {
|
||||||
|
if (entry.mixingFrom == null || entry.mixBlend != spine.MixBlend.add)
|
||||||
|
this.setTimelineModes(entry);
|
||||||
|
entry = entry.mixingTo;
|
||||||
|
} while (entry != null);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
AnimationState.prototype.setTimelineModes = function (entry) {
|
||||||
|
var to = entry.mixingTo;
|
||||||
|
var timelines = entry.animation.timelines;
|
||||||
|
var timelinesCount = entry.animation.timelines.length;
|
||||||
|
var timelineMode = spine.Utils.setArraySize(entry.timelineMode, timelinesCount);
|
||||||
|
entry.timelineHoldMix.length = 0;
|
||||||
|
var timelineDipMix = spine.Utils.setArraySize(entry.timelineHoldMix, timelinesCount);
|
||||||
|
var propertyIDs = this.propertyIDs;
|
||||||
|
if (to != null && to.holdPrevious) {
|
||||||
|
for (var i_16 = 0; i_16 < timelinesCount; i_16++) {
|
||||||
|
propertyIDs.add(timelines[i_16].getPropertyId());
|
||||||
|
timelineMode[i_16] = AnimationState.HOLD;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
outer: for (var i = 0; i < timelinesCount; i++) {
|
||||||
|
var id = timelines[i].getPropertyId();
|
||||||
|
if (!propertyIDs.add(id))
|
||||||
|
timelineMode[i] = AnimationState.SUBSEQUENT;
|
||||||
|
else if (to == null || !this.hasTimeline(to, id))
|
||||||
|
timelineMode[i] = AnimationState.FIRST;
|
||||||
|
else {
|
||||||
|
for (var next = to.mixingTo; next != null; next = next.mixingTo) {
|
||||||
|
if (this.hasTimeline(next, id))
|
||||||
|
continue;
|
||||||
|
if (entry.mixDuration > 0) {
|
||||||
|
timelineMode[i] = AnimationState.HOLD_MIX;
|
||||||
|
timelineDipMix[i] = next;
|
||||||
|
continue outer;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
timelineMode[i] = AnimationState.HOLD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
AnimationState.prototype.hasTimeline = function (entry, id) {
|
||||||
|
var timelines = entry.animation.timelines;
|
||||||
|
for (var i = 0, n = timelines.length; i < n; i++)
|
||||||
|
if (timelines[i].getPropertyId() == id)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
};
|
||||||
AnimationState.prototype.getCurrent = function (trackIndex) {
|
AnimationState.prototype.getCurrent = function (trackIndex) {
|
||||||
if (trackIndex >= this.tracks.length)
|
if (trackIndex >= this.tracks.length)
|
||||||
return null;
|
return null;
|
||||||
@ -1802,69 +1856,28 @@ var spine;
|
|||||||
AnimationState.emptyAnimation = new spine.Animation("<empty>", [], 0);
|
AnimationState.emptyAnimation = new spine.Animation("<empty>", [], 0);
|
||||||
AnimationState.SUBSEQUENT = 0;
|
AnimationState.SUBSEQUENT = 0;
|
||||||
AnimationState.FIRST = 1;
|
AnimationState.FIRST = 1;
|
||||||
AnimationState.DIP = 2;
|
AnimationState.HOLD = 2;
|
||||||
AnimationState.DIP_MIX = 3;
|
AnimationState.HOLD_MIX = 3;
|
||||||
return AnimationState;
|
return AnimationState;
|
||||||
}());
|
}());
|
||||||
spine.AnimationState = AnimationState;
|
spine.AnimationState = AnimationState;
|
||||||
var TrackEntry = (function () {
|
var TrackEntry = (function () {
|
||||||
function TrackEntry() {
|
function TrackEntry() {
|
||||||
this.mixBlend = spine.MixBlend.replace;
|
this.mixBlend = spine.MixBlend.replace;
|
||||||
this.timelineData = new Array();
|
this.timelineMode = new Array();
|
||||||
this.timelineDipMix = new Array();
|
this.timelineHoldMix = new Array();
|
||||||
this.timelinesRotation = new Array();
|
this.timelinesRotation = new Array();
|
||||||
}
|
}
|
||||||
TrackEntry.prototype.reset = function () {
|
TrackEntry.prototype.reset = function () {
|
||||||
this.next = null;
|
this.next = null;
|
||||||
this.mixingFrom = null;
|
this.mixingFrom = null;
|
||||||
|
this.mixingTo = null;
|
||||||
this.animation = null;
|
this.animation = null;
|
||||||
this.listener = null;
|
this.listener = null;
|
||||||
this.timelineData.length = 0;
|
this.timelineMode.length = 0;
|
||||||
this.timelineDipMix.length = 0;
|
this.timelineHoldMix.length = 0;
|
||||||
this.timelinesRotation.length = 0;
|
this.timelinesRotation.length = 0;
|
||||||
};
|
};
|
||||||
TrackEntry.prototype.setTimelineData = function (to, mixingToArray, propertyIDs) {
|
|
||||||
if (to != null)
|
|
||||||
mixingToArray.push(to);
|
|
||||||
var lastEntry = this.mixingFrom != null ? this.mixingFrom.setTimelineData(this, mixingToArray, propertyIDs) : this;
|
|
||||||
if (to != null)
|
|
||||||
mixingToArray.pop();
|
|
||||||
var mixingTo = mixingToArray;
|
|
||||||
var mixingToLast = mixingToArray.length - 1;
|
|
||||||
var timelines = this.animation.timelines;
|
|
||||||
var timelinesCount = this.animation.timelines.length;
|
|
||||||
var timelineData = spine.Utils.setArraySize(this.timelineData, timelinesCount);
|
|
||||||
this.timelineDipMix.length = 0;
|
|
||||||
var timelineDipMix = spine.Utils.setArraySize(this.timelineDipMix, timelinesCount);
|
|
||||||
outer: for (var i = 0; i < timelinesCount; i++) {
|
|
||||||
var id = timelines[i].getPropertyId();
|
|
||||||
if (!propertyIDs.add(id))
|
|
||||||
timelineData[i] = AnimationState.SUBSEQUENT;
|
|
||||||
else if (to == null || !to.hasTimeline(id))
|
|
||||||
timelineData[i] = AnimationState.FIRST;
|
|
||||||
else {
|
|
||||||
for (var ii = mixingToLast; ii >= 0; ii--) {
|
|
||||||
var entry = mixingTo[ii];
|
|
||||||
if (!entry.hasTimeline(id)) {
|
|
||||||
if (entry.mixDuration > 0) {
|
|
||||||
timelineData[i] = AnimationState.DIP_MIX;
|
|
||||||
timelineDipMix[i] = entry;
|
|
||||||
continue outer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
timelineData[i] = AnimationState.DIP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return lastEntry;
|
|
||||||
};
|
|
||||||
TrackEntry.prototype.hasTimeline = function (id) {
|
|
||||||
var timelines = this.animation.timelines;
|
|
||||||
for (var i = 0, n = timelines.length; i < n; i++)
|
|
||||||
if (timelines[i].getPropertyId() == id)
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
TrackEntry.prototype.getAnimationTime = function () {
|
TrackEntry.prototype.getAnimationTime = function () {
|
||||||
if (this.loop) {
|
if (this.loop) {
|
||||||
var duration = this.animationEnd - this.animationStart;
|
var duration = this.animationEnd - this.animationStart;
|
||||||
@ -7000,8 +7013,8 @@ var spine;
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
var listeners = _this.listeners;
|
var listeners = _this.listeners;
|
||||||
for (var i_16 = 0; i_16 < listeners.length; i_16++) {
|
for (var i_17 = 0; i_17 < listeners.length; i_17++) {
|
||||||
listeners[i_16].down(_this.currTouch.x, _this.currTouch.y);
|
listeners[i_17].down(_this.currTouch.x, _this.currTouch.y);
|
||||||
}
|
}
|
||||||
console.log("Start " + _this.currTouch.x + ", " + _this.currTouch.y);
|
console.log("Start " + _this.currTouch.x + ", " + _this.currTouch.y);
|
||||||
_this.lastX = _this.currTouch.x;
|
_this.lastX = _this.currTouch.x;
|
||||||
@ -7010,29 +7023,6 @@ var spine;
|
|||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
}, false);
|
}, false);
|
||||||
element.addEventListener("touchend", function (ev) {
|
element.addEventListener("touchend", function (ev) {
|
||||||
var touches = ev.changedTouches;
|
|
||||||
for (var i = 0; i < touches.length; i++) {
|
|
||||||
var touch = touches[i];
|
|
||||||
if (_this.currTouch.identifier === touch.identifier) {
|
|
||||||
var rect = element.getBoundingClientRect();
|
|
||||||
var x = _this.currTouch.x = touch.clientX - rect.left;
|
|
||||||
var y = _this.currTouch.y = touch.clientY - rect.top;
|
|
||||||
_this.touchesPool.free(_this.currTouch);
|
|
||||||
var listeners = _this.listeners;
|
|
||||||
for (var i_17 = 0; i_17 < listeners.length; i_17++) {
|
|
||||||
listeners[i_17].up(x, y);
|
|
||||||
}
|
|
||||||
console.log("End " + x + ", " + y);
|
|
||||||
_this.lastX = x;
|
|
||||||
_this.lastY = y;
|
|
||||||
_this.buttonDown = false;
|
|
||||||
_this.currTouch = null;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ev.preventDefault();
|
|
||||||
}, false);
|
|
||||||
element.addEventListener("touchcancel", function (ev) {
|
|
||||||
var touches = ev.changedTouches;
|
var touches = ev.changedTouches;
|
||||||
for (var i = 0; i < touches.length; i++) {
|
for (var i = 0; i < touches.length; i++) {
|
||||||
var touch = touches[i];
|
var touch = touches[i];
|
||||||
@ -7055,6 +7045,29 @@ var spine;
|
|||||||
}
|
}
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
}, false);
|
}, false);
|
||||||
|
element.addEventListener("touchcancel", function (ev) {
|
||||||
|
var touches = ev.changedTouches;
|
||||||
|
for (var i = 0; i < touches.length; i++) {
|
||||||
|
var touch = touches[i];
|
||||||
|
if (_this.currTouch.identifier === touch.identifier) {
|
||||||
|
var rect = element.getBoundingClientRect();
|
||||||
|
var x = _this.currTouch.x = touch.clientX - rect.left;
|
||||||
|
var y = _this.currTouch.y = touch.clientY - rect.top;
|
||||||
|
_this.touchesPool.free(_this.currTouch);
|
||||||
|
var listeners = _this.listeners;
|
||||||
|
for (var i_19 = 0; i_19 < listeners.length; i_19++) {
|
||||||
|
listeners[i_19].up(x, y);
|
||||||
|
}
|
||||||
|
console.log("End " + x + ", " + y);
|
||||||
|
_this.lastX = x;
|
||||||
|
_this.lastY = y;
|
||||||
|
_this.buttonDown = false;
|
||||||
|
_this.currTouch = null;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ev.preventDefault();
|
||||||
|
}, false);
|
||||||
element.addEventListener("touchmove", function (ev) {
|
element.addEventListener("touchmove", function (ev) {
|
||||||
if (_this.currTouch == null)
|
if (_this.currTouch == null)
|
||||||
return;
|
return;
|
||||||
@ -7066,8 +7079,8 @@ var spine;
|
|||||||
var x = touch.clientX - rect.left;
|
var x = touch.clientX - rect.left;
|
||||||
var y = touch.clientY - rect.top;
|
var y = touch.clientY - rect.top;
|
||||||
var listeners = _this.listeners;
|
var listeners = _this.listeners;
|
||||||
for (var i_19 = 0; i_19 < listeners.length; i_19++) {
|
for (var i_20 = 0; i_20 < listeners.length; i_20++) {
|
||||||
listeners[i_19].dragged(x, y);
|
listeners[i_20].dragged(x, y);
|
||||||
}
|
}
|
||||||
console.log("Drag " + x + ", " + y);
|
console.log("Drag " + x + ", " + y);
|
||||||
_this.lastX = _this.currTouch.x = x;
|
_this.lastX = _this.currTouch.x = x;
|
||||||
@ -8917,11 +8930,11 @@ var spine;
|
|||||||
var nn = clip.worldVerticesLength;
|
var nn = clip.worldVerticesLength;
|
||||||
var world = this.temp = spine.Utils.setArraySize(this.temp, nn, 0);
|
var world = this.temp = spine.Utils.setArraySize(this.temp, nn, 0);
|
||||||
clip.computeWorldVertices(slot, 0, nn, world, 0, 2);
|
clip.computeWorldVertices(slot, 0, nn, world, 0, 2);
|
||||||
for (var i_20 = 0, n_2 = world.length; i_20 < n_2; i_20 += 2) {
|
for (var i_21 = 0, n_2 = world.length; i_21 < n_2; i_21 += 2) {
|
||||||
var x = world[i_20];
|
var x = world[i_21];
|
||||||
var y = world[i_20 + 1];
|
var y = world[i_21 + 1];
|
||||||
var x2 = world[(i_20 + 2) % world.length];
|
var x2 = world[(i_21 + 2) % world.length];
|
||||||
var y2 = world[(i_20 + 3) % world.length];
|
var y2 = world[(i_21 + 3) % world.length];
|
||||||
shapes.line(x, y, x2, y2);
|
shapes.line(x, y, x2, y2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
15
spine-ts/build/spine-widget.d.ts
vendored
15
spine-ts/build/spine-widget.d.ts
vendored
@ -244,15 +244,14 @@ declare module spine {
|
|||||||
static emptyAnimation: Animation;
|
static emptyAnimation: Animation;
|
||||||
static SUBSEQUENT: number;
|
static SUBSEQUENT: number;
|
||||||
static FIRST: number;
|
static FIRST: number;
|
||||||
static DIP: number;
|
static HOLD: number;
|
||||||
static DIP_MIX: number;
|
static HOLD_MIX: number;
|
||||||
data: AnimationStateData;
|
data: AnimationStateData;
|
||||||
tracks: TrackEntry[];
|
tracks: TrackEntry[];
|
||||||
events: Event[];
|
events: Event[];
|
||||||
listeners: AnimationStateListener2[];
|
listeners: AnimationStateListener2[];
|
||||||
queue: EventQueue;
|
queue: EventQueue;
|
||||||
propertyIDs: IntSet;
|
propertyIDs: IntSet;
|
||||||
mixingTo: TrackEntry[];
|
|
||||||
animationsChanged: boolean;
|
animationsChanged: boolean;
|
||||||
timeScale: number;
|
timeScale: number;
|
||||||
trackEntryPool: Pool<TrackEntry>;
|
trackEntryPool: Pool<TrackEntry>;
|
||||||
@ -277,6 +276,8 @@ declare module spine {
|
|||||||
trackEntry(trackIndex: number, animation: Animation, loop: boolean, last: TrackEntry): TrackEntry;
|
trackEntry(trackIndex: number, animation: Animation, loop: boolean, last: TrackEntry): TrackEntry;
|
||||||
disposeNext(entry: TrackEntry): void;
|
disposeNext(entry: TrackEntry): void;
|
||||||
_animationsChanged(): void;
|
_animationsChanged(): void;
|
||||||
|
setTimelineModes(entry: TrackEntry): void;
|
||||||
|
hasTimeline(entry: TrackEntry, id: number): boolean;
|
||||||
getCurrent(trackIndex: number): TrackEntry;
|
getCurrent(trackIndex: number): TrackEntry;
|
||||||
addListener(listener: AnimationStateListener2): void;
|
addListener(listener: AnimationStateListener2): void;
|
||||||
removeListener(listener: AnimationStateListener2): void;
|
removeListener(listener: AnimationStateListener2): void;
|
||||||
@ -287,9 +288,11 @@ declare module spine {
|
|||||||
animation: Animation;
|
animation: Animation;
|
||||||
next: TrackEntry;
|
next: TrackEntry;
|
||||||
mixingFrom: TrackEntry;
|
mixingFrom: TrackEntry;
|
||||||
|
mixingTo: TrackEntry;
|
||||||
listener: AnimationStateListener2;
|
listener: AnimationStateListener2;
|
||||||
trackIndex: number;
|
trackIndex: number;
|
||||||
loop: boolean;
|
loop: boolean;
|
||||||
|
holdPrevious: boolean;
|
||||||
eventThreshold: number;
|
eventThreshold: number;
|
||||||
attachmentThreshold: number;
|
attachmentThreshold: number;
|
||||||
drawOrderThreshold: number;
|
drawOrderThreshold: number;
|
||||||
@ -309,12 +312,10 @@ declare module spine {
|
|||||||
interruptAlpha: number;
|
interruptAlpha: number;
|
||||||
totalAlpha: number;
|
totalAlpha: number;
|
||||||
mixBlend: MixBlend;
|
mixBlend: MixBlend;
|
||||||
timelineData: number[];
|
timelineMode: number[];
|
||||||
timelineDipMix: TrackEntry[];
|
timelineHoldMix: TrackEntry[];
|
||||||
timelinesRotation: number[];
|
timelinesRotation: number[];
|
||||||
reset(): void;
|
reset(): void;
|
||||||
setTimelineData(to: TrackEntry, mixingToArray: Array<TrackEntry>, propertyIDs: IntSet): TrackEntry;
|
|
||||||
hasTimeline(id: number): boolean;
|
|
||||||
getAnimationTime(): number;
|
getAnimationTime(): number;
|
||||||
setAnimationLast(animationLast: number): void;
|
setAnimationLast(animationLast: number): void;
|
||||||
isComplete(): boolean;
|
isComplete(): boolean;
|
||||||
|
|||||||
@ -1303,7 +1303,6 @@ var spine;
|
|||||||
this.listeners = new Array();
|
this.listeners = new Array();
|
||||||
this.queue = new EventQueue(this);
|
this.queue = new EventQueue(this);
|
||||||
this.propertyIDs = new spine.IntSet();
|
this.propertyIDs = new spine.IntSet();
|
||||||
this.mixingTo = new Array();
|
|
||||||
this.animationsChanged = false;
|
this.animationsChanged = false;
|
||||||
this.timeScale = 1;
|
this.timeScale = 1;
|
||||||
this.trackEntryPool = new spine.Pool(function () { return new TrackEntry(); });
|
this.trackEntryPool = new spine.Pool(function () { return new TrackEntry(); });
|
||||||
@ -1350,6 +1349,8 @@ var spine;
|
|||||||
if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
|
if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
|
||||||
var from = current.mixingFrom;
|
var from = current.mixingFrom;
|
||||||
current.mixingFrom = null;
|
current.mixingFrom = null;
|
||||||
|
if (from != null)
|
||||||
|
from.mixingTo = null;
|
||||||
while (from != null) {
|
while (from != null) {
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
from = from.mixingFrom;
|
from = from.mixingFrom;
|
||||||
@ -1369,6 +1370,8 @@ var spine;
|
|||||||
if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
|
if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
|
||||||
if (from.totalAlpha == 0 || to.mixDuration == 0) {
|
if (from.totalAlpha == 0 || to.mixDuration == 0) {
|
||||||
to.mixingFrom = from.mixingFrom;
|
to.mixingFrom = from.mixingFrom;
|
||||||
|
if (from.mixingFrom != null)
|
||||||
|
from.mixingFrom.mixingTo = to;
|
||||||
to.interruptAlpha = from.interruptAlpha;
|
to.interruptAlpha = from.interruptAlpha;
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
}
|
}
|
||||||
@ -1400,19 +1403,19 @@ var spine;
|
|||||||
var animationLast = current.animationLast, animationTime = current.getAnimationTime();
|
var animationLast = current.animationLast, animationTime = current.getAnimationTime();
|
||||||
var timelineCount = current.animation.timelines.length;
|
var timelineCount = current.animation.timelines.length;
|
||||||
var timelines = current.animation.timelines;
|
var timelines = current.animation.timelines;
|
||||||
if (mix == 1 || blend == spine.MixBlend.add) {
|
if (i == 0 && (mix == 1 || blend == spine.MixBlend.add)) {
|
||||||
for (var ii = 0; ii < timelineCount; ii++)
|
for (var ii = 0; ii < timelineCount; ii++)
|
||||||
timelines[ii].apply(skeleton, animationLast, animationTime, events, mix, blend, spine.MixDirection["in"]);
|
timelines[ii].apply(skeleton, animationLast, animationTime, events, mix, blend, spine.MixDirection["in"]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var timelineData = current.timelineData;
|
var timelineMode = current.timelineMode;
|
||||||
var firstFrame = current.timelinesRotation.length == 0;
|
var firstFrame = current.timelinesRotation.length == 0;
|
||||||
if (firstFrame)
|
if (firstFrame)
|
||||||
spine.Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null);
|
spine.Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null);
|
||||||
var timelinesRotation = current.timelinesRotation;
|
var timelinesRotation = current.timelinesRotation;
|
||||||
for (var ii = 0; ii < timelineCount; ii++) {
|
for (var ii = 0; ii < timelineCount; ii++) {
|
||||||
var timeline = timelines[ii];
|
var timeline = timelines[ii];
|
||||||
var timelineBlend = timelineData[ii] == AnimationState.SUBSEQUENT ? blend : spine.MixBlend.setup;
|
var timelineBlend = timelineMode[ii] == AnimationState.SUBSEQUENT ? blend : spine.MixBlend.setup;
|
||||||
if (timeline instanceof spine.RotateTimeline) {
|
if (timeline instanceof spine.RotateTimeline) {
|
||||||
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
|
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
|
||||||
}
|
}
|
||||||
@ -1452,14 +1455,14 @@ var spine;
|
|||||||
var animationLast = from.animationLast, animationTime = from.getAnimationTime();
|
var animationLast = from.animationLast, animationTime = from.getAnimationTime();
|
||||||
var timelineCount = from.animation.timelines.length;
|
var timelineCount = from.animation.timelines.length;
|
||||||
var timelines = from.animation.timelines;
|
var timelines = from.animation.timelines;
|
||||||
var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix);
|
var alphaHold = from.alpha * to.interruptAlpha, alphaMix = alphaHold * (1 - mix);
|
||||||
if (blend == spine.MixBlend.add) {
|
if (blend == spine.MixBlend.add) {
|
||||||
for (var i = 0; i < timelineCount; i++)
|
for (var i = 0; i < timelineCount; i++)
|
||||||
timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, spine.MixDirection.out);
|
timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, spine.MixDirection.out);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var timelineData = from.timelineData;
|
var timelineMode = from.timelineMode;
|
||||||
var timelineDipMix = from.timelineDipMix;
|
var timelineHoldMix = from.timelineHoldMix;
|
||||||
var firstFrame = from.timelinesRotation.length == 0;
|
var firstFrame = from.timelinesRotation.length == 0;
|
||||||
if (firstFrame)
|
if (firstFrame)
|
||||||
spine.Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null);
|
spine.Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null);
|
||||||
@ -1469,7 +1472,7 @@ var spine;
|
|||||||
var timeline = timelines[i];
|
var timeline = timelines[i];
|
||||||
var timelineBlend;
|
var timelineBlend;
|
||||||
var alpha = 0;
|
var alpha = 0;
|
||||||
switch (timelineData[i]) {
|
switch (timelineMode[i]) {
|
||||||
case AnimationState.SUBSEQUENT:
|
case AnimationState.SUBSEQUENT:
|
||||||
if (!attachments && timeline instanceof spine.AttachmentTimeline)
|
if (!attachments && timeline instanceof spine.AttachmentTimeline)
|
||||||
continue;
|
continue;
|
||||||
@ -1482,14 +1485,14 @@ var spine;
|
|||||||
timelineBlend = spine.MixBlend.setup;
|
timelineBlend = spine.MixBlend.setup;
|
||||||
alpha = alphaMix;
|
alpha = alphaMix;
|
||||||
break;
|
break;
|
||||||
case AnimationState.DIP:
|
case AnimationState.HOLD:
|
||||||
timelineBlend = spine.MixBlend.setup;
|
timelineBlend = spine.MixBlend.setup;
|
||||||
alpha = alphaDip;
|
alpha = alphaHold;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
timelineBlend = spine.MixBlend.setup;
|
timelineBlend = spine.MixBlend.setup;
|
||||||
var dipMix = timelineDipMix[i];
|
var holdMix = timelineHoldMix[i];
|
||||||
alpha = alphaDip * Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration);
|
alpha = alphaHold * Math.max(0, 1 - holdMix.mixTime / holdMix.mixDuration);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
from.totalAlpha += alpha;
|
from.totalAlpha += alpha;
|
||||||
@ -1619,6 +1622,7 @@ var spine;
|
|||||||
break;
|
break;
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
entry.mixingFrom = null;
|
entry.mixingFrom = null;
|
||||||
|
entry.mixingTo = null;
|
||||||
entry = from;
|
entry = from;
|
||||||
}
|
}
|
||||||
this.tracks[current.trackIndex] = null;
|
this.tracks[current.trackIndex] = null;
|
||||||
@ -1631,6 +1635,7 @@ var spine;
|
|||||||
if (interrupt)
|
if (interrupt)
|
||||||
this.queue.interrupt(from);
|
this.queue.interrupt(from);
|
||||||
current.mixingFrom = from;
|
current.mixingFrom = from;
|
||||||
|
from.mixingTo = current;
|
||||||
current.mixTime = 0;
|
current.mixTime = 0;
|
||||||
if (from.mixingFrom != null && from.mixDuration > 0)
|
if (from.mixingFrom != null && from.mixDuration > 0)
|
||||||
current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration);
|
current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration);
|
||||||
@ -1740,6 +1745,7 @@ var spine;
|
|||||||
entry.trackIndex = trackIndex;
|
entry.trackIndex = trackIndex;
|
||||||
entry.animation = animation;
|
entry.animation = animation;
|
||||||
entry.loop = loop;
|
entry.loop = loop;
|
||||||
|
entry.holdPrevious = false;
|
||||||
entry.eventThreshold = 0;
|
entry.eventThreshold = 0;
|
||||||
entry.attachmentThreshold = 0;
|
entry.attachmentThreshold = 0;
|
||||||
entry.drawOrderThreshold = 0;
|
entry.drawOrderThreshold = 0;
|
||||||
@ -1769,15 +1775,63 @@ var spine;
|
|||||||
};
|
};
|
||||||
AnimationState.prototype._animationsChanged = function () {
|
AnimationState.prototype._animationsChanged = function () {
|
||||||
this.animationsChanged = false;
|
this.animationsChanged = false;
|
||||||
var propertyIDs = this.propertyIDs;
|
this.propertyIDs.clear();
|
||||||
propertyIDs.clear();
|
|
||||||
var mixingTo = this.mixingTo;
|
|
||||||
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
||||||
var entry = this.tracks[i];
|
var entry = this.tracks[i];
|
||||||
if (entry != null && (i == 0 || entry.mixBlend != spine.MixBlend.add))
|
if (entry == null)
|
||||||
entry.setTimelineData(null, mixingTo, propertyIDs);
|
continue;
|
||||||
|
while (entry.mixingFrom != null)
|
||||||
|
entry = entry.mixingFrom;
|
||||||
|
do {
|
||||||
|
if (entry.mixingFrom == null || entry.mixBlend != spine.MixBlend.add)
|
||||||
|
this.setTimelineModes(entry);
|
||||||
|
entry = entry.mixingTo;
|
||||||
|
} while (entry != null);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
AnimationState.prototype.setTimelineModes = function (entry) {
|
||||||
|
var to = entry.mixingTo;
|
||||||
|
var timelines = entry.animation.timelines;
|
||||||
|
var timelinesCount = entry.animation.timelines.length;
|
||||||
|
var timelineMode = spine.Utils.setArraySize(entry.timelineMode, timelinesCount);
|
||||||
|
entry.timelineHoldMix.length = 0;
|
||||||
|
var timelineDipMix = spine.Utils.setArraySize(entry.timelineHoldMix, timelinesCount);
|
||||||
|
var propertyIDs = this.propertyIDs;
|
||||||
|
if (to != null && to.holdPrevious) {
|
||||||
|
for (var i_16 = 0; i_16 < timelinesCount; i_16++) {
|
||||||
|
propertyIDs.add(timelines[i_16].getPropertyId());
|
||||||
|
timelineMode[i_16] = AnimationState.HOLD;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
outer: for (var i = 0; i < timelinesCount; i++) {
|
||||||
|
var id = timelines[i].getPropertyId();
|
||||||
|
if (!propertyIDs.add(id))
|
||||||
|
timelineMode[i] = AnimationState.SUBSEQUENT;
|
||||||
|
else if (to == null || !this.hasTimeline(to, id))
|
||||||
|
timelineMode[i] = AnimationState.FIRST;
|
||||||
|
else {
|
||||||
|
for (var next = to.mixingTo; next != null; next = next.mixingTo) {
|
||||||
|
if (this.hasTimeline(next, id))
|
||||||
|
continue;
|
||||||
|
if (entry.mixDuration > 0) {
|
||||||
|
timelineMode[i] = AnimationState.HOLD_MIX;
|
||||||
|
timelineDipMix[i] = next;
|
||||||
|
continue outer;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
timelineMode[i] = AnimationState.HOLD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
AnimationState.prototype.hasTimeline = function (entry, id) {
|
||||||
|
var timelines = entry.animation.timelines;
|
||||||
|
for (var i = 0, n = timelines.length; i < n; i++)
|
||||||
|
if (timelines[i].getPropertyId() == id)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
};
|
||||||
AnimationState.prototype.getCurrent = function (trackIndex) {
|
AnimationState.prototype.getCurrent = function (trackIndex) {
|
||||||
if (trackIndex >= this.tracks.length)
|
if (trackIndex >= this.tracks.length)
|
||||||
return null;
|
return null;
|
||||||
@ -1802,69 +1856,28 @@ var spine;
|
|||||||
AnimationState.emptyAnimation = new spine.Animation("<empty>", [], 0);
|
AnimationState.emptyAnimation = new spine.Animation("<empty>", [], 0);
|
||||||
AnimationState.SUBSEQUENT = 0;
|
AnimationState.SUBSEQUENT = 0;
|
||||||
AnimationState.FIRST = 1;
|
AnimationState.FIRST = 1;
|
||||||
AnimationState.DIP = 2;
|
AnimationState.HOLD = 2;
|
||||||
AnimationState.DIP_MIX = 3;
|
AnimationState.HOLD_MIX = 3;
|
||||||
return AnimationState;
|
return AnimationState;
|
||||||
}());
|
}());
|
||||||
spine.AnimationState = AnimationState;
|
spine.AnimationState = AnimationState;
|
||||||
var TrackEntry = (function () {
|
var TrackEntry = (function () {
|
||||||
function TrackEntry() {
|
function TrackEntry() {
|
||||||
this.mixBlend = spine.MixBlend.replace;
|
this.mixBlend = spine.MixBlend.replace;
|
||||||
this.timelineData = new Array();
|
this.timelineMode = new Array();
|
||||||
this.timelineDipMix = new Array();
|
this.timelineHoldMix = new Array();
|
||||||
this.timelinesRotation = new Array();
|
this.timelinesRotation = new Array();
|
||||||
}
|
}
|
||||||
TrackEntry.prototype.reset = function () {
|
TrackEntry.prototype.reset = function () {
|
||||||
this.next = null;
|
this.next = null;
|
||||||
this.mixingFrom = null;
|
this.mixingFrom = null;
|
||||||
|
this.mixingTo = null;
|
||||||
this.animation = null;
|
this.animation = null;
|
||||||
this.listener = null;
|
this.listener = null;
|
||||||
this.timelineData.length = 0;
|
this.timelineMode.length = 0;
|
||||||
this.timelineDipMix.length = 0;
|
this.timelineHoldMix.length = 0;
|
||||||
this.timelinesRotation.length = 0;
|
this.timelinesRotation.length = 0;
|
||||||
};
|
};
|
||||||
TrackEntry.prototype.setTimelineData = function (to, mixingToArray, propertyIDs) {
|
|
||||||
if (to != null)
|
|
||||||
mixingToArray.push(to);
|
|
||||||
var lastEntry = this.mixingFrom != null ? this.mixingFrom.setTimelineData(this, mixingToArray, propertyIDs) : this;
|
|
||||||
if (to != null)
|
|
||||||
mixingToArray.pop();
|
|
||||||
var mixingTo = mixingToArray;
|
|
||||||
var mixingToLast = mixingToArray.length - 1;
|
|
||||||
var timelines = this.animation.timelines;
|
|
||||||
var timelinesCount = this.animation.timelines.length;
|
|
||||||
var timelineData = spine.Utils.setArraySize(this.timelineData, timelinesCount);
|
|
||||||
this.timelineDipMix.length = 0;
|
|
||||||
var timelineDipMix = spine.Utils.setArraySize(this.timelineDipMix, timelinesCount);
|
|
||||||
outer: for (var i = 0; i < timelinesCount; i++) {
|
|
||||||
var id = timelines[i].getPropertyId();
|
|
||||||
if (!propertyIDs.add(id))
|
|
||||||
timelineData[i] = AnimationState.SUBSEQUENT;
|
|
||||||
else if (to == null || !to.hasTimeline(id))
|
|
||||||
timelineData[i] = AnimationState.FIRST;
|
|
||||||
else {
|
|
||||||
for (var ii = mixingToLast; ii >= 0; ii--) {
|
|
||||||
var entry = mixingTo[ii];
|
|
||||||
if (!entry.hasTimeline(id)) {
|
|
||||||
if (entry.mixDuration > 0) {
|
|
||||||
timelineData[i] = AnimationState.DIP_MIX;
|
|
||||||
timelineDipMix[i] = entry;
|
|
||||||
continue outer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
timelineData[i] = AnimationState.DIP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return lastEntry;
|
|
||||||
};
|
|
||||||
TrackEntry.prototype.hasTimeline = function (id) {
|
|
||||||
var timelines = this.animation.timelines;
|
|
||||||
for (var i = 0, n = timelines.length; i < n; i++)
|
|
||||||
if (timelines[i].getPropertyId() == id)
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
TrackEntry.prototype.getAnimationTime = function () {
|
TrackEntry.prototype.getAnimationTime = function () {
|
||||||
if (this.loop) {
|
if (this.loop) {
|
||||||
var duration = this.animationEnd - this.animationStart;
|
var duration = this.animationEnd - this.animationStart;
|
||||||
@ -7000,8 +7013,8 @@ var spine;
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
var listeners = _this.listeners;
|
var listeners = _this.listeners;
|
||||||
for (var i_16 = 0; i_16 < listeners.length; i_16++) {
|
for (var i_17 = 0; i_17 < listeners.length; i_17++) {
|
||||||
listeners[i_16].down(_this.currTouch.x, _this.currTouch.y);
|
listeners[i_17].down(_this.currTouch.x, _this.currTouch.y);
|
||||||
}
|
}
|
||||||
console.log("Start " + _this.currTouch.x + ", " + _this.currTouch.y);
|
console.log("Start " + _this.currTouch.x + ", " + _this.currTouch.y);
|
||||||
_this.lastX = _this.currTouch.x;
|
_this.lastX = _this.currTouch.x;
|
||||||
@ -7010,29 +7023,6 @@ var spine;
|
|||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
}, false);
|
}, false);
|
||||||
element.addEventListener("touchend", function (ev) {
|
element.addEventListener("touchend", function (ev) {
|
||||||
var touches = ev.changedTouches;
|
|
||||||
for (var i = 0; i < touches.length; i++) {
|
|
||||||
var touch = touches[i];
|
|
||||||
if (_this.currTouch.identifier === touch.identifier) {
|
|
||||||
var rect = element.getBoundingClientRect();
|
|
||||||
var x = _this.currTouch.x = touch.clientX - rect.left;
|
|
||||||
var y = _this.currTouch.y = touch.clientY - rect.top;
|
|
||||||
_this.touchesPool.free(_this.currTouch);
|
|
||||||
var listeners = _this.listeners;
|
|
||||||
for (var i_17 = 0; i_17 < listeners.length; i_17++) {
|
|
||||||
listeners[i_17].up(x, y);
|
|
||||||
}
|
|
||||||
console.log("End " + x + ", " + y);
|
|
||||||
_this.lastX = x;
|
|
||||||
_this.lastY = y;
|
|
||||||
_this.buttonDown = false;
|
|
||||||
_this.currTouch = null;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ev.preventDefault();
|
|
||||||
}, false);
|
|
||||||
element.addEventListener("touchcancel", function (ev) {
|
|
||||||
var touches = ev.changedTouches;
|
var touches = ev.changedTouches;
|
||||||
for (var i = 0; i < touches.length; i++) {
|
for (var i = 0; i < touches.length; i++) {
|
||||||
var touch = touches[i];
|
var touch = touches[i];
|
||||||
@ -7055,6 +7045,29 @@ var spine;
|
|||||||
}
|
}
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
}, false);
|
}, false);
|
||||||
|
element.addEventListener("touchcancel", function (ev) {
|
||||||
|
var touches = ev.changedTouches;
|
||||||
|
for (var i = 0; i < touches.length; i++) {
|
||||||
|
var touch = touches[i];
|
||||||
|
if (_this.currTouch.identifier === touch.identifier) {
|
||||||
|
var rect = element.getBoundingClientRect();
|
||||||
|
var x = _this.currTouch.x = touch.clientX - rect.left;
|
||||||
|
var y = _this.currTouch.y = touch.clientY - rect.top;
|
||||||
|
_this.touchesPool.free(_this.currTouch);
|
||||||
|
var listeners = _this.listeners;
|
||||||
|
for (var i_19 = 0; i_19 < listeners.length; i_19++) {
|
||||||
|
listeners[i_19].up(x, y);
|
||||||
|
}
|
||||||
|
console.log("End " + x + ", " + y);
|
||||||
|
_this.lastX = x;
|
||||||
|
_this.lastY = y;
|
||||||
|
_this.buttonDown = false;
|
||||||
|
_this.currTouch = null;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ev.preventDefault();
|
||||||
|
}, false);
|
||||||
element.addEventListener("touchmove", function (ev) {
|
element.addEventListener("touchmove", function (ev) {
|
||||||
if (_this.currTouch == null)
|
if (_this.currTouch == null)
|
||||||
return;
|
return;
|
||||||
@ -7066,8 +7079,8 @@ var spine;
|
|||||||
var x = touch.clientX - rect.left;
|
var x = touch.clientX - rect.left;
|
||||||
var y = touch.clientY - rect.top;
|
var y = touch.clientY - rect.top;
|
||||||
var listeners = _this.listeners;
|
var listeners = _this.listeners;
|
||||||
for (var i_19 = 0; i_19 < listeners.length; i_19++) {
|
for (var i_20 = 0; i_20 < listeners.length; i_20++) {
|
||||||
listeners[i_19].dragged(x, y);
|
listeners[i_20].dragged(x, y);
|
||||||
}
|
}
|
||||||
console.log("Drag " + x + ", " + y);
|
console.log("Drag " + x + ", " + y);
|
||||||
_this.lastX = _this.currTouch.x = x;
|
_this.lastX = _this.currTouch.x = x;
|
||||||
@ -8917,11 +8930,11 @@ var spine;
|
|||||||
var nn = clip.worldVerticesLength;
|
var nn = clip.worldVerticesLength;
|
||||||
var world = this.temp = spine.Utils.setArraySize(this.temp, nn, 0);
|
var world = this.temp = spine.Utils.setArraySize(this.temp, nn, 0);
|
||||||
clip.computeWorldVertices(slot, 0, nn, world, 0, 2);
|
clip.computeWorldVertices(slot, 0, nn, world, 0, 2);
|
||||||
for (var i_20 = 0, n_2 = world.length; i_20 < n_2; i_20 += 2) {
|
for (var i_21 = 0, n_2 = world.length; i_21 < n_2; i_21 += 2) {
|
||||||
var x = world[i_20];
|
var x = world[i_21];
|
||||||
var y = world[i_20 + 1];
|
var y = world[i_21 + 1];
|
||||||
var x2 = world[(i_20 + 2) % world.length];
|
var x2 = world[(i_21 + 2) % world.length];
|
||||||
var y2 = world[(i_20 + 3) % world.length];
|
var y2 = world[(i_21 + 3) % world.length];
|
||||||
shapes.line(x, y, x2, y2);
|
shapes.line(x, y, x2, y2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -33,8 +33,8 @@ module spine {
|
|||||||
static emptyAnimation = new Animation("<empty>", [], 0);
|
static emptyAnimation = new Animation("<empty>", [], 0);
|
||||||
static SUBSEQUENT = 0;
|
static SUBSEQUENT = 0;
|
||||||
static FIRST = 1;
|
static FIRST = 1;
|
||||||
static DIP = 2;
|
static HOLD = 2;
|
||||||
static DIP_MIX = 3;
|
static HOLD_MIX = 3;
|
||||||
|
|
||||||
data: AnimationStateData;
|
data: AnimationStateData;
|
||||||
tracks = new Array<TrackEntry>();
|
tracks = new Array<TrackEntry>();
|
||||||
@ -42,7 +42,6 @@ module spine {
|
|||||||
listeners = new Array<AnimationStateListener2>();
|
listeners = new Array<AnimationStateListener2>();
|
||||||
queue = new EventQueue(this);
|
queue = new EventQueue(this);
|
||||||
propertyIDs = new IntSet();
|
propertyIDs = new IntSet();
|
||||||
mixingTo = new Array<TrackEntry>();
|
|
||||||
animationsChanged = false;
|
animationsChanged = false;
|
||||||
timeScale = 1;
|
timeScale = 1;
|
||||||
|
|
||||||
@ -96,6 +95,7 @@ module spine {
|
|||||||
// End mixing from entries once all have completed.
|
// End mixing from entries once all have completed.
|
||||||
let from = current.mixingFrom;
|
let from = current.mixingFrom;
|
||||||
current.mixingFrom = null;
|
current.mixingFrom = null;
|
||||||
|
if (from != null) from.mixingTo = null;
|
||||||
while (from != null) {
|
while (from != null) {
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
from = from.mixingFrom;
|
from = from.mixingFrom;
|
||||||
@ -122,6 +122,7 @@ module spine {
|
|||||||
// Require totalAlpha == 0 to ensure mixing is complete, unless mixDuration == 0 (the transition is a single frame).
|
// Require totalAlpha == 0 to ensure mixing is complete, unless mixDuration == 0 (the transition is a single frame).
|
||||||
if (from.totalAlpha == 0 || to.mixDuration == 0) {
|
if (from.totalAlpha == 0 || to.mixDuration == 0) {
|
||||||
to.mixingFrom = from.mixingFrom;
|
to.mixingFrom = from.mixingFrom;
|
||||||
|
if (from.mixingFrom != null) from.mixingFrom.mixingTo = to;
|
||||||
to.interruptAlpha = from.interruptAlpha;
|
to.interruptAlpha = from.interruptAlpha;
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
}
|
}
|
||||||
@ -158,11 +159,11 @@ module spine {
|
|||||||
let animationLast = current.animationLast, animationTime = current.getAnimationTime();
|
let animationLast = current.animationLast, animationTime = current.getAnimationTime();
|
||||||
let timelineCount = current.animation.timelines.length;
|
let timelineCount = current.animation.timelines.length;
|
||||||
let timelines = current.animation.timelines;
|
let timelines = current.animation.timelines;
|
||||||
if (mix == 1 || blend == MixBlend.add) {
|
if (i == 0 && (mix == 1 || blend == MixBlend.add)) {
|
||||||
for (let ii = 0; ii < timelineCount; ii++)
|
for (let ii = 0; ii < timelineCount; ii++)
|
||||||
timelines[ii].apply(skeleton, animationLast, animationTime, events, mix, blend, MixDirection.in);
|
timelines[ii].apply(skeleton, animationLast, animationTime, events, mix, blend, MixDirection.in);
|
||||||
} else {
|
} else {
|
||||||
let timelineData = current.timelineData;
|
let timelineMode = current.timelineMode;
|
||||||
|
|
||||||
let firstFrame = current.timelinesRotation.length == 0;
|
let firstFrame = current.timelinesRotation.length == 0;
|
||||||
if (firstFrame) Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null);
|
if (firstFrame) Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null);
|
||||||
@ -170,7 +171,7 @@ module spine {
|
|||||||
|
|
||||||
for (let ii = 0; ii < timelineCount; ii++) {
|
for (let ii = 0; ii < timelineCount; ii++) {
|
||||||
let timeline = timelines[ii];
|
let timeline = timelines[ii];
|
||||||
let timelineBlend = timelineData[ii] == AnimationState.SUBSEQUENT ? blend : MixBlend.setup;
|
let timelineBlend = timelineMode[ii] == AnimationState.SUBSEQUENT ? blend : MixBlend.setup;
|
||||||
if (timeline instanceof RotateTimeline) {
|
if (timeline instanceof RotateTimeline) {
|
||||||
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
|
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
|
||||||
} else {
|
} else {
|
||||||
@ -209,13 +210,13 @@ module spine {
|
|||||||
let animationLast = from.animationLast, animationTime = from.getAnimationTime();
|
let animationLast = from.animationLast, animationTime = from.getAnimationTime();
|
||||||
let timelineCount = from.animation.timelines.length;
|
let timelineCount = from.animation.timelines.length;
|
||||||
let timelines = from.animation.timelines;
|
let timelines = from.animation.timelines;
|
||||||
let alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix);
|
let alphaHold = from.alpha * to.interruptAlpha, alphaMix = alphaHold * (1 - mix);
|
||||||
if (blend == MixBlend.add) {
|
if (blend == MixBlend.add) {
|
||||||
for (var i = 0; i < timelineCount; i++)
|
for (var i = 0; i < timelineCount; i++)
|
||||||
timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, MixDirection.out);
|
timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, MixDirection.out);
|
||||||
} else {
|
} else {
|
||||||
let timelineData = from.timelineData;
|
let timelineMode = from.timelineMode;
|
||||||
let timelineDipMix = from.timelineDipMix;
|
let timelineHoldMix = from.timelineHoldMix;
|
||||||
|
|
||||||
let firstFrame = from.timelinesRotation.length == 0;
|
let firstFrame = from.timelinesRotation.length == 0;
|
||||||
if (firstFrame) Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null);
|
if (firstFrame) Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null);
|
||||||
@ -226,7 +227,7 @@ module spine {
|
|||||||
let timeline = timelines[i];
|
let timeline = timelines[i];
|
||||||
var timelineBlend: MixBlend;
|
var timelineBlend: MixBlend;
|
||||||
var alpha = 0;
|
var alpha = 0;
|
||||||
switch (timelineData[i]) {
|
switch (timelineMode[i]) {
|
||||||
case AnimationState.SUBSEQUENT:
|
case AnimationState.SUBSEQUENT:
|
||||||
if (!attachments && timeline instanceof AttachmentTimeline) continue;
|
if (!attachments && timeline instanceof AttachmentTimeline) continue;
|
||||||
if (!drawOrder && timeline instanceof DrawOrderTimeline) continue;
|
if (!drawOrder && timeline instanceof DrawOrderTimeline) continue;
|
||||||
@ -237,14 +238,14 @@ module spine {
|
|||||||
timelineBlend = MixBlend.setup;
|
timelineBlend = MixBlend.setup;
|
||||||
alpha = alphaMix;
|
alpha = alphaMix;
|
||||||
break;
|
break;
|
||||||
case AnimationState.DIP:
|
case AnimationState.HOLD:
|
||||||
timelineBlend = MixBlend.setup;
|
timelineBlend = MixBlend.setup;
|
||||||
alpha = alphaDip;
|
alpha = alphaHold;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
timelineBlend = MixBlend.setup;
|
timelineBlend = MixBlend.setup;
|
||||||
let dipMix = timelineDipMix[i];
|
let holdMix = timelineHoldMix[i];
|
||||||
alpha = alphaDip * Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration);
|
alpha = alphaHold * Math.max(0, 1 - holdMix.mixTime / holdMix.mixDuration);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
from.totalAlpha += alpha;
|
from.totalAlpha += alpha;
|
||||||
@ -388,6 +389,7 @@ module spine {
|
|||||||
if (from == null) break;
|
if (from == null) break;
|
||||||
this.queue.end(from);
|
this.queue.end(from);
|
||||||
entry.mixingFrom = null;
|
entry.mixingFrom = null;
|
||||||
|
entry.mixingTo = null;
|
||||||
entry = from;
|
entry = from;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -403,6 +405,7 @@ module spine {
|
|||||||
if (from != null) {
|
if (from != null) {
|
||||||
if (interrupt) this.queue.interrupt(from);
|
if (interrupt) this.queue.interrupt(from);
|
||||||
current.mixingFrom = from;
|
current.mixingFrom = from;
|
||||||
|
from.mixingTo = current;
|
||||||
current.mixTime = 0;
|
current.mixTime = 0;
|
||||||
|
|
||||||
// Store the interrupted mix percentage.
|
// Store the interrupted mix percentage.
|
||||||
@ -520,6 +523,7 @@ module spine {
|
|||||||
entry.trackIndex = trackIndex;
|
entry.trackIndex = trackIndex;
|
||||||
entry.animation = animation;
|
entry.animation = animation;
|
||||||
entry.loop = loop;
|
entry.loop = loop;
|
||||||
|
entry.holdPrevious = false;
|
||||||
|
|
||||||
entry.eventThreshold = 0;
|
entry.eventThreshold = 0;
|
||||||
entry.attachmentThreshold = 0;
|
entry.attachmentThreshold = 0;
|
||||||
@ -556,17 +560,67 @@ module spine {
|
|||||||
_animationsChanged () {
|
_animationsChanged () {
|
||||||
this.animationsChanged = false;
|
this.animationsChanged = false;
|
||||||
|
|
||||||
let propertyIDs = this.propertyIDs;
|
this.propertyIDs.clear();
|
||||||
propertyIDs.clear();
|
|
||||||
let mixingTo = this.mixingTo;
|
|
||||||
|
|
||||||
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
||||||
let entry = this.tracks[i];
|
let entry = this.tracks[i];
|
||||||
if (entry != null && (i == 0 || entry.mixBlend != MixBlend.add))
|
if (entry == null) continue;
|
||||||
entry.setTimelineData(null, mixingTo, propertyIDs);
|
while (entry.mixingFrom != null)
|
||||||
|
entry = entry.mixingFrom;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (entry.mixingFrom == null || entry.mixBlend != MixBlend.add) this.setTimelineModes(entry);
|
||||||
|
entry = entry.mixingTo;
|
||||||
|
} while (entry != null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setTimelineModes (entry: TrackEntry) {
|
||||||
|
let to = entry.mixingTo;
|
||||||
|
let timelines = entry.animation.timelines;
|
||||||
|
let timelinesCount = entry.animation.timelines.length;
|
||||||
|
let timelineMode = Utils.setArraySize(entry.timelineMode, timelinesCount);
|
||||||
|
entry.timelineHoldMix.length = 0;
|
||||||
|
let timelineDipMix = Utils.setArraySize(entry.timelineHoldMix, timelinesCount);
|
||||||
|
let propertyIDs = this.propertyIDs;
|
||||||
|
|
||||||
|
if (to != null && to.holdPrevious) {
|
||||||
|
for (let i = 0; i < timelinesCount; i++) {
|
||||||
|
propertyIDs.add(timelines[i].getPropertyId());
|
||||||
|
timelineMode[i] = AnimationState.HOLD;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
outer:
|
||||||
|
for (var i = 0; i < timelinesCount; i++) {
|
||||||
|
let id = timelines[i].getPropertyId();
|
||||||
|
if (!propertyIDs.add(id))
|
||||||
|
timelineMode[i] = AnimationState.SUBSEQUENT;
|
||||||
|
else if (to == null || !this.hasTimeline(to, id))
|
||||||
|
timelineMode[i] = AnimationState.FIRST;
|
||||||
|
else {
|
||||||
|
for (let next = to.mixingTo; next != null; next = next.mixingTo) {
|
||||||
|
if (this.hasTimeline(next, id)) continue;
|
||||||
|
if (entry.mixDuration > 0) {
|
||||||
|
timelineMode[i] = AnimationState.HOLD_MIX;
|
||||||
|
timelineDipMix[i] = next;
|
||||||
|
continue outer;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
timelineMode[i] = AnimationState.HOLD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hasTimeline (entry: TrackEntry, id: number) : boolean {
|
||||||
|
let timelines = entry.animation.timelines;
|
||||||
|
for (var i = 0, n = timelines.length; i < n; i++)
|
||||||
|
if (timelines[i].getPropertyId() == id) return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
getCurrent (trackIndex: number) {
|
getCurrent (trackIndex: number) {
|
||||||
if (trackIndex >= this.tracks.length) return null;
|
if (trackIndex >= this.tracks.length) return null;
|
||||||
return this.tracks[trackIndex];
|
return this.tracks[trackIndex];
|
||||||
@ -594,73 +648,31 @@ module spine {
|
|||||||
|
|
||||||
export class TrackEntry {
|
export class TrackEntry {
|
||||||
animation: Animation;
|
animation: Animation;
|
||||||
next: TrackEntry; mixingFrom: TrackEntry;
|
next: TrackEntry; mixingFrom: TrackEntry; mixingTo: TrackEntry;
|
||||||
listener: AnimationStateListener2;
|
listener: AnimationStateListener2;
|
||||||
trackIndex: number;
|
trackIndex: number;
|
||||||
loop: boolean;
|
loop: boolean;
|
||||||
|
holdPrevious: boolean;
|
||||||
eventThreshold: number; attachmentThreshold: number; drawOrderThreshold: number;
|
eventThreshold: number; attachmentThreshold: number; drawOrderThreshold: number;
|
||||||
animationStart: number; animationEnd: number; animationLast: number; nextAnimationLast: number;
|
animationStart: number; animationEnd: number; animationLast: number; nextAnimationLast: number;
|
||||||
delay: number; trackTime: number; trackLast: number; nextTrackLast: number; trackEnd: number; timeScale: number;
|
delay: number; trackTime: number; trackLast: number; nextTrackLast: number; trackEnd: number; timeScale: number;
|
||||||
alpha: number; mixTime: number; mixDuration: number; interruptAlpha: number; totalAlpha: number;
|
alpha: number; mixTime: number; mixDuration: number; interruptAlpha: number; totalAlpha: number;
|
||||||
mixBlend = MixBlend.replace;
|
mixBlend = MixBlend.replace;
|
||||||
timelineData = new Array<number>();
|
timelineMode = new Array<number>();
|
||||||
timelineDipMix = new Array<TrackEntry>();
|
timelineHoldMix = new Array<TrackEntry>();
|
||||||
timelinesRotation = new Array<number>();
|
timelinesRotation = new Array<number>();
|
||||||
|
|
||||||
reset () {
|
reset () {
|
||||||
this.next = null;
|
this.next = null;
|
||||||
this.mixingFrom = null;
|
this.mixingFrom = null;
|
||||||
|
this.mixingTo = null;
|
||||||
this.animation = null;
|
this.animation = null;
|
||||||
this.listener = null;
|
this.listener = null;
|
||||||
this.timelineData.length = 0;
|
this.timelineMode.length = 0;
|
||||||
this.timelineDipMix.length = 0;
|
this.timelineHoldMix.length = 0;
|
||||||
this.timelinesRotation.length = 0;
|
this.timelinesRotation.length = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimelineData (to: TrackEntry, mixingToArray: Array<TrackEntry>, propertyIDs: IntSet) : TrackEntry {
|
|
||||||
if (to != null) mixingToArray.push(to);
|
|
||||||
let lastEntry = this.mixingFrom != null ? this.mixingFrom.setTimelineData(this, mixingToArray, propertyIDs) : this;
|
|
||||||
if (to != null) mixingToArray.pop();
|
|
||||||
|
|
||||||
let mixingTo = mixingToArray;
|
|
||||||
let mixingToLast = mixingToArray.length - 1;
|
|
||||||
let timelines = this.animation.timelines;
|
|
||||||
let timelinesCount = this.animation.timelines.length;
|
|
||||||
let timelineData = Utils.setArraySize(this.timelineData, timelinesCount);
|
|
||||||
this.timelineDipMix.length = 0;
|
|
||||||
let timelineDipMix = Utils.setArraySize(this.timelineDipMix, timelinesCount);
|
|
||||||
|
|
||||||
outer:
|
|
||||||
for (var i = 0; i < timelinesCount; i++) {
|
|
||||||
let id = timelines[i].getPropertyId();
|
|
||||||
if (!propertyIDs.add(id))
|
|
||||||
timelineData[i] = AnimationState.SUBSEQUENT;
|
|
||||||
else if (to == null || !to.hasTimeline(id))
|
|
||||||
timelineData[i] = AnimationState.FIRST;
|
|
||||||
else {
|
|
||||||
for (var ii = mixingToLast; ii >= 0; ii--) {
|
|
||||||
let entry = mixingTo[ii];
|
|
||||||
if (!entry.hasTimeline(id)) {
|
|
||||||
if (entry.mixDuration > 0) {
|
|
||||||
timelineData[i] = AnimationState.DIP_MIX;
|
|
||||||
timelineDipMix[i] = entry;
|
|
||||||
continue outer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
timelineData[i] = AnimationState.DIP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return lastEntry;
|
|
||||||
}
|
|
||||||
|
|
||||||
hasTimeline (id: number) : boolean {
|
|
||||||
let timelines = this.animation.timelines;
|
|
||||||
for (var i = 0, n = timelines.length; i < n; i++)
|
|
||||||
if (timelines[i].getPropertyId() == id) return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
getAnimationTime () {
|
getAnimationTime () {
|
||||||
if (this.loop) {
|
if (this.loop) {
|
||||||
let duration = this.animationEnd - this.animationStart;
|
let duration = this.animationEnd - this.animationStart;
|
||||||
|
|||||||
@ -26,6 +26,7 @@ function load () {
|
|||||||
var skeletonJson = new spine.SkeletonJson(new spine.AtlasAttachmentLoader(atlas));
|
var skeletonJson = new spine.SkeletonJson(new spine.AtlasAttachmentLoader(atlas));
|
||||||
var skeletonData = skeletonJson.readSkeletonData(assetManager.get("spineboy-ess.json"));
|
var skeletonData = skeletonJson.readSkeletonData(assetManager.get("spineboy-ess.json"));
|
||||||
var animationStateData = new spine.AnimationStateData(skeletonData);
|
var animationStateData = new spine.AnimationStateData(skeletonData);
|
||||||
|
animationStateData.defaultMix = 0.3;
|
||||||
|
|
||||||
skeleton = new spine.Skeleton(skeletonData);
|
skeleton = new spine.Skeleton(skeletonData);
|
||||||
animationState = new spine.AnimationState(animationStateData);
|
animationState = new spine.AnimationState(animationStateData);
|
||||||
@ -38,6 +39,8 @@ function load () {
|
|||||||
renderer.camera.zoom = size.x > size.y ? size.x / canvas.width : size.y / canvas.height;
|
renderer.camera.zoom = size.x > size.y ? size.x / canvas.width : size.y / canvas.height;
|
||||||
|
|
||||||
animationState.setAnimation(0, "walk", true);
|
animationState.setAnimation(0, "walk", true);
|
||||||
|
animationState.addAnimation(0, "run", true, 1);
|
||||||
|
animationState.addAnimation(0, "jump", true, 3);
|
||||||
|
|
||||||
requestAnimationFrame(render);
|
requestAnimationFrame(render);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
113
spine-ts/webgl/tests/test-rig.html
Normal file
113
spine-ts/webgl/tests/test-rig.html
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
<html>
|
||||||
|
<script src="../../build/spine-webgl.js"></script>
|
||||||
|
<script src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
|
||||||
|
<style>
|
||||||
|
* { margin: 0; padding: 0; }
|
||||||
|
body, html { height: 100% }
|
||||||
|
canvas { position: absolute; width: 100% ;height: 100%; }
|
||||||
|
</style>
|
||||||
|
<body>
|
||||||
|
<div id="label" style="position: absolute; top: 0; left: 0; color: #fff; z-index: 10"></div>
|
||||||
|
<canvas id="canvas" style="background: red;"></canvas>
|
||||||
|
</body>
|
||||||
|
<script>
|
||||||
|
|
||||||
|
var FILE = "spineboy-ess";
|
||||||
|
var ANIMATION = "idle";
|
||||||
|
var SCALE = 0.5;
|
||||||
|
|
||||||
|
var canvas, context, gl, renderer, input, assetManager;
|
||||||
|
var skeletons = [];
|
||||||
|
var timeKeeper;
|
||||||
|
var label = document.getElementById("label");
|
||||||
|
var updateMean = new spine.WindowedMean();
|
||||||
|
var renderMean = new spine.WindowedMean();
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
canvas = document.getElementById("canvas");
|
||||||
|
canvas.width = canvas.clientWidth; canvas.height = canvas.clientHeight;
|
||||||
|
context = new spine.webgl.ManagedWebGLRenderingContext(canvas, { alpha: false });
|
||||||
|
gl = context.gl;
|
||||||
|
|
||||||
|
renderer = new spine.webgl.SceneRenderer(canvas, context);
|
||||||
|
assetManager = new spine.webgl.AssetManager(context, "../example/assets/");
|
||||||
|
input = new spine.webgl.Input(canvas);
|
||||||
|
|
||||||
|
assetManager.loadTextureAtlas(FILE.replace("-pro", "").replace("-ess", "") + ".atlas");
|
||||||
|
assetManager.loadText(FILE + ".json");
|
||||||
|
|
||||||
|
timeKeeper = new spine.TimeKeeper();
|
||||||
|
requestAnimationFrame(load);
|
||||||
|
}
|
||||||
|
|
||||||
|
alert("blah");
|
||||||
|
|
||||||
|
var run = true;
|
||||||
|
|
||||||
|
function switchAnimation() {
|
||||||
|
var skel = skeletons[0];
|
||||||
|
skel.state.setAnimation(0, run ? "run" : "idle", true);
|
||||||
|
run = !run;
|
||||||
|
setTimeout(switchAnimation, 300);
|
||||||
|
}
|
||||||
|
|
||||||
|
function load() {
|
||||||
|
timeKeeper.update();
|
||||||
|
if (assetManager.isLoadingComplete()) {
|
||||||
|
var atlas = assetManager.get(FILE.replace("-pro", "").replace("-ess", "") + ".atlas");
|
||||||
|
var atlasLoader = new spine.AtlasAttachmentLoader(atlas);
|
||||||
|
var skeletonJson = new spine.SkeletonJson(atlasLoader);
|
||||||
|
skeletonJson.scale = SCALE;
|
||||||
|
var skeletonData = skeletonJson.readSkeletonData(JSON.parse(assetManager.get(FILE + ".json")));
|
||||||
|
|
||||||
|
skeleton = new spine.Skeleton(skeletonData);
|
||||||
|
var stateData = new spine.AnimationStateData(skeleton.data);
|
||||||
|
state = new spine.AnimationState(stateData);
|
||||||
|
stateData.defaultMix = 0;
|
||||||
|
|
||||||
|
state.setAnimation(0, ANIMATION, true);
|
||||||
|
skeletons.push({ skeleton: skeleton, state: state });
|
||||||
|
|
||||||
|
setTimeout(switchAnimation, 300);
|
||||||
|
|
||||||
|
requestAnimationFrame(render);
|
||||||
|
} else {
|
||||||
|
requestAnimationFrame(load);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function render() {
|
||||||
|
var start = Date.now()
|
||||||
|
timeKeeper.update();
|
||||||
|
var delta = timeKeeper.delta;
|
||||||
|
|
||||||
|
for (var i = 0; i < skeletons.length; i++) {
|
||||||
|
var state = skeletons[i].state;
|
||||||
|
var skeleton = skeletons[i].skeleton;
|
||||||
|
state.update(delta);
|
||||||
|
state.apply(skeleton);
|
||||||
|
skeleton.updateWorldTransform();
|
||||||
|
}
|
||||||
|
updateMean.addValue(Date.now() - start);
|
||||||
|
start = Date.now();
|
||||||
|
|
||||||
|
gl.clearColor(0.2, 0.2, 0.2, 1);
|
||||||
|
gl.clear(gl.COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
renderer.resize(spine.webgl.ResizeMode.Fit);
|
||||||
|
renderer.begin();
|
||||||
|
for (var i = 0; i < skeletons.length; i++) {
|
||||||
|
var skeleton = skeletons[i].skeleton;
|
||||||
|
renderer.drawSkeleton(skeleton, false);
|
||||||
|
}
|
||||||
|
renderer.end();
|
||||||
|
|
||||||
|
requestAnimationFrame(render)
|
||||||
|
renderMean.addValue(Date.now() - start);
|
||||||
|
label.innerHTML = ("Update time: " + Number(updateMean.getMean()).toFixed(2) + " ms\n" +
|
||||||
|
"Render time: " + Number(renderMean.getMean()).toFixed(2) + " ms\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
init();
|
||||||
|
</script>
|
||||||
|
</html>
|
||||||
@ -51,6 +51,7 @@ namespace Spine.Unity.Editor {
|
|||||||
internal static bool showAttachments = false;
|
internal static bool showAttachments = false;
|
||||||
|
|
||||||
SerializedProperty atlasAssets, skeletonJSON, scale, fromAnimation, toAnimation, duration, defaultMix;
|
SerializedProperty atlasAssets, skeletonJSON, scale, fromAnimation, toAnimation, duration, defaultMix;
|
||||||
|
SerializedProperty blendModeMaterials;
|
||||||
#if SPINE_TK2D
|
#if SPINE_TK2D
|
||||||
SerializedProperty spriteCollection;
|
SerializedProperty spriteCollection;
|
||||||
#endif
|
#endif
|
||||||
@ -100,6 +101,8 @@ namespace Spine.Unity.Editor {
|
|||||||
duration = serializedObject.FindProperty("duration");
|
duration = serializedObject.FindProperty("duration");
|
||||||
defaultMix = serializedObject.FindProperty("defaultMix");
|
defaultMix = serializedObject.FindProperty("defaultMix");
|
||||||
|
|
||||||
|
blendModeMaterials = serializedObject.FindProperty("blendModeMaterials");
|
||||||
|
|
||||||
#if SPINE_SKELETON_MECANIM
|
#if SPINE_SKELETON_MECANIM
|
||||||
controller = serializedObject.FindProperty("controller");
|
controller = serializedObject.FindProperty("controller");
|
||||||
#endif
|
#endif
|
||||||
@ -315,6 +318,8 @@ namespace Spine.Unity.Editor {
|
|||||||
|
|
||||||
if (atlasAssets.arraySize == 0)
|
if (atlasAssets.arraySize == 0)
|
||||||
EditorGUILayout.HelpBox("AtlasAssets array is empty. Skeleton's attachments will load without being mapped to images.", MessageType.Info);
|
EditorGUILayout.HelpBox("AtlasAssets array is empty. Skeleton's attachments will load without being mapped to images.", MessageType.Info);
|
||||||
|
|
||||||
|
EditorGUILayout.PropertyField(blendModeMaterials);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleAtlasAssetsNulls () {
|
void HandleAtlasAssetsNulls () {
|
||||||
|
|||||||
@ -179,7 +179,7 @@ namespace Spine.Unity.Editor {
|
|||||||
static void Initialize () {
|
static void Initialize () {
|
||||||
Preferences.Load();
|
Preferences.Load();
|
||||||
|
|
||||||
DirectoryInfo rootDir = new DirectoryInfo(Application.dataPath);
|
var rootDir = new DirectoryInfo(Application.dataPath);
|
||||||
FileInfo[] files = rootDir.GetFiles("SpineEditorUtilities.cs", SearchOption.AllDirectories);
|
FileInfo[] files = rootDir.GetFiles("SpineEditorUtilities.cs", SearchOption.AllDirectories);
|
||||||
editorPath = Path.GetDirectoryName(files[0].FullName.Replace("\\", "/").Replace(Application.dataPath, "Assets"));
|
editorPath = Path.GetDirectoryName(files[0].FullName.Replace("\\", "/").Replace(Application.dataPath, "Assets"));
|
||||||
editorGUIPath = editorPath + "/GUI";
|
editorGUIPath = editorPath + "/GUI";
|
||||||
@ -194,15 +194,27 @@ namespace Spine.Unity.Editor {
|
|||||||
EditorApplication.hierarchyWindowItemOnGUI += HierarchyHandler.HandleDragAndDrop;
|
EditorApplication.hierarchyWindowItemOnGUI += HierarchyHandler.HandleDragAndDrop;
|
||||||
|
|
||||||
// Hierarchy Icons
|
// Hierarchy Icons
|
||||||
#if UNITY_2017_2_OR_NEWER
|
#if UNITY_2017_2_OR_NEWER
|
||||||
EditorApplication.playModeStateChanged -= HierarchyHandler.IconsOnPlaymodeStateChanged;
|
EditorApplication.playModeStateChanged -= HierarchyHandler.IconsOnPlaymodeStateChanged;
|
||||||
EditorApplication.playModeStateChanged += HierarchyHandler.IconsOnPlaymodeStateChanged;
|
EditorApplication.playModeStateChanged += HierarchyHandler.IconsOnPlaymodeStateChanged;
|
||||||
HierarchyHandler.IconsOnPlaymodeStateChanged(PlayModeStateChange.EnteredEditMode);
|
HierarchyHandler.IconsOnPlaymodeStateChanged(PlayModeStateChange.EnteredEditMode);
|
||||||
#else
|
#else
|
||||||
EditorApplication.playmodeStateChanged -= HierarchyHandler.IconsOnPlaymodeStateChanged;
|
EditorApplication.playmodeStateChanged -= HierarchyHandler.IconsOnPlaymodeStateChanged;
|
||||||
EditorApplication.playmodeStateChanged += HierarchyHandler.IconsOnPlaymodeStateChanged;
|
EditorApplication.playmodeStateChanged += HierarchyHandler.IconsOnPlaymodeStateChanged;
|
||||||
HierarchyHandler.IconsOnPlaymodeStateChanged();
|
HierarchyHandler.IconsOnPlaymodeStateChanged();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Data Refresh Edit Mode.
|
||||||
|
// This prevents deserialized SkeletonData from persisting from play mode to edit mode.
|
||||||
|
#if UNITY_2017_2_OR_NEWER
|
||||||
|
EditorApplication.playModeStateChanged -= DataReloadHandler.OnPlaymodeStateChanged;
|
||||||
|
EditorApplication.playModeStateChanged += DataReloadHandler.OnPlaymodeStateChanged;
|
||||||
|
DataReloadHandler.OnPlaymodeStateChanged(PlayModeStateChange.EnteredEditMode);
|
||||||
|
#else
|
||||||
|
EditorApplication.playmodeStateChanged -= DataReloadHandler.OnPlaymodeStateChanged;
|
||||||
|
EditorApplication.playmodeStateChanged += DataReloadHandler.OnPlaymodeStateChanged;
|
||||||
|
DataReloadHandler.OnPlaymodeStateChanged();
|
||||||
|
#endif
|
||||||
|
|
||||||
initialized = true;
|
initialized = true;
|
||||||
}
|
}
|
||||||
@ -214,11 +226,11 @@ namespace Spine.Unity.Editor {
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public static class Preferences {
|
public static class Preferences {
|
||||||
#if SPINE_TK2D
|
#if SPINE_TK2D
|
||||||
const float DEFAULT_DEFAULT_SCALE = 1f;
|
const float DEFAULT_DEFAULT_SCALE = 1f;
|
||||||
#else
|
#else
|
||||||
const float DEFAULT_DEFAULT_SCALE = 0.01f;
|
const float DEFAULT_DEFAULT_SCALE = 0.01f;
|
||||||
#endif
|
#endif
|
||||||
const string DEFAULT_SCALE_KEY = "SPINE_DEFAULT_SCALE";
|
const string DEFAULT_SCALE_KEY = "SPINE_DEFAULT_SCALE";
|
||||||
public static float defaultScale = DEFAULT_DEFAULT_SCALE;
|
public static float defaultScale = DEFAULT_DEFAULT_SCALE;
|
||||||
|
|
||||||
@ -268,11 +280,11 @@ namespace Spine.Unity.Editor {
|
|||||||
showHierarchyIcons = EditorGUILayout.Toggle(new GUIContent("Show Hierarchy Icons", "Show relevant icons on GameObjects with Spine Components on them. Disable this if you have large, complex scenes."), showHierarchyIcons);
|
showHierarchyIcons = EditorGUILayout.Toggle(new GUIContent("Show Hierarchy Icons", "Show relevant icons on GameObjects with Spine Components on them. Disable this if you have large, complex scenes."), showHierarchyIcons);
|
||||||
if (EditorGUI.EndChangeCheck()) {
|
if (EditorGUI.EndChangeCheck()) {
|
||||||
EditorPrefs.SetBool(SHOW_HIERARCHY_ICONS_KEY, showHierarchyIcons);
|
EditorPrefs.SetBool(SHOW_HIERARCHY_ICONS_KEY, showHierarchyIcons);
|
||||||
#if UNITY_2017_2_OR_NEWER
|
#if UNITY_2017_2_OR_NEWER
|
||||||
HierarchyHandler.IconsOnPlaymodeStateChanged(PlayModeStateChange.EnteredEditMode);
|
HierarchyHandler.IconsOnPlaymodeStateChanged(PlayModeStateChange.EnteredEditMode);
|
||||||
#else
|
#else
|
||||||
HierarchyHandler.IconsOnPlaymodeStateChanged();
|
HierarchyHandler.IconsOnPlaymodeStateChanged();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
EditorGUILayout.Separator();
|
EditorGUILayout.Separator();
|
||||||
@ -333,6 +345,38 @@ namespace Spine.Unity.Editor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class DataReloadHandler {
|
||||||
|
#if UNITY_2017_2_OR_NEWER
|
||||||
|
internal static void OnPlaymodeStateChanged (PlayModeStateChange stateChange) {
|
||||||
|
#else
|
||||||
|
internal static void OnPlaymodeStateChanged () {
|
||||||
|
#endif
|
||||||
|
ReloadAllActiveSkeletons();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ReloadAllActiveSkeletons () {
|
||||||
|
var skeletonDataAssetsToReload = new HashSet<SkeletonDataAsset>();
|
||||||
|
|
||||||
|
var activeSkeletonRenderers = GameObject.FindObjectsOfType<SkeletonRenderer>();
|
||||||
|
foreach (var sr in activeSkeletonRenderers) {
|
||||||
|
var skeletonDataAsset = sr.skeletonDataAsset;
|
||||||
|
if (skeletonDataAsset != null) skeletonDataAssetsToReload.Add(skeletonDataAsset);
|
||||||
|
}
|
||||||
|
|
||||||
|
var activeSkeletonGraphics = GameObject.FindObjectsOfType<SkeletonGraphic>();
|
||||||
|
foreach (var sg in activeSkeletonGraphics) {
|
||||||
|
var skeletonDataAsset = sg.skeletonDataAsset;
|
||||||
|
if (skeletonDataAsset != null) skeletonDataAssetsToReload.Add(skeletonDataAsset);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var sda in skeletonDataAssetsToReload)
|
||||||
|
sda.Clear();
|
||||||
|
|
||||||
|
foreach (var sr in activeSkeletonRenderers) sr.Initialize(true);
|
||||||
|
foreach (var sg in activeSkeletonGraphics) sg.Initialize(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static class AssetUtility {
|
public static class AssetUtility {
|
||||||
public const string SkeletonDataSuffix = "_SkeletonData";
|
public const string SkeletonDataSuffix = "_SkeletonData";
|
||||||
public const string AtlasSuffix = "_Atlas";
|
public const string AtlasSuffix = "_Atlas";
|
||||||
|
|||||||
@ -0,0 +1,120 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Spine Runtimes Software License v2.5
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013-2016, Esoteric Software
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* You are granted a perpetual, non-exclusive, non-sublicensable, and
|
||||||
|
* non-transferable license to use, install, execute, and perform the Spine
|
||||||
|
* Runtimes software and derivative works solely for personal or internal
|
||||||
|
* use. Without the written permission of Esoteric Software (see Section 2 of
|
||||||
|
* the Spine Software License Agreement), you may not (a) modify, translate,
|
||||||
|
* adapt, or develop new applications using the Spine Runtimes or otherwise
|
||||||
|
* create derivative works or improvements of the Spine Runtimes or (b) remove,
|
||||||
|
* delete, alter, or obscure any trademarks or any copyright, trademark, patent,
|
||||||
|
* or other intellectual property or proprietary rights notices on or in the
|
||||||
|
* Software, including any copy thereof. Redistributions in binary or source
|
||||||
|
* form must include this license and terms.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
|
||||||
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF
|
||||||
|
* USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||||
|
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
using Spine;
|
||||||
|
using Spine.Unity;
|
||||||
|
|
||||||
|
namespace Spine.Unity {
|
||||||
|
[CreateAssetMenu(menuName = "Spine/Blend Mode Materials Asset", order = 200)]
|
||||||
|
public class BlendModeMaterialsAsset : SkeletonDataModifierAsset {
|
||||||
|
public Material multiplyMaterialTemplate;
|
||||||
|
public Material screenMaterialTemplate;
|
||||||
|
public Material additiveMaterialTemplate;
|
||||||
|
|
||||||
|
public bool applyAdditiveMaterial;
|
||||||
|
|
||||||
|
public override void Apply (SkeletonData skeletonData) {
|
||||||
|
ApplyMaterials(skeletonData, multiplyMaterialTemplate, screenMaterialTemplate, additiveMaterialTemplate, applyAdditiveMaterial);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ApplyMaterials (SkeletonData skeletonData, Material multiplyTemplate, Material screenTemplate, Material additiveTemplate, bool includeAdditiveSlots) {
|
||||||
|
if (skeletonData == null) throw new ArgumentNullException("skeletonData");
|
||||||
|
|
||||||
|
var atlasPageMaterialCache = new Dictionary<KeyValuePair<AtlasPage, Material>, AtlasPage>();
|
||||||
|
var attachmentBuffer = new List<Attachment>();
|
||||||
|
var slotsItems = skeletonData.Slots.Items;
|
||||||
|
for (int i = 0, slotCount = skeletonData.Slots.Count; i < slotCount; i++) {
|
||||||
|
var slot = slotsItems[i];
|
||||||
|
if (slot.blendMode == BlendMode.Normal) continue;
|
||||||
|
if (!includeAdditiveSlots && slot.blendMode == BlendMode.Additive) continue;
|
||||||
|
|
||||||
|
attachmentBuffer.Clear();
|
||||||
|
foreach (var skin in skeletonData.Skins)
|
||||||
|
skin.FindAttachmentsForSlot(i, attachmentBuffer);
|
||||||
|
|
||||||
|
Material templateMaterial = null;
|
||||||
|
switch (slot.blendMode) {
|
||||||
|
case BlendMode.Multiply:
|
||||||
|
templateMaterial = multiplyTemplate;
|
||||||
|
break;
|
||||||
|
case BlendMode.Screen:
|
||||||
|
templateMaterial = screenTemplate;
|
||||||
|
break;
|
||||||
|
case BlendMode.Additive:
|
||||||
|
templateMaterial = additiveTemplate;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (templateMaterial == null) continue;
|
||||||
|
|
||||||
|
foreach (var attachment in attachmentBuffer) {
|
||||||
|
var renderableAttachment = attachment as IHasRendererObject;
|
||||||
|
if (renderableAttachment != null) {
|
||||||
|
renderableAttachment.RendererObject = AtlasRegionCloneWithMaterial((AtlasRegion)renderableAttachment.RendererObject, templateMaterial, atlasPageMaterialCache);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//atlasPageMaterialCache.Clear();
|
||||||
|
//attachmentBuffer.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
static AtlasRegion AtlasRegionCloneWithMaterial (AtlasRegion originalRegion, Material materialTemplate, Dictionary<KeyValuePair<AtlasPage, Material>, AtlasPage> cache) {
|
||||||
|
var newRegion = originalRegion.Clone();
|
||||||
|
newRegion.page = GetAtlasPageWithMaterial(originalRegion.page, materialTemplate, cache);
|
||||||
|
return newRegion;
|
||||||
|
}
|
||||||
|
|
||||||
|
static AtlasPage GetAtlasPageWithMaterial (AtlasPage originalPage, Material materialTemplate, Dictionary<KeyValuePair<AtlasPage, Material>, AtlasPage> cache) {
|
||||||
|
if (originalPage == null) throw new ArgumentNullException("originalPage");
|
||||||
|
|
||||||
|
AtlasPage newPage = null;
|
||||||
|
var key = new KeyValuePair<AtlasPage, Material>(originalPage, materialTemplate);
|
||||||
|
cache.TryGetValue(key, out newPage);
|
||||||
|
|
||||||
|
if (newPage == null) {
|
||||||
|
newPage = originalPage.Clone();
|
||||||
|
var originalMaterial = originalPage.rendererObject as Material;
|
||||||
|
newPage.rendererObject = new Material(materialTemplate) {
|
||||||
|
name = originalMaterial.name + " " + materialTemplate.name,
|
||||||
|
mainTexture = originalMaterial.mainTexture
|
||||||
|
};
|
||||||
|
cache.Add(key, newPage);
|
||||||
|
}
|
||||||
|
|
||||||
|
return newPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 12b0b98acbcda44468a7ae4e35000abe
|
||||||
|
timeCreated: 1536404384
|
||||||
|
licenseType: Pro
|
||||||
|
MonoImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences:
|
||||||
|
- multiplyMaterialTemplate: {fileID: 2100000, guid: 53bf0ab317d032d418cf1252d68f51df,
|
||||||
|
type: 2}
|
||||||
|
- screenMaterialTemplate: {fileID: 2100000, guid: 73f0f46d3177c614baf0fa48d646a9be,
|
||||||
|
type: 2}
|
||||||
|
- additiveMaterialTemplate: {fileID: 2100000, guid: 4deba332d47209e4780b3c5fcf0e3745,
|
||||||
|
type: 2}
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -29,8 +29,10 @@
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
using Spine;
|
using Spine;
|
||||||
|
|
||||||
namespace Spine.Unity {
|
namespace Spine.Unity {
|
||||||
@ -39,6 +41,7 @@ namespace Spine.Unity {
|
|||||||
public class SkeletonDataAsset : ScriptableObject {
|
public class SkeletonDataAsset : ScriptableObject {
|
||||||
#region Inspector
|
#region Inspector
|
||||||
public AtlasAssetBase[] atlasAssets = new AtlasAssetBase[0];
|
public AtlasAssetBase[] atlasAssets = new AtlasAssetBase[0];
|
||||||
|
|
||||||
#if SPINE_TK2D
|
#if SPINE_TK2D
|
||||||
public tk2dSpriteCollectionData spriteCollection;
|
public tk2dSpriteCollectionData spriteCollection;
|
||||||
public float scale = 1f;
|
public float scale = 1f;
|
||||||
@ -46,6 +49,10 @@ namespace Spine.Unity {
|
|||||||
public float scale = 0.01f;
|
public float scale = 0.01f;
|
||||||
#endif
|
#endif
|
||||||
public TextAsset skeletonJSON;
|
public TextAsset skeletonJSON;
|
||||||
|
|
||||||
|
[Tooltip("Use SkeletonDataModifierAssets to apply changes to the SkeletonData after being loaded, such as apply blend mode Materials to Attachments under slots with special blend modes.")]
|
||||||
|
public List<SkeletonDataModifierAsset> skeletonDataModifiers = new List<SkeletonDataModifierAsset>();
|
||||||
|
|
||||||
[SpineAnimation(includeNone: false)]
|
[SpineAnimation(includeNone: false)]
|
||||||
public string[] fromAnimation = new string[0];
|
public string[] fromAnimation = new string[0];
|
||||||
[SpineAnimation(includeNone: false)]
|
[SpineAnimation(includeNone: false)]
|
||||||
@ -87,6 +94,7 @@ namespace Spine.Unity {
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
/// <summary>Clears the loaded SkeletonData and AnimationStateData. Use this to force a reload for the next time GetSkeletonData is called.</summary>
|
||||||
public void Clear () {
|
public void Clear () {
|
||||||
skeletonData = null;
|
skeletonData = null;
|
||||||
stateData = null;
|
stateData = null;
|
||||||
@ -161,6 +169,12 @@ namespace Spine.Unity {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (skeletonDataModifiers != null) {
|
||||||
|
foreach (var m in skeletonDataModifiers) {
|
||||||
|
if (m != null) m.Apply(loadedSkeletonData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.InitializeWithData(loadedSkeletonData);
|
this.InitializeWithData(loadedSkeletonData);
|
||||||
|
|
||||||
return skeletonData;
|
return skeletonData;
|
||||||
@ -218,6 +232,7 @@ namespace Spine.Unity {
|
|||||||
GetSkeletonData(false);
|
GetSkeletonData(false);
|
||||||
return stateData;
|
return stateData;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,40 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Spine Runtimes Software License v2.5
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013-2016, Esoteric Software
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* You are granted a perpetual, non-exclusive, non-sublicensable, and
|
||||||
|
* non-transferable license to use, install, execute, and perform the Spine
|
||||||
|
* Runtimes software and derivative works solely for personal or internal
|
||||||
|
* use. Without the written permission of Esoteric Software (see Section 2 of
|
||||||
|
* the Spine Software License Agreement), you may not (a) modify, translate,
|
||||||
|
* adapt, or develop new applications using the Spine Runtimes or otherwise
|
||||||
|
* create derivative works or improvements of the Spine Runtimes or (b) remove,
|
||||||
|
* delete, alter, or obscure any trademarks or any copyright, trademark, patent,
|
||||||
|
* or other intellectual property or proprietary rights notices on or in the
|
||||||
|
* Software, including any copy thereof. Redistributions in binary or source
|
||||||
|
* form must include this license and terms.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
|
||||||
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF
|
||||||
|
* USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||||
|
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace Spine.Unity {
|
||||||
|
/// <summary>Can be stored by SkeletonDataAsset to automatically apply modifications to loaded SkeletonData.</summary>
|
||||||
|
public abstract class SkeletonDataModifierAsset : ScriptableObject {
|
||||||
|
public abstract void Apply (SkeletonData skeletonData);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 79a44aba1f342f440965874280b4c318
|
||||||
|
timeCreated: 1536412736
|
||||||
|
licenseType: Pro
|
||||||
|
MonoImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -69,7 +69,7 @@ namespace Spine.Unity.Modules.AttachmentTools {
|
|||||||
|
|
||||||
/// <summary>Sets the region (image) of a RegionAttachment</summary>
|
/// <summary>Sets the region (image) of a RegionAttachment</summary>
|
||||||
public static void SetRegion (this RegionAttachment attachment, AtlasRegion region, bool updateOffset = true) {
|
public static void SetRegion (this RegionAttachment attachment, AtlasRegion region, bool updateOffset = true) {
|
||||||
if (region == null) throw new System.ArgumentNullException("region");
|
if (region == null) throw new System.ArgumentNullException("region");
|
||||||
|
|
||||||
// (AtlasAttachmentLoader.cs)
|
// (AtlasAttachmentLoader.cs)
|
||||||
attachment.RendererObject = region;
|
attachment.RendererObject = region;
|
||||||
@ -86,7 +86,7 @@ namespace Spine.Unity.Modules.AttachmentTools {
|
|||||||
|
|
||||||
/// <summary>Sets the region (image) of a MeshAttachment</summary>
|
/// <summary>Sets the region (image) of a MeshAttachment</summary>
|
||||||
public static void SetRegion (this MeshAttachment attachment, AtlasRegion region, bool updateUVs = true) {
|
public static void SetRegion (this MeshAttachment attachment, AtlasRegion region, bool updateUVs = true) {
|
||||||
if (region == null) throw new System.ArgumentNullException("region");
|
if (region == null) throw new System.ArgumentNullException("region");
|
||||||
|
|
||||||
// (AtlasAttachmentLoader.cs)
|
// (AtlasAttachmentLoader.cs)
|
||||||
attachment.RendererObject = region;
|
attachment.RendererObject = region;
|
||||||
@ -395,7 +395,7 @@ namespace Spine.Unity.Modules.AttachmentTools {
|
|||||||
/// Fills the outputAttachments list with new attachment objects based on the attachments in sourceAttachments, but mapped to a new single texture using the same material.</summary>
|
/// Fills the outputAttachments list with new attachment objects based on the attachments in sourceAttachments, but mapped to a new single texture using the same material.</summary>
|
||||||
/// <param name="sourceAttachments">The list of attachments to be repacked.</param>
|
/// <param name="sourceAttachments">The list of attachments to be repacked.</param>
|
||||||
/// <param name = "outputAttachments">The List(Attachment) to populate with the newly created Attachment objects.</param>
|
/// <param name = "outputAttachments">The List(Attachment) to populate with the newly created Attachment objects.</param>
|
||||||
///
|
///
|
||||||
/// <param name="materialPropertySource">May be null. If no Material property source is provided, no special </param>
|
/// <param name="materialPropertySource">May be null. If no Material property source is provided, no special </param>
|
||||||
public static void GetRepackedAttachments (List<Attachment> sourceAttachments, List<Attachment> outputAttachments, Material materialPropertySource, out Material outputMaterial, out Texture2D outputTexture, int maxAtlasSize = 1024, int padding = 2, TextureFormat textureFormat = SpineTextureFormat, bool mipmaps = UseMipMaps, string newAssetName = "Repacked Attachments", bool clearCache = false, bool useOriginalNonrenderables = true) {
|
public static void GetRepackedAttachments (List<Attachment> sourceAttachments, List<Attachment> outputAttachments, Material materialPropertySource, out Material outputMaterial, out Texture2D outputTexture, int maxAtlasSize = 1024, int padding = 2, TextureFormat textureFormat = SpineTextureFormat, bool mipmaps = UseMipMaps, string newAssetName = "Repacked Attachments", bool clearCache = false, bool useOriginalNonrenderables = true) {
|
||||||
if (sourceAttachments == null) throw new System.ArgumentNullException("sourceAttachments");
|
if (sourceAttachments == null) throw new System.ArgumentNullException("sourceAttachments");
|
||||||
@ -413,7 +413,7 @@ namespace Spine.Unity.Modules.AttachmentTools {
|
|||||||
int newRegionIndex = 0;
|
int newRegionIndex = 0;
|
||||||
for (int i = 0, n = sourceAttachments.Count; i < n; i++) {
|
for (int i = 0, n = sourceAttachments.Count; i < n; i++) {
|
||||||
var originalAttachment = sourceAttachments[i];
|
var originalAttachment = sourceAttachments[i];
|
||||||
|
|
||||||
if (IsRenderable(originalAttachment)) {
|
if (IsRenderable(originalAttachment)) {
|
||||||
var newAttachment = originalAttachment.GetClone(true);
|
var newAttachment = originalAttachment.GetClone(true);
|
||||||
var region = newAttachment.GetRegion();
|
var region = newAttachment.GetRegion();
|
||||||
@ -524,7 +524,7 @@ namespace Spine.Unity.Modules.AttachmentTools {
|
|||||||
newSkin.AddAttachment(originalKey.slotIndex, originalKey.name, newAttachment);
|
newSkin.AddAttachment(originalKey.slotIndex, originalKey.name, newAttachment);
|
||||||
} else {
|
} else {
|
||||||
newSkin.AddAttachment(originalKey.slotIndex, originalKey.name, useOriginalNonrenderables ? originalAttachment : originalAttachment.GetClone(true));
|
newSkin.AddAttachment(originalKey.slotIndex, originalKey.name, useOriginalNonrenderables ? originalAttachment : originalAttachment.GetClone(true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fill a new texture with the collected attachment textures.
|
// Fill a new texture with the collected attachment textures.
|
||||||
@ -657,7 +657,7 @@ namespace Spine.Unity.Modules.AttachmentTools {
|
|||||||
/// Returns a Rect of the AtlasRegion according to Spine texture coordinates. (x-right, y-down)</summary>
|
/// Returns a Rect of the AtlasRegion according to Spine texture coordinates. (x-right, y-down)</summary>
|
||||||
static Rect GetSpineAtlasRect (this AtlasRegion region, bool includeRotate = true) {
|
static Rect GetSpineAtlasRect (this AtlasRegion region, bool includeRotate = true) {
|
||||||
if (includeRotate && region.rotate)
|
if (includeRotate && region.rotate)
|
||||||
return new Rect(region.x, region.y, region.height, region.width);
|
return new Rect(region.x, region.y, region.height, region.width);
|
||||||
else
|
else
|
||||||
return new Rect(region.x, region.y, region.width, region.height);
|
return new Rect(region.x, region.y, region.width, region.height);
|
||||||
}
|
}
|
||||||
@ -684,7 +684,7 @@ namespace Spine.Unity.Modules.AttachmentTools {
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a new Spine AtlasRegion according to a Unity UV Rect (x-right, y-up, uv-normalized).</summary>
|
/// Creates a new Spine AtlasRegion according to a Unity UV Rect (x-right, y-up, uv-normalized).</summary>
|
||||||
static AtlasRegion UVRectToAtlasRegion (Rect uvRect, string name, AtlasPage page, float offsetX, float offsetY, bool rotate) {
|
static AtlasRegion UVRectToAtlasRegion (Rect uvRect, string name, AtlasPage page, float offsetX, float offsetY, bool rotate) {
|
||||||
var tr = UVRectToTextureRect(uvRect, page.width, page.height);
|
var tr = UVRectToTextureRect(uvRect, page.width, page.height);
|
||||||
var rr = tr.SpineUnityFlipRect(page.height);
|
var rr = tr.SpineUnityFlipRect(page.height);
|
||||||
|
|
||||||
@ -875,7 +875,7 @@ namespace Spine.Unity.Modules.AttachmentTools {
|
|||||||
public static Attachment GetClone (this Attachment o, bool cloneMeshesAsLinked) {
|
public static Attachment GetClone (this Attachment o, bool cloneMeshesAsLinked) {
|
||||||
var regionAttachment = o as RegionAttachment;
|
var regionAttachment = o as RegionAttachment;
|
||||||
if (regionAttachment != null)
|
if (regionAttachment != null)
|
||||||
return regionAttachment.GetClone();
|
return regionAttachment.GetClone();
|
||||||
|
|
||||||
var meshAttachment = o as MeshAttachment;
|
var meshAttachment = o as MeshAttachment;
|
||||||
if (meshAttachment != null)
|
if (meshAttachment != null)
|
||||||
|
|||||||
@ -0,0 +1,9 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: baf1d09e18b500d41a714f6207ddda2d
|
||||||
|
folderAsset: yes
|
||||||
|
timeCreated: 1536402197
|
||||||
|
licenseType: Pro
|
||||||
|
DefaultImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@ -0,0 +1,9 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 22c0225612a65ee4fb15bad49f644762
|
||||||
|
timeCreated: 1536404361
|
||||||
|
licenseType: Pro
|
||||||
|
NativeFormatImporter:
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@ -0,0 +1,9 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4deba332d47209e4780b3c5fcf0e3745
|
||||||
|
timeCreated: 1496447909
|
||||||
|
licenseType: Free
|
||||||
|
NativeFormatImporter:
|
||||||
|
mainObjectFileID: 2100000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,106 @@
|
|||||||
|
// Spine/Skeleton PMA Screen
|
||||||
|
// - single color multiply tint
|
||||||
|
// - unlit
|
||||||
|
// - Premultiplied alpha Multiply blending
|
||||||
|
// - No depth, no backface culling, no fog.
|
||||||
|
// - ShadowCaster pass
|
||||||
|
|
||||||
|
Shader "Spine/Blend Modes/Skeleton PMA Additive" {
|
||||||
|
Properties {
|
||||||
|
_Color ("Tint Color", Color) = (1,1,1,1)
|
||||||
|
[NoScaleOffset] _MainTex ("MainTex", 2D) = "black" {}
|
||||||
|
[Toggle(_STRAIGHT_ALPHA_INPUT)] _StraightAlphaInput("Straight Alpha Texture", Int) = 0
|
||||||
|
_Cutoff ("Shadow alpha cutoff", Range(0,1)) = 0.1
|
||||||
|
}
|
||||||
|
|
||||||
|
SubShader {
|
||||||
|
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
|
||||||
|
LOD 100
|
||||||
|
|
||||||
|
Fog { Mode Off }
|
||||||
|
Cull Off
|
||||||
|
ZWrite Off
|
||||||
|
Blend One One
|
||||||
|
Lighting Off
|
||||||
|
|
||||||
|
Pass {
|
||||||
|
CGPROGRAM
|
||||||
|
#pragma shader_feature _ _STRAIGHT_ALPHA_INPUT
|
||||||
|
#pragma vertex vert
|
||||||
|
#pragma fragment frag
|
||||||
|
#include "UnityCG.cginc"
|
||||||
|
uniform sampler2D _MainTex;
|
||||||
|
uniform float4 _Color;
|
||||||
|
|
||||||
|
struct VertexInput {
|
||||||
|
float4 vertex : POSITION;
|
||||||
|
float2 uv : TEXCOORD0;
|
||||||
|
float4 vertexColor : COLOR;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VertexOutput {
|
||||||
|
float4 pos : SV_POSITION;
|
||||||
|
float2 uv : TEXCOORD0;
|
||||||
|
float4 vertexColor : COLOR;
|
||||||
|
};
|
||||||
|
|
||||||
|
VertexOutput vert (VertexInput v) {
|
||||||
|
VertexOutput o;
|
||||||
|
o.pos = UnityObjectToClipPos(v.vertex);
|
||||||
|
o.uv = v.uv;
|
||||||
|
o.vertexColor = v.vertexColor * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor.
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 frag (VertexOutput i) : COLOR {
|
||||||
|
float4 texColor = tex2D(_MainTex, i.uv);
|
||||||
|
|
||||||
|
#if defined(_STRAIGHT_ALPHA_INPUT)
|
||||||
|
texColor.rgb *= texColor.a;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return (texColor * i.vertexColor);
|
||||||
|
}
|
||||||
|
ENDCG
|
||||||
|
}
|
||||||
|
|
||||||
|
Pass {
|
||||||
|
Name "Caster"
|
||||||
|
Tags { "LightMode"="ShadowCaster" }
|
||||||
|
Offset 1, 1
|
||||||
|
|
||||||
|
ZWrite On
|
||||||
|
ZTest LEqual
|
||||||
|
|
||||||
|
CGPROGRAM
|
||||||
|
#pragma vertex vert
|
||||||
|
#pragma fragment frag
|
||||||
|
#pragma multi_compile_shadowcaster
|
||||||
|
#pragma fragmentoption ARB_precision_hint_fastest
|
||||||
|
#include "UnityCG.cginc"
|
||||||
|
struct v2f {
|
||||||
|
V2F_SHADOW_CASTER;
|
||||||
|
float2 uv : TEXCOORD1;
|
||||||
|
};
|
||||||
|
|
||||||
|
uniform float4 _MainTex_ST;
|
||||||
|
|
||||||
|
v2f vert (appdata_base v) {
|
||||||
|
v2f o;
|
||||||
|
TRANSFER_SHADOW_CASTER(o)
|
||||||
|
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
uniform sampler2D _MainTex;
|
||||||
|
uniform fixed _Cutoff;
|
||||||
|
|
||||||
|
float4 frag (v2f i) : COLOR {
|
||||||
|
fixed4 texcol = tex2D(_MainTex, i.uv);
|
||||||
|
clip(texcol.a - _Cutoff);
|
||||||
|
SHADOW_CASTER_FRAGMENT(i)
|
||||||
|
}
|
||||||
|
ENDCG
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 53efa1d97f5d9f74285d4330cda14e36
|
||||||
|
timeCreated: 1496446742
|
||||||
|
licenseType: Free
|
||||||
|
ShaderImporter:
|
||||||
|
defaultTextures: []
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -1,13 +1,11 @@
|
|||||||
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
|
// Spine/Skeleton PMA Multiply
|
||||||
|
|
||||||
// Spine/Skeleton PMA Multiply
|
|
||||||
// - single color multiply tint
|
// - single color multiply tint
|
||||||
// - unlit
|
// - unlit
|
||||||
// - Premultiplied alpha Multiply blending
|
// - Premultiplied alpha Multiply blending
|
||||||
// - No depth, no backface culling, no fog.
|
// - No depth, no backface culling, no fog.
|
||||||
// - ShadowCaster pass
|
// - ShadowCaster pass
|
||||||
|
|
||||||
Shader "Spine/Skeleton PMA Multiply" {
|
Shader "Spine/Blend Modes/Skeleton PMA Multiply" {
|
||||||
Properties {
|
Properties {
|
||||||
_Color ("Tint Color", Color) = (1,1,1,1)
|
_Color ("Tint Color", Color) = (1,1,1,1)
|
||||||
[NoScaleOffset] _MainTex ("MainTex", 2D) = "black" {}
|
[NoScaleOffset] _MainTex ("MainTex", 2D) = "black" {}
|
||||||
@ -1,11 +1,11 @@
|
|||||||
// Spine/Skeleton PMA Multiply
|
// Spine/Skeleton PMA Screen
|
||||||
// - single color multiply tint
|
// - single color multiply tint
|
||||||
// - unlit
|
// - unlit
|
||||||
// - Premultiplied alpha Multiply blending
|
// - Premultiplied alpha Multiply blending
|
||||||
// - No depth, no backface culling, no fog.
|
// - No depth, no backface culling, no fog.
|
||||||
// - ShadowCaster pass
|
// - ShadowCaster pass
|
||||||
|
|
||||||
Shader "Spine/Skeleton PMA Screen" {
|
Shader "Spine/Blend Modes/Skeleton PMA Screen" {
|
||||||
Properties {
|
Properties {
|
||||||
_Color ("Tint Color", Color) = (1,1,1,1)
|
_Color ("Tint Color", Color) = (1,1,1,1)
|
||||||
[NoScaleOffset] _MainTex ("MainTex", 2D) = "black" {}
|
[NoScaleOffset] _MainTex ("MainTex", 2D) = "black" {}
|
||||||
@ -98,6 +98,27 @@ namespace Spine.Unity {
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region Skeleton
|
||||||
|
/// <summary>Sets the Skeleton's local scale using a UnityEngine.Vector2. If only individual components need to be set, set Skeleton.ScaleX or Skeleton.ScaleY.</summary>
|
||||||
|
public static void SetLocalScale (this Skeleton skeleton, Vector2 scale) {
|
||||||
|
skeleton.scaleX = scale.x;
|
||||||
|
skeleton.scaleY = scale.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Gets the internal bone matrix as a Unity bonespace-to-skeletonspace transformation matrix.</summary>
|
||||||
|
public static Matrix4x4 GetMatrix4x4 (this Bone bone) {
|
||||||
|
return new Matrix4x4 {
|
||||||
|
m00 = bone.a,
|
||||||
|
m01 = bone.b,
|
||||||
|
m03 = bone.worldX,
|
||||||
|
m10 = bone.c,
|
||||||
|
m11 = bone.d,
|
||||||
|
m13 = bone.worldY,
|
||||||
|
m33 = 1
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region Bone
|
#region Bone
|
||||||
/// <summary>Sets the bone's (local) X and Y according to a Vector2</summary>
|
/// <summary>Sets the bone's (local) X and Y according to a Vector2</summary>
|
||||||
public static void SetPosition (this Bone bone, Vector2 position) {
|
public static void SetPosition (this Bone bone, Vector2 position) {
|
||||||
@ -149,13 +170,9 @@ namespace Spine.Unity {
|
|||||||
return new Quaternion(0, 0, Mathf.Sin(halfRotation), Mathf.Cos(halfRotation));
|
return new Quaternion(0, 0, Mathf.Sin(halfRotation), Mathf.Cos(halfRotation));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Gets the internal bone matrix as a Unity bonespace-to-skeletonspace transformation matrix.</summary>
|
/// <summary>Returns the Skeleton's local scale as a UnityEngine.Vector2. If only individual components are needed, use Skeleton.ScaleX or Skeleton.ScaleY.</summary>
|
||||||
public static Matrix4x4 GetMatrix4x4 (this Bone bone) {
|
public static Vector2 GetLocalScale (this Skeleton skeleton) {
|
||||||
return new Matrix4x4 {
|
return new Vector2(skeleton.scaleX, skeleton.scaleY);
|
||||||
m00 = bone.a, m01 = bone.b, m03 = bone.worldX,
|
|
||||||
m10 = bone.c, m11 = bone.d, m13 = bone.worldY,
|
|
||||||
m33 = 1
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Calculates a 2x2 Transformation Matrix that can convert a skeleton-space position to a bone-local position.</summary>
|
/// <summary>Calculates a 2x2 Transformation Matrix that can convert a skeleton-space position to a bone-local position.</summary>
|
||||||
|
|||||||
@ -103,6 +103,7 @@ namespace Spine.Unity {
|
|||||||
int floatCount = floats.Length;
|
int floatCount = floats.Length;
|
||||||
|
|
||||||
Bounds bounds = new Bounds();
|
Bounds bounds = new Bounds();
|
||||||
|
|
||||||
bounds.center = new Vector3(floats[0], floats[1], 0);
|
bounds.center = new Vector3(floats[0], floats[1], 0);
|
||||||
for (int i = 2; i < floatCount; i += 2)
|
for (int i = 2; i < floatCount; i += 2)
|
||||||
bounds.Encapsulate(new Vector3(floats[i], floats[i + 1], 0));
|
bounds.Encapsulate(new Vector3(floats[i], floats[i + 1], 0));
|
||||||
@ -122,14 +123,7 @@ namespace Spine.Unity {
|
|||||||
void Update () {
|
void Update () {
|
||||||
var skeleton = skeletonRenderer.skeleton;
|
var skeleton = skeletonRenderer.skeleton;
|
||||||
if (boneRoot != null && skeleton != null) {
|
if (boneRoot != null && skeleton != null) {
|
||||||
Vector3 flipScale = Vector3.one;
|
boneRoot.localScale = new Vector3(skeleton.scaleX, skeleton.scaleY, 1f);
|
||||||
if (skeleton.scaleX < 0)
|
|
||||||
flipScale.x = -1;
|
|
||||||
|
|
||||||
if (skeleton.scaleY < 0)
|
|
||||||
flipScale.y = -1;
|
|
||||||
|
|
||||||
boneRoot.localScale = flipScale;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user