diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineAtlasImportFactory.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineAtlasImportFactory.cpp index 947d2acf0..68e595055 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineAtlasImportFactory.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineAtlasImportFactory.cpp @@ -130,7 +130,7 @@ UTexture2D* resolveTexture (USpineAtlasAsset* Asset, const FString& PageFileName } void USpineAtlasAssetFactory::LoadAtlas (USpineAtlasAsset* Asset, const FString& CurrentSourcePath, const FString& LongPackagePath) { - Atlas* atlas = Asset->GetAtlas(true); + Atlas* atlas = Asset->GetAtlas(); Asset->atlasPages.Empty(); const FString targetTexturePath = LongPackagePath / TEXT("Textures"); diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineSkeletonImportFactory.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineSkeletonImportFactory.cpp index 8ebeff1e8..75f49a7cc 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineSkeletonImportFactory.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineSkeletonImportFactory.cpp @@ -77,9 +77,11 @@ UObject* USpineSkeletonAssetFactory::FactoryCreateFile (UClass * InClass, UObjec name.Append("-data"); USpineSkeletonDataAsset* asset = NewObject(InParent, InClass, FName(*name), Flags); - if (!FFileHelper::LoadFileToArray(asset->GetRawData(), *Filename, 0)) { + TArray rawData; + if (!FFileHelper::LoadFileToArray(rawData, *Filename, 0)) { return nullptr; } + asset->SetRawData(rawData); asset->SetSkeletonDataFileName(FName(*Filename)); const FString longPackagePath = FPackageName::GetLongPackagePath(asset->GetOutermost()->GetPathName()); @@ -107,7 +109,9 @@ void USpineSkeletonAssetFactory::SetReimportPaths (UObject* Obj, const TArray(Obj); - if (!FFileHelper::LoadFileToArray(asset->GetRawData(), *asset->GetSkeletonDataFileName().ToString(), 0)) return EReimportResult::Failed; + TArray rawData; + if (!FFileHelper::LoadFileToArray(rawData, *asset->GetSkeletonDataFileName().ToString(), 0)) return EReimportResult::Failed; + asset->SetRawData(rawData); const FString longPackagePath = FPackageName::GetLongPackagePath(asset->GetOutermost()->GetPathName()); LoadAtlas(*asset->GetSkeletonDataFileName().ToString(), longPackagePath); diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SSpineWidget.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SSpineWidget.cpp index 6dcdffd53..2082a078d 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SSpineWidget.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SSpineWidget.cpp @@ -86,7 +86,7 @@ int32 SSpineWidget::OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGeo widget->pageToScreenBlendMaterial.Empty(); for (int i = 0; i < widget->Atlas->atlasPages.Num(); i++) { - AtlasPage* currPage = widget->Atlas->GetAtlas(false)->getPages()[i]; + AtlasPage* currPage = widget->Atlas->GetAtlas()->getPages()[i]; UMaterialInstanceDynamic* material = UMaterialInstanceDynamic::Create(widget->NormalBlendMaterial, widget); material->SetTextureParameterValue(widget->TextureParameterName, widget->Atlas->atlasPages[i]); @@ -115,7 +115,7 @@ int32 SSpineWidget::OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGeo widget->pageToScreenBlendMaterial.Empty(); for (int i = 0; i < widget->Atlas->atlasPages.Num(); i++) { - AtlasPage* currPage = widget->Atlas->GetAtlas(false)->getPages()[i]; + AtlasPage* currPage = widget->Atlas->GetAtlas()->getPages()[i]; UTexture2D* texture = widget->Atlas->atlasPages[i]; UTexture* oldTexture = nullptr; diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineAtlasAsset.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineAtlasAsset.cpp index 75de6dba7..09dd4f515 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineAtlasAsset.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineAtlasAsset.cpp @@ -38,26 +38,7 @@ using namespace spine; -FString USpineAtlasAsset::GetRawData () const { - return rawData; -} - -FName USpineAtlasAsset::GetAtlasFileName () const { #if WITH_EDITORONLY_DATA - TArray files; - if (importData) importData->ExtractFilenames(files); - if (files.Num() > 0) return FName(*files[0]); - else return atlasFileName; -#else - return atlasFileName; -#endif -} - -#if WITH_EDITORONLY_DATA - -void USpineAtlasAsset::SetRawData (const FString &RawData) { - this->rawData = RawData; -} void USpineAtlasAsset::SetAtlasFileName (const FName &AtlasFileName) { importData->UpdateFilenameOnly(AtlasFileName.ToString()); @@ -87,6 +68,25 @@ void USpineAtlasAsset::Serialize (FArchive& Ar) { #endif +FName USpineAtlasAsset::GetAtlasFileName() const { +#if WITH_EDITORONLY_DATA + TArray files; + if (importData) importData->ExtractFilenames(files); + if (files.Num() > 0) return FName(*files[0]); + else return atlasFileName; +#else + return atlasFileName; +#endif +} + +void USpineAtlasAsset::SetRawData(const FString &RawData) { + this->rawData = RawData; + if (atlas) { + delete atlas; + atlas = nullptr; + } +} + void USpineAtlasAsset::BeginDestroy () { if (atlas) { delete atlas; @@ -95,8 +95,8 @@ void USpineAtlasAsset::BeginDestroy () { Super::BeginDestroy(); } -Atlas* USpineAtlasAsset::GetAtlas (bool ForceReload) { - if (!atlas || ForceReload) { +Atlas* USpineAtlasAsset::GetAtlas () { + if (!atlas) { if (atlas) { delete atlas; atlas = nullptr; @@ -111,7 +111,7 @@ Atlas* USpineAtlasAsset::GetAtlas (bool ForceReload) { page->setRendererObject(atlasPages[j++]); } } - return this->atlas; + return this->atlas; } #undef LOCTEXT_NAMESPACE diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp index d0e1847a2..e769ec796 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp @@ -104,23 +104,39 @@ void USpineSkeletonAnimationComponent::InternalTick(float DeltaTime, bool CallDe } void USpineSkeletonAnimationComponent::CheckState () { - if (lastAtlas != Atlas || lastData != SkeletonData) { + bool needsUpdate = lastAtlas != Atlas || lastData != SkeletonData; + + if (!needsUpdate) { + // Are we doing a re-import? Then check if the underlying spine-cpp data + // has changed. + if (lastAtlas && lastAtlas == Atlas && lastData && lastData == SkeletonData) { + spine::Atlas* atlas = Atlas->GetAtlas(); + if (lastSpineAtlas != atlas) { + needsUpdate = true; + } + if (skeleton && skeleton->getData() != SkeletonData->GetSkeletonData(atlas)) { + needsUpdate = true; + } + } + } + + if (needsUpdate) { DisposeState(); - + if (Atlas && SkeletonData) { - spine::SkeletonData *data = SkeletonData->GetSkeletonData(Atlas->GetAtlas(false), false); + spine::SkeletonData *data = SkeletonData->GetSkeletonData(Atlas->GetAtlas()); if (data) { skeleton = new (__FILE__, __LINE__) Skeleton(data); - AnimationStateData* stateData = SkeletonData->GetAnimationStateData(Atlas->GetAtlas(false)); + AnimationStateData* stateData = SkeletonData->GetAnimationStateData(Atlas->GetAtlas()); state = new (__FILE__, __LINE__) AnimationState(stateData); state->setRendererObject((void*)this); state->setListener(callback); trackEntries.Empty(); } } - + lastAtlas = Atlas; - lastSpineAtlas = Atlas ? Atlas->GetAtlas(false) : nullptr; + lastSpineAtlas = Atlas ? Atlas->GetAtlas() : nullptr; lastData = SkeletonData; } } diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonComponent.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonComponent.cpp index ab5962905..c078910ae 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonComponent.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonComponent.cpp @@ -206,7 +206,7 @@ void USpineSkeletonComponent::CheckState () { // Are we doing a re-import? Then check if the underlying spine-cpp data // has changed. if (lastAtlas && lastAtlas == Atlas && lastData && lastData == SkeletonData) { - spine::Atlas* atlas = Atlas->GetAtlas(false); + spine::Atlas* atlas = Atlas->GetAtlas(); if (lastSpineAtlas != atlas) { needsUpdate = true; } @@ -220,12 +220,12 @@ void USpineSkeletonComponent::CheckState () { DisposeState(); if (Atlas && SkeletonData) { - spine::SkeletonData* data = SkeletonData->GetSkeletonData(Atlas->GetAtlas(false), false); + spine::SkeletonData* data = SkeletonData->GetSkeletonData(Atlas->GetAtlas()); skeleton = new (__FILE__, __LINE__) Skeleton(data); } lastAtlas = Atlas; - lastSpineAtlas = Atlas ? Atlas->GetAtlas(false) : nullptr; + lastSpineAtlas = Atlas ? Atlas->GetAtlas() : nullptr; lastData = SkeletonData; } } diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonDataAsset.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonDataAsset.cpp index ec8a4dae3..5d1c378ee 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonDataAsset.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonDataAsset.cpp @@ -50,10 +50,6 @@ FName USpineSkeletonDataAsset::GetSkeletonDataFileName () const { #endif } -TArray& USpineSkeletonDataAsset::GetRawData () { - return this->rawData; -} - #if WITH_EDITORONLY_DATA void USpineSkeletonDataAsset::SetSkeletonDataFileName (const FName &SkeletonDataFileName) { @@ -96,8 +92,17 @@ void USpineSkeletonDataAsset::BeginDestroy () { Super::BeginDestroy(); } -SkeletonData* USpineSkeletonDataAsset::GetSkeletonData (Atlas* Atlas, bool ForceReload) { - if (!skeletonData || lastAtlas != Atlas || ForceReload) { +void USpineSkeletonDataAsset::SetRawData(TArray &Data) { + this->rawData.Empty(); + this->rawData.Append(Data); + if (skeletonData) { + delete skeletonData; + skeletonData = nullptr; + } +} + +SkeletonData* USpineSkeletonDataAsset::GetSkeletonData (Atlas* Atlas) { + if (!skeletonData || lastAtlas != Atlas) { if (skeletonData) { delete skeletonData; skeletonData = nullptr; @@ -136,7 +141,7 @@ SkeletonData* USpineSkeletonDataAsset::GetSkeletonData (Atlas* Atlas, bool Force AnimationStateData* USpineSkeletonDataAsset::GetAnimationStateData(Atlas* atlas) { if (!animationStateData) { - SkeletonData* data = GetSkeletonData(atlas, false); + SkeletonData* data = GetSkeletonData(atlas); animationStateData = new (__FILE__, __LINE__) AnimationStateData(data); } for (auto& data : MixData) { diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonRendererComponent.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonRendererComponent.cpp index 6e69f507c..1302179a4 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonRendererComponent.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonRendererComponent.cpp @@ -90,7 +90,7 @@ void USpineSkeletonRendererComponent::TickComponent (float DeltaTime, ELevelTick pageToScreenBlendMaterial.Empty(); for (int i = 0; i < skeleton->Atlas->atlasPages.Num(); i++) { - AtlasPage* currPage = skeleton->Atlas->GetAtlas(false)->getPages()[i]; + AtlasPage* currPage = skeleton->Atlas->GetAtlas()->getPages()[i]; UMaterialInstanceDynamic* material = UMaterialInstanceDynamic::Create(NormalBlendMaterial, owner); material->SetTextureParameterValue(TextureParameterName, skeleton->Atlas->atlasPages[i]); @@ -119,7 +119,7 @@ void USpineSkeletonRendererComponent::TickComponent (float DeltaTime, ELevelTick pageToScreenBlendMaterial.Empty(); for (int i = 0; i < skeleton->Atlas->atlasPages.Num(); i++) { - AtlasPage* currPage = skeleton->Atlas->GetAtlas(false)->getPages()[i]; + AtlasPage* currPage = skeleton->Atlas->GetAtlas()->getPages()[i]; UTexture2D* texture = skeleton->Atlas->atlasPages[i]; UTexture* oldTexture = nullptr; diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineWidget.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineWidget.cpp index e7928bec1..b3bb983b7 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineWidget.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineWidget.cpp @@ -96,7 +96,7 @@ void USpineWidget::CheckState() { DisposeState(); if (Atlas && SkeletonData) { - spine::SkeletonData* data = SkeletonData->GetSkeletonData(Atlas->GetAtlas(false), false); + spine::SkeletonData* data = SkeletonData->GetSkeletonData(Atlas->GetAtlas()); skeleton = new (__FILE__, __LINE__) spine::Skeleton(data); } diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineAtlasAsset.h b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineAtlasAsset.h index 7741e2f64..0f37081be 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineAtlasAsset.h +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineAtlasAsset.h @@ -39,12 +39,12 @@ class SPINEPLUGIN_API USpineAtlasAsset: public UObject { GENERATED_BODY() public: - spine::Atlas* GetAtlas (bool ForceReload = false); + spine::Atlas* GetAtlas (); UPROPERTY(EditAnywhere, BlueprintReadWrite) TArray atlasPages; - FString GetRawData () const; + void SetRawData(const FString &RawData); FName GetAtlasFileName () const; @@ -62,7 +62,6 @@ protected: #if WITH_EDITORONLY_DATA public: - void SetRawData (const FString &RawData); void SetAtlasFileName (const FName &AtlasFileName); protected: diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonDataAsset.h b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonDataAsset.h index af49d528a..442dc49b7 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonDataAsset.h +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonDataAsset.h @@ -54,14 +54,14 @@ class SPINEPLUGIN_API USpineSkeletonDataAsset: public UObject { GENERATED_BODY() public: - spine::SkeletonData* GetSkeletonData(spine::Atlas* Atlas, bool ForceReload = false); + spine::SkeletonData* GetSkeletonData(spine::Atlas* Atlas); spine::AnimationStateData* GetAnimationStateData(spine::Atlas* atlas); void SetMix(const FString& from, const FString& to, float mix); float GetMix(const FString& from, const FString& to); FName GetSkeletonDataFileName () const; - TArray& GetRawData (); + void SetRawData (TArray &Data); virtual void BeginDestroy () override;