85 lines
2.0 KiB
C++
85 lines
2.0 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "ProceduralFoliageInstance.h"
|
|
#include "FoliageType_InstancedStaticMesh.h"
|
|
|
|
#include UE_INLINE_GENERATED_CPP_BY_NAME(ProceduralFoliageInstance)
|
|
|
|
FProceduralFoliageInstance::FProceduralFoliageInstance()
|
|
: Rotation(ForceInit)
|
|
, Location(ForceInit)
|
|
, Age(0)
|
|
, Normal(ForceInit)
|
|
, Scale(1)
|
|
, Type(nullptr)
|
|
, BaseComponent(nullptr)
|
|
, bBlocker(false)
|
|
, bAlive(true)
|
|
{
|
|
}
|
|
|
|
FProceduralFoliageInstance* GetLessFit(FProceduralFoliageInstance* A, FProceduralFoliageInstance* B)
|
|
{
|
|
//Blocker is used for culling instances when we overlap tiles. It always wins
|
|
if (A->bBlocker){ return B; }
|
|
if (B->bBlocker){ return A; }
|
|
|
|
//we look at priority, then age, then radius
|
|
if (A->Type->OverlapPriority == B->Type->OverlapPriority)
|
|
{
|
|
if (A->Age == B->Age)
|
|
{
|
|
return A->Scale < B->Scale ? A : B;
|
|
}
|
|
else
|
|
{
|
|
return A->Age < B->Age ? A : B;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return A->Type->OverlapPriority < B->Type->OverlapPriority ? A : B;
|
|
}
|
|
}
|
|
|
|
|
|
FProceduralFoliageInstance* FProceduralFoliageInstance::Domination(FProceduralFoliageInstance* A, FProceduralFoliageInstance* B, ESimulationOverlap::Type OverlapType)
|
|
{
|
|
const UFoliageType* AType = A->Type;
|
|
const UFoliageType* BType = B->Type;
|
|
|
|
FProceduralFoliageInstance* Dominated = GetLessFit(A, B);
|
|
|
|
if (OverlapType == ESimulationOverlap::ShadeOverlap && Dominated->Type->bCanGrowInShade)
|
|
{
|
|
return nullptr;
|
|
}
|
|
|
|
return Dominated;
|
|
}
|
|
|
|
float FProceduralFoliageInstance::GetMaxRadius() const
|
|
{
|
|
const float CollisionRadius = GetCollisionRadius();
|
|
const float ShadeRadius = GetShadeRadius();
|
|
return FMath::Max(CollisionRadius, ShadeRadius);
|
|
}
|
|
|
|
float FProceduralFoliageInstance::GetShadeRadius() const
|
|
{
|
|
const float ShadeRadius = Type->ShadeRadius * Scale;
|
|
return ShadeRadius;
|
|
}
|
|
|
|
float FProceduralFoliageInstance::GetCollisionRadius() const
|
|
{
|
|
const float CollisionRadius = Type->CollisionRadius * Scale;
|
|
return CollisionRadius;
|
|
}
|
|
|
|
void FProceduralFoliageInstance::TerminateInstance()
|
|
{
|
|
bAlive = false;
|
|
}
|
|
|