From 80fdba02a105a1cc0febdbbc2ecc0627b7c5da5a Mon Sep 17 00:00:00 2001 From: NathanSweet Date: Sat, 4 May 2013 20:15:27 +0200 Subject: [PATCH] Refactoring: RegionAttachment vertices, texture->rendererObject... - Vertices are no longer stored on RegionAttachment. The vertices are temporary state, not part of RegionAttachment's persistent state like UVs and offset. - AtlasPage and RegionAttachment "texture" field is renamed to "rendererObject". This is a better name as it may not be a texture. - AtlasAttachmentLoader uses the AtlasRegion as the rendererObject. This enables a renderer to use region information if needed. The page rendererObject is still available. - Better "enum" look up for AS3. - Unity4 example doesn't use a compressed material. --- spine-as3/spine-as3/src/spine/SkeletonJson.as | 2 +- spine-as3/spine-as3/src/spine/atlas/Atlas.as | 6 ++--- spine-as3/spine-as3/src/spine/atlas/Format.as | 20 -------------- .../src/spine/atlas/TextureFilter.as | 20 -------------- .../spine-as3/src/spine/atlas/TextureWrap.as | 12 --------- .../src/spine/attachments/AttachmentType.as | 10 ------- .../src/spine/attachments/RegionAttachment.as | 5 ++-- spine-c/example/main.c | 2 +- spine-c/include/spine/Atlas.h | 2 +- spine-c/include/spine/RegionAttachment.h | 5 ++-- spine-c/src/spine/AtlasAttachmentLoader.c | 4 +-- spine-c/src/spine/RegionAttachment.c | 18 ++++++------- spine-cocos2d-iphone/src/spine/CCSkeleton.m | 2 +- .../src/spine/spine-cocos2d-iphone.m | 4 +-- spine-cocos2dx/src/spine/CCSkeleton.cpp | 2 +- spine-cocos2dx/src/spine/spine-cocos2dx.cpp | 23 ++++++++-------- spine-csharp/src/Atlas.cs | 4 +-- .../src/Attachments/AtlasAttachmentLoader.cs | 2 +- .../src/Attachments/RegionAttachment.cs | 7 ++--- spine-sfml/src/spine/spine-sfml.cpp | 25 +++++++++--------- .../spine-starling-example/src/Game.as | 4 +-- .../src/spine/starling/SkeletonSprite.as | 11 +++++--- .../Assets/Plugins/Spine/SkeletonComponent.cs | 13 ++++----- .../examples/Unity 4/spineboy/spineboy.unity | Bin 17944 -> 18096 bytes .../Assets/examples/data/spineboy.png.meta | 4 ++- spine-xna/src/SkeletonRenderer.cs | 7 ++--- spine-xna/src/XnaTextureLoader.cs | 2 +- 27 files changed, 80 insertions(+), 136 deletions(-) diff --git a/spine-as3/spine-as3/src/spine/SkeletonJson.as b/spine-as3/spine-as3/src/spine/SkeletonJson.as index a653f2928..e766e482c 100644 --- a/spine-as3/spine-as3/src/spine/SkeletonJson.as +++ b/spine-as3/spine-as3/src/spine/SkeletonJson.as @@ -117,7 +117,7 @@ public class SkeletonJson { private function readAttachment (skin:Skin, name:String, map:Object) : Attachment { name = map["name"] || name; - var type:AttachmentType = AttachmentType.valueOf(map["type"] || "region"); + var type:AttachmentType = AttachmentType[map["type"] || "region"]; var attachment:Attachment = attachmentLoader.newAttachment(skin, type, name); if (attachment is RegionAttachment) { diff --git a/spine-as3/spine-as3/src/spine/atlas/Atlas.as b/spine-as3/spine-as3/src/spine/atlas/Atlas.as index a1b44983c..75555ea69 100644 --- a/spine-as3/spine-as3/src/spine/atlas/Atlas.as +++ b/spine-as3/spine-as3/src/spine/atlas/Atlas.as @@ -38,11 +38,11 @@ public class Atlas { page = new AtlasPage(); page.name = line; - page.format = Format.fromString(reader.readValue()); + page.format = Format[reader.readValue()]; reader.readTuple(tuple); - page.minFilter = TextureFilter.fromString(tuple[0]); - page.magFilter = TextureFilter.fromString(tuple[1]); + page.minFilter = TextureFilter[tuple[0]]; + page.magFilter = TextureFilter[tuple[1]]; var direction:String = reader.readValue(); page.uWrap = TextureWrap.clampToEdge; diff --git a/spine-as3/spine-as3/src/spine/atlas/Format.as b/spine-as3/spine-as3/src/spine/atlas/Format.as index b3d4a100d..287a7d206 100644 --- a/spine-as3/spine-as3/src/spine/atlas/Format.as +++ b/spine-as3/spine-as3/src/spine/atlas/Format.as @@ -16,26 +16,6 @@ public class Format { this.ordinal = ordinal; this.name = name; } - - static public function fromString (name:String) : Format { - switch (name.toLowerCase()) { - case "alpha": - return alpha; - case "intensity": - return intensity; - case "luminanceAlpha": - return luminanceAlpha; - case "rgb565": - return rgb565; - case "rgba4444": - return rgba4444; - case "rgb888": - return rgb888; - case "rgba8888": - return rgba8888; - } - throw new ArgumentError("Unknown format: " + name); - } } } diff --git a/spine-as3/spine-as3/src/spine/atlas/TextureFilter.as b/spine-as3/spine-as3/src/spine/atlas/TextureFilter.as index df25ffb71..ad8e398d3 100644 --- a/spine-as3/spine-as3/src/spine/atlas/TextureFilter.as +++ b/spine-as3/spine-as3/src/spine/atlas/TextureFilter.as @@ -16,26 +16,6 @@ public class TextureFilter { this.ordinal = ordinal; this.name = name; } - - static public function fromString (name:String) : TextureFilter { - switch (name.toLowerCase()) { - case "nearest": - return nearest; - case "linear": - return linear; - case "mipMap": - return mipMap; - case "mipMapNearestNearest": - return mipMapNearestNearest; - case "mipMapLinearNearest": - return mipMapLinearNearest; - case "mipMapNearestLinear": - return mipMapNearestLinear; - case "mipMapLinearLinear": - return mipMapLinearLinear; - } - throw new ArgumentError("Unknown texture filter: " + name); - } } } diff --git a/spine-as3/spine-as3/src/spine/atlas/TextureWrap.as b/spine-as3/spine-as3/src/spine/atlas/TextureWrap.as index ddfd61b19..79f6ecd4f 100644 --- a/spine-as3/spine-as3/src/spine/atlas/TextureWrap.as +++ b/spine-as3/spine-as3/src/spine/atlas/TextureWrap.as @@ -12,18 +12,6 @@ public class TextureWrap { this.ordinal = ordinal; this.name = name; } - - static public function fromString (name:String) : TextureWrap { - switch (name.toLowerCase()) { - case "mirroredRepeat": - return mirroredRepeat; - case "clampToEdge": - return clampToEdge; - case "repeat": - return repeat; - } - throw new ArgumentError("Unknown texture wrap: " + name); - } } } diff --git a/spine-as3/spine-as3/src/spine/attachments/AttachmentType.as b/spine-as3/spine-as3/src/spine/attachments/AttachmentType.as index e7a2d6448..60dbb66b9 100644 --- a/spine-as3/spine-as3/src/spine/attachments/AttachmentType.as +++ b/spine-as3/spine-as3/src/spine/attachments/AttachmentType.as @@ -11,16 +11,6 @@ public class AttachmentType { this.ordinal = ordinal; this.name = name; } - - static public function valueOf (name:String) : AttachmentType { - switch (name) { - case "region": - return region; - case "regionSequence": - return regionSequence; - } - return null; - } } } diff --git a/spine-as3/spine-as3/src/spine/attachments/RegionAttachment.as b/spine-as3/spine-as3/src/spine/attachments/RegionAttachment.as index a753b76a8..5ef46cb7e 100644 --- a/spine-as3/spine-as3/src/spine/attachments/RegionAttachment.as +++ b/spine-as3/spine-as3/src/spine/attachments/RegionAttachment.as @@ -27,12 +27,13 @@ public dynamic class RegionAttachment extends Attachment { public var regionOriginalWidth:Number; // Unrotated, unstripped size. public var regionOriginalHeight:Number; - public var vertices:Vector. = new Vector.(); public var offset:Vector. = new Vector.(); public var uvs:Vector. = new Vector.(); public function RegionAttachment (name:String) { super(name); + offset.length = 8; + uvs.length = 8; } public function setUVs (u:Number, v:Number, u2:Number, v2:Number, rotate:Boolean) : void { @@ -85,7 +86,7 @@ public dynamic class RegionAttachment extends Attachment { offset[Y4] = localYCos + localX2Sin; } - public function updateVertices (bone:Bone) : void { + public function updateVertices (bone:Bone, vertices:Vector.) : void { var x:Number = bone.worldX; var y:Number = bone.worldY; var m00:Number = bone.m00; diff --git a/spine-c/example/main.c b/spine-c/example/main.c index b1fdb894a..3a3729328 100644 --- a/spine-c/example/main.c +++ b/spine-c/example/main.c @@ -8,7 +8,7 @@ /**/ void _AtlasPage_createTexture (AtlasPage* self, const char* path) { - self->texture = 0; + self->rendererObject = 0; self->width = 123; self->height = 456; } diff --git a/spine-c/include/spine/Atlas.h b/spine-c/include/spine/Atlas.h index 238103b2b..31ead2d7d 100644 --- a/spine-c/include/spine/Atlas.h +++ b/spine-c/include/spine/Atlas.h @@ -56,7 +56,7 @@ struct AtlasPage { AtlasFilter minFilter, magFilter; AtlasWrap uWrap, vWrap; - void* texture; + void* rendererObject; int width, height; AtlasPage* next; diff --git a/spine-c/include/spine/RegionAttachment.h b/spine-c/include/spine/RegionAttachment.h index d565ec1ce..e796a5e72 100644 --- a/spine-c/include/spine/RegionAttachment.h +++ b/spine-c/include/spine/RegionAttachment.h @@ -44,20 +44,19 @@ struct RegionAttachment { Attachment super; float x, y, scaleX, scaleY, rotation, width, height; - void* texture; + void* rendererObject; int regionOffsetX, regionOffsetY; /* Pixels stripped from the bottom left, unrotated. */ int regionWidth, regionHeight; /* Unrotated, stripped pixel size. */ int regionOriginalWidth, regionOriginalHeight; /* Unrotated, unstripped pixel size. */ float offset[8]; - float vertices[8]; float uvs[8]; }; RegionAttachment* RegionAttachment_create (const char* name); void RegionAttachment_setUVs (RegionAttachment* self, float u, float v, float u2, float v2, int/*bool*/rotate); void RegionAttachment_updateOffset (RegionAttachment* self); -void RegionAttachment_updateVertices (RegionAttachment* self, Slot* slot); +void RegionAttachment_computeVertices (RegionAttachment* self, Slot* slot, float* vertices); #ifdef __cplusplus } diff --git a/spine-c/src/spine/AtlasAttachmentLoader.c b/spine-c/src/spine/AtlasAttachmentLoader.c index f15753a86..e0e96c299 100644 --- a/spine-c/src/spine/AtlasAttachmentLoader.c +++ b/spine-c/src/spine/AtlasAttachmentLoader.c @@ -41,7 +41,7 @@ Attachment* _AtlasAttachmentLoader_newAttachment (AttachmentLoader* loader, Skin return 0; } attachment = RegionAttachment_create(name); - attachment->texture = region->page->texture; + attachment->rendererObject = region; RegionAttachment_setUVs(attachment, region->u, region->v, region->u2, region->v2, region->rotate); attachment->regionOffsetX = region->offsetX; attachment->regionOffsetY = region->offsetY; @@ -66,4 +66,4 @@ AtlasAttachmentLoader* AtlasAttachmentLoader_create (Atlas* atlas) { #ifdef __cplusplus } -#endif \ No newline at end of file +#endif diff --git a/spine-c/src/spine/RegionAttachment.c b/spine-c/src/spine/RegionAttachment.c index 746abd686..312a922b0 100644 --- a/spine-c/src/spine/RegionAttachment.c +++ b/spine-c/src/spine/RegionAttachment.c @@ -94,17 +94,17 @@ void RegionAttachment_updateOffset (RegionAttachment* self) { self->offset[VERTEX_Y4] = localYCos + localX2Sin; } -void RegionAttachment_updateVertices (RegionAttachment* self, Slot* slot) { +void RegionAttachment_computeVertices (RegionAttachment* self, Slot* slot, float* vertices) { float* offset = self->offset; Bone* bone = slot->bone; - self->vertices[VERTEX_X1] = offset[VERTEX_X1] * bone->m00 + offset[VERTEX_Y1] * bone->m01 + bone->worldX; - self->vertices[VERTEX_Y1] = offset[VERTEX_X1] * bone->m10 + offset[VERTEX_Y1] * bone->m11 + bone->worldY; - self->vertices[VERTEX_X2] = offset[VERTEX_X2] * bone->m00 + offset[VERTEX_Y2] * bone->m01 + bone->worldX; - self->vertices[VERTEX_Y2] = offset[VERTEX_X2] * bone->m10 + offset[VERTEX_Y2] * bone->m11 + bone->worldY; - self->vertices[VERTEX_X3] = offset[VERTEX_X3] * bone->m00 + offset[VERTEX_Y3] * bone->m01 + bone->worldX; - self->vertices[VERTEX_Y3] = offset[VERTEX_X3] * bone->m10 + offset[VERTEX_Y3] * bone->m11 + bone->worldY; - self->vertices[VERTEX_X4] = offset[VERTEX_X4] * bone->m00 + offset[VERTEX_Y4] * bone->m01 + bone->worldX; - self->vertices[VERTEX_Y4] = offset[VERTEX_X4] * bone->m10 + offset[VERTEX_Y4] * bone->m11 + bone->worldY; + vertices[VERTEX_X1] = offset[VERTEX_X1] * bone->m00 + offset[VERTEX_Y1] * bone->m01 + bone->worldX; + vertices[VERTEX_Y1] = offset[VERTEX_X1] * bone->m10 + offset[VERTEX_Y1] * bone->m11 + bone->worldY; + vertices[VERTEX_X2] = offset[VERTEX_X2] * bone->m00 + offset[VERTEX_Y2] * bone->m01 + bone->worldX; + vertices[VERTEX_Y2] = offset[VERTEX_X2] * bone->m10 + offset[VERTEX_Y2] * bone->m11 + bone->worldY; + vertices[VERTEX_X3] = offset[VERTEX_X3] * bone->m00 + offset[VERTEX_Y3] * bone->m01 + bone->worldX; + vertices[VERTEX_Y3] = offset[VERTEX_X3] * bone->m10 + offset[VERTEX_Y3] * bone->m11 + bone->worldY; + vertices[VERTEX_X4] = offset[VERTEX_X4] * bone->m00 + offset[VERTEX_Y4] * bone->m01 + bone->worldX; + vertices[VERTEX_Y4] = offset[VERTEX_X4] * bone->m10 + offset[VERTEX_Y4] * bone->m11 + bone->worldY; } #ifdef __cplusplus diff --git a/spine-cocos2d-iphone/src/spine/CCSkeleton.m b/spine-cocos2d-iphone/src/spine/CCSkeleton.m index 957d4d0fd..230248764 100644 --- a/spine-cocos2d-iphone/src/spine/CCSkeleton.m +++ b/spine-cocos2d-iphone/src/spine/CCSkeleton.m @@ -143,7 +143,7 @@ Slot* slot = _skeleton->slots[i]; if (!slot->attachment || slot->attachment->type != ATTACHMENT_REGION) continue; RegionAttachment* attachment = (RegionAttachment*)slot->attachment; - CCTextureAtlas* regionTextureAtlas = (CCTextureAtlas*)attachment->texture; + CCTextureAtlas* regionTextureAtlas = (CCTextureAtlas*)attachment->rendererObject; if (regionTextureAtlas != textureAtlas) { if (textureAtlas) { [textureAtlas drawQuads]; diff --git a/spine-cocos2d-iphone/src/spine/spine-cocos2d-iphone.m b/spine-cocos2d-iphone/src/spine/spine-cocos2d-iphone.m index dbffa5c2e..486b7ca45 100644 --- a/spine-cocos2d-iphone/src/spine/spine-cocos2d-iphone.m +++ b/spine-cocos2d-iphone/src/spine/spine-cocos2d-iphone.m @@ -34,14 +34,14 @@ void _AtlasPage_createTexture (AtlasPage* self, const char* path) { CCTexture2D* texture = [[CCTextureCache sharedTextureCache] addImage:@(path)]; CCTextureAtlas* textureAtlas = [[CCTextureAtlas alloc] initWithTexture:texture capacity:4]; [textureAtlas retain]; - self->texture = textureAtlas; + self->rendererObject = textureAtlas; CGSize size = texture.contentSizeInPixels; self->width = size.width; self->height = size.height; } void _AtlasPage_disposeTexture (AtlasPage* self) { - [(CCTextureAtlas*)self->texture release]; + [(CCTextureAtlas*)self->rendererObject release]; } char* _Util_readFile (const char* path, int* length) { diff --git a/spine-cocos2dx/src/spine/CCSkeleton.cpp b/spine-cocos2dx/src/spine/CCSkeleton.cpp index 5e6b8fd8d..c169a422f 100644 --- a/spine-cocos2dx/src/spine/CCSkeleton.cpp +++ b/spine-cocos2dx/src/spine/CCSkeleton.cpp @@ -135,7 +135,7 @@ void CCSkeleton::draw () { Slot* slot = skeleton->slots[i]; if (!slot->attachment || slot->attachment->type != ATTACHMENT_REGION) continue; RegionAttachment* attachment = (RegionAttachment*)slot->attachment; - CCTextureAtlas* regionTextureAtlas = (CCTextureAtlas*)attachment->texture; + CCTextureAtlas* regionTextureAtlas = (CCTextureAtlas*)((AtlasRegion*)attachment->rendererObject)->page->rendererObject; if (regionTextureAtlas != textureAtlas) { if (textureAtlas) { textureAtlas->drawQuads(); diff --git a/spine-cocos2dx/src/spine/spine-cocos2dx.cpp b/spine-cocos2dx/src/spine/spine-cocos2dx.cpp index 41098443a..c902414ea 100644 --- a/spine-cocos2dx/src/spine/spine-cocos2dx.cpp +++ b/spine-cocos2dx/src/spine/spine-cocos2dx.cpp @@ -34,13 +34,13 @@ void _AtlasPage_createTexture (AtlasPage* self, const char* path) { CCTexture2D* texture = CCTextureCache::sharedTextureCache()->addImage(path); CCTextureAtlas* textureAtlas = CCTextureAtlas::createWithTexture(texture, 4); textureAtlas->retain(); - self->texture = textureAtlas; + self->rendererObject = textureAtlas; self->width = texture->getPixelsWide(); self->height = texture->getPixelsHigh(); } void _AtlasPage_disposeTexture (AtlasPage* self) { - ((CCTextureAtlas*)self->texture)->release(); + ((CCTextureAtlas*)self->rendererObject)->release(); } char* _Util_readFile (const char* path, int* length) { @@ -54,7 +54,8 @@ char* _Util_readFile (const char* path, int* length) { /**/ void RegionAttachment_updateQuad (RegionAttachment* self, Slot* slot, ccV3F_C4B_T2F_Quad* quad) { - RegionAttachment_updateVertices(self, slot); + float vertices[8]; + RegionAttachment_computeVertices(self, slot, vertices); GLubyte r = slot->skeleton->r * slot->r * 255; GLubyte g = slot->skeleton->g * slot->g * 255; @@ -77,14 +78,14 @@ void RegionAttachment_updateQuad (RegionAttachment* self, Slot* slot, ccV3F_C4B_ quad->br.colors.b = b; quad->br.colors.a = a; - quad->bl.vertices.x = self->vertices[VERTEX_X1]; - quad->bl.vertices.y = self->vertices[VERTEX_Y1]; - quad->tl.vertices.x = self->vertices[VERTEX_X2]; - quad->tl.vertices.y = self->vertices[VERTEX_Y2]; - quad->tr.vertices.x = self->vertices[VERTEX_X3]; - quad->tr.vertices.y = self->vertices[VERTEX_Y3]; - quad->br.vertices.x = self->vertices[VERTEX_X4]; - quad->br.vertices.y = self->vertices[VERTEX_Y4]; + quad->bl.vertices.x = vertices[VERTEX_X1]; + quad->bl.vertices.y = vertices[VERTEX_Y1]; + quad->tl.vertices.x = vertices[VERTEX_X2]; + quad->tl.vertices.y = vertices[VERTEX_Y2]; + quad->tr.vertices.x = vertices[VERTEX_X3]; + quad->tr.vertices.y = vertices[VERTEX_Y3]; + quad->br.vertices.x = vertices[VERTEX_X4]; + quad->br.vertices.y = vertices[VERTEX_Y4]; quad->bl.texCoords.u = self->uvs[VERTEX_X1]; quad->bl.texCoords.v = self->uvs[VERTEX_Y1]; diff --git a/spine-csharp/src/Atlas.cs b/spine-csharp/src/Atlas.cs index 1951533c0..92c8bff94 100644 --- a/spine-csharp/src/Atlas.cs +++ b/spine-csharp/src/Atlas.cs @@ -173,7 +173,7 @@ namespace Spine { public void Dispose () { for (int i = 0, n = pages.Count; i < n; i++) - textureLoader.Unload(pages[i].texture); + textureLoader.Unload(pages[i].rendererObject); } } @@ -210,7 +210,7 @@ namespace Spine { public TextureFilter magFilter; public TextureWrap uWrap; public TextureWrap vWrap; - public Object texture; + public Object rendererObject; public int width, height; } diff --git a/spine-csharp/src/Attachments/AtlasAttachmentLoader.cs b/spine-csharp/src/Attachments/AtlasAttachmentLoader.cs index b2749d7b3..cc0530ed1 100644 --- a/spine-csharp/src/Attachments/AtlasAttachmentLoader.cs +++ b/spine-csharp/src/Attachments/AtlasAttachmentLoader.cs @@ -40,7 +40,7 @@ namespace Spine { AtlasRegion region = atlas.FindRegion(name); if (region == null) throw new Exception("Region not found in atlas: " + name + " (" + type + ")"); RegionAttachment attachment = new RegionAttachment(name); - attachment.Texture = region.page.texture; + attachment.RendererObject = region.page.rendererObject; attachment.SetUVs(region.u, region.v, region.u2, region.v2, region.rotate); attachment.RegionOffsetX = region.offsetX; attachment.RegionOffsetY = region.offsetY; diff --git a/spine-csharp/src/Attachments/RegionAttachment.cs b/spine-csharp/src/Attachments/RegionAttachment.cs index 445f1e2ed..e01600cfd 100644 --- a/spine-csharp/src/Attachments/RegionAttachment.cs +++ b/spine-csharp/src/Attachments/RegionAttachment.cs @@ -45,7 +45,7 @@ namespace Spine { public float Width { get; set; } public float Height { get; set; } - public Object Texture { get; set; } + public Object RendererObject { get; set; } public float RegionOffsetX { get; set; } public float RegionOffsetY { get; set; } // Pixels stripped from the bottom left, unrotated. public float RegionWidth { get; set; } @@ -54,13 +54,11 @@ namespace Spine { public float RegionOriginalHeight { get; set; } // Unrotated, unstripped size. public float[] Offset { get; private set; } - public float[] Vertices { get; private set; } public float[] UVs { get; private set; } public RegionAttachment (string name) : base(name) { Offset = new float[8]; - Vertices = new float[8]; UVs = new float[8]; ScaleX = 1; ScaleY = 1; @@ -124,14 +122,13 @@ namespace Spine { offset[Y4] = localYCos + localX2Sin; } - public void UpdateVertices (Bone bone) { + public void ComputeVertices (Bone bone, float[] vertices) { float x = bone.WorldX; float y = bone.WorldY; float m00 = bone.M00; float m01 = bone.M01; float m10 = bone.M10; float m11 = bone.M11; - float[] vertices = Vertices; float[] offset = Offset; vertices[X1] = offset[X1] * m00 + offset[Y1] * m01 + x; vertices[Y1] = offset[X1] * m10 + offset[Y1] * m11 + y; diff --git a/spine-sfml/src/spine/spine-sfml.cpp b/spine-sfml/src/spine/spine-sfml.cpp index 9b0b473c1..ecc8cbc04 100644 --- a/spine-sfml/src/spine/spine-sfml.cpp +++ b/spine-sfml/src/spine/spine-sfml.cpp @@ -38,14 +38,14 @@ namespace spine { void _AtlasPage_createTexture (AtlasPage* self, const char* path) { Texture* texture = new Texture(); if (!texture->loadFromFile(path)) return; - self->texture = texture; + self->rendererObject = texture; Vector2u size = texture->getSize(); self->width = size.x; self->height = size.y; } void _AtlasPage_disposeTexture (AtlasPage* self) { - delete (Texture*)self->texture; + delete (Texture*)self->rendererObject; } char* _Util_readFile (const char* path, int* length) { @@ -78,12 +78,13 @@ void SkeletonDrawable::update (float deltaTime) { void SkeletonDrawable::draw (RenderTarget& target, RenderStates states) const { vertexArray->clear(); + float vertexPositions[8]; for (int i = 0; i < skeleton->slotCount; ++i) { Slot* slot = skeleton->slots[i]; Attachment* attachment = slot->attachment; if (!attachment || attachment->type != ATTACHMENT_REGION) continue; RegionAttachment* regionAttachment = (RegionAttachment*)attachment; - RegionAttachment_updateVertices(regionAttachment, slot); + RegionAttachment_computeVertices(regionAttachment, slot, vertexPositions); Uint8 r = skeleton->r * slot->r * 255; Uint8 g = skeleton->g * slot->g * 255; @@ -108,17 +109,17 @@ void SkeletonDrawable::draw (RenderTarget& target, RenderStates states) const { vertices[3].color.b = b; vertices[3].color.a = a; - vertices[0].position.x = regionAttachment->vertices[VERTEX_X1]; - vertices[0].position.y = regionAttachment->vertices[VERTEX_Y1]; - vertices[1].position.x = regionAttachment->vertices[VERTEX_X2]; - vertices[1].position.y = regionAttachment->vertices[VERTEX_Y2]; - vertices[2].position.x = regionAttachment->vertices[VERTEX_X3]; - vertices[2].position.y = regionAttachment->vertices[VERTEX_Y3]; - vertices[3].position.x = regionAttachment->vertices[VERTEX_X4]; - vertices[3].position.y = regionAttachment->vertices[VERTEX_Y4]; + vertices[0].position.x = vertexPositions[VERTEX_X1]; + vertices[0].position.y = vertexPositions[VERTEX_Y1]; + vertices[1].position.x = vertexPositions[VERTEX_X2]; + vertices[1].position.y = vertexPositions[VERTEX_Y2]; + vertices[2].position.x = vertexPositions[VERTEX_X3]; + vertices[2].position.y = vertexPositions[VERTEX_Y3]; + vertices[3].position.x = vertexPositions[VERTEX_X4]; + vertices[3].position.y = vertexPositions[VERTEX_Y4]; // SMFL doesn't handle batching for us, so we'll just force a single texture per skeleton. - states.texture = (Texture*)regionAttachment->texture; + states.texture = (Texture*)((AtlasRegion*)regionAttachment->rendererObject)->page->rendererObject; Vector2u size = states.texture->getSize(); vertices[0].texCoords.x = regionAttachment->uvs[VERTEX_X1] * size.x; diff --git a/spine-starling/spine-starling-example/src/Game.as b/spine-starling/spine-starling-example/src/Game.as index 98db82a23..a6f931a03 100644 --- a/spine-starling/spine-starling-example/src/Game.as +++ b/spine-starling/spine-starling-example/src/Game.as @@ -43,9 +43,9 @@ public class Game extends Sprite { skeleton.setAnimationStateData(stateData); skeleton.x = 320; skeleton.y = 420; - /*skeleton.setAnimation("walk", true); + skeleton.setAnimation("walk", true); skeleton.addAnimation("jump", false, 3); - skeleton.addAnimation("walk", true);*/ + skeleton.addAnimation("walk", true); addChild(skeleton); Starling.juggler.add(skeleton); diff --git a/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as b/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as index 1d9b6e230..74a93e5bc 100644 --- a/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as +++ b/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as @@ -19,12 +19,15 @@ public class SkeletonSprite extends DisplayObject implements IAnimatable { static private var tempMatrix:Matrix = new Matrix(); private var _skeleton:Skeleton; + private var vertices:Vector. = new Vector.(); public function SkeletonSprite (skeletonData:SkeletonData) { Bone.yDown = true; _skeleton = new Skeleton(skeletonData); _skeleton.updateWorldTransform(); + + vertices.length = 8; } public function advanceTime (delta:Number) : void { @@ -37,8 +40,8 @@ public class SkeletonSprite extends DisplayObject implements IAnimatable { var slot:Slot = drawOrder[i]; var regionAttachment:RegionAttachment = slot.attachment as RegionAttachment; if (regionAttachment != null) { - regionAttachment.updateVertices(slot.bone); - var vertices:Vector. = regionAttachment.vertices; + var vertices:Vector. = this.vertices; + regionAttachment.updateVertices(slot.bone, vertices); var r:Number = skeleton.r * slot.r; var g:Number = skeleton.g * slot.g; var b:Number = skeleton.b * slot.b; @@ -95,8 +98,8 @@ public class SkeletonSprite extends DisplayObject implements IAnimatable { if (!regionAttachment) continue; - regionAttachment.updateVertices(slot.bone); - var vertices:Vector. = regionAttachment.vertices; + var vertices:Vector. = this.vertices; + regionAttachment.updateVertices(slot.bone, vertices); value = vertices[0]; if (value < minX) diff --git a/spine-unity/Assets/Plugins/Spine/SkeletonComponent.cs b/spine-unity/Assets/Plugins/Spine/SkeletonComponent.cs index 69cd4a7b4..e649daa1a 100644 --- a/spine-unity/Assets/Plugins/Spine/SkeletonComponent.cs +++ b/spine-unity/Assets/Plugins/Spine/SkeletonComponent.cs @@ -43,6 +43,7 @@ public class SkeletonComponent : MonoBehaviour { private Vector2[] uvs; private int[] triangles; private int quadCount; + private float[] vertexPositions = new float[8]; public void Clear () { GetComponent().mesh = null; @@ -125,6 +126,7 @@ public class SkeletonComponent : MonoBehaviour { } // Setup mesh. + float[] vertexPositions = this.vertexPositions; int quadIndex = 0; Color color = new Color(); for (int i = 0, n = drawOrder.Count; i < n; i++) { @@ -133,13 +135,12 @@ public class SkeletonComponent : MonoBehaviour { if (attachment is RegionAttachment) { RegionAttachment regionAttachment = (RegionAttachment)attachment; - regionAttachment.UpdateVertices(slot.Bone); - float[] regionVertices = regionAttachment.Vertices; + regionAttachment.ComputeVertices(slot.Bone, vertexPositions); int vertexIndex = quadIndex * 4; - vertices[vertexIndex] = new Vector3(regionVertices[RegionAttachment.X1], regionVertices[RegionAttachment.Y1], 0); - vertices[vertexIndex + 1] = new Vector3(regionVertices[RegionAttachment.X4], regionVertices[RegionAttachment.Y4], 0); - vertices[vertexIndex + 2] = new Vector3(regionVertices[RegionAttachment.X2], regionVertices[RegionAttachment.Y2], 0); - vertices[vertexIndex + 3] = new Vector3(regionVertices[RegionAttachment.X3], regionVertices[RegionAttachment.Y3], 0); + vertices[vertexIndex] = new Vector3(vertexPositions[RegionAttachment.X1], vertexPositions[RegionAttachment.Y1], 0); + vertices[vertexIndex + 1] = new Vector3(vertexPositions[RegionAttachment.X4], vertexPositions[RegionAttachment.Y4], 0); + vertices[vertexIndex + 2] = new Vector3(vertexPositions[RegionAttachment.X2], vertexPositions[RegionAttachment.Y2], 0); + vertices[vertexIndex + 3] = new Vector3(vertexPositions[RegionAttachment.X3], vertexPositions[RegionAttachment.Y3], 0); color.a = skeleton.A * slot.A; color.r = skeleton.R * slot.R * color.a; diff --git a/spine-unity/Assets/examples/Unity 4/spineboy/spineboy.unity b/spine-unity/Assets/examples/Unity 4/spineboy/spineboy.unity index 8305b2361be86ee2264a082ff7f98d6cce83c4b4..c1df2cbe6c5369a884f7cac4e00f6380b8159b42 100644 GIT binary patch delta 343 zcmbQy!?>ZBQGkKLv4w%bZ36=X11FHZV57iFW=7tP0d~xjH>k2s{>wI%xi~v>@+|g_ z$=&RdjM9^rvMV#nOg;%DWhcL7S7el%%+I03C_mYVL!D7!@e`IVOf69Yp8kSz|yTYzE}Krs~{UlEG80>u^p#R7nQ7AW2Z6#D=aa{%%kp?Et` z%z&AJ!2rnr2esq1&w}^_pjanRjFEvM3Pdox0SbNq3Mv5Efl&MwC?)_j9VAu*#qWS( z22imWpcn|h2Z{v%#d3jc5h(ru6gx0^mP5_t1&(~1)f_)D0u5)FEbgp1S-_EHvxD;u FCIAinR7L;* delta 318 zcmdnc%Q&NlQGkKL;S&Rcn*;*`11AH6qrgUimCTGh8w2c^C;woZHCcs2X!3maI)PBn zyb=qBoc#O(21cM#>B&bp)EQ+qzu`zXulE27{0D*}AieqXD=!Hq28IYATO5kF0L2P` zVk$tsA{1{0ip>Cu1pxUhP`nK&_5vv80OUJD@phn?1~UVL0g(R>YR7Az1@RF;u}+{E z&@oY97rg-rz5og;00je~_$^S3186!(tOknT0mU?+VlhB55PlC7^8kwF0@)%^`~fJo gW3rB8&15|%fz8_-KQT^T