From cef191f6c671d6c239d2b57a1781072738af931e Mon Sep 17 00:00:00 2001 From: badlogic Date: Wed, 6 Mar 2019 16:54:47 +0100 Subject: [PATCH] [ue4] Fixed segfault in SpineSkeletonDataAsset. Added PreviewAnimation and PreviewSkin to SpineSkeletonAnimationComponent. Enter the name of an animation or skin and it will be previewed live in the editor view. Use an empty string to reset the animation or skin. --- .../Private/SpineSkeletonAnimationComponent.cpp | 11 +++++++++++ .../SpinePlugin/Private/SpineSkeletonDataAsset.cpp | 1 + .../Public/SpineSkeletonAnimationComponent.h | 9 +++++++++ 3 files changed, 21 insertions(+) diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp index 8dabf4250..cb62ac8be 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp @@ -96,6 +96,17 @@ void USpineSkeletonAnimationComponent::InternalTick(float DeltaTime, bool CallDe CheckState(); if (state && bAutoPlaying) { + if (lastPreviewAnimation != PreviewAnimation) { + if (PreviewAnimation != "") SetAnimation(0, TCHAR_TO_UTF8(*PreviewAnimation), true); + else SetEmptyAnimation(0, 0); + lastPreviewAnimation = PreviewAnimation; + } + + if (lastPreviewSkin != PreviewSkin) { + if (PreviewSkin != "") SetSkin(TCHAR_TO_UTF8(*PreviewSkin)); + else SetSkin("default"); + lastPreviewSkin = PreviewSkin; + } state->update(DeltaTime); state->apply(*skeleton); if (CallDelegates) BeforeUpdateWorldTransform.Broadcast(this); diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonDataAsset.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonDataAsset.cpp index 94919b6cb..34423f537 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonDataAsset.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonDataAsset.cpp @@ -128,6 +128,7 @@ public: void USpineSkeletonDataAsset::LoadInfo() { #if WITH_EDITORONLY_DATA int dataLen = rawData.Num(); + if (dataLen == 0) return; NullAttachmentLoader loader; SkeletonData* skeletonData = nullptr; if (skeletonDataFileName.GetPlainNameString().Contains(TEXT(".json"))) { diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h index eac35678a..3403d1fca 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h @@ -259,6 +259,12 @@ public: UPROPERTY(BlueprintAssignable, Category="Components|Spine|Animation") FSpineAnimationDisposeDelegate AnimationDispose; + + UPROPERTY(Transient, EditAnywhere) + FString PreviewAnimation; + + UPROPERTY(Transient, EditAnywhere) + FString PreviewSkin; // used in C event callback. Needs to be public as we can't call // protected methods from plain old C function. @@ -279,4 +285,7 @@ private: /* If the animation should update automatically. */ UPROPERTY() bool bAutoPlaying; + + FString lastPreviewAnimation; + FString lastPreviewSkin; };