Files
UnrealEngine/Engine/Plugins/Experimental/Water/Source/Runtime/Private/EnvQueryTest_InsideWaterBody.cpp
2025-05-18 13:04:45 +08:00

65 lines
1.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "EnvQueryTest_InsideWaterBody.h"
#include "EnvironmentQuery/Items/EnvQueryItemType_VectorBase.h"
#include "WaterBodyComponent.h"
#include "WaterBodyManager.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(EnvQueryTest_InsideWaterBody)
UEnvQueryTest_InsideWaterBody::UEnvQueryTest_InsideWaterBody(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
Cost = EEnvTestCost::High;
ValidItemType = UEnvQueryItemType_VectorBase::StaticClass();
SetWorkOnFloatValues(false);
}
void UEnvQueryTest_InsideWaterBody::RunTest(FEnvQueryInstance& QueryInstance) const
{
BoolValue.BindData(QueryInstance.Owner.Get(), QueryInstance.QueryID);
const bool bWantsInside = BoolValue.GetValue();
for (FEnvQueryInstance::ItemIterator It(this, QueryInstance); It; ++It)
{
const FVector ItemLocation = GetItemLocation(QueryInstance, It.GetIndex());
bool bInside = false;
FWaterBodyManager::ForEachWaterBodyComponent(GetWorld(), [this, ItemLocation, &bInside](UWaterBodyComponent* WaterBodyComponent)
{
EWaterBodyQueryFlags QueryFlags = EWaterBodyQueryFlags::ComputeImmersionDepth;
if (bIncludeWaves)
{
QueryFlags |= EWaterBodyQueryFlags::IncludeWaves;
if (bSimpleWaves)
{
QueryFlags |= EWaterBodyQueryFlags::SimpleWaves;
}
}
if (bIgnoreExclusionVolumes)
{
QueryFlags |= EWaterBodyQueryFlags::IgnoreExclusionVolumes;
}
const FWaterBodyQueryResult QueryResult = WaterBodyComponent->QueryWaterInfoClosestToWorldLocation(ItemLocation, QueryFlags);
if (QueryResult.IsInWater())
{
bInside = true;
return false;
}
return true;
});
It.SetScore(TestPurpose, FilterType, bInside, bWantsInside);
}
}
FText UEnvQueryTest_InsideWaterBody::GetDescriptionDetails() const
{
return DescribeBoolTestParams("inside water body");
}