diff --git a/spine-cpp/spine-cpp/include/spine/Bone.h b/spine-cpp/spine-cpp/include/spine/Bone.h index f3d157a33..b42b28d04 100644 --- a/spine-cpp/spine-cpp/include/spine/Bone.h +++ b/spine-cpp/spine-cpp/include/spine/Bone.h @@ -30,6 +30,7 @@ #ifndef Spine_Bone_h #define Spine_Bone_h +#include #include #include #include @@ -42,7 +43,7 @@ namespace spine { /// A bone has a local transform which is used to compute its world transform. A bone also has an applied transform, which is a /// local transform that can be applied to compute the world transform. The local transform and applied transform may differ if a /// constraint or application code modifies the world transform after it was computed from the local transform. - class SP_API Bone : public PosedActiveGeneric { + class SP_API Bone : public PosedGeneric, public PosedActive { friend class AnimationState; friend class RotateTimeline; friend class IkConstraint; diff --git a/spine-cpp/spine-cpp/include/spine/Constraint.h b/spine-cpp/spine-cpp/include/spine/Constraint.h index d56face6e..664129a13 100644 --- a/spine-cpp/spine-cpp/include/spine/Constraint.h +++ b/spine-cpp/spine-cpp/include/spine/Constraint.h @@ -30,6 +30,7 @@ #ifndef Spine_Constraint_h #define Spine_Constraint_h +#include #include #include #include @@ -38,35 +39,50 @@ namespace spine { class Skeleton; - class SP_API Constraint: public Update { + class SP_API Constraint : public Update { RTTI_DECL_NOPARENT - public: - Constraint(); - virtual ~Constraint(); - - ConstraintData &getData(); - }; - - template - class SP_API ConstraintGeneric : public PosedActiveGeneric, public Constraint { - RTTI_DECL - + friend class Skeleton; + public: - ConstraintGeneric(D& data) : PosedActiveGeneric(data), Constraint() { - } + Constraint(); + virtual ~Constraint(); - virtual ~ConstraintGeneric() { - } + virtual ConstraintData &getData() = 0; - virtual void sort(Skeleton& skeleton) = 0; + virtual void sort(Skeleton &skeleton) = 0; virtual bool isSourceActive() { return true; } + + virtual void pose() = 0; // Inherited from Update - virtual void update(Skeleton& skeleton, Physics physics) override = 0; + virtual void update(Skeleton &skeleton, Physics physics) override = 0; + + protected: + bool _active; }; -} + + template + class SP_API ConstraintGeneric : public PosedGeneric, public PosedActive, public Constraint { + RTTI_DECL + + public: + ConstraintGeneric(D &data) : PosedGeneric(data), PosedActive(), Constraint() { + } + + virtual ~ConstraintGeneric() { + } + + virtual ConstraintData &getData() override { + return PosedGeneric::getData(); + } + + virtual void pose() override { + PosedGeneric::pose(); + } + }; +}// namespace spine #endif /* Spine_Constraint_h */ \ No newline at end of file diff --git a/spine-cpp/spine-cpp/include/spine/ConstraintData.h b/spine-cpp/spine-cpp/include/spine/ConstraintData.h index 1622fa08f..af775b23b 100644 --- a/spine-cpp/spine-cpp/include/spine/ConstraintData.h +++ b/spine-cpp/spine-cpp/include/spine/ConstraintData.h @@ -30,12 +30,13 @@ #ifndef Spine_ConstraintData_h #define Spine_ConstraintData_h -#include #include +#include #include namespace spine { class Skeleton; + class Constraint; /// Base class for all constraint data types. class SP_API ConstraintData : public SpineObject { @@ -44,25 +45,12 @@ namespace spine { ConstraintData(const String &name); virtual ~ConstraintData(); const String &getName() const; + + virtual Constraint* create(Skeleton& skeleton) = 0; + private: String _name; }; - - /// Generic base class for all constraint data. - template - class SP_API ConstraintDataGeneric : public PosedDataGeneric

