mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2025-12-20 17:26:01 +08:00
[c] More skin API changes, see #841.
This commit is contained in:
parent
d14b5dc22a
commit
225472de93
@ -41,7 +41,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct spPointAttachment {
|
typedef struct spPointAttachment {
|
||||||
spVertexAttachment super;
|
spAttachment super;
|
||||||
float x, y, rotation;
|
float x, y, rotation;
|
||||||
spColor color;
|
spColor color;
|
||||||
} spPointAttachment;
|
} spPointAttachment;
|
||||||
|
|||||||
@ -32,6 +32,10 @@
|
|||||||
|
|
||||||
#include <spine/dll.h>
|
#include <spine/dll.h>
|
||||||
#include <spine/Attachment.h>
|
#include <spine/Attachment.h>
|
||||||
|
#include <spine/IkConstraintData.h>
|
||||||
|
#include <spine/TransformConstraintData.h>
|
||||||
|
#include <spine/PathConstraintData.h>
|
||||||
|
#include <spine/Array.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -42,18 +46,33 @@ extern "C" {
|
|||||||
|
|
||||||
struct spSkeleton;
|
struct spSkeleton;
|
||||||
|
|
||||||
|
_SP_ARRAY_DECLARE_TYPE(spBoneDataArray, spBoneData*)
|
||||||
|
_SP_ARRAY_DECLARE_TYPE(spIkConstraintDataArray, spIkConstraintData*)
|
||||||
|
_SP_ARRAY_DECLARE_TYPE(spTransformConstraintDataArray, spTransformConstraintData*)
|
||||||
|
_SP_ARRAY_DECLARE_TYPE(spPathConstraintDataArray, spPathConstraintData*)
|
||||||
|
|
||||||
typedef struct spSkin {
|
typedef struct spSkin {
|
||||||
const char* const name;
|
const char* const name;
|
||||||
|
|
||||||
|
spBoneDataArray* bones;
|
||||||
|
spIkConstraintDataArray* ikConstraints;
|
||||||
|
spTransformConstraintDataArray* transformConstraints;
|
||||||
|
spPathConstraintDataArray* pathConstraints;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
spSkin() :
|
spSkin() :
|
||||||
name(0) {
|
name(0),
|
||||||
|
bones(0),
|
||||||
|
ikConstraints(0),
|
||||||
|
transformConstraints(0),
|
||||||
|
pathConstraints(0) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} spSkin;
|
} spSkin;
|
||||||
|
|
||||||
/* Private structs, needed by Skeleton */
|
/* Private structs, needed by Skeleton */
|
||||||
typedef struct _Entry _Entry;
|
typedef struct _Entry _Entry;
|
||||||
|
typedef struct _Entry spSkinEntry;
|
||||||
struct _Entry {
|
struct _Entry {
|
||||||
int slotIndex;
|
int slotIndex;
|
||||||
const char* name;
|
const char* name;
|
||||||
@ -64,7 +83,7 @@ struct _Entry {
|
|||||||
typedef struct _SkinHashTableEntry _SkinHashTableEntry;
|
typedef struct _SkinHashTableEntry _SkinHashTableEntry;
|
||||||
struct _SkinHashTableEntry {
|
struct _SkinHashTableEntry {
|
||||||
_Entry* entry;
|
_Entry* entry;
|
||||||
_SkinHashTableEntry* next; /* list for elements with same hashes */
|
_SkinHashTableEntry* next;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -87,6 +106,15 @@ SP_API const char* spSkin_getAttachmentName (const spSkin* self, int slotIndex,
|
|||||||
/** Attach each attachment in this skin if the corresponding attachment in oldSkin is currently attached. */
|
/** Attach each attachment in this skin if the corresponding attachment in oldSkin is currently attached. */
|
||||||
SP_API void spSkin_attachAll (const spSkin* self, struct spSkeleton* skeleton, const spSkin* oldspSkin);
|
SP_API void spSkin_attachAll (const spSkin* self, struct spSkeleton* skeleton, const spSkin* oldspSkin);
|
||||||
|
|
||||||
|
/** Adds all attachments, bones, and constraints from the specified skin to this skin. */
|
||||||
|
SP_API void spSkin_addSkin(spSkin* self, const spSkin* other);
|
||||||
|
|
||||||
|
/** Returns all attachments in this skin. */
|
||||||
|
SP_API spSkinEntry* spSkin_getAttachments(const spSkin* self);
|
||||||
|
|
||||||
|
/** Clears all attachments, bones, and constraints. */
|
||||||
|
SP_API void spSkin_clear(spSkin* self);
|
||||||
|
|
||||||
#ifdef SPINE_SHORT_NAMES
|
#ifdef SPINE_SHORT_NAMES
|
||||||
typedef spSkin Skin;
|
typedef spSkin Skin;
|
||||||
#define Skin_create(...) spSkin_create(__VA_ARGS__)
|
#define Skin_create(...) spSkin_create(__VA_ARGS__)
|
||||||
|
|||||||
@ -277,7 +277,7 @@ void _spAttachmentLoader_setUnknownTypeError (spAttachmentLoader* self, spAttach
|
|||||||
/**/
|
/**/
|
||||||
|
|
||||||
void _spAttachment_init (spAttachment* self, const char* name, spAttachmentType type,
|
void _spAttachment_init (spAttachment* self, const char* name, spAttachmentType type,
|
||||||
void (*dispose) (spAttachment* self));
|
void (*dispose) (spAttachment* self), spAttachment* (*copy) (spAttachment* self));
|
||||||
void _spAttachment_deinit (spAttachment* self);
|
void _spAttachment_deinit (spAttachment* self);
|
||||||
void _spVertexAttachment_init (spVertexAttachment* self);
|
void _spVertexAttachment_init (spVertexAttachment* self);
|
||||||
void _spVertexAttachment_deinit (spVertexAttachment* self);
|
void _spVertexAttachment_deinit (spVertexAttachment* self);
|
||||||
|
|||||||
@ -1004,7 +1004,7 @@ void _spTrackEntry_computeNotLast(spTrackEntry* entry, spAnimationState* state)
|
|||||||
spTimeline** timelines ;
|
spTimeline** timelines ;
|
||||||
int timelinesCount;
|
int timelinesCount;
|
||||||
int* timelineMode;
|
int* timelineMode;
|
||||||
int i, n;
|
int i;
|
||||||
|
|
||||||
timelines = entry->animation->timelines;
|
timelines = entry->animation->timelines;
|
||||||
timelinesCount = entry->animation->timelinesCount;
|
timelinesCount = entry->animation->timelinesCount;
|
||||||
|
|||||||
@ -81,7 +81,7 @@ spAttachment* _spAtlasAttachmentLoader_createAttachment (spAttachmentLoader* loa
|
|||||||
case SP_ATTACHMENT_PATH:
|
case SP_ATTACHMENT_PATH:
|
||||||
return SUPER(SUPER(spPathAttachment_create(name)));
|
return SUPER(SUPER(spPathAttachment_create(name)));
|
||||||
case SP_ATTACHMENT_POINT:
|
case SP_ATTACHMENT_POINT:
|
||||||
return SUPER(SUPER(spPointAttachment_create(name)));
|
return SUPER(spPointAttachment_create(name));
|
||||||
case SP_ATTACHMENT_CLIPPING:
|
case SP_ATTACHMENT_CLIPPING:
|
||||||
return SUPER(SUPER(spClippingAttachment_create(name)));
|
return SUPER(SUPER(spClippingAttachment_create(name)));
|
||||||
default:
|
default:
|
||||||
|
|||||||
@ -33,18 +33,18 @@
|
|||||||
|
|
||||||
typedef struct _spAttachmentVtable {
|
typedef struct _spAttachmentVtable {
|
||||||
void (*dispose) (spAttachment* self);
|
void (*dispose) (spAttachment* self);
|
||||||
|
spAttachment* (*copy) (spAttachment* self);
|
||||||
} _spAttachmentVtable;
|
} _spAttachmentVtable;
|
||||||
|
|
||||||
void _spAttachment_init (spAttachment* self, const char* name, spAttachmentType type, /**/
|
void _spAttachment_init (spAttachment* self, const char* name, spAttachmentType type, /**/
|
||||||
void (*dispose) (spAttachment* self)) {
|
void (*dispose) (spAttachment* self), spAttachment* (*copy) (spAttachment* self)) {
|
||||||
|
|
||||||
CONST_CAST(_spAttachmentVtable*, self->vtable) = NEW(_spAttachmentVtable);
|
CONST_CAST(_spAttachmentVtable*, self->vtable) = NEW(_spAttachmentVtable);
|
||||||
VTABLE(spAttachment, self) ->dispose = dispose;
|
VTABLE(spAttachment, self)->dispose = dispose;
|
||||||
|
VTABLE(spAttachment, self)->copy = copy;
|
||||||
|
|
||||||
MALLOC_STR(self->name, name);
|
MALLOC_STR(self->name, name);
|
||||||
CONST_CAST(spAttachmentType, self->type) = type;
|
CONST_CAST(spAttachmentType, self->type) = type;
|
||||||
|
|
||||||
self->refCount++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _spAttachment_deinit (spAttachment* self) {
|
void _spAttachment_deinit (spAttachment* self) {
|
||||||
@ -53,8 +53,12 @@ void _spAttachment_deinit (spAttachment* self) {
|
|||||||
FREE(self->name);
|
FREE(self->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spAttachment* spAttachment_copy (spAttachment* self) {
|
||||||
|
return VTABLE(spAttachment, self) ->copy(self);
|
||||||
|
}
|
||||||
|
|
||||||
void spAttachment_dispose (spAttachment* self) {
|
void spAttachment_dispose (spAttachment* self) {
|
||||||
self->refCount--;
|
self->refCount--;
|
||||||
if (self->refCount == 0)
|
if (self->refCount <= 0)
|
||||||
VTABLE(spAttachment, self) ->dispose(self);
|
VTABLE(spAttachment, self) ->dispose(self);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -38,9 +38,13 @@ void _spBoundingBoxAttachment_dispose (spAttachment* attachment) {
|
|||||||
FREE(self);
|
FREE(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spAttachment* _spBoundingBoxAttachment_copy (spAttachment* attachment) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
spBoundingBoxAttachment* spBoundingBoxAttachment_create (const char* name) {
|
spBoundingBoxAttachment* spBoundingBoxAttachment_create (const char* name) {
|
||||||
spBoundingBoxAttachment* self = NEW(spBoundingBoxAttachment);
|
spBoundingBoxAttachment* self = NEW(spBoundingBoxAttachment);
|
||||||
_spVertexAttachment_init(SUPER(self));
|
_spVertexAttachment_init(SUPER(self));
|
||||||
_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_BOUNDING_BOX, _spBoundingBoxAttachment_dispose);
|
_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_BOUNDING_BOX, _spBoundingBoxAttachment_dispose, _spBoundingBoxAttachment_copy);
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -38,10 +38,14 @@ void _spClippingAttachment_dispose (spAttachment* attachment) {
|
|||||||
FREE(self);
|
FREE(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spAttachment* _spClippingAttachment_copy (spAttachment* attachment) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
spClippingAttachment* spClippingAttachment_create (const char* name) {
|
spClippingAttachment* spClippingAttachment_create (const char* name) {
|
||||||
spClippingAttachment* self = NEW(spClippingAttachment);
|
spClippingAttachment* self = NEW(spClippingAttachment);
|
||||||
_spVertexAttachment_init(SUPER(self));
|
_spVertexAttachment_init(SUPER(self));
|
||||||
_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_CLIPPING, _spClippingAttachment_dispose);
|
_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_CLIPPING, _spClippingAttachment_dispose, _spClippingAttachment_copy);
|
||||||
self->endSlot = 0;
|
self->endSlot = 0;
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -44,19 +44,24 @@ void _spMeshAttachment_dispose (spAttachment* attachment) {
|
|||||||
FREE(self);
|
FREE(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spAttachment* _spMeshAttachment_copy (spAttachment* attachment) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
spMeshAttachment* spMeshAttachment_create (const char* name) {
|
spMeshAttachment* spMeshAttachment_create (const char* name) {
|
||||||
spMeshAttachment* self = NEW(spMeshAttachment);
|
spMeshAttachment* self = NEW(spMeshAttachment);
|
||||||
_spVertexAttachment_init(SUPER(self));
|
_spVertexAttachment_init(SUPER(self));
|
||||||
spColor_setFromFloats(&self->color, 1, 1, 1, 1);
|
spColor_setFromFloats(&self->color, 1, 1, 1, 1);
|
||||||
_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_MESH, _spMeshAttachment_dispose);
|
_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_MESH, _spMeshAttachment_dispose, _spMeshAttachment_copy);
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
void spMeshAttachment_updateUVs (spMeshAttachment* self) {
|
void spMeshAttachment_updateUVs (spMeshAttachment* self) {
|
||||||
int i, n;
|
int i, n;
|
||||||
|
float* uvs;
|
||||||
int verticesLength = SUPER(self)->worldVerticesLength;
|
int verticesLength = SUPER(self)->worldVerticesLength;
|
||||||
FREE(self->uvs);
|
FREE(self->uvs);
|
||||||
float* uvs = self->uvs = MALLOC(float, verticesLength);
|
uvs = self->uvs = MALLOC(float, verticesLength);
|
||||||
n = verticesLength;
|
n = verticesLength;
|
||||||
float u = self->regionU, v = self->regionV;
|
float u = self->regionU, v = self->regionV;
|
||||||
float width = 0, height = 0;
|
float width = 0, height = 0;
|
||||||
|
|||||||
@ -39,9 +39,13 @@ void _spPathAttachment_dispose (spAttachment* attachment) {
|
|||||||
FREE(self);
|
FREE(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spAttachment* _spPathAttachment_copy (spAttachment* attachment) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
spPathAttachment* spPathAttachment_create (const char* name) {
|
spPathAttachment* spPathAttachment_create (const char* name) {
|
||||||
spPathAttachment* self = NEW(spPathAttachment);
|
spPathAttachment* self = NEW(spPathAttachment);
|
||||||
_spVertexAttachment_init(SUPER(self));
|
_spVertexAttachment_init(SUPER(self));
|
||||||
_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_PATH, _spPathAttachment_dispose);
|
_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_PATH, _spPathAttachment_dispose, _spPathAttachment_copy);
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -31,17 +31,24 @@
|
|||||||
#include <spine/extension.h>
|
#include <spine/extension.h>
|
||||||
|
|
||||||
void _spPointAttachment_dispose (spAttachment* attachment) {
|
void _spPointAttachment_dispose (spAttachment* attachment) {
|
||||||
spPathAttachment* self = SUB_CAST(spPathAttachment, attachment);
|
spPointAttachment* self = SUB_CAST(spPointAttachment, attachment);
|
||||||
|
_spAttachment_deinit(attachment);
|
||||||
_spVertexAttachment_deinit(SUPER(self));
|
|
||||||
|
|
||||||
FREE(self);
|
FREE(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spAttachment* _spPointAttachment_copy (spAttachment* attachment) {
|
||||||
|
spPointAttachment* self = SUB_CAST(spPointAttachment, attachment);
|
||||||
|
spPointAttachment* copy = spPointAttachment_create(attachment->name);
|
||||||
|
copy->x = self->x;
|
||||||
|
copy->y = self->y;
|
||||||
|
copy->rotation = self->rotation;
|
||||||
|
spColor_setFromColor(©->color, &self->color);
|
||||||
|
return SUPER(copy);
|
||||||
|
}
|
||||||
|
|
||||||
spPointAttachment* spPointAttachment_create (const char* name) {
|
spPointAttachment* spPointAttachment_create (const char* name) {
|
||||||
spPointAttachment* self = NEW(spPointAttachment);
|
spPointAttachment* self = NEW(spPointAttachment);
|
||||||
_spVertexAttachment_init(SUPER(self));
|
_spAttachment_init(SUPER(self), name, SP_ATTACHMENT_POINT, _spPointAttachment_dispose, _spPointAttachment_copy);
|
||||||
_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_POINT, _spPointAttachment_dispose);
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -41,12 +41,36 @@ void _spRegionAttachment_dispose (spAttachment* attachment) {
|
|||||||
FREE(self);
|
FREE(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spAttachment* _spRegionAttachment_copy (spAttachment* attachment) {
|
||||||
|
spRegionAttachment* self = SUB_CAST(spRegionAttachment, attachment);
|
||||||
|
spRegionAttachment* copy = spRegionAttachment_create(attachment->name);
|
||||||
|
copy->regionWidth = self->regionWidth;
|
||||||
|
copy->regionHeight = self->regionHeight;
|
||||||
|
copy->regionOffsetX = self->regionOffsetX;
|
||||||
|
copy->regionOffsetY = self->regionOffsetY;
|
||||||
|
copy->regionOriginalWidth = self->regionOriginalWidth;
|
||||||
|
copy->regionOriginalHeight = self->regionOriginalHeight;
|
||||||
|
copy->rendererObject = self->rendererObject;
|
||||||
|
MALLOC_STR(copy->path, self->path);
|
||||||
|
copy->x = self->x;
|
||||||
|
copy->y = self->y;
|
||||||
|
copy->scaleX = self->scaleX;
|
||||||
|
copy->scaleY = self->scaleY;
|
||||||
|
copy->rotation = self->rotation;
|
||||||
|
copy->width = self->width;
|
||||||
|
copy->height = self->height;
|
||||||
|
memcpy(copy->uvs, self->uvs, sizeof(float) * 8);
|
||||||
|
memcpy(copy->offset, self->offset, sizeof(float) * 8);
|
||||||
|
spColor_setFromColor(©->color, &self->color);
|
||||||
|
return SUPER(copy);
|
||||||
|
}
|
||||||
|
|
||||||
spRegionAttachment* spRegionAttachment_create (const char* name) {
|
spRegionAttachment* spRegionAttachment_create (const char* name) {
|
||||||
spRegionAttachment* self = NEW(spRegionAttachment);
|
spRegionAttachment* self = NEW(spRegionAttachment);
|
||||||
self->scaleX = 1;
|
self->scaleX = 1;
|
||||||
self->scaleY = 1;
|
self->scaleY = 1;
|
||||||
spColor_setFromFloats(&self->color, 1, 1, 1, 1);
|
spColor_setFromFloats(&self->color, 1, 1, 1, 1);
|
||||||
_spAttachment_init(SUPER(self), name, SP_ATTACHMENT_REGION, _spRegionAttachment_dispose);
|
_spAttachment_init(SUPER(self), name, SP_ATTACHMENT_REGION, _spRegionAttachment_dispose, _spRegionAttachment_copy);
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -30,6 +30,11 @@
|
|||||||
#include <spine/Skin.h>
|
#include <spine/Skin.h>
|
||||||
#include <spine/extension.h>
|
#include <spine/extension.h>
|
||||||
|
|
||||||
|
_SP_ARRAY_IMPLEMENT_TYPE(spBoneDataArray, spBoneData*)
|
||||||
|
_SP_ARRAY_IMPLEMENT_TYPE(spIkConstraintDataArray, spIkConstraintData*)
|
||||||
|
_SP_ARRAY_IMPLEMENT_TYPE(spTransformConstraintDataArray, spTransformConstraintData*)
|
||||||
|
_SP_ARRAY_IMPLEMENT_TYPE(spPathConstraintDataArray, spPathConstraintData*)
|
||||||
|
|
||||||
_Entry* _Entry_create (int slotIndex, const char* name, spAttachment* attachment) {
|
_Entry* _Entry_create (int slotIndex, const char* name, spAttachment* attachment) {
|
||||||
_Entry* self = NEW(_Entry);
|
_Entry* self = NEW(_Entry);
|
||||||
self->slotIndex = slotIndex;
|
self->slotIndex = slotIndex;
|
||||||
@ -59,6 +64,10 @@ static void _SkinHashTableEntry_dispose (_SkinHashTableEntry* self) {
|
|||||||
spSkin* spSkin_create (const char* name) {
|
spSkin* spSkin_create (const char* name) {
|
||||||
spSkin* self = SUPER(NEW(_spSkin));
|
spSkin* self = SUPER(NEW(_spSkin));
|
||||||
MALLOC_STR(self->name, name);
|
MALLOC_STR(self->name, name);
|
||||||
|
self->bones = spBoneDataArray_create(4);
|
||||||
|
self->ikConstraints = spIkConstraintDataArray_create(4);
|
||||||
|
self->transformConstraints = spTransformConstraintDataArray_create(4);
|
||||||
|
self->pathConstraints = spPathConstraintDataArray_create(4);
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,22 +95,43 @@ void spSkin_dispose (spSkin* self) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spBoneDataArray_dispose(self->bones);
|
||||||
|
spIkConstraintDataArray_dispose(self->ikConstraints);
|
||||||
|
spTransformConstraintDataArray_dispose(self->transformConstraints);
|
||||||
|
spPathConstraintDataArray_dispose(self->pathConstraints);
|
||||||
FREE(self->name);
|
FREE(self->name);
|
||||||
FREE(self);
|
FREE(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spSkin_setAttachment (spSkin* self, int slotIndex, const char* name, spAttachment* attachment) {
|
void spSkin_setAttachment (spSkin* self, int slotIndex, const char* name, spAttachment* attachment) {
|
||||||
|
_SkinHashTableEntry* existingEntry = 0;
|
||||||
|
const _SkinHashTableEntry* hashEntry = SUB_CAST(_spSkin, self)->entriesHashTable[(unsigned int)slotIndex % SKIN_ENTRIES_HASH_TABLE_SIZE];
|
||||||
|
while (hashEntry) {
|
||||||
|
if (hashEntry->entry->slotIndex == slotIndex && strcmp(hashEntry->entry->name, name) == 0) {
|
||||||
|
existingEntry = hashEntry;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
hashEntry = hashEntry->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attachment) attachment->refCount++;
|
||||||
|
|
||||||
|
if (existingEntry) {
|
||||||
|
if (hashEntry->entry->attachment) spAttachment_dispose(hashEntry->entry->attachment);
|
||||||
|
hashEntry->entry->attachment = attachment;
|
||||||
|
} else {
|
||||||
_Entry* newEntry = _Entry_create(slotIndex, name, attachment);
|
_Entry* newEntry = _Entry_create(slotIndex, name, attachment);
|
||||||
newEntry->next = SUB_CAST(_spSkin, self)->entries;
|
newEntry->next = SUB_CAST(_spSkin, self)->entries;
|
||||||
SUB_CAST(_spSkin, self)->entries = newEntry;
|
SUB_CAST(_spSkin, self)->entries = newEntry;
|
||||||
|
|
||||||
{
|
{
|
||||||
unsigned int hashTableIndex = (unsigned int)slotIndex % SKIN_ENTRIES_HASH_TABLE_SIZE;
|
unsigned int hashTableIndex = (unsigned int)slotIndex % SKIN_ENTRIES_HASH_TABLE_SIZE;
|
||||||
|
_SkinHashTableEntry** hashTable = SUB_CAST(_spSkin, self)->entriesHashTable;
|
||||||
|
|
||||||
_SkinHashTableEntry* newHashEntry = _SkinHashTableEntry_create(newEntry);
|
_SkinHashTableEntry* newHashEntry = _SkinHashTableEntry_create(newEntry);
|
||||||
newHashEntry->next = SUB_CAST(_spSkin, self)->entriesHashTable[hashTableIndex];
|
newHashEntry->next = hashTable[hashTableIndex];
|
||||||
SUB_CAST(_spSkin, self)->entriesHashTable[hashTableIndex] = newHashEntry;
|
SUB_CAST(_spSkin, self)->entriesHashTable[hashTableIndex] = newHashEntry;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
spAttachment* spSkin_getAttachment (const spSkin* self, int slotIndex, const char* name) {
|
spAttachment* spSkin_getAttachment (const spSkin* self, int slotIndex, const char* name) {
|
||||||
@ -137,3 +167,71 @@ void spSkin_attachAll (const spSkin* self, spSkeleton* skeleton, const spSkin* o
|
|||||||
entry = entry->next;
|
entry = entry->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void spSkin_addSkin(spSkin* self, const spSkin* other) {
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < other->bones->size; i++) {
|
||||||
|
if (!spBoneDataArray_contains(self->bones, other->bones->items[i]))
|
||||||
|
spBoneDataArray_add(self->bones, other->bones->items[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < other->ikConstraints->size; i++) {
|
||||||
|
if (!spIkConstraintDataArray_contains(self->ikConstraints, other->ikConstraints->items[i]))
|
||||||
|
spIkConstraintDataArray_add(self->ikConstraints, other->ikConstraints->items[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < other->transformConstraints->size; i++) {
|
||||||
|
if (!spTransformConstraintDataArray_contains(self->transformConstraints, other->transformConstraints->items[i]))
|
||||||
|
spTransformConstraintDataArray_add(self->transformConstraints, other->transformConstraints->items[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < other->pathConstraints->size; i++) {
|
||||||
|
if (!spPathConstraintDataArray_contains(self->pathConstraints, other->pathConstraints->items[i]))
|
||||||
|
spPathConstraintDataArray_add(self->pathConstraints, other->pathConstraints->items[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
spSkinEntry* entry = spSkin_getAttachments(other);
|
||||||
|
while (entry) {
|
||||||
|
spSkin_setAttachment(self, entry->slotIndex, entry->name, entry->attachment);
|
||||||
|
entry = entry->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spSkinEntry* spSkin_getAttachments(const spSkin* self) {
|
||||||
|
return SUB_CAST(_spSkin, self)->entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
void spSkin_clear(spSkin* self) {
|
||||||
|
_Entry* entry = SUB_CAST(_spSkin, self)->entries;
|
||||||
|
|
||||||
|
while (entry) {
|
||||||
|
_Entry* nextEntry = entry->next;
|
||||||
|
_Entry_dispose(entry);
|
||||||
|
entry = nextEntry;
|
||||||
|
}
|
||||||
|
|
||||||
|
SUB_CAST(_spSkin, self)->entries = 0;
|
||||||
|
|
||||||
|
{
|
||||||
|
_SkinHashTableEntry** currentHashtableEntry = SUB_CAST(_spSkin, self)->entriesHashTable;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < SKIN_ENTRIES_HASH_TABLE_SIZE; ++i, ++currentHashtableEntry) {
|
||||||
|
_SkinHashTableEntry* hashtableEntry = *currentHashtableEntry;
|
||||||
|
|
||||||
|
while (hashtableEntry) {
|
||||||
|
_SkinHashTableEntry* nextEntry = hashtableEntry->next;
|
||||||
|
_SkinHashTableEntry_dispose(hashtableEntry);
|
||||||
|
hashtableEntry = nextEntry;
|
||||||
|
}
|
||||||
|
|
||||||
|
SUB_CAST(_spSkin, self)->entriesHashTable[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spBoneDataArray_clear(self->bones);
|
||||||
|
spIkConstraintDataArray_clear(self->ikConstraints);
|
||||||
|
spTransformConstraintDataArray_clear(self->transformConstraints);
|
||||||
|
spPathConstraintDataArray_clear(self->pathConstraints);
|
||||||
|
}
|
||||||
|
|||||||
@ -446,7 +446,48 @@ void test (SkeletonData* skeletonData, Atlas* atlas) {
|
|||||||
Skeleton_dispose(skeleton);
|
Skeleton_dispose(skeleton);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void testSkinsApi(SkeletonData* skeletonData, Atlas* atlas) {
|
||||||
|
SkeletonDrawable* drawable = new SkeletonDrawable(skeletonData);
|
||||||
|
drawable->timeScale = 1;
|
||||||
|
drawable->setUsePremultipliedAlpha(true);
|
||||||
|
|
||||||
|
Skeleton* skeleton = drawable->skeleton;
|
||||||
|
|
||||||
|
spSkin* skin = spSkin_create("test-skin");
|
||||||
|
spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "goblingirl"));
|
||||||
|
spSkeleton_setSkin(skeleton, skin);
|
||||||
|
spSkeleton_setSlotsToSetupPose(skeleton);
|
||||||
|
|
||||||
|
skeleton->x = 320;
|
||||||
|
skeleton->y = 590;
|
||||||
|
Skeleton_updateWorldTransform(skeleton);
|
||||||
|
|
||||||
|
AnimationState_setAnimationByName(drawable->state, 0, "walk", true);
|
||||||
|
|
||||||
|
sf::RenderWindow window(sf::VideoMode(640, 640), "Spine SFML - skins api");
|
||||||
|
window.setFramerateLimit(60);
|
||||||
|
sf::Event event;
|
||||||
|
sf::Clock deltaClock;
|
||||||
|
while (window.isOpen()) {
|
||||||
|
while (window.pollEvent(event))
|
||||||
|
if (event.type == sf::Event::Closed) window.close();
|
||||||
|
|
||||||
|
float delta = deltaClock.getElapsedTime().asSeconds();
|
||||||
|
deltaClock.restart();
|
||||||
|
|
||||||
|
drawable->update(delta);
|
||||||
|
|
||||||
|
window.clear();
|
||||||
|
window.draw(*drawable);
|
||||||
|
window.display();
|
||||||
|
}
|
||||||
|
|
||||||
|
spSkin_clear(skin);
|
||||||
|
spSkin_dispose(skin);
|
||||||
|
}
|
||||||
|
|
||||||
int main () {
|
int main () {
|
||||||
|
testcase(testSkinsApi, "data/goblins-pro.json", "data/goblins-pro.skel", "data/goblins-pma.atlas", 1.4f);
|
||||||
testcase(test, "data/tank-pro.json", "data/tank-pro.skel", "data/tank-pma.atlas", 1.0f);
|
testcase(test, "data/tank-pro.json", "data/tank-pro.skel", "data/tank-pma.atlas", 1.0f);
|
||||||
testcase(spineboy, "data/spineboy-pro.json", "data/spineboy-pro.skel", "data/spineboy-pma.atlas", 0.6f);
|
testcase(spineboy, "data/spineboy-pro.json", "data/spineboy-pro.skel", "data/spineboy-pma.atlas", 0.6f);
|
||||||
testcase(stretchyman, "data/stretchyman-stretchy-ik-pro.json", "data/stretchyman-stretchy-ik-pro.skel", "data/stretchyman-pma.atlas", 0.6f);
|
testcase(stretchyman, "data/stretchyman-stretchy-ik-pro.json", "data/stretchyman-stretchy-ik-pro.skel", "data/stretchyman-pma.atlas", 0.6f);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user