[ue4] Added specifying mixing durations in skeleton data asset via editor or in code

This commit is contained in:
badlogic 2016-12-09 17:28:08 +01:00
parent ff5792a96f
commit 064303c77e
7 changed files with 77 additions and 17 deletions

Binary file not shown.

View File

@ -4,7 +4,7 @@
void UTrackEntry::SetTrackEntry(spTrackEntry* entry) {
this->entry = entry;
entry->rendererObject = (void*)this;
if (entry) entry->rendererObject = (void*)this;
}
void callback(spAnimationState* state, spEventType type, spTrackEntry* entry, spEvent* event) {
@ -73,7 +73,7 @@ void USpineSkeletonAnimationComponent::CheckState () {
if (Atlas && SkeletonData) {
spSkeletonData* data = SkeletonData->GetSkeletonData(Atlas->GetAtlas(false), false);
skeleton = spSkeleton_create(data);
stateData = spAnimationStateData_create(data);
spAnimationStateData* stateData = SkeletonData->GetAnimationStateData(Atlas->GetAtlas(false));
state = spAnimationState_create(stateData);
state->rendererObject = (void*)this;
state->listener = callback;
@ -85,12 +85,7 @@ void USpineSkeletonAnimationComponent::CheckState () {
}
}
void USpineSkeletonAnimationComponent::DisposeState () {
if (stateData) {
spAnimationStateData_dispose(stateData);
stateData = nullptr;
}
void USpineSkeletonAnimationComponent::DisposeState () {
if (state) {
spAnimationState_dispose(state);
state = nullptr;

View File

@ -54,6 +54,10 @@ void USpineSkeletonDataAsset::BeginDestroy () {
spSkeletonData_dispose(this->skeletonData);
this->skeletonData = nullptr;
}
if (this->animationStateData) {
spAnimationStateData_dispose(this->animationStateData);
this->animationStateData = nullptr;
}
Super::BeginDestroy();
}
@ -62,7 +66,7 @@ spSkeletonData* USpineSkeletonDataAsset::GetSkeletonData (spAtlas* Atlas, bool F
if (skeletonData) {
spSkeletonData_dispose(skeletonData);
skeletonData = nullptr;
}
}
int dataLen = rawData.Num();
if (skeletonDataFileName.GetPlainNameString().Contains(TEXT(".json"))) {
spSkeletonJson* json = spSkeletonJson_create(Atlas);
@ -73,11 +77,49 @@ spSkeletonData* USpineSkeletonDataAsset::GetSkeletonData (spAtlas* Atlas, bool F
this->skeletonData = spSkeletonBinary_readSkeletonData(binary, (const unsigned char*)rawData.GetData(), (int)rawData.Num());
spSkeletonBinary_dispose(binary);
}
if (animationStateData) {
spAnimationStateData_dispose(animationStateData);
GetAnimationStateData(Atlas);
}
lastAtlas = Atlas;
}
return this->skeletonData;
}
spAnimationStateData* USpineSkeletonDataAsset::GetAnimationStateData(spAtlas* atlas) {
if (!animationStateData) {
spSkeletonData* skeletonData = GetSkeletonData(atlas, false);
animationStateData = spAnimationStateData_create(skeletonData);
}
for (auto& data : MixData) {
if (!data.From.IsEmpty() && !data.To.IsEmpty()) {
const char* fromChar = TCHAR_TO_UTF8(*data.From);
const char* toChar = TCHAR_TO_UTF8(*data.To);
spAnimationStateData_setMixByName(animationStateData, fromChar, toChar, data.Mix);
}
}
animationStateData->defaultMix = DefaultMix;
return this->animationStateData;
}
void USpineSkeletonDataAsset::SetMix(const FString& from, const FString& to, float mix) {
FSpineAnimationStateMixData data;
data.From = from;
data.To = to;
data.Mix = mix;
this->MixData.Add(data);
if (lastAtlas) {
GetAnimationStateData(lastAtlas);
}
}
float USpineSkeletonDataAsset::GetMix(const FString& from, const FString& to) {
for (auto& data : MixData) {
if (data.From.Equals(from) && data.To.Equals(to)) return data.Mix;
}
return 0;
}
#endif
#undef LOCTEXT_NAMESPACE

View File

@ -177,8 +177,6 @@ class SPINEPLUGIN_API USpineSkeletonAnimationComponent: public USpineSkeletonCom
GENERATED_BODY()
public:
spAnimationStateData* GetAnimationStateData () { return stateData; };
spAnimationState* GetAnimationState () { return state; };
USpineSkeletonAnimationComponent ();
@ -232,8 +230,7 @@ public:
protected:
virtual void CheckState () override;
virtual void DisposeState () override;
spAnimationStateData* stateData;
spAnimationState* state;
// keep track of track entries so they won't get GCed while

View File

@ -4,27 +4,53 @@
#include "spine/spine.h"
#include "SpineSkeletonDataAsset.generated.h"
USTRUCT(BlueprintType, Category = "Spine")
struct SPINEPLUGIN_API FSpineAnimationStateMixData {
GENERATED_BODY();
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString From;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString To;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float Mix = 0;
};
UCLASS(ClassGroup=(Spine))
class SPINEPLUGIN_API USpineSkeletonDataAsset: public UObject {
GENERATED_BODY()
public:
spSkeletonData* GetSkeletonData(spAtlas* Atlas, bool ForceReload = false);
spAnimationStateData* GetAnimationStateData(spAtlas* atlas);
void SetMix(const FString& from, const FString& to, float mix);
float GetMix(const FString& from, const FString& to);
FName GetSkeletonDataFileName () const;
TArray<uint8>& GetRawData ();
virtual void BeginDestroy () override;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float DefaultMix = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
TArray<FSpineAnimationStateMixData> MixData;
protected:
UPROPERTY()
TArray<uint8> rawData;
spAtlas* lastAtlas = nullptr;
spSkeletonData* skeletonData = nullptr;
TArray<uint8> rawData;
UPROPERTY()
FName skeletonDataFileName;
spSkeletonData* skeletonData;
spAnimationStateData* animationStateData;
spAtlas* lastAtlas;
#if WITH_EDITORONLY_DATA
public: