mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-02-06 15:24:55 +08:00
[ue4] Added specifying mixing durations in skeleton data asset via editor or in code
This commit is contained in:
parent
ff5792a96f
commit
064303c77e
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user