Files
UnrealEngineUWP/Engine/Source/Editor/VirtualTexturingEditor/Private/RuntimeVirtualTextureThumbnailRenderer.cpp
jeremy moore dd8eddc00b Some more non-unity build fixes
#ROBOMERGE-SOURCE: CL 8130646 via CL 8133911
#ROBOMERGE-BOT: (v401-8057353)

[CL 8160284 by jeremy moore in Main branch]
2019-08-21 09:38:23 -04:00

87 lines
3.4 KiB
C++

// Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.
#include "RuntimeVirtualTextureThumbnailRenderer.h"
#include "Components/RuntimeVirtualTextureComponent.h"
#include "RenderingThread.h"
#include "SceneInterface.h"
#include "VT/RuntimeVirtualTexture.h"
#include "VT/RuntimeVirtualTextureRender.h"
#include "UnrealClient.h"
#include "UObject/UObjectIterator.h"
namespace
{
/** Find a matching component for this URuntimeVirtualTexture. */
URuntimeVirtualTextureComponent* FindComponent(URuntimeVirtualTexture* RuntimeVirtualTexture)
{
for (TObjectIterator<URuntimeVirtualTextureComponent> It; It; ++It)
{
URuntimeVirtualTextureComponent* RuntimeVirtualTextureComponent = *It;
if (RuntimeVirtualTextureComponent->GetVirtualTexture() == RuntimeVirtualTexture)
{
return RuntimeVirtualTextureComponent;
}
}
return nullptr;
}
}
URuntimeVirtualTextureThumbnailRenderer::URuntimeVirtualTextureThumbnailRenderer(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
bool URuntimeVirtualTextureThumbnailRenderer::CanVisualizeAsset(UObject* Object)
{
URuntimeVirtualTexture* RuntimeVirtualTexture = Cast<URuntimeVirtualTexture>(Object);
if (RuntimeVirtualTexture->GetEnabled())
{
//todo[vt]: Support thumbnails for ERuntimeVirtualTextureMaterialType::WorldHeight (which requires render to PF_G16)
if (RuntimeVirtualTexture->GetMaterialType() != ERuntimeVirtualTextureMaterialType::WorldHeight)
{
// We need a matching URuntimeVirtualTextureComponent in a Scene to be able to render a thumbnail
URuntimeVirtualTextureComponent* RuntimeVirtualTextureComponent = FindComponent(RuntimeVirtualTexture);
FSceneInterface* Scene = RuntimeVirtualTextureComponent != nullptr ? RuntimeVirtualTextureComponent->GetScene() : nullptr;
return Scene != nullptr;
}
}
return false;
}
void URuntimeVirtualTextureThumbnailRenderer::Draw(UObject* Object, int32 X, int32 Y, uint32 Width, uint32 Height, FRenderTarget* RenderTarget, FCanvas* Canvas)
{
URuntimeVirtualTexture* RuntimeVirtualTexture = Cast<URuntimeVirtualTexture>(Object);
URuntimeVirtualTextureComponent* RuntimeVirtualTextureComponent = FindComponent(RuntimeVirtualTexture);
FSceneInterface* Scene = RuntimeVirtualTextureComponent != nullptr ? RuntimeVirtualTextureComponent->GetScene() : nullptr;
check(Scene != nullptr);
const FBox2D DestRect = FBox2D(FVector2D(X, Y), FVector2D(Width, Height));
const FTransform Transform = RuntimeVirtualTextureComponent->GetVirtualTextureTransform();
const uint32 VirtualTextureSceneIndex = RuntimeVirtualTexture::GetRuntimeVirtualTextureSceneIndex_GameThread(RuntimeVirtualTextureComponent);
const ERuntimeVirtualTextureMaterialType MaterialType = RuntimeVirtualTexture->GetMaterialType();
FVTProducerDescription VTDesc;
RuntimeVirtualTexture->GetProducerDescription(VTDesc, Transform);
const int32 MaxLevel = (int32)FMath::CeilLogTwo(FMath::Max(VTDesc.BlockWidthInTiles, VTDesc.BlockHeightInTiles));
ENQUEUE_RENDER_COMMAND(BakeStreamingTextureTileCommand)(
[Scene, VirtualTextureSceneIndex, MaterialType, RenderTarget, DestRect, Transform, MaxLevel](FRHICommandListImmediate& RHICmdList)
{
RuntimeVirtualTexture::RenderPage(
RHICmdList,
Scene->GetRenderScene(),
1 << VirtualTextureSceneIndex,
MaterialType,
RenderTarget->GetRenderTargetTexture(), DestRect,
nullptr, DestRect,
Transform,
FBox2D(FVector2D(0, 0), FVector2D(1, 1)),
MaxLevel,
MaxLevel,
ERuntimeVirtualTextureDebugType::None);
});
}