diff --git a/spine-c/include/spine/SlotData.h b/spine-c/include/spine/SlotData.h index 8a200d1e4..b5f3b0672 100644 --- a/spine-c/include/spine/SlotData.h +++ b/spine-c/include/spine/SlotData.h @@ -45,6 +45,7 @@ typedef struct { const BoneData* const boneData; const char* const attachmentName; float r, g, b, a; + int/*bool*/additiveBlending; } SlotData; SlotData* SlotData_create (const char* name, BoneData* boneData); diff --git a/spine-c/src/spine/Animation.c b/spine-c/src/spine/Animation.c index dcb6e6b1e..da304f5e7 100644 --- a/spine-c/src/spine/Animation.c +++ b/spine-c/src/spine/Animation.c @@ -504,8 +504,6 @@ void AttachmentTimeline_setFrame (AttachmentTimeline* self, int frameIndex, floa /**/ -#include - void _DrawOrderTimeline_apply (const Timeline* timeline, Skeleton* skeleton, float time, float alpha) { int i; int frameIndex; diff --git a/spine-c/src/spine/Json.c b/spine-c/src/spine/Json.c index f2ded6ae5..ef19a6915 100644 --- a/spine-c/src/spine/Json.c +++ b/spine-c/src/spine/Json.c @@ -355,5 +355,5 @@ float Json_getFloat (Json* value, const char* name, float defaultValue) { int Json_getInt (Json* value, const char* name, int defaultValue) { value = Json_getItem(value, name); - return value ? (int)value->valueFloat : defaultValue; + return value ? value->valueInt : defaultValue; } diff --git a/spine-c/src/spine/SkeletonJson.c b/spine-c/src/spine/SkeletonJson.c index 038fefb3b..dd958d757 100644 --- a/spine-c/src/spine/SkeletonJson.c +++ b/spine-c/src/spine/SkeletonJson.c @@ -326,6 +326,8 @@ SkeletonData* SkeletonJson_readSkeletonData (SkeletonJson* self, const char* jso boneData->rotation = Json_getFloat(boneMap, "rotation", 0); boneData->scaleX = Json_getFloat(boneMap, "scaleX", 1); boneData->scaleY = Json_getFloat(boneMap, "scaleY", 1); + boneData->inheritScale = Json_getInt(boneMap, "inheritScale", 1); + boneData->inheritRotation = Json_getInt(boneMap, "inheritRotation", 1); skeletonData->bones[i] = boneData; ++skeletonData->boneCount; @@ -360,6 +362,8 @@ SkeletonData* SkeletonJson_readSkeletonData (SkeletonJson* self, const char* jso attachmentItem = Json_getItem(slotMap, "attachment"); if (attachmentItem) SlotData_setAttachmentName(slotData, attachmentItem->valueString); + slotData->additiveBlending = Json_getInt(slotMap, "additive", 0); + skeletonData->slots[i] = slotData; ++skeletonData->slotCount; } diff --git a/spine-sfml/src/spine/spine-sfml.cpp b/spine-sfml/src/spine/spine-sfml.cpp index b101184a1..30338b01f 100644 --- a/spine-sfml/src/spine/spine-sfml.cpp +++ b/spine-sfml/src/spine/spine-sfml.cpp @@ -87,12 +87,22 @@ void SkeletonDrawable::update (float deltaTime) { void SkeletonDrawable::draw (RenderTarget& target, RenderStates states) const { vertexArray->clear(); + states.blendMode = BlendAlpha; + float vertexPositions[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_computeVertices(regionAttachment, slot->skeleton->x, slot->skeleton->y, slot->bone, vertexPositions); Uint8 r = skeleton->r * slot->r * 255;