void UEnvQueryTest_Dot::RunTest(struct FEnvQueryInstance& QueryInstance) { float ThresholdValue = 0.0f; if (!QueryInstance.GetParamValue(FloatFilter, ThresholdValue, TEXT("FloatFilter"))) { return; } // gather all possible directions: for contexts different than Item TArray<FVector> LineADirs; const bool bUpdateLineAPerItem = RequiresPerItemUpdates(LineAFrom, LineATo, LineADirection, LineA == EEnvTestDot::Direction); if (!bUpdateLineAPerItem) { GatherLineDirections(LineADirs, QueryInstance, LineAFrom, LineATo, LineADirection, LineA == EEnvTestDot::Direction); if (LineADirs.Num() == 0) { return; } } TArray<FVector> LineBDirs; const bool bUpdateLineBPerItem = RequiresPerItemUpdates(LineBFrom, LineBTo, LineBDirection, LineB == EEnvTestDot::Direction); if (!bUpdateLineBPerItem) { GatherLineDirections(LineBDirs, QueryInstance, LineBFrom, LineBTo, LineBDirection, LineB == EEnvTestDot::Direction); if (LineBDirs.Num() == 0) { return; } } // loop through all items for (FEnvQueryInstance::ItemIterator It(QueryInstance); It; ++It) { // update lines for contexts using current item if (bUpdateLineAPerItem || bUpdateLineBPerItem) { const FVector ItemLocation = (LineA == EEnvTestDot::Direction && LineB == EEnvTestDot::Direction) ? FVector::ZeroVector : GetItemLocation(QueryInstance, *It); const FRotator ItemRotation = (LineA == EEnvTestDot::Direction || LineB == EEnvTestDot::Direction) ? GetItemRotation(QueryInstance, *It) : FRotator::ZeroRotator; if (bUpdateLineAPerItem) { LineADirs.Reset(); GatherLineDirections(LineADirs, QueryInstance, LineAFrom, LineATo, LineADirection, LineA == EEnvTestDot::Direction, ItemLocation, ItemRotation); } if (bUpdateLineBPerItem) { LineBDirs.Reset(); GatherLineDirections(LineBDirs, QueryInstance, LineBFrom, LineBTo, LineBDirection, LineB == EEnvTestDot::Direction, ItemLocation, ItemRotation); } } // perform test for each line pair for (int32 iLineA = 0; iLineA < LineADirs.Num(); iLineA++) { for (int32 iLineB = 0; iLineB < LineBDirs.Num(); iLineB++) { const float DotValue = FVector::DotProduct(LineADirs[iLineA], LineBDirs[iLineB]); It.SetScore(Condition, DotValue, ThresholdValue); } } } }
void UEnvQueryTest_Dot::RunTest(FEnvQueryInstance& QueryInstance) const { FloatValueMin.BindData(QueryInstance.Owner.Get(), QueryInstance.QueryID); float MinThresholdValue = FloatValueMin.GetValue(); FloatValueMax.BindData(QueryInstance.Owner.Get(), QueryInstance.QueryID); float MaxThresholdValue = FloatValueMax.GetValue(); // gather all possible directions: for contexts different than Item TArray<FVector> LineADirs; const bool bUpdateLineAPerItem = RequiresPerItemUpdates(LineA.LineFrom, LineA.LineTo, LineA.Rotation, LineA.DirMode == EEnvDirection::Rotation); if (!bUpdateLineAPerItem) { GatherLineDirections(LineADirs, QueryInstance, LineA.LineFrom, LineA.LineTo, LineA.Rotation, LineA.DirMode == EEnvDirection::Rotation); if (LineADirs.Num() == 0) { return; } } TArray<FVector> LineBDirs; const bool bUpdateLineBPerItem = RequiresPerItemUpdates(LineB.LineFrom, LineB.LineTo, LineB.Rotation, LineB.DirMode == EEnvDirection::Rotation); if (!bUpdateLineBPerItem) { GatherLineDirections(LineBDirs, QueryInstance, LineB.LineFrom, LineB.LineTo, LineB.Rotation, LineB.DirMode == EEnvDirection::Rotation); if (LineBDirs.Num() == 0) { return; } } // loop through all items for (FEnvQueryInstance::ItemIterator It(this, QueryInstance); It; ++It) { // update lines for contexts using current item if (bUpdateLineAPerItem || bUpdateLineBPerItem) { const FVector ItemLocation = (LineA.DirMode == EEnvDirection::Rotation && LineB.DirMode == EEnvDirection::Rotation) ? FVector::ZeroVector : GetItemLocation(QueryInstance, *It); const FRotator ItemRotation = (LineA.DirMode == EEnvDirection::Rotation || LineB.DirMode == EEnvDirection::Rotation) ? GetItemRotation(QueryInstance, *It) : FRotator::ZeroRotator; if (bUpdateLineAPerItem) { LineADirs.Reset(); GatherLineDirections(LineADirs, QueryInstance, LineA.LineFrom, LineA.LineTo, LineA.Rotation, LineA.DirMode == EEnvDirection::Rotation, ItemLocation, ItemRotation); } if (bUpdateLineBPerItem) { LineBDirs.Reset(); GatherLineDirections(LineBDirs, QueryInstance, LineB.LineFrom, LineB.LineTo, LineB.Rotation, LineB.DirMode == EEnvDirection::Rotation, ItemLocation, ItemRotation); } } // perform test for each line pair for (int32 LineAIndex = 0; LineAIndex < LineADirs.Num(); LineAIndex++) { for (int32 LineBIndex = 0; LineBIndex < LineBDirs.Num(); LineBIndex++) { float DotValue = 0.f; switch (TestMode) { case EEnvTestDot::Dot3D: DotValue = FVector::DotProduct(LineADirs[LineAIndex], LineBDirs[LineBIndex]); break; case EEnvTestDot::Dot2D: DotValue = LineADirs[LineAIndex].CosineAngle2D(LineBDirs[LineBIndex]); break; default: UE_LOG(LogEQS, Error, TEXT("Invalid TestMode in EnvQueryTest_Dot in query %s!"), *QueryInstance.QueryName); break; } if (bAbsoluteValue) { DotValue = FMath::Abs(DotValue); } It.SetScore(TestPurpose, FilterType, DotValue, MinThresholdValue, MaxThresholdValue); } } } }