diff --git a/spine-cpp/spine-cpp/include/spine/BoneLocal.h b/spine-cpp/spine-cpp/include/spine/BoneLocal.h index 35f0a6d01..e9969eeab 100644 --- a/spine-cpp/spine-cpp/include/spine/BoneLocal.h +++ b/spine-cpp/spine-cpp/include/spine/BoneLocal.h @@ -38,6 +38,9 @@ namespace spine { /// Stores a bone's local pose. class SP_API BoneLocal : public Pose { + friend class BoneTimeline1; + friend class RotateTimeline; + RTTI_DECL protected: diff --git a/spine-cpp/spine-cpp/include/spine/BoneTimeline.h b/spine-cpp/spine-cpp/include/spine/BoneTimeline.h index 9ea945c01..cc1664469 100644 --- a/spine-cpp/spine-cpp/include/spine/BoneTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/BoneTimeline.h @@ -31,8 +31,13 @@ #define Spine_BoneTimeline_h #include +#include namespace spine { + class Skeleton; + class Event; + class BoneLocal; + /// An interface for timelines which change the property of a bone. class SP_API BoneTimeline { public: @@ -42,6 +47,33 @@ namespace spine { /// The index of the bone in Skeleton::getBones() that will be changed when this timeline is applied. virtual int getBoneIndex() = 0; }; + + /// Base class for timelines that animate a single bone property. + class SP_API BoneTimeline1 : public CurveTimeline1, public BoneTimeline { + friend class SkeletonBinary; + friend class SkeletonJson; + friend class AnimationState; + + RTTI_DECL + + public: + BoneTimeline1(size_t frameCount, size_t bezierCount, int boneIndex, Property property); + + virtual void + apply(Skeleton &skeleton, float lastTime, float time, Vector *pEvents, float alpha, MixBlend blend, + MixDirection direction, bool appliedPose) override; + + virtual int getBoneIndex() override { return _boneIndex; } + + void setBoneIndex(int inValue) { _boneIndex = inValue; } + + protected: + /// Applies changes to the pose based on the timeline values. + virtual void apply(BoneLocal &pose, BoneLocal &setup, float time, float alpha, MixBlend blend, + MixDirection direction) = 0; + + int _boneIndex; + }; } #endif \ No newline at end of file diff --git a/spine-cpp/spine-cpp/include/spine/Posed.h b/spine-cpp/spine-cpp/include/spine/Posed.h index 1f1d5ffbf..ea298421f 100644 --- a/spine-cpp/spine-cpp/include/spine/Posed.h +++ b/spine-cpp/spine-cpp/include/spine/Posed.h @@ -37,6 +37,7 @@ namespace spine { template class SP_API Posed : public SpineObject { friend class AnimationState; + friend class BoneTimeline1; friend class RotateTimeline; friend class IkConstraint; friend class TransformConstraint; diff --git a/spine-cpp/spine-cpp/include/spine/PosedData.h b/spine-cpp/spine-cpp/include/spine/PosedData.h index b3aa8ad4b..b8f07a4e9 100644 --- a/spine-cpp/spine-cpp/include/spine/PosedData.h +++ b/spine-cpp/spine-cpp/include/spine/PosedData.h @@ -42,6 +42,24 @@ namespace spine { class SP_API PosedData : public SpineObject { friend class SkeletonBinary; friend class SkeletonJson; + friend class BoneTimeline1; + friend class RotateTimeline; + friend class AttachmentTimeline; + friend class RGBATimeline; + friend class RGBTimeline; + friend class AlphaTimeline; + friend class RGBA2Timeline; + friend class RGB2Timeline; + friend class ScaleTimeline; + friend class ScaleXTimeline; + friend class ScaleYTimeline; + friend class ShearTimeline; + friend class ShearXTimeline; + friend class ShearYTimeline; + friend class TranslateTimeline; + friend class TranslateXTimeline; + friend class TranslateYTimeline; + friend class InheritTimeline; private: spine::String _name; diff --git a/spine-cpp/spine-cpp/include/spine/RotateTimeline.h b/spine-cpp/spine-cpp/include/spine/RotateTimeline.h index 89b8621f9..086217fb3 100644 --- a/spine-cpp/spine-cpp/include/spine/RotateTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/RotateTimeline.h @@ -30,10 +30,11 @@ #ifndef Spine_RotateTimeline_h #define Spine_RotateTimeline_h -#include +#include namespace spine { - class SP_API RotateTimeline : public CurveTimeline1 { + /// Changes a bone's local rotation. + class SP_API RotateTimeline : public BoneTimeline1 { friend class SkeletonBinary; friend class SkeletonJson; @@ -45,16 +46,9 @@ namespace spine { public: explicit RotateTimeline(size_t frameCount, size_t bezierCount, int boneIndex); - virtual void - apply(Skeleton &skeleton, float lastTime, float time, Vector *pEvents, float alpha, MixBlend blend, - MixDirection direction); - - int getBoneIndex() { return _boneIndex; } - - void setBoneIndex(int inValue) { _boneIndex = inValue; } - - private: - int _boneIndex; + protected: + virtual void apply(BoneLocal &pose, BoneLocal &setup, float time, float alpha, MixBlend blend, + MixDirection direction) override; }; } diff --git a/spine-cpp/spine-cpp/include/spine/Skeleton.h b/spine-cpp/spine-cpp/include/spine/Skeleton.h index 82304d6a9..cb97aba92 100644 --- a/spine-cpp/spine-cpp/include/spine/Skeleton.h +++ b/spine-cpp/spine-cpp/include/spine/Skeleton.h @@ -107,6 +107,8 @@ namespace spine { friend class TransformConstraintTimeline; + friend class BoneTimeline1; + friend class RotateTimeline; friend class TranslateTimeline; diff --git a/spine-cpp/spine-cpp/src/spine/BoneTimeline.cpp b/spine-cpp/spine-cpp/src/spine/BoneTimeline.cpp index fae0dd334..a56ee4023 100644 --- a/spine-cpp/spine-cpp/src/spine/BoneTimeline.cpp +++ b/spine-cpp/spine-cpp/src/spine/BoneTimeline.cpp @@ -29,10 +29,36 @@ #include +#include +#include +#include +#include +#include +#include + using namespace spine; BoneTimeline::BoneTimeline() { } BoneTimeline::~BoneTimeline() { +} + +RTTI_IMPL(BoneTimeline1, CurveTimeline1) + +BoneTimeline1::BoneTimeline1(size_t frameCount, size_t bezierCount, int boneIndex, Property property) : + CurveTimeline1(frameCount, bezierCount), _boneIndex(boneIndex) { + PropertyId ids[] = {((PropertyId) property << 32) | boneIndex}; + setPropertyIds(ids, 1); +} + +void BoneTimeline1::apply(Skeleton &skeleton, float lastTime, float time, Vector *pEvents, float alpha, + MixBlend blend, MixDirection direction, bool appliedPose) { + SP_UNUSED(lastTime); + SP_UNUSED(pEvents); + + Bone *bone = skeleton._bones[_boneIndex]; + if (bone->isActive()) { + apply(appliedPose ? *bone->_applied : bone->_pose, *bone->_data._setup, time, alpha, blend, direction); + } } \ No newline at end of file diff --git a/spine-cpp/spine-cpp/src/spine/RotateTimeline.cpp b/spine-cpp/spine-cpp/src/spine/RotateTimeline.cpp index 4c53f3010..50ef5d8b6 100644 --- a/spine-cpp/spine-cpp/src/spine/RotateTimeline.cpp +++ b/spine-cpp/spine-cpp/src/spine/RotateTimeline.cpp @@ -29,31 +29,18 @@ #include -#include -#include - -#include -#include -#include -#include +#include using namespace spine; -RTTI_IMPL(RotateTimeline, CurveTimeline1) +RTTI_IMPL(RotateTimeline, BoneTimeline1) -RotateTimeline::RotateTimeline(size_t frameCount, size_t bezierCount, int boneIndex) : CurveTimeline1(frameCount, - bezierCount), - _boneIndex(boneIndex) { - PropertyId ids[] = {((PropertyId) Property_Rotate << 32) | boneIndex}; - setPropertyIds(ids, 1); +RotateTimeline::RotateTimeline(size_t frameCount, size_t bezierCount, int boneIndex) : + BoneTimeline1(frameCount, bezierCount, boneIndex, Property_Rotate) { } -void RotateTimeline::apply(Skeleton &skeleton, float lastTime, float time, Vector *pEvents, float alpha, - MixBlend blend, MixDirection direction) { - SP_UNUSED(lastTime); - SP_UNUSED(pEvents); +void RotateTimeline::apply(BoneLocal &pose, BoneLocal &setup, float time, float alpha, MixBlend blend, + MixDirection direction) { SP_UNUSED(direction); - - Bone *bone = skeleton._bones[_boneIndex]; - if (bone->isActive()) bone->_rotation = getRelativeValue(time, alpha, blend, bone->_rotation, bone->getData()._rotation); -} + pose._rotation = getRelativeValue(time, alpha, blend, pose._rotation, setup._rotation); +} \ No newline at end of file