Files
UnrealEngine/Engine/Source/Runtime/Landscape/Public/LandscapeEditLayerMergeRenderContext.inl
2025-05-18 13:04:45 +08:00

92 lines
2.4 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "StructUtils/InstancedStruct.h"
#include "LandscapeEditLayerMergeRenderBlackboardItem.h"
namespace UE::Landscape::EditLayers
{
#if WITH_EDITOR
template <typename T, typename>
bool UE::Landscape::EditLayers::FMergeRenderContext::HasBlackboardItem() const
{
for (const TInstancedStruct<FLandscapeEditLayerMergeRenderBlackboardItem>& Item : BlackboardItems)
{
if (const T* TypedItem = Item.template GetPtr<T>())
{
return true;
}
}
return false;
}
template <typename T, typename... TArgs, typename>
T& UE::Landscape::EditLayers::FMergeRenderContext::AddBlackboardItem(TArgs&&... InArgs)
{
T* Item = BlackboardItems.Add_GetRef(TInstancedStruct<T>::Make(Forward<TArgs>(InArgs)...)).template GetMutablePtr<T>();
return *Item;
}
template <typename T, typename>
T* UE::Landscape::EditLayers::FMergeRenderContext::TryGetBlackboardItem()
{
for (TInstancedStruct<FLandscapeEditLayerMergeRenderBlackboardItem>& Item : BlackboardItems)
{
if (T* TypedItem = Item.template GetMutablePtr<T>())
{
return TypedItem;
}
}
return nullptr;
}
template <typename T, typename>
T& UE::Landscape::EditLayers::FMergeRenderContext::GetBlackboardItem()
{
for (TInstancedStruct<FLandscapeEditLayerMergeRenderBlackboardItem>& Item : BlackboardItems)
{
if (T* TypedItem = Item.template GetMutablePtr<T>())
{
return *TypedItem;
}
}
check(false);
// this is absolutely wrong, but we shouldn't ever reach that line and we need to return something anyway :
static FLandscapeEditLayerMergeRenderBlackboardItem DummyItem;
return *reinterpret_cast<T*>(&DummyItem);
}
template <typename T, typename... TArgs, typename>
T& UE::Landscape::EditLayers::FMergeRenderContext::GetOrCreateBlackboardItem(TArgs&&... InArgs)
{
T* Item = TryGetBlackboardItem<T>();
if (Item == nullptr)
{
Item = BlackboardItems.Add_GetRef(TInstancedStruct<T>::Make(Forward<TArgs>(InArgs)...)).template GetMutablePtr<T>();
}
check(Item != nullptr);
return *Item;
}
template <typename T, typename>
TArray<T*> UE::Landscape::EditLayers::FMergeRenderContext::GetBlackboardItems()
{
TArray<T*> Items;
for (TInstancedStruct<FLandscapeEditLayerMergeRenderBlackboardItem>& Item : BlackboardItems)
{
if (T* TypedItem = Item.template GetMutablePtr<T>())
{
Items.Add(TypedItem);
}
}
return Items;
}
#endif // WITH_EDITOR
} //namespace UE::Landscape::EditLayers