[godot] Backport to 4.1

This commit is contained in:
Mario Zechner 2022-07-18 10:27:42 +02:00
parent 1549cdea5c
commit 68b59271bb
249 changed files with 57287 additions and 37 deletions

View File

@ -0,0 +1,27 @@
name: Setup python and scons
description: Setup python, install the pip version of scons.
inputs:
python-version:
description: The python version to use.
default: "3.x"
python-arch:
description: The python architecture.
default: "x64"
runs:
using: "composite"
steps:
# Use python 3.x release (works cross platform)
- name: Set up Python 3.x
uses: actions/setup-python@v2
with:
# Semantic version range syntax or exact version of a Python version
python-version: ${{ inputs.python-version }}
# Optional - x64 or x86 architecture, defaults to x64
architecture: ${{ inputs.python-arch }}
- name: Setup scons
shell: bash
run: |
python -c "import sys; print(sys.version)"
python -m pip install scons
scons --version

363
.github/workflows/spine-godot.yml vendored Normal file
View File

@ -0,0 +1,363 @@
name: Build and Publish Godot editor and templates
on:
push:
paths:
- ".github/workflows/spine-godot.yml"
- 'spine-godot/**'
- 'spine-cpp/**'
workflow_dispatch:
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_EC2_METADATA_DISABLED: true
EM_VERSION: 3.1.10
GODOT_TAG: 3.4.4-stable
GODOT_VERSION: 3.4.4.stable
jobs:
godot-editor-windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Setup python and scons
uses: ./.github/actions/setup-godot-deps
- name: Build Godot artifact
shell: bash
run: |
./spine-godot/build/setup.sh $GODOT_TAG false
./spine-godot/build/build.sh release_debug
- name: Upload artifacts
uses: actions/upload-artifact@v2
with:
name: godot-editor-windows.zip
path: spine-godot/godot/bin/godot.windows.opt.tools.64.exe
godot-editor-linux:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Setup python and scons
uses: ./.github/actions/setup-godot-deps
- name: Build Godot artifact
shell: bash
run: |
sudo apt-get install build-essential scons pkg-config libx11-dev libxcursor-dev libxinerama-dev libgl1-mesa-dev libglu-dev libasound2-dev libpulse-dev libudev-dev libxi-dev libxrandr-dev
./spine-godot/build/setup.sh $GODOT_TAG false
./spine-godot/build/build.sh release_debug
- name: Upload artifacts
uses: actions/upload-artifact@v2
with:
name: godot-editor-linux.zip
path: spine-godot/godot/bin/godot.x11.opt.tools.64
godot-editor-macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Setup python and scons
uses: ./.github/actions/setup-godot-deps
- name: Build Godot artifact
shell: bash
run: |
./spine-godot/build/setup.sh $GODOT_TAG false
./spine-godot/build/build.sh release_debug
pushd spine-godot/godot/bin
zip -r godot-editor-macos.zip Godot.app
popd
- name: Upload artifacts
uses: actions/upload-artifact@v2
with:
name: godot-editor-macos.zip
path: spine-godot/godot/bin/godot-editor-macos.zip
godot-template-ios:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Setup python and scons
uses: ./.github/actions/setup-godot-deps
- name: Build Godot artifact
run: |
./spine-godot/build/setup.sh $GODOT_TAG false
./spine-godot/build/build-templates.sh ios
- name: Upload artifacts
uses: actions/upload-artifact@v2
with:
name: godot-template-ios.zip
path: spine-godot/godot/bin/iphone.zip
godot-template-macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Setup python and scons
uses: ./.github/actions/setup-godot-deps
- name: Build Godot artifact
run: |
./spine-godot/build/setup.sh $GODOT_TAG false
./spine-godot/build/build-templates.sh macos
- name: Upload artifacts
uses: actions/upload-artifact@v2
with:
name: godot-template-macos.zip
path: spine-godot/godot/bin/osx.zip
godot-template-linux:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Setup python and scons
uses: ./.github/actions/setup-godot-deps
- name: Build Godot artifact
run: |
sudo apt-get install build-essential scons pkg-config libx11-dev libxcursor-dev libxinerama-dev libgl1-mesa-dev libglu-dev libasound2-dev libpulse-dev libudev-dev libxi-dev libxrandr-dev
./spine-godot/build/setup.sh $GODOT_TAG false
./spine-godot/build/build-templates.sh linux
- name: Upload artifacts debug
uses: actions/upload-artifact@v2
with:
name: godot-template-linux-debug.zip
path: spine-godot/godot/bin/linux_x11_64_debug
- name: Upload artifacts release
uses: actions/upload-artifact@v2
with:
name: godot-template-linux-release.zip
path: spine-godot/godot/bin/linux_x11_64_release
godot-template-windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Setup python and scons
uses: ./.github/actions/setup-godot-deps
- name: Build Godot artifact
shell: bash
run: |
./spine-godot/build/setup.sh $GODOT_TAG false
./spine-godot/build/build-templates.sh windows
- name: Upload artifacts debug
uses: actions/upload-artifact@v2
with:
name: godot-template-windows-debug.zip
path: spine-godot/godot/bin/windows_64_debug.exe
- name: Upload artifacts release
uses: actions/upload-artifact@v2
with:
name: godot-template-windows-release.zip
path: spine-godot/godot/bin/windows_64_release.exe
godot-template-android:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
# Azure repositories are not reliable, we need to prevent azure giving us packages.
- name: Make apt sources.list use the default Ubuntu repositories
run: |
sudo rm -f /etc/apt/sources.list.d/*
sudo cp -f spine-godot/build/sources.lst /etc/apt/sources.list
sudo apt-get update
- name: Set up Java 11
uses: actions/setup-java@v1
with:
java-version: 11
- name: Setup python and scons
uses: ./.github/actions/setup-godot-deps
- name: Build Godot artifact
shell: bash
run: |
./spine-godot/build/setup.sh $GODOT_TAG false
./spine-godot/build/build-templates.sh android
- name: Upload artifacts debug
uses: actions/upload-artifact@v2
with:
name: godot-template-android-debug.zip
path: spine-godot/godot/bin/android_debug.apk
- name: Upload artifacts release
uses: actions/upload-artifact@v2
with:
name: godot-template-android-release.zip
path: spine-godot/godot/bin/android_release.apk
- name: Upload artifacts source
uses: actions/upload-artifact@v2
with:
name: godot-template-android-source.zip
path: spine-godot/godot/bin/android_source.zip
godot-template-web:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Set up Emscripten latest
uses: mymindstorm/setup-emsdk@v10
with:
version: ${{env.EM_VERSION}}
- name: Verify Emscripten setup
run: |
emcc -v
- name: Setup python and scons
uses: ./.github/actions/setup-godot-deps
- name: Build Godot artifact
run: |
./spine-godot/build/setup.sh $GODOT_TAG false
./spine-godot/build/build-templates.sh web
- name: Upload artifacts debug
uses: actions/upload-artifact@v2
with:
name: godot-template-web-debug.zip
path: spine-godot/godot/bin/webassembly_debug.zip
- name: Upload artifacts release
uses: actions/upload-artifact@v2
with:
name: godot-template-web-release.zip
path: spine-godot/godot/bin/webassembly_release.zip
upload-to-s3:
needs: [godot-editor-windows, godot-editor-linux, godot-editor-macos, godot-template-ios, godot-template-macos, godot-template-windows, godot-template-linux, godot-template-android, godot-template-web]
runs-on: ubuntu-latest
steps:
- name: Download godot-editor-windows artifact
uses: actions/download-artifact@v2
with:
name: godot-editor-windows.zip
- name: Download godot-editor-linux artifact
uses: actions/download-artifact@v2
with:
name: godot-editor-linux.zip
- name: Download godot-editor-macos artifact
uses: actions/download-artifact@v2
with:
name: godot-editor-macos.zip
- name: Download godot-template-ios artifact
uses: actions/download-artifact@v2
with:
name: godot-template-ios.zip
- name: Download godot-template-macos artifact
uses: actions/download-artifact@v2
with:
name: godot-template-macos.zip
- name: Download godot-template-windows-release artifact
uses: actions/download-artifact@v2
with:
name: godot-template-windows-release.zip
- name: Download godot-template-windows-debug artifact
uses: actions/download-artifact@v2
with:
name: godot-template-windows-debug.zip
- name: Download godot-template-linux-release artifact
uses: actions/download-artifact@v2
with:
name: godot-template-linux-release.zip
- name: Download godot-template-linux-debug artifact
uses: actions/download-artifact@v2
with:
name: godot-template-linux-debug.zip
- name: Download godot-template-android-release artifact
uses: actions/download-artifact@v2
with:
name: godot-template-android-release.zip
- name: Download godot-template-android-debug artifact
uses: actions/download-artifact@v2
with:
name: godot-template-android-debug.zip
- name: Download godot-template-android-source artifact
uses: actions/download-artifact@v2
with:
name: godot-template-android-source.zip
- name: Download godot-template-web-release artifact
uses: actions/download-artifact@v2
with:
name: godot-template-web-release.zip
- name: Download godot-template-web-debug artifact
uses: actions/download-artifact@v2
with:
name: godot-template-web-debug.zip
- name: Upload artifacts to S3
shell: bash
if: env.AWS_ACCESS_KEY_ID != null
run: |
BRANCH=${GITHUB_REF#refs/heads/}
echo "branch: $BRANCH"
mv godot.windows.opt.tools.64.exe godot-$BRANCH-$GODOT_TAG.exe
mv godot.x11.opt.tools.64 godot-$BRANCH-$GODOT_TAG
zip godot-editor-windows.zip godot-$BRANCH-$GODOT_TAG.exe
zip godot-editor-linux.zip godot-$BRANCH-$GODOT_TAG
aws s3 cp godot-editor-windows.zip s3://spine-godot/$BRANCH/$GODOT_TAG/
aws s3 cp godot-editor-linux.zip s3://spine-godot/$BRANCH/$GODOT_TAG/
aws s3 cp godot-editor-macos.zip s3://spine-godot/$BRANCH/$GODOT_TAG/
echo "$GODOT_VERSION" > version.txt
ls -lah
zip spine-godot-templates-$BRANCH-$GODOT_TAG.zip iphone.zip osx.zip windows_64_debug.exe windows_64_release.exe linux_x11_64_debug linux_x11_64_release webassembly_debug.zip webassembly_release.zip android_release.apk android_debug.apk android_source.zip version.txt
aws s3 cp spine-godot-templates-$BRANCH-$GODOT_TAG.zip s3://spine-godot/$BRANCH/$GODOT_TAG/spine-godot-templates-$BRANCH-$GODOT_TAG.tpz

13
.gitignore vendored
View File

@ -164,4 +164,17 @@ spine-cocos2dx/example-v4/build-macos
spine-cocos2dx/example/build-ios
spine-cocos2dx/example/proj.android/app/.cxx
spine-cocos2dx/example/build-win
spine-godot/godot
spine-godot/spine_godot/*.o
spine-godot/spine_godot/spine-cpp
spine-godot/spine_godot/__pycache__
spine-godot/example/.import
spine-godot/spine_godot/*.obj
*.bc
spine-godot/example/.godot
spine-godot/example-v4/.godot
spine-cocos2dx/example/build-macos
spine-godot/logs
!spine-godot/build
spine-ts/spine-ts.zip
*.d

View File

@ -85,31 +85,75 @@ cp -f ../mix-and-match/export/mix-and-match-pro.skel "$ROOT/spine-cocos2dx/examp
cp -f ../mix-and-match/export/mix-and-match.atlas "$ROOT/spine-cocos2dx/example/Resources/common/"
cp -f ../mix-and-match/export/mix-and-match.png "$ROOT/spine-cocos2dx/example/Resources/common/"
rm "$ROOT/spine-cocos2dx/example-v4/Resources/common/"*
echo "spine-godot"
rm -f "$ROOT"/spine-godot/example/assets/spineboy/*.atlas
rm -f "$ROOT"/spine-godot/example/assets/spineboy/*.png
rm -f "$ROOT"/spine-godot/example/assets/spineboy/*.json
rm -f "$ROOT"/spine-godot/example/assets/spineboy/*.skel
rm -f "$ROOT"/spine-godot/example/assets/raptor/*.atlas
rm -f "$ROOT"/spine-godot/example/assets/raptor/*.png
rm -f "$ROOT"/spine-godot/example/assets/raptor/*.skel
rm -f "$ROOT"/spine-godot/example/assets/mix-and-match/*.atlas
rm -f "$ROOT"/spine-godot/example/assets/mix-and-match/*.png
rm -f "$ROOT"/spine-godot/example/assets/mix-and-match/*.json
rm -f "$ROOT"/spine-godot/example/assets/mix-and-match/*.skel
rm -f "$ROOT"/spine-godot/example/assets/raggedyspineboy/*.atlas
rm -f "$ROOT"/spine-godot/example/assets/raggedyspineboy/*.png
rm -f "$ROOT"/spine-godot/example/assets/raggedyspineboy/*.json
cp -f ../coin/export/coin-pro.skel "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
cp -f ../coin/export/coin.atlas "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
cp -f ../coin/export/coin.png "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
cp -f ../goblins/export/goblins-pro.json "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
cp -f ../goblins/export/goblins.atlas "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
cp -f ../goblins/export/goblins.png "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
cp -f ../spineboy/export/spineboy-pro.json "$ROOT/spine-godot/example/assets/spineboy/"
cp -f ../spineboy/export/spineboy-pro.skel "$ROOT/spine-godot/example/assets/spineboy/"
cp -f ../spineboy/export/spineboy.atlas "$ROOT/spine-godot/example/assets/spineboy/"
cp -f ../spineboy/export/spineboy.png "$ROOT/spine-godot/example/assets/spineboy/"
cp -f ../raptor/export/raptor-pro.json "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
cp -f ../raptor/export/raptor.atlas "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
cp -f ../raptor/export/raptor.png "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
cp -f ../mix-and-match/export/mix-and-match-pro.json "$ROOT/spine-godot/example/assets/mix-and-match/"
cp -f ../mix-and-match/export/mix-and-match.atlas "$ROOT/spine-godot/example/assets/mix-and-match/"
cp -f ../mix-and-match/export/mix-and-match.png "$ROOT/spine-godot/example/assets/mix-and-match/"
cp -f ../spineboy/export/spineboy-pro.json "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
cp -f ../spineboy/export/spineboy.atlas "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
cp -f ../spineboy/export/spineboy.png "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
cp -f ../raptor/export/raptor-pro.skel "$ROOT/spine-godot/example/assets/raptor/"
cp -f ../raptor/export/raptor.atlas "$ROOT/spine-godot/example/assets/raptor/"
cp -f ../raptor/export/raptor.png "$ROOT/spine-godot/example/assets/raptor/"
cp -f ../raptor/manual-maps/raptor-normals.png "$ROOT/spine-godot/example/assets/raptor/n_raptor.png"
cp -f ../raptor/manual-maps/light-sprite.png "$ROOT/spine-godot/example/assets/raptor/light-sprite.png"
cp -f ../tank/export/tank-pro.skel "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
cp -f ../tank/export/tank.atlas "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
cp -f ../tank/export/tank.png "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
cp -f ../../spine-unity/Assets/Spine\ Examples/Spine\ Skeletons/Raggedy\ Spineboy/raggedy\ spineboy.json "$ROOT/spine-godot/example/assets/raggedyspineboy/"
cp -f ../../spine-unity/Assets/Spine\ Examples/Spine\ Skeletons/Raggedy\ Spineboy/Raggedy\ Spineboy.atlas.txt "$ROOT/spine-godot/example/assets/raggedyspineboy/Raggedy Spineboy.atlas"
cp -f ../../spine-unity/Assets/Spine\ Examples/Spine\ Skeletons/Raggedy\ Spineboy/Raggedy\ Spineboy.png "$ROOT/spine-godot/example/assets/raggedyspineboy/"
cp -f ../mix-and-match/export/mix-and-match-pro.skel "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
cp -f ../mix-and-match/export/mix-and-match.atlas "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
cp -f ../mix-and-match/export/mix-and-match.png "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
rm -f "$ROOT"/spine-godot/example-v4/assets/spineboy/*.atlas
rm -f "$ROOT"/spine-godot/example-v4/assets/spineboy/*.png
rm -f "$ROOT"/spine-godot/example-v4/assets/spineboy/*.json
rm -f "$ROOT"/spine-godot/example-v4/assets/spineboy/*.skel
rm -f "$ROOT"/spine-godot/example-v4/assets/raptor/*.atlas
rm -f "$ROOT"/spine-godot/example-v4/assets/raptor/*.png
rm -f "$ROOT"/spine-godot/example-v4/assets/raptor/*.skel
rm -f "$ROOT"/spine-godot/example-v4/assets/mix-and-match/*.atlas
rm -f "$ROOT"/spine-godot/example-v4/assets/mix-and-match/*.png
rm -f "$ROOT"/spine-godot/example-v4/assets/mix-and-match/*.json
rm -f "$ROOT"/spine-godot/example-v4/assets/mix-and-match/*.skel
rm -f "$ROOT"/spine-godot/example-v4/assets/raggedyspineboy/*.atlas
rm -f "$ROOT"/spine-godot/example-v4/assets/raggedyspineboy/*.png
rm -f "$ROOT"/spine-godot/example-v4/assets/raggedyspineboy/*.json
cp -f ../spineboy/export/spineboy-pro.json "$ROOT/spine-godot/example-v4/assets/spineboy/"
cp -f ../spineboy/export/spineboy-pro.skel "$ROOT/spine-godot/example-v4/assets/spineboy/"
cp -f ../spineboy/export/spineboy.atlas "$ROOT/spine-godot/example-v4/assets/spineboy/"
cp -f ../spineboy/export/spineboy.png "$ROOT/spine-godot/example-v4/assets/spineboy/"
cp -f ../mix-and-match/export/mix-and-match-pro.json "$ROOT/spine-godot/example-v4/assets/mix-and-match/"
cp -f ../mix-and-match/export/mix-and-match.atlas "$ROOT/spine-godot/example-v4/assets/mix-and-match/"
cp -f ../mix-and-match/export/mix-and-match.png "$ROOT/spine-godot/example-v4/assets/mix-and-match/"
cp -f ../raptor/export/raptor-pro.skel "$ROOT/spine-godot/example-v4/assets/raptor/"
cp -f ../raptor/export/raptor.atlas "$ROOT/spine-godot/example-v4/assets/raptor/"
cp -f ../raptor/export/raptor.png "$ROOT/spine-godot/example-v4/assets/raptor/"
cp -f ../raptor/manual-maps/raptor-normals.png "$ROOT/spine-godot/example-v4/assets/raptor/n_raptor.png"
cp -f ../raptor/manual-maps/light-sprite.png "$ROOT/spine-godot/example-v4/assets/raptor/light-sprite.png"
cp -f ../../spine-unity/Assets/Spine\ Examples/Spine\ Skeletons/Raggedy\ Spineboy/raggedy\ spineboy.json "$ROOT/spine-godot/example-v4/assets/raggedyspineboy/"
cp -f ../../spine-unity/Assets/Spine\ Examples/Spine\ Skeletons/Raggedy\ Spineboy/Raggedy\ Spineboy.atlas.txt "$ROOT/spine-godot/example-v4/assets/raggedyspineboy/Raggedy Spineboy.atlas"
cp -f ../../spine-unity/Assets/Spine\ Examples/Spine\ Skeletons/Raggedy\ Spineboy/Raggedy\ Spineboy.png "$ROOT/spine-godot/example-v4/assets/raggedyspineboy/"
echo "spine-sfml-c"
rm "$ROOT/spine-sfml/c/data/"*

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -25,7 +25,9 @@ spotless {
'spine-sfml/**/*.cpp',
'spine-sfml/**/*.h',
'spine-ue4/**/*.cpp',
'spine-ue4/**/*.h'
'spine-ue4/**/*.h',
'spine-godot/spine_godot/*.cpp',
'spine-godot/spine_godot/*.h'
clangFormat("13.0.1").pathToExe("$System.env.CLANGFORMAT").style('file')
}

View File

