// 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(TEXT("SceneRoot")); RootComponent = SceneRoot; SceneRoot->SetMobility(EComponentMobility::Static); TreeInstances = CreateDefaultSubobject(TEXT("TreeInstances")); TreeInstances->SetupAttachment(SceneRoot); ConfigureFoliageComponent(TreeInstances, TEXT("BlockAll")); ShrubInstances = CreateDefaultSubobject(TEXT("ShrubInstances")); ShrubInstances->SetupAttachment(SceneRoot); ConfigureFoliageComponent(ShrubInstances, TEXT("NoCollision")); GrassInstances = CreateDefaultSubobject(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; }