boundingBox takes into account scale and position. #32

This commit is contained in:
NathanSweet 2013-04-17 10:01:03 +02:00
parent a299f8b2a8
commit 3defbc4132
2 changed files with 45 additions and 32 deletions

View File

@ -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);
}

View File

@ -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);
}