[ue4] Switched FTrackEntry to a UObject, should allow us to break it in blueprint editor

This commit is contained in:
badlogic 2016-12-06 16:13:35 +01:00
parent f2e364be3e
commit 05f5bbeb1e
3 changed files with 42 additions and 25 deletions

Binary file not shown.

View File

@ -3,7 +3,9 @@
#define LOCTEXT_NAMESPACE "Spine" #define LOCTEXT_NAMESPACE "Spine"
void callback(spAnimationState* state, spEventType type, spTrackEntry* entry, spEvent* event) { 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 () { USpineSkeletonAnimationComponent::USpineSkeletonAnimationComponent () {
@ -38,6 +40,8 @@ void USpineSkeletonAnimationComponent::CheckState () {
skeleton = spSkeleton_create(data); skeleton = spSkeleton_create(data);
stateData = spAnimationStateData_create(data); stateData = spAnimationStateData_create(data);
state = spAnimationState_create(stateData); state = spAnimationState_create(stateData);
state->rendererObject = (void*)this;
state->listener = callback;
} }
lastAtlas = Atlas; lastAtlas = Atlas;
@ -67,37 +71,45 @@ void USpineSkeletonAnimationComponent::FinishDestroy () {
Super::FinishDestroy(); Super::FinishDestroy();
} }
FTrackEntry USpineSkeletonAnimationComponent::SetAnimation (int trackIndex, FString animationName, bool loop) { UTrackEntry USpineSkeletonAnimationComponent::SetAnimation (int trackIndex, FString animationName, bool loop) {
CheckState(); CheckState();
if (state && spSkeletonData_findAnimation(skeleton->data, TCHAR_TO_UTF8(*animationName))) { if (state && spSkeletonData_findAnimation(skeleton->data, TCHAR_TO_UTF8(*animationName))) {
spTrackEntry* entry = spAnimationState_setAnimationByName(state, trackIndex, TCHAR_TO_UTF8(*animationName), loop ? 1 : 0); spTrackEntry* entry = spAnimationState_setAnimationByName(state, trackIndex, TCHAR_TO_UTF8(*animationName), loop ? 1 : 0);
return FTrackEntry(entry); UTrackEntry* uEnty = NewObject<UTrackEntry>();
} else return FTrackEntry(); uEntry->entry = entry;
return uEntry;
} else return NewObject<UTrackEntry>();
} }
FTrackEntry USpineSkeletonAnimationComponent::AddAnimation (int trackIndex, FString animationName, bool loop, float delay) { UTrackEntry USpineSkeletonAnimationComponent::AddAnimation (int trackIndex, FString animationName, bool loop, float delay) {
CheckState(); CheckState();
if (state && spSkeletonData_findAnimation(skeleton->data, TCHAR_TO_UTF8(*animationName))) { if (state && spSkeletonData_findAnimation(skeleton->data, TCHAR_TO_UTF8(*animationName))) {
spTrackEntry* entry = spAnimationState_addAnimationByName(state, trackIndex, TCHAR_TO_UTF8(*animationName), loop ? 1 : 0, delay); spTrackEntry* entry = spAnimationState_addAnimationByName(state, trackIndex, TCHAR_TO_UTF8(*animationName), loop ? 1 : 0, delay);
return FTrackEntry(entry); UTrackEntry* uEnty = NewObject<UTrackEntry>();
} else return FTrackEntry(); uEntry->entry = entry;
return uEntry;
} else return NewObject<UTrackEntry>();
} }
FTrackEntry USpineSkeletonAnimationComponent::SetEmptyAnimation (int trackIndex, float mixDuration) { UTrackEntry USpineSkeletonAnimationComponent::SetEmptyAnimation (int trackIndex, float mixDuration) {
CheckState(); CheckState();
if (state) { if (state) {
spTrackEntry* entry = spAnimationState_setEmptyAnimation(state, trackIndex, mixDuration); spTrackEntry* entry = spAnimationState_setEmptyAnimation(state, trackIndex, mixDuration);
return FTrackEntry(entry); UTrackEntry* uEnty = NewObject<UTrackEntry>();
} else return FTrackEntry(); uEntry->entry = entry;
return uEntry;
} else return NewObject<UTrackEntry>();
} }
FTrackEntry USpineSkeletonAnimationComponent::AddEmptyAnimation (int trackIndex, float mixDuration, float delay) { UTrackEntry USpineSkeletonAnimationComponent::AddEmptyAnimation (int trackIndex, float mixDuration, float delay) {
CheckState(); CheckState();
if (state) { if (state) {
spTrackEntry* entry = spAnimationState_addEmptyAnimation(state, trackIndex, mixDuration, delay); spTrackEntry* entry = spAnimationState_addEmptyAnimation(state, trackIndex, mixDuration, delay);
return FTrackEntry(entry); UTrackEntry* uEnty = NewObject<UTrackEntry>();
} else return FTrackEntry(); uEntry->entry = entry;
return uEntry;
} else return NewObject<UTrackEntry>();
} }
void USpineSkeletonAnimationComponent::ClearTracks () { void USpineSkeletonAnimationComponent::ClearTracks () {

View File

@ -7,17 +7,22 @@
#include "spine/spine.h" #include "spine/spine.h"
#include "SpineSkeletonAnimationComponent.generated.h" #include "SpineSkeletonAnimationComponent.generated.h"
USTRUCT(BlueprintType) UCLASS(ClassGroup=(Spine), meta=(BlueprintSpawnableComponent), BlueprintType)
struct SPINEPLUGIN_API FTrackEntry { class SPINEPLUGIN_API UTrackEntry: public UObject {
GENERATED_BODY (); 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; class USpineAtlasAsset;
UCLASS(ClassGroup=(Spine), meta=(BlueprintSpawnableComponent)) UCLASS(ClassGroup=(Spine), meta=(BlueprintSpawnableComponent))
class SPINEPLUGIN_API USpineSkeletonAnimationComponent: public USpineSkeletonComponent { class SPINEPLUGIN_API USpineSkeletonAnimationComponent: public USpineSkeletonComponent {
@ -38,16 +43,16 @@ public:
// Blueprint functions // Blueprint functions
UFUNCTION(BlueprintCallable, Category="Components|Spine") 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") 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") UFUNCTION(BlueprintCallable, Category="Components|Spine")
FTrackEntry SetEmptyAnimation (int trackIndex, float mixDuration); UTrackEntry* SetEmptyAnimation (int trackIndex, float mixDuration);
UFUNCTION(BlueprintCallable, Category="Components|Spine") 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") UFUNCTION(BlueprintCallable, Category="Components|Spine")
void ClearTracks (); void ClearTracks ();
@ -55,8 +60,8 @@ public:
UFUNCTION(BlueprintCallable, Category="Components|Spine") UFUNCTION(BlueprintCallable, Category="Components|Spine")
void ClearTrack (int trackIndex); void ClearTrack (int trackIndex);
// UFUNCTION(BlueprintImplentableEvent, category = "Components|Spine") UPROPERTY(BlueprintAssignable, Category = "Components|Spine")
// void AnimationEvent(int trackIndex, ); FSpineAnimationStartEvent AnimationStartEvent;
protected: protected:
virtual void CheckState () override; virtual void CheckState () override;