CCRect CCSkeleton::boundingBox () { float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN; float scaleX = getScaleX(); float scaleY = getScaleY(); float vertices[8]; for (int i = 0; i < skeleton->slotCount; ++i) { Slot* slot = skeleton->slots[i]; if (!slot->attachment || slot->attachment->type != ATTACHMENT_REGION) continue; RegionAttachment* attachment = (RegionAttachment*)slot->attachment; RegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, vertices); minX = min(minX, vertices[VERTEX_X1] * scaleX); minY = min(minY, vertices[VERTEX_Y1] * scaleY); maxX = max(maxX, vertices[VERTEX_X1] * scaleX); maxY = max(maxY, vertices[VERTEX_Y1] * scaleY); minX = min(minX, vertices[VERTEX_X4] * scaleX); minY = min(minY, vertices[VERTEX_Y4] * scaleY); maxX = max(maxX, vertices[VERTEX_X4] * scaleX); maxY = max(maxY, vertices[VERTEX_Y4] * scaleY); minX = min(minX, vertices[VERTEX_X2] * scaleX); minY = min(minY, vertices[VERTEX_Y2] * scaleY); maxX = max(maxX, vertices[VERTEX_X2] * scaleX); maxY = max(maxY, vertices[VERTEX_Y2] * scaleY); minX = min(minX, vertices[VERTEX_X3] * scaleX); minY = min(minY, vertices[VERTEX_Y3] * scaleY); maxX = max(maxX, vertices[VERTEX_X3] * scaleX); maxY = max(maxY, vertices[VERTEX_Y3] * scaleY); } CCPoint position = getPosition(); return CCRectMake(position.x + minX, position.y + minY, maxX - minX, maxY - minY); }
void SkeletonDrawable::draw (RenderTarget& target, RenderStates states) const { vertexArray->clear(); states.blendMode = BlendAlpha; float worldVertices[8]; for (int i = 0; i < skeleton->slotCount; ++i) { Slot* slot = skeleton->drawOrder[i]; Attachment* attachment = slot->attachment; if (!attachment || attachment->type != ATTACHMENT_REGION) continue; RegionAttachment* regionAttachment = (RegionAttachment*)attachment; BlendMode blend = slot->data->additiveBlending ? BlendAdd : BlendAlpha; if (states.blendMode != blend) { target.draw(*vertexArray, states); vertexArray->clear(); states.blendMode = blend; } RegionAttachment_computeWorldVertices(regionAttachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices); Uint8 r = skeleton->r * slot->r * 255; Uint8 g = skeleton->g * slot->g * 255; Uint8 b = skeleton->b * slot->b * 255; Uint8 a = skeleton->a * slot->a * 255; sf::Vertex vertices[4]; vertices[0].color.r = r; vertices[0].color.g = g; vertices[0].color.b = b; vertices[0].color.a = a; vertices[1].color.r = r; vertices[1].color.g = g; vertices[1].color.b = b; vertices[1].color.a = a; vertices[2].color.r = r; vertices[2].color.g = g; vertices[2].color.b = b; vertices[2].color.a = a; vertices[3].color.r = r; vertices[3].color.g = g; vertices[3].color.b = b; vertices[3].color.a = a; vertices[0].position.x = worldVertices[VERTEX_X1]; vertices[0].position.y = worldVertices[VERTEX_Y1]; vertices[1].position.x = worldVertices[VERTEX_X2]; vertices[1].position.y = worldVertices[VERTEX_Y2]; vertices[2].position.x = worldVertices[VERTEX_X3]; vertices[2].position.y = worldVertices[VERTEX_Y3]; vertices[3].position.x = worldVertices[VERTEX_X4]; vertices[3].position.y = worldVertices[VERTEX_Y4]; // SMFL doesn't handle batching for us, so we'll just force a single texture per skeleton. states.texture = (Texture*)((AtlasRegion*)regionAttachment->rendererObject)->page->rendererObject; Vector2u size = states.texture->getSize(); vertices[0].texCoords.x = regionAttachment->uvs[VERTEX_X1] * size.x; vertices[0].texCoords.y = regionAttachment->uvs[VERTEX_Y1] * size.y; vertices[1].texCoords.x = regionAttachment->uvs[VERTEX_X2] * size.x; vertices[1].texCoords.y = regionAttachment->uvs[VERTEX_Y2] * size.y; vertices[2].texCoords.x = regionAttachment->uvs[VERTEX_X3] * size.x; vertices[2].texCoords.y = regionAttachment->uvs[VERTEX_Y3] * size.y; vertices[3].texCoords.x = regionAttachment->uvs[VERTEX_X4] * size.x; vertices[3].texCoords.y = regionAttachment->uvs[VERTEX_Y4] * size.y; vertexArray->append(vertices[0]); vertexArray->append(vertices[1]); vertexArray->append(vertices[2]); vertexArray->append(vertices[3]); } target.draw(*vertexArray, states); }