Merge branch '3.6' into 3.7-beta

This commit is contained in:
badlogic 2018-06-07 16:47:50 +02:00
commit cd198815e5
5 changed files with 64 additions and 9 deletions

View File

@ -38,6 +38,9 @@
extern "C" { extern "C" {
#endif #endif
/* Size of hashtable used in skin structure for fast attachment lookup. */
#define SKIN_ENTRIES_HASH_TABLE_SIZE 100
struct spSkeleton; struct spSkeleton;
typedef struct spSkin { typedef struct spSkin {
@ -59,9 +62,16 @@ struct _Entry {
_Entry* next; _Entry* next;
}; };
typedef struct _SkinHashTableEntry _SkinHashTableEntry;
struct _SkinHashTableEntry {
_Entry* entry;
_SkinHashTableEntry* next; /* list for elements with same hashes */
};
typedef struct { typedef struct {
spSkin super; spSkin super;
_Entry* entries; _Entry* entries; /* entries list stored for getting attachment name by attachment index */
_SkinHashTableEntry* entriesHashTable[SKIN_ENTRIES_HASH_TABLE_SIZE]; /* hashtable for fast attachment lookup */
} _spSkin; } _spSkin;
SP_API spSkin* spSkin_create (const char* name); SP_API spSkin* spSkin_create (const char* name);

View File

@ -45,6 +45,16 @@ void _Entry_dispose (_Entry* self) {
FREE(self); FREE(self);
} }
static _SkinHashTableEntry* _SkinHashTableEntry_create (_Entry* entry) {
_SkinHashTableEntry* self = NEW(_SkinHashTableEntry);
self->entry = entry;
return self;
}
static void _SkinHashTableEntry_dispose (_SkinHashTableEntry* self) {
FREE(self);
}
/**/ /**/
spSkin* spSkin_create (const char* name) { spSkin* spSkin_create (const char* name) {
@ -55,12 +65,28 @@ spSkin* spSkin_create (const char* name) {
void spSkin_dispose (spSkin* self) { void spSkin_dispose (spSkin* self) {
_Entry* entry = SUB_CAST(_spSkin, self)->entries; _Entry* entry = SUB_CAST(_spSkin, self)->entries;
while (entry) { while (entry) {
_Entry* nextEntry = entry->next; _Entry* nextEntry = entry->next;
_Entry_dispose(entry); _Entry_dispose(entry);
entry = nextEntry; entry = nextEntry;
} }
{
_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;
}
}
}
FREE(self->name); FREE(self->name);
FREE(self); FREE(self);
} }
@ -69,13 +95,21 @@ void spSkin_addAttachment (spSkin* self, int slotIndex, const char* name, spAtta
_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;
_SkinHashTableEntry* newHashEntry = _SkinHashTableEntry_create(newEntry);
newHashEntry->next = SUB_CAST(_spSkin, self)->entriesHashTable[hashTableIndex];
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) {
const _Entry* entry = SUB_CAST(_spSkin, self)->entries; const _SkinHashTableEntry* hashEntry = SUB_CAST(_spSkin, self)->entriesHashTable[(unsigned int)slotIndex % SKIN_ENTRIES_HASH_TABLE_SIZE];
while (entry) { while (hashEntry) {
if (entry->slotIndex == slotIndex && strcmp(entry->name, name) == 0) return entry->attachment; if (hashEntry->entry->slotIndex == slotIndex && strcmp(hashEntry->entry->name, name) == 0) return hashEntry->entry->attachment;
entry = entry->next; hashEntry = hashEntry->next;
} }
return 0; return 0;
} }

View File

@ -1,6 +1,6 @@
Spine Runtimes Software License v2.5 Spine Runtimes Software License v2.5
Copyright (c) 2013-2016, Esoteric Software Copyright (c) 2013-2018, Esoteric Software
All rights reserved. All rights reserved.
You are granted a perpetual, non-exclusive, non-sublicensable, and You are granted a perpetual, non-exclusive, non-sublicensable, and

View File

@ -102,7 +102,7 @@ module spine {
} else { } else {
for (let i = 0; i < config.atlasPages.length; i++) { for (let i = 0; i < config.atlasPages.length; i++) {
if (config.atlasPagesContent && config.atlasPagesContent[i]) { if (config.atlasPagesContent && config.atlasPagesContent[i]) {
assets.loadTextureData(config.atlasPages[i], config.atlasPagesContent[0]); assets.loadTextureData(config.atlasPages[i], config.atlasPagesContent[i]);
} else { } else {
assets.loadTexture(config.atlasPages[i]); assets.loadTexture(config.atlasPages[i]);
} }

View File

@ -1282,8 +1282,14 @@ namespace Spine.Unity {
internal Material[] sharedMaterials = new Material[0]; internal Material[] sharedMaterials = new Material[0];
public void Initialize () { public void Initialize () {
if (doubleBufferedMesh != null) {
doubleBufferedMesh.GetNext().Clear();
doubleBufferedMesh.GetNext().Clear();
submeshMaterials.Clear();
} else {
doubleBufferedMesh = new DoubleBuffered<SmartMesh>(); doubleBufferedMesh = new DoubleBuffered<SmartMesh>();
} }
}
public Material[] GetUpdatedSharedMaterialsArray () { public Material[] GetUpdatedSharedMaterialsArray () {
if (submeshMaterials.Count == sharedMaterials.Length) if (submeshMaterials.Count == sharedMaterials.Length)
@ -1341,6 +1347,11 @@ namespace Spine.Unity {
public Mesh mesh = SpineMesh.NewSkeletonMesh(); public Mesh mesh = SpineMesh.NewSkeletonMesh();
public SkeletonRendererInstruction instructionUsed = new SkeletonRendererInstruction(); public SkeletonRendererInstruction instructionUsed = new SkeletonRendererInstruction();
public void Clear () {
mesh.Clear();
instructionUsed.Clear();
}
public void Dispose () { public void Dispose () {
if (mesh != null) { if (mesh != null) {
#if UNITY_EDITOR #if UNITY_EDITOR