diff --git a/spine-cpp/spine-cpp/include/spine/DrawOrderTimeline.h b/spine-cpp/spine-cpp/include/spine/DrawOrderTimeline.h index 7d2ab5544..2f1b9ea40 100644 --- a/spine-cpp/spine-cpp/include/spine/DrawOrderTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/DrawOrderTimeline.h @@ -33,6 +33,7 @@ #include namespace spine { + /// Changes a skeleton's Skeleton::getDrawOrder(). class SP_API DrawOrderTimeline : public Timeline { friend class SkeletonBinary; @@ -45,14 +46,19 @@ namespace spine { virtual void apply(Skeleton &skeleton, float lastTime, float time, Vector *pEvents, float alpha, MixBlend blend, - MixDirection direction); + MixDirection direction, bool appliedPose); - /// Sets the time and value of the specified keyframe. - /// @param drawOrder May be NULL to use bind pose draw order - void setFrame(size_t frame, float time, Vector &drawOrder); + size_t getFrameCount(); + /// The draw order for each frame. See setFrame(). Vector > &getDrawOrders(); + /// Sets the time and draw order for the specified frame. + /// @param frame Between 0 and frameCount, inclusive. + /// @param time The frame time in seconds. + /// @param drawOrder For each slot in Skeleton::slots, the index of the slot in the new draw order. May be null to use setup pose draw order. + void setFrame(size_t frame, float time, Vector *drawOrder); + private: Vector > _drawOrders; }; diff --git a/spine-cpp/spine-cpp/src/spine/DrawOrderTimeline.cpp b/spine-cpp/spine-cpp/src/spine/DrawOrderTimeline.cpp index 2708d25d8..3a560435a 100644 --- a/spine-cpp/spine-cpp/src/spine/DrawOrderTimeline.cpp +++ b/spine-cpp/spine-cpp/src/spine/DrawOrderTimeline.cpp @@ -53,7 +53,8 @@ DrawOrderTimeline::DrawOrderTimeline(size_t frameCount) : Timeline(frameCount, 1 } void DrawOrderTimeline::apply(Skeleton &skeleton, float lastTime, float time, Vector *pEvents, float alpha, - MixBlend blend, MixDirection direction) { + MixBlend blend, MixDirection direction, bool appliedPose) { + SP_UNUSED(appliedPose); SP_UNUSED(lastTime); SP_UNUSED(pEvents); SP_UNUSED(alpha); @@ -83,18 +84,27 @@ void DrawOrderTimeline::apply(Skeleton &skeleton, float lastTime, float time, Ve Vector &drawOrderToSetupIndex = _drawOrders[Animation::search(_frames, time)]; if (drawOrderToSetupIndex.size() == 0) { drawOrder.clear(); + drawOrder.ensureCapacity(slots.size()); for (size_t i = 0, n = slots.size(); i < n; ++i) drawOrder.add(slots[i]); } else { + drawOrder.clear(); + drawOrder.ensureCapacity(drawOrderToSetupIndex.size()); for (size_t i = 0, n = drawOrderToSetupIndex.size(); i < n; ++i) - drawOrder[i] = slots[drawOrderToSetupIndex[i]]; + drawOrder.add(slots[drawOrderToSetupIndex[i]]); } } -void DrawOrderTimeline::setFrame(size_t frame, float time, Vector &drawOrder) { +void DrawOrderTimeline::setFrame(size_t frame, float time, Vector *drawOrder) { _frames[frame] = time; _drawOrders[frame].clear(); - _drawOrders[frame].addAll(drawOrder); + if (drawOrder != NULL) { + _drawOrders[frame].addAll(*drawOrder); + } +} + +size_t DrawOrderTimeline::getFrameCount() { + return _frames.size(); } Vector> &DrawOrderTimeline::getDrawOrders() {