From 3defbc413280a477116d41c2b99c5fab4647a3e7 Mon Sep 17 00:00:00 2001 From: NathanSweet Date: Wed, 17 Apr 2013 10:01:03 +0200 Subject: [PATCH] boundingBox takes into account scale and position. #32 --- .../src/spine/spine-cocos2d-iphone.m | 38 ++++++++++-------- spine-cocos2dx/src/spine/spine-cocos2dx.cpp | 39 +++++++++++-------- 2 files changed, 45 insertions(+), 32 deletions(-) diff --git a/spine-cocos2d-iphone/src/spine/spine-cocos2d-iphone.m b/spine-cocos2d-iphone/src/spine/spine-cocos2d-iphone.m index 955f84b4f..b0e04ec78 100644 --- a/spine-cocos2d-iphone/src/spine/spine-cocos2d-iphone.m +++ b/spine-cocos2d-iphone/src/spine/spine-cocos2d-iphone.m @@ -351,28 +351,34 @@ char* _Util_readFile (const char* path, int* length) { - (CGRect) boundingBox { float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN; + float scaleX = self.scaleX; + float scaleY = self.scaleY; for (int i = 0; i < skeleton->slotCount; ++i) { Slot* slot = skeleton->slots[i]; Attachment* attachment = slot->attachment; if (!attachment || attachment->type != ATTACHMENT_REGION) continue; Cocos2dRegionAttachment* regionAttachment = SUB_CAST(Cocos2dRegionAttachment, attachment); - minX = fmin(minX, regionAttachment->quad.bl.vertices.x); - minY = fmin(minY, regionAttachment->quad.bl.vertices.y); - maxX = fmax(maxX, regionAttachment->quad.bl.vertices.x); - maxY = fmax(maxY, regionAttachment->quad.bl.vertices.y); - minX = fmin(minX, regionAttachment->quad.br.vertices.x); - minY = fmin(minY, regionAttachment->quad.br.vertices.y); - maxX = fmax(maxX, regionAttachment->quad.br.vertices.x); - maxY = fmax(maxY, regionAttachment->quad.br.vertices.y); - minX = fmin(minX, regionAttachment->quad.tl.vertices.x); - minY = fmin(minY, regionAttachment->quad.tl.vertices.y); - maxX = fmax(maxX, regionAttachment->quad.tl.vertices.x); - maxY = fmax(maxY, regionAttachment->quad.tl.vertices.y); - minX = fmin(minX, regionAttachment->quad.tr.vertices.x); - minY = fmin(minY, regionAttachment->quad.tr.vertices.y); - maxX = fmax(maxX, regionAttachment->quad.tr.vertices.x); - maxY = fmax(maxY, regionAttachment->quad.tr.vertices.y); + minX = fmin(minX, regionAttachment->quad.bl.vertices.x * scaleX); + minY = fmin(minY, regionAttachment->quad.bl.vertices.y * scaleY); + maxX = fmax(maxX, regionAttachment->quad.bl.vertices.x * scaleX); + maxY = fmax(maxY, regionAttachment->quad.bl.vertices.y * scaleY); + minX = fmin(minX, regionAttachment->quad.br.vertices.x * scaleX); + minY = fmin(minY, regionAttachment->quad.br.vertices.y * scaleY); + maxX = fmax(maxX, regionAttachment->quad.br.vertices.x * scaleX); + maxY = fmax(maxY, regionAttachment->quad.br.vertices.y * scaleY); + minX = fmin(minX, regionAttachment->quad.tl.vertices.x * scaleX); + minY = fmin(minY, regionAttachment->quad.tl.vertices.y * scaleY); + maxX = fmax(maxX, regionAttachment->quad.tl.vertices.x * scaleX); + maxY = fmax(maxY, regionAttachment->quad.tl.vertices.y * scaleY); + minX = fmin(minX, regionAttachment->quad.tr.vertices.x * scaleX); + minY = fmin(minY, regionAttachment->quad.tr.vertices.y * scaleY); + maxX = fmax(maxX, regionAttachment->quad.tr.vertices.x * scaleX); + maxY = fmax(maxY, regionAttachment->quad.tr.vertices.y * scaleY); } + minX = self.position.x + minX; + minY = self.position.y + minY; + maxX = self.position.x + maxX; + maxY = self.position.y + maxY; return CGRectMake(minX, minY, maxX - minX, maxY - minY); } diff --git a/spine-cocos2dx/src/spine/spine-cocos2dx.cpp b/spine-cocos2dx/src/spine/spine-cocos2dx.cpp index 288212081..7af5fcdfd 100644 --- a/spine-cocos2dx/src/spine/spine-cocos2dx.cpp +++ b/spine-cocos2dx/src/spine/spine-cocos2dx.cpp @@ -189,28 +189,35 @@ void CCSkeleton::draw () { CCRect CCSkeleton::boundingBox () { float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN; + float scaleX = getScaleX(); + float scaleY = getScaleY(); for (int i = 0; i < skeleton->slotCount; ++i) { Slot* slot = skeleton->slots[i]; Attachment* attachment = slot->attachment; if (!attachment || attachment->type != ATTACHMENT_REGION) continue; Cocos2dxRegionAttachment* regionAttachment = SUB_CAST(Cocos2dxRegionAttachment, attachment); - minX = min(minX, regionAttachment->quad.bl.vertices.x); - minY = min(minY, regionAttachment->quad.bl.vertices.y); - maxX = max(maxX, regionAttachment->quad.bl.vertices.x); - maxY = max(maxY, regionAttachment->quad.bl.vertices.y); - minX = min(minX, regionAttachment->quad.br.vertices.x); - minY = min(minY, regionAttachment->quad.br.vertices.y); - maxX = max(maxX, regionAttachment->quad.br.vertices.x); - maxY = max(maxY, regionAttachment->quad.br.vertices.y); - minX = min(minX, regionAttachment->quad.tl.vertices.x); - minY = min(minY, regionAttachment->quad.tl.vertices.y); - maxX = max(maxX, regionAttachment->quad.tl.vertices.x); - maxY = max(maxY, regionAttachment->quad.tl.vertices.y); - minX = min(minX, regionAttachment->quad.tr.vertices.x); - minY = min(minY, regionAttachment->quad.tr.vertices.y); - maxX = max(maxX, regionAttachment->quad.tr.vertices.x); - maxY = max(maxY, regionAttachment->quad.tr.vertices.y); + minX = min(minX, regionAttachment->quad.bl.vertices.x * scaleX); + minY = min(minY, regionAttachment->quad.bl.vertices.y * scaleY); + maxX = max(maxX, regionAttachment->quad.bl.vertices.x * scaleX); + maxY = max(maxY, regionAttachment->quad.bl.vertices.y * scaleY); + minX = min(minX, regionAttachment->quad.br.vertices.x * scaleX); + minY = min(minY, regionAttachment->quad.br.vertices.y * scaleY); + maxX = max(maxX, regionAttachment->quad.br.vertices.x * scaleX); + maxY = max(maxY, regionAttachment->quad.br.vertices.y * scaleY); + minX = min(minX, regionAttachment->quad.tl.vertices.x * scaleX); + minY = min(minY, regionAttachment->quad.tl.vertices.y * scaleY); + maxX = max(maxX, regionAttachment->quad.tl.vertices.x * scaleX); + maxY = max(maxY, regionAttachment->quad.tl.vertices.y * scaleY); + minX = min(minX, regionAttachment->quad.tr.vertices.x * scaleX); + minY = min(minY, regionAttachment->quad.tr.vertices.y * scaleY); + maxX = max(maxX, regionAttachment->quad.tr.vertices.x * scaleX); + maxY = max(maxY, regionAttachment->quad.tr.vertices.y * scaleY); } + CCPoint position = getPosition(); + minX = position.x + minX; + minY = position.y + minY; + maxX = position.x + maxX; + maxY = position.y + maxY; return CCRectMake(minX, minY, maxX - minX, maxY - minY); }