void UEnvQueryTest_Trace::RunTest(FEnvQueryInstance& QueryInstance) const { UObject* DataOwner = QueryInstance.Owner.Get(); BoolValue.BindData(DataOwner, QueryInstance.QueryID); TraceFromContext.BindData(DataOwner, QueryInstance.QueryID); ItemHeightOffset.BindData(DataOwner, QueryInstance.QueryID); ContextHeightOffset.BindData(DataOwner, QueryInstance.QueryID); bool bWantsHit = BoolValue.GetValue(); bool bTraceToItem = TraceFromContext.GetValue(); float ItemZ = ItemHeightOffset.GetValue(); float ContextZ = ContextHeightOffset.GetValue(); TArray<FVector> ContextLocations; if (!QueryInstance.PrepareContext(Context, ContextLocations)) { return; } FCollisionQueryParams TraceParams(TEXT("EnvQueryTrace"), TraceData.bTraceComplex); TraceParams.bTraceAsyncScene = true; TArray<AActor*> IgnoredActors; if (QueryInstance.PrepareContext(Context, IgnoredActors)) { TraceParams.AddIgnoredActors(IgnoredActors); } ECollisionChannel TraceCollisionChannel = UEngineTypes::ConvertToCollisionChannel(TraceData.TraceChannel); FVector TraceExtent(TraceData.ExtentX, TraceData.ExtentY, TraceData.ExtentZ); FRunTraceSignature TraceFunc; switch (TraceData.TraceShape) { case EEnvTraceShape::Line: TraceFunc.BindUObject(this, bTraceToItem ? &UEnvQueryTest_Trace::RunLineTraceTo : &UEnvQueryTest_Trace::RunLineTraceFrom); break; case EEnvTraceShape::Box: TraceFunc.BindUObject(this, bTraceToItem ? &UEnvQueryTest_Trace::RunBoxTraceTo : &UEnvQueryTest_Trace::RunBoxTraceFrom); break; case EEnvTraceShape::Sphere: TraceFunc.BindUObject(this, bTraceToItem ? &UEnvQueryTest_Trace::RunSphereTraceTo : &UEnvQueryTest_Trace::RunSphereTraceFrom); break; case EEnvTraceShape::Capsule: TraceFunc.BindUObject(this, bTraceToItem ? &UEnvQueryTest_Trace::RunCapsuleTraceTo : &UEnvQueryTest_Trace::RunCapsuleTraceFrom); break; default: return; } for (int32 ContextIndex = 0; ContextIndex < ContextLocations.Num(); ContextIndex++) { ContextLocations[ContextIndex].Z += ContextZ; } for (FEnvQueryInstance::ItemIterator It(this, QueryInstance); It; ++It) { const FVector ItemLocation = GetItemLocation(QueryInstance, It.GetIndex()) + FVector(0, 0, ItemZ); AActor* ItemActor = GetItemActor(QueryInstance, It.GetIndex()); for (int32 ContextIndex = 0; ContextIndex < ContextLocations.Num(); ContextIndex++) { const bool bHit = TraceFunc.Execute(ItemLocation, ContextLocations[ContextIndex], ItemActor, QueryInstance.World, TraceCollisionChannel, TraceParams, TraceExtent); It.SetScore(TestPurpose, FilterType, bHit, bWantsHit); } } }
void UEnvQueryTest_Trace::RunTest(struct FEnvQueryInstance& QueryInstance) { bool bWantsHit = false; bool bTraceToItem = false; bool bTraceComplex = true; float ExtentX = 0.0f; float ExtentY = 0.0f; float ExtentZ = 0.0f; float ItemZ = 0.0f; float ContextZ = 0.0f; if (!QueryInstance.GetParamValue(BoolFilter, bWantsHit, TEXT("BoolFilter")) || !QueryInstance.GetParamValue(TraceToItem, bTraceToItem, TEXT("TraceToItem")) || !QueryInstance.GetParamValue(TraceComplex, bTraceComplex, TEXT("TraceComplex")) || !QueryInstance.GetParamValue(TraceExtentX, ExtentX, TEXT("TraceExtentX")) || !QueryInstance.GetParamValue(TraceExtentY, ExtentY, TEXT("TraceExtentY")) || !QueryInstance.GetParamValue(TraceExtentZ, ExtentZ, TEXT("TraceExtentY")) || !QueryInstance.GetParamValue(ItemOffsetZ, ItemZ, TEXT("ItemOffsetZ")) || !QueryInstance.GetParamValue(ContextOffsetZ, ContextZ, TEXT("ContextOffsetZ")) ) { return; } TArray<FVector> ContextLocations; if (!QueryInstance.PrepareContext(Context, ContextLocations)) { return; } FCollisionQueryParams TraceParams(TEXT("EnvQueryTrace"), bTraceComplex); TraceParams.bTraceAsyncScene = true; TArray<AActor*> IgnoredActors; if (QueryInstance.PrepareContext(Context, IgnoredActors)) { TraceParams.AddIgnoredActors(IgnoredActors); } ECollisionChannel TraceCollisionChannel = UEngineTypes::ConvertToCollisionChannel(TraceChannel); FRunTraceSignature TraceFunc; switch (TraceMode) { case EEnvTestTrace::Line: TraceFunc.BindUObject(this, bTraceToItem ? &UEnvQueryTest_Trace::RunLineTraceTo : &UEnvQueryTest_Trace::RunLineTraceFrom); break; case EEnvTestTrace::Box: TraceFunc.BindUObject(this, bTraceToItem ? &UEnvQueryTest_Trace::RunBoxTraceTo : &UEnvQueryTest_Trace::RunBoxTraceFrom); break; case EEnvTestTrace::Sphere: TraceFunc.BindUObject(this, bTraceToItem ? &UEnvQueryTest_Trace::RunSphereTraceTo : &UEnvQueryTest_Trace::RunSphereTraceFrom); break; case EEnvTestTrace::Capsule: TraceFunc.BindUObject(this, bTraceToItem ? &UEnvQueryTest_Trace::RunCapsuleTraceTo : &UEnvQueryTest_Trace::RunCapsuleTraceFrom); break; default: return; } for (int32 iContext = 0; iContext < ContextLocations.Num(); iContext++) { ContextLocations[iContext].Z += ContextZ; } for (FEnvQueryInstance::ItemIterator It(QueryInstance); It; ++It) { const FVector ItemLocation = GetItemLocation(QueryInstance, *It) + FVector(0,0,ItemZ); AActor* ItemActor = GetItemActor(QueryInstance, *It); for (int32 iContext = 0; iContext < ContextLocations.Num(); iContext++) { const bool bHit = TraceFunc.Execute(ItemLocation, ContextLocations[iContext], ItemActor, QueryInstance.World, TraceCollisionChannel, TraceParams, FVector(ExtentX, ExtentY, ExtentZ)); It.SetScore(Condition, bHit, bWantsHit); } } }