Merge branch '3.7' into 3.8-beta

This commit is contained in:
badlogic 2019-03-06 16:55:39 +01:00
commit 8616600388
4 changed files with 108 additions and 0 deletions

View File

@ -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);

View File

@ -76,6 +76,7 @@ void USpineSkeletonDataAsset::Serialize (FArchive& Ar) {
Super::Serialize(Ar);
if (Ar.IsLoading() && Ar.UE4Ver() < VER_UE4_ASSET_IMPORT_DATA_AS_JSON && !importData)
importData = NewObject<UAssetImportData>(this, TEXT("AssetImportData"));
LoadInfo();
}
#endif
@ -92,13 +93,86 @@ void USpineSkeletonDataAsset::BeginDestroy () {
Super::BeginDestroy();
}
class SP_API NullAttachmentLoader : public AttachmentLoader {
public:
virtual RegionAttachment* newRegionAttachment(Skin& skin, const String& name, const String& path) {
return new(__FILE__, __LINE__) RegionAttachment(name);
}
virtual MeshAttachment* newMeshAttachment(Skin& skin, const String& name, const String& path) {
return new(__FILE__, __LINE__) MeshAttachment(name);
}
virtual BoundingBoxAttachment* newBoundingBoxAttachment(Skin& skin, const String& name) {
return new(__FILE__, __LINE__) BoundingBoxAttachment(name);
}
virtual PathAttachment* newPathAttachment(Skin& skin, const String& name) {
return new(__FILE__, __LINE__) PathAttachment(name);
}
virtual PointAttachment* newPointAttachment(Skin& skin, const String& name) {
return new(__FILE__, __LINE__) PointAttachment(name);
}
virtual ClippingAttachment* newClippingAttachment(Skin& skin, const String& name) {
return new(__FILE__, __LINE__) ClippingAttachment(name);
}
virtual void configureAttachment(Attachment* attachment) {
}
};
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"))) {
SkeletonJson* json = new (__FILE__, __LINE__) SkeletonJson(&loader);
skeletonData = json->readSkeletonData((const char*)rawData.GetData());
if (!skeletonData) {
FMessageDialog::Debugf(FText::FromString(UTF8_TO_TCHAR(json->getError().buffer())));
UE_LOG(SpineLog, Error, TEXT("Couldn't load skeleton data and atlas: %s"), UTF8_TO_TCHAR(json->getError().buffer()));
}
delete json;
} else {
SkeletonBinary* binary = new (__FILE__, __LINE__) SkeletonBinary(&loader);
skeletonData = binary->readSkeletonData((const unsigned char*)rawData.GetData(), (int)rawData.Num());
if (!skeletonData) {
FMessageDialog::Debugf(FText::FromString(UTF8_TO_TCHAR(binary->getError().buffer())));
UE_LOG(SpineLog, Error, TEXT("Couldn't load skeleton data and atlas: %s"), UTF8_TO_TCHAR(binary->getError().buffer()));
}
delete binary;
}
if (skeletonData) {
Bones.Empty();
for (int i = 0; i < skeletonData->getBones().size(); i++)
Bones.Add(skeletonData->getBones()[i]->getName().buffer());
Skins.Empty();
for (int i = 0; i < skeletonData->getSkins().size(); i++)
Skins.Add(skeletonData->getSkins()[i]->getName().buffer());
Animations.Empty();
for (int i = 0; i < skeletonData->getAnimations().size(); i++)
Animations.Add(skeletonData->getAnimations()[i]->getName().buffer());
delete skeletonData;
}
#endif
}
void USpineSkeletonDataAsset::SetRawData(TArray<uint8> &Data) {
this->rawData.Empty();
this->rawData.Append(Data);
if (skeletonData) {
delete skeletonData;
skeletonData = nullptr;
}
LoadInfo();
}
SkeletonData* USpineSkeletonDataAsset::GetSkeletonData (Atlas* Atlas) {

View File

@ -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;
};

View File

@ -70,6 +70,18 @@ public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
TArray<FSpineAnimationStateMixData> MixData;
UPROPERTY(Transient, VisibleAnywhere)
TArray<FString> Bones;
UPROPERTY(Transient, VisibleAnywhere)
TArray<FString> Slots;
UPROPERTY(Transient, VisibleAnywhere)
TArray<FString> Skins;
UPROPERTY(Transient, VisibleAnywhere)
TArray<FString> Animations;
protected:
UPROPERTY()
@ -94,4 +106,6 @@ protected:
virtual void GetAssetRegistryTags(TArray<FAssetRegistryTag>& OutTags) const override;
virtual void Serialize (FArchive& Ar) override;
#endif
void LoadInfo();
};