From 05f5bbeb1e7a1bf74c42a1de24e1958bc035937f Mon Sep 17 00:00:00 2001 From: badlogic Date: Tue, 6 Dec 2016 16:13:35 +0100 Subject: [PATCH] [ue4] Switched FTrackEntry to a UObject, should allow us to break it in blueprint editor --- spine-ue4/Content/Maps/example.umap | Bin 828319 -> 630117 bytes .../SpineSkeletonAnimationComponent.cpp | 38 ++++++++++++------ .../Public/SpineSkeletonAnimationComponent.h | 29 +++++++------ 3 files changed, 42 insertions(+), 25 deletions(-) diff --git a/spine-ue4/Content/Maps/example.umap b/spine-ue4/Content/Maps/example.umap index 6b180c935a3ff51d74021a611aa0c4135adff1e8..15d9a8aae546112c1f6f57e764403ec77b049a6e 100644 GIT binary patch delta 15948 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 SB)Ld(lQ?eQJSops=l=t`BP$yK diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp index ebc0d0db9..88e579b4d 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp @@ -3,7 +3,9 @@ #define LOCTEXT_NAMESPACE "Spine" void callback(spAnimationState* state, spEventType type, spTrackEntry* entry, spEvent* event) { - USpineSkeletonAnimationComponent* component = (USpineSkeletonAnimationComponent*)entry->rendererObject; + USpineSkeletonAnimationComponent* component = (USpineSkeletonAnimationComponent*)state->rendererObject; + + component->SpineAnimationStartEvent.Broadcast(231); } USpineSkeletonAnimationComponent::USpineSkeletonAnimationComponent () { @@ -38,6 +40,8 @@ void USpineSkeletonAnimationComponent::CheckState () { skeleton = spSkeleton_create(data); stateData = spAnimationStateData_create(data); state = spAnimationState_create(stateData); + state->rendererObject = (void*)this; + state->listener = callback; } lastAtlas = Atlas; @@ -67,37 +71,45 @@ void USpineSkeletonAnimationComponent::FinishDestroy () { Super::FinishDestroy(); } -FTrackEntry USpineSkeletonAnimationComponent::SetAnimation (int trackIndex, FString animationName, bool loop) { +UTrackEntry USpineSkeletonAnimationComponent::SetAnimation (int trackIndex, FString animationName, bool loop) { CheckState(); if (state && spSkeletonData_findAnimation(skeleton->data, TCHAR_TO_UTF8(*animationName))) { spTrackEntry* entry = spAnimationState_setAnimationByName(state, trackIndex, TCHAR_TO_UTF8(*animationName), loop ? 1 : 0); - return FTrackEntry(entry); - } else return FTrackEntry(); + UTrackEntry* uEnty = NewObject(); + uEntry->entry = entry; + return uEntry; + } else return NewObject(); } -FTrackEntry USpineSkeletonAnimationComponent::AddAnimation (int trackIndex, FString animationName, bool loop, float delay) { +UTrackEntry USpineSkeletonAnimationComponent::AddAnimation (int trackIndex, FString animationName, bool loop, float delay) { CheckState(); if (state && spSkeletonData_findAnimation(skeleton->data, TCHAR_TO_UTF8(*animationName))) { spTrackEntry* entry = spAnimationState_addAnimationByName(state, trackIndex, TCHAR_TO_UTF8(*animationName), loop ? 1 : 0, delay); - return FTrackEntry(entry); - } else return FTrackEntry(); + UTrackEntry* uEnty = NewObject(); + uEntry->entry = entry; + return uEntry; + } else return NewObject(); } -FTrackEntry USpineSkeletonAnimationComponent::SetEmptyAnimation (int trackIndex, float mixDuration) { +UTrackEntry USpineSkeletonAnimationComponent::SetEmptyAnimation (int trackIndex, float mixDuration) { CheckState(); if (state) { spTrackEntry* entry = spAnimationState_setEmptyAnimation(state, trackIndex, mixDuration); - return FTrackEntry(entry); - } else return FTrackEntry(); + UTrackEntry* uEnty = NewObject(); + uEntry->entry = entry; + return uEntry; + } else return NewObject(); } -FTrackEntry USpineSkeletonAnimationComponent::AddEmptyAnimation (int trackIndex, float mixDuration, float delay) { +UTrackEntry USpineSkeletonAnimationComponent::AddEmptyAnimation (int trackIndex, float mixDuration, float delay) { CheckState(); if (state) { spTrackEntry* entry = spAnimationState_addEmptyAnimation(state, trackIndex, mixDuration, delay); - return FTrackEntry(entry); - } else return FTrackEntry(); + UTrackEntry* uEnty = NewObject(); + uEntry->entry = entry; + return uEntry; + } else return NewObject(); } void USpineSkeletonAnimationComponent::ClearTracks () { diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h index c39b42a97..57f27509f 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h @@ -7,17 +7,22 @@ #include "spine/spine.h" #include "SpineSkeletonAnimationComponent.generated.h" -USTRUCT(BlueprintType) -struct SPINEPLUGIN_API FTrackEntry { - GENERATED_BODY (); +UCLASS(ClassGroup=(Spine), meta=(BlueprintSpawnableComponent), BlueprintType) +class SPINEPLUGIN_API UTrackEntry: public UObject { + GENERATED_BODY () + +public: - FTrackEntry (): entry(0) { } + UTrackEntry () { } - FTrackEntry (spTrackEntry* entry) { this->entry = entry; } + spTrackEntry* entry = nullptr; - spTrackEntry* entry; + UFUNCTION(BlueprintCallable, Category="Components|Spine") + int GetTrackIndex() { return entry ? entry->trackIndex : 0; } }; +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSpineAnimationStartEvent, UTrackEntry*, entry); + class USpineAtlasAsset; UCLASS(ClassGroup=(Spine), meta=(BlueprintSpawnableComponent)) class SPINEPLUGIN_API USpineSkeletonAnimationComponent: public USpineSkeletonComponent { @@ -38,16 +43,16 @@ public: // Blueprint functions UFUNCTION(BlueprintCallable, Category="Components|Spine") - FTrackEntry SetAnimation (int trackIndex, FString animationName, bool loop); + UTrackEntry* SetAnimation (int trackIndex, FString animationName, bool loop); UFUNCTION(BlueprintCallable, Category="Components|Spine") - FTrackEntry AddAnimation (int trackIndex, FString animationName, bool loop, float delay); + UTrackEntry* AddAnimation (int trackIndex, FString animationName, bool loop, float delay); UFUNCTION(BlueprintCallable, Category="Components|Spine") - FTrackEntry SetEmptyAnimation (int trackIndex, float mixDuration); + UTrackEntry* SetEmptyAnimation (int trackIndex, float mixDuration); UFUNCTION(BlueprintCallable, Category="Components|Spine") - FTrackEntry AddEmptyAnimation (int trackIndex, float mixDuration, float delay); + UTrackEntry* AddEmptyAnimation (int trackIndex, float mixDuration, float delay); UFUNCTION(BlueprintCallable, Category="Components|Spine") void ClearTracks (); @@ -55,8 +60,8 @@ public: UFUNCTION(BlueprintCallable, Category="Components|Spine") void ClearTrack (int trackIndex); - // UFUNCTION(BlueprintImplentableEvent, category = "Components|Spine") - // void AnimationEvent(int trackIndex, ); + UPROPERTY(BlueprintAssignable, Category = "Components|Spine") + FSpineAnimationStartEvent AnimationStartEvent; protected: virtual void CheckState () override;