, public ConstraintData { - friend class SkeletonBinary; - friend class SkeletonJson; - - public: - ConstraintDataGeneric(const String &name) : PosedDataGeneric

(name), ConstraintData(name) { - } - virtual ~ConstraintDataGeneric() { - } - - /// Creates a constraint instance. - virtual T* create(Skeleton& skeleton) = 0; - }; } #endif /* Spine_ConstraintData_h */ diff --git a/spine-cpp/spine-cpp/include/spine/IkConstraintData.h b/spine-cpp/spine-cpp/include/spine/IkConstraintData.h index 7f1a44bab..6eecedec4 100644 --- a/spine-cpp/spine-cpp/include/spine/IkConstraintData.h +++ b/spine-cpp/spine-cpp/include/spine/IkConstraintData.h @@ -34,13 +34,14 @@ #include #include #include +#include #include namespace spine { class BoneData; class IkConstraint; - class SP_API IkConstraintData : public ConstraintDataGeneric { + class SP_API IkConstraintData : public ConstraintData, public PosedDataGeneric { friend class SkeletonBinary; friend class SkeletonJson; @@ -55,6 +56,8 @@ namespace spine { public: explicit IkConstraintData(const String &name); + + virtual Constraint* create(Skeleton& skeleton) override; /// The bones that are constrained by this IK Constraint. Vector &getBones(); diff --git a/spine-cpp/spine-cpp/include/spine/PathConstraintData.h b/spine-cpp/spine-cpp/include/spine/PathConstraintData.h index 31a4e7216..85498a0d5 100644 --- a/spine-cpp/spine-cpp/include/spine/PathConstraintData.h +++ b/spine-cpp/spine-cpp/include/spine/PathConstraintData.h @@ -31,6 +31,7 @@ #define Spine_PathConstraintData_h #include +#include #include #include #include @@ -47,7 +48,7 @@ namespace spine { /// Stores the setup pose for a PathConstraint. /// /// See https://esotericsoftware.com/spine-path-constraints Path constraints in the Spine User Guide. - class SP_API PathConstraintData : public ConstraintDataGeneric { + class SP_API PathConstraintData : public ConstraintData, public PosedDataGeneric { friend class SkeletonBinary; friend class SkeletonJson; @@ -66,6 +67,8 @@ namespace spine { public: explicit PathConstraintData(const String &name); + + virtual Constraint* create(Skeleton& skeleton) override; /// The bones that will be modified by this path constraint. diff --git a/spine-cpp/spine-cpp/include/spine/PhysicsConstraintData.h b/spine-cpp/spine-cpp/include/spine/PhysicsConstraintData.h index 6f07d2c9b..d53f30644 100644 --- a/spine-cpp/spine-cpp/include/spine/PhysicsConstraintData.h +++ b/spine-cpp/spine-cpp/include/spine/PhysicsConstraintData.h @@ -31,6 +31,7 @@ #define Spine_PhysicsConstraintData_h #include +#include #include namespace spine { @@ -40,7 +41,7 @@ namespace spine { /// Stores the setup pose for a PhysicsConstraint. /// /// See https://esotericsoftware.com/spine-physics-constraints Physics constraints in the Spine User Guide. - class SP_API PhysicsConstraintData : public ConstraintDataGeneric { + class SP_API PhysicsConstraintData : public ConstraintData, public PosedDataGeneric { friend class SkeletonBinary; friend class SkeletonJson; friend class PhysicsConstraint; @@ -49,6 +50,8 @@ namespace spine { RTTI_DECL public: explicit PhysicsConstraintData(const String &name); + + virtual Constraint* create(Skeleton& skeleton) override; /// The bone constrained by this physics constraint. BoneData* getBone(); diff --git a/spine-cpp/spine-cpp/include/spine/PosedActive.h b/spine-cpp/spine-cpp/include/spine/PosedActive.h index 1a5a7a8d7..325632219 100644 --- a/spine-cpp/spine-cpp/include/spine/PosedActive.h +++ b/spine-cpp/spine-cpp/include/spine/PosedActive.h @@ -1,8 +1,8 @@ /****************************************************************************** * Spine Runtimes License Agreement - * Last updated January 1, 2020. Replaces all prior versions. + * Last updated April 5, 2025. Replaces all prior versions. * - * Copyright (c) 2013-2020, Esoteric Software LLC + * Copyright (c) 2013-2025, Esoteric Software LLC * * Integration of the Spine Runtimes into software or otherwise creating * derivative works of the Spine Runtimes is permitted under the terms and @@ -27,31 +27,24 @@ * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ -#ifndef SPINE_POSEDACTIVE_H_ -#define SPINE_POSEDACTIVE_H_ +#ifndef Spine_PosedActive_h +#define Spine_PosedActive_h #include -#include namespace spine { - - template - class SP_API PosedActiveGeneric : public PosedGeneric { - friend class SlotCurveTimeline; - - public: - PosedActiveGeneric(D &data): PosedGeneric(data), _active(false) { - this->setupPose(); - } - virtual ~PosedActiveGeneric() {} - - bool isActive() { - return _active; - } - + /// Simple mixin class that adds active state tracking + class SP_API PosedActive { protected: bool _active; - }; -}// namespace spine -#endif /* SPINE_POSEDACTIVE_H_ */ \ No newline at end of file + public: + PosedActive() : _active(true) {} + virtual ~PosedActive() {} + + bool isActive() const { return _active; } + void setActive(bool active) { _active = active; } + }; +} + +#endif /* Spine_PosedActive_h */ \ No newline at end of file diff --git a/spine-cpp/spine-cpp/include/spine/PosedData.h b/spine-cpp/spine-cpp/include/spine/PosedData.h index 415632787..62ec893b3 100644 --- a/spine-cpp/spine-cpp/include/spine/PosedData.h +++ b/spine-cpp/spine-cpp/include/spine/PosedData.h @@ -71,7 +71,7 @@ namespace spine { /// contains this constraint. /// /// See Skin::getConstraints(). - bool getSkinRequired() { return _skinRequired; }; + bool isSkinRequired() { return _skinRequired; }; void setSkinRequired(bool skinRequired) { _skinRequired = skinRequired; }; protected: diff --git a/spine-cpp/spine-cpp/include/spine/SliderData.h b/spine-cpp/spine-cpp/include/spine/SliderData.h index ddca0cdee..ad53a898d 100644 --- a/spine-cpp/spine-cpp/include/spine/SliderData.h +++ b/spine-cpp/spine-cpp/include/spine/SliderData.h @@ -31,6 +31,7 @@ #define Spine_SliderData_h #include +#include #include #include @@ -44,7 +45,7 @@ namespace spine { /// Stores the setup pose for a PhysicsConstraint. /// /// See https://esotericsoftware.com/spine-physics-constraints Physics constraints in the Spine User Guide. - class SP_API SliderData : public ConstraintDataGeneric { + class SP_API SliderData : public ConstraintData, public PosedDataGeneric { friend class SkeletonBinary; friend class SkeletonJson; friend class Slider; @@ -55,7 +56,7 @@ namespace spine { explicit SliderData(const String &name); /// Creates a slider instance. - virtual Slider* create(Skeleton& skeleton) override; + virtual Constraint* create(Skeleton& skeleton) override; Animation* getAnimation(); void setAnimation(Animation* animation); diff --git a/spine-cpp/spine-cpp/include/spine/TransformConstraintData.h b/spine-cpp/spine-cpp/include/spine/TransformConstraintData.h index 209581cc8..0d3fa8ea1 100644 --- a/spine-cpp/spine-cpp/include/spine/TransformConstraintData.h +++ b/spine-cpp/spine-cpp/include/spine/TransformConstraintData.h @@ -31,6 +31,7 @@ #define Spine_TransformConstraintData_h #include +#include #include #include @@ -149,7 +150,7 @@ namespace spine { /// Stores the setup pose for a TransformConstraint. /// /// See https://esotericsoftware.com/spine-transform-constraints Transform constraints in the Spine User Guide. - class SP_API TransformConstraintData : public ConstraintDataGeneric { + class SP_API TransformConstraintData : public ConstraintData, public PosedDataGeneric { public: RTTI_DECL static const int ROTATION = 0, X = 1, Y = 2, SCALEX = 3, SCALEY = 4, SHEARY = 5; @@ -162,6 +163,8 @@ namespace spine { public: explicit TransformConstraintData(const String &name); ~TransformConstraintData(); + + virtual Constraint* create(Skeleton& skeleton) override; /// The bones that will be modified by this transform constraint. Vector& getBones(); diff --git a/spine-cpp/spine-cpp/src/spine/Bone.cpp b/spine-cpp/spine-cpp/src/spine/Bone.cpp index 134462115..1b9f6effa 100644 --- a/spine-cpp/spine-cpp/src/spine/Bone.cpp +++ b/spine-cpp/spine-cpp/src/spine/Bone.cpp @@ -36,7 +36,8 @@ using namespace spine; RTTI_IMPL_NOPARENT(Bone) -Bone::Bone(BoneData &data, Bone *parent) : PosedActiveGeneric(data), +Bone::Bone(BoneData &data, Bone *parent) : PosedGeneric(data), + PosedActive(), _parent(parent), _children(), _sorted(false) { diff --git a/spine-cpp/spine-cpp/src/spine/IkConstraintData.cpp b/spine-cpp/spine-cpp/src/spine/IkConstraintData.cpp index 316bdad1e..889b3f9a9 100644 --- a/spine-cpp/spine-cpp/src/spine/IkConstraintData.cpp +++ b/spine-cpp/spine-cpp/src/spine/IkConstraintData.cpp @@ -28,14 +28,16 @@ *****************************************************************************/ #include - +#include #include +#include using namespace spine; RTTI_IMPL(IkConstraintData, ConstraintData) -IkConstraintData::IkConstraintData(const String &name) : ConstraintDataGeneric(name), +IkConstraintData::IkConstraintData(const String &name) : ConstraintData(name), + PosedDataGeneric(name), _target(NULL), _uniform(false) { } @@ -58,4 +60,8 @@ bool IkConstraintData::getUniform() { void IkConstraintData::setUniform(bool uniform) { _uniform = uniform; +} + +Constraint* IkConstraintData::create(Skeleton& skeleton) { + return new (__FILE__, __LINE__) IkConstraint(*this, skeleton); } \ No newline at end of file diff --git a/spine-cpp/spine-cpp/src/spine/PathConstraintData.cpp b/spine-cpp/spine-cpp/src/spine/PathConstraintData.cpp index 6df5a564a..8722684a4 100644 --- a/spine-cpp/spine-cpp/src/spine/PathConstraintData.cpp +++ b/spine-cpp/spine-cpp/src/spine/PathConstraintData.cpp @@ -28,6 +28,7 @@ *****************************************************************************/ #include +#include #include #include #include @@ -36,7 +37,8 @@ using namespace spine; RTTI_IMPL(PathConstraintData, ConstraintData) -PathConstraintData::PathConstraintData(const String &name) : ConstraintDataGeneric(name), +PathConstraintData::PathConstraintData(const String &name) : ConstraintData(name), + PosedDataGeneric(name), _slot(NULL), _positionMode(PositionMode_Fixed), _spacingMode(SpacingMode_Length), @@ -87,4 +89,8 @@ float PathConstraintData::getOffsetRotation() { void PathConstraintData::setOffsetRotation(float offsetRotation) { _offsetRotation = offsetRotation; +} + +Constraint* PathConstraintData::create(Skeleton& skeleton) { + return new (__FILE__, __LINE__) PathConstraint(*this, skeleton); } \ No newline at end of file diff --git a/spine-cpp/spine-cpp/src/spine/PhysicsConstraintData.cpp b/spine-cpp/spine-cpp/src/spine/PhysicsConstraintData.cpp index 2a8c67bbe..1e71d3901 100644 --- a/spine-cpp/spine-cpp/src/spine/PhysicsConstraintData.cpp +++ b/spine-cpp/spine-cpp/src/spine/PhysicsConstraintData.cpp @@ -28,13 +28,16 @@ *****************************************************************************/ #include +#include #include +#include using namespace spine; RTTI_IMPL(PhysicsConstraintData, ConstraintData) -PhysicsConstraintData::PhysicsConstraintData(const String &name) : ConstraintDataGeneric(name), +PhysicsConstraintData::PhysicsConstraintData(const String &name) : ConstraintData(name), + PosedDataGeneric(name), _bone(NULL), _x(0), _y(0), _rotate(0), _scaleX(0), _shearX(0), _limit(0), _step(0), _inertiaGlobal(false), _strengthGlobal(false), _dampingGlobal(false), _massGlobal(false), @@ -159,4 +162,8 @@ bool PhysicsConstraintData::getMixGlobal() { void PhysicsConstraintData::setMixGlobal(bool mixGlobal) { _mixGlobal = mixGlobal; +} + +Constraint* PhysicsConstraintData::create(Skeleton& skeleton) { + return new (__FILE__, __LINE__) PhysicsConstraint(*this, skeleton); } \ No newline at end of file diff --git a/spine-cpp/spine-cpp/src/spine/SliderData.cpp b/spine-cpp/spine-cpp/src/spine/SliderData.cpp index 9ec1142f9..800789747 100644 --- a/spine-cpp/spine-cpp/src/spine/SliderData.cpp +++ b/spine-cpp/spine-cpp/src/spine/SliderData.cpp @@ -35,7 +35,8 @@ using namespace spine; RTTI_IMPL(SliderData, ConstraintData) -SliderData::SliderData(const String &name) : ConstraintDataGeneric(name), +SliderData::SliderData(const String &name) : ConstraintData(name), + PosedDataGeneric(name), _animation(NULL), _additive(false), _loop(false), @@ -45,7 +46,7 @@ SliderData::SliderData(const String &name) : ConstraintDataGeneric_bone._active) apply(*slot, appliedPose ? *slot->_applied : slot->_pose, time, alpha, blend); + if (slot->_bone.isActive()) apply(*slot, appliedPose ? *slot->_applied : slot->_pose, time, alpha, blend); } \ No newline at end of file diff --git a/spine-cpp/spine-cpp/src/spine/TransformConstraintData.cpp b/spine-cpp/spine-cpp/src/spine/TransformConstraintData.cpp index 45267ec39..0a0c64338 100644 --- a/spine-cpp/spine-cpp/src/spine/TransformConstraintData.cpp +++ b/spine-cpp/spine-cpp/src/spine/TransformConstraintData.cpp @@ -28,17 +28,20 @@ *****************************************************************************/ #include +#include #include #include #include #include #include +#include using namespace spine; RTTI_IMPL(TransformConstraintData, ConstraintData) -TransformConstraintData::TransformConstraintData(const String &name) : ConstraintDataGeneric(name), +TransformConstraintData::TransformConstraintData(const String &name) : ConstraintData(name), + PosedDataGeneric(name), _source(NULL), _localSource(false), _localTarget(false), @@ -353,4 +356,8 @@ TransformConstraintData::~TransformConstraintData() { } } _properties.clear(); +} + +Constraint* TransformConstraintData::create(Skeleton& skeleton) { + return new (__FILE__, __LINE__) TransformConstraint(*this, skeleton); } \ No newline at end of file