mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2025-12-21 17:56:04 +08:00
Added SkeletonAttachment.
Spine doesn't export this attachment type, but it can be used at runtime.
This commit is contained in:
parent
dca388bb98
commit
f087d56da6
@ -35,6 +35,7 @@ package com.esotericsoftware.spine;
|
|||||||
|
|
||||||
import com.esotericsoftware.spine.attachments.Attachment;
|
import com.esotericsoftware.spine.attachments.Attachment;
|
||||||
import com.esotericsoftware.spine.attachments.RegionAttachment;
|
import com.esotericsoftware.spine.attachments.RegionAttachment;
|
||||||
|
import com.esotericsoftware.spine.attachments.SkeletonAttachment;
|
||||||
|
|
||||||
import com.badlogic.gdx.graphics.GL11;
|
import com.badlogic.gdx.graphics.GL11;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
@ -67,18 +68,39 @@ public class SkeletonRenderer {
|
|||||||
vertices = region.getWorldVertices();
|
vertices = region.getWorldVertices();
|
||||||
triangles = quadTriangle;
|
triangles = quadTriangle;
|
||||||
texture = region.getRegion().getTexture();
|
texture = region.getRegion().getTexture();
|
||||||
} else
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (slot.data.getAdditiveBlending() != additive) {
|
if (slot.data.getAdditiveBlending() != additive) {
|
||||||
additive = !additive;
|
additive = !additive;
|
||||||
if (additive)
|
if (additive)
|
||||||
batch.setBlendFunction(srcFunc, GL11.GL_ONE);
|
batch.setBlendFunction(srcFunc, GL11.GL_ONE);
|
||||||
else
|
else
|
||||||
batch.setBlendFunction(srcFunc, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
batch.setBlendFunction(srcFunc, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
}
|
||||||
|
|
||||||
|
batch.draw(texture, vertices, 0, vertices.length, triangles, 0, triangles.length);
|
||||||
|
} else if (attachment instanceof SkeletonAttachment) {
|
||||||
|
Skeleton attachmentSkeleton = ((SkeletonAttachment)attachment).getSkeleton();
|
||||||
|
if (attachmentSkeleton == null) continue;
|
||||||
|
Bone bone = slot.getBone();
|
||||||
|
Bone rootBone = attachmentSkeleton.getRootBone();
|
||||||
|
float oldScaleX = rootBone.getScaleX();
|
||||||
|
float oldScaleY = rootBone.getScaleY();
|
||||||
|
float oldRotation = rootBone.getRotation();
|
||||||
|
attachmentSkeleton.setX(bone.getWorldX());
|
||||||
|
attachmentSkeleton.setY(bone.getWorldY());
|
||||||
|
rootBone.setScaleX(1 + bone.getWorldScaleX() - oldScaleX);
|
||||||
|
rootBone.setScaleY(1 + bone.getWorldScaleY() - oldScaleY);
|
||||||
|
rootBone.setRotation(oldRotation + bone.getWorldRotation());
|
||||||
|
attachmentSkeleton.updateWorldTransform();
|
||||||
|
|
||||||
|
draw(batch, attachmentSkeleton);
|
||||||
|
|
||||||
|
attachmentSkeleton.setX(0);
|
||||||
|
attachmentSkeleton.setY(0);
|
||||||
|
rootBone.setScaleX(oldScaleX);
|
||||||
|
rootBone.setScaleY(oldScaleY);
|
||||||
|
rootBone.setRotation(oldRotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
batch.draw(texture, vertices, 0, vertices.length, triangles, 0, triangles.length);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,6 +127,28 @@ public class SkeletonRenderer {
|
|||||||
batch.setBlendFunction(srcFunc, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
batch.setBlendFunction(srcFunc, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||||
}
|
}
|
||||||
batch.draw(regionAttachment.getRegion().getTexture(), vertices, 0, 20);
|
batch.draw(regionAttachment.getRegion().getTexture(), vertices, 0, 20);
|
||||||
|
} else if (attachment instanceof SkeletonAttachment) {
|
||||||
|
Skeleton attachmentSkeleton = ((SkeletonAttachment)attachment).getSkeleton();
|
||||||
|
if (attachmentSkeleton == null) continue;
|
||||||
|
Bone bone = slot.getBone();
|
||||||
|
Bone rootBone = attachmentSkeleton.getRootBone();
|
||||||
|
float oldScaleX = rootBone.getScaleX();
|
||||||
|
float oldScaleY = rootBone.getScaleY();
|
||||||
|
float oldRotation = rootBone.getRotation();
|
||||||
|
attachmentSkeleton.setX(bone.getWorldX());
|
||||||
|
attachmentSkeleton.setY(bone.getWorldY());
|
||||||
|
rootBone.setScaleX(1 + bone.getWorldScaleX() - oldScaleX);
|
||||||
|
rootBone.setScaleY(1 + bone.getWorldScaleY() - oldScaleY);
|
||||||
|
rootBone.setRotation(oldRotation + bone.getWorldRotation());
|
||||||
|
attachmentSkeleton.updateWorldTransform();
|
||||||
|
|
||||||
|
draw(batch, attachmentSkeleton);
|
||||||
|
|
||||||
|
attachmentSkeleton.setX(0);
|
||||||
|
attachmentSkeleton.setY(0);
|
||||||
|
rootBone.setScaleX(oldScaleX);
|
||||||
|
rootBone.setScaleY(oldScaleY);
|
||||||
|
rootBone.setRotation(oldRotation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,55 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Spine Runtime Software License - Version 1.1
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Esoteric Software
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms in whole or in part, with
|
||||||
|
* or without modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. A Spine Essential, Professional, Enterprise, or Education License must
|
||||||
|
* be purchased from Esoteric Software and the license must remain valid:
|
||||||
|
* http://esotericsoftware.com/
|
||||||
|
* 2. Redistributions of source code must retain this license, which is the
|
||||||
|
* above copyright notice, this declaration of conditions and the following
|
||||||
|
* disclaimer.
|
||||||
|
* 3. Redistributions in binary form must reproduce this license, which is the
|
||||||
|
* above copyright notice, this declaration of conditions and the following
|
||||||
|
* disclaimer, in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 THE COPYRIGHT OWNER OR CONTRIBUTORS 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.attachments;
|
||||||
|
|
||||||
|
import com.esotericsoftware.spine.Skeleton;
|
||||||
|
|
||||||
|
/** Attachment that displays a texture region. */
|
||||||
|
public class SkeletonAttachment extends Attachment {
|
||||||
|
private Skeleton skeleton;
|
||||||
|
|
||||||
|
public SkeletonAttachment (String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return May return null. */
|
||||||
|
public Skeleton getSkeleton () {
|
||||||
|
return skeleton;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param skeleton May be null. */
|
||||||
|
public void setSkeleton (Skeleton skeleton) {
|
||||||
|
this.skeleton = skeleton;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user