UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
EnvQueryTypes.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "Stats/Stats.h"
8#include "UObject/Object.h"
10#include "Engine/EngineTypes.h"
11#if UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_4
13#endif
17#include "EnvQueryTypes.generated.h"
18
19class AActor;
20class ANavigationData;
21class Error;
22class UBlackboardComponent;
23class UBlackboardData;
24class UEnvQuery;
28class UEnvQueryTest;
31
33
34// If set, execution details will be processed by debugger
35#ifndef USE_EQS_DEBUGGER
36#define USE_EQS_DEBUGGER (1 && !(UE_BUILD_SHIPPING || UE_BUILD_TEST))
37#endif
38
39// If set, execution stats will also gather EQS tick load data (16k memory for each query record)
40#define USE_EQS_TICKLOADDATA (1 && USE_EQS_DEBUGGER && WITH_EDITOR)
41
43
59
60UENUM()
62{
63 enum Type : int
64 {
65 Filter UMETA(DisplayName="Filter Only"),
66 Score UMETA(DisplayName="Score Only"),
67 FilterAndScore UMETA(DisplayName="Filter and Score")
68 };
69}
70
71UENUM()
73{
74 enum Type : int
75 {
83 Match
84 };
85}
86
87UENUM()
89{
90 enum Type : int
91 {
96
98 // What other curve shapes should be supported? At first I was thinking we'd have parametric (F*V^P + C), but
99 // many versions of that curve would violate the [0, 1] output range which I think we should preserve. So instead
100 // I think we should define these by "curve shape". I'm not sure if we need to allow full tweaks to the curves,
101 // such as supporting other "Exponential" curves (positive even powers). However, I think it's likely that we'll
102 // want to support "smooth LERP" / S-shaped curve of the form 2x^3 - 3x^2, and possibly a "sideways" version of
103 // the same S-curve. We also might want to allow "Sine" curves, basically adjusted to match the range and then
104 // simply offset by some amount to allow a peak or valley in the middle or on the ends. (Four Sine options are
105 // probably sufficient.) I'm not sure if Sine is really needed though, so probably we should only add it if
106 // there's a need identified. One other curve shape we might want is "Square Root", which might optionally
107 // support any positive fractional power (if we also supported any positive even number for an "Exponential"
108 // type.
109 };
110}
111
112UENUM()
114{
115 enum Type : int
116 {
120 Unused UMETA(Hidden),
122 Skip UMETA(DisplayName = "Do not weight"),
123 };
124}
125
126UENUM()
128{
129 enum Type : int
130 {
137 };
138}
139
140UENUM()
142{
143 enum Type : int
144 {
145 AllPass UMETA(Tooltip = "All contexts must pass condition"),
146 AnyPass UMETA(Tooltip = "At least one context must pass condition"),
147 };
148}
149
150UENUM()
152{
153 enum Type : int
154 {
155 AverageScore UMETA(Tooltip = "Use average score from all contexts"),
156 MinScore UMETA(Tooltip = "Use minimum score from all contexts"),
157 MaxScore UMETA(Tooltip = "Use maximum score from all contexts"),
158 Multiply UMETA(Tooltip = "Multiply scores from all contexts"),
159 };
160}
161
163{
164 enum Type
165 {
168 };
169}
170
171UENUM(BlueprintType)
184
185UENUM()
187{
188 enum Type : int
189 {
190 SingleResult UMETA(Tooltip="Pick first item with the best score", DisplayName="Single Best Item"),
191 RandomBest5Pct UMETA(Tooltip="Pick random item with score 95% .. 100% of max", DisplayName="Single Random Item from Best 5%"),
192 RandomBest25Pct UMETA(Tooltip="Pick random item with score 75% .. 100% of max", DisplayName="Single Random Item from Best 25%"),
193 AllMatching UMETA(Tooltip="Get all items that match conditions"),
194 };
195}
196
197UENUM()
204
205UENUM()
207{
208 enum Type : int
209 {
213 };
214}
215
216UENUM()
218{
219 Float,
220 Int,
221 Bool,
223};
224
225UENUM()
237
238UENUM()
240{
241 enum Type : int
242 {
247 };
248}
249
250UENUM()
252{
253 enum Type : int
254 {
258 };
259}
260
261UENUM(meta=(ScriptName="EnvDirectionType"))
263{
264 enum Type : int
265 {
266 TwoPoints UMETA(DisplayName="Two Points",ToolTip="Direction from location of one context to another."),
267 Rotation UMETA(ToolTip="Context's rotation will be used as a direction."),
268 };
269}
270
271UENUM()
283
284USTRUCT(BlueprintType)
286{
288
289 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Param)
290 FName ParamName;
291
292 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Param)
293 EAIParamType ParamType;
294
295 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Param)
296 float Value;
297
299 : ParamType(EAIParamType::Float), Value(0.f)
300 {}
301};
302
303USTRUCT()
305{
307
308
309 UPROPERTY(EditDefaultsOnly, Category=Direction)
311
313 UPROPERTY(EditDefaultsOnly, Category=Direction)
315
317 UPROPERTY(EditDefaultsOnly, Category=Direction)
319
321 UPROPERTY(EditDefaultsOnly, Category=Direction, meta=(DisplayName="Mode"))
323
324 AIMODULE_API FText ToText() const;
325};
326
327USTRUCT()
329{
331
337
339
341 UPROPERTY()
342 int32 VersionNum;
343
345 UPROPERTY(EditDefaultsOnly, Category=Trace)
347
349 UPROPERTY(EditDefaultsOnly, Category=Trace, meta=(UIMin=0, ClampMin=0))
350 float ProjectDown;
351
353 UPROPERTY(EditDefaultsOnly, Category=Trace, meta=(UIMin=0, ClampMin=0))
354 float ProjectUp;
355
357 UPROPERTY(EditDefaultsOnly, Category=Trace, meta=(UIMin=0, ClampMin=0))
358 float ExtentX;
359
361 UPROPERTY(EditDefaultsOnly, Category=Trace, meta=(UIMin=0, ClampMin=0))
362 float ExtentY;
363
365 UPROPERTY(EditDefaultsOnly, Category=Trace, meta=(UIMin=0, ClampMin=0))
366 float ExtentZ;
367
372 UPROPERTY(EditDefaultsOnly, Category=Trace)
373 float PostProjectionVerticalOffset;
374
376 UPROPERTY(EditDefaultsOnly, Category=Trace)
378
380 UPROPERTY(EditDefaultsOnly, Category=Trace)
382
384 UPROPERTY(EditDefaultsOnly, Category = Trace)
385 FName TraceProfileName;
386
388 UPROPERTY(EditDefaultsOnly, Category=Trace)
389 TEnumAsByte<EEnvTraceShape::Type> TraceShape;
390
392 UPROPERTY(EditDefaultsOnly, Category=Trace)
393 TEnumAsByte<EEnvQueryTrace::Type> TraceMode;
394
396 UPROPERTY(EditDefaultsOnly, Category=Trace, AdvancedDisplay)
398
400 UPROPERTY(EditDefaultsOnly, Category=Trace, AdvancedDisplay)
401 uint32 bOnlyBlockingHits : 1;
402
404 UPROPERTY(EditDefaultsOnly, Category=Trace)
405 uint32 bCanTraceOnNavMesh : 1;
406
408 UPROPERTY(EditDefaultsOnly, Category=Trace)
409 uint32 bCanTraceOnGeometry : 1;
410
412 UPROPERTY(EditDefaultsOnly, Category=Trace)
413 uint32 bCanDisableTrace : 1;
414
416 UPROPERTY(EditDefaultsOnly, Category=Trace)
417 uint32 bCanProjectDown : 1;
418
420
421 AIMODULE_API void SetGeometryOnly();
422 AIMODULE_API void SetNavmeshOnly();
423
424 AIMODULE_API void OnPostLoad();
425};
426
427USTRUCT()
429{
431
433 ExtentX(10.0f),
434 ExtentY(10.0f),
435 ExtentZ(10.0f),
436 ShapeOffset(FVector::ZeroVector),
437 OverlapChannel(ECC_WorldStatic),
438 OverlapShape(EEnvOverlapShape::Box),
439 bOnlyBlockingHits(true),
440 bOverlapComplex(false),
441 bSkipOverlapQuerier(false)
442 {
443 }
444
446 UPROPERTY(EditDefaultsOnly, Category = Trace, meta = (UIMin = 0, ClampMin = 0))
447 float ExtentX;
448
450 UPROPERTY(EditDefaultsOnly, Category = Trace, meta = (UIMin = 0, ClampMin = 0))
451 float ExtentY;
452
454 UPROPERTY(EditDefaultsOnly, Category = Trace, meta = (UIMin = 0, ClampMin = 0))
455 float ExtentZ;
456
457 UPROPERTY(EditDefaultsOnly, Category = Trace, AdvancedDisplay, Meta =
458 (Tooltip="Offset from the item location at which to test the overlap. For example, you may need to offset vertically to avoid overlaps with flat ground."))
460
462 UPROPERTY(EditDefaultsOnly, Category = Overlap)
464
466 UPROPERTY(EditDefaultsOnly, Category = Overlap)
467 TEnumAsByte<EEnvOverlapShape::Type> OverlapShape;
468
470 UPROPERTY(EditDefaultsOnly, Category = Overlap, AdvancedDisplay)
471 uint32 bOnlyBlockingHits : 1;
472
474 UPROPERTY(EditDefaultsOnly, Category = Overlap, AdvancedDisplay)
475 uint32 bOverlapComplex : 1;
476
478 UPROPERTY(EditDefaultsOnly, Category = Overlap, AdvancedDisplay)
479 uint32 bSkipOverlapQuerier : 1;
480};
481
483// Returned results
484
486{
488 float Score;
489
492
495
496 inline bool IsValid() const { return DataOffset >= 0 && !bIsDiscarded; }
497 inline void Discard() { bIsDiscarded = true; }
498
499 bool operator<(const FEnvQueryItem& Other) const
500 {
501 // sort by validity
502 if (IsValid() != Other.IsValid())
503 {
504 // self not valid = less important
505 return !IsValid();
506 }
507
508 // sort by score if not equal. As last resort sort by DataOffset to achieve stable sort.
509 return Score != Other.Score ? Score < Other.Score : DataOffset < Other.DataOffset;
510 }
511
512 FEnvQueryItem() : Score(0.0f), DataOffset(-1), bIsDiscarded(false) {}
513 FEnvQueryItem(int32 InOffset) : Score(0.0f), DataOffset(InOffset), bIsDiscarded(false) {}
514};
515
516template <> struct TIsZeroConstructType<FEnvQueryItem> { enum { Value = true }; };
517
518USTRUCT(BlueprintType)
520{
522
524
526 UPROPERTY(BlueprintReadOnly, Category = "EQS")
528
531
532private:
534 EEnvQueryStatus::Type Status;
535
536public:
538 UPROPERTY(BlueprintReadOnly, Category = "EQS")
539 int32 OptionIndex;
540
542 UPROPERTY(BlueprintReadOnly, Category = "EQS")
543 int32 QueryID;
544
547
548 inline float GetItemScore(int32 Index) const { return Items.IsValidIndex(Index) ? Items[Index].Score : 0.0f; }
549
551 AIMODULE_API AActor* GetItemAsActor(int32 Index) const;
552 AIMODULE_API FVector GetItemAsLocation(int32 Index) const;
553
554 template<typename TItemType>
555 const typename TItemType::FValueType& GetItemAsTypeChecked(const int32 Index) const
556 {
557 check(Items.IsValidIndex(Index)
558 && ItemType.Get()
559 && ItemType->IsChildOf(TItemType::StaticClass()));
560
561 return TItemType::template GetValueFromMemory<typename TItemType::FValueType>(GetItemRawMemory(Index));
562 }
563
565 AIMODULE_API void GetAllAsActors(TArray<AActor*>& OutActors) const;
566 AIMODULE_API void GetAllAsLocations(TArray<FVector>& OutLocations) const;
567
568 const uint8* GetItemRawMemory(const int32 Index) const
569 {
570 check(Items.IsValidIndex(Index));
571 return RawData.GetData() + Items[Index].DataOffset;
572 }
573
574 FEnvQueryResult() : ItemType(NULL), Status(EEnvQueryStatus::Processing), OptionIndex(0), QueryID(0) {}
575 FEnvQueryResult(const EEnvQueryStatus::Type& InStatus) : ItemType(NULL), Status(InStatus), OptionIndex(0), QueryID(0) {}
576
577 inline bool IsFinished() const { return Status != EEnvQueryStatus::Processing; }
578 inline bool IsAborted() const { return Status == EEnvQueryStatus::Aborted; }
579 inline bool IsSuccessful() const { return Status == EEnvQueryStatus::Success; }
581 inline void MarkAsAborted() { Status = EEnvQueryStatus::Aborted; }
582 inline void MarkAsFailed() { Status = EEnvQueryStatus::Failed; }
584 inline void MarkAsOwnerLost() { Status = EEnvQueryStatus::OwnerLost; }
585
586 inline EEnvQueryStatus::Type GetRawStatus() const { return Status; }
587
588 UE_DEPRECATED(5.0, "FEnvQueryResult::IsSuccsessful is deprecated. Use FEnvQueryResult::IsSuccessful instead.")
589 inline bool IsSuccsessful() const { return IsSuccessful(); }
590};
591
592
594// Runtime processing structures
595
597
603
606{
609
610#if USE_EQS_DEBUGGER
613
617#endif // USE_EQS_DEBUGGER
618
629
631 {
632 return sizeof(*this) +
633#if USE_EQS_DEBUGGER
635#endif
637 }
638};
639
640USTRUCT()
642{
644
645
648
650 int32 NumValues;
651
654
656 : NumValues(0)
657 {}
658
659 inline uint32 GetAllocatedSize() const { return sizeof(*this) + RawData.GetAllocatedSize(); }
660};
661
662USTRUCT()
664{
666
667
670
674
676 int32 SourceOptionIndex;
677
681
683 uint32 bHasNavLocations : 1;
684
685 uint32 GetAllocatedSize() const
686 {
687 return sizeof(*this) + Tests.GetAllocatedSize();
688 }
689};
690
691#if NO_LOGGING
692#define EQSHEADERLOG(...)
693#else
694#define EQSHEADERLOG(msg) Log(msg)
695#endif // NO_LOGGING
696
733
738
740{
745
746 // indicates the query was run in a single-item mode and that it has been found
748
751
753
754 void Store(const FEnvQueryInstance& QueryInstance, const float ExecutionTime, const bool bStepDone);
755 void PrepareOption(const FEnvQueryInstance& QueryInstance, const TArray<UEnvQueryGenerator*>& Generators, const int32 NumTests);
756};
757
758// This struct is now deprecated, please use FEnvQueryDebugData instead.
760{
761};
762
763UCLASS(Abstract, MinimalAPI)
765{
767
768public:
770 static AIMODULE_API const float SkippedItemValue;
771
774
775 static AIMODULE_API FText GetShortTypeName(const UObject* Ob);
777};
778
779USTRUCT()
790
791USTRUCT()
793{
795
797
799 FString QueryName;
800
802 FName UniqueName;
803
807
810
813
817
821
823 int32 CurrentTest;
824
827 int32 CurrentTestStartingItem;
828
831
833 int32 NumValidItems;
834
836 uint16 ValueSize;
837
838#if USE_EQS_DEBUGGER
841
844#endif // USE_EQS_DEBUGGER
845
848
851
854
857
859 double StartTime;
860
863
866
867#if !UE_BUILD_SHIPPING
869 double GenerationTimeWarningSeconds = 0.01f;
870#endif // UE_BUILD_SHIPPING
871
874
878
882
886
888 AIMODULE_API void ExecuteOneStep(double TimeLimit);
889
891 AIMODULE_API bool PrepareContext(UClass* Context, FEnvQueryContextData& ContextData);
892
894 AIMODULE_API bool PrepareContext(UClass* Context, TArray<FEnvQuerySpatialData>& Data);
895 AIMODULE_API bool PrepareContext(UClass* Context, TArray<FVector>& Data);
896 AIMODULE_API bool PrepareContext(UClass* Context, TArray<FRotator>& Data);
898 AIMODULE_API bool PrepareContext(UClass* Context, TArray<AActor*>& Data);
899
900 bool IsInSingleItemFinalSearch() const { return !!bPassOnSingleResult; }
902 bool CanBatchTest() const { return !IsInSingleItemFinalSearch(); }
903
904 bool IsCurrentlyRunningAsync() const { return bIsCurrentlyRunningAsync; }
905
907 AIMODULE_API void ReserveItemData(int32 NumAdditionalItems);
908
909 template<typename TypeItem>
910 void AddItemData(typename TypeItem::FValueType ItemValue)
911 {
912 DEC_MEMORY_STAT_BY(STAT_AI_EQS_InstanceMemory, RawData.GetAllocatedSize() + Items.GetAllocatedSize());
913
914 // ItemValue's size must match what is expected by class doing memory write
915 check(GetDefault<TypeItem>()->GetValueSize() == sizeof(typename TypeItem::FValueType));
916 // writer must fit into block allocated for single item (not 'equal' on purpose, check UEnvQueryGenerator_Composite.bAllowDifferentItemTypes)
917 check(GetDefault<TypeItem>()->GetValueSize() <= ValueSize);
918
919 const int32 DataOffset = RawData.AddZeroed(ValueSize);
920 TypeItem::SetValue(RawData.GetData() + DataOffset, ItemValue);
921 Items.Add(FEnvQueryItem(DataOffset));
922
923 INC_MEMORY_STAT_BY(STAT_AI_EQS_InstanceMemory, RawData.GetAllocatedSize() + Items.GetAllocatedSize());
924 }
925
927 template<typename TypeItem>
929 {
930 if (ItemCollection.Num() > 0)
931 {
932 DEC_MEMORY_STAT_BY(STAT_AI_EQS_InstanceMemory, RawData.GetAllocatedSize() + Items.GetAllocatedSize());
933
934 // ItemValue's size must match what is expected by class doing memory write
935 check(GetDefault<TypeItem>()->GetValueSize() == sizeof(typename TypeItem::FValueType));
936 // writer must fit into block allocated for single item (not 'equal' on purpose, check UEnvQueryGenerator_Composite.bAllowDifferentItemTypes)
937 check(GetDefault<TypeItem>()->GetValueSize() <= ValueSize);
938
939 int32 DataOffset = RawData.AddZeroed(ValueSize * ItemCollection.Num());
940 Items.Reserve(Items.Num() + ItemCollection.Num());
941
942 for (typename TypeItem::FValueType& Item : ItemCollection)
943 {
944 TypeItem::SetValue(RawData.GetData() + DataOffset, Item);
945 Items.Add(FEnvQueryItem(DataOffset));
946 DataOffset += ValueSize;
947 }
948
949 INC_MEMORY_STAT_BY(STAT_AI_EQS_InstanceMemory, RawData.GetAllocatedSize() + Items.GetAllocatedSize());
950 }
951 }
952
953 template<typename TypeItem, typename TypeValue>
955 {
956 AddItemData<TypeItem>((typename TypeItem::FValueType)(ItemValue));
957 }
958
959 template<typename TypeItem, typename TypeValue>
961 {
962 for (auto& Item : ItemCollection)
963 {
964 AddItemData<TypeItem>((typename TypeItem::FValueType)(Item));
965 }
966 }
967
968protected:
969
971 AIMODULE_API void FinalizeGeneration();
972
974 AIMODULE_API void FinalizeTest();
975
977 AIMODULE_API void FinalizeQuery();
978
980 AIMODULE_API void NormalizeScores();
981
983 AIMODULE_API void SortScores();
984
986 AIMODULE_API void PickRandomItemOfScoreAtLeast(float MinScore);
987
989 AIMODULE_API void PickSingleItem(int32 ItemIndex);
990
991public:
992
994 AIMODULE_API void StripRedundantData();
995
996#if STATS
997 inline void IncStats()
998 {
1001 }
1002
1003 inline void DecStats()
1004 {
1007 }
1008
1010 AIMODULE_API uint32 GetContextAllocatedSize() const;
1011#else
1012 inline uint32 GetAllocatedSize() const { return 0; }
1013 inline uint32 GetContextAllocatedSize() const { return 0; }
1014 inline void IncStats() {}
1015 inline void DecStats() {}
1016#endif // STATS
1017
1018#if !NO_LOGGING
1019 AIMODULE_API void Log(const FString Msg) const;
1020#endif // #if !NO_LOGGING
1021
1022#if USE_EQS_DEBUGGER
1023# define UE_EQS_DBGMSG(Condition, Format, ...) \
1024 if (Condition) \
1025 { \
1026 Instance.ItemDetails[CurrentItem].FailedDescription = FString::Printf(Format, ##__VA_ARGS__); \
1027 }
1028
1029# define UE_EQS_LOG(CategoryName, Verbosity, Format, ...) \
1030 UE_LOG(CategoryName, Verbosity, Format, ##__VA_ARGS__); \
1031 UE_EQS_DBGMSG(true, Format, ##__VA_ARGS__);
1032#else
1033# define UE_EQS_DBGMSG(Condition, Format, ...)
1034# define UE_EQS_LOG(CategoryName, Verbosity, Format, ...) UE_LOG(CategoryName, Verbosity, Format, ##__VA_ARGS__);
1035#endif
1036
1038 AIMODULE_API FString GetExecutionTimeDescription() const;
1039
1040#if CPP || UE_BUILD_DOCS
1043 struct FConstItemIterator
1044 {
1046 : Instance(QueryInstance)
1047 , CurrentItem(StartingItemIndex != INDEX_NONE ? StartingItemIndex : QueryInstance.CurrentTestStartingItem)
1048 {
1050 {
1052 }
1053 else
1054 {
1055 CurrentItem = QueryInstance.CurrentTestStartingItem;
1056 if (Instance.Items.IsValidIndex(CurrentItem) == false || Instance.Items[CurrentItem].IsValid() == false)
1057 {
1058 ++(*this);
1059 }
1060 }
1061 }
1062
1064 {
1065 return Instance.RawData.GetData() + Instance.Items[CurrentItem].DataOffset;
1066 }
1067
1068 int32 GetIndex() const
1069 {
1070 return CurrentItem;
1071 }
1072
1073 inline explicit operator bool() const
1074 {
1075 return CurrentItem < Instance.Items.Num();
1076 }
1077
1078 void operator++()
1079 {
1080 ++CurrentItem;
1081 for (; CurrentItem < Instance.Items.Num() && !Instance.Items[CurrentItem].IsValid(); ++CurrentItem)
1082 ;
1083 }
1084
1085 protected:
1086
1089 };
1090
1091 struct FItemIterator : public FConstItemIterator
1092 {
1094
1096 {
1097 Instance.CurrentTestStartingItem = CurrentItem;
1098 }
1099
1105 void SetScore(EEnvTestPurpose::Type TestPurpose, EEnvTestFilterType::Type FilterType, float Score, float FilterMin, float FilterMax)
1106 {
1107 if (bForced)
1108 {
1109 return;
1110 }
1111
1112 bool bPassedTest = true;
1113
1114 if (TestPurpose != EEnvTestPurpose::Score) // May need to filter results!
1115 {
1116 switch (FilterType)
1117 {
1119 bPassedTest = (Score <= FilterMax);
1120 UE_EQS_DBGMSG(!bPassedTest, TEXT("Value %f is above maximum value set to %f"), Score, FilterMax);
1121 break;
1122
1124 bPassedTest = (Score >= FilterMin);
1125 UE_EQS_DBGMSG(!bPassedTest, TEXT("Value %f is below minimum value set to %f"), Score, FilterMin);
1126 break;
1127
1129 bPassedTest = (Score >= FilterMin) && (Score <= FilterMax);
1130 UE_EQS_DBGMSG(!bPassedTest, TEXT("Value %f is out of range set to (%f, %f)"), Score, FilterMin, FilterMax);
1131 break;
1132
1134 UE_EQS_LOG(LogEQS, Error, TEXT("Filtering Type set to 'Match' for floating point test. Will consider test as failed in all cases."));
1135 bPassedTest = false;
1136 break;
1137
1138 default:
1139 UE_EQS_LOG(LogEQS, Error, TEXT("Filtering Type set to invalid value for floating point test. Will consider test as failed in all cases."));
1140 bPassedTest = false;
1141 break;
1142 }
1143 }
1144
1145 if (bPassedTest)
1146 {
1147 SetScoreInternal(Score);
1149 }
1150
1152 }
1153
1157 void SetScore(EEnvTestPurpose::Type TestPurpose, EEnvTestFilterType::Type FilterType, bool bScore, bool bExpected)
1158 {
1159 if (bForced)
1160 {
1161 return;
1162 }
1163
1164 bool bPassedTest = true;
1165 switch (FilterType)
1166 {
1169 UE_EQS_DBGMSG(!bPassedTest, TEXT("Boolean score doesn't match (expected %s and got %s)"), bExpected ? TEXT("TRUE") : TEXT("FALSE"), bScore ? TEXT("TRUE") : TEXT("FALSE"));
1170 break;
1171
1173 UE_EQS_LOG(LogEQS, Error, TEXT("Filtering Type set to 'Maximum' for boolean test. Will consider test as failed in all cases."));
1174 bPassedTest = false;
1175 break;
1176
1178 UE_EQS_LOG(LogEQS, Error, TEXT("Filtering Type set to 'Minimum' for boolean test. Will consider test as failed in all cases."));
1179 bPassedTest = false;
1180 break;
1181
1183 UE_EQS_LOG(LogEQS, Error, TEXT("Filtering Type set to 'Range' for boolean test. Will consider test as failed in all cases."));
1184 bPassedTest = false;
1185 break;
1186
1187 default:
1188 UE_EQS_LOG(LogEQS, Error, TEXT("Filtering Type set to invalid value for boolean test. Will consider test as failed in all cases."));
1189 bPassedTest = false;
1190 break;
1191 }
1192
1193 if (bPassedTest || !bIsFiltering)
1194 {
1195 // even if the item's result is different than expected
1196 // but we're not filtering those items out, we still want
1197 // to treat this as successful test, just with different score
1198 SetScoreInternal(bPassedTest ? 1.0f : 0.f);
1200 }
1201
1203 }
1204
1209 {
1210 bForced = true;
1211 bPassed = (InStatus == EEnvItemStatus::Passed);
1212 ItemScore = Score;
1213 }
1214
1217 {
1218 Deadline = -1.0f;
1219 return *this;
1220 }
1221
1222 inline explicit operator bool() const
1223 {
1224 return CurrentItem < Instance.Items.Num() && !Instance.bFoundSingleResult && (Deadline < 0 || FPlatformTime::Seconds() < Deadline);
1225 }
1226
1227 void operator++()
1228 {
1230 if (!Instance.bFoundSingleResult)
1231 {
1232 InitItemScore();
1233 FConstItemIterator::operator++();
1234 }
1235 }
1236
1237 protected:
1238
1239 double Deadline;
1240 float ItemScore;
1245 uint8 bPassed : 1;
1246 uint8 bForced : 1;
1247 uint8 bIsFiltering : 1;
1248
1249 void InitItemScore()
1250 {
1251 NumPassedForItem = 0;
1252 NumTestsForItem = 0;
1253 ItemScore = 0.0f;
1254 bPassed = true;
1255 bForced = false;
1256 }
1257
1260
1261 inline void SetScoreInternal(float Score)
1262 {
1263 switch (CachedScoreOp)
1264 {
1265 case EEnvTestScoreOperator::AverageScore:
1266 ItemScore += Score;
1267 break;
1268
1269 case EEnvTestScoreOperator::MinScore:
1270 if (!NumPassedForItem || ItemScore > Score)
1271 {
1272 ItemScore = Score;
1273 }
1274 break;
1275
1276 case EEnvTestScoreOperator::MaxScore:
1277 if (!NumPassedForItem || ItemScore < Score)
1278 {
1279 ItemScore = Score;
1280 }
1281 break;
1282 case EEnvTestScoreOperator::Multiply:
1283 // ItemScore defaults to 0, so for first test we need to initialize the score, otherwise we end up constantly multiplying by 0
1284 ItemScore = (NumTestsForItem == 0) ? Score : (ItemScore * Score);
1285 break;
1286 }
1287 }
1288
1289 inline void CheckItemPassed()
1290 {
1291 if (!bForced)
1292 {
1293 if (NumTestsForItem == 0)
1294 {
1295 bPassed = false;
1296 }
1297 else if (!bIsFiltering)
1298 {
1299 bPassed = true;
1300 }
1301 else if (CachedFilterOp == EEnvTestFilterOperator::AllPass)
1302 {
1303 bPassed = bPassed && (NumPassedForItem == NumTestsForItem);
1304 }
1305 else
1306 {
1307 bPassed = bPassed && (NumPassedForItem > 0);
1308 }
1309 }
1310 }
1311 };
1313#endif
1314
1315#undef UE_EQS_LOG
1316#undef UE_EQS_DBGMSG
1317
1318#if USE_EQS_DEBUGGER
1321#endif // USE_EQS_DEBUGGER
1322
1323#if STATS
1324 TStatId StatId;
1325#endif
1326
1327 AIMODULE_API FBox GetBoundingBox() const;
1328};
1329
1334
1335USTRUCT(BlueprintType)
1337{
1339
1340 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = EQS)
1341 FName ParamName;
1342
1343 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = EQS)
1344 EAIParamType ParamType;
1345
1346 UPROPERTY(BlueprintReadWrite, Category = EQS)
1347 uint8 bAllowBBKey : 1;
1348
1349 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = EQS)
1350 float Value;
1351
1352 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = EQS, meta=(EditCondition="bAllowBBKey", EditConditionHides))
1354
1355
1357 {
1358 ParamType = EAIParamType::Float;
1359 Value = 0.f;
1360 BBKey.AllowNoneAsValue(true);
1361 bAllowBBKey = true;
1362 }
1363
1364 AIMODULE_API void ConfigureBBKey(UObject &QueryOwner);
1365
1366 static AIMODULE_API void GenerateConfigurableParamsFromNamedValues(UObject &QueryOwner, TArray<FAIDynamicParam>& OutQueryConfig, TArray<FEnvNamedValue>& InQueryParams);
1367};
1368
1369USTRUCT()
1371{
1373
1375
1376 UPROPERTY(Category = Node, EditAnywhere, meta = (EditCondition = "!bUseBBKeyForQueryTemplate"))
1377 TObjectPtr<UEnvQuery> QueryTemplate;
1378
1379 UPROPERTY(Category = Node, EditAnywhere)
1381
1383 UPROPERTY(EditAnywhere, Category = Blackboard, meta = (EditCondition = "bUseBBKeyForQueryTemplate"))
1384 FBlackboardKeySelector EQSQueryBlackboardKey;
1385
1387 UPROPERTY(Category = Node, EditAnywhere)
1389
1390 UPROPERTY(Category = Node, EditAnywhere, meta=(InlineEditConditionToggle))
1391 uint32 bUseBBKeyForQueryTemplate : 1;
1392
1393 uint32 bInitialized : 1;
1394
1395 AIMODULE_API void InitForOwnerAndBlackboard(UObject& Owner, UBlackboardData* BBAsset);
1396
1397 bool IsValid() const { return bInitialized; }
1398
1399 AIMODULE_API int32 Execute(UObject& QueryOwner, const UBlackboardComponent* BlackboardComponent, FQueryFinishedSignature& QueryFinishedDelegate);
1400
1401#if WITH_EDITOR
1402 AIMODULE_API void PostEditChangeProperty(UObject& Owner, struct FPropertyChangedEvent& PropertyChangedEvent);
1403#endif // WITH_EDITOR
1404};
#define NULL
Definition oodle2base.h:134
#define check(expr)
Definition AssertionMacros.h:314
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::int16 int16
A 16-bit signed integer.
Definition Platform.h:1123
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define INC_MEMORY_STAT_BY(StatId, Amount)
Definition Stats.h:700
#define DEC_DWORD_STAT_BY(StatId, Amount)
Definition Stats.h:703
#define DECLARE_CYCLE_STAT_EXTERN(CounterName, StatId, GroupId, API)
Definition Stats.h:679
#define INC_DWORD_STAT_BY(StatId, Amount)
Definition Stats.h:698
#define DECLARE_DWORD_COUNTER_STAT_EXTERN(CounterName, StatId, GroupId, API)
Definition Stats.h:682
#define DECLARE_STATS_GROUP(GroupDesc, GroupId, GroupCat)
Definition Stats.h:689
#define DECLARE_FLOAT_COUNTER_STAT_EXTERN(CounterName, StatId, GroupId, API)
Definition Stats.h:681
#define DEC_MEMORY_STAT_BY(StatId, Amount)
Definition Stats.h:705
#define DECLARE_MEMORY_STAT_EXTERN(CounterName, StatId, GroupId, API)
Definition Stats.h:687
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define DECLARE_DELEGATE_OneParam(DelegateName, Param1Type)
Definition DelegateCombinations.h:48
DIRECTLINK_API Display
Definition DirectLinkLog.h:8
ETraceTypeQuery
Definition EngineTypes.h:1200
ECollisionChannel
Definition EngineTypes.h:1088
#define UE_EQS_DBGMSG(Condition, Format,...)
Definition EnvQueryTypes.h:1023
#define UE_EQS_LOG(CategoryName, Verbosity, Format,...)
Definition EnvQueryTypes.h:1029
EEnvQueryResultNormalizationOption
Definition EnvQueryTypes.h:199
EAIParamType
Definition EnvQueryTypes.h:218
FArchive & operator<<(FArchive &Ar, FEnvQueryDebugProfileData::FStep &Data)
Definition EnvQueryTypes.cpp:489
return true
Definition ExternalRpcRegistry.cpp:601
#define DECLARE_LOG_CATEGORY_EXTERN(CategoryName, DefaultVerbosity, CompileTimeVerbosity)
Definition LogMacros.h:361
const bool
Definition NetworkReplayStreaming.h:178
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define GENERATED_BODY(...)
Definition ObjectMacros.h:765
#define UCLASS(...)
Definition ObjectMacros.h:776
#define UENUM(...)
Definition ObjectMacros.h:749
#define USTRUCT(...)
Definition ObjectMacros.h:746
#define GENERATED_USTRUCT_BODY(...)
Definition ObjectMacros.h:767
bool IsSuccessful(ESavePackageResult Result)
Definition Package.h:101
const bool bTraceComplex
Definition PhysicsInterfaceUtils.h:19
#define Square(a, x, y)
Definition Predicates.inl:251
USkinnedMeshComponent float
Definition SkinnedMeshComponent.h:60
uint32 Offset
Definition VulkanMemory.cpp:4033
bool Failed
Definition binka_ue_decode_test.cpp:18
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Actor.h:257
Definition NavigationData.h:547
Definition Archive.h:1208
Definition NameTypes.h:617
Definition Text.h:385
Definition Array.h:670
SizeType AddZeroed()
Definition Array.h:2755
UE_NODEBUG UE_FORCEINLINE_HINT SIZE_T GetAllocatedSize(void) const
Definition Array.h:1059
Definition EnumAsByte.h:22
Definition UnrealString.h.inl:34
Definition SharedPointer.h:692
Definition SubclassOf.h:30
Definition BlackboardData.h:46
Definition Class.h:3793
Definition EnvQueryContext.h:15
Definition EnvQueryGenerator.h:23
Definition EnvQueryItemType_ActorBase.h:16
Definition EnvQueryItemType_VectorBase.h:15
Definition EnvQueryItemType.h:16
Definition EnvQueryTest.h:62
Definition EnvQueryTypes.h:765
static AIMODULE_API const float SkippedItemValue
Definition EnvQueryTypes.h:770
static AIMODULE_API float UnlimitedStepTime
Definition EnvQueryTypes.h:773
Definition EnvQuery.h:20
Definition NavigationQueryFilter.h:107
Definition Object.h:95
Definition World.h:918
Definition EnvQueryTypes.h:263
Type
Definition EnvQueryTypes.h:265
Definition EnvQueryTypes.h:163
Type
Definition EnvQueryTypes.h:165
@ Failed
Definition EnvQueryTypes.h:167
@ Passed
Definition EnvQueryTypes.h:166
Definition EnvQueryTypes.h:252
Type
Definition EnvQueryTypes.h:254
Definition EnvQueryTypes.h:207
Type
Definition EnvQueryTypes.h:209
Definition EnvQueryTypes.h:187
Type
Definition EnvQueryTypes.h:189
Definition EnvQueryTypes.h:173
Type
Definition EnvQueryTypes.h:175
@ Processing
Definition EnvQueryTypes.h:176
@ OwnerLost
Definition EnvQueryTypes.h:180
@ Failed
Definition EnvQueryTypes.h:178
@ Aborted
Definition EnvQueryTypes.h:179
@ MissingParam
Definition EnvQueryTypes.h:181
@ Success
Definition EnvQueryTypes.h:177
Definition EnvQueryTypes.h:273
Type
Definition EnvQueryTypes.h:275
@ SpecifiedValue
Definition EnvQueryTypes.h:278
@ FilterThreshold
Definition EnvQueryTypes.h:280
Definition EnvQueryTypes.h:227
Type
Definition EnvQueryTypes.h:229
@ NavigationOverLedges
Definition EnvQueryTypes.h:234
@ GeometryByProfile
Definition EnvQueryTypes.h:233
@ GeometryByChannel
Definition EnvQueryTypes.h:232
Definition EnvQueryTypes.h:128
Type
Definition EnvQueryTypes.h:130
Definition EnvQueryTypes.h:142
Type
Definition EnvQueryTypes.h:144
Definition EnvQueryTypes.h:73
Type
Definition EnvQueryTypes.h:75
@ Minimum
Definition EnvQueryTypes.h:77
@ Maximum
Definition EnvQueryTypes.h:79
@ Match
Definition EnvQueryTypes.h:83
@ Range
Definition EnvQueryTypes.h:81
Definition EnvQueryTypes.h:62
Type
Definition EnvQueryTypes.h:64
Definition EnvQueryTypes.h:89
Type
Definition EnvQueryTypes.h:91
@ InverseLinear
Definition EnvQueryTypes.h:94
@ SquareRoot
Definition EnvQueryTypes.h:95
Definition EnvQueryTypes.h:152
Type
Definition EnvQueryTypes.h:154
Definition EnvQueryTypes.h:114
Type
Definition EnvQueryTypes.h:116
Definition EnvQueryTypes.h:240
Type
Definition EnvQueryTypes.h:242
Definition EnvQueryTypes.h:1331
AIMODULE_API const ANavigationData * FindNavigationDataForQuery(FEnvQueryInstance &QueryInstance)
Definition EnvQueryTypes.cpp:291
SIZE_T GetAllocatedSize(const T &Value)
Definition ManagedArray.h:93
@ false
Definition radaudio_common.h:23
U16 Index
Definition radfft.cpp:71
Definition EnvQueryTypes.h:1337
static double Seconds()
Definition AndroidPlatformTime.h:20
Definition BehaviorTreeTypes.h:624
void AllowNoneAsValue(bool bAllow)
Definition BehaviorTreeTypes.h:659
Definition EnvQueryTypes.h:1371
Definition EnvQueryTypes.h:760
Definition EnvQueryTypes.h:305
Definition EnvQueryTypes.h:286
Definition EnvQueryTypes.h:429
Definition EnvQueryTypes.h:642
uint32 GetAllocatedSize() const
Definition EnvQueryTypes.h:659
Definition EnvQueryTypes.h:740
void Store(const FEnvQueryInstance &QueryInstance, const float ExecutionTime, const bool bStepDone)
Definition EnvQueryInstance.cpp:29
FEnvQueryDebugData()
Definition EnvQueryTypes.h:752
TArray< FEnvQueryItem > DebugItems
Definition EnvQueryTypes.h:741
TArray< uint8 > RawData
Definition EnvQueryTypes.h:743
int32 CurrentOptionGeneratorIdx
Definition EnvQueryTypes.h:750
void PrepareOption(const FEnvQueryInstance &QueryInstance, const TArray< UEnvQueryGenerator * > &Generators, const int32 NumTests)
Definition EnvQueryInstance.cpp:45
TArray< FString > PerformedTestNames
Definition EnvQueryTypes.h:744
TArray< FEnvQueryItemDetails > DebugItemDetails
Definition EnvQueryTypes.h:742
uint32 bSingleItemResult
Definition EnvQueryTypes.h:747
Definition EnvQueryTypes.h:718
int32 NumGenerators
Definition EnvQueryTypes.h:719
TArray< FName > GeneratorNames
Definition EnvQueryTypes.h:720
FOptionData()
Definition EnvQueryTypes.h:725
TArray< int32 > TestIndices
Definition EnvQueryTypes.h:723
int32 OptionIdx
Definition EnvQueryTypes.h:722
Definition EnvQueryTypes.h:709
FOptionStat()
Definition EnvQueryTypes.h:713
TArray< FStep > StepData
Definition EnvQueryTypes.h:710
int32 NumRuns
Definition EnvQueryTypes.h:711
Definition EnvQueryTypes.h:700
int32 NumProcessedItems
Definition EnvQueryTypes.h:702
float ExecutionTime
Definition EnvQueryTypes.h:701
FStep()
Definition EnvQueryTypes.h:704
Definition EnvQueryTypes.h:698
TArray< FOptionStat > OptionStats
Definition EnvQueryTypes.h:728
TArray< FOptionData > OptionData
Definition EnvQueryTypes.h:729
Definition EnvQueryTypes.h:781
Definition EnvQueryTypes.h:793
void IncStats()
Definition EnvQueryTypes.h:1014
uint32 GetContextAllocatedSize() const
Definition EnvQueryTypes.h:1013
void DecStats()
Definition EnvQueryTypes.h:1015
uint8 bPassOnSingleResult
Definition EnvQueryTypes.h:850
bool IsCurrentlyRunningAsync() const
Definition EnvQueryTypes.h:904
void AddItemData(typename TypeItem::FValueType ItemValue)
Definition EnvQueryTypes.h:910
double StartTime
Definition EnvQueryTypes.h:859
uint8 bFoundSingleResult
Definition EnvQueryTypes.h:847
FEnvQueryDebugData DebugData
Definition EnvQueryTypes.h:1319
void AddItemData(TArray< TypeValue > &ItemCollection)
Definition EnvQueryTypes.h:960
void AddItemData(TypeValue ItemValue)
Definition EnvQueryTypes.h:954
int32 CurrentTestStartingItem
Definition EnvQueryTypes.h:827
bool CanBatchTest() const
Definition EnvQueryTypes.h:902
uint32 GetAllocatedSize() const
Definition EnvQueryTypes.h:1012
static AIMODULE_API bool bDebuggingInfoEnabled
Definition EnvQueryTypes.h:1320
uint8 bIsCurrentlyRunningAsync
Definition EnvQueryTypes.h:856
uint8 bStoreDebugInfo
Definition EnvQueryTypes.h:843
int32 NumProcessedItems
Definition EnvQueryTypes.h:840
double CurrentStepTimeLimit
Definition EnvQueryTypes.h:865
EEnvQueryRunMode::Type Mode
Definition EnvQueryTypes.h:873
float FNamedParamValueType
Definition EnvQueryTypes.h:796
uint8 bHasLoggedTimeLimitWarning
Definition EnvQueryTypes.h:853
void AddItemData(TArray< typename TypeItem::FValueType > &ItemCollection)
Definition EnvQueryTypes.h:928
double TotalExecutionTime
Definition EnvQueryTypes.h:862
Definition EnvQueryTypes.h:606
FEnvQueryItemDetails()
Definition EnvQueryTypes.h:619
FString FailedDescription
Definition EnvQueryTypes.h:616
FEnvQueryItemDetails(int32 NumTests, int32 InItemIndex)
Definition EnvQueryTypes.h:620
TArray< float > TestWeightedScores
Definition EnvQueryTypes.h:612
uint32 GetAllocatedSize() const
Definition EnvQueryTypes.h:630
int32 FailedTestIndex
Definition EnvQueryTypes.h:614
TArray< float > TestResults
Definition EnvQueryTypes.h:608
int32 ItemIndex
Definition EnvQueryTypes.h:615
Definition EnvQueryTypes.h:486
uint32 bIsDiscarded
Definition EnvQueryTypes.h:494
int32 DataOffset
Definition EnvQueryTypes.h:491
bool IsValid() const
Definition EnvQueryTypes.h:496
FEnvQueryItem()
Definition EnvQueryTypes.h:512
bool operator<(const FEnvQueryItem &Other) const
Definition EnvQueryTypes.h:499
void Discard()
Definition EnvQueryTypes.h:497
float Score
Definition EnvQueryTypes.h:488
FEnvQueryItem(int32 InOffset)
Definition EnvQueryTypes.h:513
Definition EnvQueryTypes.h:664
Definition EnvQueryTypes.h:520
void MarkAsOwnerLost()
Definition EnvQueryTypes.h:584
void MarkAsAborted()
Definition EnvQueryTypes.h:581
void MarkAsMissingParam()
Definition EnvQueryTypes.h:580
const uint8 * GetItemRawMemory(const int32 Index) const
Definition EnvQueryTypes.h:568
void MarkAsFinishedWithoutIssues()
Definition EnvQueryTypes.h:583
FEnvQueryResult(const EEnvQueryStatus::Type &InStatus)
Definition EnvQueryTypes.h:575
bool IsSuccessful() const
Definition EnvQueryTypes.h:579
void MarkAsFailed()
Definition EnvQueryTypes.h:582
FEnvQueryResult()
Definition EnvQueryTypes.h:574
const TItemType::FValueType & GetItemAsTypeChecked(const int32 Index) const
Definition EnvQueryTypes.h:555
bool IsFinished() const
Definition EnvQueryTypes.h:577
EEnvQueryStatus::Type GetRawStatus() const
Definition EnvQueryTypes.h:586
bool IsAborted() const
Definition EnvQueryTypes.h:578
Definition EnvQueryTypes.h:599
FRotator Rotation
Definition EnvQueryTypes.h:601
FVector Location
Definition EnvQueryTypes.h:600
Definition EnvQueryTypes.h:329
EDescriptionMode
Definition EnvQueryTypes.h:333
@ Detailed
Definition EnvQueryTypes.h:335
@ Brief
Definition EnvQueryTypes.h:334
Definition UnrealType.h:6865
Definition UnrealTypeTraits.h:172
Definition ObjectPtr.h:488
Definition LightweightStats.h:416
Definition WeakObjectPtrTemplates.h:25