AronaSlate/Source/Arona/Render/UpdatableTexture.cpp
2024-01-25 11:21:15 +08:00

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);
});
}