mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-07 03:06:55 +08:00
[unity] Moved Timeline module to a separate Package com.esotericsoftware.spine.timeline. Activated asmdef files by default again in spine-unity, added asmdef files to timeline package. Fixed compile errors when asmdef files are active. Cleanup of no longer necessary asmdef file modifying code.
This commit is contained in:
parent
08f1741e2b
commit
d8808fb8ce
@ -43,7 +43,7 @@ namespace Spine.Unity.Examples {
|
|||||||
|
|
||||||
public override void Apply (SkeletonData skeletonData) {
|
public override void Apply (SkeletonData skeletonData) {
|
||||||
if (matchAllAnimations)
|
if (matchAllAnimations)
|
||||||
AnimationTools.MatchAnimationTimelines(skeletonData.animations, skeletonData);
|
AnimationTools.MatchAnimationTimelines(skeletonData.Animations, skeletonData);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class AnimationTools {
|
public static class AnimationTools {
|
||||||
@ -63,7 +63,7 @@ namespace Spine.Unity.Examples {
|
|||||||
// and a collection of dummy timelines that can be used to fill-in missing items.
|
// and a collection of dummy timelines that can be used to fill-in missing items.
|
||||||
var timelineDictionary = new Dictionary<int, Spine.Timeline>();
|
var timelineDictionary = new Dictionary<int, Spine.Timeline>();
|
||||||
foreach (var animation in animations) {
|
foreach (var animation in animations) {
|
||||||
foreach (var timeline in animation.timelines) {
|
foreach (var timeline in animation.Timelines) {
|
||||||
if (timeline is EventTimeline) continue;
|
if (timeline is EventTimeline) continue;
|
||||||
|
|
||||||
int propertyID = timeline.PropertyId;
|
int propertyID = timeline.PropertyId;
|
||||||
@ -78,12 +78,12 @@ namespace Spine.Unity.Examples {
|
|||||||
var currentAnimationIDs = new HashSet<int>();
|
var currentAnimationIDs = new HashSet<int>();
|
||||||
foreach (var animation in animations) {
|
foreach (var animation in animations) {
|
||||||
currentAnimationIDs.Clear();
|
currentAnimationIDs.Clear();
|
||||||
foreach (var timeline in animation.timelines) {
|
foreach (var timeline in animation.Timelines) {
|
||||||
if (timeline is EventTimeline) continue;
|
if (timeline is EventTimeline) continue;
|
||||||
currentAnimationIDs.Add(timeline.PropertyId);
|
currentAnimationIDs.Add(timeline.PropertyId);
|
||||||
}
|
}
|
||||||
|
|
||||||
var animationTimelines = animation.timelines;
|
var animationTimelines = animation.Timelines;
|
||||||
foreach (int propertyID in idsToMatch) {
|
foreach (int propertyID in idsToMatch) {
|
||||||
if (!currentAnimationIDs.Contains(propertyID))
|
if (!currentAnimationIDs.Contains(propertyID))
|
||||||
animationTimelines.Add(timelineDictionary[propertyID]);
|
animationTimelines.Add(timelineDictionary[propertyID]);
|
||||||
@ -100,116 +100,98 @@ namespace Spine.Unity.Examples {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static Timeline GetFillerTimeline (Timeline timeline, SkeletonData skeletonData) {
|
static Timeline GetFillerTimeline (Timeline timeline, SkeletonData skeletonData) {
|
||||||
int propertyID = timeline.PropertyId;
|
if (timeline is RotateTimeline)
|
||||||
int tt = propertyID >> 24;
|
return GetFillerTimeline((RotateTimeline)timeline, skeletonData);
|
||||||
var timelineType = (TimelineType)tt;
|
if (timeline is TranslateTimeline)
|
||||||
|
return GetFillerTimeline((TranslateTimeline)timeline, skeletonData);
|
||||||
switch (timelineType) {
|
if (timeline is ScaleTimeline)
|
||||||
// Bone
|
return GetFillerTimeline((ScaleTimeline)timeline, skeletonData);
|
||||||
case TimelineType.Rotate:
|
if (timeline is ShearTimeline)
|
||||||
return GetFillerTimeline((RotateTimeline)timeline, skeletonData);
|
return GetFillerTimeline((ShearTimeline)timeline, skeletonData);
|
||||||
case TimelineType.Translate:
|
if (timeline is AttachmentTimeline)
|
||||||
return GetFillerTimeline((TranslateTimeline)timeline, skeletonData);
|
return GetFillerTimeline((AttachmentTimeline)timeline, skeletonData);
|
||||||
case TimelineType.Scale:
|
if (timeline is ColorTimeline)
|
||||||
return GetFillerTimeline((ScaleTimeline)timeline, skeletonData);
|
return GetFillerTimeline((ColorTimeline)timeline, skeletonData);
|
||||||
case TimelineType.Shear:
|
if (timeline is TwoColorTimeline)
|
||||||
return GetFillerTimeline((ShearTimeline)timeline, skeletonData);
|
return GetFillerTimeline((TwoColorTimeline)timeline, skeletonData);
|
||||||
|
if (timeline is DeformTimeline)
|
||||||
// Slot
|
return GetFillerTimeline((DeformTimeline)timeline, skeletonData);
|
||||||
case TimelineType.Attachment:
|
if (timeline is DrawOrderTimeline)
|
||||||
return GetFillerTimeline((AttachmentTimeline)timeline, skeletonData);
|
return GetFillerTimeline((DrawOrderTimeline)timeline, skeletonData);
|
||||||
case TimelineType.Color:
|
if (timeline is IkConstraintTimeline)
|
||||||
return GetFillerTimeline((ColorTimeline)timeline, skeletonData);
|
return GetFillerTimeline((IkConstraintTimeline)timeline, skeletonData);
|
||||||
case TimelineType.TwoColor:
|
if (timeline is TransformConstraintTimeline)
|
||||||
return GetFillerTimeline((TwoColorTimeline)timeline, skeletonData);
|
return GetFillerTimeline((TransformConstraintTimeline)timeline, skeletonData);
|
||||||
case TimelineType.Deform:
|
if (timeline is PathConstraintPositionTimeline)
|
||||||
return GetFillerTimeline((DeformTimeline)timeline, skeletonData);
|
return GetFillerTimeline((PathConstraintPositionTimeline)timeline, skeletonData);
|
||||||
|
if (timeline is PathConstraintSpacingTimeline)
|
||||||
// Skeleton
|
return GetFillerTimeline((PathConstraintSpacingTimeline)timeline, skeletonData);
|
||||||
case TimelineType.DrawOrder:
|
if (timeline is PathConstraintMixTimeline)
|
||||||
return GetFillerTimeline((DrawOrderTimeline)timeline, skeletonData);
|
return GetFillerTimeline((PathConstraintMixTimeline)timeline, skeletonData);
|
||||||
|
|
||||||
// IK Constraint
|
|
||||||
case TimelineType.IkConstraint:
|
|
||||||
return GetFillerTimeline((IkConstraintTimeline)timeline, skeletonData);
|
|
||||||
|
|
||||||
// TransformConstraint
|
|
||||||
case TimelineType.TransformConstraint:
|
|
||||||
return GetFillerTimeline((TransformConstraintTimeline)timeline, skeletonData);
|
|
||||||
|
|
||||||
// Path Constraint
|
|
||||||
case TimelineType.PathConstraintPosition:
|
|
||||||
return GetFillerTimeline((PathConstraintPositionTimeline)timeline, skeletonData);
|
|
||||||
case TimelineType.PathConstraintSpacing:
|
|
||||||
return GetFillerTimeline((PathConstraintSpacingTimeline)timeline, skeletonData);
|
|
||||||
case TimelineType.PathConstraintMix:
|
|
||||||
return GetFillerTimeline((PathConstraintMixTimeline)timeline, skeletonData);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
static RotateTimeline GetFillerTimeline (RotateTimeline timeline, SkeletonData skeletonData) {
|
static RotateTimeline GetFillerTimeline (RotateTimeline timeline, SkeletonData skeletonData) {
|
||||||
var t = new RotateTimeline(1);
|
var t = new RotateTimeline(1);
|
||||||
t.boneIndex = timeline.boneIndex;
|
t.BoneIndex = timeline.BoneIndex;
|
||||||
t.SetFrame(0, 0, 0);
|
t.SetFrame(0, 0, 0);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
static TranslateTimeline GetFillerTimeline (TranslateTimeline timeline, SkeletonData skeletonData) {
|
static TranslateTimeline GetFillerTimeline (TranslateTimeline timeline, SkeletonData skeletonData) {
|
||||||
var t = new TranslateTimeline(1);
|
var t = new TranslateTimeline(1);
|
||||||
t.boneIndex = timeline.boneIndex;
|
t.BoneIndex = timeline.BoneIndex;
|
||||||
t.SetFrame(0, 0, 0, 0);
|
t.SetFrame(0, 0, 0, 0);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ScaleTimeline GetFillerTimeline (ScaleTimeline timeline, SkeletonData skeletonData) {
|
static ScaleTimeline GetFillerTimeline (ScaleTimeline timeline, SkeletonData skeletonData) {
|
||||||
var t = new ScaleTimeline(1);
|
var t = new ScaleTimeline(1);
|
||||||
t.boneIndex = timeline.boneIndex;
|
t.BoneIndex = timeline.BoneIndex;
|
||||||
t.SetFrame(0, 0, 0, 0);
|
t.SetFrame(0, 0, 0, 0);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ShearTimeline GetFillerTimeline (ShearTimeline timeline, SkeletonData skeletonData) {
|
static ShearTimeline GetFillerTimeline (ShearTimeline timeline, SkeletonData skeletonData) {
|
||||||
var t = new ShearTimeline(1);
|
var t = new ShearTimeline(1);
|
||||||
t.boneIndex = timeline.boneIndex;
|
t.BoneIndex = timeline.BoneIndex;
|
||||||
t.SetFrame(0, 0, 0, 0);
|
t.SetFrame(0, 0, 0, 0);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
static AttachmentTimeline GetFillerTimeline (AttachmentTimeline timeline, SkeletonData skeletonData) {
|
static AttachmentTimeline GetFillerTimeline (AttachmentTimeline timeline, SkeletonData skeletonData) {
|
||||||
var t = new AttachmentTimeline(1);
|
var t = new AttachmentTimeline(1);
|
||||||
t.slotIndex = timeline.slotIndex;
|
t.SlotIndex = timeline.SlotIndex;
|
||||||
var slotData = skeletonData.slots.Items[t.slotIndex];
|
var slotData = skeletonData.Slots.Items[t.SlotIndex];
|
||||||
t.SetFrame(0, 0, slotData.attachmentName);
|
t.SetFrame(0, 0, slotData.AttachmentName);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ColorTimeline GetFillerTimeline (ColorTimeline timeline, SkeletonData skeletonData) {
|
static ColorTimeline GetFillerTimeline (ColorTimeline timeline, SkeletonData skeletonData) {
|
||||||
var t = new ColorTimeline(1);
|
var t = new ColorTimeline(1);
|
||||||
t.slotIndex = timeline.slotIndex;
|
t.SlotIndex = timeline.SlotIndex;
|
||||||
var slotData = skeletonData.slots.Items[t.slotIndex];
|
var slotData = skeletonData.Slots.Items[t.SlotIndex];
|
||||||
t.SetFrame(0, 0, slotData.r, slotData.g, slotData.b, slotData.a);
|
t.SetFrame(0, 0, slotData.R, slotData.G, slotData.B, slotData.A);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
static TwoColorTimeline GetFillerTimeline (TwoColorTimeline timeline, SkeletonData skeletonData) {
|
static TwoColorTimeline GetFillerTimeline (TwoColorTimeline timeline, SkeletonData skeletonData) {
|
||||||
var t = new TwoColorTimeline(1);
|
var t = new TwoColorTimeline(1);
|
||||||
t.slotIndex = timeline.slotIndex;
|
t.SlotIndex = timeline.SlotIndex;
|
||||||
var slotData = skeletonData.slots.Items[t.slotIndex];
|
var slotData = skeletonData.Slots.Items[t.SlotIndex];
|
||||||
t.SetFrame(0, 0, slotData.r, slotData.g, slotData.b, slotData.a, slotData.r2, slotData.g2, slotData.b2);
|
t.SetFrame(0, 0, slotData.R, slotData.G, slotData.B, slotData.A, slotData.R2, slotData.G2, slotData.B2);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
static DeformTimeline GetFillerTimeline (DeformTimeline timeline, SkeletonData skeletonData) {
|
static DeformTimeline GetFillerTimeline (DeformTimeline timeline, SkeletonData skeletonData) {
|
||||||
var t = new DeformTimeline(1);
|
var t = new DeformTimeline(1);
|
||||||
t.slotIndex = timeline.slotIndex;
|
t.SlotIndex = timeline.SlotIndex;
|
||||||
t.attachment = timeline.attachment;
|
t.Attachment = timeline.Attachment;
|
||||||
|
|
||||||
if (t.attachment.IsWeighted()) {
|
if (t.Attachment.IsWeighted()) {
|
||||||
t.SetFrame(0, 0, new float[t.attachment.vertices.Length]);
|
t.SetFrame(0, 0, new float[t.Attachment.Vertices.Length]);
|
||||||
} else {
|
} else {
|
||||||
t.SetFrame(0, 0, t.attachment.vertices.Clone() as float[]);
|
t.SetFrame(0, 0, t.Attachment.Vertices.Clone() as float[]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return t;
|
return t;
|
||||||
@ -223,36 +205,36 @@ namespace Spine.Unity.Examples {
|
|||||||
|
|
||||||
static IkConstraintTimeline GetFillerTimeline (IkConstraintTimeline timeline, SkeletonData skeletonData) {
|
static IkConstraintTimeline GetFillerTimeline (IkConstraintTimeline timeline, SkeletonData skeletonData) {
|
||||||
var t = new IkConstraintTimeline(1);
|
var t = new IkConstraintTimeline(1);
|
||||||
var ikConstraintData = skeletonData.ikConstraints.Items[timeline.ikConstraintIndex];
|
var ikConstraintData = skeletonData.IkConstraints.Items[timeline.IkConstraintIndex];
|
||||||
t.SetFrame(0, 0, ikConstraintData.mix, ikConstraintData.softness, ikConstraintData.bendDirection, ikConstraintData.compress, ikConstraintData.stretch);
|
t.SetFrame(0, 0, ikConstraintData.Mix, ikConstraintData.Softness, ikConstraintData.BendDirection, ikConstraintData.Compress, ikConstraintData.Stretch);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
static TransformConstraintTimeline GetFillerTimeline (TransformConstraintTimeline timeline, SkeletonData skeletonData) {
|
static TransformConstraintTimeline GetFillerTimeline (TransformConstraintTimeline timeline, SkeletonData skeletonData) {
|
||||||
var t = new TransformConstraintTimeline(1);
|
var t = new TransformConstraintTimeline(1);
|
||||||
var data = skeletonData.transformConstraints.Items[timeline.transformConstraintIndex];
|
var data = skeletonData.TransformConstraints.Items[timeline.TransformConstraintIndex];
|
||||||
t.SetFrame(0, 0, data.rotateMix, data.translateMix, data.scaleMix, data.shearMix);
|
t.SetFrame(0, 0, data.RotateMix, data.TranslateMix, data.ScaleMix, data.ShearMix);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PathConstraintPositionTimeline GetFillerTimeline (PathConstraintPositionTimeline timeline, SkeletonData skeletonData) {
|
static PathConstraintPositionTimeline GetFillerTimeline (PathConstraintPositionTimeline timeline, SkeletonData skeletonData) {
|
||||||
var t = new PathConstraintPositionTimeline(1);
|
var t = new PathConstraintPositionTimeline(1);
|
||||||
var data = skeletonData.pathConstraints.Items[timeline.pathConstraintIndex];
|
var data = skeletonData.PathConstraints.Items[timeline.PathConstraintIndex];
|
||||||
t.SetFrame(0, 0, data.position);
|
t.SetFrame(0, 0, data.Position);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PathConstraintSpacingTimeline GetFillerTimeline (PathConstraintSpacingTimeline timeline, SkeletonData skeletonData) {
|
static PathConstraintSpacingTimeline GetFillerTimeline (PathConstraintSpacingTimeline timeline, SkeletonData skeletonData) {
|
||||||
var t = new PathConstraintSpacingTimeline(1);
|
var t = new PathConstraintSpacingTimeline(1);
|
||||||
var data = skeletonData.pathConstraints.Items[timeline.pathConstraintIndex];
|
var data = skeletonData.PathConstraints.Items[timeline.PathConstraintIndex];
|
||||||
t.SetFrame(0, 0, data.spacing);
|
t.SetFrame(0, 0, data.Spacing);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PathConstraintMixTimeline GetFillerTimeline (PathConstraintMixTimeline timeline, SkeletonData skeletonData) {
|
static PathConstraintMixTimeline GetFillerTimeline (PathConstraintMixTimeline timeline, SkeletonData skeletonData) {
|
||||||
var t = new PathConstraintMixTimeline(1);
|
var t = new PathConstraintMixTimeline(1);
|
||||||
var data = skeletonData.pathConstraints.Items[timeline.pathConstraintIndex];
|
var data = skeletonData.PathConstraints.Items[timeline.PathConstraintIndex];
|
||||||
t.SetFrame(0, 0, data.rotateMix, data.translateMix);
|
t.SetFrame(0, 0, data.RotateMix, data.TranslateMix);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@ -110,7 +110,7 @@ namespace Spine.Unity.Examples {
|
|||||||
if (e.Float > 0)
|
if (e.Float > 0)
|
||||||
spawnInterval = e.Float;
|
spawnInterval = e.Float;
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(e.stringValue))
|
if (!string.IsNullOrEmpty(e.String))
|
||||||
this.color = HexToColor(e.String);
|
this.color = HexToColor(e.String);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -205,22 +205,22 @@ namespace Spine.Unity.Examples {
|
|||||||
if (disableIK) {
|
if (disableIK) {
|
||||||
var ikConstraints = skeleton.IkConstraints;
|
var ikConstraints = skeleton.IkConstraints;
|
||||||
for (int i = 0, n = ikConstraints.Count; i < n; i++)
|
for (int i = 0, n = ikConstraints.Count; i < n; i++)
|
||||||
ikConstraints.Items[i].mix = 0;
|
ikConstraints.Items[i].Mix = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (disableOtherConstraints) {
|
if (disableOtherConstraints) {
|
||||||
var transformConstraints = skeleton.transformConstraints;
|
var transformConstraints = skeleton.TransformConstraints;
|
||||||
for (int i = 0, n = transformConstraints.Count; i < n; i++) {
|
for (int i = 0, n = transformConstraints.Count; i < n; i++) {
|
||||||
transformConstraints.Items[i].rotateMix = 0;
|
transformConstraints.Items[i].RotateMix = 0;
|
||||||
transformConstraints.Items[i].scaleMix = 0;
|
transformConstraints.Items[i].ScaleMix = 0;
|
||||||
transformConstraints.Items[i].shearMix = 0;
|
transformConstraints.Items[i].ShearMix = 0;
|
||||||
transformConstraints.Items[i].translateMix = 0;
|
transformConstraints.Items[i].TranslateMix = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
var pathConstraints = skeleton.pathConstraints;
|
var pathConstraints = skeleton.PathConstraints;
|
||||||
for (int i = 0, n = pathConstraints.Count; i < n; i++) {
|
for (int i = 0, n = pathConstraints.Count; i < n; i++) {
|
||||||
pathConstraints.Items[i].rotateMix = 0;
|
pathConstraints.Items[i].RotateMix = 0;
|
||||||
pathConstraints.Items[i].translateMix = 0;
|
pathConstraints.Items[i].TranslateMix = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -277,7 +277,7 @@ namespace Spine.Unity.Examples {
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
void RecursivelyCreateBoneProxies (Bone b) {
|
void RecursivelyCreateBoneProxies (Bone b) {
|
||||||
string boneName = b.data.name;
|
string boneName = b.Data.Name;
|
||||||
if (stopBoneNames.Contains(boneName))
|
if (stopBoneNames.Contains(boneName))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -288,7 +288,7 @@ namespace Spine.Unity.Examples {
|
|||||||
|
|
||||||
t.parent = transform;
|
t.parent = transform;
|
||||||
t.localPosition = new Vector3(b.WorldX, b.WorldY, 0);
|
t.localPosition = new Vector3(b.WorldX, b.WorldY, 0);
|
||||||
t.localRotation = Quaternion.Euler(0, 0, b.WorldRotationX - b.shearX);
|
t.localRotation = Quaternion.Euler(0, 0, b.WorldRotationX - b.ShearX);
|
||||||
t.localScale = new Vector3(b.WorldScaleX, b.WorldScaleY, 1);
|
t.localScale = new Vector3(b.WorldScaleX, b.WorldScaleY, 1);
|
||||||
|
|
||||||
// MITCH: You left "todo: proper ragdoll branching"
|
// MITCH: You left "todo: proper ragdoll branching"
|
||||||
@ -350,9 +350,9 @@ namespace Spine.Unity.Examples {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
b.x = Mathf.Lerp(b.x, boneLocalPosition.x, mix);
|
b.X = Mathf.Lerp(b.X, boneLocalPosition.x, mix);
|
||||||
b.y = Mathf.Lerp(b.y, boneLocalPosition.y, mix);
|
b.Y = Mathf.Lerp(b.Y, boneLocalPosition.y, mix);
|
||||||
b.rotation = Mathf.Lerp(b.rotation, boneLocalRotation, mix);
|
b.Rotation = Mathf.Lerp(b.Rotation, boneLocalRotation, mix);
|
||||||
//b.AppliedRotation = Mathf.Lerp(b.AppliedRotation, boneLocalRotation, mix);
|
//b.AppliedRotation = Mathf.Lerp(b.AppliedRotation, boneLocalRotation, mix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -394,7 +394,7 @@ namespace Spine.Unity.Examples {
|
|||||||
float a = b.AppliedRotation;
|
float a = b.AppliedRotation;
|
||||||
while (parent != null) {
|
while (parent != null) {
|
||||||
a += parent.AppliedRotation;
|
a += parent.AppliedRotation;
|
||||||
parent = parent.parent;
|
parent = parent.Parent;
|
||||||
}
|
}
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -200,22 +200,22 @@ namespace Spine.Unity.Examples {
|
|||||||
if (disableIK) {
|
if (disableIK) {
|
||||||
var ikConstraints = skeleton.IkConstraints;
|
var ikConstraints = skeleton.IkConstraints;
|
||||||
for (int i = 0, n = ikConstraints.Count; i < n; i++)
|
for (int i = 0, n = ikConstraints.Count; i < n; i++)
|
||||||
ikConstraints.Items[i].mix = 0;
|
ikConstraints.Items[i].Mix = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (disableOtherConstraints) {
|
if (disableOtherConstraints) {
|
||||||
var transformConstraints = skeleton.transformConstraints;
|
var transformConstraints = skeleton.TransformConstraints;
|
||||||
for (int i = 0, n = transformConstraints.Count; i < n; i++) {
|
for (int i = 0, n = transformConstraints.Count; i < n; i++) {
|
||||||
transformConstraints.Items[i].rotateMix = 0;
|
transformConstraints.Items[i].RotateMix = 0;
|
||||||
transformConstraints.Items[i].scaleMix = 0;
|
transformConstraints.Items[i].ScaleMix = 0;
|
||||||
transformConstraints.Items[i].shearMix = 0;
|
transformConstraints.Items[i].ShearMix = 0;
|
||||||
transformConstraints.Items[i].translateMix = 0;
|
transformConstraints.Items[i].TranslateMix = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
var pathConstraints = skeleton.pathConstraints;
|
var pathConstraints = skeleton.PathConstraints;
|
||||||
for (int i = 0, n = pathConstraints.Count; i < n; i++) {
|
for (int i = 0, n = pathConstraints.Count; i < n; i++) {
|
||||||
pathConstraints.Items[i].rotateMix = 0;
|
pathConstraints.Items[i].RotateMix = 0;
|
||||||
pathConstraints.Items[i].translateMix = 0;
|
pathConstraints.Items[i].TranslateMix = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -272,7 +272,7 @@ namespace Spine.Unity.Examples {
|
|||||||
|
|
||||||
/// <summary>Generates the ragdoll simulation's Transform and joint setup.</summary>
|
/// <summary>Generates the ragdoll simulation's Transform and joint setup.</summary>
|
||||||
void RecursivelyCreateBoneProxies (Bone b) {
|
void RecursivelyCreateBoneProxies (Bone b) {
|
||||||
string boneName = b.data.name;
|
string boneName = b.Data.Name;
|
||||||
if (stopBoneNames.Contains(boneName))
|
if (stopBoneNames.Contains(boneName))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -283,13 +283,13 @@ namespace Spine.Unity.Examples {
|
|||||||
|
|
||||||
t.parent = transform;
|
t.parent = transform;
|
||||||
t.localPosition = new Vector3(b.WorldX, b.WorldY, 0);
|
t.localPosition = new Vector3(b.WorldX, b.WorldY, 0);
|
||||||
t.localRotation = Quaternion.Euler(0, 0, b.WorldRotationX - b.shearX);
|
t.localRotation = Quaternion.Euler(0, 0, b.WorldRotationX - b.ShearX);
|
||||||
t.localScale = new Vector3(b.WorldScaleX, b.WorldScaleY, 0);
|
t.localScale = new Vector3(b.WorldScaleX, b.WorldScaleY, 0);
|
||||||
|
|
||||||
// MITCH: You left "todo: proper ragdoll branching"
|
// MITCH: You left "todo: proper ragdoll branching"
|
||||||
var colliders = AttachBoundingBoxRagdollColliders(b, boneGameObject, skeleton, this.gravityScale);
|
var colliders = AttachBoundingBoxRagdollColliders(b, boneGameObject, skeleton, this.gravityScale);
|
||||||
if (colliders.Count == 0) {
|
if (colliders.Count == 0) {
|
||||||
float length = b.data.length;
|
float length = b.Data.Length;
|
||||||
if (length == 0) {
|
if (length == 0) {
|
||||||
var circle = boneGameObject.AddComponent<CircleCollider2D>();
|
var circle = boneGameObject.AddComponent<CircleCollider2D>();
|
||||||
circle.radius = thickness * 0.5f;
|
circle.radius = thickness * 0.5f;
|
||||||
@ -348,9 +348,9 @@ namespace Spine.Unity.Examples {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
b.x = Mathf.Lerp(b.x, boneLocalPosition.x, mix);
|
b.X = Mathf.Lerp(b.X, boneLocalPosition.x, mix);
|
||||||
b.y = Mathf.Lerp(b.y, boneLocalPosition.y, mix);
|
b.Y = Mathf.Lerp(b.Y, boneLocalPosition.y, mix);
|
||||||
b.rotation = Mathf.Lerp(b.rotation, boneLocalRotation, mix);
|
b.Rotation = Mathf.Lerp(b.Rotation, boneLocalRotation, mix);
|
||||||
//b.AppliedRotation = Mathf.Lerp(b.AppliedRotation, boneLocalRotation, mix);
|
//b.AppliedRotation = Mathf.Lerp(b.AppliedRotation, boneLocalRotation, mix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -362,7 +362,7 @@ namespace Spine.Unity.Examples {
|
|||||||
|
|
||||||
var skinEntries = new List<Skin.SkinEntry>();
|
var skinEntries = new List<Skin.SkinEntry>();
|
||||||
foreach (Slot slot in skeleton.Slots) {
|
foreach (Slot slot in skeleton.Slots) {
|
||||||
if (slot.bone == b) {
|
if (slot.Bone == b) {
|
||||||
skin.GetAttachments(skeleton.Slots.IndexOf(slot), skinEntries);
|
skin.GetAttachments(skeleton.Slots.IndexOf(slot), skinEntries);
|
||||||
|
|
||||||
bool bbAttachmentAdded = false;
|
bool bbAttachmentAdded = false;
|
||||||
@ -391,7 +391,7 @@ namespace Spine.Unity.Examples {
|
|||||||
float a = b.AppliedRotation;
|
float a = b.AppliedRotation;
|
||||||
while (parent != null) {
|
while (parent != null) {
|
||||||
a += parent.AppliedRotation;
|
a += parent.AppliedRotation;
|
||||||
parent = parent.parent;
|
parent = parent.Parent;
|
||||||
}
|
}
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -47,10 +47,6 @@
|
|||||||
#define NEW_PREFERENCES_SETTINGS_PROVIDER
|
#define NEW_PREFERENCES_SETTINGS_PROVIDER
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if UNITY_2019_1_OR_NEWER
|
|
||||||
#define NEW_TIMELINE_AS_PACKAGE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|||||||
@ -47,10 +47,6 @@
|
|||||||
#define NEW_PREFERENCES_SETTINGS_PROVIDER
|
#define NEW_PREFERENCES_SETTINGS_PROVIDER
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if UNITY_2019_1_OR_NEWER
|
|
||||||
#define NEW_TIMELINE_AS_PACKAGE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@ -75,105 +71,6 @@ namespace Spine.Unity.Editor {
|
|||||||
SpineBuildEnvUtility.DisableBuildDefine(SPINE_TK2D_DEFINE);
|
SpineBuildEnvUtility.DisableBuildDefine(SPINE_TK2D_DEFINE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class SpinePackageDependencyUtility
|
|
||||||
{
|
|
||||||
public enum RequestState {
|
|
||||||
NoRequestIssued = 0,
|
|
||||||
InProgress,
|
|
||||||
Success,
|
|
||||||
Failure
|
|
||||||
}
|
|
||||||
|
|
||||||
#if NEW_TIMELINE_AS_PACKAGE
|
|
||||||
const string SPINE_TIMELINE_PACKAGE_DOWNLOADED_DEFINE = "SPINE_TIMELINE_PACKAGE_DOWNLOADED";
|
|
||||||
const string TIMELINE_PACKAGE_NAME = "com.unity.timeline";
|
|
||||||
const string TIMELINE_ASMDEF_DEPENDENCY_STRING = "\"Unity.Timeline\"";
|
|
||||||
static UnityEditor.PackageManager.Requests.AddRequest timelineRequest = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Enables Spine's Timeline components by downloading the Timeline Package in Unity 2019 and newer
|
|
||||||
/// and setting respective compile definitions once downloaded.
|
|
||||||
/// </summary>
|
|
||||||
internal static void EnableTimelineSupport () {
|
|
||||||
Debug.Log("Downloading Timeline package " + TIMELINE_PACKAGE_NAME + ".");
|
|
||||||
timelineRequest = UnityEditor.PackageManager.Client.Add(TIMELINE_PACKAGE_NAME);
|
|
||||||
// Note: unfortunately there is no callback provided, only polling support.
|
|
||||||
// So polling HandlePendingAsyncTimelineRequest() is necessary.
|
|
||||||
|
|
||||||
EditorApplication.update -= UpdateAsyncTimelineRequest;
|
|
||||||
EditorApplication.update += UpdateAsyncTimelineRequest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void UpdateAsyncTimelineRequest () {
|
|
||||||
HandlePendingAsyncTimelineRequest();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static RequestState HandlePendingAsyncTimelineRequest () {
|
|
||||||
if (timelineRequest == null)
|
|
||||||
return RequestState.NoRequestIssued;
|
|
||||||
|
|
||||||
var status = timelineRequest.Status;
|
|
||||||
if (status == UnityEditor.PackageManager.StatusCode.InProgress) {
|
|
||||||
return RequestState.InProgress;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
EditorApplication.update -= UpdateAsyncTimelineRequest;
|
|
||||||
timelineRequest = null;
|
|
||||||
if (status == UnityEditor.PackageManager.StatusCode.Failure) {
|
|
||||||
Debug.LogError("Download of package " + TIMELINE_PACKAGE_NAME + " failed!");
|
|
||||||
return RequestState.Failure;
|
|
||||||
}
|
|
||||||
else { // status == UnityEditor.PackageManager.StatusCode.Success
|
|
||||||
HandleSuccessfulTimelinePackageDownload();
|
|
||||||
return RequestState.Success;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static void DisableTimelineSupport () {
|
|
||||||
SpineBuildEnvUtility.DisableBuildDefine(SPINE_TIMELINE_PACKAGE_DOWNLOADED_DEFINE);
|
|
||||||
SpineBuildEnvUtility.RemoveDependencyFromAsmdefFile(TIMELINE_ASMDEF_DEPENDENCY_STRING);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static void HandleSuccessfulTimelinePackageDownload () {
|
|
||||||
|
|
||||||
#if !SPINE_TK2D
|
|
||||||
SpineBuildEnvUtility.EnableSpineAsmdefFiles();
|
|
||||||
#endif
|
|
||||||
SpineBuildEnvUtility.AddDependencyToAsmdefFile(TIMELINE_ASMDEF_DEPENDENCY_STRING);
|
|
||||||
SpineBuildEnvUtility.EnableBuildDefine(SPINE_TIMELINE_PACKAGE_DOWNLOADED_DEFINE);
|
|
||||||
|
|
||||||
ReimportTimelineScripts();
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static void ReimportTimelineScripts () {
|
|
||||||
// Note: unfortunately AssetDatabase::Refresh is not enough and
|
|
||||||
// ImportAsset on a dir does not have the desired effect.
|
|
||||||
List<string> searchStrings = new List<string>();
|
|
||||||
searchStrings.Add("SpineAnimationStateBehaviour t:script");
|
|
||||||
searchStrings.Add("SpineAnimationStateClip t:script");
|
|
||||||
searchStrings.Add("SpineAnimationStateMixerBehaviour t:script");
|
|
||||||
searchStrings.Add("SpineAnimationStateTrack t:script");
|
|
||||||
|
|
||||||
searchStrings.Add("SpineSkeletonFlipBehaviour t:script");
|
|
||||||
searchStrings.Add("SpineSkeletonFlipClip t:script");
|
|
||||||
searchStrings.Add("SpineSkeletonFlipMixerBehaviour t:script");
|
|
||||||
searchStrings.Add("SpineSkeletonFlipTrack t:script");
|
|
||||||
|
|
||||||
searchStrings.Add("SkeletonAnimationPlayableHandle t:script");
|
|
||||||
searchStrings.Add("SpinePlayableHandleBase t:script");
|
|
||||||
|
|
||||||
foreach (string searchString in searchStrings) {
|
|
||||||
string[] guids = AssetDatabase.FindAssets(searchString);
|
|
||||||
foreach (string guid in guids) {
|
|
||||||
string currentPath = AssetDatabase.GUIDToAssetPath(guid);
|
|
||||||
AssetDatabase.ImportAsset(currentPath, ImportAssetOptions.ForceUpdate);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class SpineBuildEnvUtility
|
public static class SpineBuildEnvUtility
|
||||||
@ -254,69 +151,6 @@ namespace Spine.Unity.Editor {
|
|||||||
SetAsmdefFileActive("spine-unity", true);
|
SetAsmdefFileActive("spine-unity", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void AddDependencyToAsmdefFile (string dependencyName) {
|
|
||||||
string asmdefName = "spine-unity";
|
|
||||||
string filePath = FindAsmdefFile(asmdefName);
|
|
||||||
if (string.IsNullOrEmpty(filePath))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (System.IO.File.Exists(filePath)) {
|
|
||||||
string fileContent = File.ReadAllText(filePath);
|
|
||||||
|
|
||||||
if (!fileContent.Contains("references")) {
|
|
||||||
string nameLine = string.Concat("\"name\": \"", asmdefName, "\"");
|
|
||||||
fileContent = fileContent.Replace(nameLine,
|
|
||||||
nameLine +
|
|
||||||
@",\n""references"": []");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!fileContent.Contains(dependencyName)) {
|
|
||||||
fileContent = fileContent.Replace(@"""references"": [",
|
|
||||||
@"""references"": [" + dependencyName);
|
|
||||||
File.WriteAllText(filePath, fileContent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void RemoveDependencyFromAsmdefFile (string dependencyName) {
|
|
||||||
string asmdefName = "spine-unity";
|
|
||||||
string filePath = FindAsmdefFile(asmdefName);
|
|
||||||
if (string.IsNullOrEmpty(filePath))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (System.IO.File.Exists(filePath)) {
|
|
||||||
string fileContent = File.ReadAllText(filePath);
|
|
||||||
// this simple implementation shall suffice for now.
|
|
||||||
if (fileContent.Contains(dependencyName)) {
|
|
||||||
fileContent = fileContent.Replace(dependencyName, "");
|
|
||||||
File.WriteAllText(filePath, fileContent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static string FindAsmdefFile (string filename) {
|
|
||||||
string filePath = FindAsmdefFile(filename, isDisabledFile: false);
|
|
||||||
if (string.IsNullOrEmpty(filePath))
|
|
||||||
filePath = FindAsmdefFile(filename, isDisabledFile: true);
|
|
||||||
return filePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static string FindAsmdefFile (string filename, bool isDisabledFile) {
|
|
||||||
|
|
||||||
string typeSearchString = isDisabledFile ? " t:TextAsset" : " t:AssemblyDefinitionAsset";
|
|
||||||
string extension = isDisabledFile ? ".txt" : ".asmdef";
|
|
||||||
string filenameWithExtension = filename + (isDisabledFile ? ".txt" : ".asmdef");
|
|
||||||
string[] guids = AssetDatabase.FindAssets(filename + typeSearchString);
|
|
||||||
foreach (string guid in guids) {
|
|
||||||
string currentPath = AssetDatabase.GUIDToAssetPath(guid);
|
|
||||||
if (!string.IsNullOrEmpty(currentPath)) {
|
|
||||||
if (System.IO.Path.GetFileName(currentPath) == filenameWithExtension)
|
|
||||||
return currentPath;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static void SetAsmdefFileActive (string filename, bool setActive) {
|
internal static void SetAsmdefFileActive (string filename, bool setActive) {
|
||||||
|
|
||||||
string typeSearchString = setActive ? " t:TextAsset" : " t:AssemblyDefinitionAsset";
|
string typeSearchString = setActive ? " t:TextAsset" : " t:AssemblyDefinitionAsset";
|
||||||
|
|||||||
@ -47,10 +47,6 @@
|
|||||||
#define NEW_PREFERENCES_SETTINGS_PROVIDER
|
#define NEW_PREFERENCES_SETTINGS_PROVIDER
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if UNITY_2019_1_OR_NEWER
|
|
||||||
#define NEW_TIMELINE_AS_PACKAGE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|||||||
@ -47,10 +47,6 @@
|
|||||||
#define NEW_PREFERENCES_SETTINGS_PROVIDER
|
#define NEW_PREFERENCES_SETTINGS_PROVIDER
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if UNITY_2019_1_OR_NEWER
|
|
||||||
#define NEW_TIMELINE_AS_PACKAGE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|||||||
@ -47,10 +47,6 @@
|
|||||||
#define NEW_PREFERENCES_SETTINGS_PROVIDER
|
#define NEW_PREFERENCES_SETTINGS_PROVIDER
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if UNITY_2019_1_OR_NEWER
|
|
||||||
#define NEW_TIMELINE_AS_PACKAGE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|||||||
@ -47,10 +47,6 @@
|
|||||||
#define NEW_PREFERENCES_SETTINGS_PROVIDER
|
#define NEW_PREFERENCES_SETTINGS_PROVIDER
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if UNITY_2019_1_OR_NEWER
|
|
||||||
#define NEW_TIMELINE_AS_PACKAGE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@ -251,22 +247,6 @@ namespace Spine.Unity.Editor {
|
|||||||
SceneView.RepaintAll();
|
SceneView.RepaintAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if NEW_TIMELINE_AS_PACKAGE
|
|
||||||
GUILayout.Space(20);
|
|
||||||
EditorGUILayout.LabelField("Timeline Support", EditorStyles.boldLabel);
|
|
||||||
using (new GUILayout.HorizontalScope()) {
|
|
||||||
EditorGUILayout.PrefixLabel("Timeline Package Support");
|
|
||||||
|
|
||||||
var requestState = SpineEditorUtilities.SpinePackageDependencyUtility.HandlePendingAsyncTimelineRequest();
|
|
||||||
using (new EditorGUI.DisabledGroupScope(requestState != SpineEditorUtilities.SpinePackageDependencyUtility.RequestState.NoRequestIssued)) {
|
|
||||||
if (GUILayout.Button("Enable", GUILayout.Width(64)))
|
|
||||||
SpineEditorUtilities.SpinePackageDependencyUtility.EnableTimelineSupport();
|
|
||||||
if (GUILayout.Button("Disable", GUILayout.Width(64)))
|
|
||||||
SpineEditorUtilities.SpinePackageDependencyUtility.DisableTimelineSupport();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
GUILayout.Space(20);
|
GUILayout.Space(20);
|
||||||
EditorGUILayout.LabelField("3rd Party Settings", EditorStyles.boldLabel);
|
EditorGUILayout.LabelField("3rd Party Settings", EditorStyles.boldLabel);
|
||||||
|
|||||||
@ -50,10 +50,6 @@
|
|||||||
#define NEW_PREFERENCES_SETTINGS_PROVIDER
|
#define NEW_PREFERENCES_SETTINGS_PROVIDER
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if UNITY_2019_1_OR_NEWER
|
|
||||||
#define NEW_TIMELINE_AS_PACKAGE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|||||||
@ -47,10 +47,6 @@
|
|||||||
#define NEW_PREFERENCES_SETTINGS_PROVIDER
|
#define NEW_PREFERENCES_SETTINGS_PROVIDER
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if UNITY_2019_1_OR_NEWER
|
|
||||||
#define NEW_TIMELINE_AS_PACKAGE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|||||||
@ -35,10 +35,6 @@
|
|||||||
#define NEW_PREFERENCES_SETTINGS_PROVIDER
|
#define NEW_PREFERENCES_SETTINGS_PROVIDER
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if UNITY_2019_1_OR_NEWER
|
|
||||||
#define NEW_TIMELINE_AS_PACKAGE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
@ -171,22 +167,6 @@ namespace Spine.Unity.Editor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if NEW_TIMELINE_AS_PACKAGE
|
|
||||||
GUILayout.Space(20);
|
|
||||||
EditorGUILayout.LabelField("Timeline Support", EditorStyles.boldLabel);
|
|
||||||
using (new GUILayout.HorizontalScope()) {
|
|
||||||
EditorGUILayout.PrefixLabel("Timeline Package Support");
|
|
||||||
|
|
||||||
var requestState = SpineEditorUtilities.SpinePackageDependencyUtility.HandlePendingAsyncTimelineRequest();
|
|
||||||
using (new EditorGUI.DisabledGroupScope(requestState != SpineEditorUtilities.SpinePackageDependencyUtility.RequestState.NoRequestIssued)) {
|
|
||||||
if (GUILayout.Button("Enable", GUILayout.Width(64)))
|
|
||||||
SpineEditorUtilities.SpinePackageDependencyUtility.EnableTimelineSupport();
|
|
||||||
if (GUILayout.Button("Disable", GUILayout.Width(64)))
|
|
||||||
SpineEditorUtilities.SpinePackageDependencyUtility.DisableTimelineSupport();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
GUILayout.Space(20);
|
GUILayout.Space(20);
|
||||||
EditorGUILayout.LabelField("3rd Party Settings", EditorStyles.boldLabel);
|
EditorGUILayout.LabelField("3rd Party Settings", EditorStyles.boldLabel);
|
||||||
using (new GUILayout.HorizontalScope()) {
|
using (new GUILayout.HorizontalScope()) {
|
||||||
|
|||||||
@ -222,7 +222,7 @@ namespace Spine.Unity {
|
|||||||
|
|
||||||
#region API
|
#region API
|
||||||
protected Skeleton skeleton;
|
protected Skeleton skeleton;
|
||||||
public Skeleton Skeleton { get { return skeleton; } internal set { skeleton = value; } }
|
public Skeleton Skeleton { get { return skeleton; } set { skeleton = value; } }
|
||||||
public SkeletonData SkeletonData { get { return skeleton == null ? null : skeleton.data; } }
|
public SkeletonData SkeletonData { get { return skeleton == null ? null : skeleton.data; } }
|
||||||
public bool IsValid { get { return skeleton != null; } }
|
public bool IsValid { get { return skeleton != null; } }
|
||||||
|
|
||||||
|
|||||||
@ -1,9 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 9192f99585e00e2468a2e2592cfce807
|
|
||||||
folderAsset: yes
|
|
||||||
timeCreated: 1505434717
|
|
||||||
licenseType: Free
|
|
||||||
DefaultImporter:
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@ -1,5 +1,7 @@
|
|||||||
// Upgrade NOTE: upgraded instancing buffer 'PerDrawSprite' to new syntax.
|
// Upgrade NOTE: upgraded instancing buffer 'PerDrawSprite' to new syntax.
|
||||||
|
|
||||||
|
// Upgrade NOTE: upgraded instancing buffer 'PerDrawSprite' to new syntax.
|
||||||
|
|
||||||
#ifndef SHADER_SHARED_INCLUDED
|
#ifndef SHADER_SHARED_INCLUDED
|
||||||
#define SHADER_SHARED_INCLUDED
|
#define SHADER_SHARED_INCLUDED
|
||||||
|
|
||||||
@ -11,12 +13,12 @@
|
|||||||
|
|
||||||
#ifdef UNITY_INSTANCING_ENABLED
|
#ifdef UNITY_INSTANCING_ENABLED
|
||||||
|
|
||||||
UNITY_INSTANCING_CBUFFER_START(PerDrawSprite)
|
UNITY_INSTANCING_BUFFER_START(PerDrawSprite)
|
||||||
// SpriteRenderer.Color while Non-Batched/Instanced.
|
// SpriteRenderer.Color while Non-Batched/Instanced.
|
||||||
fixed4 unity_SpriteRendererColorArray[UNITY_INSTANCED_ARRAY_SIZE];
|
fixed4 unity_SpriteRendererColorArray[UNITY_INSTANCED_ARRAY_SIZE];
|
||||||
// this could be smaller but that's how bit each entry is regardless of type
|
// this could be smaller but that's how bit each entry is regardless of type
|
||||||
float4 unity_SpriteFlipArray[UNITY_INSTANCED_ARRAY_SIZE];
|
float4 unity_SpriteFlipArray[UNITY_INSTANCED_ARRAY_SIZE];
|
||||||
UNITY_INSTANCING_CBUFFER_END
|
UNITY_INSTANCING_BUFFER_END(PerDrawSprite)
|
||||||
|
|
||||||
#define _RendererColor unity_SpriteRendererColorArray[unity_InstanceID]
|
#define _RendererColor unity_SpriteRendererColorArray[unity_InstanceID]
|
||||||
#define _Flip unity_SpriteFlipArray[unity_InstanceID]
|
#define _Flip unity_SpriteFlipArray[unity_InstanceID]
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
@ -27,7 +27,6 @@
|
|||||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#if UNITY_2017 || UNITY_2018 || (UNITY_2019_1_OR_NEWER && SPINE_TIMELINE_PACKAGE_DOWNLOADED)
|
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Playables;
|
using UnityEngine.Playables;
|
||||||
@ -53,4 +52,3 @@ public class SpineSkeletonFlipDrawer : PropertyDrawer
|
|||||||
EditorGUI.PropertyField(singleFieldRect, flipYProp);
|
EditorGUI.PropertyField(singleFieldRect, flipYProp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "spine-timeline-editor",
|
||||||
|
"references": [
|
||||||
|
"spine-unity",
|
||||||
|
"spine-timeline"
|
||||||
|
],
|
||||||
|
"optionalUnityReferences": [],
|
||||||
|
"includePlatforms": [],
|
||||||
|
"excludePlatforms": [],
|
||||||
|
"allowUnsafeCode": false,
|
||||||
|
"overrideReferences": false,
|
||||||
|
"precompiledReferences": [],
|
||||||
|
"autoReferenced": true,
|
||||||
|
"defineConstraints": [],
|
||||||
|
"versionDefines": []
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1e7d09e628f0eb342b6a8ab5b3c0d487
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
# Spine Runtimes License Agreement
|
||||||
|
Last updated May 1, 2019. Replaces all prior versions.
|
||||||
|
|
||||||
|
Copyright (c) 2013-2019, Esoteric Software LLC
|
||||||
|
|
||||||
|
Integration of the Spine Runtimes into software or otherwise creating
|
||||||
|
derivative works of the Spine Runtimes is permitted under the terms and
|
||||||
|
conditions of Section 2 of the Spine Editor License Agreement:
|
||||||
|
http://esotericsoftware.com/spine-editor-license
|
||||||
|
|
||||||
|
Otherwise, it is permitted to integrate the Spine Runtimes into software
|
||||||
|
or otherwise create derivative works of the Spine Runtimes (collectively,
|
||||||
|
"Products"), provided that each user of the Products must obtain their own
|
||||||
|
Spine Editor license and redistribution of the Products in any form must
|
||||||
|
include this license and copyright notice.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE LLC "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 LLC 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.
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4c940982dfcc1724a93981844b99fa28
|
||||||
|
TextScriptImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -1,9 +1,8 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: b7ef9595ebe8c204a8a4f251a55d4d22
|
guid: e204f4f677edeef4aa2328ce87780b43
|
||||||
folderAsset: yes
|
folderAsset: yes
|
||||||
timeCreated: 1527569508
|
|
||||||
licenseType: Free
|
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
userData:
|
userData:
|
||||||
assetBundleName:
|
assetBundleName:
|
||||||
assetBundleVariant:
|
assetBundleVariant:
|
||||||
@ -53,13 +53,11 @@ namespace Spine.Unity.Playables {
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public override Skeleton Skeleton { get { return skeletonAnimation.Skeleton; } }
|
public override Skeleton Skeleton { get { return skeletonAnimation.Skeleton; } }
|
||||||
public override SkeletonData SkeletonData { get { return skeletonAnimation.Skeleton.data; } }
|
public override SkeletonData SkeletonData { get { return skeletonAnimation.Skeleton.Data; } }
|
||||||
|
|
||||||
#if UNITY_2017 || UNITY_2018 || (UNITY_2019_1_OR_NEWER && SPINE_TIMELINE_PACKAGE_DOWNLOADED)
|
|
||||||
void Awake () {
|
void Awake () {
|
||||||
if (skeletonAnimation == null)
|
if (skeletonAnimation == null)
|
||||||
skeletonAnimation = GetComponent<SkeletonAnimation>();
|
skeletonAnimation = GetComponent<SkeletonAnimation>();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -27,7 +27,6 @@
|
|||||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#if UNITY_2017 || UNITY_2018 || (UNITY_2019_1_OR_NEWER && SPINE_TIMELINE_PACKAGE_DOWNLOADED)
|
|
||||||
using System;
|
using System;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Playables;
|
using UnityEngine.Playables;
|
||||||
@ -60,4 +59,3 @@ namespace Spine.Unity.Playables {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
@ -27,7 +27,6 @@
|
|||||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#if UNITY_2017 || UNITY_2018 || (UNITY_2019_1_OR_NEWER && SPINE_TIMELINE_PACKAGE_DOWNLOADED)
|
|
||||||
using System;
|
using System;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Playables;
|
using UnityEngine.Playables;
|
||||||
@ -48,4 +47,3 @@ namespace Spine.Unity.Playables {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
@ -29,7 +29,6 @@
|
|||||||
|
|
||||||
#define SPINE_EDITMODEPOSE
|
#define SPINE_EDITMODEPOSE
|
||||||
|
|
||||||
#if UNITY_2017 || UNITY_2018 || (UNITY_2019_1_OR_NEWER && SPINE_TIMELINE_PACKAGE_DOWNLOADED)
|
|
||||||
using System;
|
using System;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Playables;
|
using UnityEngine.Playables;
|
||||||
@ -155,8 +154,8 @@ namespace Spine.Unity.Playables {
|
|||||||
dummyAnimationState = dummyAnimationState ?? new AnimationState(spineComponent.skeletonDataAsset.GetAnimationStateData());
|
dummyAnimationState = dummyAnimationState ?? new AnimationState(spineComponent.skeletonDataAsset.GetAnimationStateData());
|
||||||
|
|
||||||
var toTrack = dummyAnimationState.GetCurrent(0);
|
var toTrack = dummyAnimationState.GetCurrent(0);
|
||||||
var fromTrack = toTrack != null ? toTrack.mixingFrom : null;
|
var fromTrack = toTrack != null ? toTrack.MixingFrom : null;
|
||||||
bool isAnimationTransitionMatch = (toTrack != null && toTrack.animation == toAnimation && fromTrack != null && fromTrack.animation == fromAnimation);
|
bool isAnimationTransitionMatch = (toTrack != null && toTrack.Animation == toAnimation && fromTrack != null && fromTrack.Animation == fromAnimation);
|
||||||
|
|
||||||
if (!isAnimationTransitionMatch) {
|
if (!isAnimationTransitionMatch) {
|
||||||
dummyAnimationState.ClearTracks();
|
dummyAnimationState.ClearTracks();
|
||||||
@ -167,10 +166,10 @@ namespace Spine.Unity.Playables {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Update track times.
|
// Update track times.
|
||||||
fromTrack.trackTime = fromClipTime;
|
fromTrack.TrackTime = fromClipTime;
|
||||||
if (toTrack != null) {
|
if (toTrack != null) {
|
||||||
toTrack.trackTime = toClipTime;
|
toTrack.TrackTime = toClipTime;
|
||||||
toTrack.mixTime = toClipTime;
|
toTrack.MixTime = toClipTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply Pose
|
// Apply Pose
|
||||||
@ -192,4 +191,3 @@ namespace Spine.Unity.Playables {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
@ -27,7 +27,6 @@
|
|||||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#if UNITY_2017 || UNITY_2018 || (UNITY_2019_1_OR_NEWER && SPINE_TIMELINE_PACKAGE_DOWNLOADED)
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Playables;
|
using UnityEngine.Playables;
|
||||||
using UnityEngine.Timeline;
|
using UnityEngine.Timeline;
|
||||||
@ -47,4 +46,3 @@ namespace Spine.Unity.Playables {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
@ -27,7 +27,6 @@
|
|||||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#if UNITY_2017 || UNITY_2018 || (UNITY_2019_1_OR_NEWER && SPINE_TIMELINE_PACKAGE_DOWNLOADED)
|
|
||||||
using System;
|
using System;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Playables;
|
using UnityEngine.Playables;
|
||||||
@ -37,4 +36,3 @@ using UnityEngine.Timeline;
|
|||||||
public class SpineSkeletonFlipBehaviour : PlayableBehaviour {
|
public class SpineSkeletonFlipBehaviour : PlayableBehaviour {
|
||||||
public bool flipX, flipY;
|
public bool flipX, flipY;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
@ -27,7 +27,6 @@
|
|||||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#if UNITY_2017 || UNITY_2018 || (UNITY_2019_1_OR_NEWER && SPINE_TIMELINE_PACKAGE_DOWNLOADED)
|
|
||||||
using System;
|
using System;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Playables;
|
using UnityEngine.Playables;
|
||||||
@ -46,4 +45,3 @@ public class SpineSkeletonFlipClip : PlayableAsset, ITimelineClipAsset {
|
|||||||
return playable;
|
return playable;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
@ -27,8 +27,7 @@
|
|||||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#if UNITY_2017 || UNITY_2018 || (UNITY_2019_1_OR_NEWER && SPINE_TIMELINE_PACKAGE_DOWNLOADED)
|
using System;
|
||||||
using System;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Playables;
|
using UnityEngine.Playables;
|
||||||
using UnityEngine.Timeline;
|
using UnityEngine.Timeline;
|
||||||
@ -105,4 +104,3 @@ namespace Spine.Unity.Playables {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
@ -27,8 +27,7 @@
|
|||||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#if UNITY_2017 || UNITY_2018 || (UNITY_2019_1_OR_NEWER && SPINE_TIMELINE_PACKAGE_DOWNLOADED)
|
using UnityEngine;
|
||||||
using UnityEngine;
|
|
||||||
using UnityEngine.Playables;
|
using UnityEngine.Playables;
|
||||||
using UnityEngine.Timeline;
|
using UnityEngine.Timeline;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@ -64,4 +63,3 @@ namespace Spine.Unity.Playables {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "spine-timeline",
|
||||||
|
"references": [
|
||||||
|
"spine-unity",
|
||||||
|
"Unity.Timeline"
|
||||||
|
],
|
||||||
|
"optionalUnityReferences": [],
|
||||||
|
"includePlatforms": [],
|
||||||
|
"excludePlatforms": [],
|
||||||
|
"allowUnsafeCode": false,
|
||||||
|
"overrideReferences": false,
|
||||||
|
"precompiledReferences": [],
|
||||||
|
"autoReferenced": true,
|
||||||
|
"defineConstraints": [],
|
||||||
|
"versionDefines": []
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d081815e631c29f46ab6f2ac745854df
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"name": "com.esotericsoftware.spine.timeline",
|
||||||
|
"displayName": "Spine Timeline Extensions",
|
||||||
|
"description": "This plugin provides integration of spine-unity for the Unity Timeline.\n\nPrerequisites:\nIt requires a working installation of the spine-unity runtime, version 3.8.\n(See http://esotericsoftware.com/git/spine-runtimes/spine-unity)",
|
||||||
|
"version": "3.8.0",
|
||||||
|
"unity": "2018.3",
|
||||||
|
"author": {
|
||||||
|
"name": "Esoteric Software",
|
||||||
|
"email": "contact@esotericsoftware.com",
|
||||||
|
"url": "http://esotericsoftware.com/"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"com.unity.timeline": "1.0.0"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"spine",
|
||||||
|
"timeline"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 591b30eac7c750e4d8b4cf9d09a80351
|
||||||
|
PackageManifestImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Loading…
x
Reference in New Issue
Block a user