diff --git a/spine-cocos2d-iphone/2/src/spine/SkeletonRenderer.m b/spine-cocos2d-iphone/2/src/spine/SkeletonRenderer.m index d93aad064..01013f873 100644 --- a/spine-cocos2d-iphone/2/src/spine/SkeletonRenderer.m +++ b/spine-cocos2d-iphone/2/src/spine/SkeletonRenderer.m @@ -266,30 +266,32 @@ static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0}; - (CGRect) boundingBox { float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN; - float scaleX = self.scaleX; - float scaleY = self.scaleY; - float vertices[8]; + float scaleX = self.scaleX, scaleY = self.scaleY; for (int i = 0; i < _skeleton->slotCount; ++i) { spSlot* slot = _skeleton->slots[i]; - if (!slot->attachment || slot->attachment->type != SP_ATTACHMENT_REGION) continue; - spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment; - spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, vertices); - minX = fmin(minX, vertices[SP_VERTEX_X1] * scaleX); - minY = fmin(minY, vertices[SP_VERTEX_Y1] * scaleY); - maxX = fmax(maxX, vertices[SP_VERTEX_X1] * scaleX); - maxY = fmax(maxY, vertices[SP_VERTEX_Y1] * scaleY); - minX = fmin(minX, vertices[SP_VERTEX_X4] * scaleX); - minY = fmin(minY, vertices[SP_VERTEX_Y4] * scaleY); - maxX = fmax(maxX, vertices[SP_VERTEX_X4] * scaleX); - maxY = fmax(maxY, vertices[SP_VERTEX_Y4] * scaleY); - minX = fmin(minX, vertices[SP_VERTEX_X2] * scaleX); - minY = fmin(minY, vertices[SP_VERTEX_Y2] * scaleY); - maxX = fmax(maxX, vertices[SP_VERTEX_X2] * scaleX); - maxY = fmax(maxY, vertices[SP_VERTEX_Y2] * scaleY); - minX = fmin(minX, vertices[SP_VERTEX_X3] * scaleX); - minY = fmin(minY, vertices[SP_VERTEX_Y3] * scaleY); - maxX = fmax(maxX, vertices[SP_VERTEX_X3] * scaleX); - maxY = fmax(maxY, vertices[SP_VERTEX_Y3] * scaleY); + if (!slot->attachment) continue; + int verticesCount; + if (slot->attachment->type == SP_ATTACHMENT_REGION) { + spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment; + spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices); + verticesCount = 8; + } else if (slot->attachment->type == SP_ATTACHMENT_MESH) { + spMeshAttachment* mesh = (spMeshAttachment*)slot->attachment; + spMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices); + verticesCount = mesh->verticesCount; + } else if (slot->attachment->type == SP_ATTACHMENT_SKINNED_MESH) { + spSkinnedMeshAttachment* mesh = (spSkinnedMeshAttachment*)slot->attachment; + spSkinnedMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices); + verticesCount = mesh->uvsCount; + } else + continue; + for (int ii = 0; ii < verticesCount; ii += 2) { + float x = worldVertices[ii] * scaleX, y = worldVertices[ii + 1] * scaleY; + minX = min(minX, x); + minY = min(minY, y); + maxX = max(maxX, x); + maxY = max(maxY, y); + } } minX = self.position.x + minX; minY = self.position.y + minY; diff --git a/spine-cocos2d-iphone/3.0/src/spine/SkeletonRenderer.m b/spine-cocos2d-iphone/3.0/src/spine/SkeletonRenderer.m index f6bfb468e..130355b84 100644 --- a/spine-cocos2d-iphone/3.0/src/spine/SkeletonRenderer.m +++ b/spine-cocos2d-iphone/3.0/src/spine/SkeletonRenderer.m @@ -267,30 +267,32 @@ static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0}; - (CGRect) boundingBox { float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN; - float scaleX = self.scaleX; - float scaleY = self.scaleY; - float vertices[8]; + float scaleX = self.scaleX, scaleY = self.scaleY; for (int i = 0; i < _skeleton->slotCount; ++i) { spSlot* slot = _skeleton->slots[i]; - if (!slot->attachment || slot->attachment->type != SP_ATTACHMENT_REGION) continue; - spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment; - spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, vertices); - minX = fmin(minX, vertices[SP_VERTEX_X1] * scaleX); - minY = fmin(minY, vertices[SP_VERTEX_Y1] * scaleY); - maxX = fmax(maxX, vertices[SP_VERTEX_X1] * scaleX); - maxY = fmax(maxY, vertices[SP_VERTEX_Y1] * scaleY); - minX = fmin(minX, vertices[SP_VERTEX_X4] * scaleX); - minY = fmin(minY, vertices[SP_VERTEX_Y4] * scaleY); - maxX = fmax(maxX, vertices[SP_VERTEX_X4] * scaleX); - maxY = fmax(maxY, vertices[SP_VERTEX_Y4] * scaleY); - minX = fmin(minX, vertices[SP_VERTEX_X2] * scaleX); - minY = fmin(minY, vertices[SP_VERTEX_Y2] * scaleY); - maxX = fmax(maxX, vertices[SP_VERTEX_X2] * scaleX); - maxY = fmax(maxY, vertices[SP_VERTEX_Y2] * scaleY); - minX = fmin(minX, vertices[SP_VERTEX_X3] * scaleX); - minY = fmin(minY, vertices[SP_VERTEX_Y3] * scaleY); - maxX = fmax(maxX, vertices[SP_VERTEX_X3] * scaleX); - maxY = fmax(maxY, vertices[SP_VERTEX_Y3] * scaleY); + if (!slot->attachment) continue; + int verticesCount; + if (slot->attachment->type == SP_ATTACHMENT_REGION) { + spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment; + spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices); + verticesCount = 8; + } else if (slot->attachment->type == SP_ATTACHMENT_MESH) { + spMeshAttachment* mesh = (spMeshAttachment*)slot->attachment; + spMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices); + verticesCount = mesh->verticesCount; + } else if (slot->attachment->type == SP_ATTACHMENT_SKINNED_MESH) { + spSkinnedMeshAttachment* mesh = (spSkinnedMeshAttachment*)slot->attachment; + spSkinnedMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices); + verticesCount = mesh->uvsCount; + } else + continue; + for (int ii = 0; ii < verticesCount; ii += 2) { + float x = worldVertices[ii] * scaleX, y = worldVertices[ii + 1] * scaleY; + minX = min(minX, x); + minY = min(minY, y); + maxX = max(maxX, x); + maxY = max(maxY, y); + } } minX = self.position.x + minX; minY = self.position.y + minY; diff --git a/spine-cocos2dx/2/src/spine/SkeletonRenderer.cpp b/spine-cocos2dx/2/src/spine/SkeletonRenderer.cpp index 947807b90..934c32238 100644 --- a/spine-cocos2dx/2/src/spine/SkeletonRenderer.cpp +++ b/spine-cocos2dx/2/src/spine/SkeletonRenderer.cpp @@ -266,30 +266,32 @@ CCTexture2D* SkeletonRenderer::getTexture (spSkinnedMeshAttachment* attachment) CCRect SkeletonRenderer::boundingBox () { float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN; - float scaleX = getScaleX(); - float scaleY = getScaleY(); - float vertices[8]; + float scaleX = getScaleX(), scaleY = getScaleY(); for (int i = 0; i < skeleton->slotCount; ++i) { spSlot* slot = skeleton->slots[i]; - if (!slot->attachment || slot->attachment->type != SP_ATTACHMENT_REGION) continue; - spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment; - spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, vertices); - minX = min(minX, vertices[SP_VERTEX_X1] * scaleX); - minY = min(minY, vertices[SP_VERTEX_Y1] * scaleY); - maxX = max(maxX, vertices[SP_VERTEX_X1] * scaleX); - maxY = max(maxY, vertices[SP_VERTEX_Y1] * scaleY); - minX = min(minX, vertices[SP_VERTEX_X4] * scaleX); - minY = min(minY, vertices[SP_VERTEX_Y4] * scaleY); - maxX = max(maxX, vertices[SP_VERTEX_X4] * scaleX); - maxY = max(maxY, vertices[SP_VERTEX_Y4] * scaleY); - minX = min(minX, vertices[SP_VERTEX_X2] * scaleX); - minY = min(minY, vertices[SP_VERTEX_Y2] * scaleY); - maxX = max(maxX, vertices[SP_VERTEX_X2] * scaleX); - maxY = max(maxY, vertices[SP_VERTEX_Y2] * scaleY); - minX = min(minX, vertices[SP_VERTEX_X3] * scaleX); - minY = min(minY, vertices[SP_VERTEX_Y3] * scaleY); - maxX = max(maxX, vertices[SP_VERTEX_X3] * scaleX); - maxY = max(maxY, vertices[SP_VERTEX_Y3] * scaleY); + if (!slot->attachment) continue; + int verticesCount; + if (slot->attachment->type == SP_ATTACHMENT_REGION) { + spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment; + spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices); + verticesCount = 8; + } else if (slot->attachment->type == SP_ATTACHMENT_MESH) { + spMeshAttachment* mesh = (spMeshAttachment*)slot->attachment; + spMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices); + verticesCount = mesh->verticesCount; + } else if (slot->attachment->type == SP_ATTACHMENT_SKINNED_MESH) { + spSkinnedMeshAttachment* mesh = (spSkinnedMeshAttachment*)slot->attachment; + spSkinnedMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices); + verticesCount = mesh->uvsCount; + } else + continue; + for (int ii = 0; ii < verticesCount; ii += 2) { + float x = worldVertices[ii] * scaleX, y = worldVertices[ii + 1] * scaleY; + minX = min(minX, x); + minY = min(minY, y); + maxX = max(maxX, x); + maxY = max(maxY, y); + } } CCPoint position = getPosition(); return CCRect(position.x + minX, position.y + minY, maxX - minX, maxY - minY); diff --git a/spine-cocos2dx/3.0/src/spine/SkeletonRenderer.cpp b/spine-cocos2dx/3.0/src/spine/SkeletonRenderer.cpp index fcdf066ad..1cf0bba73 100644 --- a/spine-cocos2dx/3.0/src/spine/SkeletonRenderer.cpp +++ b/spine-cocos2dx/3.0/src/spine/SkeletonRenderer.cpp @@ -278,30 +278,32 @@ Texture2D* SkeletonRenderer::getTexture (spSkinnedMeshAttachment* attachment) co Rect SkeletonRenderer::boundingBox () { float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN; - float scaleX = getScaleX(); - float scaleY = getScaleY(); - float vertices[8]; + float scaleX = getScaleX(), scaleY = getScaleY(); for (int i = 0; i < skeleton->slotCount; ++i) { spSlot* slot = skeleton->slots[i]; - if (!slot->attachment || slot->attachment->type != SP_ATTACHMENT_REGION) continue; - spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment; - spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, vertices); - minX = min(minX, vertices[SP_VERTEX_X1] * scaleX); - minY = min(minY, vertices[SP_VERTEX_Y1] * scaleY); - maxX = max(maxX, vertices[SP_VERTEX_X1] * scaleX); - maxY = max(maxY, vertices[SP_VERTEX_Y1] * scaleY); - minX = min(minX, vertices[SP_VERTEX_X4] * scaleX); - minY = min(minY, vertices[SP_VERTEX_Y4] * scaleY); - maxX = max(maxX, vertices[SP_VERTEX_X4] * scaleX); - maxY = max(maxY, vertices[SP_VERTEX_Y4] * scaleY); - minX = min(minX, vertices[SP_VERTEX_X2] * scaleX); - minY = min(minY, vertices[SP_VERTEX_Y2] * scaleY); - maxX = max(maxX, vertices[SP_VERTEX_X2] * scaleX); - maxY = max(maxY, vertices[SP_VERTEX_Y2] * scaleY); - minX = min(minX, vertices[SP_VERTEX_X3] * scaleX); - minY = min(minY, vertices[SP_VERTEX_Y3] * scaleY); - maxX = max(maxX, vertices[SP_VERTEX_X3] * scaleX); - maxY = max(maxY, vertices[SP_VERTEX_Y3] * scaleY); + if (!slot->attachment) continue; + int verticesCount; + if (slot->attachment->type == SP_ATTACHMENT_REGION) { + spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment; + spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices); + verticesCount = 8; + } else if (slot->attachment->type == SP_ATTACHMENT_MESH) { + spMeshAttachment* mesh = (spMeshAttachment*)slot->attachment; + spMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices); + verticesCount = mesh->verticesCount; + } else if (slot->attachment->type == SP_ATTACHMENT_SKINNED_MESH) { + spSkinnedMeshAttachment* mesh = (spSkinnedMeshAttachment*)slot->attachment; + spSkinnedMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices); + verticesCount = mesh->uvsCount; + } else + continue; + for (int ii = 0; ii < verticesCount; ii += 2) { + float x = worldVertices[ii] * scaleX, y = worldVertices[ii + 1] * scaleY; + minX = min(minX, x); + minY = min(minY, y); + maxX = max(maxX, x); + maxY = max(maxY, y); + } } Point position = getPosition(); return Rect(position.x + minX, position.y + minY, maxX - minX, maxY - minY); diff --git a/spine-cocos2dx/3.1/src/spine/SkeletonRenderer.cpp b/spine-cocos2dx/3.1/src/spine/SkeletonRenderer.cpp index 0b42d09a2..66c4653c5 100644 --- a/spine-cocos2dx/3.1/src/spine/SkeletonRenderer.cpp +++ b/spine-cocos2dx/3.1/src/spine/SkeletonRenderer.cpp @@ -280,30 +280,32 @@ Texture2D* SkeletonRenderer::getTexture (spSkinnedMeshAttachment* attachment) co Rect SkeletonRenderer::boundingBox () { float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN; - float scaleX = getScaleX(); - float scaleY = getScaleY(); - float vertices[8]; + float scaleX = getScaleX(), scaleY = getScaleY(); for (int i = 0; i < skeleton->slotCount; ++i) { spSlot* slot = skeleton->slots[i]; - if (!slot->attachment || slot->attachment->type != SP_ATTACHMENT_REGION) continue; - spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment; - spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, vertices); - minX = min(minX, vertices[SP_VERTEX_X1] * scaleX); - minY = min(minY, vertices[SP_VERTEX_Y1] * scaleY); - maxX = max(maxX, vertices[SP_VERTEX_X1] * scaleX); - maxY = max(maxY, vertices[SP_VERTEX_Y1] * scaleY); - minX = min(minX, vertices[SP_VERTEX_X4] * scaleX); - minY = min(minY, vertices[SP_VERTEX_Y4] * scaleY); - maxX = max(maxX, vertices[SP_VERTEX_X4] * scaleX); - maxY = max(maxY, vertices[SP_VERTEX_Y4] * scaleY); - minX = min(minX, vertices[SP_VERTEX_X2] * scaleX); - minY = min(minY, vertices[SP_VERTEX_Y2] * scaleY); - maxX = max(maxX, vertices[SP_VERTEX_X2] * scaleX); - maxY = max(maxY, vertices[SP_VERTEX_Y2] * scaleY); - minX = min(minX, vertices[SP_VERTEX_X3] * scaleX); - minY = min(minY, vertices[SP_VERTEX_Y3] * scaleY); - maxX = max(maxX, vertices[SP_VERTEX_X3] * scaleX); - maxY = max(maxY, vertices[SP_VERTEX_Y3] * scaleY); + if (!slot->attachment) continue; + int verticesCount; + if (slot->attachment->type == SP_ATTACHMENT_REGION) { + spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment; + spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices); + verticesCount = 8; + } else if (slot->attachment->type == SP_ATTACHMENT_MESH) { + spMeshAttachment* mesh = (spMeshAttachment*)slot->attachment; + spMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices); + verticesCount = mesh->verticesCount; + } else if (slot->attachment->type == SP_ATTACHMENT_SKINNED_MESH) { + spSkinnedMeshAttachment* mesh = (spSkinnedMeshAttachment*)slot->attachment; + spSkinnedMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices); + verticesCount = mesh->uvsCount; + } else + continue; + for (int ii = 0; ii < verticesCount; ii += 2) { + float x = worldVertices[ii] * scaleX, y = worldVertices[ii + 1] * scaleY; + minX = min(minX, x); + minY = min(minY, y); + maxX = max(maxX, x); + maxY = max(maxY, y); + } } Vector2 position = getPosition(); return Rect(position.x + minX, position.y + minY, maxX - minX, maxY - minY);