Add Ground Zero foliage pass

This commit is contained in:
2026-05-14 06:41:23 -07:00
parent 7a05e324a3
commit 7ffe3ec978
7 changed files with 397 additions and 4 deletions
@@ -0,0 +1,94 @@
// Copyright Pacificao. All Rights Reserved.
#include "AgrarianFoliagePatch.h"
#include "Components/HierarchicalInstancedStaticMeshComponent.h"
#include "Components/SceneComponent.h"
namespace
{
void ConfigureFoliageComponent(UHierarchicalInstancedStaticMeshComponent* Component, const FName CollisionProfileName)
{
if (!Component)
{
return;
}
Component->SetMobility(EComponentMobility::Static);
Component->SetCollisionProfileName(CollisionProfileName);
Component->SetGenerateOverlapEvents(false);
Component->bCastDynamicShadow = true;
Component->bCastStaticShadow = true;
Component->InstanceStartCullDistance = 120000;
Component->InstanceEndCullDistance = 180000;
}
}
AAgrarianFoliagePatch::AAgrarianFoliagePatch()
{
PrimaryActorTick.bCanEverTick = false;
SceneRoot = CreateDefaultSubobject<USceneComponent>(TEXT("SceneRoot"));
RootComponent = SceneRoot;
SceneRoot->SetMobility(EComponentMobility::Static);
TreeInstances = CreateDefaultSubobject<UHierarchicalInstancedStaticMeshComponent>(TEXT("TreeInstances"));
TreeInstances->SetupAttachment(SceneRoot);
ConfigureFoliageComponent(TreeInstances, TEXT("BlockAll"));
ShrubInstances = CreateDefaultSubobject<UHierarchicalInstancedStaticMeshComponent>(TEXT("ShrubInstances"));
ShrubInstances->SetupAttachment(SceneRoot);
ConfigureFoliageComponent(ShrubInstances, TEXT("NoCollision"));
GrassInstances = CreateDefaultSubobject<UHierarchicalInstancedStaticMeshComponent>(TEXT("GrassInstances"));
GrassInstances->SetupAttachment(SceneRoot);
ConfigureFoliageComponent(GrassInstances, TEXT("NoCollision"));
}
void AAgrarianFoliagePatch::ClearFoliage()
{
if (TreeInstances)
{
TreeInstances->ClearInstances();
}
if (ShrubInstances)
{
ShrubInstances->ClearInstances();
}
if (GrassInstances)
{
GrassInstances->ClearInstances();
}
}
int32 AAgrarianFoliagePatch::AddTreeInstance(const FTransform& InstanceTransform)
{
return TreeInstances ? TreeInstances->AddInstance(InstanceTransform, true) : INDEX_NONE;
}
int32 AAgrarianFoliagePatch::AddShrubInstance(const FTransform& InstanceTransform)
{
return ShrubInstances ? ShrubInstances->AddInstance(InstanceTransform, true) : INDEX_NONE;
}
int32 AAgrarianFoliagePatch::AddGrassInstance(const FTransform& InstanceTransform)
{
return GrassInstances ? GrassInstances->AddInstance(InstanceTransform, true) : INDEX_NONE;
}
int32 AAgrarianFoliagePatch::GetTreeInstanceCount() const
{
return TreeInstances ? TreeInstances->GetInstanceCount() : 0;
}
int32 AAgrarianFoliagePatch::GetShrubInstanceCount() const
{
return ShrubInstances ? ShrubInstances->GetInstanceCount() : 0;
}
int32 AAgrarianFoliagePatch::GetGrassInstanceCount() const
{
return GrassInstances ? GrassInstances->GetInstanceCount() : 0;
}