Files
UnrealEngine/Engine/Source/Runtime/Landscape/Private/LandscapeEditLayerRendererPrivate.h
2025-05-18 13:04:45 +08:00

92 lines
5.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "LandscapeEditTypes.h"
#include "LandscapeEditLayerRenderer.h"
#include "LandscapeEditLayerRendererPrivate.generated.h"
/**
* Edit layer renderer added at the bottom of the stack to provide the default value for every requested target layer (heightmaps and weightmaps)
* It could have been handled with a simple clear as the first operation when performing the merge, but doing it through a renderer turns out to be an elegant way to resolve the
* situation where the first actual edit layer's render item declares dependencies between each component and others (e.g. say you have only a ULandscapeHeightmapNormalsEditLayerRenderer
* in the renderer stack, which requires each component's immediate neighbors). In such a situation, the component dependencies would be skipped because dependencies are
* between a renderer and its previous one in the stack and since in the case described above (a single renderer in the stack), there's no previous renderer, then the dependencies
* would simply not be registered, and the render batches would end up being incorrect as a result.
*/
UCLASS()
class ULandscapeDefaultEditLayerRenderer : public UObject
#if CPP && WITH_EDITOR
, public ILandscapeEditLayerRenderer
#endif // CPP && WITH_EDITOR
{
GENERATED_BODY()
#if WITH_EDITOR
public:
//~ Begin ILandscapeEditLayerRenderer implementation
virtual void GetRendererStateInfo(const UE::Landscape::EditLayers::FMergeContext* InMergeContext,
UE::Landscape::EditLayers::FEditLayerTargetTypeState& OutSupportedTargetTypeState, UE::Landscape::EditLayers::FEditLayerTargetTypeState& OutEnabledTargetTypeState, TArray<TBitArray<>>& OutTargetLayerGroups) const override;
virtual TArray<UE::Landscape::EditLayers::FEditLayerRenderItem> GetRenderItems(const UE::Landscape::EditLayers::FMergeContext* InMergeContext) const override;
virtual FString GetEditLayerRendererDebugName() const override;
virtual UE::Landscape::EditLayers::ERenderFlags GetRenderFlags(const UE::Landscape::EditLayers::FMergeContext* InMergeContext) const override { return UE::Landscape::EditLayers::ERenderFlags::RenderMode_Recorded; }
virtual bool RenderLayer(UE::Landscape::EditLayers::FRenderParams& RenderParams, UE::Landscape::FRDGBuilderRecorder& RDGBuilderRecorder) override;
//~ End ILandscapeEditLayerRenderer implementation
#endif // WITH_EDITOR
};
/**
* Edit layer renderer added at the top of the stack to generate the normals, right before resolving the textures.
* For now, the rendered components require (up to) their 8 immediate neighbors to generate adequate normals on the border so the renderer inserts that strong dependency, so that the components
* that are needed in the batch are guaranteed to have their neighbors present in the same batch :
*/
UCLASS()
class ULandscapeHeightmapNormalsEditLayerRenderer : public UObject
#if CPP && WITH_EDITOR
, public ILandscapeEditLayerRenderer
#endif //CPP && WITH_EDITOR
{
GENERATED_BODY()
#if WITH_EDITOR
public:
//~ Begin ILandscapeEditLayerRenderer implementation
virtual void GetRendererStateInfo(const UE::Landscape::EditLayers::FMergeContext* InMergeContext,
UE::Landscape::EditLayers::FEditLayerTargetTypeState& OutSupportedTargetTypeState, UE::Landscape::EditLayers::FEditLayerTargetTypeState& OutEnabledTargetTypeState, TArray<TBitArray<>>& OutTargetLayerGroups) const override;
virtual TArray<UE::Landscape::EditLayers::FEditLayerRenderItem> GetRenderItems(const UE::Landscape::EditLayers::FMergeContext* InMergeContext) const override;
virtual FString GetEditLayerRendererDebugName() const override;
virtual UE::Landscape::EditLayers::ERenderFlags GetRenderFlags(const UE::Landscape::EditLayers::FMergeContext* InMergeContext) const override { return UE::Landscape::EditLayers::ERenderFlags::RenderMode_Recorded; }
virtual bool RenderLayer(UE::Landscape::EditLayers::FRenderParams& RenderParams, UE::Landscape::FRDGBuilderRecorder& RDGBuilderRecorder) override;
//~ End ILandscapeEditLayerRenderer implementation
#endif // WITH_EDITOR
};
/**
* Edit layer renderer inserted at the end of the edit layers stack merge to normalize the weights of the rendered weightmaps
*/
UCLASS()
class ULandscapeWeightmapWeightBlendedLayersRenderer : public UObject
#if CPP && WITH_EDITOR
, public ILandscapeEditLayerRenderer
#endif // CPP && WITH_EDITOR
{
GENERATED_BODY()
#if WITH_EDITOR
public:
//~ Begin ILandscapeEditLayerRenderer implementation
virtual void GetRendererStateInfo(const UE::Landscape::EditLayers::FMergeContext* InMergeContext,
UE::Landscape::EditLayers::FEditLayerTargetTypeState& OutSupportedTargetTypeState, UE::Landscape::EditLayers::FEditLayerTargetTypeState& OutEnabledTargetTypeState, TArray<TBitArray<>>& OutTargetLayerGroups) const override;
virtual TArray<UE::Landscape::EditLayers::FEditLayerRenderItem> GetRenderItems(const UE::Landscape::EditLayers::FMergeContext* InMergeContext) const override;
virtual FString GetEditLayerRendererDebugName() const override;
virtual UE::Landscape::EditLayers::ERenderFlags GetRenderFlags(const UE::Landscape::EditLayers::FMergeContext* InMergeContext) const override { return UE::Landscape::EditLayers::ERenderFlags::RenderMode_Recorded; }
virtual bool RenderLayer(UE::Landscape::EditLayers::FRenderParams& RenderParams, UE::Landscape::FRDGBuilderRecorder& RDGBuilderRecorder) override;
//~ End ILandscapeEditLayerRenderer implementation
TBitArray<> GatherWeightBlendedWeightmapLayerBitIndices(const UE::Landscape::EditLayers::FMergeContext* InMergeContext) const;
#endif // WITH_EDITOR
};