From 11d32da10077957b5142b0e2a162e0d93825ec3e Mon Sep 17 00:00:00 2001 From: badlogic Date: Thu, 21 Nov 2019 16:35:55 +0100 Subject: [PATCH] [ue4] Subclass FSlateBrush directly and do not clean up resources manually. The FSlateMaterialBrush implementation in UE 4.22 and below wrongfully frees resources it should not, leading to flickering artifacts on mobile. This was fixed in UE 4.23.1+. The fix in this commits emulates the engine source fix for lower UE4 versions. Closes #1458. --- spine-ue4/Config/DefaultEngine.ini | 2 ++ .../Source/SpinePlugin/Private/SSpineWidget.cpp | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/spine-ue4/Config/DefaultEngine.ini b/spine-ue4/Config/DefaultEngine.ini index a919619a9..bc632b8a4 100644 --- a/spine-ue4/Config/DefaultEngine.ini +++ b/spine-ue4/Config/DefaultEngine.ini @@ -58,3 +58,5 @@ SyncSceneSmoothingFactor=0.000000 InitialAverageFrameRate=0.016667 PhysXTreeRebuildRate=10 DefaultBroadphaseSettings=(bUseMBPOnClient=False,bUseMBPOnServer=False,MBPBounds=(Min=(X=0.000000,Y=0.000000,Z=0.000000),Max=(X=0.000000,Y=0.000000,Z=0.000000),IsValid=0),MBPNumSubdivs=2) + + diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SSpineWidget.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SSpineWidget.cpp index 09aa05260..a1f6e3b33 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SSpineWidget.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SSpineWidget.cpp @@ -45,6 +45,15 @@ using namespace spine; +// Workaround for https://github.com/EsotericSoftware/spine-runtimes/issues/1458 +// See issue comments for more information. +struct SpineSlateMaterialBrush : public FSlateBrush { + SpineSlateMaterialBrush(class UMaterialInterface &InMaterial, const FVector2D &InImageSize) + : FSlateBrush(ESlateBrushDrawType::Image, FName(TEXT("None")), FMargin(0), ESlateBrushTileType::NoTile, ESlateBrushImageType::FullColor, InImageSize, FLinearColor::White, &InMaterial) { + ResourceName = FName(*InMaterial.GetFullName()); + } +}; + void SSpineWidget::Construct(const FArguments& args) { } @@ -196,7 +205,7 @@ void SSpineWidget::Flush(int32 LayerId, FSlateWindowElementList& OutDrawElements brush = &widget->Brush; if (Material) { - renderData.Brush = MakeShareable(new FSlateMaterialBrush(*Material, FVector2D(64, 64))); + renderData.Brush = MakeShareable(new SpineSlateMaterialBrush(*Material, FVector2D(64, 64))); renderData.RenderingResourceHandle = FSlateApplication::Get().GetRenderer()->GetResourceHandle(*renderData.Brush); }