mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-02-06 23:34:53 +08:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
a5131d287f
@ -53,14 +53,15 @@ public class AttachmentTimeline implements Timeline {
|
||||
}
|
||||
|
||||
public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number) : void {
|
||||
if (time < frames[0])
|
||||
return; // Time is before first frame.
|
||||
var frames:Vector.<Number> = this.frames;
|
||||
if (time < frames[0]) {
|
||||
if (lastTime > time) apply(skeleton, lastTime, int.MAX_VALUE, null, 0);
|
||||
return;
|
||||
} else if (lastTime > time) //
|
||||
lastTime = -1;
|
||||
|
||||
var frameIndex:int;
|
||||
if (time >= frames[int(frames.length - 1)]) // Time is after last frame.
|
||||
frameIndex = frames.length - 1;
|
||||
else
|
||||
frameIndex = Animation.binarySearch(frames, time, 1) - 1;
|
||||
var frameIndex:int = time >= frames[frames.length - 1] ? frames.length - 1 : Animation.binarySearch1(frames, time) - 1;
|
||||
if (frames[frameIndex] < lastTime) return;
|
||||
|
||||
var attachmentName:String = attachmentNames[frameIndex];
|
||||
skeleton.slots[slotIndex].attachment = attachmentName == null ? null : skeleton.getAttachmentForSlotIndex(slotIndex, attachmentName);
|
||||
|
||||
@ -479,7 +479,7 @@ void _spAttachmentTimeline_apply (const spTimeline* timeline, spSkeleton* skelet
|
||||
|
||||
frameIndex = time >= self->frames[self->framesCount - 1] ?
|
||||
self->framesCount - 1 : binarySearch1(self->frames, self->framesCount, time) - 1;
|
||||
if (self->frames[frameIndex] <= lastTime) return;
|
||||
if (self->frames[frameIndex] < lastTime) return;
|
||||
|
||||
attachmentName = self->attachmentNames[frameIndex];
|
||||
spSlot_setAttachment(skeleton->slots[self->slotIndex],
|
||||
|
||||
@ -80,7 +80,6 @@ void SkeletonRenderer::initialize () {
|
||||
|
||||
void SkeletonRenderer::setSkeletonData (spSkeletonData *skeletonData, bool ownsSkeletonData) {
|
||||
_skeleton = spSkeleton_create(skeletonData);
|
||||
_rootBone = _skeleton->bones[0];
|
||||
_ownsSkeletonData = ownsSkeletonData;
|
||||
}
|
||||
|
||||
@ -346,35 +345,31 @@ bool SkeletonRenderer::setAttachment (const std::string& slotName, const std::st
|
||||
return spSkeleton_setAttachment(_skeleton, slotName.c_str(), attachmentName.c_str()) ? true : false;
|
||||
}
|
||||
|
||||
void SkeletonRenderer::setTimeScale(float scale)
|
||||
{
|
||||
_timeScale = scale;
|
||||
spSkeleton* SkeletonRenderer::getSkeleton () {
|
||||
return _skeleton;
|
||||
}
|
||||
|
||||
float SkeletonRenderer::getTimeScale() const
|
||||
{
|
||||
void SkeletonRenderer::setTimeScale (float scale) {
|
||||
_timeScale = scale;
|
||||
}
|
||||
float SkeletonRenderer::getTimeScale () const {
|
||||
return _timeScale;
|
||||
}
|
||||
|
||||
void SkeletonRenderer::setDebugSlotsEnabled(bool enabled)
|
||||
{
|
||||
void SkeletonRenderer::setDebugSlotsEnabled (bool enabled) {
|
||||
_debugSlots = enabled;
|
||||
}
|
||||
bool SkeletonRenderer::getDebugSlotsEnabled() const
|
||||
{
|
||||
bool SkeletonRenderer::getDebugSlotsEnabled () const {
|
||||
return _debugSlots;
|
||||
}
|
||||
|
||||
void SkeletonRenderer::setDebugBonesEnabled(bool enabled)
|
||||
{
|
||||
void SkeletonRenderer::setDebugBonesEnabled (bool enabled) {
|
||||
_debugBones = enabled;
|
||||
}
|
||||
bool SkeletonRenderer::getDebugBonesEnabled() const
|
||||
{
|
||||
bool SkeletonRenderer::getDebugBonesEnabled () const {
|
||||
return _debugBones;
|
||||
}
|
||||
|
||||
|
||||
// --- CCBlendProtocol
|
||||
|
||||
const BlendFunc& SkeletonRenderer::getBlendFunc () const {
|
||||
|
||||
@ -50,12 +50,7 @@ public:
|
||||
virtual void drawSkeleton (const cocos2d::Mat4& transform, uint32_t transformFlags);
|
||||
virtual cocos2d::Rect getBoundingBox () const override;
|
||||
|
||||
// --- Convenience methods for common Skeleton_* functions.
|
||||
void updateWorldTransform ();
|
||||
|
||||
void setToSetupPose ();
|
||||
void setBonesToSetupPose ();
|
||||
void setSlotsToSetupPose ();
|
||||
spSkeleton* getSkeleton();
|
||||
|
||||
void setTimeScale(float scale);
|
||||
float getTimeScale() const;
|
||||
@ -66,6 +61,12 @@ public:
|
||||
void setDebugBonesEnabled(bool enabled);
|
||||
bool getDebugBonesEnabled() const;
|
||||
|
||||
// --- Convenience methods for common Skeleton_* functions.
|
||||
void updateWorldTransform ();
|
||||
|
||||
void setToSetupPose ();
|
||||
void setBonesToSetupPose ();
|
||||
void setSlotsToSetupPose ();
|
||||
|
||||
/* Returns 0 if the bone was not found. */
|
||||
spBone* findBone (const std::string& boneName) const;
|
||||
@ -109,7 +110,6 @@ protected:
|
||||
float* _worldVertices;
|
||||
bool _premultipliedAlpha;
|
||||
spSkeleton* _skeleton;
|
||||
spBone* _rootBone;
|
||||
float _timeScale;
|
||||
bool _debugSlots;
|
||||
bool _debugBones;
|
||||
|
||||
@ -444,7 +444,7 @@ namespace Spine {
|
||||
lastTime = -1;
|
||||
|
||||
int frameIndex = time >= frames[frames.Length - 1] ? frames.Length - 1 : Animation.binarySearch(frames, time) - 1;
|
||||
if (frames[frameIndex] <= lastTime) return;
|
||||
if (frames[frameIndex] < lastTime) return;
|
||||
|
||||
String attachmentName = attachmentNames[frameIndex];
|
||||
skeleton.slots[slotIndex].Attachment =
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
eclipse.preferences.version=1
|
||||
org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
|
||||
org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
|
||||
org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
|
||||
org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
|
||||
@ -47,6 +48,7 @@ org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warni
|
||||
org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
|
||||
org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
|
||||
org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
|
||||
org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
|
||||
org.eclipse.jdt.core.compiler.problem.nullReference=warning
|
||||
org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
|
||||
@ -55,7 +57,7 @@ org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
|
||||
org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
|
||||
org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
|
||||
org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
|
||||
org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
|
||||
org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
|
||||
@ -67,6 +69,7 @@ org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
|
||||
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
|
||||
org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning
|
||||
org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
|
||||
org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
|
||||
@ -90,6 +93,7 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=
|
||||
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
|
||||
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
|
||||
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
|
||||
org.eclipse.jdt.core.compiler.source=1.6
|
||||
|
||||
@ -1,71 +1,9 @@
|
||||
|
||||
skin.png
|
||||
size: 256,128
|
||||
format: RGBA8888
|
||||
filter: Nearest,Nearest
|
||||
filter: Linear,Linear
|
||||
repeat: none
|
||||
default
|
||||
rotate: false
|
||||
xy: 1, 50
|
||||
size: 254, 77
|
||||
orig: 254, 77
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-window
|
||||
rotate: false
|
||||
xy: 1, 20
|
||||
size: 27, 29
|
||||
split: 4, 3, 20, 3
|
||||
orig: 27, 29
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-select
|
||||
rotate: false
|
||||
xy: 29, 29
|
||||
size: 27, 20
|
||||
split: 4, 14, 4, 4
|
||||
orig: 27, 20
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-round-large
|
||||
rotate: false
|
||||
xy: 57, 29
|
||||
size: 20, 20
|
||||
split: 5, 5, 5, 4
|
||||
orig: 20, 20
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-scroll
|
||||
rotate: false
|
||||
xy: 78, 29
|
||||
size: 20, 20
|
||||
split: 2, 2, 2, 2
|
||||
orig: 20, 20
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-slider-knob
|
||||
rotate: false
|
||||
xy: 1, 1
|
||||
size: 9, 18
|
||||
orig: 9, 18
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-round-down
|
||||
rotate: false
|
||||
xy: 99, 29
|
||||
size: 12, 20
|
||||
split: 5, 5, 5, 4
|
||||
orig: 12, 20
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-round
|
||||
rotate: false
|
||||
xy: 112, 29
|
||||
size: 12, 20
|
||||
split: 5, 5, 5, 4
|
||||
pad: 4, 4, 1, 1
|
||||
orig: 12, 20
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
check-off
|
||||
rotate: false
|
||||
xy: 11, 5
|
||||
@ -88,27 +26,20 @@ check-on
|
||||
orig: 14, 14
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
tree-minus
|
||||
cursor
|
||||
rotate: false
|
||||
xy: 140, 35
|
||||
size: 14, 14
|
||||
orig: 14, 14
|
||||
xy: 23, 1
|
||||
size: 3, 3
|
||||
split: 1, 1, 1, 1
|
||||
orig: 3, 3
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
tree-plus
|
||||
default
|
||||
rotate: false
|
||||
xy: 155, 35
|
||||
size: 14, 14
|
||||
orig: 14, 14
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-slider
|
||||
rotate: false
|
||||
xy: 29, 20
|
||||
size: 8, 8
|
||||
split: 2, 2, 2, 2
|
||||
orig: 8, 8
|
||||
offset: 0, 0
|
||||
xy: 1, 50
|
||||
size: 253, 77
|
||||
orig: 254, 77
|
||||
offset: 1, 0
|
||||
index: -1
|
||||
default-pane
|
||||
rotate: false
|
||||
@ -126,36 +57,12 @@ default-rect-pad
|
||||
orig: 5, 3
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-splitpane
|
||||
default-pane-noborder
|
||||
rotate: false
|
||||
xy: 17, 1
|
||||
size: 5, 3
|
||||
split: 0, 5, 0, 0
|
||||
orig: 5, 3
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
cursor
|
||||
rotate: false
|
||||
xy: 23, 1
|
||||
size: 3, 3
|
||||
split: 1, 1, 1, 1
|
||||
orig: 3, 3
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-splitpane-vertical
|
||||
rotate: false
|
||||
xy: 125, 29
|
||||
size: 3, 5
|
||||
split: 0, 0, 0, 5
|
||||
orig: 3, 5
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-rect-down
|
||||
rotate: false
|
||||
xy: 170, 46
|
||||
size: 3, 3
|
||||
split: 1, 1, 1, 1
|
||||
orig: 3, 3
|
||||
xy: 129, 33
|
||||
size: 1, 1
|
||||
split: 0, 0, 0, 0
|
||||
orig: 1, 1
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-rect
|
||||
@ -166,6 +73,56 @@ default-rect
|
||||
orig: 3, 3
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-rect-down
|
||||
rotate: false
|
||||
xy: 170, 46
|
||||
size: 3, 3
|
||||
split: 1, 1, 1, 1
|
||||
orig: 3, 3
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-round
|
||||
rotate: false
|
||||
xy: 112, 29
|
||||
size: 12, 20
|
||||
split: 5, 5, 5, 4
|
||||
pad: 4, 4, 1, 1
|
||||
orig: 12, 20
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-round-down
|
||||
rotate: false
|
||||
xy: 99, 29
|
||||
size: 12, 20
|
||||
split: 5, 5, 5, 4
|
||||
pad: 4, 4, 1, 1
|
||||
orig: 12, 20
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-round-large
|
||||
rotate: false
|
||||
xy: 57, 29
|
||||
size: 20, 20
|
||||
split: 5, 5, 5, 4
|
||||
orig: 20, 20
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-scroll
|
||||
rotate: false
|
||||
xy: 78, 29
|
||||
size: 20, 20
|
||||
split: 2, 2, 2, 2
|
||||
orig: 20, 20
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-select
|
||||
rotate: false
|
||||
xy: 29, 29
|
||||
size: 27, 20
|
||||
split: 4, 14, 4, 4
|
||||
orig: 27, 20
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-select-selection
|
||||
rotate: false
|
||||
xy: 26, 16
|
||||
@ -174,12 +131,43 @@ default-select-selection
|
||||
orig: 3, 3
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-pane-noborder
|
||||
default-slider
|
||||
rotate: false
|
||||
xy: 129, 33
|
||||
size: 1, 1
|
||||
split: 0, 0, 0, 0
|
||||
orig: 1, 1
|
||||
xy: 29, 20
|
||||
size: 8, 8
|
||||
split: 2, 2, 2, 2
|
||||
orig: 8, 8
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-slider-knob
|
||||
rotate: false
|
||||
xy: 1, 1
|
||||
size: 9, 18
|
||||
orig: 9, 18
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-splitpane
|
||||
rotate: false
|
||||
xy: 17, 1
|
||||
size: 5, 3
|
||||
split: 0, 5, 0, 0
|
||||
orig: 5, 3
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-splitpane-vertical
|
||||
rotate: false
|
||||
xy: 125, 29
|
||||
size: 3, 5
|
||||
split: 0, 0, 0, 5
|
||||
orig: 3, 5
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
default-window
|
||||
rotate: false
|
||||
xy: 1, 20
|
||||
size: 27, 29
|
||||
split: 4, 3, 20, 3
|
||||
orig: 27, 29
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
selection
|
||||
@ -189,6 +177,20 @@ selection
|
||||
orig: 1, 1
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
tree-minus
|
||||
rotate: false
|
||||
xy: 140, 35
|
||||
size: 14, 14
|
||||
orig: 14, 14
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
tree-plus
|
||||
rotate: false
|
||||
xy: 155, 35
|
||||
size: 14, 14
|
||||
orig: 14, 14
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
white
|
||||
rotate: false
|
||||
xy: 174, 48
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 28 KiB |
@ -86,8 +86,8 @@ public class Animation {
|
||||
if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null.");
|
||||
|
||||
if (loop && duration != 0) {
|
||||
lastTime %= duration;
|
||||
time %= duration;
|
||||
lastTime %= duration;
|
||||
}
|
||||
|
||||
Array<Timeline> timelines = this.timelines;
|
||||
@ -468,8 +468,8 @@ public class Animation {
|
||||
|
||||
static public class AttachmentTimeline implements Timeline {
|
||||
int slotIndex;
|
||||
private final float[] frames; // time, ...
|
||||
private final String[] attachmentNames;
|
||||
final float[] frames; // time, ...
|
||||
final String[] attachmentNames;
|
||||
|
||||
public AttachmentTimeline (int frameCount) {
|
||||
frames = new float[frameCount];
|
||||
@ -511,7 +511,7 @@ public class Animation {
|
||||
lastTime = -1;
|
||||
|
||||
int frameIndex = (time >= frames[frames.length - 1] ? frames.length : binarySearch(frames, time)) - 1;
|
||||
if (frames[frameIndex] <= lastTime) return;
|
||||
if (frames[frameIndex] < lastTime) return;
|
||||
|
||||
String attachmentName = attachmentNames[frameIndex];
|
||||
skeleton.slots.get(slotIndex).setAttachment(
|
||||
|
||||
@ -304,7 +304,7 @@ public class AnimationState {
|
||||
TrackEntry next, previous;
|
||||
Animation animation;
|
||||
boolean loop;
|
||||
float delay, time, lastTime, endTime, timeScale = 1;
|
||||
float delay, time, lastTime = -1, endTime, timeScale = 1;
|
||||
float mixTime, mixDuration;
|
||||
AnimationStateListener listener;
|
||||
float mix = 1;
|
||||
|
||||
@ -0,0 +1,101 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes Software License
|
||||
* Version 2.1
|
||||
*
|
||||
* Copyright (c) 2013, Esoteric Software
|
||||
* All rights reserved.
|
||||
*
|
||||
* You are granted a perpetual, non-exclusive, non-sublicensable and
|
||||
* non-transferable license to install, execute and perform the Spine Runtimes
|
||||
* Software (the "Software") solely for internal use. Without the written
|
||||
* permission of Esoteric Software (typically granted by licensing Spine), you
|
||||
* may not (a) modify, translate, adapt or otherwise create derivative works,
|
||||
* improvements of the Software or develop new applications using the Software
|
||||
* 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 SOFTARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) 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.
|
||||
*****************************************************************************/
|
||||
|
||||
package com.esotericsoftware.spine;
|
||||
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import com.esotericsoftware.spine.Animation.AttachmentTimeline;
|
||||
import com.esotericsoftware.spine.Animation.Timeline;
|
||||
import com.esotericsoftware.spine.attachments.Attachment;
|
||||
|
||||
/** Unit tests for {@link AttachmentTimeline}. */
|
||||
public class AttachmentTimelineTests {
|
||||
private final SkeletonData skeletonData;
|
||||
private final Skeleton skeleton;
|
||||
private Slot slot;
|
||||
private AnimationState state;
|
||||
|
||||
public AttachmentTimelineTests () {
|
||||
skeletonData = new SkeletonData();
|
||||
|
||||
BoneData boneData = new BoneData("bone", null);
|
||||
skeletonData.getBones().add(boneData);
|
||||
|
||||
skeletonData.getSlots().add(new SlotData("slot", boneData));
|
||||
|
||||
Attachment attachment1 = new Attachment("attachment1") {};
|
||||
Attachment attachment2 = new Attachment("attachment2") {};
|
||||
|
||||
Skin skin = new Skin("skin");
|
||||
skin.addAttachment(0, "attachment1", attachment1);
|
||||
skin.addAttachment(0, "attachment2", attachment2);
|
||||
skeletonData.setDefaultSkin(skin);
|
||||
|
||||
skeleton = new Skeleton(skeletonData);
|
||||
slot = skeleton.findSlot("slot");
|
||||
|
||||
AttachmentTimeline timeline = new AttachmentTimeline(2);
|
||||
timeline.setFrame(0, 0, "attachment1");
|
||||
timeline.setFrame(1, 0.5f, "attachment2");
|
||||
|
||||
Animation animation = new Animation("animation", Array.with((Timeline)timeline), 1);
|
||||
animation.setDuration(1);
|
||||
|
||||
state = new AnimationState(new AnimationStateData(skeletonData));
|
||||
state.setAnimation(0, animation, true);
|
||||
|
||||
test(0, attachment1);
|
||||
test(0, attachment1);
|
||||
test(0.25f, attachment1);
|
||||
test(0f, attachment1);
|
||||
test(0.25f, attachment2);
|
||||
test(0.25f, attachment2);
|
||||
|
||||
System.out.println("AttachmentTimeline tests passed.");
|
||||
}
|
||||
|
||||
private void test (float delta, Attachment attachment) {
|
||||
state.update(delta);
|
||||
state.apply(skeleton);
|
||||
if (slot.getAttachment() != attachment)
|
||||
throw new FailException("Wrong attachment: " + slot.getAttachment() + " != " + attachment);
|
||||
|
||||
}
|
||||
|
||||
static class FailException extends RuntimeException {
|
||||
public FailException (String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
|
||||
static public void main (String[] args) throws Exception {
|
||||
new AttachmentTimelineTests();
|
||||
}
|
||||
}
|
||||
@ -72,7 +72,7 @@ public class EventTimelineTests {
|
||||
test(0.1f, 0.2f, 0.3f, 0.4f);
|
||||
test(1, 2, 3, 4, 5, 6, 6, 7, 7, 8, 9, 10, 11, 11.01f, 12, 12, 12, 12);
|
||||
|
||||
System.out.println("All tests passed.");
|
||||
System.out.println("EventTimeline tests passed.");
|
||||
}
|
||||
|
||||
private void test (float... frames) {
|
||||
|
||||
@ -32,12 +32,17 @@ package com.esotericsoftware.spine;
|
||||
|
||||
import static com.badlogic.gdx.scenes.scene2d.actions.Actions.*;
|
||||
|
||||
import java.awt.FileDialog;
|
||||
import java.awt.Frame;
|
||||
import java.io.File;
|
||||
|
||||
import com.badlogic.gdx.ApplicationAdapter;
|
||||
import com.badlogic.gdx.Gdx;
|
||||
import com.badlogic.gdx.InputAdapter;
|
||||
import com.badlogic.gdx.InputMultiplexer;
|
||||
import com.badlogic.gdx.Preferences;
|
||||
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
|
||||
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
|
||||
import com.badlogic.gdx.files.FileHandle;
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.graphics.GL20;
|
||||
@ -67,11 +72,7 @@ import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import com.badlogic.gdx.utils.viewport.ScreenViewport;
|
||||
|
||||
import java.awt.FileDialog;
|
||||
import java.awt.Frame;
|
||||
import java.io.File;
|
||||
|
||||
public class SkeletonTest extends ApplicationAdapter {
|
||||
public class SkeletonViewer extends ApplicationAdapter {
|
||||
static final float checkModifiedInterval = 0.250f;
|
||||
static final float reloadDelay = 1;
|
||||
|
||||
@ -291,6 +292,12 @@ public class SkeletonTest extends ApplicationAdapter {
|
||||
minimizeButton.getColor().a = 0.66f;
|
||||
window.getButtonTable().add(minimizeButton).size(20, 20);
|
||||
|
||||
ScrollPane skinScroll = new ScrollPane(skinList, skin);
|
||||
skinScroll.setFadeScrollBars(false);
|
||||
|
||||
ScrollPane animationScroll = new ScrollPane(animationList, skin);
|
||||
animationScroll.setFadeScrollBars(false);
|
||||
|
||||
// Layout.
|
||||
|
||||
root.pad(2, 4, 4, 4).defaults().space(6);
|
||||
@ -320,11 +327,11 @@ public class SkeletonTest extends ApplicationAdapter {
|
||||
root.add("Alpha:");
|
||||
root.add(premultipliedCheckbox).row();
|
||||
root.add("Skin:");
|
||||
root.add(new ScrollPane(skinList, skin)).expand().fill().minHeight(75).row();
|
||||
root.add(skinScroll).expand().fill().minHeight(75).row();
|
||||
root.add("Setup Pose:");
|
||||
root.add(table(bonesSetupPoseButton, slotsSetupPoseButton, setupPoseButton)).row();
|
||||
root.add("Animation:");
|
||||
root.add(new ScrollPane(animationList, skin)).expand().fill().minHeight(75).row();
|
||||
root.add(animationScroll).expand().fill().minHeight(75).row();
|
||||
root.add("Mix:");
|
||||
{
|
||||
Table table = table();
|
||||
@ -487,7 +494,13 @@ public class SkeletonTest extends ApplicationAdapter {
|
||||
}
|
||||
}
|
||||
|
||||
public static void main (String[] args) throws Exception {
|
||||
new LwjglApplication(new SkeletonTest(), "SkeletonTest", 800, 600);
|
||||
static public void main (String[] args) throws Exception {
|
||||
LwjglApplicationConfiguration.disableAudio = true;
|
||||
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
|
||||
config.width = 800;
|
||||
config.height = 600;
|
||||
config.title = "Skeleton Viewer";
|
||||
config.allowSoftwareMode = true;
|
||||
new LwjglApplication(new SkeletonViewer(), config);
|
||||
}
|
||||
}
|
||||
@ -67,6 +67,7 @@ public class SkeletonAnimationInspector : SkeletonRendererInspector {
|
||||
}
|
||||
|
||||
|
||||
//TODO: Refactor this to use GenericMenu and callbacks to avoid interfering with control by other behaviours.
|
||||
// Animation name.
|
||||
{
|
||||
String[] animations = new String[component.skeleton.Data.Animations.Count + 1];
|
||||
@ -85,8 +86,10 @@ public class SkeletonAnimationInspector : SkeletonRendererInspector {
|
||||
EditorGUILayout.EndHorizontal();
|
||||
|
||||
String selectedAnimationName = animationIndex == 0 ? null : animations[animationIndex];
|
||||
component.AnimationName = selectedAnimationName;
|
||||
animationName.stringValue = selectedAnimationName;
|
||||
if(component.AnimationName != selectedAnimationName){
|
||||
component.AnimationName = selectedAnimationName;
|
||||
animationName.stringValue = selectedAnimationName;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user