From ddfa736ae221c3c0a40ab2a6270913bfaf61edd2 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Thu, 17 Apr 2025 14:08:43 +0200 Subject: [PATCH] [ue] Closes #2803, pool slate material brush names --- .../SpinePlugin/Private/SSpineWidget.cpp | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/spine-ue/Plugins/SpinePlugin/Source/SpinePlugin/Private/SSpineWidget.cpp b/spine-ue/Plugins/SpinePlugin/Source/SpinePlugin/Private/SSpineWidget.cpp index af0749794..5daad4a33 100644 --- a/spine-ue/Plugins/SpinePlugin/Source/SpinePlugin/Private/SSpineWidget.cpp +++ b/spine-ue/Plugins/SpinePlugin/Source/SpinePlugin/Private/SSpineWidget.cpp @@ -46,15 +46,33 @@ static int brushNameId = 0; // Workaround for https://github.com/EsotericSoftware/spine-runtimes/issues/1458 // See issue comments for more information. struct SpineSlateMaterialBrush : public FSlateBrush { + static TArray NamePool; + static FCriticalSection NamePoolLock; + SpineSlateMaterialBrush(class UMaterialInterface &InMaterial, const FVector2D &InImageSize) : FSlateBrush(ESlateBrushDrawType::Image, FName(TEXT("None")), FMargin(0), ESlateBrushTileType::NoTile, ESlateBrushImageType::FullColor, InImageSize, FLinearColor::White, &InMaterial) { // Workaround for https://github.com/EsotericSoftware/spine-runtimes/issues/2006 - FString brushName = TEXT("spineslatebrush"); - brushName.AppendInt(brushNameId++); - ResourceName = FName(brushName); + FScopeLock Lock(&NamePoolLock); + + if (NamePool.Num() > 0) { + ResourceName = NamePool.Pop(false); + } else { + static uint32 NextId = 0; + FString brushName = TEXT("SpineSlateMatBrush"); + brushName.AppendInt(NextId++); + ResourceName = FName(*brushName); + } + } + + ~SpineSlateMaterialBrush() { + FScopeLock Lock(&NamePoolLock); + NamePool.Add(ResourceName); } }; +TArray SpineSlateMaterialBrush::NamePool; +FCriticalSection SpineSlateMaterialBrush::NamePoolLock; + void SSpineWidget::Construct(const FArguments &args) { }