#include "UpdatableTexture.h" #include "Async.h" #include "Thread/MainThreadEventList.h" #include "SlateApplication.h" DECLARE_THREAD_MESSAGE(FMainThreadEventList, UpdatableTexture, FUpdatableTexture* Texture; ) { Args.Texture->Update(); Args.Texture->UpdateCaller.Reset(); UE_LOG(LogTemp, Log, TEXT("2")) } FUpdatableTexture::FUpdatableTexture(FIntPoint InTextureSize) : UpdateCaller(&FUpdatableTexture::AsyncUpdate, this) { Data.Resize(InTextureSize); Texture = FSlateApplication::Get().GetRenderer()->CreateUpdatableTexture(Data.TextureSize.X, Data.TextureSize.Y); Texture->UpdateTexture(Data.Data); } void FUpdatableTexture::Resize(FIntPoint NewSize) { if (NewSize.X > 16384) NewSize.X = 16384; if (NewSize.Y > 16384) NewSize.Y = 16384; NextSize = NewSize; ReSized = true; } void FUpdatableTexture::RequestUpdate(bool Async) { UE_LOG(LogTemp, Log, TEXT("Request Update")) if (Async) { UpdateCaller.Call(); } else { RedrawImage.ExecuteIfBound(Data); Update(); } } void FUpdatableTexture::Update() { if (ReSized) Texture->ResizeTexture(Data.TextureSize.X, Data.TextureSize.Y); Texture->UpdateTexture(Data.Data); ReSized = false; OnOverRedraw.ExecuteIfBound(); } void FUpdatableTexture::AsyncUpdate() { Async(EAsyncExecution::ThreadPool, [this]() { Data.Resize(NextSize); RedrawImage.ExecuteIfBound(Data); PUSH_THREAD_EVENT(UpdatableTexture, this); }); }