[ue4] Updated example project to 4.20. Fixed re-import of skeletons, see #1177.

This commit is contained in:
badlogic 2018-09-25 15:46:09 +02:00
parent 0e6673c370
commit b2479bf7bf
10 changed files with 64 additions and 17 deletions

View File

@ -51,7 +51,7 @@ USpineAtlasAssetFactory::USpineAtlasAssetFactory (const FObjectInitializer& obje
bEditorImport = true; bEditorImport = true;
SupportedClass = USpineAtlasAsset::StaticClass(); SupportedClass = USpineAtlasAsset::StaticClass();
Formats.Add(TEXT("atlas;Spine atlas file")); Formats.Add(TEXT("atlas;Spine Atlas file"));
} }
FText USpineAtlasAssetFactory::GetToolTip () const { FText USpineAtlasAssetFactory::GetToolTip () const {

View File

@ -6,9 +6,11 @@ namespace UnrealBuildTool.Rules
{ {
public SpineEditorPlugin(ReadOnlyTargetRules Target) : base(Target) public SpineEditorPlugin(ReadOnlyTargetRules Target) : base(Target)
{ {
PublicIncludePaths.AddRange(new string[] { "SpineEditorPlugin/Public", "SpinePlugin/Public/spine-cpp/include" }); PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "Public"));
PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "../SpinePlugin/Public/spine-cpp/include"));
PrivateIncludePaths.AddRange(new string[] { "SpineEditorPlugin/Private", "SpinePlugin/Public/spine-cpp/include" });
PrivateIncludePaths.Add(Path.Combine(ModuleDirectory, "Public"));
PrivateIncludePaths.Add(Path.Combine(ModuleDirectory, "../SpinePlugin/Public/spine-cpp/include"));
PublicDependencyModuleNames.AddRange(new string[] { PublicDependencyModuleNames.AddRange(new string[] {
"Core", "Core",
@ -17,12 +19,12 @@ namespace UnrealBuildTool.Rules
"UnrealEd", "UnrealEd",
"SpinePlugin" "SpinePlugin"
}); });
PublicIncludePathModuleNames.AddRange(new string[] { PublicIncludePathModuleNames.AddRange(new string[] {
"AssetTools", "AssetTools",
"AssetRegistry" "AssetRegistry"
}); });
DynamicallyLoadedModuleNames.AddRange(new string[] { DynamicallyLoadedModuleNames.AddRange(new string[] {
"AssetTools", "AssetTools",
"AssetRegistry" "AssetRegistry"

View File

@ -111,7 +111,7 @@ Atlas* USpineAtlasAsset::GetAtlas (bool ForceReload) {
page->setRendererObject(atlasPages[j++]); page->setRendererObject(atlasPages[j++]);
} }
} }
return this->atlas; return this->atlas;
} }
#undef LOCTEXT_NAMESPACE #undef LOCTEXT_NAMESPACE

View File

@ -104,11 +104,27 @@ void USpineSkeletonAnimationComponent::InternalTick(float DeltaTime, bool CallDe
} }
void USpineSkeletonAnimationComponent::CheckState () { 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(); DisposeState();
if (Atlas && SkeletonData) { if (Atlas && SkeletonData) {
spine::SkeletonData *data = SkeletonData->GetSkeletonData(Atlas->GetAtlas(false), false); spine::SkeletonData *data = SkeletonData->GetSkeletonData(Atlas->GetAtlas(false), true);
if (data) { if (data) {
skeleton = new (__FILE__, __LINE__) Skeleton(data); skeleton = new (__FILE__, __LINE__) Skeleton(data);
AnimationStateData* stateData = SkeletonData->GetAnimationStateData(Atlas->GetAtlas(false)); AnimationStateData* stateData = SkeletonData->GetAnimationStateData(Atlas->GetAtlas(false));
@ -120,6 +136,7 @@ void USpineSkeletonAnimationComponent::CheckState () {
} }
lastAtlas = Atlas; lastAtlas = Atlas;
lastSpineAtlas = Atlas ? Atlas->GetAtlas(false) : nullptr;
lastData = SkeletonData; lastData = SkeletonData;
} }
} }

