Add Ground Zero foliage pass
This commit is contained in:
@@ -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;
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
// Copyright Pacificao. All Rights Reserved.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "GameFramework/Actor.h"
|
||||
#include "AgrarianFoliagePatch.generated.h"
|
||||
|
||||
class UHierarchicalInstancedStaticMeshComponent;
|
||||
class USceneComponent;
|
||||
|
||||
UCLASS(Blueprintable)
|
||||
class AGRARIANGAME_API AAgrarianFoliagePatch : public AActor
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
AAgrarianFoliagePatch();
|
||||
|
||||
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Agrarian|Foliage")
|
||||
TObjectPtr<USceneComponent> SceneRoot;
|
||||
|
||||
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Agrarian|Foliage")
|
||||
TObjectPtr<UHierarchicalInstancedStaticMeshComponent> TreeInstances;
|
||||
|
||||
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Agrarian|Foliage")
|
||||
TObjectPtr<UHierarchicalInstancedStaticMeshComponent> ShrubInstances;
|
||||
|
||||
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Agrarian|Foliage")
|
||||
TObjectPtr<UHierarchicalInstancedStaticMeshComponent> GrassInstances;
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "Agrarian|Foliage")
|
||||
void ClearFoliage();
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "Agrarian|Foliage")
|
||||
int32 AddTreeInstance(const FTransform& InstanceTransform);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "Agrarian|Foliage")
|
||||
int32 AddShrubInstance(const FTransform& InstanceTransform);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "Agrarian|Foliage")
|
||||
int32 AddGrassInstance(const FTransform& InstanceTransform);
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "Agrarian|Foliage")
|
||||
int32 GetTreeInstanceCount() const;
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "Agrarian|Foliage")
|
||||
int32 GetShrubInstanceCount() const;
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "Agrarian|Foliage")
|
||||
int32 GetGrassInstanceCount() const;
|
||||
};
|
||||
Reference in New Issue
Block a user