Selaa lähdekoodia

Updated boundingBox.

NathanSweet 11 vuotta sitten
vanhempi
commit
99df3bf619

+ 24 - 22
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;

+ 24 - 22
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;

+ 24 - 22
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);

+ 24 - 22
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);

+ 24 - 22
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);