From b2479bf7bf6cfd357ce22cdcea5c58c480bdf2a3 Mon Sep 17 00:00:00 2001 From: badlogic Date: Tue, 25 Sep 2018 15:46:09 +0200 Subject: [PATCH] [ue4] Updated example project to 4.20. Fixed re-import of skeletons, see #1177. --- .../proj.win32/spine-cocos2d-x.VC.VC.opendb | Bin 48 -> 0 bytes .../Private/SpineAtlasImportFactory.cpp | 2 +- .../SpineEditorPlugin.Build.cs | 12 +++++----- .../SpinePlugin/Private/SpineAtlasAsset.cpp | 2 +- .../SpineSkeletonAnimationComponent.cpp | 21 ++++++++++++++++-- .../Private/SpineSkeletonComponent.cpp | 19 +++++++++++++++- .../Private/SpineSkeletonDataAsset.cpp | 3 ++- .../Public/SpineSkeletonComponent.h | 1 + .../Source/SpinePlugin/SpinePlugin.Build.cs | 19 +++++++++++----- spine-ue4/SpineUE4.uproject | 2 +- 10 files changed, 64 insertions(+), 17 deletions(-) delete mode 100644 spine-cocos2dx/example/proj.win32/spine-cocos2d-x.VC.VC.opendb diff --git a/spine-cocos2dx/example/proj.win32/spine-cocos2d-x.VC.VC.opendb b/spine-cocos2dx/example/proj.win32/spine-cocos2d-x.VC.VC.opendb deleted file mode 100644 index c99263c75e80fc1011fb931edecbae9fbdd9d398..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48 zcmYddNMuN1$YIE5NN31oNM>MQaA9y|2xjnR2x0JN2w>1setRendererObject(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 ffd48fa34..8085930cd 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonAnimationComponent.cpp @@ -104,11 +104,27 @@ 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(false); + 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(false), true); if (data) { skeleton = new (__FILE__, __LINE__) Skeleton(data); AnimationStateData* stateData = SkeletonData->GetAnimationStateData(Atlas->GetAtlas(false)); @@ -120,6 +136,7 @@ void USpineSkeletonAnimationComponent::CheckState () { } lastAtlas = Atlas; + lastSpineAtlas = Atlas ? Atlas->GetAtlas(false) : 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 9ac6df3c7..ab5962905 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonComponent.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonComponent.cpp @@ -200,7 +200,23 @@ void USpineSkeletonComponent::InternalTick(float DeltaTime, bool CallDelegates) } void USpineSkeletonComponent::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(false); + if (lastSpineAtlas != atlas) { + needsUpdate = true; + } + if (skeleton && skeleton->getData() != SkeletonData->GetSkeletonData(atlas)) { + needsUpdate = true; + } + } + } + + if (needsUpdate) { DisposeState(); if (Atlas && SkeletonData) { @@ -209,6 +225,7 @@ void USpineSkeletonComponent::CheckState () { } lastAtlas = Atlas; + lastSpineAtlas = Atlas ? Atlas->GetAtlas(false) : 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 51178d256..3dcdfbafa 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonDataAsset.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonDataAsset.cpp @@ -97,7 +97,7 @@ void USpineSkeletonDataAsset::BeginDestroy () { } SkeletonData* USpineSkeletonDataAsset::GetSkeletonData (Atlas* Atlas, bool ForceReload) { - if (!skeletonData || ForceReload) { + if (!skeletonData || lastAtlas != Atlas || ForceReload) { if (skeletonData) { delete skeletonData; skeletonData = nullptr; @@ -126,6 +126,7 @@ SkeletonData* USpineSkeletonDataAsset::GetSkeletonData (Atlas* Atlas, bool Force } if (animationStateData) { delete animationStateData; + animationStateData = nullptr; GetAnimationStateData(Atlas); } lastAtlas = Atlas; diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonComponent.h b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonComponent.h index 5735ef0b0..45a494579 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonComponent.h +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonComponent.h @@ -114,5 +114,6 @@ protected: spine::Skeleton* skeleton; USpineAtlasAsset* lastAtlas = nullptr; + spine::Atlas* lastSpineAtlas = nullptr; USpineSkeletonDataAsset* lastData = nullptr; }; diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/SpinePlugin.Build.cs b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/SpinePlugin.Build.cs index 3ccb0fb47..f2d125558 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/SpinePlugin.Build.cs +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/SpinePlugin.Build.cs @@ -1,17 +1,26 @@ // Copyright 1998-2016 Epic Games, Inc. All Rights Reserved. +using System; +using System.IO; + namespace UnrealBuildTool.Rules { public class SpinePlugin : ModuleRules { public SpinePlugin(ReadOnlyTargetRules Target) : base(Target) { - PublicIncludePaths.AddRange(new string[] { "SpinePlugin/Public", "SpinePlugin/Public/spine-cpp/include" }); - PrivateIncludePaths.AddRange(new string[] { "SpinePlugin/Private", "SpinePlugin/Public/spine-cpp/include" }); + PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "Public")); + PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "Public/spine-cpp/include")); + + PrivateIncludePaths.Add(Path.Combine(ModuleDirectory, "Public")); + PrivateIncludePaths.Add(Path.Combine(ModuleDirectory, "Public/spine-cpp/include")); + PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "RHI", "RenderCore", "ShaderCore", "ProceduralMeshComponent", "UMG", "Slate", "SlateCore" }); - Definitions.Add("SPINE_UE4"); - // In Unreal 4.20+, comment the above line, uncomment the below line - // PublicDefinitions.Add("SPINE_UE4"); + PublicDefinitions.Add("SPINE_UE4"); + + // For UE 4.19 and below comment the line above and uncomment the line + // below. + // Definitions.Add("SPINE_UE4"); } } } diff --git a/spine-ue4/SpineUE4.uproject b/spine-ue4/SpineUE4.uproject index 2c459516f..df2d5b601 100644 --- a/spine-ue4/SpineUE4.uproject +++ b/spine-ue4/SpineUE4.uproject @@ -1,6 +1,6 @@ { "FileVersion": 3, - "EngineAssociation": "4.18", + "EngineAssociation": "4.20", "Category": "", "Description": "", "Modules": [