mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 06:29:02 +08:00
Merged latest from master
This commit is contained in:
commit
e49b587fa8
9
.gitignore
vendored
9
.gitignore
vendored
@ -104,3 +104,12 @@ spine-turbulenz/spine-js/spine.js
|
||||
spine-threejs/spine-js/spine.js
|
||||
|
||||
spine-ts/.vscode/*
|
||||
|
||||
spine-ue4/Binaries
|
||||
spine-ue4/Intermediate
|
||||
spine-ue4/Saved
|
||||
spine-ue4/SpineUE4.xcworkspace
|
||||
spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/spine-c
|
||||
spine-ue4/Plugins/SpinePlugin/Binaries
|
||||
spine-ue4/SpineUE4.VC.opendb
|
||||
spine-ue4/SpineUE4.sln
|
||||
|
||||
3
CHANGELOG.md
Normal file
3
CHANGELOG.md
Normal file
@ -0,0 +1,3 @@
|
||||
# 3.6.x
|
||||
* [c] Modified kvec.h used by SkeletonBinary.c to use Spine's MALLOC/FREE macros. That way there's only one place
|
||||
to inject custom allocators ([extension.h](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-c/spine-c/include/spine/extension.h)) [commit](https://github.com/EsotericSoftware/spine-runtimes/commit/c2cfbc6cb8709daa082726222d558188d75a004f)
|
||||
Binary file not shown.
@ -96,6 +96,7 @@ public class Skeleton {
|
||||
public function updateCache () : void {
|
||||
var updateCache:Vector.<Updatable> = this._updateCache;
|
||||
updateCache.length = 0;
|
||||
this._updateCacheReset.length = 0;
|
||||
|
||||
var bones:Vector.<Bone> = this.bones;
|
||||
var i:Number = 0;
|
||||
|
||||
@ -323,11 +323,12 @@ public class AnimationState {
|
||||
}
|
||||
|
||||
public function clearTracks ():void {
|
||||
var oldTrainDisabled:Boolean = queue.drainDisabled;
|
||||
queue.drainDisabled = true;
|
||||
for (var i:int = 0, n:int = tracks.length; i < n; i++)
|
||||
clearTrack(i);
|
||||
tracks.length = 0;
|
||||
queue.drainDisabled = false;
|
||||
queue.drainDisabled = oldTrainDisabled;
|
||||
queue.drain();
|
||||
}
|
||||
|
||||
@ -452,12 +453,13 @@ public class AnimationState {
|
||||
}
|
||||
|
||||
public function setEmptyAnimations (mixDuration:Number):void {
|
||||
var oldDrainDisabled:Boolean = queue.drainDisabled;
|
||||
queue.drainDisabled = true;
|
||||
for (var i:int = 0, n:int = tracks.length; i < n; i++) {
|
||||
var current:TrackEntry = tracks[i];
|
||||
if (current != null) setEmptyAnimation(current.trackIndex, mixDuration);
|
||||
}
|
||||
queue.drainDisabled = false;
|
||||
queue.drainDisabled = oldDrainDisabled;
|
||||
queue.drain();
|
||||
}
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@ project(spine_unit_test)
|
||||
|
||||
set(CMAKE_INSTALL_PREFIX "./")
|
||||
set(CMAKE_VERBOSE_MAKEFILE ON)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CRT_SECURE_NO_WARNINGS -DKANJI_MEMTRACE -DUSE_CPP11_MUTEX")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CRT_SECURE_NO_WARNINGS -DKANJI_MEMTRACE -DUSE_CPP11_MUTEX -std=c++11")
|
||||
|
||||
#########################################################
|
||||
# set includes
|
||||
@ -55,4 +55,4 @@ add_custom_command(TARGET spine_unit_test PRE_BUILD
|
||||
|
||||
add_custom_command(TARGET spine_unit_test PRE_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
||||
${CMAKE_CURRENT_LIST_DIR}/../../examples/goblins/export $<TARGET_FILE_DIR:spine_unit_test>/testdata/goblins)
|
||||
${CMAKE_CURRENT_LIST_DIR}/../../examples/goblins/export $<TARGET_FILE_DIR:spine_unit_test>/testdata/goblins)
|
||||
|
||||
@ -11,6 +11,7 @@
|
||||
|
||||
#include <ctime>
|
||||
#include "KString.h"
|
||||
#include <stdio.h>
|
||||
|
||||
#include "spine/extension.h"
|
||||
#include "spine/spine.h"
|
||||
@ -63,7 +64,7 @@ int main(int argc, char* argv[])
|
||||
extern "C" { // probably unnecessary
|
||||
|
||||
void _spAtlasPage_createTexture(spAtlasPage* self, const char* path) {
|
||||
self->rendererObject = nullptr;
|
||||
self->rendererObject = 0;
|
||||
self->width = 2048;
|
||||
self->height = 2048;
|
||||
}
|
||||
@ -74,4 +75,4 @@ extern "C" { // probably unnecessary
|
||||
char* _spUtil_readFile(const char* path, int* length) {
|
||||
return _readFile(path, length);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -27,10 +27,10 @@ void C_InterfaceTestFixture::tearDown()
|
||||
|
||||
static spSkeletonData* readSkeletonJsonData(const char* filename, spAtlas* atlas) {
|
||||
spSkeletonJson* json = spSkeletonJson_create(atlas);
|
||||
ASSERT(json != nullptr);
|
||||
ASSERT(json != 0);
|
||||
|
||||
spSkeletonData* skeletonData = spSkeletonJson_readSkeletonDataFile(json, filename);
|
||||
ASSERT(skeletonData != nullptr);
|
||||
ASSERT(skeletonData != 0);
|
||||
|
||||
spSkeletonJson_dispose(json);
|
||||
return skeletonData;
|
||||
@ -54,22 +54,22 @@ static void testRunner(const char* jsonName, const char* atlasName)
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// Global Animation Information
|
||||
spAtlas* atlas = spAtlas_createFromFile(atlasName, 0);
|
||||
ASSERT(atlas != nullptr);
|
||||
ASSERT(atlas != 0);
|
||||
|
||||
spSkeletonData* skeletonData = readSkeletonJsonData(jsonName, atlas);
|
||||
ASSERT(skeletonData != nullptr);
|
||||
ASSERT(skeletonData != 0);
|
||||
|
||||
spAnimationStateData* stateData = spAnimationStateData_create(skeletonData);
|
||||
ASSERT(stateData != nullptr);
|
||||
ASSERT(stateData != 0);
|
||||
stateData->defaultMix = 0.2f; // force mixing
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// Animation Instance
|
||||
spSkeleton* skeleton = spSkeleton_create(skeletonData);
|
||||
ASSERT(skeleton != nullptr);
|
||||
ASSERT(skeleton != 0);
|
||||
|
||||
spAnimationState* state = spAnimationState_create(stateData);
|
||||
ASSERT(state != nullptr);
|
||||
ASSERT(state != 0);
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@ -40,10 +40,10 @@ void MemoryTestFixture::tearDown()
|
||||
// Helper methods
|
||||
static spSkeletonData* readSkeletonJsonData(const char* filename, spAtlas* atlas) {
|
||||
spSkeletonJson* json = spSkeletonJson_create(atlas);
|
||||
ASSERT(json != nullptr);
|
||||
ASSERT(json != 0);
|
||||
|
||||
spSkeletonData* skeletonData = spSkeletonJson_readSkeletonDataFile(json, filename);
|
||||
ASSERT(skeletonData != nullptr);
|
||||
ASSERT(skeletonData != 0);
|
||||
|
||||
spSkeletonJson_dispose(json);
|
||||
return skeletonData;
|
||||
@ -54,22 +54,22 @@ static void LoadSpineboyExample(spAtlas* &atlas, spSkeletonData* &skeletonData,
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// Global Animation Information
|
||||
atlas = spAtlas_createFromFile(SPINEBOY_ATLAS, 0);
|
||||
ASSERT(atlas != nullptr);
|
||||
ASSERT(atlas != 0);
|
||||
|
||||
skeletonData = readSkeletonJsonData(SPINEBOY_JSON, atlas);
|
||||
ASSERT(skeletonData != nullptr);
|
||||
ASSERT(skeletonData != 0);
|
||||
|
||||
stateData = spAnimationStateData_create(skeletonData);
|
||||
ASSERT(stateData != nullptr);
|
||||
ASSERT(stateData != 0);
|
||||
stateData->defaultMix = 0.4f; // force mixing
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// Animation Instance
|
||||
skeleton = spSkeleton_create(skeletonData);
|
||||
ASSERT(skeleton != nullptr);
|
||||
ASSERT(skeleton != 0);
|
||||
|
||||
state = spAnimationState_create(stateData);
|
||||
ASSERT(state != nullptr);
|
||||
ASSERT(state != 0);
|
||||
}
|
||||
|
||||
static void DisposeAll(spSkeleton* skeleton, spAnimationState* state, spAnimationStateData* stateData, spSkeletonData* skeletonData, spAtlas* atlas)
|
||||
@ -92,11 +92,11 @@ static void DisposeAll(spSkeleton* skeleton, spAnimationState* state, spAnimatio
|
||||
// https://github.com/EsotericSoftware/spine-runtimes/issues/776
|
||||
void MemoryTestFixture::reproduceIssue_776()
|
||||
{
|
||||
spAtlas* atlas = nullptr;
|
||||
spSkeletonData* skeletonData = nullptr;
|
||||
spAnimationStateData* stateData = nullptr;
|
||||
spSkeleton* skeleton = nullptr;
|
||||
spAnimationState* state = nullptr;
|
||||
spAtlas* atlas = 0;
|
||||
spSkeletonData* skeletonData = 0;
|
||||
spAnimationStateData* stateData = 0;
|
||||
spSkeleton* skeleton = 0;
|
||||
spAnimationState* state = 0;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Initialize Animations
|
||||
@ -134,11 +134,11 @@ void MemoryTestFixture::reproduceIssue_776()
|
||||
|
||||
void MemoryTestFixture::reproduceIssue_777()
|
||||
{
|
||||
spAtlas* atlas = nullptr;
|
||||
spSkeletonData* skeletonData = nullptr;
|
||||
spAnimationStateData* stateData = nullptr;
|
||||
spSkeleton* skeleton = nullptr;
|
||||
spAnimationState* state = nullptr;
|
||||
spAtlas* atlas = 0;
|
||||
spSkeletonData* skeletonData = 0;
|
||||
spAnimationStateData* stateData = 0;
|
||||
spSkeleton* skeleton = 0;
|
||||
spAnimationState* state = 0;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Initialize Animations
|
||||
@ -179,7 +179,7 @@ void MemoryTestFixture::reproduceIssue_777()
|
||||
DisposeAll(skeleton, state, stateData, skeletonData, atlas);
|
||||
}
|
||||
|
||||
spSkeleton* skeleton = nullptr;
|
||||
spSkeleton* skeleton = 0;
|
||||
static void spineAnimStateHandler(spAnimationState* state, int type, spTrackEntry* entry, spEvent* event)
|
||||
{
|
||||
if (type == SP_ANIMATION_COMPLETE)
|
||||
@ -192,10 +192,10 @@ static void spineAnimStateHandler(spAnimationState* state, int type, spTrackEnt
|
||||
|
||||
void MemoryTestFixture::reproduceIssue_Loop()
|
||||
{
|
||||
spAtlas* atlas = nullptr;
|
||||
spSkeletonData* skeletonData = nullptr;
|
||||
spAnimationStateData* stateData = nullptr;
|
||||
spAnimationState* state = nullptr;
|
||||
spAtlas* atlas = 0;
|
||||
spSkeletonData* skeletonData = 0;
|
||||
spAnimationStateData* stateData = 0;
|
||||
spAnimationState* state = 0;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Initialize Animations
|
||||
|
||||
@ -13,7 +13,7 @@ SpineEventMonitor::SpineEventMonitor(spAnimationState* _pAnimationState /*= null
|
||||
|
||||
SpineEventMonitor::~SpineEventMonitor()
|
||||
{
|
||||
pAnimState = nullptr;
|
||||
pAnimState = 0;
|
||||
}
|
||||
|
||||
void SpineEventMonitor::RegisterListener(spAnimationState * _pAnimationState)
|
||||
@ -28,7 +28,7 @@ void SpineEventMonitor::RegisterListener(spAnimationState * _pAnimationState)
|
||||
bool SpineEventMonitor::isAnimationPlaying()
|
||||
{
|
||||
if (pAnimState)
|
||||
return spAnimationState_getCurrent(pAnimState, 0) != nullptr;
|
||||
return spAnimationState_getCurrent(pAnimState, 0) != 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -42,7 +42,7 @@ void SpineEventMonitor::spineAnimStateHandler(spAnimationState * state, int type
|
||||
|
||||
void SpineEventMonitor::OnSpineAnimationStateEvent(spAnimationState * state, int type, spTrackEntry * trackEntry, spEvent * event)
|
||||
{
|
||||
const char* eventName = nullptr;
|
||||
const char* eventName = 0;
|
||||
if (state == pAnimState) { // only monitor ours
|
||||
switch(type)
|
||||
{
|
||||
@ -135,7 +135,7 @@ inline bool InterruptMonitor::InterruptEvent::matches(spAnimationState * state,
|
||||
if (mEventType == type) {
|
||||
|
||||
// Looking for specific TrackEntry by pointer
|
||||
if (mTrackEntry != nullptr) {
|
||||
if (mTrackEntry != 0) {
|
||||
return mTrackEntry == trackEntry;
|
||||
}
|
||||
|
||||
|
||||
@ -25,7 +25,7 @@ typedef struct spEvent spEvent;
|
||||
class SpineEventMonitor
|
||||
{
|
||||
public:
|
||||
SpineEventMonitor(spAnimationState* _pAnimationState = nullptr);
|
||||
SpineEventMonitor(spAnimationState* _pAnimationState = 0);
|
||||
virtual ~SpineEventMonitor();
|
||||
|
||||
void RegisterListener(spAnimationState* _pAnimationState);
|
||||
@ -58,7 +58,7 @@ private:
|
||||
{
|
||||
InterruptEvent() {
|
||||
mEventType = -1; // invalid
|
||||
mTrackEntry = nullptr;
|
||||
mTrackEntry = 0;
|
||||
}
|
||||
|
||||
bool matches(spAnimationState* state, int type, spTrackEntry* trackEntry, spEvent* event);
|
||||
@ -72,7 +72,7 @@ private:
|
||||
|
||||
|
||||
public:
|
||||
InterruptMonitor(spAnimationState* _pAnimationState = nullptr);
|
||||
InterruptMonitor(spAnimationState* _pAnimationState = 0);
|
||||
~InterruptMonitor() {}
|
||||
|
||||
virtual bool isAnimationPlaying() override;
|
||||
@ -119,4 +119,4 @@ eventMonitor
|
||||
.AddInterruptEvent(SP_ANIMATION_START); // Then, stop on any following START signal
|
||||
|
||||
|
||||
*/
|
||||
*/
|
||||
|
||||
@ -142,7 +142,7 @@ void _spEventQueue_drain (_spEventQueue* self) {
|
||||
if (self->drainDisabled) return;
|
||||
self->drainDisabled = 1;
|
||||
for (i = 0; i < self->objectsCount; i += 2) {
|
||||
spEventType type = self->objects[i].type;
|
||||
spEventType type = (spEventType)self->objects[i].type;
|
||||
spTrackEntry* entry = self->objects[i+1].entry;
|
||||
spEvent* event;
|
||||
switch (type) {
|
||||
@ -534,12 +534,13 @@ void _spAnimationState_queueEvents (spAnimationState* self, spTrackEntry* entry,
|
||||
|
||||
void spAnimationState_clearTracks (spAnimationState* self) {
|
||||
_spAnimationState* internal = SUB_CAST(_spAnimationState, self);
|
||||
int i, n;
|
||||
int i, n, oldDrainDisabled;
|
||||
oldDrainDisabled = internal->queue->drainDisabled;
|
||||
internal->queue->drainDisabled = 1;
|
||||
for (i = 0, n = self->tracksCount; i < n; i++)
|
||||
spAnimationState_clearTrack(self, i);
|
||||
self->tracksCount = 0;
|
||||
internal->queue->drainDisabled = 0;
|
||||
internal->queue->drainDisabled = oldDrainDisabled;
|
||||
_spEventQueue_drain(internal->queue);
|
||||
}
|
||||
|
||||
@ -674,15 +675,16 @@ spTrackEntry* spAnimationState_addEmptyAnimation(spAnimationState* self, int tra
|
||||
}
|
||||
|
||||
void spAnimationState_setEmptyAnimations(spAnimationState* self, float mixDuration) {
|
||||
int i, n;
|
||||
int i, n, oldDrainDisabled;
|
||||
spTrackEntry* current;
|
||||
_spAnimationState* internal = SUB_CAST(_spAnimationState, self);
|
||||
oldDrainDisabled = internal->queue->drainDisabled;
|
||||
internal->queue->drainDisabled = 1;
|
||||
for (i = 0, n = self->tracksCount; i < n; i++) {
|
||||
current = self->tracks[i];
|
||||
if (current) spAnimationState_setEmptyAnimation(self, current->trackIndex, mixDuration);
|
||||
}
|
||||
internal->queue->drainDisabled = 0;
|
||||
internal->queue->drainDisabled = oldDrainDisabled;
|
||||
_spEventQueue_drain(internal->queue);
|
||||
}
|
||||
|
||||
|
||||
@ -81,7 +81,6 @@ void spMeshAttachment_computeWorldVertices (spMeshAttachment* self, spSlot* slot
|
||||
void spMeshAttachment_setParentMesh (spMeshAttachment* self, spMeshAttachment* parentMesh) {
|
||||
CONST_CAST(spMeshAttachment*, self->parentMesh) = parentMesh;
|
||||
if (parentMesh) {
|
||||
self->super.worldVerticesLength = parentMesh->super.worldVerticesLength;
|
||||
|
||||
self->super.bones = parentMesh->super.bones;
|
||||
self->super.bonesCount = parentMesh->super.bonesCount;
|
||||
@ -95,6 +94,8 @@ void spMeshAttachment_setParentMesh (spMeshAttachment* self, spMeshAttachment* p
|
||||
self->trianglesCount = parentMesh->trianglesCount;
|
||||
|
||||
self->hullLength = parentMesh->hullLength;
|
||||
|
||||
self->super.worldVerticesLength = parentMesh->super.worldVerticesLength;
|
||||
|
||||
self->edges = parentMesh->edges;
|
||||
self->edgesCount = parentMesh->edgesCount;
|
||||
|
||||
@ -161,7 +161,7 @@ static void _addToUpdateCache(_spSkeleton* const internal, _spUpdateType type, v
|
||||
_spUpdate* update;
|
||||
if (internal->updateCacheCount == internal->updateCacheCapacity) {
|
||||
internal->updateCacheCapacity *= 2;
|
||||
internal->updateCache = realloc(internal->updateCache, sizeof(_spUpdate) * internal->updateCacheCapacity);
|
||||
internal->updateCache = (_spUpdate*)realloc(internal->updateCache, sizeof(_spUpdate) * internal->updateCacheCapacity);
|
||||
}
|
||||
update = internal->updateCache + internal->updateCacheCount;
|
||||
update->type = type;
|
||||
@ -172,7 +172,7 @@ static void _addToUpdateCache(_spSkeleton* const internal, _spUpdateType type, v
|
||||
static void _addToUpdateCacheReset(_spSkeleton* const internal, spBone* bone) {
|
||||
if (internal->updateCacheResetCount == internal->updateCacheResetCapacity) {
|
||||
internal->updateCacheResetCapacity *= 2;
|
||||
internal->updateCacheReset = realloc(internal->updateCacheReset, sizeof(spBone*) * internal->updateCacheResetCapacity);
|
||||
internal->updateCacheReset = (spBone**)realloc(internal->updateCacheReset, sizeof(spBone*) * internal->updateCacheResetCapacity);
|
||||
}
|
||||
internal->updateCacheReset[internal->updateCacheResetCount] = bone;
|
||||
++internal->updateCacheResetCount;
|
||||
|
||||
@ -1,92 +1,105 @@
|
||||
/* The MIT License
|
||||
|
||||
Copyright (c) 2008, by Attractive Chaos <attractor@live.co.uk>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
An example:
|
||||
|
||||
#include "kvec.h"
|
||||
int main() {
|
||||
kvec_t(int) array;
|
||||
kv_init(array);
|
||||
kv_push(int, array, 10); // append
|
||||
kv_a(int, array, 20) = 5; // dynamic
|
||||
kv_A(array, 20) = 4; // static
|
||||
kv_destroy(array);
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
2008-09-22 (0.1.0):
|
||||
|
||||
* The initial version.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef AC_KVEC_H
|
||||
#define AC_KVEC_H
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#define kv_roundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x))
|
||||
|
||||
#define kvec_t(type) struct { size_t n, m; type *a; }
|
||||
#define kv_init(v) ((v).n = (v).m = 0, (v).a = 0)
|
||||
#define kv_destroy(v) free((v).a)
|
||||
#define kv_A(v, i) ((v).a[(i)])
|
||||
#define kv_array(v) ((v).a)
|
||||
#define kv_pop(v) ((v).a[--(v).n])
|
||||
#define kv_size(v) ((v).n)
|
||||
#define kv_max(v) ((v).m)
|
||||
|
||||
#define kv_resize(type, v, s) ((v).m = (s), (v).a = (type*)realloc((v).a, sizeof(type) * (v).m))
|
||||
#define kv_trim(type, v) (kv_resize(type, (v), kv_size(v)))
|
||||
|
||||
#define kv_copy(type, v1, v0) do { \
|
||||
if ((v1).m < (v0).n) kv_resize(type, v1, (v0).n); \
|
||||
(v1).n = (v0).n; \
|
||||
memcpy((v1).a, (v0).a, sizeof(type) * (v0).n); \
|
||||
} while (0) \
|
||||
|
||||
#define kv_push(type, v, x) do { \
|
||||
if ((v).n == (v).m) { \
|
||||
(v).m = (v).m? (v).m<<1 : 2; \
|
||||
(v).a = (type*)realloc((v).a, sizeof(type) * (v).m); \
|
||||
} \
|
||||
(v).a[(v).n++] = (x); \
|
||||
} while (0)
|
||||
|
||||
#define kv_pushp(type, v) (((v).n == (v).m)? \
|
||||
((v).m = ((v).m? (v).m<<1 : 2), \
|
||||
(v).a = (type*)realloc((v).a, sizeof(type) * (v).m), 0) \
|
||||
: 0), ((v).a + ((v).n++))
|
||||
|
||||
#define kv_a(type, v, i) (((v).m <= (size_t)(i)? \
|
||||
((v).m = (v).n = (i) + 1, kv_roundup32((v).m), \
|
||||
(v).a = (type*)realloc((v).a, sizeof(type) * (v).m), 0) \
|
||||
: (v).n <= (size_t)(i)? (v).n = (i) + 1 \
|
||||
: 0), (v).a[(i)])
|
||||
|
||||
#endif
|
||||
/* The MIT License
|
||||
|
||||
Copyright (c) 2008, by Attractive Chaos <attractor@live.co.uk>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
An example:
|
||||
|
||||
#include "kvec.h"
|
||||
int main() {
|
||||
kvec_t(int) array;
|
||||
kv_init(array);
|
||||
kv_push(int, array, 10); // append
|
||||
kv_a(int, array, 20) = 5; // dynamic
|
||||
kv_A(array, 20) = 4; // static
|
||||
kv_destroy(array);
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
2008-09-22 (0.1.0):
|
||||
|
||||
* The initial version.
|
||||
|
||||
2017-19-18 (0.1.1):
|
||||
|
||||
Spine Special Edition
|
||||
* Made helper macros for alloc, free and memcpy, which can be overridden.
|
||||
* Made these helpers point to the Spine C Runtime alloc and free functions by default
|
||||
* Reimplemented kv_resize to use alloc and free instead of realloc
|
||||
* Changed kv_push to use kv_resize instead of realloc
|
||||
* Removed kv_pushp and kv_a macros because the weren't used
|
||||
* Removed stdlib include
|
||||
*/
|
||||
|
||||
#ifndef AC_KVEC_H
|
||||
#define AC_KVEC_H
|
||||
|
||||
#ifndef _kv_free
|
||||
#define _kv_free(type, p) (FREE(p))
|
||||
#endif
|
||||
|
||||
#ifndef _kv_alloc
|
||||
#define _kv_alloc(type, s) ((type*)(MALLOC(type, (s))))
|
||||
#endif
|
||||
|
||||
#ifndef _kv_copy
|
||||
#define _kv_copy(type, d, s, n) memcpy((d), (s), sizeof(type) * (n))
|
||||
#endif
|
||||
|
||||
#define kv_roundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x))
|
||||
|
||||
#define kvec_t(type) struct { size_t n, m; type *a; }
|
||||
#define kv_init(v) ((v).n = (v).m = 0, (v).a = 0)
|
||||
#define kv_destroy(v) _kv_free(type, (v).a)
|
||||
#define kv_A(v, i) ((v).a[(i)])
|
||||
#define kv_array(v) ((v).a)
|
||||
#define kv_pop(v) ((v).a[--(v).n])
|
||||
#define kv_size(v) ((v).n)
|
||||
#define kv_max(v) ((v).m)
|
||||
|
||||
#define kv_resize(type, v, s) do { \
|
||||
type* b = _kv_alloc(type, (s)); \
|
||||
if (((s) > 0) && ((v).m > 0)) \
|
||||
_kv_copy(type, b, (v).a, ((s) < (v).m)? (s) : (v).m); \
|
||||
_kv_free(type, (v).a); \
|
||||
(v).a = b; (v).m = (s); \
|
||||
} while (0)
|
||||
|
||||
#define kv_trim(type, v) kv_resize(type, (v), kv_size(v))
|
||||
|
||||
#define kv_copy(type, v1, v0) do { \
|
||||
if ((v1).m < (v0).n) kv_resize(type, v1, (v0).n); \
|
||||
(v1).n = (v0).n; \
|
||||
_kv_copy(type, (v1).a, (v0).a, (v0).n); \
|
||||
} while (0) \
|
||||
|
||||
#define kv_push(type, v, x) do { \
|
||||
if ((v).n == (v).m) \
|
||||
kv_resize(type, (v), ((v).m? (v).m<<1 : 2)); \
|
||||
(v).a[(v).n++] = (x); \
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
|
||||
@ -14,8 +14,6 @@ spine-cocos2dx works with data exported from Spine 3.5.xx.
|
||||
|
||||
spine-cocos2dx supports all Spine features.
|
||||
|
||||
spine-cocos2dx does not yet support loading the binary format.
|
||||
|
||||
## Setup
|
||||
|
||||
The setup for cocos2d-x differs from most other Spine Runtimes because the cocos2d-x distribution includes a copy of the Spine Runtime files. This is not ideal because these files may be old and fail to work with the latest Spine editor. Also it means if cocos2d-x is updated, you may get newer Spine Runtime files which can break your application if you are not using the latest Spine editor. For these reasons, we have requested cocos2d-x to cease distributing the Spine Runtime files, but they continue to do so. The following instructions allow you to use the official Spine cocos2d-x runtime with your cocos2d-x project.
|
||||
|
||||
@ -170,6 +170,18 @@ spTrackEntry* SkeletonAnimation::addAnimation (int trackIndex, const std::string
|
||||
return spAnimationState_addAnimation(_state, trackIndex, animation, loop, delay);
|
||||
}
|
||||
|
||||
spTrackEntry* SkeletonAnimation::setEmptyAnimation (int trackIndex, float mixDuration) {
|
||||
return spAnimationState_setEmptyAnimation(_state, trackIndex, mixDuration);
|
||||
}
|
||||
|
||||
void SkeletonAnimation::setEmptyAnimations (float mixDuration) {
|
||||
spAnimationState_setEmptyAnimations(_state, mixDuration);
|
||||
}
|
||||
|
||||
spTrackEntry* SkeletonAnimation::addEmptyAnimation (int trackIndex, float mixDuration, float delay) {
|
||||
return spAnimationState_addEmptyAnimation(_state, trackIndex, mixDuration, delay);
|
||||
}
|
||||
|
||||
spAnimation* SkeletonAnimation::findAnimation(const std::string& name) const {
|
||||
return spSkeletonData_findAnimation(_skeleton->data, name.c_str());
|
||||
}
|
||||
|
||||
@ -73,6 +73,9 @@ public:
|
||||
|
||||
spTrackEntry* setAnimation (int trackIndex, const std::string& name, bool loop);
|
||||
spTrackEntry* addAnimation (int trackIndex, const std::string& name, bool loop, float delay = 0);
|
||||
spTrackEntry* setEmptyAnimation (int trackIndex, float mixDuration);
|
||||
void setEmptyAnimations (float mixDuration);
|
||||
spTrackEntry* addEmptyAnimation (int trackIndex, float mixDuration, float delay = 0);
|
||||
spAnimation* findAnimation(const std::string& name) const;
|
||||
spTrackEntry* getCurrent (int trackIndex = 0);
|
||||
void clearTracks ();
|
||||
|
||||
@ -343,12 +343,13 @@ namespace Spine {
|
||||
/// It may be desired to use <see cref="AnimationState.SetEmptyAnimations(float)"/> to mix the skeletons back to the setup pose,
|
||||
/// rather than leaving them in their previous pose.</summary>
|
||||
public void ClearTracks () {
|
||||
bool oldDrainDisabled = queue.drainDisabled;
|
||||
queue.drainDisabled = true;
|
||||
for (int i = 0, n = tracks.Count; i < n; i++) {
|
||||
ClearTrack(i);
|
||||
}
|
||||
tracks.Clear();
|
||||
queue.drainDisabled = false;
|
||||
queue.drainDisabled = oldDrainDisabled;
|
||||
queue.Drain();
|
||||
}
|
||||
|
||||
@ -510,12 +511,13 @@ namespace Spine {
|
||||
/// <summary>
|
||||
/// Sets an empty animation for every track, discarding any queued animations, and mixes to it over the specified mix duration.</summary>
|
||||
public void SetEmptyAnimations (float mixDuration) {
|
||||
bool oldDrainDisabled = queue.drainDisabled;
|
||||
queue.drainDisabled = true;
|
||||
for (int i = 0, n = tracks.Count; i < n; i++) {
|
||||
TrackEntry current = tracks.Items[i];
|
||||
if (current != null) SetEmptyAnimation(i, mixDuration);
|
||||
}
|
||||
queue.drainDisabled = false;
|
||||
queue.drainDisabled = oldDrainDisabled;
|
||||
queue.Drain();
|
||||
}
|
||||
|
||||
|
||||
@ -118,6 +118,7 @@ namespace Spine {
|
||||
public void UpdateCache () {
|
||||
ExposedList<IUpdatable> updateCache = this.updateCache;
|
||||
updateCache.Clear();
|
||||
this.updateCacheReset.Clear();
|
||||
|
||||
ExposedList<Bone> bones = this.bones;
|
||||
for (int i = 0, n = bones.Count; i < n; i++)
|
||||
|
||||
@ -110,6 +110,30 @@ namespace Spine {
|
||||
TransformMode.NoScaleOrReflection
|
||||
};
|
||||
|
||||
/// <summary>Returns the version string of binary skeleton data.</summary>
|
||||
public static string GetVersionString (Stream input) {
|
||||
if (input == null) throw new ArgumentNullException("input");
|
||||
|
||||
try {
|
||||
// Hash.
|
||||
int byteCount = ReadVarint(input, true);
|
||||
if (byteCount > 1) input.Position += byteCount - 1;
|
||||
|
||||
// Version.
|
||||
byteCount = ReadVarint(input, true);
|
||||
if (byteCount > 1) {
|
||||
byteCount--;
|
||||
var buffer = new byte[byteCount];
|
||||
ReadFully(input, buffer, 0, byteCount);
|
||||
return System.Text.Encoding.UTF8.GetString(buffer, 0, byteCount);
|
||||
}
|
||||
|
||||
throw new ArgumentException("Stream does not contain a valid binary Skeleton Data.", "input");
|
||||
} catch (Exception e) {
|
||||
throw new ArgumentException("Stream does not contain a valid binary Skeleton Data.\n" + e, "input");
|
||||
}
|
||||
}
|
||||
|
||||
public SkeletonData ReadSkeletonData (Stream input) {
|
||||
if (input == null) throw new ArgumentNullException("input");
|
||||
float scale = Scale;
|
||||
|
||||
@ -339,11 +339,12 @@ public class AnimationState {
|
||||
* It may be desired to use {@link AnimationState#setEmptyAnimations(float)} to mix the skeletons back to the setup pose,
|
||||
* rather than leaving them in their previous pose. */
|
||||
public void clearTracks () {
|
||||
boolean oldDrainDisabled = queue.drainDisabled;
|
||||
queue.drainDisabled = true;
|
||||
for (int i = 0, n = tracks.size; i < n; i++)
|
||||
clearTrack(i);
|
||||
tracks.clear();
|
||||
queue.drainDisabled = false;
|
||||
queue.drainDisabled = oldDrainDisabled;
|
||||
queue.drain();
|
||||
}
|
||||
|
||||
@ -504,12 +505,13 @@ public class AnimationState {
|
||||
/** Sets an empty animation for every track, discarding any queued animations, and mixes to it over the specified mix
|
||||
* duration. */
|
||||
public void setEmptyAnimations (float mixDuration) {
|
||||
boolean oldDrainDisabled = queue.drainDisabled;
|
||||
queue.drainDisabled = true;
|
||||
for (int i = 0, n = tracks.size; i < n; i++) {
|
||||
TrackEntry current = tracks.get(i);
|
||||
if (current != null) setEmptyAnimation(current.trackIndex, mixDuration);
|
||||
}
|
||||
queue.drainDisabled = false;
|
||||
queue.drainDisabled = oldDrainDisabled;
|
||||
queue.drain();
|
||||
}
|
||||
|
||||
|
||||
@ -199,6 +199,7 @@ public class MeshAttachment extends VertexAttachment {
|
||||
regionUVs = parentMesh.regionUVs;
|
||||
triangles = parentMesh.triangles;
|
||||
hullLength = parentMesh.hullLength;
|
||||
worldVerticesLength = parentMesh.worldVerticesLength;
|
||||
edges = parentMesh.edges;
|
||||
width = parentMesh.width;
|
||||
height = parentMesh.height;
|
||||
|
||||
@ -496,12 +496,13 @@ end
|
||||
function AnimationState:clearTracks ()
|
||||
local queue = self.queue
|
||||
local tracks = self.tracks
|
||||
local oldDrainDisabled = queue.drainDisabled
|
||||
queue.drainDisabled = true;
|
||||
for i,track in pairs(tracks) do
|
||||
self:clearTrack(i)
|
||||
end
|
||||
tracks = {}
|
||||
queue.drainDisabled = false;
|
||||
queue.drainDisabled = oldDrainDisabled
|
||||
queue:drain();
|
||||
end
|
||||
|
||||
@ -560,6 +561,7 @@ function AnimationState:setAnimation (trackIndex, animation, loop)
|
||||
local interrupt = true;
|
||||
local current = self:expandToIndex(trackIndex)
|
||||
local queue = self.queue
|
||||
local tracks = self.tracks
|
||||
if current then
|
||||
if current.nextTrackLast == -1 then
|
||||
-- Don't mix from an entry that was never applied.
|
||||
@ -635,11 +637,12 @@ end
|
||||
|
||||
function AnimationState:setEmptyAnimations (mixDuration)
|
||||
local queue = self.queue
|
||||
local oldDrainDisabled = queue.drainDisabled
|
||||
queue.drainDisabled = true
|
||||
for i,current in pairs(self.tracks) do
|
||||
if current then self:setEmptyAnimation(current.trackIndex, mixDuration) end
|
||||
end
|
||||
queue.drainDisabled = false
|
||||
queue.drainDisabled = oldDrainDisabled
|
||||
queue:drain()
|
||||
end
|
||||
|
||||
|
||||
@ -110,6 +110,7 @@ end
|
||||
function Skeleton:updateCache ()
|
||||
local updateCache = {}
|
||||
self._updateCache = updateCache
|
||||
self.updateCacheReset = {}
|
||||
|
||||
local bones = self.bones
|
||||
for i, bone in ipairs(bones) do
|
||||
@ -511,10 +512,10 @@ function Skeleton:update (delta)
|
||||
end
|
||||
|
||||
function Skeleton:setColor (r, g, b, a)
|
||||
self.r = r
|
||||
self.g = g
|
||||
self.b = b
|
||||
self.a = a
|
||||
self.color.r = r
|
||||
self.color.g = g
|
||||
self.color.b = b
|
||||
self.color.a = a
|
||||
end
|
||||
|
||||
return Skeleton
|
||||
|
||||
@ -224,6 +224,7 @@ function MeshAttachment:setParentMesh (parentMesh)
|
||||
self.regionUVs = parentMesh.regionUVs
|
||||
self.triangles = parentMesh.triangles
|
||||
self.hullLength = parentMesh.hullLength
|
||||
self.worldVerticesLength = parentMesh.worldVerticesLength
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -3,8 +3,8 @@
|
||||
#
|
||||
set(DEPS_DIR "${CMAKE_CURRENT_LIST_DIR}/dependencies/")
|
||||
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||
set(SFML_URL "http://www.sfml-dev.org/files/SFML-2.3.2-osx-clang-universal.tar.gz")
|
||||
set(SFML_DIR ${DEPS_DIR}/SFML-2.3.2-osx-clang-universal)
|
||||
set(SFML_URL "http://www.sfml-dev.org/files/SFML-2.4.1-osx-clang.tar.gz")
|
||||
set(SFML_DIR ${DEPS_DIR}/SFML-2.4.1-osx-clang)
|
||||
if (NOT EXISTS "${SFML_DIR}")
|
||||
message("Downloading SFML for Mac OS X")
|
||||
file(DOWNLOAD "${SFML_URL}" "${DEPS_DIR}/sfml.tar.gz")
|
||||
@ -19,8 +19,8 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||
)
|
||||
endif()
|
||||
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||
set(SFML_URL "http://www.sfml-dev.org/files/SFML-2.3.2-linux-gcc-64-bit.tar.gz")
|
||||
set(SFML_DIR ${DEPS_DIR}/SFML-2.3.2)
|
||||
set(SFML_URL "http://www.sfml-dev.org/files/SFML-2.4.1-linux-gcc-64-bit.tar.gz")
|
||||
set(SFML_DIR ${DEPS_DIR}/SFML-2.4.1)
|
||||
if (NOT EXISTS ${SFML_DIR})
|
||||
message("Downloading SFML for Linux 64-bit")
|
||||
file(DOWNLOAD "${SFML_URL}" "${DEPS_DIR}/sfml.tar.gz")
|
||||
@ -30,8 +30,8 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||
)
|
||||
endif()
|
||||
else()
|
||||
set(SFML_URL "http://www.sfml-dev.org/files/SFML-2.3.2-windows-vc14-32-bit.zip")
|
||||
set(SFML_DIR ${DEPS_DIR}/SFML-2.3.2)
|
||||
set(SFML_URL "http://www.sfml-dev.org/files/SFML-2.4.1-windows-vc14-32-bit.zip")
|
||||
set(SFML_DIR ${DEPS_DIR}/SFML-2.4.1)
|
||||
if (NOT EXISTS ${SFML_DIR})
|
||||
message("Downloading SFML for Windows 32-bit")
|
||||
file(DOWNLOAD "${SFML_URL}" "${DEPS_DIR}/sfml.zip")
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@ -1697,11 +1697,12 @@ var spine;
|
||||
}
|
||||
};
|
||||
AnimationState.prototype.clearTracks = function () {
|
||||
var oldDrainDisabled = this.queue.drainDisabled;
|
||||
this.queue.drainDisabled = true;
|
||||
for (var i = 0, n = this.tracks.length; i < n; i++)
|
||||
this.clearTrack(i);
|
||||
this.tracks.length = 0;
|
||||
this.queue.drainDisabled = false;
|
||||
this.queue.drainDisabled = oldDrainDisabled;
|
||||
this.queue.drain();
|
||||
};
|
||||
AnimationState.prototype.clearTrack = function (trackIndex) {
|
||||
@ -1813,13 +1814,14 @@ var spine;
|
||||
return entry;
|
||||
};
|
||||
AnimationState.prototype.setEmptyAnimations = function (mixDuration) {
|
||||
var oldDrainDisabled = this.queue.drainDisabled;
|
||||
this.queue.drainDisabled = true;
|
||||
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
||||
var current = this.tracks[i];
|
||||
if (current != null)
|
||||
this.setEmptyAnimation(current.trackIndex, mixDuration);
|
||||
}
|
||||
this.queue.drainDisabled = false;
|
||||
this.queue.drainDisabled = oldDrainDisabled;
|
||||
this.queue.drain();
|
||||
};
|
||||
AnimationState.prototype.expandToIndex = function (index) {
|
||||
@ -2326,6 +2328,7 @@ var spine;
|
||||
this.regionUVs = parentMesh.regionUVs;
|
||||
this.triangles = parentMesh.triangles;
|
||||
this.hullLength = parentMesh.hullLength;
|
||||
this.worldVerticesLength = parentMesh.worldVerticesLength;
|
||||
}
|
||||
};
|
||||
return MeshAttachment;
|
||||
@ -3641,6 +3644,7 @@ var spine;
|
||||
Skeleton.prototype.updateCache = function () {
|
||||
var updateCache = this._updateCache;
|
||||
updateCache.length = 0;
|
||||
this.updateCacheReset.length = 0;
|
||||
var bones = this.bones;
|
||||
for (var i = 0, n = bones.length; i < n; i++)
|
||||
bones[i].sorted = false;
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -1697,11 +1697,12 @@ var spine;
|
||||
}
|
||||
};
|
||||
AnimationState.prototype.clearTracks = function () {
|
||||
var oldDrainDisabled = this.queue.drainDisabled;
|
||||
this.queue.drainDisabled = true;
|
||||
for (var i = 0, n = this.tracks.length; i < n; i++)
|
||||
this.clearTrack(i);
|
||||
this.tracks.length = 0;
|
||||
this.queue.drainDisabled = false;
|
||||
this.queue.drainDisabled = oldDrainDisabled;
|
||||
this.queue.drain();
|
||||
};
|
||||
AnimationState.prototype.clearTrack = function (trackIndex) {
|
||||
@ -1813,13 +1814,14 @@ var spine;
|
||||
return entry;
|
||||
};
|
||||
AnimationState.prototype.setEmptyAnimations = function (mixDuration) {
|
||||
var oldDrainDisabled = this.queue.drainDisabled;
|
||||
this.queue.drainDisabled = true;
|
||||
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
||||
var current = this.tracks[i];
|
||||
if (current != null)
|
||||
this.setEmptyAnimation(current.trackIndex, mixDuration);
|
||||
}
|
||||
this.queue.drainDisabled = false;
|
||||
this.queue.drainDisabled = oldDrainDisabled;
|
||||
this.queue.drain();
|
||||
};
|
||||
AnimationState.prototype.expandToIndex = function (index) {
|
||||
@ -2326,6 +2328,7 @@ var spine;
|
||||
this.regionUVs = parentMesh.regionUVs;
|
||||
this.triangles = parentMesh.triangles;
|
||||
this.hullLength = parentMesh.hullLength;
|
||||
this.worldVerticesLength = parentMesh.worldVerticesLength;
|
||||
}
|
||||
};
|
||||
return MeshAttachment;
|
||||
@ -3641,6 +3644,7 @@ var spine;
|
||||
Skeleton.prototype.updateCache = function () {
|
||||
var updateCache = this._updateCache;
|
||||
updateCache.length = 0;
|
||||
this.updateCacheReset.length = 0;
|
||||
var bones = this.bones;
|
||||
for (var i = 0, n = bones.length; i < n; i++)
|
||||
bones[i].sorted = false;
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -1282,11 +1282,12 @@ var spine;
|
||||
}
|
||||
};
|
||||
AnimationState.prototype.clearTracks = function () {
|
||||
var oldDrainDisabled = this.queue.drainDisabled;
|
||||
this.queue.drainDisabled = true;
|
||||
for (var i = 0, n = this.tracks.length; i < n; i++)
|
||||
this.clearTrack(i);
|
||||
this.tracks.length = 0;
|
||||
this.queue.drainDisabled = false;
|
||||
this.queue.drainDisabled = oldDrainDisabled;
|
||||
this.queue.drain();
|
||||
};
|
||||
AnimationState.prototype.clearTrack = function (trackIndex) {
|
||||
@ -1398,13 +1399,14 @@ var spine;
|
||||
return entry;
|
||||
};
|
||||
AnimationState.prototype.setEmptyAnimations = function (mixDuration) {
|
||||
var oldDrainDisabled = this.queue.drainDisabled;
|
||||
this.queue.drainDisabled = true;
|
||||
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
||||
var current = this.tracks[i];
|
||||
if (current != null)
|
||||
this.setEmptyAnimation(current.trackIndex, mixDuration);
|
||||
}
|
||||
this.queue.drainDisabled = false;
|
||||
this.queue.drainDisabled = oldDrainDisabled;
|
||||
this.queue.drain();
|
||||
};
|
||||
AnimationState.prototype.expandToIndex = function (index) {
|
||||
@ -2015,6 +2017,7 @@ var spine;
|
||||
this.regionUVs = parentMesh.regionUVs;
|
||||
this.triangles = parentMesh.triangles;
|
||||
this.hullLength = parentMesh.hullLength;
|
||||
this.worldVerticesLength = parentMesh.worldVerticesLength;
|
||||
}
|
||||
};
|
||||
return MeshAttachment;
|
||||
@ -3330,6 +3333,7 @@ var spine;
|
||||
Skeleton.prototype.updateCache = function () {
|
||||
var updateCache = this._updateCache;
|
||||
updateCache.length = 0;
|
||||
this.updateCacheReset.length = 0;
|
||||
var bones = this.bones;
|
||||
for (var i = 0, n = bones.length; i < n; i++)
|
||||
bones[i].sorted = false;
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -1282,11 +1282,12 @@ var spine;
|
||||
}
|
||||
};
|
||||
AnimationState.prototype.clearTracks = function () {
|
||||
var oldDrainDisabled = this.queue.drainDisabled;
|
||||
this.queue.drainDisabled = true;
|
||||
for (var i = 0, n = this.tracks.length; i < n; i++)
|
||||
this.clearTrack(i);
|
||||
this.tracks.length = 0;
|
||||
this.queue.drainDisabled = false;
|
||||
this.queue.drainDisabled = oldDrainDisabled;
|
||||
this.queue.drain();
|
||||
};
|
||||
AnimationState.prototype.clearTrack = function (trackIndex) {
|
||||
@ -1398,13 +1399,14 @@ var spine;
|
||||
return entry;
|
||||
};
|
||||
AnimationState.prototype.setEmptyAnimations = function (mixDuration) {
|
||||
var oldDrainDisabled = this.queue.drainDisabled;
|
||||
this.queue.drainDisabled = true;
|
||||
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
||||
var current = this.tracks[i];
|
||||
if (current != null)
|
||||
this.setEmptyAnimation(current.trackIndex, mixDuration);
|
||||
}
|
||||
this.queue.drainDisabled = false;
|
||||
this.queue.drainDisabled = oldDrainDisabled;
|
||||
this.queue.drain();
|
||||
};
|
||||
AnimationState.prototype.expandToIndex = function (index) {
|
||||
@ -2015,6 +2017,7 @@ var spine;
|
||||
this.regionUVs = parentMesh.regionUVs;
|
||||
this.triangles = parentMesh.triangles;
|
||||
this.hullLength = parentMesh.hullLength;
|
||||
this.worldVerticesLength = parentMesh.worldVerticesLength;
|
||||
}
|
||||
};
|
||||
return MeshAttachment;
|
||||
@ -3330,6 +3333,7 @@ var spine;
|
||||
Skeleton.prototype.updateCache = function () {
|
||||
var updateCache = this._updateCache;
|
||||
updateCache.length = 0;
|
||||
this.updateCacheReset.length = 0;
|
||||
var bones = this.bones;
|
||||
for (var i = 0, n = bones.length; i < n; i++)
|
||||
bones[i].sorted = false;
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -1282,11 +1282,12 @@ var spine;
|
||||
}
|
||||
};
|
||||
AnimationState.prototype.clearTracks = function () {
|
||||
var oldDrainDisabled = this.queue.drainDisabled;
|
||||
this.queue.drainDisabled = true;
|
||||
for (var i = 0, n = this.tracks.length; i < n; i++)
|
||||
this.clearTrack(i);
|
||||
this.tracks.length = 0;
|
||||
this.queue.drainDisabled = false;
|
||||
this.queue.drainDisabled = oldDrainDisabled;
|
||||
this.queue.drain();
|
||||
};
|
||||
AnimationState.prototype.clearTrack = function (trackIndex) {
|
||||
@ -1398,13 +1399,14 @@ var spine;
|
||||
return entry;
|
||||
};
|
||||
AnimationState.prototype.setEmptyAnimations = function (mixDuration) {
|
||||
var oldDrainDisabled = this.queue.drainDisabled;
|
||||
this.queue.drainDisabled = true;
|
||||
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
||||
var current = this.tracks[i];
|
||||
if (current != null)
|
||||
this.setEmptyAnimation(current.trackIndex, mixDuration);
|
||||
}
|
||||
this.queue.drainDisabled = false;
|
||||
this.queue.drainDisabled = oldDrainDisabled;
|
||||
this.queue.drain();
|
||||
};
|
||||
AnimationState.prototype.expandToIndex = function (index) {
|
||||
@ -2015,6 +2017,7 @@ var spine;
|
||||
this.regionUVs = parentMesh.regionUVs;
|
||||
this.triangles = parentMesh.triangles;
|
||||
this.hullLength = parentMesh.hullLength;
|
||||
this.worldVerticesLength = parentMesh.worldVerticesLength;
|
||||
}
|
||||
};
|
||||
return MeshAttachment;
|
||||
@ -3330,6 +3333,7 @@ var spine;
|
||||
Skeleton.prototype.updateCache = function () {
|
||||
var updateCache = this._updateCache;
|
||||
updateCache.length = 0;
|
||||
this.updateCacheReset.length = 0;
|
||||
var bones = this.bones;
|
||||
for (var i = 0, n = bones.length; i < n; i++)
|
||||
bones[i].sorted = false;
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -1282,11 +1282,12 @@ var spine;
|
||||
}
|
||||
};
|
||||
AnimationState.prototype.clearTracks = function () {
|
||||
var oldDrainDisabled = this.queue.drainDisabled;
|
||||
this.queue.drainDisabled = true;
|
||||
for (var i = 0, n = this.tracks.length; i < n; i++)
|
||||
this.clearTrack(i);
|
||||
this.tracks.length = 0;
|
||||
this.queue.drainDisabled = false;
|
||||
this.queue.drainDisabled = oldDrainDisabled;
|
||||
this.queue.drain();
|
||||
};
|
||||
AnimationState.prototype.clearTrack = function (trackIndex) {
|
||||
@ -1398,13 +1399,14 @@ var spine;
|
||||
return entry;
|
||||
};
|
||||
AnimationState.prototype.setEmptyAnimations = function (mixDuration) {
|
||||
var oldDrainDisabled = this.queue.drainDisabled;
|
||||
this.queue.drainDisabled = true;
|
||||
for (var i = 0, n = this.tracks.length; i < n; i++) {
|
||||
var current = this.tracks[i];
|
||||
if (current != null)
|
||||
this.setEmptyAnimation(current.trackIndex, mixDuration);
|
||||
}
|
||||
this.queue.drainDisabled = false;
|
||||
this.queue.drainDisabled = oldDrainDisabled;
|
||||
this.queue.drain();
|
||||
};
|
||||
AnimationState.prototype.expandToIndex = function (index) {
|
||||
@ -2015,6 +2017,7 @@ var spine;
|
||||
this.regionUVs = parentMesh.regionUVs;
|
||||
this.triangles = parentMesh.triangles;
|
||||
this.hullLength = parentMesh.hullLength;
|
||||
this.worldVerticesLength = parentMesh.worldVerticesLength;
|
||||
}
|
||||
};
|
||||
return MeshAttachment;
|
||||
@ -3330,6 +3333,7 @@ var spine;
|
||||
Skeleton.prototype.updateCache = function () {
|
||||
var updateCache = this._updateCache;
|
||||
updateCache.length = 0;
|
||||
this.updateCacheReset.length = 0;
|
||||
var bones = this.bones;
|
||||
for (var i = 0, n = bones.length; i < n; i++)
|
||||
bones[i].sorted = false;
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -307,11 +307,12 @@ module spine {
|
||||
}
|
||||
|
||||
clearTracks () {
|
||||
let oldDrainDisabled = this.queue.drainDisabled;
|
||||
this.queue.drainDisabled = true;
|
||||
for (let i = 0, n = this.tracks.length; i < n; i++)
|
||||
this.clearTrack(i);
|
||||
this.tracks.length = 0;
|
||||
this.queue.drainDisabled = false;
|
||||
this.queue.drainDisabled = oldDrainDisabled;
|
||||
this.queue.drain();
|
||||
}
|
||||
|
||||
@ -435,12 +436,13 @@ module spine {
|
||||
}
|
||||
|
||||
setEmptyAnimations (mixDuration: number) {
|
||||
let oldDrainDisabled = this.queue.drainDisabled;
|
||||
this.queue.drainDisabled = true;
|
||||
for (let i = 0, n = this.tracks.length; i < n; i++) {
|
||||
let current = this.tracks[i];
|
||||
if (current != null) this.setEmptyAnimation(current.trackIndex, mixDuration);
|
||||
}
|
||||
this.queue.drainDisabled = false;
|
||||
this.queue.drainDisabled = oldDrainDisabled;
|
||||
this.queue.drain();
|
||||
}
|
||||
|
||||
|
||||
@ -98,6 +98,7 @@ module spine {
|
||||
updateCache () {
|
||||
let updateCache = this._updateCache;
|
||||
updateCache.length = 0;
|
||||
this.updateCacheReset.length = 0;
|
||||
|
||||
let bones = this.bones;
|
||||
for (let i = 0, n = bones.length; i < n; i++)
|
||||
|
||||
@ -88,6 +88,7 @@ module spine {
|
||||
this.regionUVs = parentMesh.regionUVs;
|
||||
this.triangles = parentMesh.triangles;
|
||||
this.hullLength = parentMesh.hullLength;
|
||||
this.worldVerticesLength = parentMesh.worldVerticesLength
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
5
spine-ue4/Config/DefaultEditor.ini
Normal file
5
spine-ue4/Config/DefaultEditor.ini
Normal file
@ -0,0 +1,5 @@
|
||||
[EditoronlyBP]
|
||||
bAllowClassAndBlueprintPinMatching=true
|
||||
bReplaceBlueprintWithClass=true
|
||||
bDontLoadBlueprintOutsideEditor=true
|
||||
bBlueprintIsNotBlueprintType=true
|
||||
9
spine-ue4/Config/DefaultEngine.ini
Normal file
9
spine-ue4/Config/DefaultEngine.ini
Normal file
@ -0,0 +1,9 @@
|
||||
[URL]
|
||||
|
||||
[/Script/HardwareTargeting.HardwareTargetingSettings]
|
||||
TargetedHardwareClass=Desktop
|
||||
AppliedTargetedHardwareClass=Desktop
|
||||
DefaultGraphicsPerformance=Maximum
|
||||
AppliedDefaultGraphicsPerformance=Maximum
|
||||
|
||||
|
||||
2
spine-ue4/Config/DefaultGame.ini
Normal file
2
spine-ue4/Config/DefaultGame.ini
Normal file
@ -0,0 +1,2 @@
|
||||
[/Script/EngineSettings.GeneralProjectSettings]
|
||||
ProjectID=A32BDAC45F432EB90DF445842A670D58
|
||||
BIN
spine-ue4/Content/GettingStarted/01-basic-animation.umap
Normal file
BIN
spine-ue4/Content/GettingStarted/01-basic-animation.umap
Normal file
Binary file not shown.
BIN
spine-ue4/Content/GettingStarted/01-basic-animation_2.uasset
Normal file
BIN
spine-ue4/Content/GettingStarted/01-basic-animation_2.uasset
Normal file
Binary file not shown.
BIN
spine-ue4/Content/GettingStarted/02-complex-animation.umap
Normal file
BIN
spine-ue4/Content/GettingStarted/02-complex-animation.umap
Normal file
Binary file not shown.
Binary file not shown.
BIN
spine-ue4/Content/GettingStarted/04-basic-controls.umap
Normal file
BIN
spine-ue4/Content/GettingStarted/04-basic-controls.umap
Normal file
Binary file not shown.
BIN
spine-ue4/Content/GettingStarted/05-driving-bones.umap
Normal file
BIN
spine-ue4/Content/GettingStarted/05-driving-bones.umap
Normal file
Binary file not shown.
279
spine-ue4/Content/GettingStarted/Assets/Doi/Doi-atlas.atlas
Normal file
279
spine-ue4/Content/GettingStarted/Assets/Doi/Doi-atlas.atlas
Normal file
@ -0,0 +1,279 @@
|
||||
|
||||
Doi.png
|
||||
size: 646,520
|
||||
format: RGBA8888
|
||||
filter: Linear,Linear
|
||||
repeat: none
|
||||
armL
|
||||
rotate: false
|
||||
xy: 1, 46
|
||||
size: 163, 133
|
||||
orig: 163, 133
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
armR
|
||||
rotate: true
|
||||
xy: 165, 46
|
||||
size: 133, 109
|
||||
orig: 133, 109
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
arrow
|
||||
rotate: true
|
||||
xy: 467, 1
|
||||
size: 64, 85
|
||||
orig: 64, 85
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
body
|
||||
rotate: false
|
||||
xy: 1, 180
|
||||
size: 274, 339
|
||||
orig: 274, 339
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
bootR
|
||||
rotate: false
|
||||
xy: 499, 258
|
||||
size: 91, 84
|
||||
orig: 91, 84
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
browL
|
||||
rotate: false
|
||||
xy: 228, 23
|
||||
size: 40, 22
|
||||
orig: 40, 22
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
browR
|
||||
rotate: true
|
||||
xy: 591, 287
|
||||
size: 32, 25
|
||||
orig: 32, 25
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
eyelids closed
|
||||
rotate: false
|
||||
xy: 276, 201
|
||||
size: 183, 92
|
||||
orig: 183, 92
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
eyelids open
|
||||
rotate: true
|
||||
xy: 499, 343
|
||||
size: 176, 89
|
||||
orig: 176, 89
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
hairL
|
||||
rotate: false
|
||||
xy: 589, 459
|
||||
size: 54, 60
|
||||
orig: 54, 60
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
hairL2
|
||||
rotate: false
|
||||
xy: 553, 4
|
||||
size: 71, 76
|
||||
orig: 71, 76
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
hairM
|
||||
rotate: true
|
||||
xy: 467, 66
|
||||
size: 96, 77
|
||||
orig: 96, 77
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
hairM blob
|
||||
rotate: true
|
||||
xy: 133, 15
|
||||
size: 30, 45
|
||||
orig: 30, 45
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
hairM blobS
|
||||
rotate: false
|
||||
xy: 545, 142
|
||||
size: 16, 20
|
||||
orig: 16, 20
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
hairR
|
||||
rotate: true
|
||||
xy: 1, 4
|
||||
size: 41, 83
|
||||
orig: 41, 83
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
hairR2
|
||||
rotate: true
|
||||
xy: 460, 163
|
||||
size: 94, 101
|
||||
orig: 94, 101
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
hairSide
|
||||
rotate: false
|
||||
xy: 179, 21
|
||||
size: 48, 24
|
||||
orig: 48, 24
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
head
|
||||
rotate: false
|
||||
xy: 276, 294
|
||||
size: 222, 225
|
||||
orig: 222, 225
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
indexL
|
||||
rotate: true
|
||||
xy: 405, 7
|
||||
size: 24, 36
|
||||
orig: 24, 36
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
indexR
|
||||
rotate: false
|
||||
xy: 296, 3
|
||||
size: 34, 28
|
||||
orig: 34, 28
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
inmouth
|
||||
rotate: false
|
||||
xy: 589, 403
|
||||
size: 46, 55
|
||||
orig: 46, 55
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
irisL
|
||||
rotate: true
|
||||
xy: 85, 11
|
||||
size: 34, 47
|
||||
orig: 34, 47
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
irisL flatspec
|
||||
rotate: false
|
||||
xy: 625, 70
|
||||
size: 19, 10
|
||||
orig: 19, 10
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
irisL spec
|
||||
rotate: true
|
||||
xy: 624, 384
|
||||
size: 18, 21
|
||||
orig: 18, 21
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
irisR
|
||||
rotate: false
|
||||
xy: 589, 355
|
||||
size: 34, 47
|
||||
orig: 34, 47
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
irisR flatspec
|
||||
rotate: true
|
||||
xy: 445, 178
|
||||
size: 22, 11
|
||||
orig: 22, 11
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
irisR spec
|
||||
rotate: false
|
||||
xy: 545, 124
|
||||
size: 16, 17
|
||||
orig: 16, 17
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
middleL
|
||||
rotate: true
|
||||
xy: 331, 5
|
||||
size: 26, 36
|
||||
orig: 26, 36
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
middleR
|
||||
rotate: true
|
||||
xy: 591, 320
|
||||
size: 34, 26
|
||||
orig: 34, 26
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
mouth
|
||||
rotate: true
|
||||
xy: 562, 168
|
||||
size: 89, 83
|
||||
orig: 89, 83
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
nose
|
||||
rotate: false
|
||||
xy: 545, 113
|
||||
size: 11, 10
|
||||
orig: 11, 10
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
pinkyL
|
||||
rotate: false
|
||||
xy: 442, 4
|
||||
size: 24, 27
|
||||
orig: 24, 27
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
pony1
|
||||
rotate: false
|
||||
xy: 394, 32
|
||||
size: 72, 105
|
||||
orig: 72, 105
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
pony2
|
||||
rotate: true
|
||||
xy: 562, 81
|
||||
size: 86, 83
|
||||
orig: 86, 83
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
ringL
|
||||
rotate: false
|
||||
xy: 269, 1
|
||||
size: 26, 30
|
||||
orig: 26, 30
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
rotate
|
||||
rotate: true
|
||||
xy: 275, 32
|
||||
size: 105, 118
|
||||
orig: 105, 118
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
strap
|
||||
rotate: true
|
||||
xy: 276, 138
|
||||
size: 62, 168
|
||||
orig: 62, 168
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
thumbL
|
||||
rotate: false
|
||||
xy: 460, 265
|
||||
size: 37, 28
|
||||
orig: 37, 28
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
thumbR
|
||||
rotate: false
|
||||
xy: 368, 6
|
||||
size: 36, 25
|
||||
orig: 36, 25
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
BIN
spine-ue4/Content/GettingStarted/Assets/Doi/Doi-atlas.uasset
Normal file
BIN
spine-ue4/Content/GettingStarted/Assets/Doi/Doi-atlas.uasset
Normal file
Binary file not shown.
2526
spine-ue4/Content/GettingStarted/Assets/Doi/Doi-data.json
Normal file
2526
spine-ue4/Content/GettingStarted/Assets/Doi/Doi-data.json
Normal file
File diff suppressed because one or more lines are too long
BIN
spine-ue4/Content/GettingStarted/Assets/Doi/Doi-data.uasset
Normal file
BIN
spine-ue4/Content/GettingStarted/Assets/Doi/Doi-data.uasset
Normal file
Binary file not shown.
BIN
spine-ue4/Content/GettingStarted/Assets/Doi/Doi.png
Normal file
BIN
spine-ue4/Content/GettingStarted/Assets/Doi/Doi.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 129 KiB |
BIN
spine-ue4/Content/GettingStarted/Assets/Doi/Textures/Doi.uasset
Normal file
BIN
spine-ue4/Content/GettingStarted/Assets/Doi/Textures/Doi.uasset
Normal file
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 487 KiB |
Binary file not shown.
@ -0,0 +1,251 @@
|
||||
|
||||
raptor.png
|
||||
size: 1022,1022
|
||||
format: RGBA8888
|
||||
filter: Linear,Linear
|
||||
repeat: none
|
||||
back_arm
|
||||
rotate: false
|
||||
xy: 410, 545
|
||||
size: 46, 29
|
||||
orig: 46, 29
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
back_bracer
|
||||
rotate: false
|
||||
xy: 540, 548
|
||||
size: 39, 28
|
||||
orig: 39, 28
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
back_hand
|
||||
rotate: true
|
||||
xy: 504, 538
|
||||
size: 36, 34
|
||||
orig: 36, 34
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
back_knee
|
||||
rotate: false
|
||||
xy: 299, 478
|
||||
size: 49, 67
|
||||
orig: 49, 67
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
back_thigh
|
||||
rotate: true
|
||||
xy: 140, 247
|
||||
size: 39, 24
|
||||
orig: 39, 24
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
eyes_open
|
||||
rotate: true
|
||||
xy: 2, 2
|
||||
size: 47, 45
|
||||
orig: 47, 45
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_arm
|
||||
rotate: false
|
||||
xy: 360, 544
|
||||
size: 48, 30
|
||||
orig: 48, 30
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_bracer
|
||||
rotate: false
|
||||
xy: 538, 578
|
||||
size: 41, 29
|
||||
orig: 41, 29
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_hand
|
||||
rotate: false
|
||||
xy: 538, 609
|
||||
size: 41, 38
|
||||
orig: 41, 38
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_open_hand
|
||||
rotate: false
|
||||
xy: 894, 782
|
||||
size: 43, 44
|
||||
orig: 43, 44
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_thigh
|
||||
rotate: false
|
||||
xy: 942, 849
|
||||
size: 57, 29
|
||||
orig: 57, 29
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
gun
|
||||
rotate: false
|
||||
xy: 785, 774
|
||||
size: 107, 103
|
||||
orig: 107, 103
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
gun_nohand
|
||||
rotate: false
|
||||
xy: 614, 703
|
||||
size: 105, 102
|
||||
orig: 105, 102
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
head
|
||||
rotate: false
|
||||
xy: 2, 137
|
||||
size: 136, 149
|
||||
orig: 136, 149
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
lower_leg
|
||||
rotate: true
|
||||
xy: 780, 699
|
||||
size: 73, 98
|
||||
orig: 73, 98
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
mouth_smile
|
||||
rotate: true
|
||||
xy: 49, 2
|
||||
size: 47, 30
|
||||
orig: 47, 30
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
neck
|
||||
rotate: true
|
||||
xy: 1001, 860
|
||||
size: 18, 21
|
||||
orig: 18, 21
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_arm_back
|
||||
rotate: false
|
||||
xy: 940, 936
|
||||
size: 82, 86
|
||||
orig: 82, 86
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_body
|
||||
rotate: false
|
||||
xy: 2, 737
|
||||
size: 610, 285
|
||||
orig: 610, 285
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_front_arm
|
||||
rotate: true
|
||||
xy: 195, 464
|
||||
size: 81, 102
|
||||
orig: 81, 102
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_front_leg
|
||||
rotate: false
|
||||
xy: 2, 478
|
||||
size: 191, 257
|
||||
orig: 191, 257
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_hindleg_back
|
||||
rotate: false
|
||||
xy: 614, 807
|
||||
size: 169, 215
|
||||
orig: 169, 215
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_horn
|
||||
rotate: false
|
||||
xy: 360, 655
|
||||
size: 182, 80
|
||||
orig: 182, 80
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_horn_back
|
||||
rotate: false
|
||||
xy: 360, 576
|
||||
size: 176, 77
|
||||
orig: 176, 77
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_jaw
|
||||
rotate: false
|
||||
xy: 785, 879
|
||||
size: 153, 143
|
||||
orig: 153, 143
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_saddle_noshadow
|
||||
rotate: false
|
||||
xy: 2, 288
|
||||
size: 163, 188
|
||||
orig: 163, 188
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_saddle_strap_front
|
||||
rotate: false
|
||||
xy: 721, 710
|
||||
size: 57, 95
|
||||
orig: 57, 95
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_saddle_strap_rear
|
||||
rotate: true
|
||||
xy: 940, 880
|
||||
size: 54, 74
|
||||
orig: 54, 74
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_saddle_w_shadow
|
||||
rotate: false
|
||||
xy: 195, 547
|
||||
size: 163, 188
|
||||
orig: 163, 188
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_tongue
|
||||
rotate: true
|
||||
xy: 544, 649
|
||||
size: 86, 64
|
||||
orig: 86, 64
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
stirrup_back
|
||||
rotate: false
|
||||
xy: 458, 539
|
||||
size: 44, 35
|
||||
orig: 44, 35
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
stirrup_front
|
||||
rotate: true
|
||||
xy: 81, 4
|
||||
size: 45, 50
|
||||
orig: 45, 50
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
stirrup_strap
|
||||
rotate: true
|
||||
xy: 894, 828
|
||||
size: 49, 46
|
||||
orig: 49, 46
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
torso
|
||||
rotate: true
|
||||
xy: 610, 647
|
||||
size: 54, 91
|
||||
orig: 54, 91
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
visor
|
||||
rotate: false
|
||||
xy: 2, 51
|
||||
size: 131, 84
|
||||
orig: 131, 84
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
Binary file not shown.
2750
spine-ue4/Content/GettingStarted/Assets/Raptor/raptor-data.json
Normal file
2750
spine-ue4/Content/GettingStarted/Assets/Raptor/raptor-data.json
Normal file
File diff suppressed because one or more lines are too long
Binary file not shown.
BIN
spine-ue4/Content/GettingStarted/Assets/Sounds/Footstep.uasset
Normal file
BIN
spine-ue4/Content/GettingStarted/Assets/Sounds/Footstep.uasset
Normal file
Binary file not shown.
BIN
spine-ue4/Content/GettingStarted/Assets/Sounds/Footstep.wav
Normal file
BIN
spine-ue4/Content/GettingStarted/Assets/Sounds/Footstep.wav
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,216 @@
|
||||
|
||||
spineboy-hover.png
|
||||
size: 1024,1024
|
||||
format: RGBA8888
|
||||
filter: Linear,Linear
|
||||
repeat: none
|
||||
eye_indifferent
|
||||
rotate: true
|
||||
xy: 648, 629
|
||||
size: 93, 89
|
||||
orig: 93, 89
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
eye_surprised
|
||||
rotate: true
|
||||
xy: 233, 179
|
||||
size: 93, 89
|
||||
orig: 93, 89
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_bracer
|
||||
rotate: false
|
||||
xy: 245, 2
|
||||
size: 58, 80
|
||||
orig: 58, 80
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_fist_closed
|
||||
rotate: false
|
||||
xy: 168, 45
|
||||
size: 75, 82
|
||||
orig: 75, 82
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_fist_open
|
||||
rotate: false
|
||||
xy: 844, 646
|
||||
size: 86, 87
|
||||
orig: 86, 87
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_foot
|
||||
rotate: true
|
||||
xy: 310, 326
|
||||
size: 126, 69
|
||||
orig: 126, 69
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_foot_bend1
|
||||
rotate: true
|
||||
xy: 951, 894
|
||||
size: 128, 70
|
||||
orig: 128, 70
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_foot_bend2
|
||||
rotate: false
|
||||
xy: 2, 33
|
||||
size: 108, 93
|
||||
orig: 108, 93
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_shin
|
||||
rotate: true
|
||||
xy: 739, 735
|
||||
size: 82, 184
|
||||
orig: 82, 184
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_thigh
|
||||
rotate: false
|
||||
xy: 381, 340
|
||||
size: 48, 112
|
||||
orig: 48, 112
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_upper_arm
|
||||
rotate: false
|
||||
xy: 112, 29
|
||||
size: 54, 97
|
||||
orig: 54, 97
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
goggles
|
||||
rotate: false
|
||||
xy: 156, 454
|
||||
size: 261, 166
|
||||
orig: 261, 166
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
gun
|
||||
rotate: false
|
||||
xy: 739, 819
|
||||
size: 210, 203
|
||||
orig: 210, 203
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
head
|
||||
rotate: false
|
||||
xy: 466, 724
|
||||
size: 271, 298
|
||||
orig: 271, 298
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
hoverboard_board
|
||||
rotate: true
|
||||
xy: 2, 128
|
||||
size: 492, 152
|
||||
orig: 492, 152
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
hoverboard_thruster
|
||||
rotate: false
|
||||
xy: 602, 558
|
||||
size: 60, 64
|
||||
orig: 60, 64
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
hoverglow_small
|
||||
rotate: true
|
||||
xy: 156, 178
|
||||
size: 274, 75
|
||||
orig: 274, 75
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
mouth_grind
|
||||
rotate: true
|
||||
xy: 951, 799
|
||||
size: 93, 59
|
||||
orig: 93, 59
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
mouth_oooo
|
||||
rotate: true
|
||||
xy: 245, 84
|
||||
size: 93, 59
|
||||
orig: 93, 59
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
mouth_smile
|
||||
rotate: false
|
||||
xy: 925, 738
|
||||
size: 93, 59
|
||||
orig: 93, 59
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
muzzle
|
||||
rotate: false
|
||||
xy: 2, 622
|
||||
size: 462, 400
|
||||
orig: 462, 400
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
neck
|
||||
rotate: false
|
||||
xy: 168, 2
|
||||
size: 36, 41
|
||||
orig: 36, 41
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
rear_bracer
|
||||
rotate: false
|
||||
xy: 932, 664
|
||||
size: 56, 72
|
||||
orig: 56, 72
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
rear_foot
|
||||
rotate: false
|
||||
xy: 487, 562
|
||||
size: 113, 60
|
||||
orig: 113, 60
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
rear_foot_bend1
|
||||
rotate: true
|
||||
xy: 419, 503
|
||||
size: 117, 66
|
||||
orig: 117, 66
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
rear_foot_bend2
|
||||
rotate: false
|
||||
xy: 739, 650
|
||||
size: 103, 83
|
||||
orig: 103, 83
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
rear_shin
|
||||
rotate: false
|
||||
xy: 233, 274
|
||||
size: 75, 178
|
||||
orig: 75, 178
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
rear_thigh
|
||||
rotate: true
|
||||
xy: 487, 495
|
||||
size: 65, 104
|
||||
orig: 65, 104
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
rear_upper_arm
|
||||
rotate: true
|
||||
xy: 156, 129
|
||||
size: 47, 87
|
||||
orig: 47, 87
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
torso
|
||||
rotate: true
|
||||
xy: 466, 624
|
||||
size: 98, 180
|
||||
orig: 98, 180
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
@ -0,0 +1,960 @@
|
||||
{
|
||||
"skeleton": {
|
||||
"hash": "Vw3hWCw+PV8Q6kMU7bcyWS2a+uw",
|
||||
"spine": "3.5.03-beta",
|
||||
"width": 511.47,
|
||||
"height": 739.87,
|
||||
"fps": 30,
|
||||
"images": "./images/"
|
||||
},
|
||||
"bones": [
|
||||
{ "name": "root" },
|
||||
{ "name": "hip", "parent": "root", "x": -49.89, "y": 290.95 },
|
||||
{ "name": "hoverboard", "parent": "root", "length": 72.32, "x": 9.9, "y": 57.05 },
|
||||
{ "name": "rear_foot_ik", "parent": "hoverboard", "rotation": -0.97, "x": 83.75, "y": 21.7, "color": "ff3f00ff" },
|
||||
{ "name": "rear_ankle_ik", "parent": "rear_foot_ik", "x": -33.9, "y": 37.33, "color": "ff3f00ff" },
|
||||
{ "name": "rear_thigh", "parent": "hip", "length": 85.7, "rotation": -72.54, "x": 8.9, "y": -5.61, "color": "ff000dff" },
|
||||
{ "name": "rear_shin", "parent": "rear_thigh", "length": 121.87, "rotation": -19.82, "x": 86.09, "y": -1.32, "color": "ff000dff" },
|
||||
{ "name": "rear_foot", "parent": "rear_shin", "length": 51.58, "rotation": 45.77, "x": 121.44, "y": -0.75, "color": "ff000dff" },
|
||||
{ "name": "rear_toe_ik", "parent": "hoverboard", "rotation": -0.97, "x": 135.05, "y": 20.47, "color": "ff3f00ff" },
|
||||
{ "name": "back_foot_tip", "parent": "rear_foot", "length": 50.29, "rotation": 46.61, "x": 51.15, "y": 0.23, "color": "ff000dff" },
|
||||
{ "name": "exhaust1", "parent": "hoverboard", "rotation": 3.19, "x": -249.74, "y": 52.63 },
|
||||
{ "name": "exhaust2", "parent": "hoverboard", "rotation": 26.5, "x": -191.57, "y": -23.5 },
|
||||
{ "name": "front_foot_ik", "parent": "hoverboard", "rotation": -16.95, "x": -100.29, "y": 23.95, "color": "ff3f00ff" },
|
||||
{ "name": "front_ankle_ik", "parent": "front_foot_ik", "x": -28.38, "y": 29.05, "color": "ff3f00ff" },
|
||||
{ "name": "torso", "parent": "hip", "length": 127.55, "rotation": 64.59, "x": -1.61, "y": 4.9, "color": "e0da19ff" },
|
||||
{ "name": "front_upper_arm", "parent": "torso", "length": 69.44, "rotation": 125.79, "x": 103.75, "y": 19.31, "color": "00ff04ff" },
|
||||
{
|
||||
"name": "front_bracer",
|
||||
"parent": "front_upper_arm",
|
||||
"length": 40.56,
|
||||
"rotation": 18.29,
|
||||
"x": 68.8,
|
||||
"y": -0.68,
|
||||
"color": "00ff04ff"
|
||||
},
|
||||
{ "name": "front_fist", "parent": "front_bracer", "length": 65.37, "rotation": 12.43, "x": 40.56, "y": 0.18, "color": "00ff04ff" },
|
||||
{ "name": "front_thigh", "parent": "hip", "length": 74.8, "rotation": -95.51, "x": -17.45, "y": -11.64, "color": "00ff04ff" },
|
||||
{ "name": "front_shin", "parent": "front_thigh", "length": 128.75, "rotation": -2.21, "x": 78.69, "y": 1.6, "color": "00ff04ff" },
|
||||
{ "name": "front_foot", "parent": "front_shin", "length": 41, "rotation": 51.25, "x": 128.75, "y": -0.33, "color": "00ff04ff" },
|
||||
{ "name": "front_toe_ik", "parent": "hoverboard", "rotation": -0.97, "x": -44.59, "y": 21.98, "color": "ff3f00ff" },
|
||||
{
|
||||
"name": "front_foot_tip",
|
||||
"parent": "front_foot",
|
||||
"length": 56.02,
|
||||
"rotation": 44.29,
|
||||
"x": 41.41,
|
||||
"y": -0.07,
|
||||
"color": "00ff04ff"
|
||||
},
|
||||
{ "name": "rear_upper_arm", "parent": "torso", "length": 51.93, "rotation": -153.6, "x": 92.34, "y": -19.21, "color": "ff000dff" },
|
||||
{ "name": "rear_bracer", "parent": "rear_upper_arm", "length": 34.54, "rotation": 43.56, "x": 51.34, "color": "ff000dff" },
|
||||
{ "name": "gun", "parent": "rear_bracer", "length": 43.09, "rotation": 17.61, "x": 34.41, "y": -0.44, "color": "ff000dff" },
|
||||
{ "name": "gunTip", "parent": "gun", "rotation": 6.82, "x": 201.03, "y": 52.13, "color": "ff000dff" },
|
||||
{ "name": "neck", "parent": "torso", "length": 25.45, "rotation": -31.53, "x": 127.48, "y": -0.3, "color": "e0da19ff" },
|
||||
{ "name": "head", "parent": "neck", "length": 131.78, "rotation": 51.9, "x": 27.65, "y": -0.25, "color": "e0da19ff" },
|
||||
{ "name": "hair1", "parent": "head", "length": 47.22, "rotation": -49.09, "x": 149.82, "y": -59.77, "color": "e0da19ff" },
|
||||
{ "name": "hair2", "parent": "hair1", "length": 55.56, "rotation": 50.4, "x": 47.22, "y": 0.18, "color": "e0da19ff" },
|
||||
{ "name": "hair3", "parent": "head", "length": 62.22, "rotation": -32.15, "x": 164.13, "y": 3.68, "color": "e0da19ff" },
|
||||
{ "name": "hair4", "parent": "hair3", "length": 80.27, "rotation": 83.69, "x": 62.22, "y": -0.02, "color": "e0da19ff" },
|
||||
{
|
||||
"name": "hoverboard_thruster_front",
|
||||
"parent": "hoverboard",
|
||||
"rotation": -29.03,
|
||||
"x": 95.77,
|
||||
"y": -2.7,
|
||||
"transform": "noRotationOrReflection"
|
||||
},
|
||||
{
|
||||
"name": "hoverboard_thruster_rear",
|
||||
"parent": "hoverboard",
|
||||
"rotation": -29.03,
|
||||
"x": -76.46,
|
||||
"y": -5.11,
|
||||
"transform": "noRotationOrReflection"
|
||||
},
|
||||
{ "name": "hoverglow_front", "parent": "hoverboard_thruster_front", "x": -1.88, "y": -37.77 },
|
||||
{ "name": "hoverglow_rear", "parent": "hoverboard_thruster_rear", "x": 0.94, "y": -35.65 }
|
||||
],
|
||||
"slots": [
|
||||
{ "name": "hoverboard_thruster_rear", "bone": "hoverboard_thruster_rear", "attachment": "hoverboard_thruster" },
|
||||
{ "name": "hoverboard_thruster_front", "bone": "hoverboard_thruster_front", "attachment": "hoverboard_thruster" },
|
||||
{ "name": "hoverboard_board", "bone": "hoverboard", "attachment": "hoverboard_board" },
|
||||
{ "name": "rear_upper_arm", "bone": "rear_upper_arm", "attachment": "rear_upper_arm" },
|
||||
{ "name": "rear_bracer", "bone": "rear_bracer", "attachment": "rear_bracer" },
|
||||
{ "name": "gun", "bone": "gun", "attachment": "gun" },
|
||||
{ "name": "rear_foot", "bone": "rear_foot", "attachment": "rear_foot" },
|
||||
{ "name": "rear_thigh", "bone": "rear_thigh", "attachment": "rear_thigh" },
|
||||
{ "name": "rear_shin", "bone": "rear_shin", "attachment": "rear_shin" },
|
||||
{ "name": "neck", "bone": "neck", "attachment": "neck" },
|
||||
{ "name": "torso", "bone": "torso", "attachment": "torso" },
|
||||
{ "name": "front_upper_arm", "bone": "front_upper_arm", "attachment": "front_upper_arm" },
|
||||
{ "name": "head", "bone": "head", "attachment": "head" },
|
||||
{ "name": "eye", "bone": "head", "attachment": "eye_indifferent" },
|
||||
{ "name": "front_thigh", "bone": "front_thigh", "attachment": "front_thigh" },
|
||||
{ "name": "front_foot", "bone": "front_foot", "attachment": "front_foot" },
|
||||
{ "name": "front_shin", "bone": "front_shin", "attachment": "front_shin" },
|
||||
{ "name": "mouth", "bone": "head", "attachment": "mouth_smile" },
|
||||
{ "name": "goggles", "bone": "head", "attachment": "goggles" },
|
||||
{ "name": "front_bracer", "bone": "front_bracer", "attachment": "front_bracer" },
|
||||
{ "name": "front_fist", "bone": "front_fist", "attachment": "front_fist_closed" },
|
||||
{ "name": "muzzle", "bone": "gunTip", "blend": "additive" },
|
||||
{ "name": "head-bb", "bone": "head" },
|
||||
{ "name": "hoverglow_front", "bone": "hoverglow_front", "attachment": "hoverglow_small", "blend": "additive" },
|
||||
{ "name": "hoverglow_rear", "bone": "hoverglow_rear", "attachment": "hoverglow_small", "blend": "additive" },
|
||||
{ "name": "exhaust1", "bone": "exhaust2", "color": "ffffff98", "attachment": "hoverglow_small", "blend": "additive" },
|
||||
{ "name": "exhaust2", "bone": "exhaust1", "color": "ffffff98", "attachment": "hoverglow_small", "blend": "additive" }
|
||||
],
|
||||
"ik": [
|
||||
{
|
||||
"name": "front_ankle_ik",
|
||||
"order": 0,
|
||||
"bones": [ "front_thigh", "front_shin" ],
|
||||
"target": "front_ankle_ik",
|
||||
"bendPositive": false
|
||||
},
|
||||
{
|
||||
"name": "front_foot_ik",
|
||||
"order": 1,
|
||||
"bones": [ "front_foot" ],
|
||||
"target": "front_foot_ik"
|
||||
},
|
||||
{
|
||||
"name": "front_toe_ik",
|
||||
"order": 2,
|
||||
"bones": [ "front_foot_tip" ],
|
||||
"target": "front_toe_ik"
|
||||
},
|
||||
{
|
||||
"name": "rear_ankle_ik",
|
||||
"order": 3,
|
||||
"bones": [ "rear_thigh", "rear_shin" ],
|
||||
"target": "rear_ankle_ik",
|
||||
"bendPositive": false
|
||||
},
|
||||
{
|
||||
"name": "rear_foot_ik",
|
||||
"order": 4,
|
||||
"bones": [ "rear_foot" ],
|
||||
"target": "rear_foot_ik"
|
||||
},
|
||||
{
|
||||
"name": "rear_toe_ik",
|
||||
"order": 5,
|
||||
"bones": [ "back_foot_tip" ],
|
||||
"target": "rear_toe_ik"
|
||||
}
|
||||
],
|
||||
"skins": {
|
||||
"default": {
|
||||
"exhaust1": {
|
||||
"hoverglow_small": { "scaleX": 0.462, "scaleY": 0.812, "rotation": -83.09, "width": 274, "height": 75 }
|
||||
},
|
||||
"exhaust2": {
|
||||
"hoverglow_small": { "y": -0.76, "scaleX": 0.413, "scaleY": 0.487, "rotation": -89.24, "width": 274, "height": 75 }
|
||||
},
|
||||
"eye": {
|
||||
"eye_indifferent": {
|
||||
"type": "mesh",
|
||||
"uvs": [ 1, 1, 0, 1, 0, 0, 1, 0 ],
|
||||
"triangles": [ 1, 3, 0, 1, 2, 3 ],
|
||||
"vertices": [ 59.15, -86.8, 28.30999, 0.92, 112.26, 30.44, 143.11, -57.27 ],
|
||||
"hull": 4,
|
||||
"edges": [ 0, 2, 2, 4, 4, 6, 0, 6 ],
|
||||
"width": 93,
|
||||
"height": 89
|
||||
},
|
||||
"eye_surprised": { "x": 85.72, "y": -28.18, "rotation": -70.62, "width": 93, "height": 89 }
|
||||
},
|
||||
"front_bracer": {
|
||||
"front_bracer": { "x": 12.02, "y": -1.66, "rotation": 79.58, "width": 58, "height": 80 }
|
||||
},
|
||||
"front_fist": {
|
||||
"front_fist_closed": { "x": 35.49, "y": 6, "rotation": 67.16, "width": 75, "height": 82 },
|
||||
"front_fist_open": { "x": 39.56, "y": 7.76, "rotation": 67.16, "width": 86, "height": 87 }
|
||||
},
|
||||
"front_foot": {
|
||||
"front_foot": {
|
||||
"type": "mesh",
|
||||
"uvs": [ 0.59416, 0.2342, 0.62256, 0.30335, 0.65008, 0.37035, 0.67637, 0.38403, 0.72067, 0.40709, 0.76263, 0.42893, 1, 0.70375, 1, 1, 0.65517, 1, 0.36439, 1, 0, 1, 0, 0.39195, 0, 0, 0.17845, 0, 0.49794, 0 ],
|
||||
"triangles": [ 8, 9, 3, 4, 8, 3, 8, 4, 5, 8, 5, 6, 8, 6, 7, 11, 12, 13, 11, 1, 10, 13, 14, 0, 0, 11, 13, 1, 11, 0, 2, 9, 10, 2, 10, 1, 9, 2, 3 ],
|
||||
"vertices": [ 2, 20, 18.17, 41.56, 0.72254, 22, 12.46, 46.04, 0.27744, 2, 20, 24.06999, 40.75, 0.57406, 22, 16.12, 41.34, 0.42592, 2, 20, 29.79, 39.97, 0.47663, 22, 19.67, 36.77, 0.52336, 2, 20, 32.79, 41.65, 0.37452, 22, 22.97999, 35.88, 0.62546, 2, 20, 37.86, 44.5, 0.24772, 22, 28.6, 34.4, 0.75226, 2, 20, 42.65, 47.2, 0.17781, 22, 33.9, 32.97, 0.82216, 1, 22, 64.15, 14.56, 1, 1, 22, 64.51, -5.86, 1, 1, 22, 21.05999, -6.63, 1, 2, 20, 35.38, -16.14999, 0.99997, 22, -15.52999, -7.28, 0, 1, 20, 3.08999, -48.81, 1, 1, 20, -26.70999, -19.29999, 1, 1, 20, -45.95, -0.28, 1, 1, 20, -30.12999, 15.68, 1, 2, 20, -1.84, 44.31, 0.91509, 22, 0.05, 61.97, 0.08488 ],
|
||||
"hull": 15,
|
||||
"edges": [ 14, 16, 16, 18, 18, 20, 4, 18, 20, 22, 22, 24, 24, 26, 26, 28, 22, 26, 12, 14, 10, 12, 2, 4, 2, 20, 4, 6, 6, 16, 2, 0, 0, 28, 6, 8, 8, 10 ],
|
||||
"width": 126,
|
||||
"height": 69
|
||||
},
|
||||
"front_foot_bend1": { "x": 22.86, "y": 20.23, "rotation": 45.31, "width": 128, "height": 70 },
|
||||
"front_foot_bend2": { "x": 8.15, "y": 19.56, "rotation": 45.31, "width": 108, "height": 93 }
|
||||
},
|
||||
"front_shin": {
|
||||
"front_shin": { "x": 60.91, "y": -3.9, "rotation": 96.58, "width": 82, "height": 184 }
|
||||
},
|
||||
"front_thigh": {
|
||||
"front_thigh": { "x": 42.47, "y": 4.44, "rotation": 84.86, "width": 48, "height": 112 }
|
||||
},
|
||||
"front_upper_arm": {
|
||||
"front_upper_arm": { "x": 28.29, "y": 7.36, "rotation": 97.88, "width": 54, "height": 97 }
|
||||
},
|
||||
"goggles": {
|
||||
"goggles": {
|
||||
"type": "mesh",
|
||||
"uvs": [ 0.53653, 0.04112, 0.72921, 0.16034, 0.91666, 0.33221, 0.97045, 0.31328, 1, 0.48052, 0.95754, 0.57328, 0.88824, 0.63279, 0.86877, 0.78961, 0.77403, 0.86748, 0.72627, 1, 0.60712, 0.93861, 0.49599, 0.88138, 0.41556, 0.75025, 0.32547, 0.70083, 0.2782, 0.58256, 0.17208, 0.6328, 0.17227, 0.75071, 0.10779, 0.79896, 0, 0.32304, 0, 0.12475, 0.07372, 0.07343, 0.15422, 0.10733, 0.23164, 0.13993, 0.30313, 0.02256, 0.34801, 0, 0.42978, 0.69182, 0.39474, 0.51041, 0.39487, 0.3151, 0.45877, 0.23196, 0.56501, 0.28108, 0.69959, 0.39215, 0.82038, 0.54202, 0.85737, 0.62342, 0.91106, 0.51406, 0.72637, 0.32146, 0.58762, 0.19608, 0.48074, 0.11268, 0.37821, 0.055, 0.32868, 0.17866, 0.31898, 0.30498, 0.36035, 0.53798, 0.40327, 0.70072, 0.30057, 0.55836, 0.21955, 0.2815, 0.09962, 0.28942, 0.56862, 0.4368, 0.4911, 0.37156, 0.51183, 0.52091, 0.67018, 0.59302, 0.7619, 0.68573, 0.73295, 0.43353 ],
|
||||
"triangles": [ 49, 8, 48, 9, 48, 8, 12, 25, 11, 48, 9, 10, 47, 48, 10, 47, 10, 25, 25, 10, 11, 8, 49, 7, 17, 15, 16, 17, 18, 15, 49, 32, 7, 7, 32, 6, 41, 42, 40, 12, 41, 25, 41, 12, 42, 13, 14, 42, 12, 13, 42, 41, 40, 25, 40, 26, 25, 25, 26, 47, 49, 31, 32, 31, 49, 50, 18, 44, 15, 42, 14, 44, 14, 15, 44, 5, 6, 33, 6, 32, 33, 32, 31, 33, 47, 45, 48, 49, 48, 50, 50, 45, 30, 50, 48, 45, 42, 44, 43, 5, 33, 4, 42, 39, 40, 42, 43, 39, 31, 50, 33, 40, 39, 26, 45, 47, 46, 33, 2, 4, 2, 33, 34, 47, 26, 46, 26, 27, 46, 26, 39, 27, 2, 3, 4, 30, 45, 29, 30, 34, 50, 33, 50, 34, 45, 46, 29, 30, 29, 34, 27, 28, 46, 46, 28, 29, 18, 19, 44, 29, 35, 34, 2, 34, 1, 34, 35, 1, 28, 27, 38, 27, 39, 38, 39, 43, 38, 44, 19, 21, 44, 21, 43, 21, 19, 20, 43, 22, 38, 43, 21, 22, 29, 28, 35, 28, 36, 35, 28, 38, 36, 36, 0, 35, 35, 0, 1, 22, 23, 38, 38, 37, 36, 37, 23, 24, 37, 38, 23, 36, 37, 0, 37, 24, 0 ],
|
||||
"vertices": [ 172.08, 22.79999, 170.08, -31.19, 159.41, -86.8, 167.02, -99, 143.38998, -115.48, 125.19, -110.12999, 109.87, -96.33999, 83.62999, -100.19, 63.25, -81.15, 38.36, -76.69, 37.65, -43.97, 37, -13.47, 50.56, 13.52999, 50.5, 38.45, 64.94, 56.59, 47.88, 79.94, 29.45, 73.41, 16.29999, 86.62, 81.5, 139.38, 112.55, 150.27998, 126.97, 134.97, 128.63, 113.26999, 130.22, 92.43, 154.77998, 81.29, 162.21, 71.48, 60.95, 13.26, 86.33, 31.87, 116.91, 42.59, 135.47, 31.44, 136.97, 2.56999, 131.22, -36.65, 118.22, -74.65, 108.68, -88.23, 130.44, -95.43, 144.61, -39.36, 152.24, 1.69, 156.05, 32.59, 156.21, 61, 132.55, 66.4, 111.94, 61.83, 79.01999, 38.83, 57.27, 19.29, 70.66, 52.40999, 107.01, 87.61, 95.37999, 116.69, 112.91, -6.86, 116.41, 15.8, 94.80999, 2.47, 97.23, -40.47, 90.66, -68.16, 127.62999, -47.15 ],
|
||||
"hull": 25,
|
||||
"edges": [ 36, 34, 34, 32, 32, 30, 30, 28, 28, 26, 26, 24, 24, 22, 18, 16, 16, 14, 14, 12, 12, 10, 10, 8, 8, 6, 6, 4, 4, 2, 2, 0, 0, 48, 48, 46, 46, 44, 36, 38, 40, 38, 24, 50, 50, 52, 52, 54, 54, 56, 56, 58, 58, 60, 62, 64, 64, 12, 8, 66, 66, 68, 68, 70, 70, 72, 72, 74, 74, 76, 76, 78, 78, 80, 80, 82, 82, 24, 24, 84, 84, 86, 86, 44, 40, 42, 42, 44, 42, 88, 88, 30, 58, 90, 90, 92, 92, 94, 18, 20, 20, 22, 94, 20, 18, 96, 96, 98, 60, 100, 100, 62, 98, 100 ],
|
||||
"width": 261,
|
||||
"height": 166
|
||||
}
|
||||
},
|
||||
"gun": {
|
||||
"gun": { "x": 77.3, "y": 16.39, "rotation": 60.81, "width": 210, "height": 203 }
|
||||
},
|
||||
"head": {
|
||||
"head": {
|
||||
"type": "mesh",
|
||||
"uvs": [ 0.75918, 0.06106, 0.88392, 0.17892, 0.90174, 0.30856, 0.94222, 0.1966, 1, 0.26583, 1, 0.42199, 0.95863, 0.46992, 0.92118, 0.51332, 0.85957, 0.53469, 0.78387, 0.65605, 0.74383, 0.74838, 0.85114, 0.75151, 0.84828, 0.82563, 0.81779, 0.85367, 0.75598, 0.85905, 0.76235, 0.90467, 0.65874, 1, 0.38335, 1, 0.18579, 0.85403, 0.1274, 0.81089, 0.06024, 0.69208, 0, 0.58551, 0, 0.41021, 0.08528, 0.2069, 0.24243, 0.14504, 0.49998, 0.14208, 0.50322, 0.07433, 0.41738, 0, 0.57612, 0, 0.85058, 0.36085, 0.7343, 0.43206, 0.6848, 0.3127, 0.72163, 0.16717, 0.55931, 0.04152, 0.44762, 0.22893, 0.23925, 0.26559, 0.71271, 0.44034, 0.56992, 0.38299, 0.41677, 0.33509, 0.29298, 0.31496, 0.70801, 0.44501, 0.56676, 0.38975, 0.41519, 0.34415, 0.28753, 0.33017, 0.88988, 0.50176, 0.30388, 0.73461, 0.2646, 0.65674, 0.21413, 0.61583, 0.14611, 0.62193, 0.10315, 0.66636, 0.10356, 0.72556, 0.14505, 0.79163, 0.20262, 0.81354, 0.27871, 0.80158, 0.34946, 0.7376, 0.23072, 0.57072, 0.08878, 0.60706, 0.2946, 0.8129, 0.73005, 0.87883, 0.69804, 0.87348, 0.66165, 0.7968 ],
|
||||
"triangles": [ 16, 58, 15, 16, 59, 58, 59, 16, 60, 18, 57, 17, 57, 54, 17, 16, 17, 60, 17, 54, 60, 58, 14, 15, 58, 59, 14, 59, 60, 14, 60, 10, 14, 14, 10, 13, 18, 53, 57, 18, 52, 53, 19, 51, 18, 18, 51, 52, 13, 10, 12, 12, 10, 11, 53, 52, 45, 57, 45, 54, 57, 53, 45, 20, 50, 19, 46, 45, 52, 47, 46, 50, 50, 48, 47, 19, 50, 51, 46, 52, 51, 54, 41, 60, 10, 60, 9, 60, 41, 40, 46, 51, 50, 9, 60, 40, 55, 42, 41, 54, 55, 41, 46, 54, 45, 20, 49, 50, 50, 49, 48, 20, 56, 49, 20, 21, 56, 49, 56, 48, 47, 55, 46, 42, 55, 43, 55, 54, 46, 9, 40, 8, 47, 48, 55, 55, 48, 56, 55, 56, 22, 56, 21, 22, 55, 22, 43, 8, 44, 7, 40, 36, 8, 8, 36, 44, 7, 44, 6, 41, 37, 40, 40, 37, 36, 43, 22, 39, 22, 23, 35, 41, 42, 38, 43, 39, 42, 42, 39, 38, 38, 39, 34, 39, 22, 35, 39, 35, 34, 35, 24, 34, 35, 23, 24, 34, 24, 25, 36, 30, 44, 44, 30, 6, 30, 29, 6, 30, 36, 31, 36, 37, 31, 30, 31, 29, 37, 41, 38, 31, 37, 34, 31, 32, 29, 37, 38, 34, 34, 25, 31, 2, 32, 1, 31, 25, 32, 33, 32, 25, 33, 25, 26, 32, 0, 1, 32, 33, 0, 0, 33, 28, 26, 27, 33, 33, 27, 28, 6, 29, 5, 29, 2, 5, 2, 4, 5, 2, 29, 32, 2, 3, 4 ],
|
||||
"vertices": [ 1, 32, 41.97, -41.79, 1, 3, 30, 73.44999, 27.54, 0.18925, 32, -5.75, -51.7, 0.72417, 31, 112.98, -11.43, 0.08656, 3, 30, 38.22, 10.97, 0.84284, 32, -41, -35.22, 0.09705, 31, 92.72, -44.65999, 0.0601, 1, 30, 73.33999, 10.89, 1, 1, 30, 58.59, -10.38, 1, 2, 30, 14.35, -24.79, 0.89741, 29, 75.48, -4.55, 0.10256, 2, 30, -2.69, -18.55999, 0.58265, 29, 59.81, -13.72, 0.41734, 1, 28, 163.05, -108.68, 1, 1, 28, 151.52, -95.04, 1, 1, 28, 110.58999, -87.69, 1, 1, 28, 81.05, -86.58, 1, 1, 28, 89.8, -114.30999, 1, 1, 28, 68.72, -120.91, 1, 1, 28, 58.09, -115.87999, 1, 1, 28, 51.02, -100.62, 1, 1, 28, 38.77, -106.76, 1, 1, 28, 2.67, -89.69, 1, 1, 28, -22.05999, -19.29, 1, 1, 28, 1.19, 45.61, 1, 1, 28, 8.06, 64.8, 1, 1, 28, 35.43, 93.72, 1, 1, 28, 59.97, 119.66, 1, 1, 28, 109.25, 136.97, 1, 1, 28, 174.07, 135.27, 1, 2, 31, -16.79, 104.62, 0.16235, 28, 205.58, 101.22, 0.83762, 2, 32, 58.93, 30.5, 0.60734, 31, 38.36, 61.88, 0.39263, 2, 32, 75.55, 19, 0.94502, 31, 51.61, 77.15, 0.05496, 1, 32, 106.69, 26.88999, 1, 1, 32, 83.76999, -9.5, 1, 4, 30, 19.12, 19.31999, 0.58066, 32, -46.81, -15.18, 0.07453, 31, 72.16, -48.24, 0.14877, 29, 44.52, 27.22999, 0.196, 2, 31, 34.31, -45.24, 0.20795, 29, 7.42, 19.06999, 0.79202, 1, 31, 45.93, -9.06, 1, 1, 32, 20.62, -16.35, 1, 1, 32, 75.73, 0.93, 1, 3, 32, 44.58, 56.29, 0.14948, 31, 11.14999, 50.45, 0.36829, 28, 200.44, 40.47, 0.48219, 1, 28, 171.41, 90.11, 1, 2, 31, 28.19, -43.54, 0.20795, 29, 1.07, 18.93, 0.79202, 3, 31, 8.52999, -6.07, 0.75382, 29, -28.62, 49.02, 0.13132, 28, 168.13, -6.01, 0.11484, 2, 31, -15.06, 30.88999, 0.72898, 28, 167.82, 37.86, 0.27101, 1, 28, 162.36, 71.5, 1, 1, 28, 163.1, -47.43, 1, 1, 28, 165.94, -5.86, 1, 1, 28, 165.13, 37.36, 1, 1, 28, 157.6, 71.37999, 1, 1, 28, 163.5, -99.51999, 1, 1, 28, 45.36, 27.22999, 1, 1, 28, 63.72, 44.97, 1, 1, 28, 70.69, 61.90999, 1, 1, 28, 62.86, 78.69, 1, 1, 28, 46.52, 85.3, 1, 1, 28, 29.92, 79.33, 1, 1, 28, 15.06, 62.2, 1, 1, 28, 14.09, 45.31, 1, 1, 28, 24.29, 27.04, 1, 1, 28, 48.63, 15.27999, 1, 1, 28, 84.87, 62.13, 1, 1, 28, 61.9, 94.83, 1, 1, 28, 22.54, 21.87, 1, 1, 28, 43.13, -95.94, 1, 1, 28, 41.77, -87.23, 1, 1, 28, 60.04, -70.33999, 1 ],
|
||||
"hull": 29,
|
||||
"edges": [ 10, 8, 8, 6, 6, 4, 4, 2, 2, 0, 0, 56, 54, 56, 54, 52, 52, 50, 50, 48, 48, 46, 46, 44, 42, 44, 32, 34, 4, 58, 58, 60, 62, 64, 64, 66, 66, 54, 50, 68, 68, 70, 70, 44, 60, 72, 62, 74, 72, 74, 74, 76, 76, 78, 78, 44, 16, 80, 80, 82, 82, 84, 84, 86, 86, 44, 14, 88, 88, 72, 14, 16, 10, 12, 12, 14, 12, 60, 90, 92, 92, 94, 94, 96, 96, 98, 98, 100, 100, 102, 102, 104, 104, 106, 106, 90, 108, 110, 110, 112, 38, 40, 40, 42, 112, 40, 34, 36, 36, 38, 36, 114, 114, 108, 30, 32, 30, 28, 24, 26, 28, 26, 22, 24, 22, 20, 20, 18, 18, 16, 28, 116, 116, 118, 118, 120, 120, 20 ],
|
||||
"width": 271,
|
||||
"height": 298
|
||||
}
|
||||
},
|
||||
"head-bb": {
|
||||
"head": {
|
||||
"type": "boundingbox",
|
||||
"vertexCount": 6,
|
||||
"vertices": [ -19.13999, -70.3, 40.79999, -118.06999, 257.77, -115.61, 285.16, 57.18, 120.76999, 164.95, -5.05999, 76.94 ]
|
||||
}
|
||||
},
|
||||
"hoverboard_board": {
|
||||
"hoverboard_board": { "x": -11.6, "y": 25.63, "rotation": 0.17, "width": 492, "height": 152 }
|
||||
},
|
||||
"hoverboard_thruster_front": {
|
||||
"hoverboard_thruster": { "y": -7.07, "width": 60, "height": 64 }
|
||||
},
|
||||
"hoverboard_thruster_rear": {
|
||||
"hoverboard_thruster": { "x": 1.08, "y": -6.28, "width": 60, "height": 64 }
|
||||
},
|
||||
"hoverglow_front": {
|
||||
"hoverglow_small": { "x": 2.13, "y": -2, "scaleX": 0.303, "scaleY": 0.495, "rotation": 0.15, "width": 274, "height": 75 }
|
||||
},
|
||||
"hoverglow_rear": {
|
||||
"hoverglow_small": { "x": 1.38, "y": -2.08, "scaleX": 0.303, "scaleY": 0.495, "rotation": 0.6, "width": 274, "height": 75 }
|
||||
},
|
||||
"mouth": {
|
||||
"mouth_grind": {
|
||||
"type": "mesh",
|
||||
"uvs": [ 1, 1, 0, 1, 0, 0, 1, 0 ],
|
||||
"triangles": [ 1, 3, 0, 1, 2, 3 ],
|
||||
"vertices": [ 11.27, -85.87, -19.54999, 1.84, 36.09, 21.39999, 66.93, -66.3 ],
|
||||
"hull": 4,
|
||||
"edges": [ 0, 2, 2, 4, 4, 6, 0, 6 ],
|
||||
"width": 93,
|
||||
"height": 59
|
||||
},
|
||||
"mouth_oooo": { "x": 23.68, "y": -32.22, "rotation": -70.62, "width": 93, "height": 59 },
|
||||
"mouth_smile": { "x": 23.68, "y": -32.22, "rotation": -70.62, "width": 93, "height": 59 }
|
||||
},
|
||||
"muzzle": {
|
||||
"muzzle": { "x": 18.25, "y": 5.44, "rotation": 0.15, "width": 462, "height": 400 }
|
||||
},
|
||||
"neck": {
|
||||
"neck": { "x": 9.76, "y": -3, "rotation": -55.22, "width": 36, "height": 41 }
|
||||
},
|
||||
"rear_bracer": {
|
||||
"rear_bracer": { "x": 11.14, "y": -2.2, "rotation": 66.16, "width": 56, "height": 72 }
|
||||
},
|
||||
"rear_foot": {
|
||||
"rear_foot": {
|
||||
"type": "mesh",
|
||||
"uvs": [ 0.48368, 0.13869, 0.5199, 0.21423, 0.55098, 0.27906, 0.58837, 0.29815, 0.63488, 0.3219, 0.77341, 0.39265, 1, 0.73346, 1, 1, 0.59434, 1, 0.31159, 1, 0, 1, 0, 0.41396, 0.13629, 0, 0.41716, 0 ],
|
||||
"triangles": [ 4, 8, 3, 5, 8, 4, 6, 8, 5, 8, 6, 7, 11, 1, 10, 12, 13, 0, 0, 11, 12, 1, 11, 0, 2, 9, 10, 2, 10, 1, 9, 2, 3, 8, 9, 3 ],
|
||||
"vertices": [ 2, 7, 10.43999, 29.39999, 0.88823, 9, -6.73, 49.61, 0.11174, 2, 7, 16.54, 29.27, 0.83161, 9, -2.65, 45.08, 0.16834, 2, 7, 21.79, 29.13999, 0.78305, 9, 0.85, 41.18, 0.21694, 2, 7, 25.53, 31.43, 0.67843, 9, 5.07, 40.04, 0.32155, 2, 7, 30.17, 34.27, 0.5483, 9, 10.31999, 38.61, 0.45166, 2, 7, 44, 42.72, 0.16068, 9, 25.95999, 34.36, 0.83929, 1, 9, 51.56, 13.89, 1, 1, 9, 51.54, -2.07999, 1, 2, 7, 56.58, 2.98, 0.02958, 9, 5.71, -2.03999, 0.97039, 1, 7, 34.63, -20.20999, 0.99997, 1, 7, 10.43, -45.79, 0.99997, 1, 7, -15.1, -21.62999, 1, 1, 7, -22.54999, 6.61, 0.99997, 2, 7, -0.75, 29.67, 0.99219, 9, -14.25, 57.93, 0.00779 ],
|
||||
"hull": 14,
|
||||
"edges": [ 14, 12, 10, 12, 14, 16, 16, 18, 18, 20, 4, 18, 20, 22, 24, 26, 22, 24, 4, 2, 2, 20, 4, 6, 6, 16, 6, 8, 8, 10, 2, 0, 0, 26 ],
|
||||
"width": 113,
|
||||
"height": 60
|
||||
},
|
||||
"rear_foot_bend1": { "x": 29.61, "y": 18.12, "rotation": 46.59, "width": 117, "height": 66 },
|
||||
"rear_foot_bend2": { "x": 22.81, "y": 23.69, "rotation": 46.59, "width": 103, "height": 83 }
|
||||
},
|
||||
"rear_shin": {
|
||||
"rear_shin": { "x": 58.29, "y": -2.75, "rotation": 92.37, "width": 75, "height": 178 }
|
||||
},
|
||||
"rear_thigh": {
|
||||
"rear_thigh": { "x": 33.09, "y": -4.11, "rotation": 72.54, "width": 65, "height": 104 }
|
||||
},
|
||||
"rear_upper_arm": {
|
||||
"rear_upper_arm": { "x": 21.12, "y": 4.07, "rotation": 89.31, "width": 47, "height": 87 }
|
||||
},
|
||||
"torso": {
|
||||
"torso": {
|
||||
"type": "mesh",
|
||||
"uvs": [ 0.62509, 0.12671, 1, 0.26359, 1, 0.2887, 1, 0.66021, 1, 0.68244, 0.92322, 0.69257, 0.95115, 0.84965, 0.77122, 1, 0.49654, 1, 0.2718, 1, 0.13842, 0.77196, 0, 0.45614, 0, 0.19436, 0.14462, 0, 0.27801, 0, 0.72523, 0.27834, 0.7609, 0.46215, 0.84887, 0.67962, 0.68256, 0.63248, 0.53984, 0.38468, 0.25442, 0.32168, 0.30061, 0.55172, 0.39552, 0.79505, 0.26388, 0.17005, 0.52408, 0.18672 ],
|
||||
"triangles": [ 6, 17, 5, 6, 7, 17, 8, 18, 7, 7, 18, 17, 9, 22, 8, 8, 22, 18, 9, 10, 22, 10, 21, 22, 22, 21, 18, 10, 11, 21, 4, 5, 3, 5, 17, 3, 3, 17, 16, 17, 18, 16, 16, 2, 3, 21, 19, 18, 18, 19, 16, 11, 20, 21, 21, 20, 19, 19, 15, 16, 16, 15, 2, 11, 12, 20, 20, 24, 19, 19, 24, 15, 20, 23, 24, 20, 12, 23, 15, 1, 2, 24, 0, 15, 15, 0, 1, 12, 13, 23, 0, 24, 14, 14, 24, 13, 24, 23, 13 ],
|
||||
"vertices": [ 129.61, -10.38, 102.16, -45.06, 97.66, -44.7, 31, -39.45, 27.01, -39.13, 25.78, -31.47999, -2.59999, -31.97999, -28.2, -12.27999, -26.06999, 14.52999, -24.34, 36.5, 17.59, 46.29, 75.33, 55.34, 122.3, 51.63, 156.07, 34.75, 155.02998, 21.70999, 101.62999, -18.02, 68.37, -18.88999, 28.68, -24.39999, 38.40999, -8.81999, 83.98, 1.59, 97.5, 28.56999, 55.86, 27.31999, 11.47, 21.51, 124.62, 25.51, 119.62, 0.31 ],
|
||||
"hull": 15,
|
||||
"edges": [ 14, 12, 12, 10, 10, 8, 18, 20, 20, 22, 22, 24, 26, 28, 24, 26, 2, 4, 30, 4, 30, 32, 32, 34, 4, 6, 6, 8, 34, 6, 34, 36, 36, 38, 38, 40, 40, 24, 36, 14, 40, 42, 42, 44, 14, 16, 16, 18, 44, 16, 40, 46, 38, 48, 48, 30, 2, 0, 0, 28, 48, 0, 48, 26 ],
|
||||
"width": 98,
|
||||
"height": 180
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"events": {
|
||||
"footstep": {},
|
||||
"headAttach": { "int": 3, "float": 4 },
|
||||
"headBehind": { "int": 5, "float": 6, "string": "setup" },
|
||||
"headPop": { "int": 1, "float": 2 }
|
||||
},
|
||||
"animations": {
|
||||
"fly": {
|
||||
"slots": {
|
||||
"exhaust1": {
|
||||
"color": [
|
||||
{
|
||||
"time": 0,
|
||||
"color": "ffffff98",
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.3333,
|
||||
"color": "ffffffff",
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.5666,
|
||||
"color": "ffffffb0",
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{ "time": 1.3333, "color": "ffffff98" }
|
||||
]
|
||||
},
|
||||
"exhaust2": {
|
||||
"color": [
|
||||
{
|
||||
"time": 0,
|
||||
"color": "ffffff98",
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.3333,
|
||||
"color": "ffffffff",
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.5666,
|
||||
"color": "ffffffb0",
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{ "time": 1.3333, "color": "ffffff98" }
|
||||
]
|
||||
},
|
||||
"front_fist": {
|
||||
"attachment": [
|
||||
{ "time": 0, "name": "front_fist_open" }
|
||||
]
|
||||
},
|
||||
"hoverglow_front": {
|
||||
"color": [
|
||||
{ "time": 0, "color": "ffffff8d" },
|
||||
{ "time": 0.5, "color": "ffffffff" },
|
||||
{ "time": 1.3333, "color": "ffffff8d" }
|
||||
]
|
||||
},
|
||||
"hoverglow_rear": {
|
||||
"color": [
|
||||
{ "time": 0, "color": "ffffff8d" },
|
||||
{ "time": 0.5, "color": "ffffffff" },
|
||||
{ "time": 1.3333, "color": "ffffff8d" }
|
||||
]
|
||||
},
|
||||
"mouth": {
|
||||
"attachment": [
|
||||
{ "time": 0, "name": "mouth_grind" },
|
||||
{ "time": 1.3333, "name": "mouth_grind" }
|
||||
]
|
||||
}
|
||||
},
|
||||
"bones": {
|
||||
"hip": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{
|
||||
"time": 0,
|
||||
"x": 4.72,
|
||||
"y": -29.18,
|
||||
"curve": [ 0.155, 0.18, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.1,
|
||||
"x": 4.72,
|
||||
"y": -34.45,
|
||||
"curve": [ 0.191, -0.39, 0.719, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.4333,
|
||||
"x": 23.48,
|
||||
"y": 14.72,
|
||||
"curve": [ 0.311, 0.02, 0.795, 0.98 ]
|
||||
},
|
||||
{
|
||||
"time": 0.8333,
|
||||
"x": 71.9,
|
||||
"y": 28.45,
|
||||
"curve": [ 0.319, 0, 0.824, 0.84 ]
|
||||
},
|
||||
{ "time": 1.3333, "x": 4.72, "y": -29.18 }
|
||||
]
|
||||
},
|
||||
"torso": {
|
||||
"rotate": [
|
||||
{
|
||||
"time": 0,
|
||||
"angle": -5.34,
|
||||
"curve": [ 0.247, 0, 0.629, 0.52 ]
|
||||
},
|
||||
{
|
||||
"time": 0.3,
|
||||
"angle": -4.14,
|
||||
"curve": [ 0.221, 0.11, 0.747, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.6999,
|
||||
"angle": 22.54,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{ "time": 1.3333, "angle": -5.34 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"neck": {
|
||||
"rotate": [
|
||||
{
|
||||
"time": 0,
|
||||
"angle": 0.65,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.3,
|
||||
"angle": -1.58,
|
||||
"curve": [ 0.45, 0, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.6999,
|
||||
"angle": -12.82,
|
||||
"curve": [ 0.25, 0, 0.625, 0.5 ]
|
||||
},
|
||||
{
|
||||
"time": 1.0666,
|
||||
"angle": -6.71,
|
||||
"curve": [ 0.375, 0.5, 0.75, 1 ]
|
||||
},
|
||||
{ "time": 1.3333, "angle": 0.65 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"head": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 8.04 },
|
||||
{ "time": 0.3, "angle": -1.58 },
|
||||
{ "time": 0.6999, "angle": -12.82 },
|
||||
{ "time": 1.0666, "angle": 3.26 },
|
||||
{ "time": 1.3333, "angle": 8.04 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"hair1": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 6.48 },
|
||||
{ "time": 0.1333, "angle": 7.25 },
|
||||
{ "time": 0.2666, "angle": 3.81 },
|
||||
{ "time": 0.3666, "angle": 5.38 },
|
||||
{ "time": 0.4666, "angle": 4.42 },
|
||||
{ "time": 0.6333, "angle": 0.75 },
|
||||
{ "time": 0.8, "angle": 0.58 },
|
||||
{ "time": 0.8999, "angle": 3.76 },
|
||||
{ "time": 1.0666, "angle": 4.09 },
|
||||
{ "time": 1.2333, "angle": 7.48 },
|
||||
{ "time": 1.3333, "angle": 6.48 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"hair3": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 9.46 },
|
||||
{ "time": 0.1333, "angle": 10.24 },
|
||||
{ "time": 0.2666, "angle": 6.79 },
|
||||
{ "time": 0.3666, "angle": 8.36 },
|
||||
{ "time": 0.4666, "angle": 7.41 },
|
||||
{ "time": 0.6333, "angle": 3.73 },
|
||||
{ "time": 0.8, "angle": 3.56 },
|
||||
{ "time": 0.8999, "angle": 6.74 },
|
||||
{ "time": 1.0666, "angle": 7.07 },
|
||||
{ "time": 1.2333, "angle": 10.46 },
|
||||
{ "time": 1.3333, "angle": 9.46 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"hair2": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": -0.25 },
|
||||
{ "time": 0.1333, "angle": 6.78 },
|
||||
{ "time": 0.2666, "angle": 9.6 },
|
||||
{ "time": 0.3666, "angle": 15.86 },
|
||||
{ "time": 0.4666, "angle": 19.6 },
|
||||
{ "time": 0.6333, "angle": 3.35 },
|
||||
{ "time": 0.8, "angle": -9.4 },
|
||||
{ "time": 0.8999, "angle": -5.61 },
|
||||
{ "time": 1.0666, "angle": -4.26 },
|
||||
{ "time": 1.2333, "angle": 0.14 },
|
||||
{ "time": 1.3333, "angle": -0.25 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"hair4": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 6.9 },
|
||||
{ "time": 0.1333, "angle": 7.86 },
|
||||
{ "time": 0.2333, "angle": 5.54 },
|
||||
{ "time": 0.3666, "angle": 11.19 },
|
||||
{ "time": 0.5, "angle": 12.62 },
|
||||
{ "time": 0.6, "angle": 17.84 },
|
||||
{ "time": 0.6999, "angle": 20.53 },
|
||||
{ "time": 0.8666, "angle": 11.84 },
|
||||
{ "time": 1.0333, "angle": 6.65 },
|
||||
{ "time": 1.1333, "angle": 8.52 },
|
||||
{ "time": 1.2999, "angle": 6.66 },
|
||||
{ "time": 1.3333, "angle": 6.9 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 0.2333, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"front_fist": {
|
||||
"rotate": [
|
||||
{
|
||||
"time": 0,
|
||||
"angle": 24.72,
|
||||
"curve": [ 0.259, 0, 0.618, 0.44 ]
|
||||
},
|
||||
{
|
||||
"time": 0.4,
|
||||
"angle": 35.93,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.8333,
|
||||
"angle": 18.74,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 1.1666,
|
||||
"angle": 31.47,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{ "time": 1.3333, "angle": 24.72 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"hoverboard": {
|
||||
"rotate": [
|
||||
{
|
||||
"time": 0,
|
||||
"angle": 0,
|
||||
"curve": [ 0.257, 0, 0.618, 0.45 ]
|
||||
},
|
||||
{
|
||||
"time": 0.3333,
|
||||
"angle": 15.41,
|
||||
"curve": [ 0.195, 0.35, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.8333,
|
||||
"angle": -16.01,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{
|
||||
"time": 0,
|
||||
"x": 25.22,
|
||||
"y": 7.84,
|
||||
"curve": [ 0.553, 0.02, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.5,
|
||||
"x": 67.8,
|
||||
"y": 62.57,
|
||||
"curve": [ 0.246, 0, 0.737, 1 ]
|
||||
},
|
||||
{ "time": 1.3333, "x": 25.22, "y": 7.84 }
|
||||
]
|
||||
},
|
||||
"front_foot_ik": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": -22.24 },
|
||||
{ "time": 0.5, "angle": 9.33 },
|
||||
{ "time": 1.3333, "angle": -22.24 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"front_thigh": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"front_toe_ik": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"hoverboard_thruster_front": {
|
||||
"rotate": [
|
||||
{
|
||||
"time": 0,
|
||||
"angle": 0,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.3333,
|
||||
"angle": 26.79,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.8333,
|
||||
"angle": 41.42,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"hoverboard_thruster_rear": {
|
||||
"rotate": [
|
||||
{
|
||||
"time": 0,
|
||||
"angle": 0,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.3333,
|
||||
"angle": 26.79,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.8333,
|
||||
"angle": 41.42,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"rear_foot_ik": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"rear_thigh": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"rear_toe_ik": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"front_ankle_ik": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"front_shin": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"front_upper_arm": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": -6.56 },
|
||||
{
|
||||
"time": 0.6999,
|
||||
"angle": -45.47,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{ "time": 1.3333, "angle": -6.56 }
|
||||
],
|
||||
"translate": [
|
||||
{
|
||||
"time": 0,
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.4333,
|
||||
"x": 4.01,
|
||||
"y": 1.45,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"rear_ankle_ik": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"rear_shin": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"rear_upper_arm": {
|
||||
"rotate": [
|
||||
{
|
||||
"time": 0,
|
||||
"angle": 0,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.8,
|
||||
"angle": -22.48,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"front_bracer": {
|
||||
"rotate": [
|
||||
{
|
||||
"time": 0,
|
||||
"angle": 53,
|
||||
"curve": [ 0.259, 0, 0.618, 0.44 ]
|
||||
},
|
||||
{
|
||||
"time": 0.6999,
|
||||
"angle": 27.8,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 1,
|
||||
"angle": 56.88,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{ "time": 1.3333, "angle": 53 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"front_foot": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"rear_bracer": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 0 },
|
||||
{
|
||||
"time": 0.8,
|
||||
"angle": 16.99,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"rear_foot": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"back_foot_tip": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"front_foot_tip": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"gun": {
|
||||
"rotate": [
|
||||
{
|
||||
"time": 0,
|
||||
"angle": 20.28,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{
|
||||
"time": 0.8,
|
||||
"angle": 3.84,
|
||||
"curve": [ 0.25, 0, 0.75, 1 ]
|
||||
},
|
||||
{ "time": 1.3333, "angle": 20.28 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"gunTip": {
|
||||
"rotate": [
|
||||
{ "time": 0, "angle": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "angle": 0 }
|
||||
],
|
||||
"translate": [
|
||||
{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
|
||||
{ "time": 1.3333, "x": 0, "y": 0 }
|
||||
]
|
||||
},
|
||||
"hoverglow_front": {
|
||||
"scale": [
|
||||
{ "time": 0, "x": 1, "y": 1 },
|
||||
{ "time": 0.5, "x": 1, "y": 1.565 },
|
||||
{ "time": 1.3333, "x": 1, "y": 1 }
|
||||
]
|
||||
},
|
||||
"hoverglow_rear": {
|
||||
"scale": [
|
||||
{ "time": 0, "x": 1, "y": 1 },
|
||||
{ "time": 0.5, "x": 1, "y": 1.565 },
|
||||
{ "time": 1.3333, "x": 1, "y": 1 }
|
||||
]
|
||||
},
|
||||
"exhaust1": {
|
||||
"scale": [
|
||||
{ "time": 0, "x": 1, "y": 1 },
|
||||
{ "time": 0.3333, "x": 1.597, "y": 1 },
|
||||
{ "time": 0.5666, "x": 1.223, "y": 1 },
|
||||
{ "time": 1.3333, "x": 1, "y": 1 }
|
||||
]
|
||||
},
|
||||
"exhaust2": {
|
||||
"scale": [
|
||||
{ "time": 0, "x": 1, "y": 1 },
|
||||
{ "time": 0.3333, "x": 1.597, "y": 1 },
|
||||
{ "time": 0.5666, "x": 1.223, "y": 1 },
|
||||
{ "time": 1.3333, "x": 1, "y": 1 }
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 678 KiB |
Binary file not shown.
195
spine-ue4/Content/GettingStarted/Assets/Spineboy/spineboy.atlas
Normal file
195
spine-ue4/Content/GettingStarted/Assets/Spineboy/spineboy.atlas
Normal file
@ -0,0 +1,195 @@
|
||||
|
||||
spineboy.png
|
||||
size: 1022,1022
|
||||
format: RGBA8888
|
||||
filter: Linear,Linear
|
||||
repeat: none
|
||||
eye_indifferent
|
||||
rotate: false
|
||||
xy: 549, 694
|
||||
size: 93, 89
|
||||
orig: 93, 89
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
eye_surprised
|
||||
rotate: false
|
||||
xy: 834, 857
|
||||
size: 93, 89
|
||||
orig: 93, 89
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_bracer
|
||||
rotate: true
|
||||
xy: 375, 432
|
||||
size: 58, 80
|
||||
orig: 58, 80
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_fist_closed
|
||||
rotate: true
|
||||
xy: 466, 593
|
||||
size: 75, 82
|
||||
orig: 75, 82
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_fist_open
|
||||
rotate: false
|
||||
xy: 447, 504
|
||||
size: 86, 87
|
||||
orig: 86, 87
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_foot
|
||||
rotate: false
|
||||
xy: 549, 785
|
||||
size: 126, 69
|
||||
orig: 126, 69
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_foot_bend1
|
||||
rotate: true
|
||||
xy: 375, 492
|
||||
size: 128, 70
|
||||
orig: 128, 70
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_foot_bend2
|
||||
rotate: true
|
||||
xy: 275, 330
|
||||
size: 108, 93
|
||||
orig: 108, 93
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_shin
|
||||
rotate: false
|
||||
xy: 466, 670
|
||||
size: 81, 184
|
||||
orig: 82, 184
|
||||
offset: 1, 0
|
||||
index: -1
|
||||
front_thigh
|
||||
rotate: false
|
||||
xy: 214, 208
|
||||
size: 48, 112
|
||||
orig: 48, 112
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_upper_arm
|
||||
rotate: false
|
||||
xy: 214, 109
|
||||
size: 54, 97
|
||||
orig: 54, 97
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
goggles
|
||||
rotate: false
|
||||
xy: 466, 856
|
||||
size: 261, 166
|
||||
orig: 261, 166
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
gun
|
||||
rotate: false
|
||||
xy: 2, 117
|
||||
size: 210, 203
|
||||
orig: 210, 203
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
head
|
||||
rotate: false
|
||||
xy: 2, 322
|
||||
size: 271, 298
|
||||
orig: 271, 298
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
mouth_grind
|
||||
rotate: false
|
||||
xy: 929, 896
|
||||
size: 93, 59
|
||||
orig: 93, 59
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
mouth_oooo
|
||||
rotate: false
|
||||
xy: 929, 835
|
||||
size: 93, 59
|
||||
orig: 93, 59
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
mouth_smile
|
||||
rotate: true
|
||||
xy: 550, 599
|
||||
size: 93, 59
|
||||
orig: 93, 59
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
muzzle
|
||||
rotate: false
|
||||
xy: 2, 622
|
||||
size: 462, 400
|
||||
orig: 462, 400
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
neck
|
||||
rotate: false
|
||||
xy: 64, 6
|
||||
size: 35, 41
|
||||
orig: 36, 41
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
rear_bracer
|
||||
rotate: false
|
||||
xy: 677, 782
|
||||
size: 55, 72
|
||||
orig: 56, 72
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
rear_foot
|
||||
rotate: true
|
||||
xy: 2, 2
|
||||
size: 113, 60
|
||||
orig: 113, 60
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
rear_foot_bend1
|
||||
rotate: false
|
||||
xy: 64, 49
|
||||
size: 117, 66
|
||||
orig: 117, 66
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
rear_foot_bend2
|
||||
rotate: false
|
||||
xy: 729, 863
|
||||
size: 103, 83
|
||||
orig: 103, 83
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
rear_shin
|
||||
rotate: true
|
||||
xy: 729, 948
|
||||
size: 74, 178
|
||||
orig: 75, 178
|
||||
offset: 1, 0
|
||||
index: -1
|
||||
rear_thigh
|
||||
rotate: true
|
||||
xy: 909, 957
|
||||
size: 65, 103
|
||||
orig: 65, 104
|
||||
offset: 0, 1
|
||||
index: -1
|
||||
rear_upper_arm
|
||||
rotate: false
|
||||
xy: 370, 343
|
||||
size: 47, 87
|
||||
orig: 47, 87
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
torso
|
||||
rotate: false
|
||||
xy: 275, 440
|
||||
size: 98, 180
|
||||
orig: 98, 180
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
4562
spine-ue4/Content/GettingStarted/Assets/Spineboy/spineboy.json
Normal file
4562
spine-ue4/Content/GettingStarted/Assets/Spineboy/spineboy.json
Normal file
File diff suppressed because it is too large
Load Diff
BIN
spine-ue4/Content/GettingStarted/Assets/Spineboy/spineboy.png
Normal file
BIN
spine-ue4/Content/GettingStarted/Assets/Spineboy/spineboy.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 585 KiB |
BIN
spine-ue4/Content/GettingStarted/Assets/Spineboy/spineboy.uasset
Normal file
BIN
spine-ue4/Content/GettingStarted/Assets/Spineboy/spineboy.uasset
Normal file
Binary file not shown.
BIN
spine-ue4/Content/GettingStarted/Assets/Textures/Doi.uasset
Normal file
BIN
spine-ue4/Content/GettingStarted/Assets/Textures/Doi.uasset
Normal file
Binary file not shown.
BIN
spine-ue4/Content/GettingStarted/Assets/Textures/raptor.uasset
Normal file
BIN
spine-ue4/Content/GettingStarted/Assets/Textures/raptor.uasset
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
27
spine-ue4/LICENSE
Normal file
27
spine-ue4/LICENSE
Normal file
@ -0,0 +1,27 @@
|
||||
Spine Runtimes Software License v2.5
|
||||
|
||||
Copyright (c) 2013-2016, Esoteric Software
|
||||
All rights reserved.
|
||||
|
||||
You are granted a perpetual, non-exclusive, non-sublicensable, and
|
||||
non-transferable license to use, install, execute, and perform the Spine
|
||||
Runtimes software and derivative works solely for personal or internal
|
||||
use. Without the written permission of Esoteric Software (see Section 2 of
|
||||
the Spine Software License Agreement), you may not (a) modify, translate,
|
||||
adapt, or develop new applications using the Spine Runtimes or otherwise
|
||||
create derivative works or improvements of the Spine Runtimes or (b) remove,
|
||||
delete, alter, or obscure any trademarks or any copyright, trademark, patent,
|
||||
or other intellectual property or proprietary rights notices on or in the
|
||||
Software, including any copy thereof. Redistributions in binary or source
|
||||
form must include this license and terms.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF
|
||||
USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
spine-ue4/Plugins/SpinePlugin/Resources/Icon128.png
Normal file
BIN
spine-ue4/Plugins/SpinePlugin/Resources/Icon128.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
@ -0,0 +1,145 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes Software License v2.5
|
||||
*
|
||||
* Copyright (c) 2013-2016, Esoteric Software
|
||||
* All rights reserved.
|
||||
*
|
||||
* You are granted a perpetual, non-exclusive, non-sublicensable, and
|
||||
* non-transferable license to use, install, execute, and perform the Spine
|
||||
* Runtimes software and derivative works solely for personal or internal
|
||||
* use. Without the written permission of Esoteric Software (see Section 2 of
|
||||
* the Spine Software License Agreement), you may not (a) modify, translate,
|
||||
* adapt, or develop new applications using the Spine Runtimes or otherwise
|
||||
* create derivative works or improvements of the Spine Runtimes or (b) remove,
|
||||
* delete, alter, or obscure any trademarks or any copyright, trademark, patent,
|
||||
* or other intellectual property or proprietary rights notices on or in the
|
||||
* Software, including any copy thereof. Redistributions in binary or source
|
||||
* form must include this license and terms.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF
|
||||
* USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*****************************************************************************/
|
||||
|
||||
#include "SpineEditorPluginPrivatePCH.h"
|
||||
|
||||
#include "SpineAtlasAsset.h"
|
||||
#include "AssetRegistryModule.h"
|
||||
#include "AssetToolsModule.h"
|
||||
#include "PackageTools.h"
|
||||
#include "Developer/DesktopPlatform/Public/IDesktopPlatform.h"
|
||||
#include "Developer/DesktopPlatform/Public/DesktopPlatformModule.h"
|
||||
#include "spine/spine.h"
|
||||
#include <string>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define LOCTEXT_NAMESPACE "Spine"
|
||||
|
||||
USpineAtlasAssetFactory::USpineAtlasAssetFactory (const FObjectInitializer& objectInitializer): Super(objectInitializer) {
|
||||
bCreateNew = false;
|
||||
bEditAfterNew = true;
|
||||
bEditorImport = true;
|
||||
SupportedClass = USpineAtlasAsset::StaticClass();
|
||||
|
||||
Formats.Add(TEXT("atlas;Spine atlas file"));
|
||||
}
|
||||
|
||||
FText USpineAtlasAssetFactory::GetToolTip () const {
|
||||
return LOCTEXT("SpineAtlasAssetFactory", "Animations exported from Spine");
|
||||
}
|
||||
|
||||
bool USpineAtlasAssetFactory::FactoryCanImport (const FString& Filename) {
|
||||
return true;
|
||||
}
|
||||
|
||||
UObject* USpineAtlasAssetFactory::FactoryCreateFile (UClass * InClass, UObject * InParent, FName InName, EObjectFlags Flags, const FString & Filename, const TCHAR* Parms, FFeedbackContext * Warn, bool& bOutOperationCanceled) {
|
||||
FString rawString;
|
||||
if (!FFileHelper::LoadFileToString(rawString, *Filename)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
FString currentSourcePath, filenameNoExtension, unusedExtension;
|
||||
const FString longPackagePath = FPackageName::GetLongPackagePath(InParent->GetOutermost()->GetPathName());
|
||||
FPaths::Split(UFactory::GetCurrentFilename(), currentSourcePath, filenameNoExtension, unusedExtension);
|
||||
FString name(InName.ToString());
|
||||
name.Append("-atlas");
|
||||
|
||||
USpineAtlasAsset* asset = NewObject<USpineAtlasAsset>(InParent, InClass, FName(*name), Flags);
|
||||
asset->SetRawData(rawString);
|
||||
asset->SetAtlasFileName(FName(*Filename));
|
||||
LoadAtlas(asset, currentSourcePath, longPackagePath);
|
||||
return asset;
|
||||
}
|
||||
|
||||
bool USpineAtlasAssetFactory::CanReimport (UObject* Obj, TArray<FString>& OutFilenames) {
|
||||
USpineAtlasAsset* asset = Cast<USpineAtlasAsset>(Obj);
|
||||
if (!asset) return false;
|
||||
|
||||
FString filename = asset->GetAtlasFileName().ToString();
|
||||
if (!filename.IsEmpty())
|
||||
OutFilenames.Add(filename);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void USpineAtlasAssetFactory::SetReimportPaths (UObject* Obj, const TArray<FString>& NewReimportPaths) {
|
||||
USpineAtlasAsset* asset = Cast<USpineAtlasAsset>(Obj);
|
||||
|
||||
if (asset && ensure(NewReimportPaths.Num() == 1))
|
||||
asset->SetAtlasFileName(FName(*NewReimportPaths[0]));
|
||||
}
|
||||
|
||||
EReimportResult::Type USpineAtlasAssetFactory::Reimport (UObject* Obj) {
|
||||
USpineAtlasAsset* asset = Cast<USpineAtlasAsset>(Obj);
|
||||
FString rawString;
|
||||
if (!FFileHelper::LoadFileToString(rawString, *asset->GetAtlasFileName().ToString())) return EReimportResult::Failed;
|
||||
asset->SetRawData(rawString);
|
||||
|
||||
FString currentSourcePath, filenameNoExtension, unusedExtension;
|
||||
const FString longPackagePath = FPackageName::GetLongPackagePath(asset->GetOutermost()->GetPathName());
|
||||
FPaths::Split(UFactory::GetCurrentFilename(), currentSourcePath, filenameNoExtension, unusedExtension);
|
||||
|
||||
LoadAtlas(asset, currentSourcePath, longPackagePath);
|
||||
|
||||
if (Obj->GetOuter()) Obj->GetOuter()->MarkPackageDirty();
|
||||
else Obj->MarkPackageDirty();
|
||||
|
||||
return EReimportResult::Succeeded;
|
||||
}
|
||||
|
||||
UTexture2D* resolveTexture (USpineAtlasAsset* Asset, const FString& PageFileName, const FString& TargetSubPath) {
|
||||
FAssetToolsModule& AssetToolsModule = FModuleManager::GetModuleChecked<FAssetToolsModule>("AssetTools");
|
||||
|
||||
TArray<FString> fileNames;
|
||||
fileNames.Add(PageFileName);
|
||||
|
||||
TArray<UObject*> importedAsset = AssetToolsModule.Get().ImportAssets(fileNames, TargetSubPath);
|
||||
UTexture2D* texture = (importedAsset.Num() > 0) ? Cast<UTexture2D>(importedAsset[0]) : nullptr;
|
||||
|
||||
return texture;
|
||||
}
|
||||
|
||||
void USpineAtlasAssetFactory::LoadAtlas (USpineAtlasAsset* Asset, const FString& CurrentSourcePath, const FString& LongPackagePath) {
|
||||
spAtlas* atlas = Asset->GetAtlas(true);
|
||||
Asset->atlasPages.Empty();
|
||||
|
||||
const FString targetTexturePath = LongPackagePath / TEXT("Textures");
|
||||
|
||||
spAtlasPage* page = atlas->pages;
|
||||
while (page) {
|
||||
const FString sourceTextureFilename = FPaths::Combine(*CurrentSourcePath, UTF8_TO_TCHAR(page->name));
|
||||
UTexture2D* texture = resolveTexture(Asset, sourceTextureFilename, targetTexturePath);
|
||||
page = page->next;
|
||||
Asset->atlasPages.Add(texture);
|
||||
}
|
||||
}
|
||||
|
||||
#undef LOCTEXT_NAMESPACE
|
||||
@ -0,0 +1,49 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes Software License v2.5
|
||||
*
|
||||
* Copyright (c) 2013-2016, Esoteric Software
|
||||
* All rights reserved.
|
||||
*
|
||||
* You are granted a perpetual, non-exclusive, non-sublicensable, and
|
||||
* non-transferable license to use, install, execute, and perform the Spine
|
||||
* Runtimes software and derivative works solely for personal or internal
|
||||
* use. Without the written permission of Esoteric Software (see Section 2 of
|
||||
* the Spine Software License Agreement), you may not (a) modify, translate,
|
||||
* adapt, or develop new applications using the Spine Runtimes or otherwise
|
||||
* create derivative works or improvements of the Spine Runtimes or (b) remove,
|
||||
* delete, alter, or obscure any trademarks or any copyright, trademark, patent,
|
||||
* or other intellectual property or proprietary rights notices on or in the
|
||||
* Software, including any copy thereof. Redistributions in binary or source
|
||||
* form must include this license and terms.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF
|
||||
* USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*****************************************************************************/
|
||||
|
||||
#include "SpineEditorPluginPrivatePCH.h"
|
||||
#include "spine/spine.h"
|
||||
|
||||
|
||||
class FSpineEditorPlugin: public ISpineEditorPlugin {
|
||||
virtual void StartupModule() override;
|
||||
virtual void ShutdownModule() override;
|
||||
};
|
||||
|
||||
IMPLEMENT_MODULE(FSpineEditorPlugin, ISpineEditorPlugin)
|
||||
|
||||
|
||||
|
||||
void FSpineEditorPlugin::StartupModule () { }
|
||||
|
||||
void FSpineEditorPlugin::ShutdownModule () { }
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,34 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes Software License v2.5
|
||||
*
|
||||
* Copyright (c) 2013-2016, Esoteric Software
|
||||
* All rights reserved.
|
||||
*
|
||||
* You are granted a perpetual, non-exclusive, non-sublicensable, and
|
||||
* non-transferable license to use, install, execute, and perform the Spine
|
||||
* Runtimes software and derivative works solely for personal or internal
|
||||
* use. Without the written permission of Esoteric Software (see Section 2 of
|
||||
* the Spine Software License Agreement), you may not (a) modify, translate,
|
||||
* adapt, or develop new applications using the Spine Runtimes or otherwise
|
||||
* create derivative works or improvements of the Spine Runtimes or (b) remove,
|
||||
* delete, alter, or obscure any trademarks or any copyright, trademark, patent,
|
||||
* or other intellectual property or proprietary rights notices on or in the
|
||||
* Software, including any copy thereof. Redistributions in binary or source
|
||||
* form must include this license and terms.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF
|
||||
* USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*****************************************************************************/
|
||||
|
||||
#include "SpineEditorPlugin.h"
|
||||
#include "SpinePlugin.h"
|
||||
#include "SpineAtlasImportFactory.h"
|
||||
#include "SpineSkeletonImportFactory.h"
|
||||
@ -0,0 +1,121 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes Software License v2.5
|
||||
*
|
||||
* Copyright (c) 2013-2016, Esoteric Software
|
||||
* All rights reserved.
|
||||
*
|
||||
* You are granted a perpetual, non-exclusive, non-sublicensable, and
|
||||
* non-transferable license to use, install, execute, and perform the Spine
|
||||
* Runtimes software and derivative works solely for personal or internal
|
||||
* use. Without the written permission of Esoteric Software (see Section 2 of
|
||||
* the Spine Software License Agreement), you may not (a) modify, translate,
|
||||
* adapt, or develop new applications using the Spine Runtimes or otherwise
|
||||
* create derivative works or improvements of the Spine Runtimes or (b) remove,
|
||||
* delete, alter, or obscure any trademarks or any copyright, trademark, patent,
|
||||
* or other intellectual property or proprietary rights notices on or in the
|
||||
* Software, including any copy thereof. Redistributions in binary or source
|
||||
* form must include this license and terms.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF
|
||||
* USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*****************************************************************************/
|
||||
|
||||
#include "SpineEditorPluginPrivatePCH.h"
|
||||
|
||||
#include "SpineSkeletonDataAsset.h"
|
||||
#include "AssetRegistryModule.h"
|
||||
#include "AssetToolsModule.h"
|
||||
#include "PackageTools.h"
|
||||
#include "Developer/DesktopPlatform/Public/IDesktopPlatform.h"
|
||||
#include "Developer/DesktopPlatform/Public/DesktopPlatformModule.h"
|
||||
#include "spine/spine.h"
|
||||
#include <string>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define LOCTEXT_NAMESPACE "Spine"
|
||||
|
||||
USpineSkeletonAssetFactory::USpineSkeletonAssetFactory (const FObjectInitializer& objectInitializer): Super(objectInitializer) {
|
||||
bCreateNew = false;
|
||||
bEditAfterNew = true;
|
||||
bEditorImport = true;
|
||||
SupportedClass = USpineSkeletonDataAsset::StaticClass();
|
||||
|
||||
Formats.Add(TEXT("json;Spine skeleton file"));
|
||||
Formats.Add(TEXT("skel;Spine skeleton file"));
|
||||
}
|
||||
|
||||
FText USpineSkeletonAssetFactory::GetToolTip () const {
|
||||
return LOCTEXT("USpineSkeletonAssetFactory", "Animations exported from Spine");
|
||||
}
|
||||
|
||||
bool USpineSkeletonAssetFactory::FactoryCanImport (const FString& Filename) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void LoadAtlas (const FString& Filename, const FString& TargetPath) {
|
||||
FAssetToolsModule& AssetToolsModule = FModuleManager::GetModuleChecked<FAssetToolsModule>("AssetTools");
|
||||
|
||||
FString skelFile = Filename.Replace(TEXT(".skel"), TEXT(".atlas")).Replace(TEXT(".json"), TEXT(".atlas"));
|
||||
if (!FPaths::FileExists(skelFile)) return;
|
||||
|
||||
TArray<FString> fileNames;
|
||||
fileNames.Add(skelFile);
|
||||
AssetToolsModule.Get().ImportAssets(fileNames, TargetPath);
|
||||
}
|
||||
|
||||
UObject* USpineSkeletonAssetFactory::FactoryCreateFile (UClass * InClass, UObject * InParent, FName InName, EObjectFlags Flags, const FString & Filename, const TCHAR* Parms, FFeedbackContext * Warn, bool& bOutOperationCanceled) {
|
||||
FString name(InName.ToString());
|
||||
name.Append("-data");
|
||||
|
||||
USpineSkeletonDataAsset* asset = NewObject<USpineSkeletonDataAsset>(InParent, InClass, FName(*name), Flags);
|
||||
if (!FFileHelper::LoadFileToArray(asset->GetRawData(), *Filename, 0)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
asset->SetSkeletonDataFileName(FName(*Filename));
|
||||
const FString longPackagePath = FPackageName::GetLongPackagePath(asset->GetOutermost()->GetPathName());
|
||||
LoadAtlas(Filename, longPackagePath);
|
||||
return asset;
|
||||
}
|
||||
|
||||
bool USpineSkeletonAssetFactory::CanReimport (UObject* Obj, TArray<FString>& OutFilenames) {
|
||||
USpineSkeletonDataAsset* asset = Cast<USpineSkeletonDataAsset>(Obj);
|
||||
if (!asset) return false;
|
||||
|
||||
FString filename = asset->GetSkeletonDataFileName().ToString();
|
||||
if (!filename.IsEmpty())
|
||||
OutFilenames.Add(filename);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void USpineSkeletonAssetFactory::SetReimportPaths (UObject* Obj, const TArray<FString>& NewReimportPaths) {
|
||||
USpineSkeletonDataAsset* asset = Cast<USpineSkeletonDataAsset>(Obj);
|
||||
|
||||
if (asset && ensure(NewReimportPaths.Num() == 1))
|
||||
asset->SetSkeletonDataFileName(FName(*NewReimportPaths[0]));
|
||||
}
|
||||
|
||||
EReimportResult::Type USpineSkeletonAssetFactory::Reimport (UObject* Obj) {
|
||||
USpineSkeletonDataAsset* asset = Cast<USpineSkeletonDataAsset>(Obj);
|
||||
if (!FFileHelper::LoadFileToArray(asset->GetRawData(), *asset->GetSkeletonDataFileName().ToString(), 0)) return EReimportResult::Failed;
|
||||
|
||||
const FString longPackagePath = FPackageName::GetLongPackagePath(asset->GetOutermost()->GetPathName());
|
||||
LoadAtlas(*asset->GetSkeletonDataFileName().ToString(), longPackagePath);
|
||||
|
||||
if (Obj->GetOuter()) Obj->GetOuter()->MarkPackageDirty();
|
||||
else Obj->MarkPackageDirty();
|
||||
|
||||
return EReimportResult::Succeeded;
|
||||
}
|
||||
|
||||
#undef LOCTEXT_NAMESPACE
|
||||
@ -0,0 +1,51 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes Software License v2.5
|
||||
*
|
||||
* Copyright (c) 2013-2016, Esoteric Software
|
||||
* All rights reserved.
|
||||
*
|
||||
* You are granted a perpetual, non-exclusive, non-sublicensable, and
|
||||
* non-transferable license to use, install, execute, and perform the Spine
|
||||
* Runtimes software and derivative works solely for personal or internal
|
||||
* use. Without the written permission of Esoteric Software (see Section 2 of
|
||||
* the Spine Software License Agreement), you may not (a) modify, translate,
|
||||
* adapt, or develop new applications using the Spine Runtimes or otherwise
|
||||
* create derivative works or improvements of the Spine Runtimes or (b) remove,
|
||||
* delete, alter, or obscure any trademarks or any copyright, trademark, patent,
|
||||
* or other intellectual property or proprietary rights notices on or in the
|
||||
* Software, including any copy thereof. Redistributions in binary or source
|
||||
* form must include this license and terms.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF
|
||||
* USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*****************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "UnrealEd.h"
|
||||
#include "SpineAtlasAsset.h"
|
||||
#include "SpineAtlasImportFactory.generated.h"
|
||||
|
||||
UCLASS()
|
||||
class USpineAtlasAssetFactory: public UFactory, public FReimportHandler {
|
||||
GENERATED_UCLASS_BODY()
|
||||
|
||||
virtual FText GetToolTip() const override;
|
||||
|
||||
virtual bool FactoryCanImport(const FString& Filename) override;
|
||||
virtual UObject* FactoryCreateFile (UClass * InClass, UObject * InParent, FName InName, EObjectFlags Flags, const FString & Filename, const TCHAR* Parms, FFeedbackContext * Warn, bool& bOutOperationCanceled) override;
|
||||
|
||||
virtual bool CanReimport(UObject* Obj, TArray<FString>& OutFilenames) override;
|
||||
virtual void SetReimportPaths(UObject* Obj, const TArray<FString>& NewReimportPaths) override;
|
||||
virtual EReimportResult::Type Reimport(UObject* Obj) override;
|
||||
|
||||
void LoadAtlas(USpineAtlasAsset* Asset, const FString& CurrentSourcePath, const FString& LongPackagePath);
|
||||
};
|
||||
@ -0,0 +1,46 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes Software License v2.5
|
||||
*
|
||||
* Copyright (c) 2013-2016, Esoteric Software
|
||||
* All rights reserved.
|
||||
*
|
||||
* You are granted a perpetual, non-exclusive, non-sublicensable, and
|
||||
* non-transferable license to use, install, execute, and perform the Spine
|
||||
* Runtimes software and derivative works solely for personal or internal
|
||||
* use. Without the written permission of Esoteric Software (see Section 2 of
|
||||
* the Spine Software License Agreement), you may not (a) modify, translate,
|
||||
* adapt, or develop new applications using the Spine Runtimes or otherwise
|
||||
* create derivative works or improvements of the Spine Runtimes or (b) remove,
|
||||
* delete, alter, or obscure any trademarks or any copyright, trademark, patent,
|
||||
* or other intellectual property or proprietary rights notices on or in the
|
||||
* Software, including any copy thereof. Redistributions in binary or source
|
||||
* form must include this license and terms.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF
|
||||
* USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*****************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "ModuleManager.h"
|
||||
|
||||
class ISpineEditorPlugin : public IModuleInterface {
|
||||
|
||||
public:
|
||||
static inline ISpineEditorPlugin& Get() {
|
||||
return FModuleManager::LoadModuleChecked< ISpineEditorPlugin >( "SpineEditorPlugin" );
|
||||
}
|
||||
|
||||
static inline bool IsAvailable() {
|
||||
return FModuleManager::Get().IsModuleLoaded( "SpineEditorPlugin" );
|
||||
}
|
||||
};
|
||||
|
||||
@ -0,0 +1,48 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes Software License v2.5
|
||||
*
|
||||
* Copyright (c) 2013-2016, Esoteric Software
|
||||
* All rights reserved.
|
||||
*
|
||||
* You are granted a perpetual, non-exclusive, non-sublicensable, and
|
||||
* non-transferable license to use, install, execute, and perform the Spine
|
||||
* Runtimes software and derivative works solely for personal or internal
|
||||
* use. Without the written permission of Esoteric Software (see Section 2 of
|
||||
* the Spine Software License Agreement), you may not (a) modify, translate,
|
||||
* adapt, or develop new applications using the Spine Runtimes or otherwise
|
||||
* create derivative works or improvements of the Spine Runtimes or (b) remove,
|
||||
* delete, alter, or obscure any trademarks or any copyright, trademark, patent,
|
||||
* or other intellectual property or proprietary rights notices on or in the
|
||||
* Software, including any copy thereof. Redistributions in binary or source
|
||||
* form must include this license and terms.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF
|
||||
* USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*****************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "UnrealEd.h"
|
||||
#include "SpineAtlasAsset.h"
|
||||
#include "SpineSkeletonImportFactory.generated.h"
|
||||
|
||||
UCLASS()
|
||||
class USpineSkeletonAssetFactory : public UFactory, public FReimportHandler {
|
||||
GENERATED_UCLASS_BODY()
|
||||
|
||||
virtual FText GetToolTip () const override;
|
||||
virtual bool FactoryCanImport (const FString& Filename) override;
|
||||
virtual UObject* FactoryCreateFile (UClass * InClass, UObject * InParent, FName InName, EObjectFlags Flags, const FString & Filename, const TCHAR* Parms, FFeedbackContext * Warn, bool& bOutOperationCanceled) override;
|
||||
|
||||
virtual bool CanReimport (UObject* Obj, TArray<FString>& OutFilenames) override;
|
||||
virtual void SetReimportPaths (UObject* Obj, const TArray<FString>& NewReimportPaths) override;
|
||||
virtual EReimportResult::Type Reimport (UObject* Obj) override;
|
||||
};
|
||||
@ -0,0 +1,32 @@
|
||||
// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
|
||||
|
||||
namespace UnrealBuildTool.Rules
|
||||
{
|
||||
public class SpineEditorPlugin : ModuleRules
|
||||
{
|
||||
public SpineEditorPlugin(TargetInfo Target)
|
||||
{
|
||||
PublicIncludePaths.AddRange(new string[] { "SpineEditorPlugin/Public" });
|
||||
|
||||
PrivateIncludePaths.AddRange(new string[] { "SpineEditorPlugin/Private" });
|
||||
|
||||
PublicDependencyModuleNames.AddRange(new string[] {
|
||||
"Core",
|
||||
"CoreUObject",
|
||||
"Engine",
|
||||
"UnrealEd",
|
||||
"SpinePlugin"
|
||||
});
|
||||
|
||||
PublicIncludePathModuleNames.AddRange(new string[] {
|
||||
"AssetTools",
|
||||
"AssetRegistry"
|
||||
});
|
||||
|
||||
DynamicallyLoadedModuleNames.AddRange(new string[] {
|
||||
"AssetTools",
|
||||
"AssetRegistry"
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,116 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes Software License v2.5
|
||||
*
|
||||
* Copyright (c) 2013-2016, Esoteric Software
|
||||
* All rights reserved.
|
||||
*
|
||||
* You are granted a perpetual, non-exclusive, non-sublicensable, and
|
||||
* non-transferable license to use, install, execute, and perform the Spine
|
||||
* Runtimes software and derivative works solely for personal or internal
|
||||
* use. Without the written permission of Esoteric Software (see Section 2 of
|
||||
* the Spine Software License Agreement), you may not (a) modify, translate,
|
||||
* adapt, or develop new applications using the Spine Runtimes or otherwise
|
||||
* create derivative works or improvements of the Spine Runtimes or (b) remove,
|
||||
* delete, alter, or obscure any trademarks or any copyright, trademark, patent,
|
||||
* or other intellectual property or proprietary rights notices on or in the
|
||||
* Software, including any copy thereof. Redistributions in binary or source
|
||||
* form must include this license and terms.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF
|
||||
* USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*****************************************************************************/
|
||||
|
||||
#include "SpinePluginPrivatePCH.h"
|
||||
#include "spine/spine.h"
|
||||
#include <string.h>
|
||||
#include <string>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define LOCTEXT_NAMESPACE "Spine"
|
||||
|
||||
FString USpineAtlasAsset::GetRawData () const {
|
||||
return rawData;
|
||||
}
|
||||
|
||||
FName USpineAtlasAsset::GetAtlasFileName () const {
|
||||
#if WITH_EDITORONLY_DATA
|
||||
TArray<FString> files;
|
||||
if (importData) importData->ExtractFilenames(files);
|
||||
if (files.Num() > 0) return FName(*files[0]);
|
||||
else return atlasFileName;
|
||||
#else
|
||||
return atlasFileName;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if WITH_EDITORONLY_DATA
|
||||
|
||||
void USpineAtlasAsset::SetRawData (const FString &RawData) {
|
||||
this->rawData = RawData;
|
||||
}
|
||||
|
||||
void USpineAtlasAsset::SetAtlasFileName (const FName &AtlasFileName) {
|
||||
importData->UpdateFilenameOnly(AtlasFileName.ToString());
|
||||
TArray<FString> files;
|
||||
importData->ExtractFilenames(files);
|
||||
if (files.Num() > 0) atlasFileName = FName(*files[0]);
|
||||
}
|
||||
|
||||
void USpineAtlasAsset::PostInitProperties () {
|
||||
if (!HasAnyFlags(RF_ClassDefaultObject)) importData = NewObject<UAssetImportData>(this, TEXT("AssetImportData"));
|
||||
Super::PostInitProperties();
|
||||
}
|
||||
|
||||
void USpineAtlasAsset::GetAssetRegistryTags (TArray<FAssetRegistryTag>& OutTags) const {
|
||||
if (importData) {
|
||||
OutTags.Add(FAssetRegistryTag(SourceFileTagName(), importData->GetSourceData().ToJson(), FAssetRegistryTag::TT_Hidden) );
|
||||
}
|
||||
|
||||
Super::GetAssetRegistryTags(OutTags);
|
||||
}
|
||||
|
||||
void USpineAtlasAsset::Serialize (FArchive& Ar) {
|
||||
Super::Serialize(Ar);
|
||||
if (Ar.IsLoading() && Ar.UE4Ver() < VER_UE4_ASSET_IMPORT_DATA_AS_JSON && !importData)
|
||||
importData = NewObject<UAssetImportData>(this, TEXT("AssetImportData"));
|
||||
}
|
||||
|
||||
void USpineAtlasAsset::BeginDestroy () {
|
||||
if (atlas) {
|
||||
spAtlas_dispose(atlas);
|
||||
atlas = nullptr;
|
||||
}
|
||||
Super::BeginDestroy();
|
||||
}
|
||||
|
||||
spAtlas* USpineAtlasAsset::GetAtlas (bool ForceReload) {
|
||||
if (!atlas || ForceReload) {
|
||||
if (atlas) {
|
||||
spAtlas_dispose(atlas);
|
||||
atlas = nullptr;
|
||||
}
|
||||
std::string t = TCHAR_TO_UTF8(*rawData);
|
||||
atlas = spAtlas_create(t.c_str(), strlen(t.c_str()), "", nullptr);
|
||||
spAtlasPage* page = atlas->pages;
|
||||
int i = 0;
|
||||
while (page) {
|
||||
int num = atlasPages.Num();
|
||||
if (atlasPages.Num() > 0 && atlasPages.Num() > i)
|
||||
page->rendererObject = atlasPages[i++];
|
||||
page = page->next;
|
||||
}
|
||||
}
|
||||
return this->atlas;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#undef LOCTEXT_NAMESPACE
|
||||
@ -0,0 +1,64 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes Software License v2.5
|
||||
*
|
||||
* Copyright (c) 2013-2016, Esoteric Software
|
||||
* All rights reserved.
|
||||
*
|
||||
* You are granted a perpetual, non-exclusive, non-sublicensable, and
|
||||
* non-transferable license to use, install, execute, and perform the Spine
|
||||
* Runtimes software and derivative works solely for personal or internal
|
||||
* use. Without the written permission of Esoteric Software (see Section 2 of
|
||||
* the Spine Software License Agreement), you may not (a) modify, translate,
|
||||
* adapt, or develop new applications using the Spine Runtimes or otherwise
|
||||
* create derivative works or improvements of the Spine Runtimes or (b) remove,
|
||||
* delete, alter, or obscure any trademarks or any copyright, trademark, patent,
|
||||
* or other intellectual property or proprietary rights notices on or in the
|
||||
* Software, including any copy thereof. Redistributions in binary or source
|
||||
* form must include this license and terms.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF
|
||||
* USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*****************************************************************************/
|
||||
|
||||
#include "SpinePluginPrivatePCH.h"
|
||||
|
||||
USpineBoneDriverComponent::USpineBoneDriverComponent () {
|
||||
bWantsBeginPlay = true;
|
||||
PrimaryComponentTick.bCanEverTick = true;
|
||||
bTickInEditor = true;
|
||||
bAutoActivate = true;
|
||||
}
|
||||
|
||||
void USpineBoneDriverComponent::BeginPlay () {
|
||||
Super::BeginPlay();
|
||||
}
|
||||
|
||||
void USpineBoneDriverComponent::BeforeUpdateWorldTransform(USpineSkeletonComponent* skeleton) {
|
||||
AActor* owner = GetOwner();
|
||||
if (owner && skeleton == lastBoundComponent) {
|
||||
skeleton->SetBoneWorldPosition(BoneName, owner->GetActorLocation() );
|
||||
}
|
||||
}
|
||||
|
||||
void USpineBoneDriverComponent::TickComponent (float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) {
|
||||
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
|
||||
|
||||
if (Target) {
|
||||
USpineSkeletonComponent* skeleton = static_cast<USpineSkeletonComponent*>(Target->GetComponentByClass(USpineSkeletonComponent::StaticClass()));
|
||||
if (skeleton != lastBoundComponent) {
|
||||
// if (lastBoundComponent) lastBoundComponent->BeforeUpdateWorldTransform.RemoveAll(this);
|
||||
if (!skeleton->BeforeUpdateWorldTransform.GetAllObjects().Contains(this))
|
||||
skeleton->BeforeUpdateWorldTransform.AddDynamic(this, &USpineBoneDriverComponent::BeforeUpdateWorldTransform);
|
||||
lastBoundComponent = skeleton;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user