diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java
index 257809d9a..376f613ae 100644
--- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java
+++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java
@@ -51,7 +51,31 @@ import com.esotericsoftware.spine.Animation.Timeline;
* See Applying Animations in the Spine Runtimes Guide. */
public class AnimationState {
static private final Animation emptyAnimation = new Animation("", new Array(0), 0);
- static private final int SUBSEQUENT = 0, FIRST = 1, DIP = 2, DIP_MIX = 3;
+
+ /** 1) A previously applied timeline has set this property.
+ * Result: Mix from the current pose to the timeline pose. */
+ static private final int SUBSEQUENT = 0;
+ /** 1) This is the first timeline to set this property.
+ * 2) The next track entry applied after this one does not have a timeline to set this property.
+ * Result: Mix from the setup pose to the timeline pose. */
+ static private final int FIRST = 1;
+ /** 1) This is the first timeline to set this property.
+ * 2) The next track entry to be applied does have a timeline to set this property.
+ * 3) The next track entry after that one does not have a timeline to set this property.
+ * Result: Mix from the setup pose to the timeline pose, but avoid the "dipping" problem by not using the mix percentage. This
+ * means the timeline pose won't mix out toward the setup pose. A subsequent timeline will set this property using a mix. */
+ static private final int DIP = 2;
+ /** 1) This is the first timeline to set this property.
+ * 2) The next track entry to be applied does have a timeline to set this property.
+ * 3) The next track entry after that one does have a timeline to set this property.
+ * 4) timelineDipMix stores the first subsequent track entry that does not have a timeline to set this property.
+ * Result: This is the same as DIP except the mix percentage from the timelineDipMix track entry is used. This handles when
+ * more than 2 track entries in a row have a timeline which sets the same property.
+ * Eg, A -> B -> C -> D where A, B, and C have a timeline to set the same property, but D does not. When A is applied, A's mix
+ * percentage is not used to avoid dipping, however a later track entry (D, the first entry without a timeline which sets the
+ * property) is actually mixing out A (which affects B and C). Without using D's mix percentage, A would be applied fully until
+ * mixed out, causing snapping. */
+ static private final int DIP_MIX = 3;
private AnimationStateData data;
final Array tracks = new Array();