From e02f8b7a1cdb4634d13859e7b00037b5230311a4 Mon Sep 17 00:00:00 2001 From: badlogic Date: Tue, 29 Aug 2017 11:37:19 +0200 Subject: [PATCH 01/10] [ue4] Updated to 4.17, fixed build system, fixed c++ example. Closes --- spine-ue4/Content/GettingStarted/06-cpp.umap | Bin 20039 -> 23402 bytes .../RuntimeMeshComponent.Build.cs | 2 +- .../RuntimeMeshComponentEditor.Build.cs | 2 +- spine-ue4/Source/SpineUE4.Target.cs | 18 +++--------------- spine-ue4/Source/SpineUE4Editor.Target.cs | 16 ++-------------- spine-ue4/SpineUE4.uproject | 2 +- 6 files changed, 8 insertions(+), 32 deletions(-) diff --git a/spine-ue4/Content/GettingStarted/06-cpp.umap b/spine-ue4/Content/GettingStarted/06-cpp.umap index fddce8eb580b694b74ba38551b9f0a1ad4174c6f..254e33eb2ccfb2d53b54b91f16706eb5d1d7f623 100644 GIT binary patch literal 23402 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 Q&ff?a$pGal`d_yH2MCBgs{jB1 literal 20039 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 OutBuildBinaryConfigurations, - ref List OutExtraModuleNames - ) - { - OutExtraModuleNames.AddRange( new string[] { "SpineUE4" } ); + Type = TargetType.Game; + ExtraModuleNames.AddRange(new string[] { "SpineUE4" }); } } diff --git a/spine-ue4/Source/SpineUE4Editor.Target.cs b/spine-ue4/Source/SpineUE4Editor.Target.cs index 3b5458abe..247aedbe5 100644 --- a/spine-ue4/Source/SpineUE4Editor.Target.cs +++ b/spine-ue4/Source/SpineUE4Editor.Target.cs @@ -5,21 +5,9 @@ using System.Collections.Generic; public class SpineUE4EditorTarget : TargetRules { - public SpineUE4EditorTarget(TargetInfo Target) + public SpineUE4EditorTarget(TargetInfo Target) : base(Target) { Type = TargetType.Editor; - } - - // - // TargetRules interface. - // - - public override void SetupBinaries( - TargetInfo Target, - ref List OutBuildBinaryConfigurations, - ref List OutExtraModuleNames - ) - { - OutExtraModuleNames.AddRange( new string[] { "SpineUE4" } ); + ExtraModuleNames.AddRange(new string[] { "SpineUE4" }); } } diff --git a/spine-ue4/SpineUE4.uproject b/spine-ue4/SpineUE4.uproject index 8800d1490..dbd7825f0 100644 --- a/spine-ue4/SpineUE4.uproject +++ b/spine-ue4/SpineUE4.uproject @@ -1,6 +1,6 @@ { "FileVersion": 3, - "EngineAssociation": "4.16", + "EngineAssociation": "4.17", "Category": "", "Description": "", "Modules": [ From e7ae2435b0cd36f8776906f5a6ed3460da3feafa Mon Sep 17 00:00:00 2001 From: badlogic Date: Tue, 29 Aug 2017 11:39:11 +0200 Subject: [PATCH 02/10] [ue4] More changes to cpp example --- spine-ue4/Content/GettingStarted/06-cpp.umap | Bin 23402 -> 24096 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/spine-ue4/Content/GettingStarted/06-cpp.umap b/spine-ue4/Content/GettingStarted/06-cpp.umap index 254e33eb2ccfb2d53b54b91f16706eb5d1d7f623..ae79698fb614776ef20129d338c17843c70ceebb 100644 GIT binary patch literal 24096 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 Q&ff?a$pGal`d_yH2MCBgs{jB1 From 91d44b29fd71be3e3a1778def4f2a281603f2e7c Mon Sep 17 00:00:00 2001 From: badlogic Date: Tue, 29 Aug 2017 15:19:33 +0200 Subject: [PATCH 03/10] [c] Introduced SP_API macro so we can use __declspec on MSVC. [ue4] Clean-up, minor improvements. --- spine-c/spine-c/include/spine/Animation.h | 81 +++++++++--------- .../spine-c/include/spine/AnimationState.h | 35 ++++---- .../include/spine/AnimationStateData.h | 11 +-- spine-c/spine-c/include/spine/Array.h | 26 +++--- spine-c/spine-c/include/spine/Atlas.h | 18 ++-- .../include/spine/AtlasAttachmentLoader.h | 3 +- spine-c/spine-c/include/spine/Attachment.h | 2 + .../spine-c/include/spine/AttachmentLoader.h | 9 +- spine-c/spine-c/include/spine/Bone.h | 35 ++++---- spine-c/spine-c/include/spine/BoneData.h | 6 +- .../include/spine/BoundingBoxAttachment.h | 3 +- .../include/spine/ClippingAttachment.h | 5 +- spine-c/spine-c/include/spine/Color.h | 16 ++-- spine-c/spine-c/include/spine/Event.h | 5 +- spine-c/spine-c/include/spine/EventData.h | 6 +- spine-c/spine-c/include/spine/IkConstraint.h | 11 +-- .../spine-c/include/spine/IkConstraintData.h | 5 +- .../spine-c/include/spine/MeshAttachment.h | 7 +- .../spine-c/include/spine/PathAttachment.h | 3 +- .../spine-c/include/spine/PathConstraint.h | 9 +- .../include/spine/PathConstraintData.h | 5 +- .../spine-c/include/spine/PointAttachment.h | 7 +- .../spine-c/include/spine/RegionAttachment.h | 9 +- spine-c/spine-c/include/spine/Skeleton.h | 41 ++++----- .../spine-c/include/spine/SkeletonBinary.h | 11 +-- .../spine-c/include/spine/SkeletonBounds.h | 27 +++--- .../spine-c/include/spine/SkeletonClipping.h | 15 ++-- spine-c/spine-c/include/spine/SkeletonData.h | 25 +++--- spine-c/spine-c/include/spine/SkeletonJson.h | 11 +-- spine-c/spine-c/include/spine/Skin.h | 13 +-- spine-c/spine-c/include/spine/Slot.h | 13 +-- spine-c/spine-c/include/spine/SlotData.h | 7 +- .../include/spine/TransformConstraint.h | 7 +- .../include/spine/TransformConstraintData.h | 5 +- spine-c/spine-c/include/spine/Triangulator.h | 9 +- .../spine-c/include/spine/VertexAttachment.h | 3 +- spine-c/spine-c/include/spine/VertexEffect.h | 9 +- spine-c/spine-c/include/spine/dll.h | 48 +++++++++++ spine-c/spine-c/include/spine/spine.h | 1 + spine-ue4/Content/Test/Test.umap | Bin 28104 -> 67953 bytes .../Public/RuntimeMeshCore.h | 1 + .../Private/SpineBoneDriverComponent.cpp | 1 - .../Private/SpineBoneFollowerComponent.cpp | 1 - .../SpineSkeletonAnimationComponent.cpp | 1 - .../Private/SpineSkeletonComponent.cpp | 1 - .../SpineSkeletonRendererComponent.cpp | 1 - .../Plugins/SpinePlugin/SpinePlugin.uplugin | 33 ++++--- .../Source/SpineUE4/MySceneComponent.cpp | 37 ++++++++ spine-ue4/Source/SpineUE4/MySceneComponent.h | 30 +++++++ spine-ue4/Source/SpineUE4/SpineUE4.Build.cs | 2 +- 50 files changed, 417 insertions(+), 253 deletions(-) create mode 100644 spine-c/spine-c/include/spine/dll.h create mode 100644 spine-ue4/Source/SpineUE4/MySceneComponent.cpp create mode 100644 spine-ue4/Source/SpineUE4/MySceneComponent.h diff --git a/spine-c/spine-c/include/spine/Animation.h b/spine-c/spine-c/include/spine/Animation.h index b0de4a9bc..e47a835ce 100644 --- a/spine-c/spine-c/include/spine/Animation.h +++ b/spine-c/spine-c/include/spine/Animation.h @@ -31,6 +31,7 @@ #ifndef SPINE_ANIMATION_H_ #define SPINE_ANIMATION_H_ +#include #include #include @@ -69,13 +70,13 @@ typedef enum { SP_MIX_DIRECTION_OUT } spMixDirection; -spAnimation* spAnimation_create (const char* name, int timelinesCount); -void spAnimation_dispose (spAnimation* self); +SP_API spAnimation* spAnimation_create (const char* name, int timelinesCount); +SP_API void spAnimation_dispose (spAnimation* self); /** Poses the skeleton at the specified time for this animation. * @param lastTime The last time the animation was applied. * @param events Any triggered events are added. May be null.*/ -void spAnimation_apply (const spAnimation* self, struct spSkeleton* skeleton, float lastTime, float time, int loop, +SP_API void spAnimation_apply (const spAnimation* self, struct spSkeleton* skeleton, float lastTime, float time, int loop, spEvent** events, int* eventsCount, float alpha, spMixPose pose, spMixDirection direction); #ifdef SPINE_SHORT_NAMES @@ -117,10 +118,10 @@ struct spTimeline { #endif }; -void spTimeline_dispose (spTimeline* self); -void spTimeline_apply (const spTimeline* self, struct spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents, +SP_API void spTimeline_dispose (spTimeline* self); +SP_API void spTimeline_apply (const spTimeline* self, struct spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents, int* eventsCount, float alpha, spMixPose pose, spMixDirection direction); -int spTimeline_getPropertyId (const spTimeline* self); +SP_API int spTimeline_getPropertyId (const spTimeline* self); #ifdef SPINE_SHORT_NAMES typedef spTimeline Timeline; @@ -149,14 +150,14 @@ typedef struct spCurveTimeline { #endif } spCurveTimeline; -void spCurveTimeline_setLinear (spCurveTimeline* self, int frameIndex); -void spCurveTimeline_setStepped (spCurveTimeline* self, int frameIndex); +SP_API void spCurveTimeline_setLinear (spCurveTimeline* self, int frameIndex); +SP_API void spCurveTimeline_setStepped (spCurveTimeline* self, int frameIndex); /* Sets the control handle positions for an interpolation bezier curve used to transition from this keyframe to the next. * cx1 and cx2 are from 0 to 1, representing the percent of time between the two keyframes. cy1 and cy2 are the percent of * the difference between the keyframe's values. */ -void spCurveTimeline_setCurve (spCurveTimeline* self, int frameIndex, float cx1, float cy1, float cx2, float cy2); -float spCurveTimeline_getCurvePercent (const spCurveTimeline* self, int frameIndex, float percent); +SP_API void spCurveTimeline_setCurve (spCurveTimeline* self, int frameIndex, float cx1, float cy1, float cx2, float cy2); +SP_API float spCurveTimeline_getCurvePercent (const spCurveTimeline* self, int frameIndex, float percent); #ifdef SPINE_SHORT_NAMES typedef spCurveTimeline CurveTimeline; @@ -192,9 +193,9 @@ static const int ROTATE_ENTRIES = 2; typedef struct spBaseTimeline spRotateTimeline; -spRotateTimeline* spRotateTimeline_create (int framesCount); +SP_API spRotateTimeline* spRotateTimeline_create (int framesCount); -void spRotateTimeline_setFrame (spRotateTimeline* self, int frameIndex, float time, float angle); +SP_API void spRotateTimeline_setFrame (spRotateTimeline* self, int frameIndex, float time, float angle); #ifdef SPINE_SHORT_NAMES typedef spRotateTimeline RotateTimeline; @@ -208,9 +209,9 @@ static const int TRANSLATE_ENTRIES = 3; typedef struct spBaseTimeline spTranslateTimeline; -spTranslateTimeline* spTranslateTimeline_create (int framesCount); +SP_API spTranslateTimeline* spTranslateTimeline_create (int framesCount); -void spTranslateTimeline_setFrame (spTranslateTimeline* self, int frameIndex, float time, float x, float y); +SP_API void spTranslateTimeline_setFrame (spTranslateTimeline* self, int frameIndex, float time, float x, float y); #ifdef SPINE_SHORT_NAMES typedef spTranslateTimeline TranslateTimeline; @@ -222,9 +223,9 @@ typedef spTranslateTimeline TranslateTimeline; typedef struct spBaseTimeline spScaleTimeline; -spScaleTimeline* spScaleTimeline_create (int framesCount); +SP_API spScaleTimeline* spScaleTimeline_create (int framesCount); -void spScaleTimeline_setFrame (spScaleTimeline* self, int frameIndex, float time, float x, float y); +SP_API void spScaleTimeline_setFrame (spScaleTimeline* self, int frameIndex, float time, float x, float y); #ifdef SPINE_SHORT_NAMES typedef spScaleTimeline ScaleTimeline; @@ -236,9 +237,9 @@ typedef spScaleTimeline ScaleTimeline; typedef struct spBaseTimeline spShearTimeline; -spShearTimeline* spShearTimeline_create (int framesCount); +SP_API spShearTimeline* spShearTimeline_create (int framesCount); -void spShearTimeline_setFrame (spShearTimeline* self, int frameIndex, float time, float x, float y); +SP_API void spShearTimeline_setFrame (spShearTimeline* self, int frameIndex, float time, float x, float y); #ifdef SPINE_SHORT_NAMES typedef spShearTimeline ShearTimeline; @@ -266,9 +267,9 @@ typedef struct spColorTimeline { #endif } spColorTimeline; -spColorTimeline* spColorTimeline_create (int framesCount); +SP_API spColorTimeline* spColorTimeline_create (int framesCount); -void spColorTimeline_setFrame (spColorTimeline* self, int frameIndex, float time, float r, float g, float b, float a); +SP_API void spColorTimeline_setFrame (spColorTimeline* self, int frameIndex, float time, float r, float g, float b, float a); #ifdef SPINE_SHORT_NAMES typedef spColorTimeline ColorTimeline; @@ -296,9 +297,9 @@ typedef struct spTwoColorTimeline { #endif } spTwoColorTimeline; -spTwoColorTimeline* spTwoColorTimeline_create (int framesCount); +SP_API spTwoColorTimeline* spTwoColorTimeline_create (int framesCount); -void spTwoColorTimeline_setFrame (spTwoColorTimeline* self, int frameIndex, float time, float r, float g, float b, float a, float r2, float g2, float b2); +SP_API void spTwoColorTimeline_setFrame (spTwoColorTimeline* self, int frameIndex, float time, float r, float g, float b, float a, float r2, float g2, float b2); #ifdef SPINE_SHORT_NAMES typedef spTwoColorTimeline TwoColorTimeline; @@ -326,10 +327,10 @@ typedef struct spAttachmentTimeline { #endif } spAttachmentTimeline; -spAttachmentTimeline* spAttachmentTimeline_create (int framesCount); +SP_API spAttachmentTimeline* spAttachmentTimeline_create (int framesCount); /* @param attachmentName May be 0. */ -void spAttachmentTimeline_setFrame (spAttachmentTimeline* self, int frameIndex, float time, const char* attachmentName); +SP_API void spAttachmentTimeline_setFrame (spAttachmentTimeline* self, int frameIndex, float time, const char* attachmentName); #ifdef SPINE_SHORT_NAMES typedef spAttachmentTimeline AttachmentTimeline; @@ -355,9 +356,9 @@ typedef struct spEventTimeline { #endif } spEventTimeline; -spEventTimeline* spEventTimeline_create (int framesCount); +SP_API spEventTimeline* spEventTimeline_create (int framesCount); -void spEventTimeline_setFrame (spEventTimeline* self, int frameIndex, spEvent* event); +SP_API void spEventTimeline_setFrame (spEventTimeline* self, int frameIndex, spEvent* event); #ifdef SPINE_SHORT_NAMES typedef spEventTimeline EventTimeline; @@ -385,9 +386,9 @@ typedef struct spDrawOrderTimeline { #endif } spDrawOrderTimeline; -spDrawOrderTimeline* spDrawOrderTimeline_create (int framesCount, int slotsCount); +SP_API spDrawOrderTimeline* spDrawOrderTimeline_create (int framesCount, int slotsCount); -void spDrawOrderTimeline_setFrame (spDrawOrderTimeline* self, int frameIndex, float time, const int* drawOrder); +SP_API void spDrawOrderTimeline_setFrame (spDrawOrderTimeline* self, int frameIndex, float time, const int* drawOrder); #ifdef SPINE_SHORT_NAMES typedef spDrawOrderTimeline DrawOrderTimeline; @@ -418,9 +419,9 @@ typedef struct spDeformTimeline { #endif } spDeformTimeline; -spDeformTimeline* spDeformTimeline_create (int framesCount, int frameVerticesCount); +SP_API spDeformTimeline* spDeformTimeline_create (int framesCount, int frameVerticesCount); -void spDeformTimeline_setFrame (spDeformTimeline* self, int frameIndex, float time, float* vertices); +SP_API void spDeformTimeline_setFrame (spDeformTimeline* self, int frameIndex, float time, float* vertices); #ifdef SPINE_SHORT_NAMES typedef spDeformTimeline DeformTimeline; @@ -448,9 +449,9 @@ typedef struct spIkConstraintTimeline { #endif } spIkConstraintTimeline; -spIkConstraintTimeline* spIkConstraintTimeline_create (int framesCount); +SP_API spIkConstraintTimeline* spIkConstraintTimeline_create (int framesCount); -void spIkConstraintTimeline_setFrame (spIkConstraintTimeline* self, int frameIndex, float time, float mix, int bendDirection); +SP_API void spIkConstraintTimeline_setFrame (spIkConstraintTimeline* self, int frameIndex, float time, float mix, int bendDirection); #ifdef SPINE_SHORT_NAMES typedef spIkConstraintTimeline IkConstraintTimeline; @@ -478,9 +479,9 @@ typedef struct spTransformConstraintTimeline { #endif } spTransformConstraintTimeline; -spTransformConstraintTimeline* spTransformConstraintTimeline_create (int framesCount); +SP_API spTransformConstraintTimeline* spTransformConstraintTimeline_create (int framesCount); -void spTransformConstraintTimeline_setFrame (spTransformConstraintTimeline* self, int frameIndex, float time, float rotateMix, float translateMix, float scaleMix, float shearMix); +SP_API void spTransformConstraintTimeline_setFrame (spTransformConstraintTimeline* self, int frameIndex, float time, float rotateMix, float translateMix, float scaleMix, float shearMix); #ifdef SPINE_SHORT_NAMES typedef spTransformConstraintTimeline TransformConstraintTimeline; @@ -508,9 +509,9 @@ typedef struct spPathConstraintPositionTimeline { #endif } spPathConstraintPositionTimeline; -spPathConstraintPositionTimeline* spPathConstraintPositionTimeline_create (int framesCount); +SP_API spPathConstraintPositionTimeline* spPathConstraintPositionTimeline_create (int framesCount); -void spPathConstraintPositionTimeline_setFrame (spPathConstraintPositionTimeline* self, int frameIndex, float time, float value); +SP_API void spPathConstraintPositionTimeline_setFrame (spPathConstraintPositionTimeline* self, int frameIndex, float time, float value); #ifdef SPINE_SHORT_NAMES typedef spPathConstraintPositionTimeline PathConstraintPositionTimeline; @@ -538,9 +539,9 @@ typedef struct spPathConstraintSpacingTimeline { #endif } spPathConstraintSpacingTimeline; -spPathConstraintSpacingTimeline* spPathConstraintSpacingTimeline_create (int framesCount); +SP_API spPathConstraintSpacingTimeline* spPathConstraintSpacingTimeline_create (int framesCount); -void spPathConstraintSpacingTimeline_setFrame (spPathConstraintSpacingTimeline* self, int frameIndex, float time, float value); +SP_API void spPathConstraintSpacingTimeline_setFrame (spPathConstraintSpacingTimeline* self, int frameIndex, float time, float value); #ifdef SPINE_SHORT_NAMES typedef spPathConstraintSpacingTimeline PathConstraintSpacingTimeline; @@ -568,9 +569,9 @@ typedef struct spPathConstraintMixTimeline { #endif } spPathConstraintMixTimeline; -spPathConstraintMixTimeline* spPathConstraintMixTimeline_create (int framesCount); +SP_API spPathConstraintMixTimeline* spPathConstraintMixTimeline_create (int framesCount); -void spPathConstraintMixTimeline_setFrame (spPathConstraintMixTimeline* self, int frameIndex, float time, float rotateMix, float translateMix); +SP_API void spPathConstraintMixTimeline_setFrame (spPathConstraintMixTimeline* self, int frameIndex, float time, float rotateMix, float translateMix); #ifdef SPINE_SHORT_NAMES typedef spPathConstraintMixTimeline PathConstraintMixTimeline; diff --git a/spine-c/spine-c/include/spine/AnimationState.h b/spine-c/spine-c/include/spine/AnimationState.h index 6df64edb1..fe6ae515a 100644 --- a/spine-c/spine-c/include/spine/AnimationState.h +++ b/spine-c/spine-c/include/spine/AnimationState.h @@ -31,6 +31,7 @@ #ifndef SPINE_ANIMATIONSTATE_H_ #define SPINE_ANIMATIONSTATE_H_ +#include #include #include #include @@ -116,38 +117,38 @@ struct spAnimationState { }; /* @param data May be 0 for no mixing. */ -spAnimationState* spAnimationState_create (spAnimationStateData* data); -void spAnimationState_dispose (spAnimationState* self); +SP_API spAnimationState* spAnimationState_create (spAnimationStateData* data); +SP_API void spAnimationState_dispose (spAnimationState* self); -void spAnimationState_update (spAnimationState* self, float delta); -int /**bool**/ spAnimationState_apply (spAnimationState* self, struct spSkeleton* skeleton); +SP_API void spAnimationState_update (spAnimationState* self, float delta); +SP_API int /**bool**/ spAnimationState_apply (spAnimationState* self, struct spSkeleton* skeleton); -void spAnimationState_clearTracks (spAnimationState* self); -void spAnimationState_clearTrack (spAnimationState* self, int trackIndex); +SP_API void spAnimationState_clearTracks (spAnimationState* self); +SP_API void spAnimationState_clearTrack (spAnimationState* self, int trackIndex); /** Set the current animation. Any queued animations are cleared. */ -spTrackEntry* spAnimationState_setAnimationByName (spAnimationState* self, int trackIndex, const char* animationName, +SP_API spTrackEntry* spAnimationState_setAnimationByName (spAnimationState* self, int trackIndex, const char* animationName, int/*bool*/loop); -spTrackEntry* spAnimationState_setAnimation (spAnimationState* self, int trackIndex, spAnimation* animation, int/*bool*/loop); +SP_API spTrackEntry* spAnimationState_setAnimation (spAnimationState* self, int trackIndex, spAnimation* animation, int/*bool*/loop); /** Adds an animation to be played delay seconds after the current or last queued animation, taking into account any mix * duration. */ -spTrackEntry* spAnimationState_addAnimationByName (spAnimationState* self, int trackIndex, const char* animationName, +SP_API spTrackEntry* spAnimationState_addAnimationByName (spAnimationState* self, int trackIndex, const char* animationName, int/*bool*/loop, float delay); -spTrackEntry* spAnimationState_addAnimation (spAnimationState* self, int trackIndex, spAnimation* animation, int/*bool*/loop, +SP_API spTrackEntry* spAnimationState_addAnimation (spAnimationState* self, int trackIndex, spAnimation* animation, int/*bool*/loop, float delay); -spTrackEntry* spAnimationState_setEmptyAnimation(spAnimationState* self, int trackIndex, float mixDuration); -spTrackEntry* spAnimationState_addEmptyAnimation(spAnimationState* self, int trackIndex, float mixDuration, float delay); -void spAnimationState_setEmptyAnimations(spAnimationState* self, float mixDuration); +SP_API spTrackEntry* spAnimationState_setEmptyAnimation(spAnimationState* self, int trackIndex, float mixDuration); +SP_API spTrackEntry* spAnimationState_addEmptyAnimation(spAnimationState* self, int trackIndex, float mixDuration, float delay); +SP_API void spAnimationState_setEmptyAnimations(spAnimationState* self, float mixDuration); -spTrackEntry* spAnimationState_getCurrent (spAnimationState* self, int trackIndex); +SP_API spTrackEntry* spAnimationState_getCurrent (spAnimationState* self, int trackIndex); -void spAnimationState_clearListenerNotifications(spAnimationState* self); +SP_API void spAnimationState_clearListenerNotifications(spAnimationState* self); -float spTrackEntry_getAnimationTime (spTrackEntry* entry); +SP_API float spTrackEntry_getAnimationTime (spTrackEntry* entry); /** Use this to dispose static memory before your app exits to appease your memory leak detector*/ -void spAnimationState_disposeStatics (); +SP_API void spAnimationState_disposeStatics (); #ifdef SPINE_SHORT_NAMES typedef spEventType EventType; diff --git a/spine-c/spine-c/include/spine/AnimationStateData.h b/spine-c/spine-c/include/spine/AnimationStateData.h index 063f7fdeb..95f936e80 100644 --- a/spine-c/spine-c/include/spine/AnimationStateData.h +++ b/spine-c/spine-c/include/spine/AnimationStateData.h @@ -31,6 +31,7 @@ #ifndef SPINE_ANIMATIONSTATEDATA_H_ #define SPINE_ANIMATIONSTATEDATA_H_ +#include #include #include @@ -52,13 +53,13 @@ typedef struct spAnimationStateData { #endif } spAnimationStateData; -spAnimationStateData* spAnimationStateData_create (spSkeletonData* skeletonData); -void spAnimationStateData_dispose (spAnimationStateData* self); +SP_API spAnimationStateData* spAnimationStateData_create (spSkeletonData* skeletonData); +SP_API void spAnimationStateData_dispose (spAnimationStateData* self); -void spAnimationStateData_setMixByName (spAnimationStateData* self, const char* fromName, const char* toName, float duration); -void spAnimationStateData_setMix (spAnimationStateData* self, spAnimation* from, spAnimation* to, float duration); +SP_API void spAnimationStateData_setMixByName (spAnimationStateData* self, const char* fromName, const char* toName, float duration); +SP_API void spAnimationStateData_setMix (spAnimationStateData* self, spAnimation* from, spAnimation* to, float duration); /* Returns 0 if there is no mixing between the animations. */ -float spAnimationStateData_getMix (spAnimationStateData* self, spAnimation* from, spAnimation* to); +SP_API float spAnimationStateData_getMix (spAnimationStateData* self, spAnimation* from, spAnimation* to); #ifdef SPINE_SHORT_NAMES typedef spAnimationStateData AnimationStateData; diff --git a/spine-c/spine-c/include/spine/Array.h b/spine-c/spine-c/include/spine/Array.h index 8f29eb9ea..3beb08325 100644 --- a/spine-c/spine-c/include/spine/Array.h +++ b/spine-c/spine-c/include/spine/Array.h @@ -31,24 +31,26 @@ #ifndef SPINE_ARRAY_H #define SPINE_ARRAY_H +#include + #ifdef __cplusplus extern "C" { #endif #define _SP_ARRAY_DECLARE_TYPE(name, itemType) \ typedef struct name { int size; int capacity; itemType* items; } name; \ - name* name##_create(int initialCapacity); \ - void name##_dispose(name* self); \ - void name##_clear(name* self); \ - name* name##_setSize(name* self, int newSize); \ - void name##_ensureCapacity(name* self, int newCapacity); \ - void name##_add(name* self, itemType value); \ - void name##_addAll(name* self, name* other); \ - void name##_addAllValues(name* self, itemType* values, int offset, int count); \ - void name##_removeAt(name* self, int index); \ - int name##_contains(name* self, itemType value); \ - itemType name##_pop(name* self); \ - itemType name##_peek(name* self); + SP_API name* name##_create(int initialCapacity); \ + SP_API void name##_dispose(name* self); \ + SP_API void name##_clear(name* self); \ + SP_API name* name##_setSize(name* self, int newSize); \ + SP_API void name##_ensureCapacity(name* self, int newCapacity); \ + SP_API void name##_add(name* self, itemType value); \ + SP_API void name##_addAll(name* self, name* other); \ + SP_API void name##_addAllValues(name* self, itemType* values, int offset, int count); \ + SP_API void name##_removeAt(name* self, int index); \ + SP_API int name##_contains(name* self, itemType value); \ + SP_API itemType name##_pop(name* self); \ + SP_API itemType name##_peek(name* self); #define _SP_ARRAY_IMPLEMENT_TYPE(name, itemType) \ name* name##_create(int initialCapacity) { \ diff --git a/spine-c/spine-c/include/spine/Atlas.h b/spine-c/spine-c/include/spine/Atlas.h index 392e498df..7812e0440 100644 --- a/spine-c/spine-c/include/spine/Atlas.h +++ b/spine-c/spine-c/include/spine/Atlas.h @@ -31,6 +31,8 @@ #ifndef SPINE_ATLAS_H_ #define SPINE_ATLAS_H_ +#include + #ifdef __cplusplus extern "C" { #endif @@ -79,8 +81,8 @@ struct spAtlasPage { spAtlasPage* next; }; -spAtlasPage* spAtlasPage_create (spAtlas* atlas, const char* name); -void spAtlasPage_dispose (spAtlasPage* self); +SP_API spAtlasPage* spAtlasPage_create (spAtlas* atlas, const char* name); +SP_API void spAtlasPage_dispose (spAtlasPage* self); #ifdef SPINE_SHORT_NAMES typedef spAtlasFormat AtlasFormat; @@ -130,8 +132,8 @@ struct spAtlasRegion { spAtlasRegion* next; }; -spAtlasRegion* spAtlasRegion_create (); -void spAtlasRegion_dispose (spAtlasRegion* self); +SP_API spAtlasRegion* spAtlasRegion_create (); +SP_API void spAtlasRegion_dispose (spAtlasRegion* self); #ifdef SPINE_SHORT_NAMES typedef spAtlasRegion AtlasRegion; @@ -149,13 +151,13 @@ struct spAtlas { }; /* Image files referenced in the atlas file will be prefixed with dir. */ -spAtlas* spAtlas_create (const char* data, int length, const char* dir, void* rendererObject); +SP_API spAtlas* spAtlas_create (const char* data, int length, const char* dir, void* rendererObject); /* Image files referenced in the atlas file will be prefixed with the directory containing the atlas file. */ -spAtlas* spAtlas_createFromFile (const char* path, void* rendererObject); -void spAtlas_dispose (spAtlas* atlas); +SP_API spAtlas* spAtlas_createFromFile (const char* path, void* rendererObject); +SP_API void spAtlas_dispose (spAtlas* atlas); /* Returns 0 if the region was not found. */ -spAtlasRegion* spAtlas_findRegion (const spAtlas* self, const char* name); +SP_API spAtlasRegion* spAtlas_findRegion (const spAtlas* self, const char* name); #ifdef SPINE_SHORT_NAMES typedef spAtlas Atlas; diff --git a/spine-c/spine-c/include/spine/AtlasAttachmentLoader.h b/spine-c/spine-c/include/spine/AtlasAttachmentLoader.h index 3ea864e13..6b9ed688e 100644 --- a/spine-c/spine-c/include/spine/AtlasAttachmentLoader.h +++ b/spine-c/spine-c/include/spine/AtlasAttachmentLoader.h @@ -31,6 +31,7 @@ #ifndef SPINE_ATLASATTACHMENTLOADER_H_ #define SPINE_ATLASATTACHMENTLOADER_H_ +#include #include #include @@ -43,7 +44,7 @@ typedef struct spAtlasAttachmentLoader { spAtlas* atlas; } spAtlasAttachmentLoader; -spAtlasAttachmentLoader* spAtlasAttachmentLoader_create (spAtlas* atlas); +SP_API spAtlasAttachmentLoader* spAtlasAttachmentLoader_create (spAtlas* atlas); #ifdef SPINE_SHORT_NAMES typedef spAtlasAttachmentLoader AtlasAttachmentLoader; diff --git a/spine-c/spine-c/include/spine/Attachment.h b/spine-c/spine-c/include/spine/Attachment.h index f67b65af5..286a8bec4 100644 --- a/spine-c/spine-c/include/spine/Attachment.h +++ b/spine-c/spine-c/include/spine/Attachment.h @@ -31,6 +31,8 @@ #ifndef SPINE_ATTACHMENT_H_ #define SPINE_ATTACHMENT_H_ +#include + #ifdef __cplusplus extern "C" { #endif diff --git a/spine-c/spine-c/include/spine/AttachmentLoader.h b/spine-c/spine-c/include/spine/AttachmentLoader.h index 7111c45a0..f0f556553 100644 --- a/spine-c/spine-c/include/spine/AttachmentLoader.h +++ b/spine-c/spine-c/include/spine/AttachmentLoader.h @@ -31,6 +31,7 @@ #ifndef SPINE_ATTACHMENTLOADER_H_ #define SPINE_ATTACHMENTLOADER_H_ +#include #include #include @@ -52,16 +53,16 @@ typedef struct spAttachmentLoader { #endif } spAttachmentLoader; -void spAttachmentLoader_dispose (spAttachmentLoader* self); +SP_API void spAttachmentLoader_dispose (spAttachmentLoader* self); /* Called to create each attachment. Returns 0 to not load an attachment. If 0 is returned and _spAttachmentLoader_setError was * called, an error occurred. */ -spAttachment* spAttachmentLoader_createAttachment (spAttachmentLoader* self, spSkin* skin, spAttachmentType type, const char* name, +SP_API spAttachment* spAttachmentLoader_createAttachment (spAttachmentLoader* self, spSkin* skin, spAttachmentType type, const char* name, const char* path); /* Called after the attachment has been fully configured. */ -void spAttachmentLoader_configureAttachment (spAttachmentLoader* self, spAttachment* attachment); +SP_API void spAttachmentLoader_configureAttachment (spAttachmentLoader* self, spAttachment* attachment); /* Called just before the attachment is disposed. This can release allocations made in spAttachmentLoader_configureAttachment. */ -void spAttachmentLoader_disposeAttachment (spAttachmentLoader* self, spAttachment* attachment); +SP_API void spAttachmentLoader_disposeAttachment (spAttachmentLoader* self, spAttachment* attachment); #ifdef SPINE_SHORT_NAMES typedef spAttachmentLoader AttachmentLoader; diff --git a/spine-c/spine-c/include/spine/Bone.h b/spine-c/spine-c/include/spine/Bone.h index 2335fd3af..12b2af928 100644 --- a/spine-c/spine-c/include/spine/Bone.h +++ b/spine-c/spine-c/include/spine/Bone.h @@ -31,6 +31,7 @@ #ifndef SPINE_BONE_H_ #define SPINE_BONE_H_ +#include #include #ifdef __cplusplus @@ -73,30 +74,30 @@ struct spBone { #endif }; -void spBone_setYDown (int/*bool*/yDown); -int/*bool*/spBone_isYDown (); +SP_API void spBone_setYDown (int/*bool*/yDown); +SP_API int/*bool*/spBone_isYDown (); /* @param parent May be 0. */ -spBone* spBone_create (spBoneData* data, struct spSkeleton* skeleton, spBone* parent); -void spBone_dispose (spBone* self); +SP_API spBone* spBone_create (spBoneData* data, struct spSkeleton* skeleton, spBone* parent); +SP_API void spBone_dispose (spBone* self); -void spBone_setToSetupPose (spBone* self); +SP_API void spBone_setToSetupPose (spBone* self); -void spBone_updateWorldTransform (spBone* self); -void spBone_updateWorldTransformWith (spBone* self, float x, float y, float rotation, float scaleX, float scaleY, float shearX, float shearY); +SP_API void spBone_updateWorldTransform (spBone* self); +SP_API void spBone_updateWorldTransformWith (spBone* self, float x, float y, float rotation, float scaleX, float scaleY, float shearX, float shearY); -float spBone_getWorldRotationX (spBone* self); -float spBone_getWorldRotationY (spBone* self); -float spBone_getWorldScaleX (spBone* self); -float spBone_getWorldScaleY (spBone* self); +SP_API float spBone_getWorldRotationX (spBone* self); +SP_API float spBone_getWorldRotationY (spBone* self); +SP_API float spBone_getWorldScaleX (spBone* self); +SP_API float spBone_getWorldScaleY (spBone* self); -void spBone_updateAppliedTransform (spBone* self); +SP_API void spBone_updateAppliedTransform (spBone* self); -void spBone_worldToLocal (spBone* self, float worldX, float worldY, float* localX, float* localY); -void spBone_localToWorld (spBone* self, float localX, float localY, float* worldX, float* worldY); -float spBone_worldToLocalRotation (spBone* self, float worldRotation); -float spBone_localToWorldRotation (spBone* self, float localRotation); -void spBone_rotateWorld (spBone* self, float degrees); +SP_API void spBone_worldToLocal (spBone* self, float worldX, float worldY, float* localX, float* localY); +SP_API void spBone_localToWorld (spBone* self, float localX, float localY, float* worldX, float* worldY); +SP_API float spBone_worldToLocalRotation (spBone* self, float worldRotation); +SP_API float spBone_localToWorldRotation (spBone* self, float localRotation); +SP_API void spBone_rotateWorld (spBone* self, float degrees); #ifdef SPINE_SHORT_NAMES typedef spBone Bone; diff --git a/spine-c/spine-c/include/spine/BoneData.h b/spine-c/spine-c/include/spine/BoneData.h index 244a50e0d..d73162b2b 100644 --- a/spine-c/spine-c/include/spine/BoneData.h +++ b/spine-c/spine-c/include/spine/BoneData.h @@ -31,6 +31,8 @@ #ifndef SPINE_BONEDATA_H_ #define SPINE_BONEDATA_H_ +#include + #ifdef __cplusplus extern "C" { #endif @@ -67,8 +69,8 @@ struct spBoneData { #endif }; -spBoneData* spBoneData_create (int index, const char* name, spBoneData* parent); -void spBoneData_dispose (spBoneData* self); +SP_API spBoneData* spBoneData_create (int index, const char* name, spBoneData* parent); +SP_API void spBoneData_dispose (spBoneData* self); #ifdef SPINE_SHORT_NAMES typedef spBoneData BoneData; diff --git a/spine-c/spine-c/include/spine/BoundingBoxAttachment.h b/spine-c/spine-c/include/spine/BoundingBoxAttachment.h index e2895800c..2c9194b69 100644 --- a/spine-c/spine-c/include/spine/BoundingBoxAttachment.h +++ b/spine-c/spine-c/include/spine/BoundingBoxAttachment.h @@ -31,6 +31,7 @@ #ifndef SPINE_BOUNDINGBOXATTACHMENT_H_ #define SPINE_BOUNDINGBOXATTACHMENT_H_ +#include #include #include #include @@ -44,7 +45,7 @@ typedef struct spBoundingBoxAttachment { spVertexAttachment super; } spBoundingBoxAttachment; -spBoundingBoxAttachment* spBoundingBoxAttachment_create (const char* name); +SP_API spBoundingBoxAttachment* spBoundingBoxAttachment_create (const char* name); #ifdef SPINE_SHORT_NAMES typedef spBoundingBoxAttachment BoundingBoxAttachment; diff --git a/spine-c/spine-c/include/spine/ClippingAttachment.h b/spine-c/spine-c/include/spine/ClippingAttachment.h index 33e5dc875..8683437c7 100644 --- a/spine-c/spine-c/include/spine/ClippingAttachment.h +++ b/spine-c/spine-c/include/spine/ClippingAttachment.h @@ -31,6 +31,7 @@ #ifndef SPINE_CLIPPINGATTACHMENT_H_ #define SPINE_CLIPPINGATTACHMENT_H_ +#include #include #include #include @@ -45,8 +46,8 @@ typedef struct spClippingAttachment { spSlotData* endSlot; } spClippingAttachment; -void _spClippingAttachment_dispose(spAttachment* self); -spClippingAttachment* spClippingAttachment_create (const char* name); +SP_API void _spClippingAttachment_dispose(spAttachment* self); +SP_API spClippingAttachment* spClippingAttachment_create (const char* name); #ifdef SPINE_SHORT_NAMES typedef spClippingAttachment ClippingAttachment; diff --git a/spine-c/spine-c/include/spine/Color.h b/spine-c/spine-c/include/spine/Color.h index 4c2384a41..272ba9552 100644 --- a/spine-c/spine-c/include/spine/Color.h +++ b/spine-c/spine-c/include/spine/Color.h @@ -31,6 +31,8 @@ #ifndef SPINE_COLOR_H_ #define SPINE_COLOR_H_ +#include + #ifdef __cplusplus extern "C" { #endif @@ -50,13 +52,13 @@ typedef struct spColor { } spColor; /* @param attachmentName May be 0 for no setup pose attachment. */ -spColor* spColor_create(); -void spColor_dispose(spColor* self); -void spColor_setFromFloats(spColor* color, float r, float g, float b, float a); -void spColor_setFromColor(spColor* color, spColor* otherColor); -void spColor_addFloats(spColor* color, float r, float g, float b, float a); -void spColor_addColor(spColor* color, spColor* otherColor); -void spColor_clamp(spColor* color); +SP_API spColor* spColor_create(); +SP_API void spColor_dispose(spColor* self); +SP_API void spColor_setFromFloats(spColor* color, float r, float g, float b, float a); +SP_API void spColor_setFromColor(spColor* color, spColor* otherColor); +SP_API void spColor_addFloats(spColor* color, float r, float g, float b, float a); +SP_API void spColor_addColor(spColor* color, spColor* otherColor); +SP_API void spColor_clamp(spColor* color); #ifdef SPINE_SHORT_NAMES typedef spColor color; diff --git a/spine-c/spine-c/include/spine/Event.h b/spine-c/spine-c/include/spine/Event.h index a943c454f..c92b713de 100644 --- a/spine-c/spine-c/include/spine/Event.h +++ b/spine-c/spine-c/include/spine/Event.h @@ -31,6 +31,7 @@ #ifndef SPINE_EVENT_H_ #define SPINE_EVENT_H_ +#include #include #ifdef __cplusplus @@ -55,8 +56,8 @@ typedef struct spEvent { #endif } spEvent; -spEvent* spEvent_create (float time, spEventData* data); -void spEvent_dispose (spEvent* self); +SP_API spEvent* spEvent_create (float time, spEventData* data); +SP_API void spEvent_dispose (spEvent* self); #ifdef SPINE_SHORT_NAMES typedef spEvent Event; diff --git a/spine-c/spine-c/include/spine/EventData.h b/spine-c/spine-c/include/spine/EventData.h index 050bee158..70b955071 100644 --- a/spine-c/spine-c/include/spine/EventData.h +++ b/spine-c/spine-c/include/spine/EventData.h @@ -31,6 +31,8 @@ #ifndef SPINE_EVENTDATA_H_ #define SPINE_EVENTDATA_H_ +#include + #ifdef __cplusplus extern "C" { #endif @@ -51,8 +53,8 @@ typedef struct spEventData { #endif } spEventData; -spEventData* spEventData_create (const char* name); -void spEventData_dispose (spEventData* self); +SP_API spEventData* spEventData_create (const char* name); +SP_API void spEventData_dispose (spEventData* self); #ifdef SPINE_SHORT_NAMES typedef spEventData EventData; diff --git a/spine-c/spine-c/include/spine/IkConstraint.h b/spine-c/spine-c/include/spine/IkConstraint.h index aef3c26a8..e5b0f7b72 100644 --- a/spine-c/spine-c/include/spine/IkConstraint.h +++ b/spine-c/spine-c/include/spine/IkConstraint.h @@ -31,6 +31,7 @@ #ifndef SPINE_IKCONSTRAINT_H_ #define SPINE_IKCONSTRAINT_H_ +#include #include #include @@ -62,13 +63,13 @@ typedef struct spIkConstraint { #endif } spIkConstraint; -spIkConstraint* spIkConstraint_create (spIkConstraintData* data, const struct spSkeleton* skeleton); -void spIkConstraint_dispose (spIkConstraint* self); +SP_API spIkConstraint* spIkConstraint_create (spIkConstraintData* data, const struct spSkeleton* skeleton); +SP_API void spIkConstraint_dispose (spIkConstraint* self); -void spIkConstraint_apply (spIkConstraint* self); +SP_API void spIkConstraint_apply (spIkConstraint* self); -void spIkConstraint_apply1 (spBone* bone, float targetX, float targetY, float alpha); -void spIkConstraint_apply2 (spBone* parent, spBone* child, float targetX, float targetY, int bendDirection, float alpha); +SP_API void spIkConstraint_apply1 (spBone* bone, float targetX, float targetY, float alpha); +SP_API void spIkConstraint_apply2 (spBone* parent, spBone* child, float targetX, float targetY, int bendDirection, float alpha); #ifdef SPINE_SHORT_NAMES typedef spIkConstraint IkConstraint; diff --git a/spine-c/spine-c/include/spine/IkConstraintData.h b/spine-c/spine-c/include/spine/IkConstraintData.h index 65c2f08b7..fc3f3cc09 100644 --- a/spine-c/spine-c/include/spine/IkConstraintData.h +++ b/spine-c/spine-c/include/spine/IkConstraintData.h @@ -31,6 +31,7 @@ #ifndef SPINE_IKCONSTRAINTDATA_H_ #define SPINE_IKCONSTRAINTDATA_H_ +#include #include #ifdef __cplusplus @@ -59,8 +60,8 @@ typedef struct spIkConstraintData { #endif } spIkConstraintData; -spIkConstraintData* spIkConstraintData_create (const char* name); -void spIkConstraintData_dispose (spIkConstraintData* self); +SP_API spIkConstraintData* spIkConstraintData_create (const char* name); +SP_API void spIkConstraintData_dispose (spIkConstraintData* self); #ifdef SPINE_SHORT_NAMES typedef spIkConstraintData IkConstraintData; diff --git a/spine-c/spine-c/include/spine/MeshAttachment.h b/spine-c/spine-c/include/spine/MeshAttachment.h index 91254e789..2876abfd5 100644 --- a/spine-c/spine-c/include/spine/MeshAttachment.h +++ b/spine-c/spine-c/include/spine/MeshAttachment.h @@ -31,6 +31,7 @@ #ifndef SPINE_MESHATTACHMENT_H_ #define SPINE_MESHATTACHMENT_H_ +#include #include #include #include @@ -72,9 +73,9 @@ struct spMeshAttachment { float width, height; }; -spMeshAttachment* spMeshAttachment_create (const char* name); -void spMeshAttachment_updateUVs (spMeshAttachment* self); -void spMeshAttachment_setParentMesh (spMeshAttachment* self, spMeshAttachment* parentMesh); +SP_API spMeshAttachment* spMeshAttachment_create (const char* name); +SP_API void spMeshAttachment_updateUVs (spMeshAttachment* self); +SP_API void spMeshAttachment_setParentMesh (spMeshAttachment* self, spMeshAttachment* parentMesh); #ifdef SPINE_SHORT_NAMES typedef spMeshAttachment MeshAttachment; diff --git a/spine-c/spine-c/include/spine/PathAttachment.h b/spine-c/spine-c/include/spine/PathAttachment.h index fe529d70b..a953924a1 100644 --- a/spine-c/spine-c/include/spine/PathAttachment.h +++ b/spine-c/spine-c/include/spine/PathAttachment.h @@ -31,6 +31,7 @@ #ifndef SPINE_PATHATTACHMENT_H_ #define SPINE_PATHATTACHMENT_H_ +#include #include #include #include @@ -47,7 +48,7 @@ typedef struct spPathAttachment { int/*bool*/ closed, constantSpeed; } spPathAttachment; -spPathAttachment* spPathAttachment_create (const char* name); +SP_API spPathAttachment* spPathAttachment_create (const char* name); #ifdef SPINE_SHORT_NAMES typedef spPathAttachment PathAttachment; diff --git a/spine-c/spine-c/include/spine/PathConstraint.h b/spine-c/spine-c/include/spine/PathConstraint.h index 836708ae2..9d0ec10be 100644 --- a/spine-c/spine-c/include/spine/PathConstraint.h +++ b/spine-c/spine-c/include/spine/PathConstraint.h @@ -31,6 +31,7 @@ #ifndef SPINE_PATHCONSTRAINT_H_ #define SPINE_PATHCONSTRAINT_H_ +#include #include #include #include @@ -92,11 +93,11 @@ typedef struct spPathConstraint { #define SP_PATHCONSTRAINT_ -spPathConstraint* spPathConstraint_create (spPathConstraintData* data, const struct spSkeleton* skeleton); -void spPathConstraint_dispose (spPathConstraint* self); +SP_API spPathConstraint* spPathConstraint_create (spPathConstraintData* data, const struct spSkeleton* skeleton); +SP_API void spPathConstraint_dispose (spPathConstraint* self); -void spPathConstraint_apply (spPathConstraint* self); -float* spPathConstraint_computeWorldPositions(spPathConstraint* self, spPathAttachment* path, int spacesCount, int/*bool*/ tangents, int/*bool*/percentPosition, int/**/percentSpacing); +SP_API void spPathConstraint_apply (spPathConstraint* self); +SP_API float* spPathConstraint_computeWorldPositions(spPathConstraint* self, spPathAttachment* path, int spacesCount, int/*bool*/ tangents, int/*bool*/percentPosition, int/**/percentSpacing); #ifdef SPINE_SHORT_NAMES typedef spPathConstraint PathConstraint; diff --git a/spine-c/spine-c/include/spine/PathConstraintData.h b/spine-c/spine-c/include/spine/PathConstraintData.h index 31c9fad20..5a24cc37f 100644 --- a/spine-c/spine-c/include/spine/PathConstraintData.h +++ b/spine-c/spine-c/include/spine/PathConstraintData.h @@ -31,6 +31,7 @@ #ifndef SPINE_PATHCONSTRAINTDATA_H_ #define SPINE_PATHCONSTRAINTDATA_H_ +#include #include #include @@ -80,8 +81,8 @@ typedef struct spPathConstraintData { #endif } spPathConstraintData; -spPathConstraintData* spPathConstraintData_create (const char* name); -void spPathConstraintData_dispose (spPathConstraintData* self); +SP_API spPathConstraintData* spPathConstraintData_create (const char* name); +SP_API void spPathConstraintData_dispose (spPathConstraintData* self); #ifdef SPINE_SHORT_NAMES typedef spPathConstraintData PathConstraintData; diff --git a/spine-c/spine-c/include/spine/PointAttachment.h b/spine-c/spine-c/include/spine/PointAttachment.h index bfbda8fd8..da8df6cbb 100644 --- a/spine-c/spine-c/include/spine/PointAttachment.h +++ b/spine-c/spine-c/include/spine/PointAttachment.h @@ -31,6 +31,7 @@ #ifndef SPINE_POINTATTACHMENT_H_ #define SPINE_POINTATTACHMENT_H_ +#include #include #include #include @@ -46,9 +47,9 @@ typedef struct spPointAttachment { spColor color; } spPointAttachment; -spPointAttachment* spPointAttachment_create (const char* name); -void spPointAttachment_computeWorldPosition (spPointAttachment* self, spBone* bone, float* x, float* y); -float spPointAttachment_computeWorldRotation (spPointAttachment* self, spBone* bone); +SP_API spPointAttachment* spPointAttachment_create (const char* name); +SP_API void spPointAttachment_computeWorldPosition (spPointAttachment* self, spBone* bone, float* x, float* y); +SP_API float spPointAttachment_computeWorldRotation (spPointAttachment* self, spBone* bone); #ifdef SPINE_SHORT_NAMES typedef spPointAttachment PointAttachment; diff --git a/spine-c/spine-c/include/spine/RegionAttachment.h b/spine-c/spine-c/include/spine/RegionAttachment.h index a77f7321c..9e23d5bdf 100644 --- a/spine-c/spine-c/include/spine/RegionAttachment.h +++ b/spine-c/spine-c/include/spine/RegionAttachment.h @@ -31,6 +31,7 @@ #ifndef SPINE_REGIONATTACHMENT_H_ #define SPINE_REGIONATTACHMENT_H_ +#include #include #include #include @@ -54,10 +55,10 @@ typedef struct spRegionAttachment { float uvs[8]; } spRegionAttachment; -spRegionAttachment* spRegionAttachment_create (const char* name); -void spRegionAttachment_setUVs (spRegionAttachment* self, float u, float v, float u2, float v2, int/*bool*/rotate); -void spRegionAttachment_updateOffset (spRegionAttachment* self); -void spRegionAttachment_computeWorldVertices (spRegionAttachment* self, spBone* bone, float* vertices, int offset, int stride); +SP_API spRegionAttachment* spRegionAttachment_create (const char* name); +SP_API void spRegionAttachment_setUVs (spRegionAttachment* self, float u, float v, float u2, float v2, int/*bool*/rotate); +SP_API void spRegionAttachment_updateOffset (spRegionAttachment* self); +SP_API void spRegionAttachment_computeWorldVertices (spRegionAttachment* self, spBone* bone, float* vertices, int offset, int stride); #ifdef SPINE_SHORT_NAMES typedef spRegionAttachment RegionAttachment; diff --git a/spine-c/spine-c/include/spine/Skeleton.h b/spine-c/spine-c/include/spine/Skeleton.h index 3d8973f20..0df9fe076 100644 --- a/spine-c/spine-c/include/spine/Skeleton.h +++ b/spine-c/spine-c/include/spine/Skeleton.h @@ -31,6 +31,7 @@ #ifndef SPINE_SKELETON_H_ #define SPINE_SKELETON_H_ +#include #include #include #include @@ -94,57 +95,57 @@ typedef struct spSkeleton { #endif } spSkeleton; -spSkeleton* spSkeleton_create (spSkeletonData* data); -void spSkeleton_dispose (spSkeleton* self); +SP_API spSkeleton* spSkeleton_create (spSkeletonData* data); +SP_API void spSkeleton_dispose (spSkeleton* self); /* Caches information about bones and constraints. Must be called if bones or constraints, or weighted path attachments * are added or removed. */ -void spSkeleton_updateCache (spSkeleton* self); -void spSkeleton_updateWorldTransform (const spSkeleton* self); +SP_API void spSkeleton_updateCache (spSkeleton* self); +SP_API void spSkeleton_updateWorldTransform (const spSkeleton* self); /* Sets the bones, constraints, and slots to their setup pose values. */ -void spSkeleton_setToSetupPose (const spSkeleton* self); +SP_API void spSkeleton_setToSetupPose (const spSkeleton* self); /* Sets the bones and constraints to their setup pose values. */ -void spSkeleton_setBonesToSetupPose (const spSkeleton* self); -void spSkeleton_setSlotsToSetupPose (const spSkeleton* self); +SP_API void spSkeleton_setBonesToSetupPose (const spSkeleton* self); +SP_API void spSkeleton_setSlotsToSetupPose (const spSkeleton* self); /* Returns 0 if the bone was not found. */ -spBone* spSkeleton_findBone (const spSkeleton* self, const char* boneName); +SP_API spBone* spSkeleton_findBone (const spSkeleton* self, const char* boneName); /* Returns -1 if the bone was not found. */ -int spSkeleton_findBoneIndex (const spSkeleton* self, const char* boneName); +SP_API int spSkeleton_findBoneIndex (const spSkeleton* self, const char* boneName); /* Returns 0 if the slot was not found. */ -spSlot* spSkeleton_findSlot (const spSkeleton* self, const char* slotName); +SP_API spSlot* spSkeleton_findSlot (const spSkeleton* self, const char* slotName); /* Returns -1 if the slot was not found. */ -int spSkeleton_findSlotIndex (const spSkeleton* self, const char* slotName); +SP_API int spSkeleton_findSlotIndex (const spSkeleton* self, const char* slotName); /* Sets the skin used to look up attachments before looking in the SkeletonData defaultSkin. Attachments from the new skin are * attached if the corresponding attachment from the old skin was attached. If there was no old skin, each slot's setup mode * attachment is attached from the new skin. * @param skin May be 0.*/ -void spSkeleton_setSkin (spSkeleton* self, spSkin* skin); +SP_API void spSkeleton_setSkin (spSkeleton* self, spSkin* skin); /* Returns 0 if the skin was not found. See spSkeleton_setSkin. * @param skinName May be 0. */ -int spSkeleton_setSkinByName (spSkeleton* self, const char* skinName); +SP_API int spSkeleton_setSkinByName (spSkeleton* self, const char* skinName); /* Returns 0 if the slot or attachment was not found. */ -spAttachment* spSkeleton_getAttachmentForSlotName (const spSkeleton* self, const char* slotName, const char* attachmentName); +SP_API spAttachment* spSkeleton_getAttachmentForSlotName (const spSkeleton* self, const char* slotName, const char* attachmentName); /* Returns 0 if the slot or attachment was not found. */ -spAttachment* spSkeleton_getAttachmentForSlotIndex (const spSkeleton* self, int slotIndex, const char* attachmentName); +SP_API spAttachment* spSkeleton_getAttachmentForSlotIndex (const spSkeleton* self, int slotIndex, const char* attachmentName); /* Returns 0 if the slot or attachment was not found. * @param attachmentName May be 0. */ -int spSkeleton_setAttachment (spSkeleton* self, const char* slotName, const char* attachmentName); +SP_API int spSkeleton_setAttachment (spSkeleton* self, const char* slotName, const char* attachmentName); /* Returns 0 if the IK constraint was not found. */ -spIkConstraint* spSkeleton_findIkConstraint (const spSkeleton* self, const char* constraintName); +SP_API spIkConstraint* spSkeleton_findIkConstraint (const spSkeleton* self, const char* constraintName); /* Returns 0 if the transform constraint was not found. */ -spTransformConstraint* spSkeleton_findTransformConstraint (const spSkeleton* self, const char* constraintName); +SP_API spTransformConstraint* spSkeleton_findTransformConstraint (const spSkeleton* self, const char* constraintName); /* Returns 0 if the path constraint was not found. */ -spPathConstraint* spSkeleton_findPathConstraint (const spSkeleton* self, const char* constraintName); +SP_API spPathConstraint* spSkeleton_findPathConstraint (const spSkeleton* self, const char* constraintName); -void spSkeleton_update (spSkeleton* self, float deltaTime); +SP_API void spSkeleton_update (spSkeleton* self, float deltaTime); #ifdef SPINE_SHORT_NAMES typedef spSkeleton Skeleton; diff --git a/spine-c/spine-c/include/spine/SkeletonBinary.h b/spine-c/spine-c/include/spine/SkeletonBinary.h index 7a84382e1..3d96a1da9 100644 --- a/spine-c/spine-c/include/spine/SkeletonBinary.h +++ b/spine-c/spine-c/include/spine/SkeletonBinary.h @@ -31,6 +31,7 @@ #ifndef SPINE_SKELETONBINARY_H_ #define SPINE_SKELETONBINARY_H_ +#include #include #include #include @@ -48,12 +49,12 @@ typedef struct spSkeletonBinary { const char* const error; } spSkeletonBinary; -spSkeletonBinary* spSkeletonBinary_createWithLoader (spAttachmentLoader* attachmentLoader); -spSkeletonBinary* spSkeletonBinary_create (spAtlas* atlas); -void spSkeletonBinary_dispose (spSkeletonBinary* self); +SP_API spSkeletonBinary* spSkeletonBinary_createWithLoader (spAttachmentLoader* attachmentLoader); +SP_API spSkeletonBinary* spSkeletonBinary_create (spAtlas* atlas); +SP_API void spSkeletonBinary_dispose (spSkeletonBinary* self); -spSkeletonData* spSkeletonBinary_readSkeletonData (spSkeletonBinary* self, const unsigned char* binary, const int length); -spSkeletonData* spSkeletonBinary_readSkeletonDataFile (spSkeletonBinary* self, const char* path); +SP_API spSkeletonData* spSkeletonBinary_readSkeletonData (spSkeletonBinary* self, const unsigned char* binary, const int length); +SP_API spSkeletonData* spSkeletonBinary_readSkeletonDataFile (spSkeletonBinary* self, const char* path); #ifdef SPINE_SHORT_NAMES typedef spSkeletonBinary SkeletonBinary; diff --git a/spine-c/spine-c/include/spine/SkeletonBounds.h b/spine-c/spine-c/include/spine/SkeletonBounds.h index 83add8fcc..da435c0a7 100644 --- a/spine-c/spine-c/include/spine/SkeletonBounds.h +++ b/spine-c/spine-c/include/spine/SkeletonBounds.h @@ -31,6 +31,7 @@ #ifndef SPINE_SKELETONBOUNDS_H_ #define SPINE_SKELETONBOUNDS_H_ +#include #include #include @@ -44,11 +45,11 @@ typedef struct spPolygon { int capacity; } spPolygon; -spPolygon* spPolygon_create (int capacity); -void spPolygon_dispose (spPolygon* self); +SP_API spPolygon* spPolygon_create (int capacity); +SP_API void spPolygon_dispose (spPolygon* self); -int/*bool*/spPolygon_containsPoint (spPolygon* polygon, float x, float y); -int/*bool*/spPolygon_intersectsSegment (spPolygon* polygon, float x1, float y1, float x2, float y2); +SP_API int/*bool*/spPolygon_containsPoint (spPolygon* polygon, float x, float y); +SP_API int/*bool*/spPolygon_intersectsSegment (spPolygon* polygon, float x1, float y1, float x2, float y2); #ifdef SPINE_SHORT_NAMES typedef spPolygon Polygon; @@ -68,29 +69,29 @@ typedef struct spSkeletonBounds { float minX, minY, maxX, maxY; } spSkeletonBounds; -spSkeletonBounds* spSkeletonBounds_create (); -void spSkeletonBounds_dispose (spSkeletonBounds* self); -void spSkeletonBounds_update (spSkeletonBounds* self, spSkeleton* skeleton, int/*bool*/updateAabb); +SP_API spSkeletonBounds* spSkeletonBounds_create (); +SP_API void spSkeletonBounds_dispose (spSkeletonBounds* self); +SP_API void spSkeletonBounds_update (spSkeletonBounds* self, spSkeleton* skeleton, int/*bool*/updateAabb); /** Returns true if the axis aligned bounding box contains the point. */ -int/*bool*/spSkeletonBounds_aabbContainsPoint (spSkeletonBounds* self, float x, float y); +SP_API int/*bool*/spSkeletonBounds_aabbContainsPoint (spSkeletonBounds* self, float x, float y); /** Returns true if the axis aligned bounding box intersects the line segment. */ -int/*bool*/spSkeletonBounds_aabbIntersectsSegment (spSkeletonBounds* self, float x1, float y1, float x2, float y2); +SP_API int/*bool*/spSkeletonBounds_aabbIntersectsSegment (spSkeletonBounds* self, float x1, float y1, float x2, float y2); /** Returns true if the axis aligned bounding box intersects the axis aligned bounding box of the specified bounds. */ -int/*bool*/spSkeletonBounds_aabbIntersectsSkeleton (spSkeletonBounds* self, spSkeletonBounds* bounds); +SP_API int/*bool*/spSkeletonBounds_aabbIntersectsSkeleton (spSkeletonBounds* self, spSkeletonBounds* bounds); /** Returns the first bounding box attachment that contains the point, or null. When doing many checks, it is usually more * efficient to only call this method if spSkeletonBounds_aabbContainsPoint returns true. */ -spBoundingBoxAttachment* spSkeletonBounds_containsPoint (spSkeletonBounds* self, float x, float y); +SP_API spBoundingBoxAttachment* spSkeletonBounds_containsPoint (spSkeletonBounds* self, float x, float y); /** Returns the first bounding box attachment that contains the line segment, or null. When doing many checks, it is usually * more efficient to only call this method if spSkeletonBounds_aabbIntersectsSegment returns true. */ -spBoundingBoxAttachment* spSkeletonBounds_intersectsSegment (spSkeletonBounds* self, float x1, float y1, float x2, float y2); +SP_API spBoundingBoxAttachment* spSkeletonBounds_intersectsSegment (spSkeletonBounds* self, float x1, float y1, float x2, float y2); /** Returns the polygon for the specified bounding box, or null. */ -spPolygon* spSkeletonBounds_getPolygon (spSkeletonBounds* self, spBoundingBoxAttachment* boundingBox); +SP_API spPolygon* spSkeletonBounds_getPolygon (spSkeletonBounds* self, spBoundingBoxAttachment* boundingBox); #ifdef SPINE_SHORT_NAMES typedef spSkeletonBounds SkeletonBounds; diff --git a/spine-c/spine-c/include/spine/SkeletonClipping.h b/spine-c/spine-c/include/spine/SkeletonClipping.h index fe9a95308..74f21fccb 100644 --- a/spine-c/spine-c/include/spine/SkeletonClipping.h +++ b/spine-c/spine-c/include/spine/SkeletonClipping.h @@ -31,6 +31,7 @@ #ifndef SPINE_SKELETONCLIPPING_H #define SPINE_SKELETONCLIPPING_H +#include #include #include #include @@ -52,13 +53,13 @@ typedef struct spSkeletonClipping { spArrayFloatArray* clippingPolygons; } spSkeletonClipping; -spSkeletonClipping* spSkeletonClipping_create(); -int spSkeletonClipping_clipStart(spSkeletonClipping* self, spSlot* slot, spClippingAttachment* clip); -void spSkeletonClipping_clipEnd(spSkeletonClipping* self, spSlot* slot); -void spSkeletonClipping_clipEnd2(spSkeletonClipping* self); -int /*boolean*/ spSkeletonClipping_isClipping(spSkeletonClipping* self); -void spSkeletonClipping_clipTriangles(spSkeletonClipping* self, float* vertices, int verticesLength, unsigned short* triangles, int trianglesLength, float* uvs, int stride); -void spSkeletonClipping_dispose(spSkeletonClipping* self); +SP_API spSkeletonClipping* spSkeletonClipping_create(); +SP_API int spSkeletonClipping_clipStart(spSkeletonClipping* self, spSlot* slot, spClippingAttachment* clip); +SP_API void spSkeletonClipping_clipEnd(spSkeletonClipping* self, spSlot* slot); +SP_API void spSkeletonClipping_clipEnd2(spSkeletonClipping* self); +SP_API int /*boolean*/ spSkeletonClipping_isClipping(spSkeletonClipping* self); +SP_API void spSkeletonClipping_clipTriangles(spSkeletonClipping* self, float* vertices, int verticesLength, unsigned short* triangles, int trianglesLength, float* uvs, int stride); +SP_API void spSkeletonClipping_dispose(spSkeletonClipping* self); #ifdef __cplusplus } diff --git a/spine-c/spine-c/include/spine/SkeletonData.h b/spine-c/spine-c/include/spine/SkeletonData.h index 4245100ca..5cbf3e1d4 100644 --- a/spine-c/spine-c/include/spine/SkeletonData.h +++ b/spine-c/spine-c/include/spine/SkeletonData.h @@ -31,6 +31,7 @@ #ifndef SPINE_SKELETONDATA_H_ #define SPINE_SKELETONDATA_H_ +#include #include #include #include @@ -75,26 +76,26 @@ typedef struct spSkeletonData { spPathConstraintData** pathConstraints; } spSkeletonData; -spSkeletonData* spSkeletonData_create (); -void spSkeletonData_dispose (spSkeletonData* self); +SP_API spSkeletonData* spSkeletonData_create (); +SP_API void spSkeletonData_dispose (spSkeletonData* self); -spBoneData* spSkeletonData_findBone (const spSkeletonData* self, const char* boneName); -int spSkeletonData_findBoneIndex (const spSkeletonData* self, const char* boneName); +SP_API spBoneData* spSkeletonData_findBone (const spSkeletonData* self, const char* boneName); +SP_API int spSkeletonData_findBoneIndex (const spSkeletonData* self, const char* boneName); -spSlotData* spSkeletonData_findSlot (const spSkeletonData* self, const char* slotName); -int spSkeletonData_findSlotIndex (const spSkeletonData* self, const char* slotName); +SP_API spSlotData* spSkeletonData_findSlot (const spSkeletonData* self, const char* slotName); +SP_API int spSkeletonData_findSlotIndex (const spSkeletonData* self, const char* slotName); -spSkin* spSkeletonData_findSkin (const spSkeletonData* self, const char* skinName); +SP_API spSkin* spSkeletonData_findSkin (const spSkeletonData* self, const char* skinName); -spEventData* spSkeletonData_findEvent (const spSkeletonData* self, const char* eventName); +SP_API spEventData* spSkeletonData_findEvent (const spSkeletonData* self, const char* eventName); -spAnimation* spSkeletonData_findAnimation (const spSkeletonData* self, const char* animationName); +SP_API spAnimation* spSkeletonData_findAnimation (const spSkeletonData* self, const char* animationName); -spIkConstraintData* spSkeletonData_findIkConstraint (const spSkeletonData* self, const char* constraintName); +SP_API spIkConstraintData* spSkeletonData_findIkConstraint (const spSkeletonData* self, const char* constraintName); -spTransformConstraintData* spSkeletonData_findTransformConstraint (const spSkeletonData* self, const char* constraintName); +SP_API spTransformConstraintData* spSkeletonData_findTransformConstraint (const spSkeletonData* self, const char* constraintName); -spPathConstraintData* spSkeletonData_findPathConstraint (const spSkeletonData* self, const char* constraintName); +SP_API spPathConstraintData* spSkeletonData_findPathConstraint (const spSkeletonData* self, const char* constraintName); #ifdef SPINE_SHORT_NAMES typedef spSkeletonData SkeletonData; diff --git a/spine-c/spine-c/include/spine/SkeletonJson.h b/spine-c/spine-c/include/spine/SkeletonJson.h index b7159fdd6..96f1b86ec 100644 --- a/spine-c/spine-c/include/spine/SkeletonJson.h +++ b/spine-c/spine-c/include/spine/SkeletonJson.h @@ -31,6 +31,7 @@ #ifndef SPINE_SKELETONJSON_H_ #define SPINE_SKELETONJSON_H_ +#include #include #include #include @@ -49,12 +50,12 @@ typedef struct spSkeletonJson { const char* const error; } spSkeletonJson; -spSkeletonJson* spSkeletonJson_createWithLoader (spAttachmentLoader* attachmentLoader); -spSkeletonJson* spSkeletonJson_create (spAtlas* atlas); -void spSkeletonJson_dispose (spSkeletonJson* self); +SP_API spSkeletonJson* spSkeletonJson_createWithLoader (spAttachmentLoader* attachmentLoader); +SP_API spSkeletonJson* spSkeletonJson_create (spAtlas* atlas); +SP_API void spSkeletonJson_dispose (spSkeletonJson* self); -spSkeletonData* spSkeletonJson_readSkeletonData (spSkeletonJson* self, const char* json); -spSkeletonData* spSkeletonJson_readSkeletonDataFile (spSkeletonJson* self, const char* path); +SP_API spSkeletonData* spSkeletonJson_readSkeletonData (spSkeletonJson* self, const char* json); +SP_API spSkeletonData* spSkeletonJson_readSkeletonDataFile (spSkeletonJson* self, const char* path); #ifdef SPINE_SHORT_NAMES typedef spSkeletonJson SkeletonJson; diff --git a/spine-c/spine-c/include/spine/Skin.h b/spine-c/spine-c/include/spine/Skin.h index 90ec026fa..806cde877 100644 --- a/spine-c/spine-c/include/spine/Skin.h +++ b/spine-c/spine-c/include/spine/Skin.h @@ -31,6 +31,7 @@ #ifndef SPINE_SKIN_H_ #define SPINE_SKIN_H_ +#include #include #ifdef __cplusplus @@ -63,19 +64,19 @@ typedef struct { _Entry* entries; } _spSkin; -spSkin* spSkin_create (const char* name); -void spSkin_dispose (spSkin* self); +SP_API spSkin* spSkin_create (const char* name); +SP_API void spSkin_dispose (spSkin* self); /* The Skin owns the attachment. */ -void spSkin_addAttachment (spSkin* self, int slotIndex, const char* name, spAttachment* attachment); +SP_API void spSkin_addAttachment (spSkin* self, int slotIndex, const char* name, spAttachment* attachment); /* Returns 0 if the attachment was not found. */ -spAttachment* spSkin_getAttachment (const spSkin* self, int slotIndex, const char* name); +SP_API spAttachment* spSkin_getAttachment (const spSkin* self, int slotIndex, const char* name); /* Returns 0 if the slot or attachment was not found. */ -const char* spSkin_getAttachmentName (const spSkin* self, int slotIndex, int attachmentIndex); +SP_API const char* spSkin_getAttachmentName (const spSkin* self, int slotIndex, int attachmentIndex); /** Attach each attachment in this skin if the corresponding attachment in oldSkin is currently attached. */ -void spSkin_attachAll (const spSkin* self, struct spSkeleton* skeleton, const spSkin* oldspSkin); +SP_API void spSkin_attachAll (const spSkin* self, struct spSkeleton* skeleton, const spSkin* oldspSkin); #ifdef SPINE_SHORT_NAMES typedef spSkin Skin; diff --git a/spine-c/spine-c/include/spine/Slot.h b/spine-c/spine-c/include/spine/Slot.h index 54a9d6b53..04647689a 100644 --- a/spine-c/spine-c/include/spine/Slot.h +++ b/spine-c/spine-c/include/spine/Slot.h @@ -31,6 +31,7 @@ #ifndef SPINE_SLOT_H_ #define SPINE_SLOT_H_ +#include #include #include #include @@ -64,16 +65,16 @@ typedef struct spSlot { #endif } spSlot; -spSlot* spSlot_create (spSlotData* data, spBone* bone); -void spSlot_dispose (spSlot* self); +SP_API spSlot* spSlot_create (spSlotData* data, spBone* bone); +SP_API void spSlot_dispose (spSlot* self); /* @param attachment May be 0 to clear the attachment for the slot. */ -void spSlot_setAttachment (spSlot* self, spAttachment* attachment); +SP_API void spSlot_setAttachment (spSlot* self, spAttachment* attachment); -void spSlot_setAttachmentTime (spSlot* self, float time); -float spSlot_getAttachmentTime (const spSlot* self); +SP_API void spSlot_setAttachmentTime (spSlot* self, float time); +SP_API float spSlot_getAttachmentTime (const spSlot* self); -void spSlot_setToSetupPose (spSlot* self); +SP_API void spSlot_setToSetupPose (spSlot* self); #ifdef SPINE_SHORT_NAMES typedef spSlot Slot; diff --git a/spine-c/spine-c/include/spine/SlotData.h b/spine-c/spine-c/include/spine/SlotData.h index 2978b29f2..1e12da61a 100644 --- a/spine-c/spine-c/include/spine/SlotData.h +++ b/spine-c/spine-c/include/spine/SlotData.h @@ -31,6 +31,7 @@ #ifndef SPINE_SLOTDATA_H_ #define SPINE_SLOTDATA_H_ +#include #include #include @@ -64,11 +65,11 @@ typedef struct spSlotData { #endif } spSlotData; -spSlotData* spSlotData_create (const int index, const char* name, spBoneData* boneData); -void spSlotData_dispose (spSlotData* self); +SP_API spSlotData* spSlotData_create (const int index, const char* name, spBoneData* boneData); +SP_API void spSlotData_dispose (spSlotData* self); /* @param attachmentName May be 0 for no setup pose attachment. */ -void spSlotData_setAttachmentName (spSlotData* self, const char* attachmentName); +SP_API void spSlotData_setAttachmentName (spSlotData* self, const char* attachmentName); #ifdef SPINE_SHORT_NAMES typedef spBlendMode BlendMode; diff --git a/spine-c/spine-c/include/spine/TransformConstraint.h b/spine-c/spine-c/include/spine/TransformConstraint.h index 254297834..07721cf14 100644 --- a/spine-c/spine-c/include/spine/TransformConstraint.h +++ b/spine-c/spine-c/include/spine/TransformConstraint.h @@ -31,6 +31,7 @@ #ifndef SPINE_TRANSFORMCONSTRAINT_H_ #define SPINE_TRANSFORMCONSTRAINT_H_ +#include #include #include @@ -61,10 +62,10 @@ typedef struct spTransformConstraint { #endif } spTransformConstraint; -spTransformConstraint* spTransformConstraint_create (spTransformConstraintData* data, const struct spSkeleton* skeleton); -void spTransformConstraint_dispose (spTransformConstraint* self); +SP_API spTransformConstraint* spTransformConstraint_create (spTransformConstraintData* data, const struct spSkeleton* skeleton); +SP_API void spTransformConstraint_dispose (spTransformConstraint* self); -void spTransformConstraint_apply (spTransformConstraint* self); +SP_API void spTransformConstraint_apply (spTransformConstraint* self); #ifdef SPINE_SHORT_NAMES typedef spTransformConstraint TransformConstraint; diff --git a/spine-c/spine-c/include/spine/TransformConstraintData.h b/spine-c/spine-c/include/spine/TransformConstraintData.h index 66526fdb8..8e6c33ff7 100644 --- a/spine-c/spine-c/include/spine/TransformConstraintData.h +++ b/spine-c/spine-c/include/spine/TransformConstraintData.h @@ -31,6 +31,7 @@ #ifndef SPINE_TRANSFORMCONSTRAINTDATA_H_ #define SPINE_TRANSFORMCONSTRAINTDATA_H_ +#include #include #ifdef __cplusplus @@ -70,8 +71,8 @@ typedef struct spTransformConstraintData { #endif } spTransformConstraintData; -spTransformConstraintData* spTransformConstraintData_create (const char* name); -void spTransformConstraintData_dispose (spTransformConstraintData* self); +SP_API spTransformConstraintData* spTransformConstraintData_create (const char* name); +SP_API void spTransformConstraintData_dispose (spTransformConstraintData* self); #ifdef SPINE_SHORT_NAMES typedef spTransformConstraintData TransformConstraintData; diff --git a/spine-c/spine-c/include/spine/Triangulator.h b/spine-c/spine-c/include/spine/Triangulator.h index 14fa25fd1..69863b2f7 100644 --- a/spine-c/spine-c/include/spine/Triangulator.h +++ b/spine-c/spine-c/include/spine/Triangulator.h @@ -31,6 +31,7 @@ #ifndef SPINE_TRIANGULATOR_H #define SPINE_TRIANGULATOR_H +#include #include #ifdef __cplusplus @@ -49,10 +50,10 @@ typedef struct spTriangulator { spArrayShortArray* polygonIndicesPool; } spTriangulator; -spTriangulator* spTriangulator_create(); -spShortArray* spTriangulator_triangulate(spTriangulator* self, spFloatArray* verticesArray); -spArrayFloatArray* spTriangulator_decompose(spTriangulator* self, spFloatArray* verticesArray, spShortArray* triangles); -void spTriangulator_dispose(spTriangulator* self); +SP_API spTriangulator* spTriangulator_create(); +SP_API spShortArray* spTriangulator_triangulate(spTriangulator* self, spFloatArray* verticesArray); +SP_API spArrayFloatArray* spTriangulator_decompose(spTriangulator* self, spFloatArray* verticesArray, spShortArray* triangles); +SP_API void spTriangulator_dispose(spTriangulator* self); #ifdef __cplusplus diff --git a/spine-c/spine-c/include/spine/VertexAttachment.h b/spine-c/spine-c/include/spine/VertexAttachment.h index 759921a39..7d232cc6e 100644 --- a/spine-c/spine-c/include/spine/VertexAttachment.h +++ b/spine-c/spine-c/include/spine/VertexAttachment.h @@ -31,6 +31,7 @@ #ifndef SPINE_VERTEXATTACHMENT_H_ #define SPINE_VERTEXATTACHMENT_H_ +#include #include #include @@ -53,7 +54,7 @@ struct spVertexAttachment { int id; }; -void spVertexAttachment_computeWorldVertices (spVertexAttachment* self, spSlot* slot, int start, int count, float* worldVertices, int offset, int stride); +SP_API void spVertexAttachment_computeWorldVertices (spVertexAttachment* self, spSlot* slot, int start, int count, float* worldVertices, int offset, int stride); #ifdef SPINE_SHORT_NAMES typedef spVertexAttachment VertexAttachment; diff --git a/spine-c/spine-c/include/spine/VertexEffect.h b/spine-c/spine-c/include/spine/VertexEffect.h index ae738ccd1..4f670119b 100644 --- a/spine-c/spine-c/include/spine/VertexEffect.h +++ b/spine-c/spine-c/include/spine/VertexEffect.h @@ -31,6 +31,7 @@ #ifndef SPINE_VERTEXEFFECT_H_ #define SPINE_VERTEXEFFECT_H_ +#include #include #include @@ -69,13 +70,13 @@ typedef struct spSwirlVertexEffect { float worldY; } spSwirlVertexEffect; -spJitterVertexEffect *spJitterVertexEffect_create(float jitterX, float jitterY); +SP_API spJitterVertexEffect *spJitterVertexEffect_create(float jitterX, float jitterY); -void spJitterVertexEffect_dispose(spJitterVertexEffect *effect); +SP_API void spJitterVertexEffect_dispose(spJitterVertexEffect *effect); -spSwirlVertexEffect *spSwirlVertexEffect_create(float radius); +SP_API spSwirlVertexEffect *spSwirlVertexEffect_create(float radius); -void spSwirlVertexEffect_dispose(spSwirlVertexEffect *effect); +SP_API void spSwirlVertexEffect_dispose(spSwirlVertexEffect *effect); #ifdef __cplusplus } diff --git a/spine-c/spine-c/include/spine/dll.h b/spine-c/spine-c/include/spine/dll.h new file mode 100644 index 000000000..df85643e5 --- /dev/null +++ b/spine-c/spine-c/include/spine/dll.h @@ -0,0 +1,48 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#ifndef SPINE_SHAREDLIB_H +#define SPINE_SHAREDLIB_H + +#define SP_API + +#ifdef _WIN32 + #define DLLIMPORT __declspec(dllimport) + #define DLLEXPORT __declspec(dllexport) +#else + #define DLLIMPORT + #define DLLEXPORT +#endif + +#ifdef SPINEPLUGIN_API + #define SP_API SPINEPLUGIN_API +#endif + +#endif /* SPINE_SHAREDLIB_H */ \ No newline at end of file diff --git a/spine-c/spine-c/include/spine/spine.h b/spine-c/spine-c/include/spine/spine.h index 56f4b3cde..5085ed8e3 100644 --- a/spine-c/spine-c/include/spine/spine.h +++ b/spine-c/spine-c/include/spine/spine.h @@ -31,6 +31,7 @@ #ifndef SPINE_SPINE_H_ #define SPINE_SPINE_H_ +#include #include #include #include diff --git a/spine-ue4/Content/Test/Test.umap b/spine-ue4/Content/Test/Test.umap index 80d633a1e167a4a13475a1a6307aa3c3196dbe45..f5fc98e8c2058eb5405d550591929a8189d0403e 100644 GIT binary patch literal 67953 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%0DJSf1&^WB0=9mhYfyk&>`?^wj8SMBiW#%9Oy_< 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 literal 28104 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 struct FRuntimeMeshVertexTraits diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineBoneDriverComponent.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineBoneDriverComponent.cpp index 8a99bc6cb..b2143b83b 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineBoneDriverComponent.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineBoneDriverComponent.cpp @@ -31,7 +31,6 @@ #include "SpinePluginPrivatePCH.h" USpineBoneDriverComponent::USpineBoneDriverComponent () { - bWantsBeginPlay = true; PrimaryComponentTick.bCanEverTick = true; bTickInEditor = true; bAutoActivate = true; diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineBoneFollowerComponent.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineBoneFollowerComponent.cpp index 95f391aba..3795b4850 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineBoneFollowerComponent.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineBoneFollowerComponent.cpp @@ -31,7 +31,6 @@ #include "SpinePluginPrivatePCH.h" USpineBoneFollowerComponent::USpineBoneFollowerComponent () { - bWantsBeginPlay = true; PrimaryComponentTick.bCanEverTick = true; bTickInEditor = true; bAutoActivate = true; diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp index 0f7b26be6..927920bcb 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp @@ -73,7 +73,6 @@ void callback(spAnimationState* state, spEventType type, spTrackEntry* entry, sp } USpineSkeletonAnimationComponent::USpineSkeletonAnimationComponent () { - bWantsBeginPlay = true; PrimaryComponentTick.bCanEverTick = true; bTickInEditor = true; bAutoActivate = true; diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonComponent.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonComponent.cpp index 050265f87..3ba93e3fc 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonComponent.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonComponent.cpp @@ -33,7 +33,6 @@ #define LOCTEXT_NAMESPACE "Spine" USpineSkeletonComponent::USpineSkeletonComponent () { - bWantsBeginPlay = true; PrimaryComponentTick.bCanEverTick = true; bTickInEditor = true; bAutoActivate = true; diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonRendererComponent.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonRendererComponent.cpp index b82029b8e..8a7f1d2ee 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonRendererComponent.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonRendererComponent.cpp @@ -37,7 +37,6 @@ USpineSkeletonRendererComponent::USpineSkeletonRendererComponent (const FObjectInitializer& ObjectInitializer) : URuntimeMeshComponent(ObjectInitializer) { - bWantsBeginPlay = true; PrimaryComponentTick.bCanEverTick = true; bTickInEditor = true; bAutoActivate = true; diff --git a/spine-ue4/Plugins/SpinePlugin/SpinePlugin.uplugin b/spine-ue4/Plugins/SpinePlugin/SpinePlugin.uplugin index 144586253..26522d915 100644 --- a/spine-ue4/Plugins/SpinePlugin/SpinePlugin.uplugin +++ b/spine-ue4/Plugins/SpinePlugin/SpinePlugin.uplugin @@ -14,16 +14,25 @@ "CanContainContent" : true, "IsBetaVersion" : false, "Installed" : false, - "Modules" : - [ - { - "Name" : "SpinePlugin", - "Type" : "Runtime", - "LoadingPhase" : "PreDefault" - }, - { - "Name" : "SpineEditorPlugin", - "Type" : "Editor" - } - ] + "Modules": [ + { + "Name": "SpinePlugin", + "Type": "Runtime", + "LoadingPhase": "PreDefault" + }, + { + "Name": "SpineEditorPlugin", + "Type": "Editor" + } + ], + "Plugins": [ + { + "Name": "ProceduralMeshComponent", + "Enabled": true + }, + { + "Name": "RuntimeMeshComponent", + "Enabled": true + } + ] } diff --git a/spine-ue4/Source/SpineUE4/MySceneComponent.cpp b/spine-ue4/Source/SpineUE4/MySceneComponent.cpp new file mode 100644 index 000000000..be783eb9e --- /dev/null +++ b/spine-ue4/Source/SpineUE4/MySceneComponent.cpp @@ -0,0 +1,37 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#include "SpineUE4.h" +#include "MySceneComponent.h" +#include "spine/spine.h" + + +// Sets default values for this component's properties +UMySceneComponent::UMySceneComponent(const FObjectInitializer& ObjectInitializer) : USpineSkeletonRendererComponent(ObjectInitializer) +{ + // Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features + // off to improve performance if you don't need them. + PrimaryComponentTick.bCanEverTick = true; + + // ... + spColor_create(); +} + + +// Called when the game starts +void UMySceneComponent::BeginPlay() +{ + Super::BeginPlay(); + + // ... + +} + + +// Called every frame +void UMySceneComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) +{ + Super::TickComponent(DeltaTime, TickType, ThisTickFunction); + + // ... +} + diff --git a/spine-ue4/Source/SpineUE4/MySceneComponent.h b/spine-ue4/Source/SpineUE4/MySceneComponent.h new file mode 100644 index 000000000..92f20d67e --- /dev/null +++ b/spine-ue4/Source/SpineUE4/MySceneComponent.h @@ -0,0 +1,30 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "Components/SceneComponent.h" +#include "SpineSkeletonRendererComponent.h" +#include "MySceneComponent.generated.h" + + +UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) ) +class SPINEUE4_API UMySceneComponent : public USpineSkeletonRendererComponent +{ + GENERATED_BODY() + +public: + // Sets default values for this component's properties + UMySceneComponent(const FObjectInitializer& ObjectInitializer); + +protected: + // Called when the game starts + virtual void BeginPlay() override; + +public: + // Called every frame + virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; + + + +}; diff --git a/spine-ue4/Source/SpineUE4/SpineUE4.Build.cs b/spine-ue4/Source/SpineUE4/SpineUE4.Build.cs index 63503caff..28e049ca4 100644 --- a/spine-ue4/Source/SpineUE4/SpineUE4.Build.cs +++ b/spine-ue4/Source/SpineUE4/SpineUE4.Build.cs @@ -6,7 +6,7 @@ public class SpineUE4 : ModuleRules { public SpineUE4(ReadOnlyTargetRules Target) : base(Target) { - PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "SpinePlugin" }); + PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "SpinePlugin", "RuntimeMeshComponent" }); PublicIncludePaths.AddRange(new string[] { "SpinePlugin/Public", "SpinePlugin/Classes" }); PrivateDependencyModuleNames.AddRange(new string[] { }); From 92c557e6bab280ec5bfa545aa46b51d023c39b8d Mon Sep 17 00:00:00 2001 From: badlogic Date: Tue, 29 Aug 2017 15:21:20 +0200 Subject: [PATCH 04/10] Updated CHANGELOG with spine-c, spine-ue4 changes --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 864608373..29c3e74f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,7 @@ * `Animation#apply` and `Timeline#apply`` now take enums `MixPose` and `MixDirection` instead of booleans * Added `spVertexEffect` and corresponding implementations `spJitterVertexEffect` and `spSwirlVertexEffect`. Create/dispose through the corresponding `spXXXVertexEffect_create()/dispose()` functions. Set on framework/engine specific renderer. See changes for spine-c based frameworks/engines below. * Functions in `extension.h` are not prefixed with `_sp` instead of just `_` to avoid interference with other libraries. + * Introduced `SP_API` macro. Every spine-c function is prefixed with this macro. By default, it is an empty string. Can be used to markup spine-c functions with e.g. ``__declspec` when compiling to a dll or linking to that dll. ### Cocos2d-X * Fixed renderer to work with 3.6 changes @@ -79,6 +80,7 @@ * Switched from built-in ProceduralMeshComponent to RuntimeMeshComponent by Koderz (https://github.com/Koderz/UE4RuntimeMeshComponent, MIT). Needed for more flexibility regarding vertex format, should not have an impact on existing code/assets. You need to copy the RuntimeMeshComponentPlugin from our repository in `spine-ue4\Plugins\` to your project as well! * Added support for two color tinting. All base materials, e.g. SpineUnlitNormalMaterial, now do proper two color tinting. No material parameters have changed. * Updated to Unreal Engine 4.16.1. Note that 4.16 has a regression which will make it impossible to compile plain .c files! + * spine-c is now exposed from the plugin shared library on Windows via __declspec. ## C# * **Breaking changes** From ad1279a71f825961d5e50d1c236c82f012f5d0b1 Mon Sep 17 00:00:00 2001 From: Serhii Yolkin Date: Fri, 1 Sep 2017 10:26:53 +0200 Subject: [PATCH 05/10] [unity] Handle null pool in SkeletonGhost.OnDestroy() (#979) --- .../Assets/spine-unity/Modules/Ghost/SkeletonGhost.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/spine-unity/Assets/spine-unity/Modules/Ghost/SkeletonGhost.cs b/spine-unity/Assets/spine-unity/Modules/Ghost/SkeletonGhost.cs index 5dea4e182..365d1272c 100644 --- a/spine-unity/Assets/spine-unity/Modules/Ghost/SkeletonGhost.cs +++ b/spine-unity/Assets/spine-unity/Modules/Ghost/SkeletonGhost.cs @@ -155,8 +155,10 @@ namespace Spine.Unity.Modules { } void OnDestroy () { - for (int i = 0; i < maximumGhosts; i++) - if (pool[i] != null) pool[i].Cleanup(); + if (pool != null) { + for (int i = 0; i < maximumGhosts; i++) + if (pool[i] != null) pool[i].Cleanup(); + } foreach (var mat in materialTable.Values) Destroy(mat); From c9722319de5bcc5671ebd15c36bf16776dea14c4 Mon Sep 17 00:00:00 2001 From: Serhii Yolkin Date: Fri, 1 Sep 2017 11:56:18 +0200 Subject: [PATCH 06/10] [unity] SkeletonAnimator and Animation optimizations (#977) * + SkeletonAnimator: optimizations, remove per-frame GC allocations on Unity 2017.1 + Minor ScaleTimeline optimization * [unity] Check + formatting SkeletonAnimator 2017.1 --- spine-csharp/src/Animation.cs | 8 +- .../Assets/spine-unity/SkeletonAnimator.cs | 86 +++++++++++++++---- 2 files changed, 71 insertions(+), 23 deletions(-) diff --git a/spine-csharp/src/Animation.cs b/spine-csharp/src/Animation.cs index e344f7319..2c8228949 100644 --- a/spine-csharp/src/Animation.cs +++ b/spine-csharp/src/Animation.cs @@ -436,11 +436,11 @@ namespace Spine { } // Mixing out uses sign of setup or current pose, else use sign of key. if (direction == MixDirection.Out) { - x = Math.Abs(x) * Math.Sign(bx); - y = Math.Abs(y) * Math.Sign(by); + x = (x >= 0 ? x : -x) * (bx >= 0 ? 1 : -1); + y = (y >= 0 ? y : -y) * (by >= 0 ? 1 : -1); } else { - bx = Math.Abs(bx) * Math.Sign(x); - by = Math.Abs(by) * Math.Sign(y); + bx = (bx >= 0 ? bx : -bx) * (x >= 0 ? 1 : -1); + by = (by >= 0 ? by : -by) * (y >= 0 ? 1 : -1); } bone.scaleX = bx + (x - bx) * alpha; bone.scaleY = by + (y - by) * alpha; diff --git a/spine-unity/Assets/spine-unity/SkeletonAnimator.cs b/spine-unity/Assets/spine-unity/SkeletonAnimator.cs index 0337eedc4..558f2177e 100644 --- a/spine-unity/Assets/spine-unity/SkeletonAnimator.cs +++ b/spine-unity/Assets/spine-unity/SkeletonAnimator.cs @@ -36,7 +36,7 @@ using System.Collections.Generic; namespace Spine.Unity { [RequireComponent(typeof(Animator))] public class SkeletonAnimator : SkeletonRenderer, ISkeletonAnimation { - + [SerializeField] protected MecanimTranslator translator; public MecanimTranslator Translator { get { return translator; } } @@ -108,9 +108,13 @@ namespace Spine.Unity { public enum MixMode { AlwaysMix, MixNext, SpineStyle } - readonly Dictionary animationTable = new Dictionary(); - readonly Dictionary clipNameHashCodeTable = new Dictionary(); + readonly Dictionary animationTable = new Dictionary(IntEqualityComparer.Instance); + readonly Dictionary clipNameHashCodeTable = new Dictionary(AnimationClipEqualityComparer.Instance); readonly List previousAnimations = new List(); + #if UNITY_2017_1_OR_NEWER + readonly List clipInfoCache = new List(); + readonly List nextClipInfoCache = new List(); + #endif Animator animator; public Animator Animator { get { return this.animator; } } @@ -144,16 +148,19 @@ namespace Spine.Unity { AnimatorStateInfo nextStateInfo = animator.GetNextAnimatorStateInfo(layer); bool hasNext = nextStateInfo.fullPathHash != 0; - AnimatorClipInfo[] clipInfo = animator.GetCurrentAnimatorClipInfo(layer); - AnimatorClipInfo[] nextClipInfo = animator.GetNextAnimatorClipInfo(layer); - for (int c = 0; c < clipInfo.Length; c++) { + int clipInfoCount, nextClipInfoCount; + IList clipInfo, nextClipInfo; + GetAnimatorClipInfos(layer, out clipInfoCount, out nextClipInfoCount, out clipInfo, out nextClipInfo); + + for (int c = 0; c < clipInfoCount; c++) { var info = clipInfo[c]; float weight = info.weight * layerWeight; if (weight == 0) continue; previousAnimations.Add(animationTable[NameHashCode(info.clip)]); } + if (hasNext) { - for (int c = 0; c < nextClipInfo.Length; c++) { + for (int c = 0; c < nextClipInfoCount; c++) { var info = nextClipInfo[c]; float weight = info.weight * layerWeight; if (weight == 0) continue; previousAnimations.Add(animationTable[NameHashCode(info.clip)]); @@ -169,22 +176,20 @@ namespace Spine.Unity { AnimatorStateInfo nextStateInfo = animator.GetNextAnimatorStateInfo(layer); bool hasNext = nextStateInfo.fullPathHash != 0; - AnimatorClipInfo[] clipInfo = animator.GetCurrentAnimatorClipInfo(layer); - AnimatorClipInfo[] nextClipInfo = animator.GetNextAnimatorClipInfo(layer); - //UNITY 4 - //bool hasNext = nextStateInfo.nameHash != 0; - //var clipInfo = animator.GetCurrentAnimationClipState(i); - //var nextClipInfo = animator.GetNextAnimationClipState(i); + + int clipInfoCount, nextClipInfoCount; + IList clipInfo, nextClipInfo; + GetAnimatorClipInfos(layer, out clipInfoCount, out nextClipInfoCount, out clipInfo, out nextClipInfo); MixMode mode = layerMixModes[layer]; if (mode == MixMode.AlwaysMix) { // Always use Mix instead of Applying the first non-zero weighted clip. - for (int c = 0; c < clipInfo.Length; c++) { + for (int c = 0; c < clipInfoCount; c++) { var info = clipInfo[c]; float weight = info.weight * layerWeight; if (weight == 0) continue; animationTable[NameHashCode(info.clip)].Apply(skeleton, 0, AnimationTime(stateInfo.normalizedTime, info.clip.length, stateInfo.loop, stateInfo.speed < 0), stateInfo.loop, null, weight, MixPose.Current, MixDirection.In); } if (hasNext) { - for (int c = 0; c < nextClipInfo.Length; c++) { + for (int c = 0; c < nextClipInfoCount; c++) { var info = nextClipInfo[c]; float weight = info.weight * layerWeight; if (weight == 0) continue; animationTable[NameHashCode(info.clip)].Apply(skeleton, 0, AnimationTime(nextStateInfo.normalizedTime , info.clip.length,nextStateInfo.speed < 0), nextStateInfo.loop, null, weight, MixPose.Current, MixDirection.In); } @@ -192,13 +197,13 @@ namespace Spine.Unity { } else { // case MixNext || SpineStyle // Apply first non-zero weighted clip int c = 0; - for (; c < clipInfo.Length; c++) { + for (; c < clipInfoCount; c++) { var info = clipInfo[c]; float weight = info.weight * layerWeight; if (weight == 0) continue; animationTable[NameHashCode(info.clip)].Apply(skeleton, 0, AnimationTime(stateInfo.normalizedTime, info.clip.length, stateInfo.loop, stateInfo.speed < 0), stateInfo.loop, null, 1f, MixPose.Current, MixDirection.In); break; } // Mix the rest - for (; c < clipInfo.Length; c++) { + for (; c < clipInfoCount; c++) { var info = clipInfo[c]; float weight = info.weight * layerWeight; if (weight == 0) continue; animationTable[NameHashCode(info.clip)].Apply(skeleton, 0, AnimationTime(stateInfo.normalizedTime, info.clip.length, stateInfo.loop, stateInfo.speed < 0), stateInfo.loop, null, weight, MixPose.Current, MixDirection.In); } @@ -207,14 +212,14 @@ namespace Spine.Unity { if (hasNext) { // Apply next clip directly instead of mixing (ie: no crossfade, ignores mecanim transition weights) if (mode == MixMode.SpineStyle) { - for (; c < nextClipInfo.Length; c++) { + for (; c < nextClipInfoCount; c++) { var info = nextClipInfo[c]; float weight = info.weight * layerWeight; if (weight == 0) continue; animationTable[NameHashCode(info.clip)].Apply(skeleton, 0, AnimationTime(nextStateInfo.normalizedTime , info.clip.length,nextStateInfo.speed < 0), nextStateInfo.loop, null, 1f, MixPose.Current, MixDirection.In); break; } } // Mix the rest - for (; c < nextClipInfo.Length; c++) { + for (; c < nextClipInfoCount; c++) { var info = nextClipInfo[c]; float weight = info.weight * layerWeight; if (weight == 0) continue; animationTable[NameHashCode(info.clip)].Apply(skeleton, 0, AnimationTime(nextStateInfo.normalizedTime , info.clip.length,nextStateInfo.speed < 0), nextStateInfo.loop, null, weight, MixPose.Current, MixDirection.In); } @@ -239,6 +244,31 @@ namespace Spine.Unity { return normalizedTime * clipLength; } + void GetAnimatorClipInfos ( + int layer, + out int clipInfoCount, + out int nextClipInfoCount, + out IList clipInfo, + out IList nextClipInfo) { + #if UNITY_2017_1_OR_NEWER + clipInfoCount = animator.GetCurrentAnimatorClipInfoCount(layer); + nextClipInfoCount = animator.GetNextAnimatorClipInfoCount(layer); + if (clipInfoCache.Capacity < clipInfoCount) clipInfoCache.Capacity = clipInfoCount; + if (nextClipInfoCache.Capacity < nextClipInfoCount) nextClipInfoCache.Capacity = nextClipInfoCount; + animator.GetCurrentAnimatorClipInfo(layer, clipInfoCache); + animator.GetNextAnimatorClipInfo(layer, nextClipInfoCache); + + clipInfo = clipInfoCache; + nextClipInfo = nextClipInfoCache; + #else + clipInfo = animator.GetCurrentAnimatorClipInfo(layer); + nextClipInfo = animator.GetNextAnimatorClipInfo(layer); + + clipInfoCount = clipInfo.Count; + nextClipInfoCount = nextClipInfo.Count; + #endif + } + int NameHashCode (AnimationClip clip) { int clipNameHashCode; if (!clipNameHashCodeTable.TryGetValue(clip, out clipNameHashCode)) { @@ -247,6 +277,24 @@ namespace Spine.Unity { } return clipNameHashCode; } + + class AnimationClipEqualityComparer : IEqualityComparer { + internal static readonly IEqualityComparer Instance = new AnimationClipEqualityComparer(); + + public bool Equals (AnimationClip x, AnimationClip y) { + return x.GetInstanceID() == y.GetInstanceID(); + } + + public int GetHashCode (AnimationClip o) { + return o.GetInstanceID(); + } + } + + class IntEqualityComparer : IEqualityComparer { + internal static readonly IEqualityComparer Instance = new IntEqualityComparer(); + public bool Equals (int x, int y) { return x == y; } + public int GetHashCode(int o) { return o; } + } } } From 247d94f10b2580cdf78b4b22ad4bc802a14330bb Mon Sep 17 00:00:00 2001 From: Nathan Sweet Date: Mon, 4 Sep 2017 13:41:34 +0200 Subject: [PATCH 07/10] [libgdx] Better exception message. --- .../src/com/esotericsoftware/spine/SkeletonRenderer.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java index 4240e80ba..32e033b1a 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java @@ -100,7 +100,9 @@ public class SkeletonRenderer { continue; } else if (attachment instanceof MeshAttachment) { - throw new RuntimeException("SkeletonMeshRenderer is required to render meshes."); + throw new RuntimeException( + "SkeletonRenderer#draw(PolygonSpriteBatch, Skeleton) or #draw(TwoColorPolygonBatch, Skeleton) must be used to " + + "render meshes."); } else if (attachment instanceof SkeletonAttachment) { Skeleton attachmentSkeleton = ((SkeletonAttachment)attachment).getSkeleton(); @@ -242,7 +244,7 @@ public class SkeletonRenderer { tempLight.set(temp5); tempDark.set(temp6); tempUv.x = uvs[u]; - tempUv.y = uvs[u + 1]; + tempUv.y = uvs[u + 1]; vertexEffect.transform(tempPos, tempUv, tempLight, tempDark); vertices[v] = tempPos.x; vertices[v + 1] = tempPos.y; @@ -378,7 +380,7 @@ public class SkeletonRenderer { tempLight.set(temp5); tempDark.set(temp6); tempUv.x = uvs[u]; - tempUv.y = uvs[u + 1]; + tempUv.y = uvs[u + 1]; vertexEffect.transform(tempPos, tempUv, tempLight, tempDark); vertices[v] = tempPos.x; vertices[v + 1] = tempPos.y; From 017d224cb68c073f4713120813779349bd4595ad Mon Sep 17 00:00:00 2001 From: John Date: Mon, 4 Sep 2017 22:47:03 +0800 Subject: [PATCH 08/10] [unity] Handle empty slots after separators. --- spine-unity/Assets/spine-unity/Mesh Generation/SpineMesh.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spine-unity/Assets/spine-unity/Mesh Generation/SpineMesh.cs b/spine-unity/Assets/spine-unity/Mesh Generation/SpineMesh.cs index 16060da32..960abc265 100644 --- a/spine-unity/Assets/spine-unity/Mesh Generation/SpineMesh.cs +++ b/spine-unity/Assets/spine-unity/Mesh Generation/SpineMesh.cs @@ -265,7 +265,7 @@ namespace Spine.Unity { bool hasSeparators = separatorCount > 0; int clippingAttachmentSource = -1; - int lastPreActiveClipping = -1; + int lastPreActiveClipping = -1; // The index of the last slot that had an active ClippingAttachment. SlotData clippingEndSlot = null; int submeshIndex = 0; var drawOrderItems = drawOrder.Items; @@ -327,7 +327,7 @@ namespace Spine.Unity { } if (noRender) { - if (current.forceSeparate && generateMeshOverride && current.rawVertexCount > 0) { + if (current.forceSeparate && generateMeshOverride) { // && current.rawVertexCount > 0) { { // Add current.endSlot = i; current.preActiveClippingSlotSource = lastPreActiveClipping; From a4a97969e8916be7d6ba531707b662ebbad8da9b Mon Sep 17 00:00:00 2001 From: badlogic Date: Tue, 5 Sep 2017 11:46:03 +0200 Subject: [PATCH 09/10] [c] Listeners on spAnimationState and spTrackEntry will now also be called if a track entry gets disposed as part of disposing an spAnimationState. --- CHANGELOG.md | 1 + spine-c/spine-c/include/spine/dll.h | 2 +- spine-c/spine-c/src/spine/AnimationState.c | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29c3e74f7..3a4aae503 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ * Removed `spBone_worldToLocalRotationX` and `spBone_worldToLocalRotationY`. Replaced by `spBone_worldToLocalRotation` (rotation given relative to x-axis, counter-clockwise, in degrees). * Replaced `r`, `g`, `b`, `a` fields with instances of new `spColor` struct in `spRegionAttachment`, `spMeshAttachment`, `spSkeleton`, `spSkeletonData`, `spSlot` and `spSlotData`. * Removed `spVertexIndex`from public API. + * Listeners on `spAnimationState` or `spTrackEntry` will now be also called in case a track entry is disposed as part of dispoing the `spAnimationState`. * **Additions** * Added support for local and relative transform constraint calculation, including additional fields in `spTransformConstraintData`. * Added `spPointAttachment`, additional method `spAtlasAttachmentLoadeR_newPointAttachment`. diff --git a/spine-c/spine-c/include/spine/dll.h b/spine-c/spine-c/include/spine/dll.h index df85643e5..ed9c328b5 100644 --- a/spine-c/spine-c/include/spine/dll.h +++ b/spine-c/spine-c/include/spine/dll.h @@ -45,4 +45,4 @@ #define SP_API SPINEPLUGIN_API #endif -#endif /* SPINE_SHAREDLIB_H */ \ No newline at end of file +#endif /* SPINE_SHAREDLIB_H */ diff --git a/spine-c/spine-c/src/spine/AnimationState.c b/spine-c/spine-c/src/spine/AnimationState.c index 33d3abba6..31d60ad4d 100644 --- a/spine-c/spine-c/src/spine/AnimationState.c +++ b/spine-c/spine-c/src/spine/AnimationState.c @@ -193,9 +193,13 @@ void _spAnimationState_disposeTrackEntries (spAnimationState* state, spTrackEntr spTrackEntry* from = entry->mixingFrom; while (from) { spTrackEntry* nextFrom = from->mixingFrom; + if (entry->listener) entry->listener(state, SP_ANIMATION_DISPOSE, from, 0); + if (state->listener) state->listener(state, SP_ANIMATION_DISPOSE, from, 0); _spAnimationState_disposeTrackEntry(from); from = nextFrom; } + if (entry->listener) entry->listener(state, SP_ANIMATION_DISPOSE, entry, 0); + if (state->listener) state->listener(state, SP_ANIMATION_DISPOSE, entry, 0); _spAnimationState_disposeTrackEntry(entry); entry = next; } From 61b9e76cfe0f5cab5d73723710f9fedfff78ffe4 Mon Sep 17 00:00:00 2001 From: badlogic Date: Tue, 5 Sep 2017 11:56:40 +0200 Subject: [PATCH 10/10] [ue4] Cleaned up MySceneComponent --- spine-ue4/Source/SpineUE4/MySceneComponent.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/spine-ue4/Source/SpineUE4/MySceneComponent.cpp b/spine-ue4/Source/SpineUE4/MySceneComponent.cpp index be783eb9e..21cbfceb6 100644 --- a/spine-ue4/Source/SpineUE4/MySceneComponent.cpp +++ b/spine-ue4/Source/SpineUE4/MySceneComponent.cpp @@ -11,9 +11,6 @@ UMySceneComponent::UMySceneComponent(const FObjectInitializer& ObjectInitializer // Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features // off to improve performance if you don't need them. PrimaryComponentTick.bCanEverTick = true; - - // ... - spColor_create(); }