View File

@ -200,7 +200,23 @@ void USpineSkeletonComponent::InternalTick(float DeltaTime, bool CallDelegates)
} }
void USpineSkeletonComponent::CheckState () { 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(); DisposeState();
if (Atlas && SkeletonData) { if (Atlas && SkeletonData) {
@ -209,6 +225,7 @@ void USpineSkeletonComponent::CheckState () {
} }
lastAtlas = Atlas; lastAtlas = Atlas;
lastSpineAtlas = Atlas ? Atlas->GetAtlas(false) : nullptr;
lastData = SkeletonData; lastData = SkeletonData;
} }
} }

View File

@ -97,7 +97,7 @@ void USpineSkeletonDataAsset::BeginDestroy () {
} }
SkeletonData* USpineSkeletonDataAsset::GetSkeletonData (Atlas* Atlas, bool ForceReload) { SkeletonData* USpineSkeletonDataAsset::GetSkeletonData (Atlas* Atlas, bool ForceReload) {
if (!skeletonData || ForceReload) { if (!skeletonData || lastAtlas != Atlas || ForceReload) {
if (skeletonData) { if (skeletonData) {
delete skeletonData; delete skeletonData;
skeletonData = nullptr; skeletonData = nullptr;
@ -126,6 +126,7 @@ SkeletonData* USpineSkeletonDataAsset::GetSkeletonData (Atlas* Atlas, bool Force
} }
if (animationStateData) { if (animationStateData) {
delete animationStateData; delete animationStateData;
animationStateData = nullptr;
GetAnimationStateData(Atlas); GetAnimationStateData(Atlas);
} }
lastAtlas = Atlas; lastAtlas = Atlas;

View File

@ -114,5 +114,6 @@ protected:
spine::Skeleton* skeleton; spine::Skeleton* skeleton;
USpineAtlasAsset* lastAtlas = nullptr; USpineAtlasAsset* lastAtlas = nullptr;
spine::Atlas* lastSpineAtlas = nullptr;
USpineSkeletonDataAsset* lastData = nullptr; USpineSkeletonDataAsset* lastData = nullptr;
}; };

View File

@ -1,17 +1,26 @@
// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved. // Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
using System;
using System.IO;
namespace UnrealBuildTool.Rules namespace UnrealBuildTool.Rules
{ {
public class SpinePlugin : ModuleRules public class SpinePlugin : ModuleRules
{ {
public SpinePlugin(ReadOnlyTargetRules Target) : base(Target) public SpinePlugin(ReadOnlyTargetRules Target) : base(Target)
{ {
PublicIncludePaths.AddRange(new string[] { "SpinePlugin/Public", "SpinePlugin/Public/spine-cpp/include" }); PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "Public"));
PrivateIncludePaths.AddRange(new string[] { "SpinePlugin/Private", "SpinePlugin/Public/spine-cpp/include" }); 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" }); PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "RHI", "RenderCore", "ShaderCore", "ProceduralMeshComponent", "UMG", "Slate", "SlateCore" });
Definitions.Add("SPINE_UE4"); PublicDefinitions.Add("SPINE_UE4");
// In Unreal 4.20+, comment the above line, uncomment the below line
// PublicDefinitions.Add("SPINE_UE4"); // For UE 4.19 and below comment the line above and uncomment the line
// below.
// Definitions.Add("SPINE_UE4");
} }
} }
} }

View File

@ -1,6 +1,6 @@
{ {
"FileVersion": 3, "FileVersion": 3,
"EngineAssociation": "4.18", "EngineAssociation": "4.20",
"Category": "", "Category": "",
"Description": "", "Description": "",
"Modules": [ "Modules": [