66 lines
1.4 KiB
C++
66 lines
1.4 KiB
C++
#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);
|
|
});
|
|
}
|