@ -67,6 +67,9 @@ namespace spine {
/// or the DefaultMix if no mix duration has been set.
float getMix(Animation *from, Animation *to);
/// Removes all mixes and sets the default mix to 0.
void clear();
private:
class AnimationPair : public SpineObject {
public:

View File

@ -53,6 +53,8 @@ namespace spine {
virtual ~MeshAttachment();
using VertexAttachment::computeWorldVertices;
virtual void computeWorldVertices(Slot &slot, size_t start, size_t count, float *worldVertices, size_t offset,
size_t stride = 2);

View File

@ -73,6 +73,11 @@ void AnimationStateData::setDefaultMix(float inValue) {
_defaultMix = inValue;
}
void AnimationStateData::clear() {
_defaultMix = 0;
_animationToMixTime.clear();
}
AnimationStateData::AnimationPair::AnimationPair(Animation *a1, Animation *a2) : _a1(a1), _a2(a2) {
}

View File

@ -453,17 +453,29 @@ Skin *SkeletonBinary::readSkin(DataInput *input, bool defaultSkin, SkeletonData
skin = new (__FILE__, __LINE__) Skin("default");
} else {
skin = new (__FILE__, __LINE__) Skin(readStringRef(input, skeletonData));
for (int i = 0, n = readVarint(input, true); i < n; i++)
skin->getBones().add(skeletonData->_bones[readVarint(input, true)]);
for (int i = 0, n = readVarint(input, true); i < n; i++) {
int boneIndex = readVarint(input, true);
if (boneIndex >= (int) skeletonData->_bones.size()) return NULL;
skin->getBones().add(skeletonData->_bones[boneIndex]);
}
for (int i = 0, n = readVarint(input, true); i < n; i++)
skin->getConstraints().add(skeletonData->_ikConstraints[readVarint(input, true)]);
for (int i = 0, n = readVarint(input, true); i < n; i++) {
int ikIndex = readVarint(input, true);
if (ikIndex >= (int) skeletonData->_ikConstraints.size()) return NULL;
skin->getConstraints().add(skeletonData->_ikConstraints[ikIndex]);
}
for (int i = 0, n = readVarint(input, true); i < n; i++)
skin->getConstraints().add(skeletonData->_transformConstraints[readVarint(input, true)]);
for (int i = 0, n = readVarint(input, true); i < n; i++) {
int transformIndex = readVarint(input, true);
if (transformIndex >= (int) skeletonData->_transformConstraints.size()) return NULL;
skin->getConstraints().add(skeletonData->_transformConstraints[transformIndex]);
}
for (int i = 0, n = readVarint(input, true); i < n; i++)
skin->getConstraints().add(skeletonData->_pathConstraints[readVarint(input, true)]);
for (int i = 0, n = readVarint(input, true); i < n; i++) {
int pathIndex = readVarint(input, true);
if (pathIndex >= (int) skeletonData->_pathConstraints.size()) return NULL;
skin->getConstraints().add(skeletonData->_pathConstraints[pathIndex]);
}
slotCount = readVarint(input, true);
}
@ -476,7 +488,7 @@ Skin *SkeletonBinary::readSkin(DataInput *input, bool defaultSkin, SkeletonData
skin->setAttachment(slotIndex, String(name), attachment);
else {
delete skin;
return nullptr;
return NULL;
}
}
}
@ -515,7 +527,7 @@ Attachment *SkeletonBinary::readAttachment(DataInput *input, Skin *skin, int slo
RegionAttachment *region = _attachmentLoader->newRegionAttachment(*skin, String(name), String(path), sequence);
if (!region) {
setError("Error reading attachment: ", name.buffer());
return nullptr;
return NULL;
}
region->_path = path;
region->_rotation = rotation;
@ -536,7 +548,7 @@ Attachment *SkeletonBinary::readAttachment(DataInput *input, Skin *skin, int slo
BoundingBoxAttachment *box = _attachmentLoader->newBoundingBoxAttachment(*skin, String(name));
if (!box) {
setError("Error reading attachment: ", name.buffer());
return nullptr;
return NULL;
}
readVertices(input, box->getVertices(), box->getBones(), vertexCount);
box->setWorldVerticesLength(vertexCount << 1);
@ -577,7 +589,7 @@ Attachment *SkeletonBinary::readAttachment(DataInput *input, Skin *skin, int slo
MeshAttachment *mesh = _attachmentLoader->newMeshAttachment(*skin, String(name), String(path), sequence);
if (!mesh) {
setError("Error reading attachment: ", name.buffer());
return nullptr;
return NULL;
}
mesh->_path = path;
mesh->_color.set(color);
@ -616,7 +628,7 @@ Attachment *SkeletonBinary::readAttachment(DataInput *input, Skin *skin, int slo
MeshAttachment *mesh = _attachmentLoader->newMeshAttachment(*skin, String(name), String(path), sequence);
if (!mesh) {
setError("Error reading attachment: ", name.buffer());
return nullptr;
return NULL;
}
mesh->_path = path;
mesh->_color.set(color);
@ -635,7 +647,7 @@ Attachment *SkeletonBinary::readAttachment(DataInput *input, Skin *skin, int slo
PathAttachment *path = _attachmentLoader->newPathAttachment(*skin, String(name));
if (!path) {
setError("Error reading attachment: ", name.buffer());
return nullptr;
return NULL;
}
path->_closed = readBoolean(input);
path->_constantSpeed = readBoolean(input);
@ -657,7 +669,7 @@ Attachment *SkeletonBinary::readAttachment(DataInput *input, Skin *skin, int slo
PointAttachment *point = _attachmentLoader->newPointAttachment(*skin, String(name));
if (!point) {
setError("Error reading attachment: ", name.buffer());
return nullptr;
return NULL;
}
point->_rotation = readFloat(input);
point->_x = readFloat(input) * _scale;
@ -675,7 +687,7 @@ Attachment *SkeletonBinary::readAttachment(DataInput *input, Skin *skin, int slo
ClippingAttachment *clip = _attachmentLoader->newClippingAttachment(*skin, name);
if (!clip) {
setError("Error reading attachment: ", name.buffer());
return nullptr;
return NULL;
}
readVertices(input, clip->getVertices(), clip->getBones(), vertexCount);
clip->setWorldVerticesLength(vertexCount << 1);
@ -687,7 +699,7 @@ Attachment *SkeletonBinary::readAttachment(DataInput *input, Skin *skin, int slo
return clip;
}
}
return nullptr;
return NULL;
}
void SkeletonBinary::readVertices(DataInput *input, Vector<float> &vertices, Vector<size_t> &bones, int vertexCount) {

85
spine-godot/README.md Normal file
View File

@ -0,0 +1,85 @@
# spine-godot
The spine-godot runtime provides functionality to load, manipulate and render [Spine](http://esotericsoftware.com) skeletal animation data using [Godot](https://godotengine.org/). spine-godot is based on [spine-cpp](../spine-cpp).
# See the [spine-godot documentation](http://esotericsoftware.com/spine-godot]) for in-depth information.
## Licensing
You are welcome to evaluate the Spine Runtimes and the examples we provide in this repository free of charge.
You can integrate the Spine Runtimes into your software free of charge, but users of your software must have their own [Spine license](https://esotericsoftware.com/spine-purchase). Please make your users aware of this requirement! This option is often chosen by those making development tools, such as an SDK, game toolkit, or software library.
In order to distribute your software containing the Spine Runtimes to others that don't have a Spine license, you need a [Spine license](https://esotericsoftware.com/spine-purchase) at the time of integration. Then you can distribute your software containing the Spine Runtimes however you like, provided others don't modify it or use it to create new software. If others want to do that, they'll need their own Spine license.
For the official legal terms governing the Spine Runtimes, please read the [Spine Runtimes License Agreement](http://esotericsoftware.com/spine-runtimes-license) and Section 2 of the [Spine Editor License Agreement](http://esotericsoftware.com/spine-editor-license#s2).
## Spine version
spine-godot works with data exported from Spine 4.2.xx.
spine-godot supports all Spine features, except two-color tinting and the screen blend mode.
## Setup
spine-godot works with the latest stable Godot 3.4 release. It requires compilation of Godot, as spine-godot is implemented as a module.
> *NOTE:* spine-godot also compiles and works against Godot 4.x. However, we currently can not guarantee stability, as Godot 4.x is still heavily in flux.
### Pre-built Godot editor and export template binaries
We provide prebuilt Godot editor and export template binaries for Godot 3.4.4-stable:
* [Godot Editor Windows](https://spine-godot.s3.eu-central-1.amazonaws.com/4.2-beta/3.4.4-stable/godot-editor-windows.zip)
* [Godot Editor Linux](https://spine-godot.s3.eu-central-1.amazonaws.com/4.2-beta/3.4.4-stable/godot-editor-linux.zip)
* [Godot Editor macOS](https://spine-godot.s3.eu-central-1.amazonaws.com/4.2-beta/3.4.4-stable/godot-editor-macos.zip)
* [Godot export templates for Windows, Linux, macOS, Web, Android, iOS](https://spine-godot.s3.eu-central-1.amazonaws.com/4.2-beta/3.4.4-stable/spine-godot-templates-4.2-beta-3.4.4-stable.tpz)
### Building the Godot editor and export templates locally
If you want to build the Godot editor and export templates yourself, either because you want to add custom engine modules or for engine development, you can use the shell scripts in the `spine-godot/build` folder.
> *NOTE:* Make sure you have all build dependencies installed before attempting this, as per the [official instructions by Godot](https://docs.godotengine.org/en/stable/development/compiling/index.html).
To build a Godot editor binary, run the following in a Bash shell (use Git Bash on Windows):
```
cd spine-godot
./build/setup.sh 3.4.4-stable false
./build/build.sh release_debug
```
The first argument to `setup.sh` is the Godot repository branch or commit hash you want to build the Godot editor from. The second argument specifies whether you want to compile the editor for development, which will include support for Live++ on Windows, and disable many modules so compilation is faster.
The first argument to `build.sh` specifies the optimization level of the resulting binary. Supported values are `debug`, which allows full debugging but may be slow due to missing optimizations, and `release_debug`, which is generally used for release builds of the Godot editor.
The resulting Godot editor binary can then be found in `spine-godot/godot/bin`.
To build the export template for a specific platform, run the following in a Bash shell (use Git Bash on Windows):
```
cd spine-godot
./build/setup.sh 3.4.4-stable false
./build/build-templates.sh windows
```
The first argument to `setup.sh` is the Godot repository branch or commit hash you want to build the Godot editor from. The second argument must be `false`.
The first argument to `built-templates.sh` is the platform to compile the template for. Valid values are `windows`, `linux`, `macos`, `web`, `android`, and `ios`. Note that macOS and iOS export templates can only be build on a machine running macOS. See the [official instructions by Godot](https://docs.godotengine.org/en/stable/development/compiling/index.html).
The resulting Godot export template binary can then be found in `spine-godot/godot/bin`.
### Building the Godot editor and export templates via GitHub Actions
This repository contains a GitHub workflow in `.github/workflows/spine-godot.yml` that allows building all Godot editor and export template binaries through GitHub actions. This may be simpler than compiling these artifacts locally. To use the GitHub workflow:
1. Clone this repository
2. Enable GitHub workflows on the cloned repository
3. Manually trigger the `spine-godot` workflow.
The resulting binaries will be attached as artifacts to a sucessful workflow run.
## Example
Sample projects for both Godot 3.4.x and Godot 4.x are provided in the `example/` and `example-v4/` folders respectively. They illustrate all spine-godot functionality and can be opened and exported with the pre-built or custom build Godot editor and export template binaries.

View File

@ -0,0 +1,125 @@
#!/bin/bash
set -e
dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
pushd $dir > /dev/null
if [ ! "$#" -eq 1 ]; then
echo "Usage: ./build-templates.sh <platform>"
echo
echo "e.g.:"
echo " ./build-templates.sh windows"
echo " ./build-templates.sh linux"
echo " ./build-templates.sh macos"
echo " ./build-templates.sh ios"
echo " ./build-templates.sh android"
echo " ./build-templates.sh web"
echo
exit 1
fi
if [ ! -d ../godot ]; then
echo "No Godot clone found. Run ./setup.sh <Godot branch or tag> <dev> first."
exit 1
fi
platform=${1%/}
cpus=2
if [ "$OSTYPE" = "msys" ]; then
cpus=$NUMBER_OF_PROCESSORS
elif [[ "$OSTYPE" = "darwin"* ]]; then
cpus=$(sysctl -n hw.logicalcpu)
else
cpus=$(grep -c ^processor /proc/cpuinfo)
fi
pushd ../godot
if [ "$platform" = "windows" ]; then
# --- Windows ---
#generates windows_64_debug.exe and windows_64_release.exe
scons platform=windows tools=no target=release custom_modules="../spine_godot" --jobs=$cpus
scons platform=windows tools=no target=release_debug custom_modules="../spine_godot" --jobs=$cpus
cp bin/godot.windows.opt.64.exe bin/windows_64_release.exe
cp bin/godot.windows.opt.debug.64.exe bin/windows_64_debug.exe
elif [ "$platform" = "macos" ]; then
# --- macOS ---
# generates osx.zip
scons platform=osx tools=no target=release arch=x86_64 custom_modules="../spine_godot" --jobs=$cpus
scons platform=osx tools=no target=release_debug arch=x86_64 custom_modules="../spine_godot" --jobs=$cpus
scons platform=osx tools=no target=release arch=arm64 custom_modules="../spine_godot" --jobs=$cpus
scons platform=osx tools=no target=release_debug arch=arm64 custom_modules="../spine_godot" --jobs=$cpus
lipo -create bin/godot.osx.opt.x86_64 bin/godot.osx.opt.arm64 -output bin/godot.osx.opt.universal
lipo -create bin/godot.osx.opt.debug.x86_64 bin/godot.osx.opt.debug.arm64 -output bin/godot.osx.opt.debug.universal
strip -S -x bin/godot.osx.opt.universal
pushd bin
cp -r ../misc/dist/osx_template.app .
mkdir -p osx_template.app/Contents/MacOS
cp godot.osx.opt.universal osx_template.app/Contents/MacOS/godot_osx_release.64
cp godot.osx.opt.debug.universal osx_template.app/Contents/MacOS/godot_osx_debug.64
chmod +x osx_template.app/Contents/MacOS/godot_osx*
rm -rf osx.zip
zip -q -9 -r osx.zip osx_template.app
popd
elif [ "$platform" = "ios" ]; then
# --- iOS --
# generates iphone.zip
scons p=iphone tools=no target=release arch=arm64 custom_modules="../spine_godot" --jobs=$cpus
scons p=iphone tools=no target=release_debug arch=arm64 custom_modules="../spine_godot" --jobs=$cpus
scons p=iphone tools=no target=release arch=arm64 ios_simulator=yes custom_modules="../spine_godot" --jobs=$cpus
scons p=iphone tools=no target=release arch=x86_64 ios_simulator=yes custom_modules="../spine_godot" --jobs=$cpus
scons p=iphone tools=no target=release_debug arch=arm64 ios_simulator=yes custom_modules="../spine_godot" --jobs=$cpus
scons p=iphone tools=no target=release_debug arch=x86_64 ios_simulator=yes custom_modules="../spine_godot" --jobs=$cpus
lipo -create bin/libgodot.iphone.opt.arm64.simulator.a bin/libgodot.iphone.opt.x86_64.simulator.a -output bin/libgodot.iphone.opt.simulator.a
lipo -create bin/libgodot.iphone.opt.debug.arm64.simulator.a bin/libgodot.iphone.opt.debug.x86_64.simulator.a -output bin/libgodot.iphone.opt.debug.simulator.a
strip -S -x bin/libgodot.iphone.opt.arm64.a
strip -S -x bin/libgodot.iphone.opt.simulator.a
pushd bin
cp -r ../misc/dist/ios_xcode .
cp libgodot.iphone.opt.arm64.a ios_xcode/libgodot.iphone.release.xcframework/ios-arm64/libgodot.a
cp libgodot.iphone.opt.simulator.a ios_xcode/libgodot.iphone.release.xcframework/ios-arm64_x86_64-simulator/libgodot.a
cp libgodot.iphone.opt.debug.arm64.a ios_xcode/libgodot.iphone.debug.xcframework/ios-arm64/libgodot.a
cp libgodot.iphone.opt.debug.simulator.a ios_xcode/libgodot.iphone.debug.xcframework/ios-arm64_x86_64-simulator/libgodot.a
rm -rf iphone.zip
pushd ios_xcode
zip -q -9 -r ../iphone.zip *
popd
popd
elif [ "$platform" = "web" ]; then
# --- WEB ---
# generates webassembly_debug.zip, webassembly_release.zip
scons platform=javascript tools=no target=release custom_modules="../spine_godot" --jobs=$cpus
scons platform=javascript tools=no target=release_debug custom_modules="../spine_godot" --jobs=$cpus
mv bin/godot.javascript.opt.zip bin/webassembly_release.zip
mv bin/godot.javascript.opt.debug.zip bin/webassembly_debug.zip
elif [ "$platform" = "android" ]; then
# --- ANROID ---
# generates android_release.apk, android_debug.apk, android_source.zip
scons platform=android target=release android_arch=armv7 custom_modules="../spine_godot" --jobs=$cpus
scons platform=android target=release_debug android_arch=armv7 custom_modules="../spine_godot" --jobs=$cpus
scons platform=android target=release android_arch=arm64v8 custom_modules="../spine_godot" --jobs=$cpus
scons platform=android target=release_debug android_arch=arm64v8 custom_modules="../spine_godot" --jobs=$cpus
pushd platform/android/java
chmod a+x gradlew
./gradlew generateGodotTemplates
popd
elif [ "$platform" = "linux" ]; then
# --- Linix ---
# generates linux_x11_64_release, linux_x11_64_debug
scons platform=x11 tools=no target=release bits=64 custom_modules="../spine_godot" --jobs=$cpus
scons platform=x11 tools=no target=release_debug bits=64 custom_modules="../spine_godot" --jobs=$cpus
strip bin/godot.x11.opt.64
strip bin/godot.x11.opt.debug.64
cp bin/godot.x11.opt.64 bin/linux_x11_64_release
cp bin/godot.x11.opt.debug.64 bin/linux_x11_64_debug
else
echo "Unknown platform: $platform"
exit 1
fi
popd

70
spine-godot/build/build.sh Executable file
View File

@ -0,0 +1,70 @@
#!/bin/bash
set -e
dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
pushd $dir > /dev/null
if [ ! "$#" -eq 1 ]; then
echo "Usage: ./build.sh <target>"
echo
echo "e.g.:"
echo " ./build.sh release_debug"
echo " ./build.sh debug"
echo
exit 1
fi
if [ ! -d ../godot ]; then
echo "No Godot clone found. Run ./setup.sh <Godot branch or tag> <dev> first."
exit 1
fi
target="target=${1%/}"
dev="false"
if [ -f "../godot/custom.py" ]; then
dev="true"
fi
cpus=2
if [ "$OSTYPE" = "msys" ]; then
cpus=$NUMBER_OF_PROCESSORS
elif [[ "$OSTYPE" = "darwin"* ]]; then
cpus=$(sysctl -n hw.logicalcpu)
else
cpus=$(grep -c ^processor /proc/cpuinfo)
fi
echo "CPUS: $cpus"
pushd ../godot
if [ `uname` == 'Darwin' ] && [ $dev = "false" ]; then
scons $target arch=x86_64 compiledb=yes custom_modules="../spine_godot" --jobs=$cpus
scons $target arch=arm64 compiledb=yes custom_modules="../spine_godot" --jobs=$cpus
pushd bin
cp -r ../misc/dist/osx_tools.app .
mv osx_tools.app Godot.app
mkdir -p Godot.app/Contents/MacOS
if [ "$target" = "debug" ]; then
lipo -create godot.osx.tools.x86_64 godot.osx.tools.arm64 -output godot.osx.tools.universal
strip -S -x godot.osx.tools.universal
cp godot.osx.tools.universal Godot.app/Contents/MacOS/Godot
else
lipo -create godot.osx.opt.tools.x86_64 godot.osx.opt.tools.arm64 -output godot.osx.opt.tools.universal
strip -S -x godot.osx.opt.tools.universal
cp godot.osx.opt.tools.universal Godot.app/Contents/MacOS/Godot
fi
chmod +x Godot.app/Contents/MacOS/Godot
popd
else
if [ "$OSTYPE" = "msys" ]; then
target="$target vsproj=yes livepp=$LIVEPP"
fi
scons $target compiledb=yes custom_modules="../spine_godot" --jobs=$cpus
if [ -f "bin/godot.x11.opt.tools.64" ]; then
strip bin/godot.x11.opt.tools.64
fi
fi
popd
popd > /dev/null

View File

@ -0,0 +1,33 @@
# list of disabled modules for faster compilation of the engine
module_arkit_enabled = "no"
module_assimp_enabled = "no"
module_bmp_enabled = "no"
module_denoise_enabled = "no"
module_bullet_enabled = "no"
module_raycast_enabled = "no"
module_camera_enabled = "no"
module_csg_enabled = "no"
module_dds_enabled = "no"
module_enet_enabled = "no"
module_etc_enabled = "no"
module_gdnative_enabled = "no"
module_gridmap_enabled = "no"
module_hdr_enabled = "no"
module_jsonrpc_enabled = "no"
module_mbedtls_enabled = "no"
module_mobile_vr_enabled = "no"
module_opensimplex_enabled = "no"
module_opus_enabled = "no"
module_pvr_enabled = "no"
module_recast_enabled = "no"
module_squish_enabled = "no"
module_tga_enabled = "no"
module_theora_enabled = "no"
module_tinyexr_enabled = "no"
module_upnp_enabled = "no"
module_vhacd_enabled = "no"
module_webm_enabled = "no"
module_webp_enabled = "no"
module_webrtc_enabled = "no"
module_websocket_enabled = "no"
module_xatlas_unwrap_enabled = "no"

View File

@ -0,0 +1,124 @@
diff --git a/methods.py b/methods.py
index fe84641e9d0625b4f0c4d90a65839337d6120ff8..51ef8550d3a9def0a2ff88a2fde4fa096c085de9 100644
--- a/methods.py
+++ b/methods.py
@@ -734,6 +734,7 @@ def generate_vs_project(env, num_jobs):
f"target={configuration_getter}",
"progress=no",
"tools=!tools!",
+ "livepp=%s" % env["livepp"],
"-j%s" % num_jobs,
]
diff --git a/platform/windows/detect.py b/platform/windows/detect.py
index 0b18fb74fb145e4d2e88ee91abe99f8f39312a46..04880a8fa8209c4002b49f964d86227974ce9ca8 100644
--- a/platform/windows/detect.py
+++ b/platform/windows/detect.py
@@ -44,7 +44,7 @@ def can_build():
def get_opts():
- from SCons.Variables import BoolVariable, EnumVariable
+ from SCons.Variables import BoolVariable, EnumVariable, PathVariable
mingw32 = ""
mingw64 = ""
@@ -73,6 +73,7 @@ def get_opts():
BoolVariable("use_thinlto", "Use ThinLTO", False),
BoolVariable("use_static_cpp", "Link MinGW/MSVC C++ runtime libraries statically", True),
BoolVariable("use_asan", "Use address sanitizer (ASAN)", False),
+ PathVariable("livepp", "Path to the Live++ installation", "", PathVariable.PathAccept),
]
@@ -310,6 +311,19 @@ def configure_msvc(env, manual_msvc_config):
env.AppendUnique(LINKFLAGS=["/STACK:" + str(STACK_SIZE)])
+ # Check if LIVEPP_PATH is set and add #define. Perform
+ # some sanity checks.
+ if env.get("livepp"):
+ if env["target"] == "release_debug" or env["target"] == "debug":
+ print("Found Live++ at %s" % env.get("livepp"))
+ env.AppendUnique(CPPDEFINES=["LIVEPP_PATH=%s" % env.get("livepp")])
+ env.AppendUnique(CPPPATH=[env.get("livepp")])
+ env.AppendUnique(LINKFLAGS=["/FUNCTIONPADMIN"])
+ else:
+ print("Live++ can only be used with targets 'debug' and 'release_debug'")
+ else:
+ print("No Live++ specified.")
+
def configure_mingw(env):
# Workaround for MinGW. See:
diff --git a/platform/windows/godot_windows.cpp b/platform/windows/godot_windows.cpp
index 8de3ef294a99c6f02f6f1380e331e4bb598864ce..8e4c15dd66d1b640a352ed826b25b23917f72cc4 100644
--- a/platform/windows/godot_windows.cpp
+++ b/platform/windows/godot_windows.cpp
@@ -34,6 +34,11 @@
#include <locale.h>
#include <stdio.h>
+#ifdef LIVEPP_PATH
+#include "API/LPP_API.h"
+HMODULE livePP;
+#endif
+
// For export templates, add a section; the exporter will patch it to enclose
// the data appended to the executable (bundled PCK)
#ifndef TOOLS_ENABLED
@@ -147,6 +152,16 @@ char *wc_to_utf8(const wchar_t *wc) {
}
int widechar_main(int argc, wchar_t **argv) {
+#ifdef LIVEPP_PATH
+#define _MKSTR_L(x) _STR_L(x)
+#define _STR_L(x) L#x
+ livePP = lpp::lppLoadAndRegister(_MKSTR_L(LIVEPP_PATH), "Godot");
+ lpp::lppEnableAllCallingModulesSync(livePP);
+ lpp::lppInstallExceptionHandler(livePP);
+#undef _MKSTR_L
+#undef _STR_L
+#endif
+
OS_Windows os(nullptr);
setlocale(LC_CTYPE, "");
@@ -179,6 +194,11 @@ int widechar_main(int argc, wchar_t **argv) {
}
delete[] argv_utf8;
+#ifdef LIVEPP_PATH
+ lpp::lppShutdown(livePP);
+ ::FreeLibrary(livePP);
+#endif
+
return os.get_exit_code();
}
diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp
index 8755bc65dce7e4b88fd509d0cbdbec576356c5f5..50e0d8d0b06bf76d5f4d085d010cf6a683a9e64f 100644
--- a/platform/windows/os_windows.cpp
+++ b/platform/windows/os_windows.cpp
@@ -53,6 +53,11 @@
#include <regstr.h>
#include <shlobj.h>
+#ifdef LIVEPP_PATH
+#include "API/LPP_API.h"
+extern HMODULE livePP;
+#endif
+
extern "C" {
__declspec(dllexport) DWORD NvOptimusEnablement = 1;
__declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;
@@ -677,6 +682,9 @@ void OS_Windows::run() {
if (Main::iteration()) {
break;
}
+#ifdef LIVEPP_PATH
+ lpp::lppSyncPoint(livePP);
+#endif
}
main_loop->finalize();

View File

@ -0,0 +1,123 @@
diff --git a/methods.py b/methods.py
index 9b8cb38c0c1c0fd4ba2917815fdfb7efafb4b646..874e10bcc637632db26b4ac062a5359cd44eaa25 100644
--- a/methods.py
+++ b/methods.py
@@ -688,6 +688,7 @@ def generate_vs_project(env, num_jobs):
"target=$(Configuration)",
"progress=no",
"tools=!tools!",
+ "livepp=%s" % env["livepp"],
"-j%s" % num_jobs,
]
diff --git a/platform/windows/detect.py b/platform/windows/detect.py
index e4facad816b7584fe38dc760356310e0a3937288..2d9da3df65cd3a0b0882ace984002320ebf6c3fc 100644
--- a/platform/windows/detect.py
+++ b/platform/windows/detect.py
@@ -44,7 +44,7 @@ def can_build():
def get_opts():
- from SCons.Variables import BoolVariable, EnumVariable
+ from SCons.Variables import BoolVariable, EnumVariable, PathVariable
mingw32 = ""
mingw64 = ""
@@ -72,6 +72,7 @@ def get_opts():
BoolVariable("use_thinlto", "Use ThinLTO", False),
BoolVariable("use_static_cpp", "Link MinGW/MSVC C++ runtime libraries statically", True),
BoolVariable("use_asan", "Use address sanitizer (ASAN)", False),
+ PathVariable("livepp", "Path to the Live++ installation", "", PathVariable.PathAccept),
]
@@ -296,6 +297,18 @@ def configure_msvc(env, manual_msvc_config):
env.AppendUnique(LINKFLAGS=["/STACK:" + str(STACK_SIZE)])
+ # Check if LIVEPP_PATH is set and add #define. Perform
+ # some sanity checks.
+ if env.get("livepp"):
+ if env["target"] == "release_debug" or env["target"] == "debug":
+ print("Found Live++ at %s" % env.get("livepp"))
+ env.AppendUnique(CPPDEFINES=["LIVEPP_PATH=%s" % env.get("livepp")])
+ env.AppendUnique(CPPPATH=[env.get("livepp")])
+ env.AppendUnique(LINKFLAGS=["/FUNCTIONPADMIN"])
+ else:
+ print("Live++ can only be used with targets 'debug' and 'release_debug'")
+ else:
+ print("No Live++ specified.")
def configure_mingw(env):
# Workaround for MinGW. See:
diff --git a/platform/windows/godot_windows.cpp b/platform/windows/godot_windows.cpp
index d7d9e4eace00a696abbb47cb9632f40e183a4ec4..e362320e51c725cd01f292887bd93442752c1c48 100644
--- a/platform/windows/godot_windows.cpp
+++ b/platform/windows/godot_windows.cpp
@@ -34,6 +34,11 @@
#include <locale.h>
#include <stdio.h>
+#ifdef LIVEPP_PATH
+#include "API/LPP_API.h"
+HMODULE livePP;
+#endif
+
// For export templates, add a section; the exporter will patch it to enclose
// the data appended to the executable (bundled PCK)
#ifndef TOOLS_ENABLED
@@ -136,6 +141,16 @@ char *wc_to_utf8(const wchar_t *wc) {
}
__declspec(dllexport) int widechar_main(int argc, wchar_t **argv) {
+#ifdef LIVEPP_PATH
+#define _MKSTR_L(x) _STR_L(x)
+#define _STR_L(x) L#x
+ livePP = lpp::lppLoadAndRegister(_MKSTR_L(LIVEPP_PATH), "Godot");
+ lpp::lppEnableAllCallingModulesSync(livePP);
+ lpp::lppInstallExceptionHandler(livePP);
+#undef _MKSTR_L
+#undef _STR_L
+#endif
+
OS_Windows os(NULL);
setlocale(LC_CTYPE, "");
@@ -170,6 +185,11 @@ __declspec(dllexport) int widechar_main(int argc, wchar_t **argv) {
}
delete[] argv_utf8;
+#ifdef LIVEPP_PATH
+ lpp::lppShutdown(livePP);
+ ::FreeLibrary(livePP);
+#endif
+
return os.get_exit_code();
};
diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp
index 8b28cbf1f23d6574aac41a3676fea64ddf786fc4..0124d4ac9652df9ba682ab8cc18b4008461d74cf 100644
--- a/platform/windows/os_windows.cpp
+++ b/platform/windows/os_windows.cpp
@@ -53,6 +53,11 @@
#include <regstr.h>
#include <shlobj.h>
+#ifdef LIVEPP_PATH
+#include "API/LPP_API.h"
+extern HMODULE livePP;
+#endif
+
static const WORD MAX_CONSOLE_LINES = 1500;
extern "C" {
@@ -3371,6 +3376,9 @@ void OS_Windows::run() {
process_events(); // get rid of pending events
if (Main::iteration())
break;
+#ifdef LIVEPP_PATH
+ lpp::lppSyncPoint(livePP);
+#endif
};
main_loop->finish();

39
spine-godot/build/setup.sh Executable file
View File

@ -0,0 +1,39 @@
#!/bin/bash
set -e
dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
pushd $dir > /dev/null
if [ ! "$#" -eq 2 ]; then
echo "Usage: ./setup.sh <Godot branch or tag> <dev:true|false>"
echo
echo "e.g.:"
echo " ./setup.sh 3.4.4-stable true"
echo " ./setup.sh master false"
echo
exit 1
fi
branch=${1%/}
dev=${2%/}
pushd ..
rm -rf godot
git clone --depth 1 https://github.com/godotengine/godot.git -b $branch
if [ $dev = "true" ]; then
cp -r .idea godot
cp build/custom.py godot
rm -rf example/.import
rm -rf example/.godot
if [ "$OSTYPE" = "msys" ]; then
pushd godot
git apply ../build/livepp.patch
git apply ../build/livepp-v4.patch
popd
fi
fi
cp -r ../spine-cpp/spine-cpp spine_godot
popd
popd > /dev/null

View File

@ -0,0 +1,4 @@
deb http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiverse

Binary file not shown.

View File

@ -0,0 +1,16 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOGGVorbis"
uid="uid://can7k84o8svum"
path="res://.godot/imported/footstep.ogg-789c3f1e3c4e0ca3bebcb13f1160f623.oggvorbisstr"
[deps]
source_file="res://assets/footstep.ogg"
dest_files=["res://.godot/imported/footstep.ogg-789c3f1e3c4e0ca3bebcb13f1160f623.oggvorbisstr"]
[params]
loop=false
loop_offset=0

View File

@ -0,0 +1,10 @@
[gd_resource type="SpineSkeletonDataResource" load_steps=3 format=2]
[ext_resource path="res://assets/mix-and-match/mix-and-match.atlas" type="SpineAtlasResource" id=1]
[ext_resource path="res://assets/mix-and-match/mix-and-match-pro.json" type="SpineSkeletonFileResource" id=2]
[resource]
atlas_res = ExtResource( 1 )
skeleton_file_res = ExtResource( 2 )
animations = null
skins = null

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,14 @@
[remap]
importer="spine.json"
type="SpineSkeletonFileResource"
uid="uid://bijrb2mt3vodc"
path="res://.godot/imported/mix-and-match-pro.json-57325a5014e6fd56fc4a86824bc458ea.spjson"
[deps]
source_file="res://assets/mix-and-match/mix-and-match-pro.json"
dest_files=["res://.godot/imported/mix-and-match-pro.json-57325a5014e6fd56fc4a86824bc458ea.spjson"]
[params]

View File

@ -0,0 +1,362 @@
mix-and-match.png
size: 1024, 512
filter: Linear, Linear
scale: 0.5
base-head
bounds: 587, 2, 95, 73
boy/arm-front
bounds: 558, 271, 36, 115
boy/backpack
bounds: 235, 109, 119, 153
boy/backpack-pocket
bounds: 328, 73, 34, 62
rotate: 90
boy/backpack-strap-front
bounds: 665, 79, 38, 88
boy/backpack-up
bounds: 395, 364, 21, 70
rotate: 90
boy/body
bounds: 251, 264, 97, 132
rotate: 90
boy/boot-ribbon-front
bounds: 648, 131, 9, 11
boy/collar
bounds: 744, 4, 73, 29
rotate: 90
boy/ear
bounds: 383, 109, 19, 23
rotate: 90
boy/eye-back-low-eyelid
bounds: 739, 284, 17, 6
rotate: 90
boy/eye-back-pupil
bounds: 832, 443, 8, 9
rotate: 90
boy/eye-back-up-eyelid
bounds: 558, 264, 23, 5
boy/eye-back-up-eyelid-back
bounds: 802, 491, 19, 10
rotate: 90
boy/eye-front-low-eyelid
bounds: 386, 363, 22, 7
rotate: 90
boy/eye-front-pupil
bounds: 816, 389, 9, 9
boy/eye-front-up-eyelid
bounds: 160, 71, 31, 6
rotate: 90
boy/eye-front-up-eyelid-back
bounds: 801, 434, 26, 9
rotate: 90
boy/eye-iris-back
bounds: 618, 264, 17, 17
boy/eye-iris-front
bounds: 727, 264, 18, 18
boy/eye-white-back
bounds: 580, 131, 20, 12
boy/eye-white-front
bounds: 510, 130, 27, 13
boy/eyebrow-back
bounds: 751, 88, 20, 11
rotate: 90
boy/eyebrow-front
bounds: 483, 130, 25, 11
boy/hair-back
bounds: 494, 388, 122, 81
rotate: 90
boy/hair-bangs
bounds: 667, 284, 70, 37
boy/hair-side
bounds: 789, 374, 25, 43
boy/hand-backfingers
bounds: 467, 364, 19, 21
boy/hand-front-fingers
bounds: 488, 364, 19, 21
boy/hat
bounds: 615, 417, 93, 56
rotate: 90
boy/leg-front
bounds: 138, 104, 31, 158
boy/mouth-close
bounds: 551, 365, 21, 5
rotate: 90
girl-blue-cape/mouth-close
bounds: 551, 365, 21, 5
rotate: 90
girl-spring-dress/mouth-close
bounds: 551, 365, 21, 5
rotate: 90
girl/mouth-close
bounds: 551, 365, 21, 5
rotate: 90
boy/mouth-smile
bounds: 705, 79, 29, 7
boy/nose
bounds: 836, 473, 17, 10
rotate: 90
boy/pompom
bounds: 747, 273, 48, 43
rotate: 90
boy/zip
bounds: 648, 144, 14, 23
girl-blue-cape/back-eyebrow
bounds: 602, 131, 18, 12
girl-blue-cape/body-dress
bounds: 2, 264, 109, 246
girl-blue-cape/body-ribbon
bounds: 615, 283, 50, 38
girl-blue-cape/cape-back
bounds: 2, 69, 134, 193
girl-blue-cape/cape-back-up
bounds: 386, 387, 123, 106
rotate: 90
girl-blue-cape/cape-ribbon
bounds: 675, 264, 50, 18
girl-blue-cape/cape-shoulder-back
bounds: 751, 110, 49, 59
girl-blue-cape/cape-shoulder-front
bounds: 113, 264, 62, 76
rotate: 90
girl-blue-cape/cape-up-front
bounds: 399, 264, 98, 117
rotate: 90
girl-blue-cape/ear
bounds: 775, 2, 19, 23
girl-spring-dress/ear
bounds: 775, 2, 19, 23
girl/ear
bounds: 775, 2, 19, 23
girl-blue-cape/eye-back-low-eyelid
bounds: 802, 463, 17, 6
girl-spring-dress/eye-back-low-eyelid
bounds: 802, 463, 17, 6
girl/eye-back-low-eyelid
bounds: 802, 463, 17, 6
girl-blue-cape/eye-back-pupil
bounds: 816, 367, 8, 9
girl-spring-dress/eye-back-pupil
bounds: 816, 367, 8, 9
girl/eye-back-pupil
bounds: 816, 367, 8, 9
girl-blue-cape/eye-back-up-eyelid
bounds: 554, 131, 24, 12
girl-spring-dress/eye-back-up-eyelid
bounds: 554, 131, 24, 12
girl/eye-back-up-eyelid
bounds: 554, 131, 24, 12
girl-blue-cape/eye-back-up-eyelid-back
bounds: 832, 453, 17, 11
rotate: 90
girl-spring-dress/eye-back-up-eyelid-back
bounds: 832, 453, 17, 11
rotate: 90
girl/eye-back-up-eyelid-back
bounds: 832, 453, 17, 11
rotate: 90
girl-blue-cape/eye-front-low-eyelid
bounds: 739, 303, 18, 6
rotate: 90
girl-spring-dress/eye-front-low-eyelid
bounds: 739, 303, 18, 6
rotate: 90
girl/eye-front-low-eyelid
bounds: 739, 303, 18, 6
rotate: 90
girl-blue-cape/eye-front-pupil
bounds: 816, 378, 9, 9
girl-spring-dress/eye-front-pupil
bounds: 816, 378, 9, 9
girl/eye-front-pupil
bounds: 816, 378, 9, 9
girl-blue-cape/eye-front-up-eyelid
bounds: 392, 77, 30, 14
rotate: 90
girl-spring-dress/eye-front-up-eyelid
bounds: 392, 77, 30, 14
rotate: 90
girl/eye-front-up-eyelid
bounds: 392, 77, 30, 14
rotate: 90
girl-blue-cape/eye-front-up-eyelid-back
bounds: 455, 130, 26, 11
girl-spring-dress/eye-front-up-eyelid-back
bounds: 455, 130, 26, 11
girl/eye-front-up-eyelid-back
bounds: 455, 130, 26, 11
girl-blue-cape/eye-iris-back
bounds: 637, 264, 17, 17
girl-blue-cape/eye-iris-front
bounds: 802, 471, 18, 18
girl-blue-cape/eye-white-back
bounds: 596, 264, 20, 16
girl-spring-dress/eye-white-back
bounds: 596, 264, 20, 16
girl-blue-cape/eye-white-front
bounds: 796, 5, 20, 16
rotate: 90
girl-spring-dress/eye-white-front
bounds: 796, 5, 20, 16
rotate: 90
girl/eye-white-front
bounds: 796, 5, 20, 16
rotate: 90
girl-blue-cape/front-eyebrow
bounds: 608, 149, 18, 12
rotate: 90
girl-blue-cape/hair-back
bounds: 508, 145, 117, 98
rotate: 90
girl-blue-cape/hair-bangs
bounds: 673, 419, 91, 40
rotate: 90
girl-blue-cape/hair-head-side-back
bounds: 196, 331, 30, 52
rotate: 90
girl-blue-cape/hair-head-side-front
bounds: 738, 323, 41, 42
girl-blue-cape/hair-side
bounds: 473, 3, 36, 71
girl-blue-cape/hand-front-fingers
bounds: 509, 365, 19, 21
girl-spring-dress/hand-front-fingers
bounds: 509, 365, 19, 21
girl-blue-cape/leg-front
bounds: 168, 72, 30, 158
rotate: 90
girl-blue-cape/mouth-smile
bounds: 736, 79, 29, 7
girl-spring-dress/mouth-smile
bounds: 736, 79, 29, 7
girl/mouth-smile
bounds: 736, 79, 29, 7
girl-blue-cape/nose
bounds: 747, 264, 11, 7
girl-spring-dress/nose
bounds: 747, 264, 11, 7
girl/nose
bounds: 747, 264, 11, 7
girl-blue-cape/sleeve-back
bounds: 767, 79, 42, 29
girl-blue-cape/sleeve-front
bounds: 408, 76, 52, 119
rotate: 90
girl-spring-dress/arm-front
bounds: 596, 282, 17, 111
girl-spring-dress/back-eyebrow
bounds: 801, 420, 18, 12
girl-spring-dress/body-up
bounds: 179, 4, 64, 66
girl-spring-dress/cloak-down
bounds: 775, 27, 50, 50
girl-spring-dress/cloak-up
bounds: 360, 7, 64, 58
rotate: 90
girl-spring-dress/eye-iris-back
bounds: 656, 264, 17, 17
girl-spring-dress/eye-iris-front
bounds: 814, 492, 18, 18
girl-spring-dress/front-eyebrow
bounds: 822, 472, 18, 12
rotate: 90
girl-spring-dress/hair-back
bounds: 196, 363, 147, 93
rotate: 90
girl-spring-dress/hair-bangs
bounds: 696, 326, 91, 40
rotate: 90
girl-spring-dress/hair-head-side-back
bounds: 529, 76, 30, 52
girl-spring-dress/hair-head-side-front
bounds: 781, 323, 41, 42
girl-spring-dress/hair-side
bounds: 511, 3, 36, 71
girl-spring-dress/leg-front
bounds: 171, 104, 30, 158
girl-spring-dress/neck
bounds: 138, 70, 20, 32
girl-spring-dress/shoulder-ribbon
bounds: 622, 131, 36, 24
rotate: 90
girl-spring-dress/skirt
bounds: 113, 328, 182, 81
rotate: 90
girl-spring-dress/underskirt
bounds: 2, 2, 175, 65
girl/arm-front
bounds: 577, 395, 36, 115
girl/back-eyebrow
bounds: 834, 492, 18, 12
rotate: 90
girl/bag-base
bounds: 191, 264, 62, 58
rotate: 90
girl/bag-strap-front
bounds: 385, 265, 12, 96
girl/bag-top
bounds: 738, 367, 49, 50
girl/body
bounds: 356, 130, 97, 132
girl/boot-ribbon-front
bounds: 539, 130, 13, 13
girl/eye-iris-back
bounds: 821, 424, 17, 17
girl/eye-iris-front
bounds: 812, 443, 18, 18
girl/eye-white-back
bounds: 814, 5, 20, 16
rotate: 90
girl/front-eyebrow
bounds: 816, 400, 18, 12
rotate: 90
girl/hair-back
bounds: 291, 363, 147, 93
rotate: 90
girl/hair-bangs
bounds: 715, 419, 91, 40
rotate: 90
girl/hair-flap-down-front
bounds: 288, 5, 70, 65
girl/hair-head-side-back
bounds: 561, 77, 30, 52
girl/hair-head-side-front
bounds: 757, 419, 41, 42
rotate: 90
girl/hair-patch
bounds: 245, 4, 66, 41
rotate: 90
girl/hair-side
bounds: 549, 3, 36, 71
girl/hair-strand-back-1
bounds: 684, 3, 58, 74
girl/hair-strand-back-2
bounds: 692, 171, 91, 58
rotate: 90
girl/hair-strand-back-3
bounds: 615, 323, 92, 79
rotate: 90
girl/hair-strand-front-1
bounds: 518, 269, 38, 94
girl/hair-strand-front-2
bounds: 593, 79, 70, 50
girl/hair-strand-front-3
bounds: 705, 88, 44, 81
girl/hand-front-fingers
bounds: 530, 365, 19, 21
girl/hat
bounds: 608, 169, 93, 82
rotate: 90
girl/leg-front
bounds: 203, 104, 30, 158
girl/pompom
bounds: 757, 462, 48, 43
rotate: 90
girl/scarf
bounds: 455, 143, 119, 51
rotate: 90
girl/scarf-back
bounds: 420, 2, 72, 51
rotate: 90
girl/zip
bounds: 356, 109, 19, 25
rotate: 90

View File

@ -0,0 +1,15 @@
[remap]
importer="spine.atlas"
type="SpineAtlasResource"
uid="uid://cvu8lycjkd245"
path="res://.godot/imported/mix-and-match.atlas-3d349b543ecdcc01fb29033adaef0841.spatlas"
[deps]
source_file="res://assets/mix-and-match/mix-and-match.atlas"
dest_files=["res://.godot/imported/mix-and-match.atlas-3d349b543ecdcc01fb29033adaef0841.spatlas"]
[params]
normal_map_prefix="n"

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dkpeve6qcxa70"
path="res://.godot/imported/mix-and-match.png-c2d8e28d9f2efc380ff8b95a22dadcc3.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/mix-and-match/mix-and-match.png"
dest_files=["res://.godot/imported/mix-and-match.png-c2d8e28d9f2efc380ff8b95a22dadcc3.ctex"]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/bptc_ldr=0
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -0,0 +1,16 @@
Raggedy Spineboy.png
size: 256, 256
filter: Linear, Linear
pma: true
arm
bounds: 2, 140, 71, 75
rotate: 90
head
bounds: 2, 2, 136, 187
rotate: 90
leg
bounds: 2, 213, 36, 99
rotate: 90
torso
bounds: 103, 187, 62, 95
rotate: 90

View File

@ -0,0 +1,15 @@
[remap]
importer="spine.atlas"
type="SpineAtlasResource"
uid="uid://c75mtwn6dnkwp"
path="res://.godot/imported/Raggedy Spineboy.atlas-07f7c6b30431397bcf472b18d48851e0.spatlas"
[deps]
source_file="res://assets/raggedyspineboy/Raggedy Spineboy.atlas"
dest_files=["res://.godot/imported/Raggedy Spineboy.atlas-07f7c6b30431397bcf472b18d48851e0.spatlas"]
[params]
normal_map_prefix="n"

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://couyrsq850nh6"
path="res://.godot/imported/Raggedy Spineboy.png-8982b59aad5b612b7ed1a5da8b447d00.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/raggedyspineboy/Raggedy Spineboy.png"
dest_files=["res://.godot/imported/Raggedy Spineboy.png-8982b59aad5b612b7ed1a5da8b447d00.ctex"]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/bptc_ldr=0
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -0,0 +1,8 @@
[gd_resource type="SpineSkeletonDataResource" load_steps=3 format=2]
[ext_resource path="res://assets/raggedyspineboy/Raggedy Spineboy.atlas" type="SpineAtlasResource" id=1]
[ext_resource path="res://assets/raggedyspineboy/raggedy spineboy.json" type="SpineSkeletonFileResource" id=2]
[resource]
atlas_res = ExtResource( 1 )
skeleton_file_res = ExtResource( 2 )

View File

@ -0,0 +1,304 @@
{
"skeleton": {
"hash": "ukmbgK+14T0",
"spine": "4.1.23-beta",
"x": -78.45,
"y": -9.66,
"width": 157.48,
"height": 364.98,
"images": "./images/",
"audio": ""
},
"bones": [
{ "name": "root" },
{ "name": "hip", "parent": "root", "x": -0.79, "y": 82.38 },
{ "name": "abdomen", "parent": "hip", "length": 33.5, "rotation": 89.55, "y": -0.1 },
{ "name": "chest", "parent": "abdomen", "length": 29.58, "x": 38.08, "y": 0.73 },
{ "name": "L-arm", "parent": "chest", "length": 32.68, "rotation": -121.23, "x": 24.64, "y": -16.69 },
{ "name": "L-thigh", "parent": "hip", "length": 29.76, "rotation": -81.94, "x": 17.32, "y": -5.2 },
{ "name": "L-foot", "parent": "L-thigh", "length": 37.25, "rotation": -6.29, "x": 37.36, "y": -1.79 },
{ "name": "L-forearm", "parent": "L-arm", "length": 33.69, "rotation": -12.09, "x": 39.1, "y": -2.35 },
{ "name": "R-arm", "parent": "chest", "length": 36.76, "rotation": 133.38, "x": 26, "y": 13.63 },
{ "name": "R-thigh", "parent": "hip", "length": 29.49, "rotation": -93.16, "x": -18.19, "y": -6.06 },
{ "name": "R-foot", "parent": "R-thigh", "length": 39.99, "rotation": -1.8, "x": 36.41, "y": 0.27 },
{ "name": "R-forearm", "parent": "R-arm", "length": 36.13, "rotation": 2.73, "x": 41.66, "y": 0.28 },
{ "name": "head", "parent": "chest", "length": 94.23, "rotation": -2.25, "x": 41.02, "y": -0.11 },
{ "name": "scalp", "parent": "head", "length": 31.95, "rotation": -29.89, "x": 129.34, "y": 15.1 },
{ "name": "hair1", "parent": "scalp", "length": 23.01, "rotation": 68.49, "x": 36.51, "y": 4.13 },
{ "name": "hair2", "parent": "hair1", "length": 23.5, "rotation": 59.56, "x": 29.03, "y": 1.58 }
],
"slots": [
{ "name": "R-arm", "bone": "R-arm", "attachment": "arm" },
{ "name": "L-arm", "bone": "L-arm", "attachment": "arm" },
{ "name": "L-leg", "bone": "L-thigh", "attachment": "leg" },
{ "name": "R-leg", "bone": "R-thigh", "attachment": "leg" },
{ "name": "torso", "bone": "abdomen", "attachment": "torso" },
{ "name": "head", "bone": "head", "attachment": "head" }
],
"skins": [
{
"name": "default",
"attachments": {
"head": {
"head": {
"type": "mesh",
"uvs": [ 0.60755, 0.01864, 0.64146, 0.03355, 0.70227, 0.06028, 0.76687, 0.08869, 0.80696, 0.14524, 0.84158, 0.19407, 1, 0.41294, 1, 0.78562, 0.67349, 1, 0.38214, 1, 0.13935, 0.8937, 0.07949, 0.78808, 0.05899, 0.7519, 0, 0.64781, 0, 0.40213, 0.15055, 0.27784, 0.25632, 0.21734, 0.28424, 0.20137, 0.31117, 0.18597, 0.32034, 0.16739, 0.32984, 0.14814, 0.3317, 0.12798, 0.33358, 0.1076, 0.29623, 0.08869, 0.21779, 0.06978, 0.2514, 0.03195, 0.32659, 0.01699, 0.37521, 0.00732, 0.41202, 0, 0.45684, 0, 0.49046, 0, 0.53155, 0, 0.56517, 0, 0.55023, 0.1049, 0.46058, 0.06437, 0.38587, 0.05086, 0.31117, 0.04816, 0.54649, 0.17516, 0.35973, 0.28865, 0.14308, 0.41294, 0.13188, 0.57777, 0.24767, 0.43186, 0.43817, 0.37511, 0.59878, 0.3616, 0.78181, 0.43726, 0.89761, 0.53994, 0.87616, 0.37787 ],
"triangles": [ 36, 25, 26, 35, 27, 28, 23, 25, 36, 24, 25, 23, 26, 35, 36, 35, 26, 27, 22, 36, 35, 23, 36, 22, 28, 29, 34, 35, 28, 34, 21, 35, 34, 35, 21, 22, 37, 20, 34, 37, 38, 20, 19, 20, 38, 18, 19, 38, 17, 18, 38, 2, 4, 37, 4, 2, 3, 43, 4, 5, 43, 37, 4, 42, 38, 37, 43, 42, 37, 6, 46, 5, 44, 43, 5, 39, 14, 15, 41, 15, 16, 39, 15, 41, 16, 17, 38, 41, 16, 38, 41, 38, 42, 46, 44, 5, 45, 46, 6, 44, 46, 45, 40, 14, 39, 40, 39, 41, 13, 14, 40, 12, 13, 40, 45, 6, 7, 11, 12, 40, 9, 10, 40, 11, 40, 10, 9, 41, 42, 9, 40, 41, 8, 9, 42, 42, 43, 8, 44, 8, 43, 8, 44, 45, 8, 45, 7, 34, 29, 30, 33, 31, 32, 33, 32, 0, 31, 34, 30, 34, 20, 21, 31, 33, 34, 37, 34, 33, 1, 33, 0, 2, 33, 1, 33, 2, 37 ],
"vertices": [ 1, 14, 17.04, -22.66, 1, 3, 14, 11.42, -25.02, 0.97438, 12, 187.6, -11.93, 0.00182, 13, 63.98, 5.58, 0.02381, 2, 14, 1.36, -29.25, 0.37005, 12, 182.37, -21.52, 0.62995, 3, 14, -9.34, -33.75, 0.09775, 12, 176.82, -31.71, 0.82289, 13, 64.49, -16.93, 0.07936, 3, 14, -22.66, -31.7, 0.05494, 12, 165.13, -38.42, 0.86351, 13, 57.7, -28.58, 0.08156, 3, 14, -34.17, -29.93, 0.01796, 12, 155.03, -44.22, 0.89858, 13, 51.83, -38.64, 0.08345, 1, 12, 109.81, -70.7, 1, 1, 12, 30.84, -74.45, 1, 1, 12, -16.96, -26.55, 1, 1, 12, -19.08, 18.11, 1, 1, 12, 1.68, 56.4, 1, 1, 12, 23.63, 66.63, 1, 1, 12, 31.14, 70.14, 1, 1, 12, 52.77, 80.23, 1, 2, 12, 104.83, 82.69, 0.99074, 13, -54.93, 46.39, 0.00926, 3, 12, 132.26, 60.87, 0.88784, 13, -20.27, 41.13, 0.11168, 15, 48.07, 46.13, 4.7E-4, 4, 14, 14.49, 45.72, 0.00833, 12, 145.85, 45.26, 0.85196, 13, -0.71, 34.37, 0.12365, 15, 30.69, 34.9, 0.01605, 4, 14, 14.72, 40.26, 0.01053, 12, 149.44, 41.14, 0.84249, 13, 4.45, 32.59, 0.12681, 15, 26.1, 31.94, 0.02016, 4, 14, 14.94, 35, 0.01266, 12, 152.9, 37.17, 0.83336, 13, 9.43, 30.87, 0.12986, 15, 21.68, 29.08, 0.02412, 4, 14, 17.31, 31.55, 0.05833, 12, 156.9, 35.95, 0.60487, 13, 13.51, 31.8, 0.21603, 15, 19.9, 25.29, 0.12077, 4, 14, 19.76, 27.97, 0.10569, 12, 161.05, 34.68, 0.368, 13, 17.74, 32.78, 0.30535, 15, 18.06, 21.36, 0.22096, 4, 14, 23.06, 25.24, 0.1279, 12, 165.34, 34.6, 0.18497, 13, 21.49, 34.84, 0.23674, 15, 17.37, 17.13, 0.45039, 3, 14, 26.39, 22.47, 0.15034, 13, 25.29, 36.92, 0.16741, 15, 16.67, 12.86, 0.68225, 3, 14, 33.01, 24.76, 0.02128, 13, 25.58, 43.92, 0.03309, 15, 22, 8.32, 0.94563, 1, 15, 33.6, 3.18, 1, 1, 15, 27.7, -4.32, 1, 1, 15, 15.91, -6.38, 1, 1, 15, 8.29, -7.71, 1, 1, 15, 2.52, -8.72, 1, 2, 14, 33.8, -6.24, 0.33703, 15, -4.33, -8.07, 0.66297, 2, 14, 30.77, -10.42, 0.58778, 15, -9.46, -7.58, 0.41222, 2, 14, 27.08, -15.53, 0.81447, 15, -15.74, -6.98, 0.18553, 2, 14, 24.05, -19.7, 0.97838, 15, -20.88, -6.49, 0.02162, 1, 14, 7.37, -4.8, 1, 1, 14, 22.4, 1.3, 1, 1, 15, 7.54, 1.64, 1, 3, 14, 38.63, 17.86, 0.0046, 13, 34.06, 46.62, 0.01618, 15, 18.9, -0.03, 0.97922, 1, 13, 30.82, 1.68, 1, 3, 14, -7.07, 41.74, 7.0E-5, 12, 131.49, 28.69, 0.99828, 15, 16.34, 51.47, 0.00165, 1, 12, 103.58, 60.65, 1, 1, 12, 68.57, 60.72, 1, 1, 12, 100.33, 44.43, 1, 1, 12, 113.74, 15.8, 1, 1, 12, 117.77, -8.69, 1, 1, 12, 103.07, -37.5, 1, 1, 12, 82.15, -56.28, 1, 3, 14, -68.87, -11.37, 0.00371, 12, 116.34, -51.37, 0.97904, 13, 21.84, -64.11, 0.01725 ],
"hull": 33,
"edges": [ 16, 14, 16, 18, 18, 20, 26, 28, 28, 30, 44, 46, 46, 48, 48, 50, 14, 12, 10, 12, 50, 52, 52, 54, 54, 56, 56, 58, 58, 60, 60, 62, 62, 64, 2, 0, 0, 64, 2, 4, 4, 6, 20, 22, 22, 24, 24, 26, 80, 82, 82, 84, 84, 86, 86, 88, 88, 90, 90, 12, 80, 26, 34, 36, 30, 32, 32, 34, 36, 38, 38, 40, 40, 42, 42, 44, 12, 92, 6, 8, 8, 10 ],
"width": 136,
"height": 187
}
},
"L-arm": {
"arm": {
"type": "mesh",
"uvs": [ 1, 0.16418, 0.90368, 0.30178, 0.80735, 0.43938, 0.75345, 0.50664, 0.71536, 0.55417, 0.66561, 0.61626, 0.63234, 0.65778, 0.59417, 0.7054, 0.45366, 0.8527, 0.31316, 1, 0.15658, 1, 0, 1, 0, 0.71458, 0.13235, 0.59074, 0.26471, 0.4669, 0.34675, 0.39836, 0.39153, 0.36096, 0.43008, 0.32876, 0.4689, 0.29633, 0.52302, 0.25113, 0.59417, 0.1917, 0.72983, 0.09585, 0.86549, 0, 1, 0, 0.15703, 0.83582, 0.46722, 0.51561, 0.78995, 0.22527, 0.34029, 0.70958, 0.62889, 0.3843 ],
"triangles": [ 10, 24, 9, 9, 27, 8, 9, 24, 27, 10, 11, 24, 11, 12, 24, 8, 27, 7, 12, 13, 24, 24, 13, 27, 13, 14, 27, 27, 25, 7, 25, 27, 14, 7, 25, 6, 6, 25, 5, 18, 4, 17, 28, 4, 18, 4, 28, 3, 15, 16, 25, 16, 17, 25, 25, 17, 5, 17, 4, 5, 3, 28, 2, 28, 26, 2, 2, 26, 1, 18, 19, 28, 19, 20, 28, 28, 20, 26, 1, 26, 0, 20, 21, 26, 26, 22, 0, 26, 21, 22, 22, 23, 0, 25, 14, 15 ],
"vertices": [ 1, 4, -11.38, 11.41, 1, 1, 4, 0.99, 11.79, 1, 1, 4, 13.36, 12.18, 1, 1, 4, 19.69, 11.97, 1, 2, 4, 24.16, 11.83, 0.91748, 7, -17.58, 10.73, 0.08252, 2, 4, 30, 11.64, 0.75238, 7, -11.83, 11.77, 0.24762, 2, 4, 33.91, 11.51, 0.44551, 7, -7.98, 12.46, 0.55449, 2, 4, 38.39, 11.36, 0.2127, 7, -3.57, 13.26, 0.7873, 2, 4, 53.17, 9.61, 0.07308, 7, 11.25, 14.65, 0.92692, 2, 4, 67.95, 7.86, 0.00873, 7, 26.07, 16.03, 0.99127, 1, 7, 34.26, 8.51, 1, 1, 7, 42.44, 0.99, 1, 1, 7, 27.96, -14.77, 1, 2, 4, 50.33, -20.36, 0.05494, 7, 14.76, -15.25, 0.94506, 2, 4, 37.32, -18.06, 0.23231, 7, 1.56, -15.74, 0.76769, 2, 4, 29.76, -16.28, 0.47868, 7, -6.21, -15.58, 0.52132, 2, 4, 25.63, -15.31, 0.71242, 7, -10.45, -15.5, 0.28758, 2, 4, 22.08, -14.47, 0.81876, 7, -14.1, -15.42, 0.18124, 2, 4, 18.5, -13.63, 0.9506, 7, -17.77, -15.35, 0.0494, 2, 4, 13.51, -12.45, 0.97879, 7, -22.9, -15.25, 0.02121, 2, 4, 6.96, -10.91, 0.99704, 7, -29.63, -15.11, 0.00296, 1, 4, -4.48, -7.2, 1, 1, 4, -15.91, -3.5, 1, 1, 4, -21.43, 4.29, 1, 1, 7, 25.9, -0.53, 1, 2, 4, 31.99, -4.22, 0.80128, 7, -6.56, -3.32, 0.19872, 1, 4, 0.98, 1.89, 1, 1, 7, 9.92, 1.3, 1, 1, 4, 17.32, -0.55, 1 ],
"hull": 24,
"edges": [ 0, 2, 2, 4, 4, 6, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28, 30, 38, 40, 40, 42, 42, 44, 44, 46, 46, 0, 10, 34, 30, 32, 32, 34, 10, 12, 12, 14, 6, 8, 8, 10, 34, 36, 36, 38, 8, 36 ],
"width": 71,
"height": 75
}
},
"L-leg": {
"leg": {
"type": "mesh",
"uvs": [ 1, 0.23129, 1, 0.29498, 1, 0.37025, 1, 0.44552, 1, 0.50921, 1, 0.65976, 1, 0.71766, 1, 0.87399, 0.73924, 1, 0.22971, 1, 0, 0.89715, 0, 0.64818, 0.01978, 0.59915, 0.08517, 0.43712, 0.10542, 0.38694, 0.13057, 0.32459, 0.15317, 0.26859, 0.178, 0.20707, 0.26155, 0, 1, 0, 0.61186, 0.12128, 0.51632, 0.54396 ],
"triangles": [ 21, 13, 4, 21, 4, 5, 12, 13, 21, 12, 21, 5, 12, 5, 6, 11, 12, 6, 9, 10, 11, 11, 6, 9, 6, 8, 9, 7, 8, 6, 20, 18, 19, 20, 19, 0, 17, 18, 20, 17, 20, 0, 17, 0, 1, 16, 17, 1, 16, 1, 2, 15, 16, 2, 15, 2, 3, 14, 15, 3, 14, 3, 4, 13, 14, 4 ],
"vertices": [ 1, 5, 11.02, 15.15, 1, 1, 5, 17.32, 14.75, 1, 2, 5, 24.75, 14.29, 0.95577, 6, -14.29, 14.6, 0.04423, 2, 5, 32.19, 13.83, 0.71874, 6, -6.84, 14.96, 0.28126, 2, 5, 38.49, 13.44, 0.37177, 6, -0.55, 15.26, 0.62823, 2, 5, 53.36, 12.51, 0.00736, 6, 14.34, 15.96, 0.99264, 1, 6, 20.07, 16.24, 1, 1, 6, 35.53, 16.97, 1, 1, 6, 48.43, 8.19, 1, 1, 6, 49.31, -10.13, 1, 1, 6, 39.53, -18.88, 1, 2, 5, 49.98, -23.35, 0.00313, 6, 14.91, -20.05, 0.99687, 2, 5, 45.18, -22.34, 0.02543, 6, 10.03, -19.57, 0.97457, 2, 5, 29.32, -18.99, 0.4709, 6, -6.11, -17.98, 0.5291, 2, 5, 24.4, -17.96, 0.69968, 6, -11.11, -17.49, 0.30032, 2, 5, 18.3, -16.67, 0.89625, 6, -17.32, -16.88, 0.10375, 2, 5, 12.82, -15.51, 0.9779, 6, -22.89, -16.33, 0.0221, 1, 5, 6.79, -14.24, 1, 1, 5, -13.48, -9.97, 1, 1, 5, -11.83, 16.57, 1, 1, 5, -0.72, 1.88, 1, 1, 6, 3.72, -1.97, 1 ],
"hull": 20,
"edges": [ 36, 38, 20, 22, 18, 20, 16, 18, 16, 14, 22, 24, 24, 10, 10, 12, 12, 14, 12, 22, 24, 26, 10, 8, 26, 8, 8, 6, 26, 28, 6, 28, 28, 30, 6, 4, 30, 4, 4, 2, 30, 32, 2, 32, 32, 34, 34, 36, 2, 0, 0, 38, 34, 0 ],
"width": 36,
"height": 99
}
},
"R-arm": {
"arm": {
"type": "mesh",
"uvs": [ 1, 0.16418, 0.90368, 0.30178, 0.80735, 0.43938, 0.75345, 0.50664, 0.71536, 0.55417, 0.66561, 0.61626, 0.63234, 0.65778, 0.59417, 0.7054, 0.45366, 0.8527, 0.31316, 1, 0.15658, 1, 0, 1, 0, 0.71458, 0.13235, 0.59074, 0.26471, 0.4669, 0.34675, 0.39836, 0.39153, 0.36096, 0.43008, 0.32876, 0.4689, 0.29633, 0.52302, 0.25113, 0.59417, 0.1917, 0.72983, 0.09585, 0.86549, 0, 1, 0, 0.15703, 0.83582, 0.46722, 0.51561, 0.78995, 0.22527, 0.34029, 0.70958, 0.62889, 0.3843 ],
"triangles": [ 10, 24, 9, 9, 27, 8, 9, 24, 27, 10, 11, 24, 11, 12, 24, 8, 27, 7, 12, 13, 24, 24, 13, 27, 13, 14, 27, 27, 25, 7, 25, 14, 15, 25, 27, 14, 7, 25, 6, 22, 23, 0, 26, 22, 0, 1, 26, 0, 6, 25, 5, 18, 4, 17, 28, 4, 18, 4, 28, 3, 15, 16, 25, 16, 17, 25, 25, 17, 5, 17, 4, 5, 3, 28, 2, 28, 26, 2, 2, 26, 1, 18, 19, 28, 19, 20, 28, 28, 20, 26, 20, 21, 26, 26, 21, 22 ],
"vertices": [ 1, 8, -6.97, 5.03, 1, 1, 8, 5.06, 7.93, 1, 1, 8, 17.1, 10.83, 1, 2, 8, 23.34, 11.91, 0.99563, 11, -17.75, 12.49, 0.00437, 2, 8, 27.74, 12.68, 0.95467, 11, -13.31, 13.04, 0.04533, 2, 8, 33.5, 13.69, 0.75827, 11, -7.51, 13.77, 0.24173, 2, 8, 37.35, 14.36, 0.53963, 11, -3.63, 14.26, 0.46037, 2, 8, 41.77, 15.13, 0.29363, 11, 0.82, 14.82, 0.70637, 2, 8, 56.6, 16.42, 4.0E-4, 11, 15.69, 15.41, 0.9996, 1, 11, 30.56, 16, 1, 1, 11, 38.34, 8.05, 1, 1, 11, 46.11, 0.1, 1, 1, 11, 30.8, -14.86, 1, 2, 8, 59.92, -13.5, 4.8E-4, 11, 17.59, -14.64, 0.99952, 2, 8, 46.72, -13.9, 0.17385, 11, 4.38, -14.41, 0.82615, 2, 8, 38.95, -13.7, 0.5683, 11, -3.37, -13.84, 0.4317, 2, 8, 34.71, -13.59, 0.79613, 11, -7.6, -13.53, 0.20387, 2, 8, 31.06, -13.49, 0.92362, 11, -11.24, -13.26, 0.07638, 2, 8, 27.39, -13.4, 0.98278, 11, -14.9, -12.99, 0.01722, 1, 8, 22.26, -13.26, 1, 1, 8, 15.53, -13.09, 1, 1, 8, 3.58, -11.79, 1, 1, 8, -8.37, -10.49, 1, 1, 8, -15.36, -3.99, 1, 1, 11, 29.51, -0.54, 1, 2, 8, 38.68, -1.43, 0.57762, 11, -3.06, -1.58, 0.42238, 1, 8, 7.07, -1.77, 1, 1, 11, 13.64, 2.15, 1, 1, 8, 23.56, -0.83, 1 ],
"hull": 24,
"edges": [ 0, 2, 2, 4, 4, 6, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28, 30, 38, 40, 40, 42, 42, 44, 44, 46, 46, 0, 10, 34, 30, 32, 32, 34, 10, 12, 12, 14, 6, 8, 8, 10, 34, 36, 36, 38, 8, 36 ],
"width": 71,
"height": 75
}
},
"R-leg": {
"leg": {
"type": "mesh",
"uvs": [ 1, 0.23129, 1, 0.29498, 1, 0.37025, 1, 0.44552, 1, 0.50921, 1, 0.65976, 1, 0.71766, 1, 0.87399, 0.73924, 1, 0.22971, 1, 0, 0.89715, 0, 0.64818, 0.01978, 0.59915, 0.08517, 0.43712, 0.10542, 0.38694, 0.13057, 0.32459, 0.15317, 0.26859, 0.178, 0.20707, 0.26155, 0, 1, 0, 0.61186, 0.12128, 0.51632, 0.54396 ],
"triangles": [ 21, 13, 4, 21, 4, 5, 12, 13, 21, 12, 21, 5, 12, 5, 6, 11, 12, 6, 9, 10, 11, 11, 6, 9, 6, 8, 9, 7, 8, 6, 20, 18, 19, 20, 19, 0, 17, 18, 20, 17, 20, 0, 17, 0, 1, 16, 17, 1, 16, 1, 2, 15, 16, 2, 15, 2, 3, 14, 15, 3, 14, 3, 4, 13, 14, 4 ],
"vertices": [ 1, 9, 7.41, 14.89, 1, 2, 9, 13.71, 15.24, 0.99432, 10, -23.16, 14.24, 0.00568, 2, 9, 21.15, 15.65, 0.91831, 10, -15.74, 14.89, 0.08169, 2, 9, 28.59, 16.06, 0.65731, 10, -8.32, 15.53, 0.34269, 2, 9, 34.88, 16.4, 0.33128, 10, -2.03, 16.08, 0.66872, 2, 9, 49.77, 17.22, 0.00401, 10, 12.81, 17.36, 0.99599, 1, 10, 18.52, 17.86, 1, 1, 10, 33.94, 19.2, 1, 1, 10, 47.18, 10.92, 1, 1, 10, 48.77, -7.35, 1, 1, 10, 39.34, -16.47, 1, 2, 9, 50.6, -18.79, 0.01347, 10, 14.78, -18.6, 0.98653, 2, 9, 45.72, -18.34, 0.05687, 10, 9.88, -18.31, 0.94313, 2, 9, 29.57, -16.87, 0.66681, 10, -6.3, -17.35, 0.33319, 2, 9, 24.57, -16.42, 0.86313, 10, -11.31, -17.05, 0.13687, 2, 9, 18.36, -15.85, 0.97673, 10, -17.54, -16.68, 0.02327, 2, 9, 12.77, -15.35, 0.99935, 10, -23.13, -16.35, 6.5E-4, 1, 9, 6.64, -14.79, 1, 2, 9, -13.99, -12.91, 0.99999, 10, -49.96, -14.76, 1.0E-5, 1, 9, -15.45, 13.63, 1, 1, 9, -2.7, 0.34, 1, 2, 9, 39.28, -0.79, 0.02735, 10, 2.9, -0.97, 0.97265 ],
"hull": 20,
"edges": [ 36, 38, 20, 22, 18, 20, 16, 18, 16, 14, 22, 24, 24, 10, 10, 12, 12, 14, 12, 22, 24, 26, 10, 8, 26, 8, 8, 6, 26, 28, 6, 28, 28, 30, 6, 4, 30, 4, 4, 2, 30, 32, 2, 32, 32, 34, 34, 36, 2, 0, 0, 38, 34, 0 ],
"width": 36,
"height": 99
}
},
"torso": {
"torso": {
"type": "mesh",
"uvs": [ 0.87097, 0.13351, 1, 0.26703, 1, 0.45027, 1, 0.63351, 1, 0.81676, 1, 1, 0.75, 1, 0.5, 1, 0.25, 1, 0, 1, 0, 0.72402, 0, 0.44805, 0.09823, 0.22402, 0.19646, 0, 0.4692, 0, 0.74195, 0, 0.58869, 0.13132, 0.401, 0.46063, 0.8354, 0.50156, 0.42394, 0.2675, 0.36228, 0.63166, 0.58839, 0.76773, 0.71972, 0.25773, 0.84058, 0.76485, 0.57726, 0.50305, 0.24069, 0.44016, 0.19158, 0.8008, 0.29695, 0.12289, 0.37843, 0.84006, 0.71037, 0.63433, 0.15889, 0.60896 ],
"triangles": [ 8, 26, 28, 8, 28, 7, 9, 26, 8, 9, 10, 26, 23, 4, 5, 6, 23, 5, 7, 21, 6, 6, 21, 23, 23, 3, 4, 7, 28, 21, 26, 20, 28, 28, 20, 21, 10, 30, 26, 26, 30, 20, 20, 24, 21, 21, 29, 23, 21, 24, 29, 29, 18, 23, 23, 18, 3, 10, 11, 30, 29, 24, 18, 18, 2, 3, 30, 25, 20, 20, 17, 24, 20, 25, 17, 30, 11, 25, 2, 18, 1, 11, 12, 25, 22, 19, 16, 22, 0, 1, 19, 14, 16, 19, 27, 14, 22, 15, 0, 22, 16, 15, 12, 13, 27, 16, 14, 15, 27, 13, 14, 22, 24, 19, 1, 18, 22, 25, 27, 19, 25, 12, 27, 17, 19, 24, 24, 22, 18, 17, 25, 19 ],
"vertices": [ 1, 3, 31.69, -23.15, 1, 2, 3, 19.07, -31.25, 0.60494, 2, 57.15, -30.53, 0.39506, 2, 3, 1.66, -31.39, 0.39506, 2, 39.74, -30.66, 0.60494, 2, 3, -15.75, -31.53, 0.20988, 2, 22.33, -30.8, 0.79012, 1, 5, -7.76, 14.89, 1, 1, 5, 9.48, 12.45, 1, 1, 5, 7.3, -2.9, 1, 2, 5, 5.13, -18.25, 0.488, 9, 5.77, 18.5, 0.512, 2, 5, 2.96, -33.59, 0.16267, 9, 6.62, 3.03, 0.83733, 3, 3, -51.05, 30.2, 0.06996, 2, -12.97, 30.92, 0.26337, 9, 7.46, -12.45, 0.66667, 1, 9, -18.72, -13.88, 1, 2, 3, 1.38, 30.61, 0.39506, 2, 39.46, 31.34, 0.60494, 2, 3, 22.71, 24.69, 0.60494, 2, 60.79, 25.41, 0.39506, 1, 3, 44.04, 18.76, 1, 1, 3, 44.18, 1.86, 1, 1, 3, 44.31, -15.05, 1, 1, 3, 31.76, -5.65, 1, 2, 3, 0.38, 5.74, 0.448, 2, 38.46, 6.47, 0.552, 2, 3, -3.29, -21.22, 0.448, 2, 34.79, -20.5, 0.552, 1, 3, 18.74, 4.46, 1, 1, 2, 22.2, 8.74, 1, 2, 2, 9.38, -5.38, 0.52, 5, -15.95, -9.73, 0.48, 1, 3, 19.82, -13.87, 1, 2, 2, 9.78, -21.01, 0.52, 5, -14.03, 5.79, 0.48, 2, 3, -3.56, -5.22, 0.448, 2, 34.52, -4.49, 0.552, 2, 3, 2.25, 15.69, 0.448, 2, 40.33, 16.42, 0.552, 2, 2, 6.04, 19.2, 0.584, 9, -12.08, -1.62, 0.416, 1, 3, 32.42, 12.44, 1, 2, 2, 2.41, 7.58, 0.584, 9, -8.99, 10.15, 0.416, 1, 2, 22.11, -12.84, 1, 1, 2, 24.25, 21.37, 1 ],
"hull": 16,
"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28, 30, 30, 0 ],
"width": 62,
"height": 95
}
}
}
}
],
"animations": {
"animation": {
"bones": {
"abdomen": {
"rotate": [
{
"curve": [ 0.075, 0, 0.112, 6.52 ]
},
{ "time": 0.3, "value": 6.52 },
{ "time": 1.3333 }
]
},
"chest": {
"rotate": [
{
"curve": [ 0.092, 0, 0.137, 13.73 ]
},
{
"time": 0.3667,
"value": 13.73,
"curve": [ 0.469, 13.73, 0.562, 13.32 ]
},
{
"time": 0.6667,
"value": 12.78,
"curve": [ 0.77, 12.78, 0.842, 9.11 ]
},
{
"time": 0.9,
"value": 9.11,
"curve": [ 1.092, 9.11, 1.225, 0 ]
},
{ "time": 1.3333 }
]
},
"head": {
"rotate": [
{
"curve": [ 0.035, 0, 0.061, -5.44 ]
},
{
"time": 0.1,
"value": -10.88,
"curve": [ 0.183, -10.88, 0.35, 6.77 ]
},
{
"time": 0.4333,
"value": 6.77,
"curve": [ 1.157, 6.77, 0.966, 0.14 ]
},
{ "time": 1.3333 }
]
},
"R-arm": {
"rotate": [
{
"curve": [ 0.042, 0, 0.125, -26.35 ]
},
{
"time": 0.1667,
"value": -26.35,
"curve": [ 0.233, -26.35, 0.367, -6.09 ]
},
{
"time": 0.4333,
"value": -6.09,
"curve": [ 0.658, -6.09, 1.108, 0 ]
},
{ "time": 1.3333 }
]
},
"L-arm": {
"rotate": [
{
"curve": [ 0.083, 0, 0.125, 53.01 ]
},
{
"time": 0.3333,
"value": 53.01,
"curve": [ 0.477, 52.83, 0.538, 35.12 ]
},
{
"time": 0.6,
"value": 35.12,
"curve": [ 0.682, 35.12, 0.754, 56.78 ]
},
{
"time": 0.8333,
"value": 56.78,
"curve": [ 1.128, 56.78, 1.181, 0 ]
},
{ "time": 1.3333 }
]
},
"R-forearm": {
"rotate": [
{
"curve": [ 0.116, 0, 0.203, 4.89 ]
},
{
"time": 0.3333,
"value": 9.78,
"curve": [ 0.583, 9.78, 0.804, 0 ]
},
{ "time": 1.3333 }
]
},
"L-forearm": {
"rotate": [
{
"value": 14.9,
"curve": [ 0.143, -80.79, 0.229, 32.08 ]
},
{
"time": 0.4333,
"value": 32.08,
"curve": [ 0.562, 32.08, 0.497, -11.74 ]
},
{
"time": 0.6333,
"value": -11.74,
"curve": [ 0.814, -11.74, 0.749, 58 ]
},
{
"time": 0.9333,
"value": 58,
"curve": [ 1.033, 58, 1.185, 14.9 ]
},
{ "time": 1.3333, "value": 14.9 }
]
},
"scalp": {
"rotate": [
{
"value": -7.01,
"curve": [ 0.095, -7.01, 0.171, -0.43 ]
},
{
"time": 0.2667,
"value": 7.61,
"curve": [ 0.35, 4.26, 0.458, 0 ]
},
{ "time": 0.6667 },
{ "time": 1.3333, "value": -7.01 }
]
},
"hair1": {
"rotate": [
{
"value": -8.8,
"curve": [ 0.067, -8.8, 0.1, -16.02 ]
},
{
"time": 0.2667,
"value": -16.02,
"curve": [ 0.333, -16.02, 0.41, 29.39 ]
},
{
"time": 0.5333,
"value": 29.39,
"curve": [ 0.733, 29.39, 0.885, -8.8 ]
},
{ "time": 1.3333, "value": -8.8 }
]
},
"hair2": {
"rotate": [
{
"value": 4.65,
"curve": [ 0.141, 4.65, 0.125, -17.96 ]
},
{
"time": 0.3333,
"value": -17.96,
"curve": [ 0.408, -17.96, 0.494, 6.63 ]
},
{
"time": 0.6333,
"value": 6.63,
"curve": [ 0.808, 6.63, 0.941, 4.65 ]
},
{ "time": 1.3333, "value": 4.65 }
]
}
}
}
}
}

View File

@ -0,0 +1,14 @@
[remap]
importer="spine.json"
type="SpineSkeletonFileResource"
uid="uid://bulrbalpjr863"
path="res://.godot/imported/raggedy spineboy.json-a7000cc987b23355ac0b09613918efcc.spjson"
[deps]
source_file="res://assets/raggedyspineboy/raggedy spineboy.json"
dest_files=["res://.godot/imported/raggedy spineboy.json-a7000cc987b23355ac0b09613918efcc.spjson"]
[params]

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cggfs567rn1ay"
path="res://.godot/imported/light-sprite.png-346e910021b52658f1de723e4c80e05e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/raptor/light-sprite.png"
dest_files=["res://.godot/imported/light-sprite.png-346e910021b52658f1de723e4c80e05e.ctex"]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/bptc_ldr=0
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dnjt8gyvsw0l8"
path="res://.godot/imported/n_raptor.png-d9af68b4a56af2b4319bb485e366dc90.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/raptor/n_raptor.png"
dest_files=["res://.godot/imported/n_raptor.png-d9af68b4a56af2b4319bb485e366dc90.ctex"]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/bptc_ldr=0
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -0,0 +1,9 @@
[gd_resource type="SpineSkeletonDataResource" load_steps=3 format=2]
[ext_resource path="res://assets/raptor/raptor.atlas" type="SpineAtlasResource" id=1]
[ext_resource path="res://assets/raptor/raptor-pro.skel" type="SpineSkeletonFileResource" id=2]
[resource]
atlas_res = ExtResource( 1 )
skeleton_file_res = ExtResource( 2 )
default_mix = 0.2

Binary file not shown.

View File

@ -0,0 +1,14 @@
[remap]
importer="spine.skel"
type="SpineSkeletonFileResource"
uid="uid://dor8huwld4f84"
path="res://.godot/imported/raptor-pro.skel-022e23a5f5581547a2d7faa9fb2c54e3.spskel"
[deps]
source_file="res://assets/raptor/raptor-pro.skel"
dest_files=["res://.godot/imported/raptor-pro.skel-022e23a5f5581547a2d7faa9fb2c54e3.spskel"]
[params]

View File

@ -0,0 +1,100 @@
raptor.png
size: 1024, 512
filter: Linear, Linear
scale: 0.5
back-arm
bounds: 829, 88, 46, 25
rotate: 90
back-bracer
bounds: 195, 238, 39, 28
rotate: 90
back-hand
bounds: 724, 140, 36, 34
rotate: 90
back-knee
bounds: 760, 131, 49, 67
rotate: 90
back-thigh
bounds: 225, 238, 39, 24
rotate: 90
eyes-open
bounds: 975, 204, 47, 45
front-arm
bounds: 969, 112, 48, 26
front-bracer
bounds: 724, 97, 41, 29
rotate: 90
front-hand
bounds: 251, 239, 41, 38
front-open-hand
bounds: 856, 76, 43, 44
rotate: 90
front-thigh
bounds: 729, 178, 57, 29
rotate: 90
gun
bounds: 894, 251, 107, 103
gun-nohand
bounds: 764, 241, 105, 102
head
bounds: 756, 345, 136, 149
lower-leg
bounds: 475, 237, 73, 98
rotate: 90
mouth-grind
bounds: 975, 172, 47, 30
mouth-smile
bounds: 975, 140, 47, 30
neck
bounds: 366, 282, 18, 21
raptor-back-arm
bounds: 636, 97, 82, 86
rotate: 90
raptor-body
bounds: 2, 2, 632, 233
raptor-front-arm
bounds: 871, 168, 81, 102
rotate: 90
raptor-front-leg
bounds: 2, 237, 191, 257
raptor-hindleg-back
bounds: 195, 279, 169, 215
raptor-horn
bounds: 431, 312, 182, 80
rotate: 90
raptor-horn-back
bounds: 513, 318, 176, 77
rotate: 90
raptor-jaw
bounds: 894, 356, 126, 138
raptor-jaw-tooth
bounds: 294, 240, 37, 48
rotate: 90
raptor-mouth-inside
bounds: 344, 241, 36, 41
rotate: 90
raptor-saddle-strap-back
bounds: 575, 242, 54, 74
raptor-saddle-strap-front
bounds: 764, 182, 57, 95
rotate: 90
raptor-saddle-w-shadow
bounds: 592, 323, 162, 171
raptor-tail-shadow
bounds: 366, 305, 189, 63
rotate: 90
raptor-tongue
bounds: 387, 239, 86, 64
stirrup-back
bounds: 829, 136, 44, 35
rotate: 90
stirrup-front
bounds: 866, 121, 45, 50
rotate: 90
stirrup-strap
bounds: 918, 120, 49, 46
torso
bounds: 636, 181, 54, 91
rotate: 90
visor
bounds: 631, 237, 131, 84

View File

@ -0,0 +1,15 @@
[remap]
importer="spine.atlas"
type="SpineAtlasResource"
uid="uid://dhtyf5vltqsjg"
path="res://.godot/imported/raptor.atlas-66da4b831eebf404341993162ba3ddb8.spatlas"
[deps]
source_file="res://assets/raptor/raptor.atlas"
dest_files=["res://.godot/imported/raptor.atlas-66da4b831eebf404341993162ba3ddb8.spatlas"]
[params]
normal_map_prefix="n"

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ucvdpil67hul"
path="res://.godot/imported/raptor.png-505be50f63fd1d0fb9175a9efbb9776c.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/raptor/raptor.png"
dest_files=["res://.godot/imported/raptor.png-505be50f63fd1d0fb9175a9efbb9776c.ctex"]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/bptc_ldr=0
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -0,0 +1,20 @@
[gd_resource type="SpineSkeletonDataResource" load_steps=5 format=2]
[ext_resource path="res://assets/spineboy/spineboy.atlas" type="SpineAtlasResource" id=1]
[ext_resource path="res://assets/spineboy/spineboy-pro.json" type="SpineSkeletonFileResource" id=2]
[sub_resource type="SpineAnimationMix" id=1]
from = "idle"
to = "run"
mix = 0.2
[sub_resource type="SpineAnimationMix" id=2]
from = "run"
to = "idle"
mix = 0.2
[resource]
atlas_res = ExtResource( 1 )
skeleton_file_res = ExtResource( 2 )
default_mix = 0.1
animation_mixes = [ SubResource( 1 ), SubResource( 2 ) ]

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,14 @@
[remap]
importer="spine.json"
type="SpineSkeletonFileResource"
uid="uid://drl0og0imdkla"
path="res://.godot/imported/spineboy-pro.json-60444223fe3960c6d4c33b92d7495419.spjson"
[deps]
source_file="res://assets/spineboy/spineboy-pro.json"
dest_files=["res://.godot/imported/spineboy-pro.json-60444223fe3960c6d4c33b92d7495419.spjson"]
[params]

View File

@ -0,0 +1,14 @@
[remap]
importer="spine.skel"
type="SpineSkeletonFileResource"
uid="uid://cth0eypg16cgi"
path="res://.godot/imported/spineboy-pro.skel-52781a88227740d2a80cb8d7636ea22e.spskel"
[deps]
source_file="res://assets/spineboy/spineboy-pro.skel"
dest_files=["res://.godot/imported/spineboy-pro.skel-52781a88227740d2a80cb8d7636ea22e.spskel"]
[params]

View File

@ -0,0 +1,101 @@
spineboy.png
size: 1024, 256
filter: Linear, Linear
scale: 0.5
crosshair
bounds: 813, 160, 45, 45
eye-indifferent
bounds: 569, 2, 47, 45
eye-surprised
bounds: 643, 7, 47, 45
rotate: 90
front-bracer
bounds: 811, 51, 29, 40
front-fist-closed
bounds: 807, 93, 38, 41
front-fist-open
bounds: 815, 210, 43, 44
front-foot
bounds: 706, 64, 63, 35
rotate: 90
front-shin
bounds: 80, 11, 41, 92
front-thigh
bounds: 754, 12, 23, 56
front-upper-arm
bounds: 618, 5, 23, 49
goggles
bounds: 214, 20, 131, 83
gun
bounds: 347, 14, 105, 102
rotate: 90
head
bounds: 80, 105, 136, 149
hoverboard-board
bounds: 2, 8, 246, 76
rotate: 90
hoverboard-thruster
bounds: 478, 2, 30, 32
hoverglow-small
bounds: 218, 117, 137, 38
rotate: 90
mouth-grind
bounds: 775, 80, 47, 30
rotate: 90
mouth-oooo
bounds: 779, 31, 47, 30
rotate: 90
mouth-smile
bounds: 783, 207, 47, 30
rotate: 90
muzzle-glow
bounds: 779, 4, 25, 25
muzzle-ring
bounds: 451, 14, 25, 105
muzzle01
bounds: 664, 60, 67, 40
rotate: 90
muzzle02
bounds: 580, 56, 68, 42
rotate: 90
muzzle03
bounds: 478, 36, 83, 53
rotate: 90
muzzle04
bounds: 533, 49, 75, 45
rotate: 90
muzzle05
bounds: 624, 56, 68, 38
rotate: 90
neck
bounds: 806, 8, 18, 21
portal-bg
bounds: 258, 121, 133, 133
portal-flare1
bounds: 690, 2, 56, 30
rotate: 90
portal-flare2
bounds: 510, 3, 57, 31
portal-flare3
bounds: 722, 4, 58, 30
rotate: 90
portal-shade
bounds: 393, 121, 133, 133
portal-streaks1
bounds: 528, 126, 126, 128
portal-streaks2
bounds: 656, 129, 125, 125
rear-bracer
bounds: 826, 13, 28, 36
rear-foot
bounds: 743, 70, 57, 30
rotate: 90
rear-shin
bounds: 174, 14, 38, 89
rear-thigh
bounds: 783, 158, 28, 47
rear-upper-arm
bounds: 783, 136, 20, 44
rotate: 90
torso
bounds: 123, 13, 49, 90

View File

@ -0,0 +1,15 @@
[remap]
importer="spine.atlas"
type="SpineAtlasResource"
uid="uid://dt2kctrit34y0"
path="res://.godot/imported/spineboy.atlas-54c12b5ff1cdaaa1b4e452a7d0d868c9.spatlas"
[deps]
source_file="res://assets/spineboy/spineboy.atlas"
dest_files=["res://.godot/imported/spineboy.atlas-54c12b5ff1cdaaa1b4e452a7d0d868c9.spatlas"]
[params]
normal_map_prefix="n"

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bh5imhdfuc6m0"
path="res://.godot/imported/spineboy.png-436dbd6da2b707b6828ede17b7871f43.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/spineboy/spineboy.png"
dest_files=["res://.godot/imported/spineboy.png-436dbd6da2b707b6828ede17b7871f43.ctex"]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/bptc_ldr=0
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -0,0 +1,7 @@
[gd_resource type="Environment" load_steps=2 format=2]
[sub_resource type="ProceduralSky" id=1]
[resource]
background_mode = 2
background_sky = SubResource( 1 )

View File

@ -0,0 +1,18 @@
[gd_scene load_steps=3 format=3 uid="uid://d0v5rhv2ysej8"]
[ext_resource type="Script" path="res://examples/01-helloworld/spineboy-helloworld.gd" id="1"]
[ext_resource type="SpineSkeletonDataResource" path="res://assets/spineboy/spineboy-data-res.tres" id="3"]
[node name="Node2D" type="Node2D"]
[node name="Spineboy" type="SpineSprite" parent="."]
position = Vector2(505, 466)
scale = Vector2(0.466832, 0.466832)
skeleton_data_res = ExtResource( "3" )
bones_color = Color(0.968627, 1, 0, 0.501961)
paths_color = Color(1, 0.498039, 0, 0.466667)
paths_clipping = Color(0.8, 0, 0, 0.5)
preview_animation = "run"
preview_frame = true
preview_time = 0.24
script = ExtResource( "1" )

View File

@ -0,0 +1,4 @@
extends SpineSprite
func _ready():
get_animation_state().set_animation("walk", true, 0)

View File

@ -0,0 +1,38 @@
extends Node2D
@onready var footstep_audio: AudioStreamPlayer = $FootstepAudio
func _animation_started(sprite: SpineSprite, animation_state: SpineAnimationState, track_entry: SpineTrackEntry):
print("Animation started: " + track_entry.get_animation().get_name())
func _animation_interrupted(sprite: SpineSprite, animation_state: SpineAnimationState, track_entry: SpineTrackEntry):
print("Animation interrupted: " + track_entry.get_animation().get_name())
func _animation_ended(sprite: SpineSprite, animation_state: SpineAnimationState, track_entry: SpineTrackEntry):
print("Animation ended: " + track_entry.get_animation().get_name())
func _animation_completed(sprite: SpineSprite, animation_state: SpineAnimationState, track_entry: SpineTrackEntry):
print("Animation completed: " + track_entry.get_animation().get_name())
func _animation_disposed(sprite: SpineSprite, animation_state: SpineAnimationState, track_entry: SpineTrackEntry):
print("Animation disposed: " + track_entry.get_animation().get_name())
func _animation_event(sprite: SpineSprite, animation_state: SpineAnimationState, track_entry: SpineTrackEntry, event: SpineEvent):
print("Animation event: " + track_entry.get_animation().get_name() + ", " + event.get_data().get_event_name())
if (event.get_data().get_event_name() == "footstep"):
footstep_audio.play()
func _ready():
var spineboy = $Spineboy
var animation_state = spineboy.get_animation_state()
animation_state.set_animation("jump", false, 0)
animation_state.add_animation("walk", 0, true, 0)
animation_state.add_animation("run", 2, true, 0)
spineboy.animation_started.connect(_animation_started)
spineboy.animation_interrupted.connect(_animation_interrupted)
spineboy.animation_ended.connect(_animation_ended)
spineboy.animation_completed.connect(_animation_completed)
spineboy.animation_disposed.connect(_animation_disposed)
spineboy.animation_event.connect(_animation_event)
pass

View File

@ -0,0 +1,19 @@
[gd_scene load_steps=4 format=3 uid="uid://c738i3nbdkn0h"]
[ext_resource type="Script" path="res://examples/02-animation-state-listeners/animation-state-listeners.gd" id="1"]
[ext_resource type="SpineSkeletonDataResource" path="res://assets/spineboy/spineboy-data-res.tres" id="2"]
[ext_resource type="AudioStream" uid="uid://can7k84o8svum" path="res://assets/footstep.ogg" id="3"]
[node name="Node2D" type="Node2D"]
script = ExtResource( "1" )
[node name="Spineboy" type="SpineSprite" parent="."]
position = Vector2(473, 487)
scale = Vector2(0.575051, 0.575051)
skeleton_data_res = ExtResource( "2" )
preview_animation = "-- Empty --"
preview_frame = false
preview_time = 0.0
[node name="FootstepAudio" type="AudioStreamPlayer" parent="."]
stream = ExtResource( "3" )

View File

@ -0,0 +1,22 @@
extends SpineSprite
func _ready():
var data = get_skeleton().get_data()
var custom_skin = new_skin("custom-skin")
var skin_base = data.find_skin("skin-base")
custom_skin.add_skin(skin_base)
custom_skin.add_skin(data.find_skin("nose/short"))
custom_skin.add_skin(data.find_skin("eyelids/girly"))
custom_skin.add_skin(data.find_skin("eyes/violet"))
custom_skin.add_skin(data.find_skin("hair/brown"))
custom_skin.add_skin(data.find_skin("clothes/hoodie-orange"))
custom_skin.add_skin(data.find_skin("legs/pants-jeans"))
custom_skin.add_skin(data.find_skin("accessories/bag"))
custom_skin.add_skin(data.find_skin("accessories/hat-red-yellow"))
get_skeleton().set_skin(custom_skin);
for el in custom_skin.get_attachments():
var entry: SpineSkinEntry = el
print(str(entry.get_slot_index()) + " " + entry.get_name())
get_animation_state().set_animation("dance", true, 0)

View File

@ -0,0 +1,15 @@
[gd_scene load_steps=3 format=3 uid="uid://dodvuj07fsynd"]
[ext_resource type="SpineSkeletonDataResource" path="res://assets/mix-and-match/mix-and-match-data.tres" id="1"]
[ext_resource type="Script" path="res://examples/03-mix-and-match/mix-and-match.gd" id="2"]
[node name="Node2D" type="Node2D"]
[node name="MixAndMatch" type="SpineSprite" parent="."]
position = Vector2(532.982, 480.287)
scale = Vector2(0.441932, 0.441932)
skeleton_data_res = ExtResource( "1" )
preview_animation = "-- Empty --"
preview_frame = false
preview_time = 0.0
script = ExtResource( "2" )

View File

@ -0,0 +1,15 @@
[gd_scene load_steps=3 format=3 uid="uid://bgdpghp11j3kg"]
[ext_resource type="SpineSkeletonDataResource" path="res://assets/spineboy/spineboy-data-res.tres" id="1"]
[ext_resource type="Script" path="res://examples/04-simple-input/spineboy-simple-input.gd" id="2"]
[node name="Node2D" type="Node2D"]
[node name="Spineboy" type="SpineSprite" parent="."]
position = Vector2(501.503, 472.035)
scale = Vector2(0.518624, 0.518624)
skeleton_data_res = ExtResource( "1" )
preview_animation = "-- Empty --"
preview_frame = false
preview_time = 0.0
script = ExtResource( "2" )

View File

@ -0,0 +1,19 @@
extends SpineSprite
func _ready():
get_animation_state().set_animation("idle", true, 0)
func _process(_delta):
if Input.is_action_just_pressed("ui_left"):
get_animation_state().set_animation("run", true, 0)
get_skeleton().set_scale_x(-1)
if Input.is_action_just_released("ui_left"):
get_animation_state().set_animation("idle", true, 0)
if (Input.is_action_just_pressed("ui_right")):
get_animation_state().set_animation("run", true, 0)
get_skeleton().set_scale_x(1)
if Input.is_action_just_released("ui_right"):
get_animation_state().set_animation("idle", true, 0)

View File

@ -0,0 +1,11 @@
extends Node2D
@onready var spineboy: SpineSprite = $Spineboy
@onready var crosshair_bone: SpineBoneNode = $Spineboy/CrosshairBone
func _ready():
spineboy.get_animation_state().set_animation("walk", true, 0)
spineboy.get_animation_state().set_animation("aim", true, 1)
func _process(_delta):
crosshair_bone.global_position = get_viewport().get_mouse_position()

View File

@ -0,0 +1,22 @@
[gd_scene load_steps=3 format=3 uid="uid://borp2l17n5xw1"]
[ext_resource type="Script" path="res://examples/05-mouse-following/mouse-following.gd" id="1"]
[ext_resource type="SpineSkeletonDataResource" path="res://assets/spineboy/spineboy-data-res.tres" id="2"]
[node name="Node2D" type="Node2D"]
script = ExtResource( "1" )
[node name="Spineboy" type="SpineSprite" parent="."]
position = Vector2(481, 457)
scale = Vector2(0.5, 0.5)
skeleton_data_res = ExtResource( "2" )
preview_animation = "-- Empty --"
preview_frame = false
preview_time = 0.0
[node name="CrosshairBone" type="SpineBoneNode" parent="Spineboy"]
show_behind_parent = true
position = Vector2(302.333, -569.714)
rotation = -0.000872665
bone_name = "crosshair"
bone_mode = 1

View File

@ -0,0 +1,5 @@
extends Node2D
func _ready():
var spineboy: SpineSprite = $Spineboy
spineboy.get_animation_state().set_animation("walk", true, 0)

View File

@ -0,0 +1,25 @@
[gd_scene load_steps=4 format=3 uid="uid://bir7yvf0qwdge"]
[ext_resource type="SpineSkeletonDataResource" path="res://assets/spineboy/spineboy-data-res.tres" id="1"]
[ext_resource type="Script" path="res://examples/06-bone-following/bone-following.gd" id="2"]
[ext_resource type="Texture2D" uid="uid://8ud5n2ywp5ba" path="res://icon.png" id="3"]
[node name="Node2D" type="Node2D"]
script = ExtResource( "2" )
[node name="Spineboy" type="SpineSprite" parent="."]
position = Vector2(478, 483)
scale = Vector2(0.58461, 0.58461)
skeleton_data_res = ExtResource( "1" )
preview_animation = ""
preview_frame = false
preview_time = 0.0
[node name="GunTipBone" type="SpineBoneNode" parent="Spineboy"]
show_behind_parent = true
position = Vector2(214.298, -162.047)
rotation = 0.713316
bone_name = "gun-tip"
[node name="Sprite" type="Sprite2D" parent="Spineboy/GunTipBone"]
texture = ExtResource( "3" )

View File

@ -0,0 +1,11 @@
extends Node2D
@onready var spineboy: SpineSprite = $Spineboy
@onready var raptor: SpineSprite = $Spineboy/GunSlot/Raptor
@onready var tiny_spineboy: SpineSprite = $Spineboy/FrontFistSlot/TinySpineboy
func _ready():
var entry = spineboy.get_animation_state().set_animation("run", true, 0)
entry.set_time_scale(0.1)
raptor.get_animation_state().set_animation("walk", true, 0)
tiny_spineboy.get_animation_state().set_animation("walk", true, 0)

View File

@ -0,0 +1,56 @@
[gd_scene load_steps=5 format=3 uid="uid://bhht8dees2pyq"]
[ext_resource type="Script" path="res://examples/07-slot-node/slot-node.gd" id="1"]
[ext_resource type="SpineSkeletonDataResource" path="res://assets/spineboy/spineboy-data-res.tres" id="2"]
[ext_resource type="SpineSkeletonDataResource" path="res://assets/raptor/raptor-data.tres" id="3"]
[ext_resource type="Texture2D" uid="uid://8ud5n2ywp5ba" path="res://icon.png" id="4"]
[node name="Node2D" type="Node2D"]
script = ExtResource( "1" )
[node name="Spineboy" type="SpineSprite" parent="."]
position = Vector2(474, 506)
scale = Vector2(0.560712, 0.560712)
skeleton_data_res = ExtResource( "2" )
preview_animation = "-- Empty --"
preview_frame = false
preview_time = 0.0
[node name="GunSlot" type="SpineSlotNode" parent="Spineboy"]
show_behind_parent = true
position = Vector2(40.8753, -276.036)
rotation = 0.837234
slot_name = "gun"
[node name="Raptor" type="SpineSprite" parent="Spineboy/GunSlot"]
position = Vector2(84.6909, -67.9174)
scale = Vector2(0.193472, 0.193472)
skeleton_data_res = ExtResource( "3" )
preview_animation = "-- Empty --"
preview_frame = false
preview_time = 0.0
[node name="EyeSlot" type="SpineSlotNode" parent="Spineboy"]
show_behind_parent = true
position = Vector2(-23.4598, -402.301)
rotation = -1.71793
slot_name = "eye"
[node name="Sprite" type="Sprite2D" parent="Spineboy/EyeSlot"]
position = Vector2(84.4734, 43.4469)
rotation = 1.66344
texture = ExtResource( "4" )
[node name="FrontFistSlot" type="SpineSlotNode" parent="Spineboy"]
show_behind_parent = true
position = Vector2(-29.0298, -241.577)
rotation = 0.995187
slot_name = "front-fist"
[node name="TinySpineboy" type="SpineSprite" parent="Spineboy/FrontFistSlot"]
position = Vector2(-2.64624, -10.8111)
scale = Vector2(0.193389, 0.193389)
skeleton_data_res = ExtResource( "2" )
preview_animation = "-- Empty --"
preview_frame = false
preview_time = 0.0

View File

@ -0,0 +1,33 @@
extends Node2D
@onready var player = $AnimationPlayer
@onready var spineboy = $Spineboy
var speed = 400;
var velocity_x = 0;
func _ready():
player.play("cutscene")
pass
func _process(delta):
if (!player.is_playing()):
if Input.is_action_just_released("ui_left"):
spineboy.get_animation_state().set_animation("idle", true, 0)
velocity_x = 0
if Input.is_action_just_released("ui_right"):
spineboy.get_animation_state().set_animation("idle", true, 0)
velocity_x = 0
if (Input.is_action_just_pressed("ui_right")):
spineboy.get_animation_state().set_animation("run", true, 0)
spineboy.get_skeleton().set_scale_x(1)
velocity_x = 1
if Input.is_action_just_pressed("ui_left"):
spineboy.get_animation_state().set_animation("run", true, 0)
spineboy.get_skeleton().set_scale_x(-1)
velocity_x = -1
spineboy.position.x += velocity_x * speed * delta

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,43 @@
[gd_scene load_steps=6 format=3 uid="uid://b4p2vn7bwm52a"]
[ext_resource type="SpineSkeletonDataResource" path="res://assets/spineboy/spineboy-data-res.tres" id="1"]
[sub_resource type="Shader" id="1"]
code = "shader_type canvas_item;
void fragment() {
COLOR = texture(TEXTURE, UV);
COLOR.r = 0.0;
}"
[sub_resource type="ShaderMaterial" id="2"]
shader = SubResource( "1" )
[sub_resource type="Shader" id="3"]
code = "shader_type canvas_item;
void fragment() {
COLOR = texture(TEXTURE, UV);
COLOR.b = 0.0;
}"
[sub_resource type="ShaderMaterial" id="4"]
shader = SubResource( "3" )
[node name="Node2D" type="Node2D"]
[node name="SpineSprite" type="SpineSprite" parent="."]
position = Vector2(501, 507)
scale = Vector2(0.546374, 0.546373)
skeleton_data_res = ExtResource( "1" )
normal_material = SubResource( "2" )
preview_animation = "-- Empty --"
preview_frame = false
preview_time = 0.0
[node name="GunSlot" type="SpineSlotNode" parent="SpineSprite"]
show_behind_parent = true
position = Vector2(40.8753, -276.036)
rotation = 0.837234
slot_name = "gun"
normal_material = SubResource( "4" )

View File

@ -0,0 +1,4 @@
extends Node2D
func _ready():
$SpineSprite.get_animation_state().set_animation("walk");

View File

@ -0,0 +1,25 @@
[gd_scene load_steps=4 format=3 uid="uid://rt2llskmx7xm"]
[ext_resource type="SpineSkeletonDataResource" path="res://assets/raptor/raptor-data.tres" id="1"]
[ext_resource type="Texture2D" uid="uid://cggfs567rn1ay" path="res://assets/raptor/light-sprite.png" id="2"]
[ext_resource type="Script" path="res://examples/10-2d-lighting/2d-lighting.gd" id="3"]
[node name="Node2D" type="Node2D"]
script = ExtResource( "3" )
[node name="SpineSprite" type="SpineSprite" parent="."]
position = Vector2(576, 506)
scale = Vector2(0.458967, 0.458967)
skeleton_data_res = ExtResource( "1" )
preview_animation = "-- Empty --"
preview_frame = false
preview_time = 0.0
[node name="Light2D" type="PointLight2D" parent="."]
position = Vector2(822, 270)
scale = Vector2(1.51563, 1.51563)
color = Color(1, 0.0117647, 0.0117647, 1)
texture = ExtResource( "2" )
[node name="CanvasModulate" type="CanvasModulate" parent="."]
color = Color(0.145098, 0.0980392, 0.0980392, 1)

View File

@ -0,0 +1,19 @@
extends Node2D
@onready var spineboy = $SpineSprite
@onready var center_bone = $SpineSprite/HoverboardCenterBone
@onready var center_ray = $SpineSprite/HoverboardCenterBone/RayCast2D
@onready var target_bone = $SpineSprite/HoverboardTargetBone
@onready var target_ray = $SpineSprite/HoverboardTargetBone/RayCast2D
func _ready():
spineboy.get_animation_state().set_animation("hoverboard", true, 0)
func _physics_process(delta):
if target_ray.is_colliding():
target_bone.global_position.y = target_ray.get_collision_point().y - 50
if center_ray.is_colliding():
center_bone.global_position.y = center_ray.get_collision_point().y - 50
spineboy.global_position.x += delta * 150;
spineboy.global_position.y = center_bone.global_position.y

View File

@ -0,0 +1,47 @@
[gd_scene load_steps=3 format=3 uid="uid://chrw4i0nksphn"]
[ext_resource type="Script" path="res://examples/11-bone-node/bone-node.gd" id="1"]
[ext_resource type="SpineSkeletonDataResource" path="res://assets/spineboy/spineboy-data-res.tres" id="2"]
[node name="Node2D" type="Node2D"]
script = ExtResource( "1" )
[node name="SpineSprite" type="SpineSprite" parent="."]
position = Vector2(8, 553)
scale = Vector2(0.278096, 0.278096)
skeleton_data_res = ExtResource( "2" )
update_mode = 1
preview_animation = "hoverboard"
preview_frame = true
preview_time = 0.0
[node name="HoverboardCenterBone" type="SpineBoneNode" parent="SpineSprite"]
show_behind_parent = true
bone_name = "hoverboard-controller"
bone_mode = 1
[node name="RayCast2D" type="RayCast2D" parent="SpineSprite/HoverboardCenterBone"]
[node name="HoverboardTargetBone" type="SpineBoneNode" parent="SpineSprite"]
show_behind_parent = true
position = Vector2(262.499, 0)
rotation = -0.000872665
bone_name = "board-ik"
bone_mode = 1
[node name="RayCast2D" type="RayCast2D" parent="SpineSprite/HoverboardTargetBone"]
[node name="HipBone" type="SpineBoneNode" parent="SpineSprite"]
show_behind_parent = true
position = Vector2(0, -169.006)
rotation = -0.000872665
bone_name = "hip"
bone_mode = 1
[node name="Polygon2D" type="Polygon2D" parent="."]
polygon = PackedVector2Array(0, 596, 309, 471, 516, 515, 762, 447, 984, 504, 1023, 505, 1024, 596)
[node name="StaticBody2D" type="StaticBody2D" parent="Polygon2D"]
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Polygon2D/StaticBody2D"]
polygon = PackedVector2Array(3, 592, 304, 469, 516, 514, 762, 443, 984, 499, 1252, 498, 1280, 596)

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://8ud5n2ywp5ba"
path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://icon.png"
dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/bptc_ldr=0
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -0,0 +1,35 @@
; Engine configuration file.
; It's best edited using the editor UI and not directly,
; since the parameters that go here are not all obvious.
;
; Format:
; [section] ; section goes between []
; param=value ; assign values to parameters
config_version=5
[application]
config/name="spine-godot-examples"
run/main_scene="res://examples/08-animation-player/animation-player.tscn"
run/low_processor_mode=true
config/icon="res://icon.png"
config/features=PackedStringArray("4.0")
[global]
batch=false
[physics]
common/enable_pause_aware_picking=true
[rendering]
batching/parameters/max_join_item_commands=100
batching/parameters/batch_buffer_size=65535
batching/parameters/item_reordering_lookahead=100
quality/driver/driver_name="GLES2"
vram_compression/import_etc=true
vram_compression/import_etc2=false
environment/default_environment="res://default_env.tres"

View File

@ -0,0 +1,4 @@
extends SpineSprite
func _ready():
get_animation_state().set_animation("walk", true)

View File

@ -0,0 +1,871 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://assets/spineboy/spineboy-data-res.tres" type="SpineSkeletonDataResource" id=1]
[ext_resource path="res://tests/batch-test.gd" type="Script" id=2]
[node name="Node2D" type="Node2D"]
rotation = -3.67884e-05
[node name="SpineSprite" type="SpineSprite" parent="."]
position = Vector2( 53.8037, 119.483 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite2" type="SpineSprite" parent="."]
position = Vector2( 111.488, 119.485 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite3" type="SpineSprite" parent="."]
position = Vector2( 164.678, 119.487 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = true
preview_time = 2.36477e-39
script = ExtResource( 2 )
[node name="SpineSprite4" type="SpineSprite" parent="."]
position = Vector2( 217.119, 121.736 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = true
preview_time = 6.85235e-43
script = ExtResource( 2 )
[node name="SpineSprite5" type="SpineSprite" parent="."]
position = Vector2( 277.051, 120.989 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite6" type="SpineSprite" parent="."]
position = Vector2( 337.733, 118.744 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite7" type="SpineSprite" parent="."]
position = Vector2( 403.658, 120.994 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite8" type="SpineSprite" parent="."]
position = Vector2( 464.34, 120.996 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite9" type="SpineSprite" parent="."]
position = Vector2( 525.021, 120.998 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 51.0
script = ExtResource( 2 )
[node name="SpineSprite10" type="SpineSprite" parent="."]
position = Vector2( 589.448, 121.001 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite11" type="SpineSprite" parent="."]
position = Vector2( 649.381, 121.752 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite12" type="SpineSprite" parent="."]
position = Vector2( 709.313, 123.253 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite13" type="SpineSprite" parent="."]
position = Vector2( 769.245, 119.509 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite14" type="SpineSprite" parent="."]
position = Vector2( 830.676, 119.511 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite15" type="SpineSprite" parent="."]
position = Vector2( 892.106, 121.761 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite16" type="SpineSprite" parent="."]
position = Vector2( 953.537, 121.763 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite17" type="SpineSprite" parent="."]
position = Vector2( 56.0478, 207.883 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite18" type="SpineSprite" parent="."]
position = Vector2( 113.733, 207.885 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite19" type="SpineSprite" parent="."]
position = Vector2( 166.923, 207.887 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite20" type="SpineSprite" parent="."]
position = Vector2( 219.363, 210.136 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite21" type="SpineSprite" parent="."]
position = Vector2( 279.295, 209.389 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite22" type="SpineSprite" parent="."]
position = Vector2( 339.977, 207.144 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite23" type="SpineSprite" parent="."]
position = Vector2( 405.902, 209.394 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite24" type="SpineSprite" parent="."]
position = Vector2( 466.584, 209.396 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite25" type="SpineSprite" parent="."]
position = Vector2( 527.265, 209.399 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite26" type="SpineSprite" parent="."]
position = Vector2( 591.692, 209.401 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite27" type="SpineSprite" parent="."]
position = Vector2( 651.625, 210.152 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite28" type="SpineSprite" parent="."]
position = Vector2( 711.557, 211.653 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite29" type="SpineSprite" parent="."]
position = Vector2( 771.489, 207.909 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite30" type="SpineSprite" parent="."]
position = Vector2( 832.92, 207.911 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite31" type="SpineSprite" parent="."]
position = Vector2( 894.351, 210.161 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite32" type="SpineSprite" parent="."]
position = Vector2( 955.781, 210.163 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite33" type="SpineSprite" parent="."]
position = Vector2( 60.5394, 300.778 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite34" type="SpineSprite" parent="."]
position = Vector2( 118.224, 300.78 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite35" type="SpineSprite" parent="."]
position = Vector2( 171.414, 300.782 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite36" type="SpineSprite" parent="."]
position = Vector2( 223.855, 303.032 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite37" type="SpineSprite" parent="."]
position = Vector2( 283.787, 302.285 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite38" type="SpineSprite" parent="."]
position = Vector2( 344.468, 300.039 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite39" type="SpineSprite" parent="."]
position = Vector2( 410.394, 302.289 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite40" type="SpineSprite" parent="."]
position = Vector2( 471.075, 302.292 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite41" type="SpineSprite" parent="."]
position = Vector2( 531.757, 302.294 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite42" type="SpineSprite" parent="."]
position = Vector2( 596.184, 302.296 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite43" type="SpineSprite" parent="."]
position = Vector2( 656.116, 303.047 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite44" type="SpineSprite" parent="."]
position = Vector2( 716.048, 304.548 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite45" type="SpineSprite" parent="."]
position = Vector2( 775.981, 300.804 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite46" type="SpineSprite" parent="."]
position = Vector2( 837.411, 300.807 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite47" type="SpineSprite" parent="."]
position = Vector2( 898.842, 303.056 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite48" type="SpineSprite" parent="."]
position = Vector2( 960.273, 303.059 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite49" type="SpineSprite" parent="."]
position = Vector2( 60.5361, 389.178 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite50" type="SpineSprite" parent="."]
position = Vector2( 118.221, 389.18 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite51" type="SpineSprite" parent="."]
position = Vector2( 171.411, 389.182 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite52" type="SpineSprite" parent="."]
position = Vector2( 223.851, 391.432 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite53" type="SpineSprite" parent="."]
position = Vector2( 283.784, 390.685 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite54" type="SpineSprite" parent="."]
position = Vector2( 344.465, 388.44 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite55" type="SpineSprite" parent="."]
position = Vector2( 410.391, 390.689 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite56" type="SpineSprite" parent="."]
position = Vector2( 471.072, 390.692 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite57" type="SpineSprite" parent="."]
position = Vector2( 531.753, 390.694 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite58" type="SpineSprite" parent="."]
position = Vector2( 596.181, 390.696 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite59" type="SpineSprite" parent="."]
position = Vector2( 656.113, 391.448 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite60" type="SpineSprite" parent="."]
position = Vector2( 716.045, 392.948 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite61" type="SpineSprite" parent="."]
position = Vector2( 775.978, 389.204 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite62" type="SpineSprite" parent="."]
position = Vector2( 837.408, 389.207 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite63" type="SpineSprite" parent="."]
position = Vector2( 898.839, 391.456 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite64" type="SpineSprite" parent="."]
position = Vector2( 960.269, 391.459 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite65" type="SpineSprite" parent="."]
position = Vector2( 62.0311, 477.578 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite66" type="SpineSprite" parent="."]
position = Vector2( 119.716, 477.581 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite67" type="SpineSprite" parent="."]
position = Vector2( 172.906, 477.583 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite68" type="SpineSprite" parent="."]
position = Vector2( 225.346, 479.832 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite69" type="SpineSprite" parent="."]
position = Vector2( 285.279, 479.085 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite70" type="SpineSprite" parent="."]
position = Vector2( 345.96, 476.84 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite71" type="SpineSprite" parent="."]
position = Vector2( 411.886, 479.09 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite72" type="SpineSprite" parent="."]
position = Vector2( 472.567, 479.092 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite73" type="SpineSprite" parent="."]
position = Vector2( 533.248, 479.094 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite74" type="SpineSprite" parent="."]
position = Vector2( 597.676, 479.096 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite75" type="SpineSprite" parent="."]
position = Vector2( 657.608, 479.848 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite76" type="SpineSprite" parent="."]
position = Vector2( 717.54, 481.348 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite77" type="SpineSprite" parent="."]
position = Vector2( 777.473, 477.605 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite78" type="SpineSprite" parent="."]
position = Vector2( 838.903, 477.607 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite79" type="SpineSprite" parent="."]
position = Vector2( 900.334, 479.857 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite80" type="SpineSprite" parent="."]
position = Vector2( 961.765, 479.859 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite81" type="SpineSprite" parent="."]
position = Vector2( 66.5229, 562.233 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite82" type="SpineSprite" parent="."]
position = Vector2( 124.208, 562.235 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite83" type="SpineSprite" parent="."]
position = Vector2( 177.398, 562.237 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite84" type="SpineSprite" parent="."]
position = Vector2( 229.838, 564.486 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite85" type="SpineSprite" parent="."]
position = Vector2( 289.77, 563.74 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite86" type="SpineSprite" parent="."]
position = Vector2( 350.452, 561.494 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite87" type="SpineSprite" parent="."]
position = Vector2( 416.377, 563.744 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite88" type="SpineSprite" parent="."]
position = Vector2( 477.059, 563.746 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite89" type="SpineSprite" parent="."]
position = Vector2( 537.74, 563.749 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite90" type="SpineSprite" parent="."]
position = Vector2( 602.167, 563.751 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite91" type="SpineSprite" parent="."]
position = Vector2( 662.1, 564.502 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite92" type="SpineSprite" parent="."]
position = Vector2( 722.032, 566.003 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite93" type="SpineSprite" parent="."]
position = Vector2( 781.964, 562.259 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite94" type="SpineSprite" parent="."]
position = Vector2( 843.395, 562.261 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite95" type="SpineSprite" parent="."]
position = Vector2( 904.826, 564.511 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )
[node name="SpineSprite96" type="SpineSprite" parent="."]
position = Vector2( 966.256, 564.513 )
scale = Vector2( 0.1, 0.1 )
skeleton_data_res = ExtResource( 1 )
preview_animation = ""
preview_frame = false
preview_time = 0.0
script = ExtResource( 2 )

View File

@ -0,0 +1,53 @@
[gd_scene format=2]
[node name="Node2D" type="Node2D"]
[node name="A" type="RigidBody2D" parent="."]
position = Vector2( 483, 158 )
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="A"]
position = Vector2( 6, 17 )
polygon = PoolVector2Array( -38, 6, 28, 6, 28, -45, -40, -45 )
__meta__ = {
"_edit_lock_": true
}
[node name="B" type="RigidBody2D" parent="."]
position = Vector2( 484, 228 )
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="B"]
position = Vector2( 6, 17 )
polygon = PoolVector2Array( -38, 6, 28, 6, 28, -45, -40, -45 )
__meta__ = {
"_edit_lock_": true
}
[node name="C" type="RigidBody2D" parent="."]
position = Vector2( 485, 296 )
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="C"]
position = Vector2( 6, 17 )
polygon = PoolVector2Array( -38, 6, 28, 6, 28, -45, -40, -45 )
__meta__ = {
"_edit_lock_": true
}
[node name="PinJoint2D" type="PinJoint2D" parent="."]
position = Vector2( 484, 189 )
node_a = NodePath("../A")
node_b = NodePath("../B")
bias = 0.9
disable_collision = false
[node name="PinJoint2D2" type="PinJoint2D" parent="."]
position = Vector2( 486, 257 )
node_a = NodePath("../B")
node_b = NodePath("../C")
bias = 0.9
disable_collision = false
[node name="Ground" type="StaticBody2D" parent="."]
position = Vector2( 489, 478 )
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Ground"]
polygon = PoolVector2Array( -116, -4, 128, -100, 204, 34, -156, 48 )

View File

@ -0,0 +1,26 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://assets/spineboy/spineboy-data-res.tres" type="SpineSkeletonDataResource" id=1]
[ext_resource path="res://icon.png" type="Texture" id=2]
[node name="Node2D" type="Node2D"]
[node name="SpineSprite" type="SpineSprite" parent="."]
position = Vector2( 459.397, 501.236 )
scale = Vector2( 0.742335, 0.742335 )
skeleton_data_res = ExtResource( 1 )
preview_animation = "aim"
preview_frame = true
preview_time = 0.0
[node name="SpineBoneNode" type="SpineBoneNode" parent="SpineSprite"]
position = Vector2( 40.8752, -276.036 )
rotation = 0.837234
bone_name = "gun"
bone_mode = 1
enabled = false
color = Color( 0, 1, 0.0627451, 0.466667 )
[node name="Sprite" type="Sprite" parent="SpineSprite/SpineBoneNode"]
visible = false
texture = ExtResource( 2 )

View File

@ -0,0 +1,39 @@
extends SpineSprite
func test_spine_animation():
var walkAnim: SpineAnimation = get_skeleton().get_data().find_animation("walk")
assert(walkAnim.get_name() == "walk")
var duration = walkAnim.get_duration()
walkAnim.set_duration(duration + 1)
assert(walkAnim.get_duration() == duration + 1)
assert(walkAnim.get_timelines().size() == 39)
var timeline: SpineTimeline = walkAnim.get_timelines()[0]
var propertyIds = timeline.get_property_ids()
assert(walkAnim.has_timeline(propertyIds))
assert(!walkAnim.has_timeline([0]))
func test_spine_timeline():
var walkAnim: SpineAnimation = get_skeleton().get_data().find_animation("walk")
var timeline: SpineTimeline = walkAnim.get_timelines()[0]
assert(timeline.get_duration() == 1)
assert(timeline.get_property_ids() == [4294967300])
assert(timeline.get_type() == "RotateTimeline")
func test_spine_object_invalidation():
var skeleton_data = get_skeleton().get_data()
var bone_data = skeleton_data.find_bone("gun");
var old_bone_data_x = bone_data.get_x();
var bone = get_skeleton().find_bone("gun")
var old_bone_x = bone.get_x()
skeleton_data_res = null
assert(old_bone_x != bone.get_x())
assert(old_bone_data_x == bone_data.get_x())
skeleton_data.atlas_res = null;
assert(old_bone_data_x != bone_data.get_x())
func _ready():
test_spine_animation()
test_spine_timeline()
test_spine_object_invalidation()
print("All tests passed")

View File

@ -0,0 +1,12 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://tests/unit-tests.gd" type="Script" id=1]
[ext_resource path="res://assets/spineboy/spineboy-data-res.tres" type="SpineSkeletonDataResource" id=2]
[node name="Node2D" type="Node2D"]
position = Vector2( 496.659, 431.634 )
scale = Vector2( 0.7, 0.7 )
[node name="SpineSprite" type="SpineSprite" parent="."]
skeleton_data_res = ExtResource( 2 )
script = ExtResource( 1 )

Binary file not shown.

View File

@ -0,0 +1,15 @@
[remap]
importer="ogg_vorbis"
type="AudioStreamOGGVorbis"
path="res://.import/footstep.ogg-789c3f1e3c4e0ca3bebcb13f1160f623.oggstr"
[deps]
source_file="res://assets/footstep.ogg"
dest_files=[ "res://.import/footstep.ogg-789c3f1e3c4e0ca3bebcb13f1160f623.oggstr" ]
[params]
loop=false
loop_offset=0

View File

@ -0,0 +1,10 @@
[gd_resource type="SpineSkeletonDataResource" load_steps=3 format=2]
[ext_resource path="res://assets/mix-and-match/mix-and-match.atlas" type="SpineAtlasResource" id=1]
[ext_resource path="res://assets/mix-and-match/mix-and-match-pro.json" type="SpineSkeletonFileResource" id=2]
[resource]
atlas_res = ExtResource( 1 )
skeleton_file_res = ExtResource( 2 )
animations = null
skins = null

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,13 @@
[remap]
importer="spine.json"
type="SpineSkeletonFileResource"
path="res://.import/mix-and-match-pro.json-57325a5014e6fd56fc4a86824bc458ea.spjson"
[deps]
source_file="res://assets/mix-and-match/mix-and-match-pro.json"
dest_files=[ "res://.import/mix-and-match-pro.json-57325a5014e6fd56fc4a86824bc458ea.spjson" ]
[params]

View File

@ -0,0 +1,362 @@
mix-and-match.png
size: 1024, 512
filter: Linear, Linear
scale: 0.5
base-head
bounds: 587, 2, 95, 73
boy/arm-front
bounds: 558, 271, 36, 115
boy/backpack
bounds: 235, 109, 119, 153
boy/backpack-pocket
bounds: 328, 73, 34, 62
rotate: 90
boy/backpack-strap-front
bounds: 665, 79, 38, 88
boy/backpack-up
bounds: 395, 364, 21, 70
rotate: 90
boy/body
bounds: 251, 264, 97, 132
rotate: 90
boy/boot-ribbon-front
bounds: 648, 131, 9, 11
boy/collar
bounds: 744, 4, 73, 29
rotate: 90
boy/ear
bounds: 383, 109, 19, 23
rotate: 90
boy/eye-back-low-eyelid
bounds: 739, 284, 17, 6
rotate: 90
boy/eye-back-pupil
bounds: 832, 443, 8, 9
rotate: 90
boy/eye-back-up-eyelid
bounds: 558, 264, 23, 5
boy/eye-back-up-eyelid-back
bounds: 802, 491, 19, 10
rotate: 90
boy/eye-front-low-eyelid
bounds: 386, 363, 22, 7
rotate: 90
boy/eye-front-pupil
bounds: 816, 389, 9, 9
boy/eye-front-up-eyelid
bounds: 160, 71, 31, 6
rotate: 90
boy/eye-front-up-eyelid-back
bounds: 801, 434, 26, 9
rotate: 90
boy/eye-iris-back
bounds: 618, 264, 17, 17
boy/eye-iris-front
bounds: 727, 264, 18, 18
boy/eye-white-back
bounds: 580, 131, 20, 12
boy/eye-white-front
bounds: 510, 130, 27, 13
boy/eyebrow-back
bounds: 751, 88, 20, 11
rotate: 90
boy/eyebrow-front
bounds: 483, 130, 25, 11
boy/hair-back
bounds: 494, 388, 122, 81
rotate: 90
boy/hair-bangs
bounds: 667, 284, 70, 37
boy/hair-side
bounds: 789, 374, 25, 43
boy/hand-backfingers
bounds: 467, 364, 19, 21
boy/hand-front-fingers
bounds: 488, 364, 19, 21
boy/hat
bounds: 615, 417, 93, 56
rotate: 90
boy/leg-front
bounds: 138, 104, 31, 158
boy/mouth-close
bounds: 551, 365, 21, 5
rotate: 90
girl-blue-cape/mouth-close
bounds: 551, 365, 21, 5
rotate: 90
girl-spring-dress/mouth-close
bounds: 551, 365, 21, 5
rotate: 90
girl/mouth-close
bounds: 551, 365, 21, 5
rotate: 90
boy/mouth-smile
bounds: 705, 79, 29, 7
boy/nose
bounds: 836, 473, 17, 10
rotate: 90
boy/pompom
bounds: 747, 273, 48, 43
rotate: 90
boy/zip
bounds: 648, 144, 14, 23
girl-blue-cape/back-eyebrow
bounds: 602, 131, 18, 12
girl-blue-cape/body-dress
bounds: 2, 264, 109, 246
girl-blue-cape/body-ribbon
bounds: 615, 283, 50, 38
girl-blue-cape/cape-back
bounds: 2, 69, 134, 193
girl-blue-cape/cape-back-up
bounds: 386, 387, 123, 106
rotate: 90
girl-blue-cape/cape-ribbon
bounds: 675, 264, 50, 18
girl-blue-cape/cape-shoulder-back
bounds: 751, 110, 49, 59
girl-blue-cape/cape-shoulder-front
bounds: 113, 264, 62, 76
rotate: 90
girl-blue-cape/cape-up-front
bounds: 399, 264, 98, 117
rotate: 90
girl-blue-cape/ear
bounds: 775, 2, 19, 23
girl-spring-dress/ear
bounds: 775, 2, 19, 23
girl/ear
bounds: 775, 2, 19, 23
girl-blue-cape/eye-back-low-eyelid
bounds: 802, 463, 17, 6
girl-spring-dress/eye-back-low-eyelid
bounds: 802, 463, 17, 6
girl/eye-back-low-eyelid
bounds: 802, 463, 17, 6
girl-blue-cape/eye-back-pupil
bounds: 816, 367, 8, 9
girl-spring-dress/eye-back-pupil
bounds: 816, 367, 8, 9
girl/eye-back-pupil
bounds: 816, 367, 8, 9
girl-blue-cape/eye-back-up-eyelid
bounds: 554, 131, 24, 12
girl-spring-dress/eye-back-up-eyelid
bounds: 554, 131, 24, 12
girl/eye-back-up-eyelid
bounds: 554, 131, 24, 12
girl-blue-cape/eye-back-up-eyelid-back
bounds: 832, 453, 17, 11
rotate: 90
girl-spring-dress/eye-back-up-eyelid-back
bounds: 832, 453, 17, 11
rotate: 90
girl/eye-back-up-eyelid-back
bounds: 832, 453, 17, 11
rotate: 90
girl-blue-cape/eye-front-low-eyelid
bounds: 739, 303, 18, 6
rotate: 90
girl-spring-dress/eye-front-low-eyelid
bounds: 739, 303, 18, 6
rotate: 90
girl/eye-front-low-eyelid
bounds: 739, 303, 18, 6
rotate: 90
girl-blue-cape/eye-front-pupil
bounds: 816, 378, 9, 9
girl-spring-dress/eye-front-pupil
bounds: 816, 378, 9, 9
girl/eye-front-pupil
bounds: 816, 378, 9, 9
girl-blue-cape/eye-front-up-eyelid
bounds: 392, 77, 30, 14
rotate: 90
girl-spring-dress/eye-front-up-eyelid
bounds: 392, 77, 30, 14
rotate: 90
girl/eye-front-up-eyelid
bounds: 392, 77, 30, 14
rotate: 90
girl-blue-cape/eye-front-up-eyelid-back
bounds: 455, 130, 26, 11
girl-spring-dress/eye-front-up-eyelid-back
bounds: 455, 130, 26, 11
girl/eye-front-up-eyelid-back
bounds: 455, 130, 26, 11
girl-blue-cape/eye-iris-back
bounds: 637, 264, 17, 17
girl-blue-cape/eye-iris-front
bounds: 802, 471, 18, 18
girl-blue-cape/eye-white-back
bounds: 596, 264, 20, 16
girl-spring-dress/eye-white-back
bounds: 596, 264, 20, 16
girl-blue-cape/eye-white-front
bounds: 796, 5, 20, 16
rotate: 90
girl-spring-dress/eye-white-front
bounds: 796, 5, 20, 16
rotate: 90
girl/eye-white-front
bounds: 796, 5, 20, 16
rotate: 90
girl-blue-cape/front-eyebrow
bounds: 608, 149, 18, 12
rotate: 90
girl-blue-cape/hair-back
bounds: 508, 145, 117, 98
rotate: 90
girl-blue-cape/hair-bangs
bounds: 673, 419, 91, 40
rotate: 90
girl-blue-cape/hair-head-side-back
bounds: 196, 331, 30, 52
rotate: 90
girl-blue-cape/hair-head-side-front
bounds: 738, 323, 41, 42
girl-blue-cape/hair-side
bounds: 473, 3, 36, 71
girl-blue-cape/hand-front-fingers
bounds: 509, 365, 19, 21
girl-spring-dress/hand-front-fingers
bounds: 509, 365, 19, 21
girl-blue-cape/leg-front
bounds: 168, 72, 30, 158
rotate: 90
girl-blue-cape/mouth-smile
bounds: 736, 79, 29, 7
girl-spring-dress/mouth-smile
bounds: 736, 79, 29, 7
girl/mouth-smile
bounds: 736, 79, 29, 7
girl-blue-cape/nose
bounds: 747, 264, 11, 7
girl-spring-dress/nose
bounds: 747, 264, 11, 7
girl/nose
bounds: 747, 264, 11, 7
girl-blue-cape/sleeve-back
bounds: 767, 79, 42, 29
girl-blue-cape/sleeve-front
bounds: 408, 76, 52, 119
rotate: 90
girl-spring-dress/arm-front
bounds: 596, 282, 17, 111
girl-spring-dress/back-eyebrow
bounds: 801, 420, 18, 12
girl-spring-dress/body-up
bounds: 179, 4, 64, 66
girl-spring-dress/cloak-down
bounds: 775, 27, 50, 50
girl-spring-dress/cloak-up
bounds: 360, 7, 64, 58
rotate: 90
girl-spring-dress/eye-iris-back
bounds: 656, 264, 17, 17
girl-spring-dress/eye-iris-front
bounds: 814, 492, 18, 18
girl-spring-dress/front-eyebrow
bounds: 822, 472, 18, 12
rotate: 90
girl-spring-dress/hair-back
bounds: 196, 363, 147, 93
rotate: 90
girl-spring-dress/hair-bangs
bounds: 696, 326, 91, 40
rotate: 90
girl-spring-dress/hair-head-side-back
bounds: 529, 76, 30, 52
girl-spring-dress/hair-head-side-front
bounds: 781, 323, 41, 42
girl-spring-dress/hair-side
bounds: 511, 3, 36, 71
girl-spring-dress/leg-front
bounds: 171, 104, 30, 158
girl-spring-dress/neck
bounds: 138, 70, 20, 32
girl-spring-dress/shoulder-ribbon
bounds: 622, 131, 36, 24
rotate: 90
girl-spring-dress/skirt
bounds: 113, 328, 182, 81
rotate: 90
girl-spring-dress/underskirt
bounds: 2, 2, 175, 65
girl/arm-front
bounds: 577, 395, 36, 115
girl/back-eyebrow
bounds: 834, 492, 18, 12
rotate: 90
girl/bag-base
bounds: 191, 264, 62, 58
rotate: 90
girl/bag-strap-front
bounds: 385, 265, 12, 96
girl/bag-top
bounds: 738, 367, 49, 50
girl/body
bounds: 356, 130, 97, 132
girl/boot-ribbon-front
bounds: 539, 130, 13, 13
girl/eye-iris-back
bounds: 821, 424, 17, 17
girl/eye-iris-front
bounds: 812, 443, 18, 18
girl/eye-white-back
bounds: 814, 5, 20, 16
rotate: 90
girl/front-eyebrow
bounds: 816, 400, 18, 12
rotate: 90
girl/hair-back
bounds: 291, 363, 147, 93
rotate: 90
girl/hair-bangs
bounds: 715, 419, 91, 40
rotate: 90
girl/hair-flap-down-front
bounds: 288, 5, 70, 65
girl/hair-head-side-back
bounds: 561, 77, 30, 52
girl/hair-head-side-front
bounds: 757, 419, 41, 42
rotate: 90
girl/hair-patch
bounds: 245, 4, 66, 41
rotate: 90
girl/hair-side
bounds: 549, 3, 36, 71
girl/hair-strand-back-1
bounds: 684, 3, 58, 74
girl/hair-strand-back-2
bounds: 692, 171, 91, 58
rotate: 90
girl/hair-strand-back-3
bounds: 615, 323, 92, 79
rotate: 90
girl/hair-strand-front-1
bounds: 518, 269, 38, 94
girl/hair-strand-front-2
bounds: 593, 79, 70, 50
girl/hair-strand-front-3
bounds: 705, 88, 44, 81
girl/hand-front-fingers
bounds: 530, 365, 19, 21
girl/hat
bounds: 608, 169, 93, 82
rotate: 90
girl/leg-front
bounds: 203, 104, 30, 158
girl/pompom
bounds: 757, 462, 48, 43
rotate: 90
girl/scarf
bounds: 455, 143, 119, 51
rotate: 90
girl/scarf-back
bounds: 420, 2, 72, 51
rotate: 90
girl/zip
bounds: 356, 109, 19, 25
rotate: 90

View File

@ -0,0 +1,14 @@
[remap]
importer="spine.atlas"
type="SpineAtlasResource"
path="res://.import/mix-and-match.atlas-3d349b543ecdcc01fb29033adaef0841.spatlas"
[deps]
source_file="res://assets/mix-and-match/mix-and-match.atlas"
dest_files=[ "res://.import/mix-and-match.atlas-3d349b543ecdcc01fb29033adaef0841.spatlas" ]
[params]
normal_map_prefix="n"

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 KiB

View File

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/mix-and-match.png-c2d8e28d9f2efc380ff8b95a22dadcc3.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/mix-and-match/mix-and-match.png"
dest_files=[ "res://.import/mix-and-match.png-c2d8e28d9f2efc380ff8b95a22dadcc3.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
process/normal_map_invert_y=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

View File

@ -0,0 +1,16 @@
Raggedy Spineboy.png
size: 256, 256
filter: Linear, Linear
pma: true
arm
bounds: 2, 140, 71, 75
rotate: 90
head
bounds: 2, 2, 136, 187
rotate: 90
leg
bounds: 2, 213, 36, 99
rotate: 90
torso
bounds: 103, 187, 62, 95
rotate: 90

View File

@ -0,0 +1,14 @@
[remap]
importer="spine.atlas"
type="SpineAtlasResource"
path="res://.import/Raggedy Spineboy.atlas-07f7c6b30431397bcf472b18d48851e0.spatlas"
[deps]
source_file="res://assets/raggedyspineboy/Raggedy Spineboy.atlas"
dest_files=[ "res://.import/Raggedy Spineboy.atlas-07f7c6b30431397bcf472b18d48851e0.spatlas" ]
[params]
normal_map_prefix="n"

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/Raggedy Spineboy.png-8982b59aad5b612b7ed1a5da8b447d00.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/raggedyspineboy/Raggedy Spineboy.png"
dest_files=[ "res://.import/Raggedy Spineboy.png-8982b59aad5b612b7ed1a5da8b447d00.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
process/normal_map_invert_y=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

View File

@ -0,0 +1,8 @@
[gd_resource type="SpineSkeletonDataResource" load_steps=3 format=2]
[ext_resource path="res://assets/raggedyspineboy/Raggedy Spineboy.atlas" type="SpineAtlasResource" id=1]
[ext_resource path="res://assets/raggedyspineboy/raggedy spineboy.json" type="SpineSkeletonFileResource" id=2]
[resource]
atlas_res = ExtResource( 1 )
skeleton_file_res = ExtResource( 2 )

View File

@ -0,0 +1,304 @@
{
"skeleton": {
"hash": "ukmbgK+14T0",
"spine": "4.1.23-beta",
"x": -78.45,
"y": -9.66,
"width": 157.48,
"height": 364.98,
"images": "./images/",
"audio": ""
},
"bones": [
{ "name": "root" },
{ "name": "hip", "parent": "root", "x": -0.79, "y": 82.38 },
{ "name": "abdomen", "parent": "hip", "length": 33.5, "rotation": 89.55, "y": -0.1 },
{ "name": "chest", "parent": "abdomen", "length": 29.58, "x": 38.08, "y": 0.73 },
{ "name": "L-arm", "parent": "chest", "length": 32.68, "rotation": -121.23, "x": 24.64, "y": -16.69 },
{ "name": "L-thigh", "parent": "hip", "length": 29.76, "rotation": -81.94, "x": 17.32, "y": -5.2 },
{ "name": "L-foot", "parent": "L-thigh", "length": 37.25, "rotation": -6.29, "x": 37.36, "y": -1.79 },
{ "name": "L-forearm", "parent": "L-arm", "length": 33.69, "rotation": -12.09, "x": 39.1, "y": -2.35 },
{ "name": "R-arm", "parent": "chest", "length": 36.76, "rotation": 133.38, "x": 26, "y": 13.63 },
{ "name": "R-thigh", "parent": "hip", "length": 29.49, "rotation": -93.16, "x": -18.19, "y": -6.06 },
{ "name": "R-foot", "parent": "R-thigh", "length": 39.99, "rotation": -1.8, "x": 36.41, "y": 0.27 },
{ "name": "R-forearm", "parent": "R-arm", "length": 36.13, "rotation": 2.73, "x": 41.66, "y": 0.28 },
{ "name": "head", "parent": "chest", "length": 94.23, "rotation": -2.25, "x": 41.02, "y": -0.11 },
{ "name": "scalp", "parent": "head", "length": 31.95, "rotation": -29.89, "x": 129.34, "y": 15.1 },
{ "name": "hair1", "parent": "scalp", "length": 23.01, "rotation": 68.49, "x": 36.51, "y": 4.13 },
{ "name": "hair2", "parent": "hair1", "length": 23.5, "rotation": 59.56, "x": 29.03, "y": 1.58 }
],
"slots": [
{ "name": "R-arm", "bone": "R-arm", "attachment": "arm" },
{ "name": "L-arm", "bone": "L-arm", "attachment": "arm" },
{ "name": "L-leg", "bone": "L-thigh", "attachment": "leg" },
{ "name": "R-leg", "bone": "R-thigh", "attachment": "leg" },
{ "name": "torso", "bone": "abdomen", "attachment": "torso" },
{ "name": "head", "bone": "head", "attachment": "head" }
],
"skins": [
{
"name": "default",
"attachments": {
"head": {
"head": {
"type": "mesh",
"uvs": [ 0.60755, 0.01864, 0.64146, 0.03355, 0.70227, 0.06028, 0.76687, 0.08869, 0.80696, 0.14524, 0.84158, 0.19407, 1, 0.41294, 1, 0.78562, 0.67349, 1, 0.38214, 1, 0.13935, 0.8937, 0.07949, 0.78808, 0.05899, 0.7519, 0, 0.64781, 0, 0.40213, 0.15055, 0.27784, 0.25632, 0.21734, 0.28424, 0.20137, 0.31117, 0.18597, 0.32034, 0.16739, 0.32984, 0.14814, 0.3317, 0.12798, 0.33358, 0.1076, 0.29623, 0.08869, 0.21779, 0.06978, 0.2514, 0.03195, 0.32659, 0.01699, 0.37521, 0.00732, 0.41202, 0, 0.45684, 0, 0.49046, 0, 0.53155, 0, 0.56517, 0, 0.55023, 0.1049, 0.46058, 0.06437, 0.38587, 0.05086, 0.31117, 0.04816, 0.54649, 0.17516, 0.35973, 0.28865, 0.14308, 0.41294, 0.13188, 0.57777, 0.24767, 0.43186, 0.43817, 0.37511, 0.59878, 0.3616, 0.78181, 0.43726, 0.89761, 0.53994, 0.87616, 0.37787 ],
"triangles": [ 36, 25, 26, 35, 27, 28, 23, 25, 36, 24, 25, 23, 26, 35, 36, 35, 26, 27, 22, 36, 35, 23, 36, 22, 28, 29, 34, 35, 28, 34, 21, 35, 34, 35, 21, 22, 37, 20, 34, 37, 38, 20, 19, 20, 38, 18, 19, 38, 17, 18, 38, 2, 4, 37, 4, 2, 3, 43, 4, 5, 43, 37, 4, 42, 38, 37, 43, 42, 37, 6, 46, 5, 44, 43, 5, 39, 14, 15, 41, 15, 16, 39, 15, 41, 16, 17, 38, 41, 16, 38, 41, 38, 42, 46, 44, 5, 45, 46, 6, 44, 46, 45, 40, 14, 39, 40, 39, 41, 13, 14, 40, 12, 13, 40, 45, 6, 7, 11, 12, 40, 9, 10, 40, 11, 40, 10, 9, 41, 42, 9, 40, 41, 8, 9, 42, 42, 43, 8, 44, 8, 43, 8, 44, 45, 8, 45, 7, 34, 29, 30, 33, 31, 32, 33, 32, 0, 31, 34, 30, 34, 20, 21, 31, 33, 34, 37, 34, 33, 1, 33, 0, 2, 33, 1, 33, 2, 37 ],
"vertices": [ 1, 14, 17.04, -22.66, 1, 3, 14, 11.42, -25.02, 0.97438, 12, 187.6, -11.93, 0.00182, 13, 63.98, 5.58, 0.02381, 2, 14, 1.36, -29.25, 0.37005, 12, 182.37, -21.52, 0.62995, 3, 14, -9.34, -33.75, 0.09775, 12, 176.82, -31.71, 0.82289, 13, 64.49, -16.93, 0.07936, 3, 14, -22.66, -31.7, 0.05494, 12, 165.13, -38.42, 0.86351, 13, 57.7, -28.58, 0.08156, 3, 14, -34.17, -29.93, 0.01796, 12, 155.03, -44.22, 0.89858, 13, 51.83, -38.64, 0.08345, 1, 12, 109.81, -70.7, 1, 1, 12, 30.84, -74.45, 1, 1, 12, -16.96, -26.55, 1, 1, 12, -19.08, 18.11, 1, 1, 12, 1.68, 56.4, 1, 1, 12, 23.63, 66.63, 1, 1, 12, 31.14, 70.14, 1, 1, 12, 52.77, 80.23, 1, 2, 12, 104.83, 82.69, 0.99074, 13, -54.93, 46.39, 0.00926, 3, 12, 132.26, 60.87, 0.88784, 13, -20.27, 41.13, 0.11168, 15, 48.07, 46.13, 4.7E-4, 4, 14, 14.49, 45.72, 0.00833, 12, 145.85, 45.26, 0.85196, 13, -0.71, 34.37, 0.12365, 15, 30.69, 34.9, 0.01605, 4, 14, 14.72, 40.26, 0.01053, 12, 149.44, 41.14, 0.84249, 13, 4.45, 32.59, 0.12681, 15, 26.1, 31.94, 0.02016, 4, 14, 14.94, 35, 0.01266, 12, 152.9, 37.17, 0.83336, 13, 9.43, 30.87, 0.12986, 15, 21.68, 29.08, 0.02412, 4, 14, 17.31, 31.55, 0.05833, 12, 156.9, 35.95, 0.60487, 13, 13.51, 31.8, 0.21603, 15, 19.9, 25.29, 0.12077, 4, 14, 19.76, 27.97, 0.10569, 12, 161.05, 34.68, 0.368, 13, 17.74, 32.78, 0.30535, 15, 18.06, 21.36, 0.22096, 4, 14, 23.06, 25.24, 0.1279, 12, 165.34, 34.6, 0.18497, 13, 21.49, 34.84, 0.23674, 15, 17.37, 17.13, 0.45039, 3, 14, 26.39, 22.47, 0.15034, 13, 25.29, 36.92, 0.16741, 15, 16.67, 12.86, 0.68225, 3, 14, 33.01, 24.76, 0.02128, 13, 25.58, 43.92, 0.03309, 15, 22, 8.32, 0.94563, 1, 15, 33.6, 3.18, 1, 1, 15, 27.7, -4.32, 1, 1, 15, 15.91, -6.38, 1, 1, 15, 8.29, -7.71, 1, 1, 15, 2.52, -8.72, 1, 2, 14, 33.8, -6.24, 0.33703, 15, -4.33, -8.07, 0.66297, 2, 14, 30.77, -10.42, 0.58778, 15, -9.46, -7.58, 0.41222, 2, 14, 27.08, -15.53, 0.81447, 15, -15.74, -6.98, 0.18553, 2, 14, 24.05, -19.7, 0.97838, 15, -20.88, -6.49, 0.02162, 1, 14, 7.37, -4.8, 1, 1, 14, 22.4, 1.3, 1, 1, 15, 7.54, 1.64, 1, 3, 14, 38.63, 17.86, 0.0046, 13, 34.06, 46.62, 0.01618, 15, 18.9, -0.03, 0.97922, 1, 13, 30.82, 1.68, 1, 3, 14, -7.07, 41.74, 7.0E-5, 12, 131.49, 28.69, 0.99828, 15, 16.34, 51.47, 0.00165, 1, 12, 103.58, 60.65, 1, 1, 12, 68.57, 60.72, 1, 1, 12, 100.33, 44.43, 1, 1, 12, 113.74, 15.8, 1, 1, 12, 117.77, -8.69, 1, 1, 12, 103.07, -37.5, 1, 1, 12, 82.15, -56.28, 1, 3, 14, -68.87, -11.37, 0.00371, 12, 116.34, -51.37, 0.97904, 13, 21.84, -64.11, 0.01725 ],
"hull": 33,
"edges": [ 16, 14, 16, 18, 18, 20, 26, 28, 28, 30, 44, 46, 46, 48, 48, 50, 14, 12, 10, 12, 50, 52, 52, 54, 54, 56, 56, 58, 58, 60, 60, 62, 62, 64, 2, 0, 0, 64, 2, 4, 4, 6, 20, 22, 22, 24, 24, 26, 80, 82, 82, 84, 84, 86, 86, 88, 88, 90, 90, 12, 80, 26, 34, 36, 30, 32, 32, 34, 36, 38, 38, 40, 40, 42, 42, 44, 12, 92, 6, 8, 8, 10 ],
"width": 136,
"height": 187
}
},
"L-arm": {
"arm": {
"type": "mesh",
"uvs": [ 1, 0.16418, 0.90368, 0.30178, 0.80735, 0.43938, 0.75345, 0.50664, 0.71536, 0.55417, 0.66561, 0.61626, 0.63234, 0.65778, 0.59417, 0.7054, 0.45366, 0.8527, 0.31316, 1, 0.15658, 1, 0, 1, 0, 0.71458, 0.13235, 0.59074, 0.26471, 0.4669, 0.34675, 0.39836, 0.39153, 0.36096, 0.43008, 0.32876, 0.4689, 0.29633, 0.52302, 0.25113, 0.59417, 0.1917, 0.72983, 0.09585, 0.86549, 0, 1, 0, 0.15703, 0.83582, 0.46722, 0.51561, 0.78995, 0.22527, 0.34029, 0.70958, 0.62889, 0.3843 ],
"triangles": [ 10, 24, 9, 9, 27, 8, 9, 24, 27, 10, 11, 24, 11, 12, 24, 8, 27, 7, 12, 13, 24, 24, 13, 27, 13, 14, 27, 27, 25, 7, 25, 27, 14, 7, 25, 6, 6, 25, 5, 18, 4, 17, 28, 4, 18, 4, 28, 3, 15, 16, 25, 16, 17, 25, 25, 17, 5, 17, 4, 5, 3, 28, 2, 28, 26, 2, 2, 26, 1, 18, 19, 28, 19, 20, 28, 28, 20, 26, 1, 26, 0, 20, 21, 26, 26, 22, 0, 26, 21, 22, 22, 23, 0, 25, 14, 15 ],
"vertices": [ 1, 4, -11.38, 11.41, 1, 1, 4, 0.99, 11.79, 1, 1, 4, 13.36, 12.18, 1, 1, 4, 19.69, 11.97, 1, 2, 4, 24.16, 11.83, 0.91748, 7, -17.58, 10.73, 0.08252, 2, 4, 30, 11.64, 0.75238, 7, -11.83, 11.77, 0.24762, 2, 4, 33.91, 11.51, 0.44551, 7, -7.98, 12.46, 0.55449, 2, 4, 38.39, 11.36, 0.2127, 7, -3.57, 13.26, 0.7873, 2, 4, 53.17, 9.61, 0.07308, 7, 11.25, 14.65, 0.92692, 2, 4, 67.95, 7.86, 0.00873, 7, 26.07, 16.03, 0.99127, 1, 7, 34.26, 8.51, 1, 1, 7, 42.44, 0.99, 1, 1, 7, 27.96, -14.77, 1, 2, 4, 50.33, -20.36, 0.05494, 7, 14.76, -15.25, 0.94506, 2, 4, 37.32, -18.06, 0.23231, 7, 1.56, -15.74, 0.76769, 2, 4, 29.76, -16.28, 0.47868, 7, -6.21, -15.58, 0.52132, 2, 4, 25.63, -15.31, 0.71242, 7, -10.45, -15.5, 0.28758, 2, 4, 22.08, -14.47, 0.81876, 7, -14.1, -15.42, 0.18124, 2, 4, 18.5, -13.63, 0.9506, 7, -17.77, -15.35, 0.0494, 2, 4, 13.51, -12.45, 0.97879, 7, -22.9, -15.25, 0.02121, 2, 4, 6.96, -10.91, 0.99704, 7, -29.63, -15.11, 0.00296, 1, 4, -4.48, -7.2, 1, 1, 4, -15.91, -3.5, 1, 1, 4, -21.43, 4.29, 1, 1, 7, 25.9, -0.53, 1, 2, 4, 31.99, -4.22, 0.80128, 7, -6.56, -3.32, 0.19872, 1, 4, 0.98, 1.89, 1, 1, 7, 9.92, 1.3, 1, 1, 4, 17.32, -0.55, 1 ],
"hull": 24,
"edges": [ 0, 2, 2, 4, 4, 6, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28, 30, 38, 40, 40, 42, 42, 44, 44, 46, 46, 0, 10, 34, 30, 32, 32, 34, 10, 12, 12, 14, 6, 8, 8, 10, 34, 36, 36, 38, 8, 36 ],
"width": 71,
"height": 75
}
},
"L-leg": {
"leg": {
"type": "mesh",
"uvs": [ 1, 0.23129, 1, 0.29498, 1, 0.37025, 1, 0.44552, 1, 0.50921, 1, 0.65976, 1, 0.71766, 1, 0.87399, 0.73924, 1, 0.22971, 1, 0, 0.89715, 0, 0.64818, 0.01978, 0.59915, 0.08517, 0.43712, 0.10542, 0.38694, 0.13057, 0.32459, 0.15317, 0.26859, 0.178, 0.20707, 0.26155, 0, 1, 0, 0.61186, 0.12128, 0.51632, 0.54396 ],
"triangles": [ 21, 13, 4, 21, 4, 5, 12, 13, 21, 12, 21, 5, 12, 5, 6, 11, 12, 6, 9, 10, 11, 11, 6, 9, 6, 8, 9, 7, 8, 6, 20, 18, 19, 20, 19, 0, 17, 18, 20, 17, 20, 0, 17, 0, 1, 16, 17, 1, 16, 1, 2, 15, 16, 2, 15, 2, 3, 14, 15, 3, 14, 3, 4, 13, 14, 4 ],
"vertices": [ 1, 5, 11.02, 15.15, 1, 1, 5, 17.32, 14.75, 1, 2, 5, 24.75, 14.29, 0.95577, 6, -14.29, 14.6, 0.04423, 2, 5, 32.19, 13.83, 0.71874, 6, -6.84, 14.96, 0.28126, 2, 5, 38.49, 13.44, 0.37177, 6, -0.55, 15.26, 0.62823, 2, 5, 53.36, 12.51, 0.00736, 6, 14.34, 15.96, 0.99264, 1, 6, 20.07, 16.24, 1, 1, 6, 35.53, 16.97, 1, 1, 6, 48.43, 8.19, 1, 1, 6, 49.31, -10.13, 1, 1, 6, 39.53, -18.88, 1, 2, 5, 49.98, -23.35, 0.00313, 6, 14.91, -20.05, 0.99687, 2, 5, 45.18, -22.34, 0.02543, 6, 10.03, -19.57, 0.97457, 2, 5, 29.32, -18.99, 0.4709, 6, -6.11, -17.98, 0.5291, 2, 5, 24.4, -17.96, 0.69968, 6, -11.11, -17.49, 0.30032, 2, 5, 18.3, -16.67, 0.89625, 6, -17.32, -16.88, 0.10375, 2, 5, 12.82, -15.51, 0.9779, 6, -22.89, -16.33, 0.0221, 1, 5, 6.79, -14.24, 1, 1, 5, -13.48, -9.97, 1, 1, 5, -11.83, 16.57, 1, 1, 5, -0.72, 1.88, 1, 1, 6, 3.72, -1.97, 1 ],
"hull": 20,
"edges": [ 36, 38, 20, 22, 18, 20, 16, 18, 16, 14, 22, 24, 24, 10, 10, 12, 12, 14, 12, 22, 24, 26, 10, 8, 26, 8, 8, 6, 26, 28, 6, 28, 28, 30, 6, 4, 30, 4, 4, 2, 30, 32, 2, 32, 32, 34, 34, 36, 2, 0, 0, 38, 34, 0 ],
"width": 36,
"height": 99
}
},
"R-arm": {
"arm": {
"type": "mesh",
"uvs": [ 1, 0.16418, 0.90368, 0.30178, 0.80735, 0.43938, 0.75345, 0.50664, 0.71536, 0.55417, 0.66561, 0.61626, 0.63234, 0.65778, 0.59417, 0.7054, 0.45366, 0.8527, 0.31316, 1, 0.15658, 1, 0, 1, 0, 0.71458, 0.13235, 0.59074, 0.26471, 0.4669, 0.34675, 0.39836, 0.39153, 0.36096, 0.43008, 0.32876, 0.4689, 0.29633, 0.52302, 0.25113, 0.59417, 0.1917, 0.72983, 0.09585, 0.86549, 0, 1, 0, 0.15703, 0.83582, 0.46722, 0.51561, 0.78995, 0.22527, 0.34029, 0.70958, 0.62889, 0.3843 ],
"triangles": [ 10, 24, 9, 9, 27, 8, 9, 24, 27, 10, 11, 24, 11, 12, 24, 8, 27, 7, 12, 13, 24, 24, 13, 27, 13, 14, 27, 27, 25, 7, 25, 14, 15, 25, 27, 14, 7, 25, 6, 22, 23, 0, 26, 22, 0, 1, 26, 0, 6, 25, 5, 18, 4, 17, 28, 4, 18, 4, 28, 3, 15, 16, 25, 16, 17, 25, 25, 17, 5, 17, 4, 5, 3, 28, 2, 28, 26, 2, 2, 26, 1, 18, 19, 28, 19, 20, 28, 28, 20, 26, 20, 21, 26, 26, 21, 22 ],
"vertices": [ 1, 8, -6.97, 5.03, 1, 1, 8, 5.06, 7.93, 1, 1, 8, 17.1, 10.83, 1, 2, 8, 23.34, 11.91, 0.99563, 11, -17.75, 12.49, 0.00437, 2, 8, 27.74, 12.68, 0.95467, 11, -13.31, 13.04, 0.04533, 2, 8, 33.5, 13.69, 0.75827, 11, -7.51, 13.77, 0.24173, 2, 8, 37.35, 14.36, 0.53963, 11, -3.63, 14.26, 0.46037, 2, 8, 41.77, 15.13, 0.29363, 11, 0.82, 14.82, 0.70637, 2, 8, 56.6, 16.42, 4.0E-4, 11, 15.69, 15.41, 0.9996, 1, 11, 30.56, 16, 1, 1, 11, 38.34, 8.05, 1, 1, 11, 46.11, 0.1, 1, 1, 11, 30.8, -14.86, 1, 2, 8, 59.92, -13.5, 4.8E-4, 11, 17.59, -14.64, 0.99952, 2, 8, 46.72, -13.9, 0.17385, 11, 4.38, -14.41, 0.82615, 2, 8, 38.95, -13.7, 0.5683, 11, -3.37, -13.84, 0.4317, 2, 8, 34.71, -13.59, 0.79613, 11, -7.6, -13.53, 0.20387, 2, 8, 31.06, -13.49, 0.92362, 11, -11.24, -13.26, 0.07638, 2, 8, 27.39, -13.4, 0.98278, 11, -14.9, -12.99, 0.01722, 1, 8, 22.26, -13.26, 1, 1, 8, 15.53, -13.09, 1, 1, 8, 3.58, -11.79, 1, 1, 8, -8.37, -10.49, 1, 1, 8, -15.36, -3.99, 1, 1, 11, 29.51, -0.54, 1, 2, 8, 38.68, -1.43, 0.57762, 11, -3.06, -1.58, 0.42238, 1, 8, 7.07, -1.77, 1, 1, 11, 13.64, 2.15, 1, 1, 8, 23.56, -0.83, 1 ],
"hull": 24,
"edges": [ 0, 2, 2, 4, 4, 6, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28, 30, 38, 40, 40, 42, 42, 44, 44, 46, 46, 0, 10, 34, 30, 32, 32, 34, 10, 12, 12, 14, 6, 8, 8, 10, 34, 36, 36, 38, 8, 36 ],
"width": 71,
"height": 75
}
},
"R-leg": {
"leg": {
"type": "mesh",
"uvs": [ 1, 0.23129, 1, 0.29498, 1, 0.37025, 1, 0.44552, 1, 0.50921, 1, 0.65976, 1, 0.71766, 1, 0.87399, 0.73924, 1, 0.22971, 1, 0, 0.89715, 0, 0.64818, 0.01978, 0.59915, 0.08517, 0.43712, 0.10542, 0.38694, 0.13057, 0.32459, 0.15317, 0.26859, 0.178, 0.20707, 0.26155, 0, 1, 0, 0.61186, 0.12128, 0.51632, 0.54396 ],
"triangles": [ 21, 13, 4, 21, 4, 5, 12, 13, 21, 12, 21, 5, 12, 5, 6, 11, 12, 6, 9, 10, 11, 11, 6, 9, 6, 8, 9, 7, 8, 6, 20, 18, 19, 20, 19, 0, 17, 18, 20, 17, 20, 0, 17, 0, 1, 16, 17, 1, 16, 1, 2, 15, 16, 2, 15, 2, 3, 14, 15, 3, 14, 3, 4, 13, 14, 4 ],
"vertices": [ 1, 9, 7.41, 14.89, 1, 2, 9, 13.71, 15.24, 0.99432, 10, -23.16, 14.24, 0.00568, 2, 9, 21.15, 15.65, 0.91831, 10, -15.74, 14.89, 0.08169, 2, 9, 28.59, 16.06, 0.65731, 10, -8.32, 15.53, 0.34269, 2, 9, 34.88, 16.4, 0.33128, 10, -2.03, 16.08, 0.66872, 2, 9, 49.77, 17.22, 0.00401, 10, 12.81, 17.36, 0.99599, 1, 10, 18.52, 17.86, 1, 1, 10, 33.94, 19.2, 1, 1, 10, 47.18, 10.92, 1, 1, 10, 48.77, -7.35, 1, 1, 10, 39.34, -16.47, 1, 2, 9, 50.6, -18.79, 0.01347, 10, 14.78, -18.6, 0.98653, 2, 9, 45.72, -18.34, 0.05687, 10, 9.88, -18.31, 0.94313, 2, 9, 29.57, -16.87, 0.66681, 10, -6.3, -17.35, 0.33319, 2, 9, 24.57, -16.42, 0.86313, 10, -11.31, -17.05, 0.13687, 2, 9, 18.36, -15.85, 0.97673, 10, -17.54, -16.68, 0.02327, 2, 9, 12.77, -15.35, 0.99935, 10, -23.13, -16.35, 6.5E-4, 1, 9, 6.64, -14.79, 1, 2, 9, -13.99, -12.91, 0.99999, 10, -49.96, -14.76, 1.0E-5, 1, 9, -15.45, 13.63, 1, 1, 9, -2.7, 0.34, 1, 2, 9, 39.28, -0.79, 0.02735, 10, 2.9, -0.97, 0.97265 ],
"hull": 20,
"edges": [ 36, 38, 20, 22, 18, 20, 16, 18, 16, 14, 22, 24, 24, 10, 10, 12, 12, 14, 12, 22, 24, 26, 10, 8, 26, 8, 8, 6, 26, 28, 6, 28, 28, 30, 6, 4, 30, 4, 4, 2, 30, 32, 2, 32, 32, 34, 34, 36, 2, 0, 0, 38, 34, 0 ],
"width": 36,
"height": 99
}
},
"torso": {
"torso": {
"type": "mesh",
"uvs": [ 0.87097, 0.13351, 1, 0.26703, 1, 0.45027, 1, 0.63351, 1, 0.81676, 1, 1, 0.75, 1, 0.5, 1, 0.25, 1, 0, 1, 0, 0.72402, 0, 0.44805, 0.09823, 0.22402, 0.19646, 0, 0.4692, 0, 0.74195, 0, 0.58869, 0.13132, 0.401, 0.46063, 0.8354, 0.50156, 0.42394, 0.2675, 0.36228, 0.63166, 0.58839, 0.76773, 0.71972, 0.25773, 0.84058, 0.76485, 0.57726, 0.50305, 0.24069, 0.44016, 0.19158, 0.8008, 0.29695, 0.12289, 0.37843, 0.84006, 0.71037, 0.63433, 0.15889, 0.60896 ],
"triangles": [ 8, 26, 28, 8, 28, 7, 9, 26, 8, 9, 10, 26, 23, 4, 5, 6, 23, 5, 7, 21, 6, 6, 21, 23, 23, 3, 4, 7, 28, 21, 26, 20, 28, 28, 20, 21, 10, 30, 26, 26, 30, 20, 20, 24, 21, 21, 29, 23, 21, 24, 29, 29, 18, 23, 23, 18, 3, 10, 11, 30, 29, 24, 18, 18, 2, 3, 30, 25, 20, 20, 17, 24, 20, 25, 17, 30, 11, 25, 2, 18, 1, 11, 12, 25, 22, 19, 16, 22, 0, 1, 19, 14, 16, 19, 27, 14, 22, 15, 0, 22, 16, 15, 12, 13, 27, 16, 14, 15, 27, 13, 14, 22, 24, 19, 1, 18, 22, 25, 27, 19, 25, 12, 27, 17, 19, 24, 24, 22, 18, 17, 25, 19 ],
"vertices": [ 1, 3, 31.69, -23.15, 1, 2, 3, 19.07, -31.25, 0.60494, 2, 57.15, -30.53, 0.39506, 2, 3, 1.66, -31.39, 0.39506, 2, 39.74, -30.66, 0.60494, 2, 3, -15.75, -31.53, 0.20988, 2, 22.33, -30.8, 0.79012, 1, 5, -7.76, 14.89, 1, 1, 5, 9.48, 12.45, 1, 1, 5, 7.3, -2.9, 1, 2, 5, 5.13, -18.25, 0.488, 9, 5.77, 18.5, 0.512, 2, 5, 2.96, -33.59, 0.16267, 9, 6.62, 3.03, 0.83733, 3, 3, -51.05, 30.2, 0.06996, 2, -12.97, 30.92, 0.26337, 9, 7.46, -12.45, 0.66667, 1, 9, -18.72, -13.88, 1, 2, 3, 1.38, 30.61, 0.39506, 2, 39.46, 31.34, 0.60494, 2, 3, 22.71, 24.69, 0.60494, 2, 60.79, 25.41, 0.39506, 1, 3, 44.04, 18.76, 1, 1, 3, 44.18, 1.86, 1, 1, 3, 44.31, -15.05, 1, 1, 3, 31.76, -5.65, 1, 2, 3, 0.38, 5.74, 0.448, 2, 38.46, 6.47, 0.552, 2, 3, -3.29, -21.22, 0.448, 2, 34.79, -20.5, 0.552, 1, 3, 18.74, 4.46, 1, 1, 2, 22.2, 8.74, 1, 2, 2, 9.38, -5.38, 0.52, 5, -15.95, -9.73, 0.48, 1, 3, 19.82, -13.87, 1, 2, 2, 9.78, -21.01, 0.52, 5, -14.03, 5.79, 0.48, 2, 3, -3.56, -5.22, 0.448, 2, 34.52, -4.49, 0.552, 2, 3, 2.25, 15.69, 0.448, 2, 40.33, 16.42, 0.552, 2, 2, 6.04, 19.2, 0.584, 9, -12.08, -1.62, 0.416, 1, 3, 32.42, 12.44, 1, 2, 2, 2.41, 7.58, 0.584, 9, -8.99, 10.15, 0.416, 1, 2, 22.11, -12.84, 1, 1, 2, 24.25, 21.37, 1 ],
"hull": 16,
"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28, 30, 30, 0 ],
"width": 62,
"height": 95
}
}
}
}
],
"animations": {
"animation": {
"bones": {
"abdomen": {
"rotate": [
{
"curve": [ 0.075, 0, 0.112, 6.52 ]
},
{ "time": 0.3, "value": 6.52 },
{ "time": 1.3333 }
]
},
"chest": {
"rotate": [
{
"curve": [ 0.092, 0, 0.137, 13.73 ]
},
{
"time": 0.3667,
"value": 13.73,
"curve": [ 0.469, 13.73, 0.562, 13.32 ]
},
{
"time": 0.6667,
"value": 12.78,
"curve": [ 0.77, 12.78, 0.842, 9.11 ]
},
{
"time": 0.9,
"value": 9.11,
"curve": [ 1.092, 9.11, 1.225, 0 ]
},
{ "time": 1.3333 }
]
},
"head": {
"rotate": [
{
"curve": [ 0.035, 0, 0.061, -5.44 ]
},
{
"time": 0.1,
"value": -10.88,
"curve": [ 0.183, -10.88, 0.35, 6.77 ]
},
{
"time": 0.4333,
"value": 6.77,
"curve": [ 1.157, 6.77, 0.966, 0.14 ]
},
{ "time": 1.3333 }
]
},
"R-arm": {
"rotate": [
{
"curve": [ 0.042, 0, 0.125, -26.35 ]
},
{
"time": 0.1667,
"value": -26.35,
"curve": [ 0.233, -26.35, 0.367, -6.09 ]
},
{
"time": 0.4333,
"value": -6.09,
"curve": [ 0.658, -6.09, 1.108, 0 ]
},
{ "time": 1.3333 }
]
},
"L-arm": {
"rotate": [
{
"curve": [ 0.083, 0, 0.125, 53.01 ]
},
{
"time": 0.3333,
"value": 53.01,
"curve": [ 0.477, 52.83, 0.538, 35.12 ]
},
{
"time": 0.6,
"value": 35.12,
"curve": [ 0.682, 35.12, 0.754, 56.78 ]
},
{
"time": 0.8333,
"value": 56.78,
"curve": [ 1.128, 56.78, 1.181, 0 ]
},
{ "time": 1.3333 }
]
},
"R-forearm": {
"rotate": [
{
"curve": [ 0.116, 0, 0.203, 4.89 ]
},
{
"time": 0.3333,
"value": 9.78,
"curve": [ 0.583, 9.78, 0.804, 0 ]
},
{ "time": 1.3333 }
]
},
"L-forearm": {
"rotate": [
{
"value": 14.9,
"curve": [ 0.143, -80.79, 0.229, 32.08 ]
},
{
"time": 0.4333,
"value": 32.08,
"curve": [ 0.562, 32.08, 0.497, -11.74 ]
},
{
"time": 0.6333,
"value": -11.74,
"curve": [ 0.814, -11.74, 0.749, 58 ]
},
{
"time": 0.9333,
"value": 58,
"curve": [ 1.033, 58, 1.185, 14.9 ]
},
{ "time": 1.3333, "value": 14.9 }
]
},
"scalp": {
"rotate": [
{
"value": -7.01,
"curve": [ 0.095, -7.01, 0.171, -0.43 ]
},
{
"time": 0.2667,
"value": 7.61,
"curve": [ 0.35, 4.26, 0.458, 0 ]
},
{ "time": 0.6667 },
{ "time": 1.3333, "value": -7.01 }
]
},
"hair1": {
"rotate": [
{
"value": -8.8,
"curve": [ 0.067, -8.8, 0.1, -16.02 ]
},
{
"time": 0.2667,
"value": -16.02,
"curve": [ 0.333, -16.02, 0.41, 29.39 ]
},
{
"time": 0.5333,
"value": 29.39,
"curve": [ 0.733, 29.39, 0.885, -8.8 ]
},
{ "time": 1.3333, "value": -8.8 }
]
},
"hair2": {
"rotate": [
{
"value": 4.65,
"curve": [ 0.141, 4.65, 0.125, -17.96 ]
},
{
"time": 0.3333,
"value": -17.96,
"curve": [ 0.408, -17.96, 0.494, 6.63 ]
},
{
"time": 0.6333,
"value": 6.63,
"curve": [ 0.808, 6.63, 0.941, 4.65 ]
},
{ "time": 1.3333, "value": 4.65 }
]
}
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More