diff --git a/Source/StevesUEHelpers/Private/StevesTextureRenderTargetPool.cpp b/Source/StevesUEHelpers/Private/StevesTextureRenderTargetPool.cpp index 5a93e05..189fc73 100644 --- a/Source/StevesUEHelpers/Private/StevesTextureRenderTargetPool.cpp +++ b/Source/StevesUEHelpers/Private/StevesTextureRenderTargetPool.cpp @@ -18,8 +18,28 @@ void FStevesTextureRenderTargetPool::ReleaseTextureReservation(UTextureRenderTar FStevesTextureRenderTargetReservationPtr FStevesTextureRenderTargetPool::ReserveTexture(FIntPoint Size, ETextureRenderTargetFormat Format, const UObject* Owner) { - // TODO - return MakeShared(nullptr, this->AsShared()); + const FTextureKey Key {Size, Format}; + UTextureRenderTarget2D* Tex = nullptr; + if (auto Pooled = UnreservedTextures.Find(Key)) + { + Tex = *Pooled; + UnreservedTextures.RemoveSingle(Key, Tex); + } + else if (Size.X > 0 && Size.Y > 0) + { + // No existing texture, so create + // Texture owner should be a valid UObject that will determine lifespan + UObject* TextureOwner = PoolOwner.IsValid() ? PoolOwner.Get() : GetTransientPackage(); + Tex = NewObject(TextureOwner); + Tex->RenderTargetFormat = Format; + Tex->InitAutoFormat(Size.X, Size.Y); + Tex->UpdateResourceImmediate(true); + } + + // Record reservation + Reservations.Add(FReservationInfo(Key, Owner, Tex)); + + return MakeShared(Tex, this->AsShared(), Owner); } void FStevesTextureRenderTargetPool::RevokeReservations(const UObject* ForOwner)