├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── FlyingNavBenchmark ├── .gitattributes ├── .gitignore ├── Config │ ├── DefaultEditor.ini │ ├── DefaultEngine.ini │ └── DefaultGame.ini ├── Content │ ├── Benchmark.umap │ ├── BenchmarkData.uasset │ ├── BenchmarkSettings.uasset │ ├── DragonBenchmark.umap │ ├── SM_Dragon.uasset │ └── SM_Floor.uasset ├── FlyingNavBenchmark.uproject ├── LICENSE.md └── Source │ ├── FlyingNavBenchmark.Target.cs │ ├── FlyingNavBenchmark │ ├── BenchmarkActor.cpp │ ├── BenchmarkActor.h │ ├── CSVExporter.cpp │ ├── CSVExporter.h │ ├── FlyingNavBenchmark.Build.cs │ ├── FlyingNavBenchmark.cpp │ └── FlyingNavBenchmark.h │ └── FlyingNavBenchmarkEditor.Target.cs ├── FlyingQuickstart ├── Config │ ├── DefaultEditor.ini │ ├── DefaultEditorPerProjectUserSettings.ini │ ├── DefaultEngine.ini │ ├── DefaultGame.ini │ └── DefaultInput.ini ├── Content │ ├── Flying │ │ └── Meshes │ │ │ ├── BaseMaterial.uasset │ │ │ ├── GrayMaterial.uasset │ │ │ ├── UFO.uasset │ │ │ └── UFOMaterial.uasset │ ├── FlyingBP │ │ ├── AI │ │ │ ├── AIC_FollowingController.uasset │ │ │ ├── BB_FollowingPawn.uasset │ │ │ ├── BP_FollowingPawn.uasset │ │ │ └── BT_FollowingBehavior.uasset │ │ ├── Blueprints │ │ │ ├── FlyingGameMode.uasset │ │ │ └── FlyingPawn.uasset │ │ ├── FlyingOverview.uasset │ │ └── Maps │ │ │ ├── FlyingExampleMap.umap │ │ │ └── FlyingExampleMap_BuiltData.uasset │ └── Geometry │ │ └── Meshes │ │ ├── 1M_Cube.uasset │ │ ├── 1M_Cube_Chamfer.uasset │ │ ├── CubeMaterial.uasset │ │ └── TemplateFloor.uasset └── FlyingQuickstart.uproject └── README.md /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. Windows] 28 | - Version [e.g. 1.0] 29 | 30 | 31 | **Additional context** 32 | Add any other context about the problem here. 33 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/.gitattributes: -------------------------------------------------------------------------------- 1 | Content/** filter=lfs diff=lfs merge=lfs -text 2 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/.gitignore: -------------------------------------------------------------------------------- 1 | # Visual Studio 2015 user specific files 2 | .vs/ 3 | 4 | .idea/ 5 | 6 | # Compiled Object files 7 | *.slo 8 | *.lo 9 | *.o 10 | *.obj 11 | 12 | # Precompiled Headers 13 | *.gch 14 | *.pch 15 | 16 | # Compiled Dynamic libraries 17 | *.so 18 | *.dylib 19 | *.dll 20 | 21 | # Fortran module files 22 | *.mod 23 | 24 | # Compiled Static libraries 25 | *.lai 26 | *.la 27 | *.a 28 | *.lib 29 | 30 | # Executables 31 | *.exe 32 | *.out 33 | *.app 34 | *.ipa 35 | 36 | # These project files can be generated by the engine 37 | *.xcodeproj 38 | *.xcworkspace 39 | *.sln 40 | *.suo 41 | *.opensdf 42 | *.sdf 43 | *.VC.db 44 | *.VC.opendb 45 | 46 | # Precompiled Assets 47 | SourceArt/**/*.png 48 | SourceArt/**/*.tga 49 | 50 | # Binary Files 51 | Binaries/* 52 | Plugins/*/Binaries/* 53 | 54 | # Builds 55 | Build/* 56 | 57 | # Whitelist PakBlacklist-.txt files 58 | !Build/*/ 59 | Build/*/** 60 | !Build/*/PakBlacklist*.txt 61 | 62 | # Don't ignore icon files in Build 63 | !Build/**/*.ico 64 | 65 | # Built data for maps 66 | *_BuiltData.uasset 67 | 68 | # Configuration files generated by the Editor 69 | Saved/* 70 | 71 | # Compiled source files for the engine to use 72 | Intermediate/* 73 | Plugins/*/Intermediate/* 74 | 75 | # Cache files for the editor to use 76 | DerivedDataCache/* 77 | 78 | Plugins/ 79 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/Config/DefaultEditor.ini: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/Config/DefaultEngine.ini: -------------------------------------------------------------------------------- 1 | [/Script/Engine.Engine] 2 | +ActiveGameNameRedirects=(OldGameName="TP_Blank",NewGameName="/Script/FlyingNavBenchmark") 3 | +ActiveGameNameRedirects=(OldGameName="/Script/TP_Blank",NewGameName="/Script/FlyingNavBenchmark") 4 | +ActiveClassRedirects=(OldClassName="TP_BlankGameModeBase",NewClassName="FlyingNavBenchmarkGameModeBase") 5 | 6 | [/Script/HardwareTargeting.HardwareTargetingSettings] 7 | TargetedHardwareClass=Desktop 8 | AppliedTargetedHardwareClass=Desktop 9 | DefaultGraphicsPerformance=Maximum 10 | AppliedDefaultGraphicsPerformance=Maximum 11 | 12 | [/Script/NavigationSystem.NavigationSystemV1] 13 | DefaultAgentName=Default 14 | CrowdManagerClass=/Script/AIModule.CrowdManager 15 | bAutoCreateNavigationData=True 16 | bSpawnNavDataInNavBoundsLevel=False 17 | bAllowClientSideNavigation=False 18 | bShouldDiscardSubLevelNavData=True 19 | bTickWhilePaused=False 20 | bInitialBuildingLocked=False 21 | bSkipAgentHeightCheckWhenPickingNavData=False 22 | DataGatheringMode=Instant 23 | bGenerateNavigationOnlyAroundNavigationInvokers=False 24 | ActiveTilesUpdateInterval=1.000000 25 | +SupportedAgents=(Name="Default",Color=(B=0,G=255,R=140,A=164),DefaultQueryExtent=(X=50.000000,Y=50.000000,Z=250.000000),NavDataClass=/Script/FlyingNavSystem.FlyingNavigationData,AgentRadius=35.000000,AgentHeight=144.000000,AgentStepHeight=-1.000000,NavWalkingSearchHeightScale=0.500000,PreferredNavData=/Script/FlyingNavSystem.FlyingNavigationData,bCanCrouch=False,bCanJump=False,bCanWalk=False,bCanSwim=False,bCanFly=True) 26 | SupportedAgentsMask=(bSupportsAgent0=True,bSupportsAgent1=True,bSupportsAgent2=True,bSupportsAgent3=True,bSupportsAgent4=True,bSupportsAgent5=True,bSupportsAgent6=True,bSupportsAgent7=True,bSupportsAgent8=True,bSupportsAgent9=True,bSupportsAgent10=True,bSupportsAgent11=True,bSupportsAgent12=True,bSupportsAgent13=True,bSupportsAgent14=True,bSupportsAgent15=True) 27 | DirtyAreasUpdateFreq=60.000000 28 | 29 | [/Script/EngineSettings.GameMapsSettings] 30 | EditorStartupMap=/Game/Benchmark.Benchmark 31 | GameDefaultMap=/Game/Benchmark.Benchmark 32 | 33 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/Config/DefaultGame.ini: -------------------------------------------------------------------------------- 1 | 2 | [/Script/EngineSettings.GeneralProjectSettings] 3 | ProjectID=EF531E1647DB01C71C25FA98E0426646 4 | Description=Benchmarks FlyingNavSystem plugin 5 | ProjectName=FlyingNavBenchmark 6 | CopyrightNotice=Copyright Ben Sutherland 2021. All rights reserved. 7 | LicensingTerms=MIT 8 | 9 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/Content/Benchmark.umap: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6193ae0ebbf3238cc6a594e59662c9a84a7b2d136ef576996540d05058756be5 3 | size 1444806 4 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/Content/BenchmarkData.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:64ca90b704890a4204a56bbc3a9f536d89c7a7d87dce59c19985ea6fade7e73c 3 | size 1651 4 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/Content/BenchmarkSettings.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d15aaf5d1c3a4a0ca9653bc942b33551de25246aaa4a7c781d22e5e302998351 3 | size 1913 4 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/Content/DragonBenchmark.umap: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:263f2c30725bd311e216fb94e2529b4bf814e992924a309cdb326523f136e4c8 3 | size 626952 4 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/Content/SM_Dragon.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:70f47a8d1fdd5d2c5cc59e20a4bf5e2d27cadd7ac86d8e0971bbac8d1d1bdee6 3 | size 26876510 4 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/Content/SM_Floor.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2ccec895fe8717bac4062df6b78e6a1a202557bc1b33df394097bf7cd3c6cfbf 3 | size 97950 4 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/FlyingNavBenchmark.uproject: -------------------------------------------------------------------------------- 1 | { 2 | "FileVersion": 3, 3 | "EngineAssociation": "4.25", 4 | "Category": "", 5 | "Description": "", 6 | "Modules": [ 7 | { 8 | "Name": "FlyingNavBenchmark", 9 | "Type": "Runtime", 10 | "LoadingPhase": "Default", 11 | "AdditionalDependencies": [ 12 | "Engine" 13 | ] 14 | } 15 | ], 16 | "Plugins": [ 17 | { 18 | "Name": "FlyingNavSystem", 19 | "Enabled": true 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /FlyingNavBenchmark/LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Ben Sutherland 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/Source/FlyingNavBenchmark.Target.cs: -------------------------------------------------------------------------------- 1 | // Copyright 1998-2019 Epic Games, Inc. All Rights Reserved. 2 | 3 | using UnrealBuildTool; 4 | using System.Collections.Generic; 5 | 6 | public class FlyingNavBenchmarkTarget : TargetRules 7 | { 8 | public FlyingNavBenchmarkTarget( TargetInfo Target) : base(Target) 9 | { 10 | Type = TargetType.Game; 11 | DefaultBuildSettings = BuildSettingsVersion.V2; 12 | ExtraModuleNames.AddRange( new string[] { "FlyingNavBenchmark" } ); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/Source/FlyingNavBenchmark/BenchmarkActor.cpp: -------------------------------------------------------------------------------- 1 | // Copyright Ben Sutherland 2021. All rights reserved. 2 | 3 | #include "BenchmarkActor.h" 4 | #include "FlyingNavigationData.h" 5 | #include "UObject/ConstructorHelpers.h" 6 | #include "EngineUtils.h" 7 | #include "Misc/FileHelper.h" 8 | #include "CSVExporter.h" 9 | #include "NavigationSystem.h" 10 | 11 | #if WITH_EDITOR 12 | #include "DrawDebugHelpers.h" 13 | #endif 14 | 15 | static_assert(PATH_BENCHMARK, "Requires the PATH_BENCHMARK to be enabled in .build.cs"); 16 | // REMEMBER TO UNCOMMENT PublicDefinitions.Add("PATH_BENCHMARK=1") in FlyingNavSystem.Build.cs 17 | 18 | // Sets default values 19 | ABenchmarkActor::ABenchmarkActor() 20 | { 21 | // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. 22 | PrimaryActorTick.bCanEverTick = false; 23 | 24 | RootComponent = CreateDefaultSubobject(TEXT("RootComponent")); 25 | 26 | bDrawBenchmarkPaths = false; 27 | bBenchmarkOnBeginPlay = false; 28 | BenchmarkResolutions = TArray({256.f, 128.f, 64.f, 32.f, 16.f, 8.f}); 29 | //Filename = FString(TEXT("Benchmark.csv")); 30 | 31 | static const ConstructorHelpers::FObjectFinder DataTable(TEXT("DataTable'/Game/BenchmarkData.BenchmarkData'")); 32 | BenchmarkDataTable = DataTable.Object; 33 | static const ConstructorHelpers::FObjectFinder SettingsTable(TEXT("DataTable'/Game/BenchmarkSettings.BenchmarkSettings'")); 34 | QuerySettings = SettingsTable.Object; 35 | } 36 | 37 | FORCEINLINE FString AsPercent(const double Proportion) 38 | { 39 | return FString::FromInt(FMath::RoundToInt(Proportion * 1e2)) + TEXT("%"); 40 | } 41 | FORCEINLINE float FormatDouble(const double Value) 42 | { 43 | return FCString::Atof(*FString::Printf(TEXT("%.2f"), Value)); 44 | } 45 | 46 | void ABenchmarkActor::Benchmark() 47 | { 48 | UpdateSVOData(); 49 | 50 | // Benchmark 51 | if (BenchmarkDataTable == nullptr || QuerySettings == nullptr || FlyingNavData == nullptr || !SVOData.IsValid() || FlyingNavData->GetSyncPathfindingGraph() == nullptr) 52 | { 53 | UE_LOG(LogTemp, Warning, TEXT("Are you sure you've set up the navigation actor correctly?")) 54 | return; 55 | } 56 | 57 | // Transform path points to world space 58 | const FVector PathStart = GetActorTransform().TransformPosition(PathStartPoint); 59 | const FVector PathEnd = GetActorTransform().TransformPosition(PathEndPoint); 60 | const FVector RayStart = GetActorTransform().TransformPosition(RaycastStartPoint); 61 | const FVector RayEnd = GetActorTransform().TransformPosition(RaycastEndPoint); 62 | 63 | FSVOPathfindingGraph* const PathfindingGraph = FlyingNavData->GetSyncPathfindingGraph(); 64 | 65 | // Load settings from csv file 66 | if (FPaths::FileExists(AbsoluteSettingsPath)) 67 | { 68 | QuerySettings->EmptyTable(); 69 | FString CSVSettings; 70 | FFileHelper::LoadFileToString(CSVSettings, *AbsoluteSettingsPath); 71 | QuerySettings->CreateTableFromCSVString(CSVSettings); 72 | } 73 | 74 | // Run Benchmark for each row 75 | FString AllBenchmarks; 76 | QuerySettings->ForeachRow(nullptr, [&](const FName& Key, const FBenchmarkSettingsTableRow& SettingsRow) 77 | { 78 | BenchmarkDataTable->EmptyTable(); 79 | 80 | const float OldResolution = FlyingNavData->MaxDetailSize; 81 | 82 | for (int i = 0; i < BenchmarkResolutions.Num(); i++) 83 | { 84 | FlyingNavData->MaxDetailSize = BenchmarkResolutions[i]; 85 | const int32 NumLayers = FlyingNavSystem::GetNumLayers(FlyingNavData->GetOctreeSideLength(), BenchmarkResolutions[i], 0); 86 | const int32 NumVoxels = FMath::Pow(8, NumLayers); 87 | 88 | double StartTime = FPlatformTime::Seconds(); 89 | FlyingNavData->SyncBuild(); 90 | double EndTime = FPlatformTime::Seconds(); 91 | const double GenerationTime = EndTime - StartTime; 92 | SVOData = FlyingNavData->GetSVOData().AsShared(); 93 | 94 | // Benchmark pathfinding 95 | double PathfindingTimes[3]; // Time in seconds 96 | int64 PathfindingIterations[3]; 97 | double PathfindingDistance[3]; // Percentage of ideal path distance (>100%) 98 | for (int j = 0; j < 3; j++) 99 | { 100 | if (PathfindingAlgorithms & (1 << j)) 101 | { 102 | const FSVOQuerySettings IdealSettings( 103 | *SVOData, 104 | EPathfindingAlgorithm::ThetaStar, 105 | false, 106 | 1.0f, 107 | false, 108 | false); 109 | 110 | // Benchmark against perfect path 111 | TArray IdealPathPoints; 112 | PathfindingGraph->FindPath(PathStart, PathEnd, IdealSettings, IdealPathPoints); 113 | 114 | const uint32 PathPointsCount = IdealPathPoints.Num(); 115 | double IdealPathDistance = 0.f; 116 | if (PathPointsCount > 0) 117 | { 118 | FVector SegmentStart = IdealPathPoints[0].Location; 119 | 120 | for (uint32 PathIndex = 1; PathIndex < PathPointsCount; ++PathIndex) 121 | { 122 | const FVector SegmentEnd = IdealPathPoints[PathIndex].Location; 123 | IdealPathDistance += FVector::Dist(SegmentStart, SegmentEnd); 124 | SegmentStart = SegmentEnd; 125 | } 126 | } 127 | 128 | // Do actual benchmark 129 | const FSVOQuerySettings Settings( 130 | *SVOData, 131 | static_cast(j), 132 | false, 133 | SettingsRow.HeuristicScale, 134 | SettingsRow.bUseUnitCost, 135 | SettingsRow.bUseNodeCompensation); 136 | 137 | Settings.NumIterations = 0; 138 | FNavPathSharedPtr NavPath = MakeShareable(new FFlyingNavigationPath()); 139 | NavPath->SetNavigationDataUsed(FlyingNavData); 140 | 141 | const int32 PathfindingTrials = 5; 142 | 143 | StartTime = FPlatformTime::Seconds(); 144 | for (int k = 0; k < PathfindingTrials; k++) 145 | { 146 | PathfindingGraph->FindPath(PathStart, PathEnd, Settings, NavPath->GetPathPoints()); 147 | } 148 | EndTime = FPlatformTime::Seconds(); 149 | PathfindingTimes[j] = (EndTime - StartTime) / static_cast(PathfindingTrials); 150 | 151 | PathfindingIterations[j] = Settings.NumIterations / PathfindingTrials; 152 | PathfindingDistance[j] = static_cast(NavPath->GetLength()) / IdealPathDistance; 153 | 154 | // Draw path 155 | if (bDrawBenchmarkPaths) 156 | { 157 | // Translate by NavigationDebugDrawing::PathOffset 158 | for (FNavPathPoint& PathPoint : NavPath->GetPathPoints()) 159 | { 160 | PathPoint.Location.Z -= NavigationDebugDrawing::PathOffset.Z; 161 | } 162 | FlyingNavData->DrawDebugPath(NavPath.Get(), FColor::MakeRedToGreenColorFromScalar(j / 2.f)); 163 | } 164 | } 165 | else 166 | { 167 | PathfindingTimes[j] = 0.; 168 | PathfindingIterations[j] = 0; 169 | PathfindingDistance[j] = 0.; 170 | } 171 | } 172 | 173 | // Raycast benchmark 174 | double OctreeRaycastTime = 0., LineTraceTime = 0.; 175 | if (bBenchmarkRaycasts) 176 | { 177 | const int32 NumRaycastTrials = 200; 178 | 179 | FVector HitLocation; 180 | bool Hit; 181 | StartTime = FPlatformTime::Seconds(); 182 | for (int32 k = 0; k < NumRaycastTrials; k++) // Multiple trials 183 | { 184 | Hit = FlyingNavData->OctreeRaycast(RayStart, RayEnd, HitLocation); 185 | } 186 | EndTime = FPlatformTime::Seconds(); 187 | OctreeRaycastTime = (EndTime - StartTime) / static_cast(NumRaycastTrials); 188 | //UE_LOG(LogTemp, Warning, TEXT("Octree Hit: %d"), Hit); 189 | 190 | FHitResult HitResult; 191 | StartTime = FPlatformTime::Seconds(); 192 | for (int32 k = 0; k < NumRaycastTrials; k++) // Multiple trials 193 | { 194 | Hit = GetWorld()->LineTraceSingleByChannel(HitResult, RayStart, RayEnd, ECC_WorldStatic); 195 | } 196 | EndTime = FPlatformTime::Seconds(); 197 | LineTraceTime = (EndTime - StartTime) / static_cast(NumRaycastTrials); 198 | //UE_LOG(LogTemp, Warning, TEXT("LineTrace Hit: %d"), Hit); 199 | } 200 | 201 | FBenchmarkTableRow TableRow; 202 | const FName RowName(*FString::Printf(TEXT("%d"), NumLayers)); 203 | TableRow.NumLayers = NumLayers; 204 | TableRow.NumVoxels = NumVoxels; 205 | TableRow.GenerationTimeMs = FormatDouble(GenerationTime * 1e3); 206 | 207 | TableRow.AStarTimeMs = FormatDouble(PathfindingTimes[0] * 1e3); 208 | TableRow.AStarIterations = PathfindingIterations[0]; 209 | TableRow.AStarDistance = AsPercent(PathfindingDistance[0]); 210 | 211 | TableRow.LazyThetaStarTimeMs = FormatDouble(PathfindingTimes[1] * 1e3); 212 | TableRow.LazyThetaStarIterations = PathfindingIterations[1]; 213 | TableRow.LazyThetaStarDistance = AsPercent(PathfindingDistance[1]); 214 | 215 | TableRow.ThetaStarTimeMs = FormatDouble(PathfindingTimes[2] * 1e3); 216 | TableRow.ThetaStarIterations = PathfindingIterations[2]; 217 | TableRow.ThetaStarDistance = AsPercent(PathfindingDistance[2]); 218 | 219 | TableRow.OctreeRaycastTimeMicroS = FormatDouble(OctreeRaycastTime * 1e6); 220 | TableRow.PhysicsLineTraceTimeMicroS = FormatDouble(LineTraceTime * 1e6); 221 | 222 | BenchmarkDataTable->AddRow(RowName, TableRow); 223 | 224 | UE_LOG(LogTemp, Warning, TEXT("Added row to benchmark table: %f"), BenchmarkResolutions[i]) 225 | } 226 | 227 | FlyingNavData->MaxDetailSize = OldResolution; 228 | 229 | FString CSVString; 230 | if (!FCSVExporter(CSVString).WriteTable(*BenchmarkDataTable)) 231 | { 232 | CSVString = TEXT("Missing RowStruct!\n"); 233 | } 234 | 235 | // Add header and trailing blank lines 236 | const FString BenchmarkString = FString::Printf(TEXT("\"%s\"\n%s,,,,,,,,,,,,,,,\n,,,,,,,,,,,,,,\n"), *SettingsRow.ToString(), *CSVString); 237 | AllBenchmarks += BenchmarkString; 238 | }); 239 | const FString FilePath = FPaths::Combine(OutputPath.Path, Filename); 240 | FFileHelper::SaveStringToFile(AllBenchmarks, *FilePath); 241 | 242 | //FBenchmarkSettingsTableRow* SettingsRow = QuerySettings->FindRow(TEXT("Settings"), nullptr, false); 243 | //checkf(SettingsRow != nullptr, TEXT("Path: %s, Loaded String: %s"), *AbsolutePath, *CSVSettings) 244 | } 245 | 246 | #if WITH_EDITOR 247 | void ABenchmarkActor::ClearViewport() const 248 | { 249 | FlushPersistentDebugLines(GetWorld()); 250 | } 251 | 252 | void ABenchmarkActor::SetAbsoluteSettingsPath() 253 | { 254 | AbsoluteSettingsPath = FPaths::ConvertRelativePathToFull(SettingsPath.FilePath); 255 | } 256 | #endif // WITH_EDITOR 257 | 258 | void ABenchmarkActor::BeginPlay() 259 | { 260 | Super::BeginPlay(); 261 | 262 | if (bBenchmarkOnBeginPlay) 263 | { 264 | Benchmark(); 265 | } 266 | } 267 | 268 | 269 | void ABenchmarkActor::UpdateSVOData() 270 | { 271 | // Only one actor of this type in the world 272 | const TActorIterator It(GetWorld()); 273 | if (It) 274 | { 275 | FlyingNavData = *It; 276 | // If it crashes here, uncomment PublicDefinitions.Add("PATH_BENCHMARK=1"); in FlyingNavSystem.Build.cs 277 | SVOData = FlyingNavData->GetSVOData().AsShared(); 278 | } 279 | else 280 | { 281 | UE_LOG(LogTemp, Warning, TEXT("No AFlyingNavigationData actor in world!")) 282 | } 283 | } 284 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/Source/FlyingNavBenchmark/BenchmarkActor.h: -------------------------------------------------------------------------------- 1 | // Copyright Ben Sutherland 2021. All rights reserved. 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "GameFramework/Actor.h" 7 | #include "FlyingNavSystemTypes.h" 8 | #include "FlyingObjectInterface.h" 9 | #include "Engine/DataTable.h" 10 | #include "BenchmarkActor.generated.h" 11 | 12 | USTRUCT(BlueprintType) 13 | struct FBenchmarkTableRow : public FTableRowBase 14 | { 15 | GENERATED_BODY() 16 | 17 | UPROPERTY(BlueprintReadOnly, Category = "Benchmark") 18 | int32 NumLayers; 19 | UPROPERTY(BlueprintReadOnly, Category = "Benchmark") 20 | int32 NumVoxels; 21 | 22 | UPROPERTY(BlueprintReadOnly, Category = "Benchmark", meta=(DisplayName = "Generation Time (ms)")) 23 | float GenerationTimeMs; 24 | 25 | UPROPERTY(BlueprintReadOnly, Category = "Benchmark") 26 | float AStarTimeMs; 27 | UPROPERTY(BlueprintReadOnly, Category = "Benchmark") 28 | int64 AStarIterations; 29 | UPROPERTY(BlueprintReadOnly, Category = "Benchmark") 30 | FString AStarDistance; 31 | 32 | UPROPERTY(BlueprintReadOnly, Category = "Benchmark") 33 | float LazyThetaStarTimeMs; 34 | UPROPERTY(BlueprintReadOnly, Category = "Benchmark") 35 | int64 LazyThetaStarIterations; 36 | UPROPERTY(BlueprintReadOnly, Category = "Benchmark") 37 | FString LazyThetaStarDistance; 38 | 39 | UPROPERTY(BlueprintReadOnly, Category = "Benchmark") 40 | float ThetaStarTimeMs; 41 | UPROPERTY(BlueprintReadOnly, Category = "Benchmark") 42 | int64 ThetaStarIterations; 43 | UPROPERTY(BlueprintReadOnly, Category = "Benchmark") 44 | FString ThetaStarDistance; 45 | 46 | UPROPERTY(BlueprintReadOnly, Category = "Benchmark") 47 | float OctreeRaycastTimeMicroS; 48 | UPROPERTY(BlueprintReadOnly, Category = "Benchmark") 49 | float PhysicsLineTraceTimeMicroS; 50 | }; 51 | 52 | USTRUCT(BlueprintType) 53 | struct FBenchmarkSettingsTableRow : public FTableRowBase 54 | { 55 | GENERATED_BODY() 56 | 57 | // How much to scale the A* heuristic by. High values can speed up pathfinding, at the cost of accuracy. 58 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Pathfinding) 59 | float HeuristicScale = 1.f; 60 | 61 | // Makes all nodes, regardless of size, the same cost. Speeds up pathfinding at the cost of accuracy (AI prefers open spaces). 62 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Pathfinding) 63 | bool bUseUnitCost = false; 64 | 65 | // Compensates node size even more, by multiplying node cost by 1 for a leaf node, and 0.2f for the root node. 66 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Pathfinding) 67 | bool bUseNodeCompensation = false; 68 | 69 | FString ToString() const 70 | { 71 | return FString::Printf(TEXT("(Query: HeuristicScale = %.1f, bUseUnitCost = %s, bUseNodeCompensation = %s)"), 72 | HeuristicScale, 73 | bUseUnitCost ? TEXT("true") : TEXT("false"), 74 | bUseNodeCompensation ? TEXT("true") : TEXT("false")); 75 | } 76 | FString Filename() const 77 | { 78 | return FString::Printf(TEXT("(HS %.1f UC %s NC %s).csv"), 79 | HeuristicScale, 80 | bUseUnitCost ? TEXT("true") : TEXT("false"), 81 | bUseNodeCompensation ? TEXT("true") : TEXT("false")); 82 | } 83 | }; 84 | 85 | UENUM(BlueprintType, meta=(Bitflags, UseEnumValuesAsMaskValuesInEditor=true)) 86 | enum class EBenchmarkAlgorithm: uint8 87 | { 88 | None = 0 UMETA(Hidden), 89 | AStar = 1 << 0 UMETA(DisplayName = "A *"), 90 | LazyThetaStar = 1 << 1 UMETA(DisplayName = "Lazy Theta *"), 91 | ThetaStar = 1 << 2 UMETA(DisplayName = "Theta *") 92 | }; 93 | ENUM_CLASS_FLAGS(EBenchmarkAlgorithm) 94 | 95 | UCLASS() 96 | class FLYINGNAVBENCHMARK_API ABenchmarkActor : public AActor 97 | { 98 | GENERATED_BODY() 99 | 100 | public: 101 | // Sets default values for this actor's properties 102 | ABenchmarkActor(); 103 | 104 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Benchmark, meta=(MakeEditWidget = true)) 105 | FVector PathStartPoint; 106 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Benchmark, meta=(MakeEditWidget = true)) 107 | FVector PathEndPoint; 108 | 109 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Benchmark, meta=(MakeEditWidget = true)) 110 | FVector RaycastStartPoint; 111 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Benchmark, meta=(MakeEditWidget = true)) 112 | FVector RaycastEndPoint; 113 | 114 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Benchmark) 115 | bool bDrawBenchmarkPaths; 116 | 117 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Benchmark) 118 | bool bBenchmarkOnBeginPlay; 119 | 120 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Benchmark) 121 | bool bBenchmarkRaycasts; 122 | 123 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Benchmark) 124 | TArray BenchmarkResolutions; 125 | 126 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Benchmark, meta=(Bitmask, BitmaskEnum = "EBenchmarkAlgorithm")) 127 | int32 PathfindingAlgorithms; 128 | 129 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Benchmark) 130 | UDataTable* BenchmarkDataTable; 131 | 132 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Benchmark) 133 | UDataTable* QuerySettings; 134 | 135 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Benchmark, meta=(FilePathFilter="csv")) 136 | FFilePath SettingsPath; 137 | 138 | UPROPERTY(VisibleAnywhere, Category = Benchmark) 139 | FString AbsoluteSettingsPath; 140 | 141 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Benchmark) 142 | FDirectoryPath OutputPath; 143 | 144 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Benchmark) 145 | FString Filename; 146 | 147 | UFUNCTION(CallInEditor, Category = Benchmark) 148 | void Benchmark(); 149 | 150 | #if WITH_EDITOR 151 | UFUNCTION(CallInEditor, Category = Benchmark) 152 | void ClearViewport() const; 153 | 154 | UFUNCTION(CallInEditor, Category = Benchmark) 155 | void SetAbsoluteSettingsPath(); 156 | #endif // WITH_EDITOR 157 | 158 | virtual void BeginPlay() override; 159 | 160 | void UpdateSVOData(); 161 | 162 | protected: 163 | UPROPERTY() 164 | class AFlyingNavigationData* FlyingNavData; 165 | FSVODataConstPtr SVOData; 166 | }; 167 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/Source/FlyingNavBenchmark/CSVExporter.cpp: -------------------------------------------------------------------------------- 1 | // Copyright Ben Sutherland 2021. All rights reserved. 2 | 3 | #include "CSVExporter.h" 4 | #include "Engine/DataTable.h" 5 | 6 | // Copied from: Runtime/Engine/Private/DataTableCSV.cpp for use in shipping builds 7 | 8 | FCSVExporter::FCSVExporter(FString& OutExportText): ExportedText(OutExportText) 9 | {} 10 | 11 | bool FCSVExporter::WriteTable(const UDataTable& InDataTable) 12 | { 13 | if (!InDataTable.RowStruct) 14 | { 15 | return false; 16 | } 17 | 18 | // Write the header (column titles) 19 | FString ImportKeyField; 20 | if (!InDataTable.ImportKeyField.IsEmpty()) 21 | { 22 | // Write actual name if we have it 23 | ImportKeyField = InDataTable.ImportKeyField; 24 | ExportedText += ImportKeyField; 25 | } 26 | else 27 | { 28 | ExportedText += TEXT("---"); 29 | } 30 | 31 | FProperty* SkipProperty = nullptr; 32 | for (TFieldIterator It(InDataTable.RowStruct); It; ++It) 33 | { 34 | FProperty* BaseProp = *It; 35 | check(BaseProp); 36 | 37 | FString ColumnHeader = DataTableUtils::GetPropertyExportName(BaseProp); 38 | 39 | if (ColumnHeader == ImportKeyField) 40 | { 41 | // Don't write header again if this is the name field, and save for skipping later 42 | SkipProperty = BaseProp; 43 | continue; 44 | } 45 | 46 | ExportedText += TEXT(","); 47 | ExportedText += ColumnHeader; 48 | } 49 | ExportedText += TEXT("\n"); 50 | 51 | // Write each row 52 | for (auto RowIt = InDataTable.GetRowMap().CreateConstIterator(); RowIt; ++RowIt) 53 | { 54 | FName RowName = RowIt.Key(); 55 | ExportedText += RowName.ToString(); 56 | 57 | uint8* RowData = RowIt.Value(); 58 | WriteRow(InDataTable.RowStruct, RowData); 59 | 60 | ExportedText += TEXT("\n"); 61 | } 62 | 63 | return true; 64 | } 65 | 66 | bool FCSVExporter::WriteRow(const UScriptStruct* InRowStruct, const void* InRowData, const FProperty* SkipProperty) 67 | { 68 | if (!InRowStruct) 69 | { 70 | return false; 71 | } 72 | 73 | for (TFieldIterator It(InRowStruct); It; ++It) 74 | { 75 | FProperty* BaseProp = *It; 76 | check(BaseProp); 77 | 78 | if (BaseProp == SkipProperty) 79 | { 80 | continue; 81 | } 82 | 83 | const void* Data = BaseProp->ContainerPtrToValuePtr(InRowData, 0); 84 | WriteStructEntry(InRowData, BaseProp, Data); 85 | } 86 | 87 | return true; 88 | } 89 | 90 | bool FCSVExporter::WriteStructEntry(const void* InRowData, FProperty* InProperty, const void* InPropertyData) 91 | { 92 | ExportedText += TEXT(","); 93 | 94 | const FString PropertyValue = DataTableUtils::GetPropertyValueAsString(InProperty, (uint8*)InRowData, EDataTableExportFlags::None); 95 | ExportedText += TEXT("\""); 96 | ExportedText += PropertyValue.Replace(TEXT("\""), TEXT("\"\"")); 97 | ExportedText += TEXT("\""); 98 | 99 | return true; 100 | } -------------------------------------------------------------------------------- /FlyingNavBenchmark/Source/FlyingNavBenchmark/CSVExporter.h: -------------------------------------------------------------------------------- 1 | // Copyright Ben Sutherland 2021. All rights reserved. 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | 7 | // Copied from: Runtime/Engine/Private/DataTableCSV.h for use in shipping builds 8 | 9 | class UDataTable; 10 | 11 | class FCSVExporter 12 | { 13 | public: 14 | FCSVExporter(FString& OutExportText); 15 | 16 | bool WriteTable(const UDataTable& InDataTable); 17 | 18 | bool WriteRow(const UScriptStruct* InRowStruct, const void* InRowData, const FProperty* SkipProperty = nullptr); 19 | 20 | private: 21 | bool WriteStructEntry(const void* InRowData, FProperty* InProperty, const void* InPropertyData); 22 | 23 | FString& ExportedText; 24 | }; -------------------------------------------------------------------------------- /FlyingNavBenchmark/Source/FlyingNavBenchmark/FlyingNavBenchmark.Build.cs: -------------------------------------------------------------------------------- 1 | // Copyright 1998-2019 Epic Games, Inc. All Rights Reserved. 2 | 3 | using UnrealBuildTool; 4 | 5 | public class FlyingNavBenchmark : ModuleRules 6 | { 7 | public FlyingNavBenchmark(ReadOnlyTargetRules Target) : base(Target) 8 | { 9 | PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; 10 | PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "NavigationSystem", "FlyingNavSystem" }); 11 | 12 | // Uncomment this line from FlyingNavSystem.Build.cs for this project to compile 13 | PublicDefinitions.Add("PATH_BENCHMARK=1"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/Source/FlyingNavBenchmark/FlyingNavBenchmark.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 1998-2019 Epic Games, Inc. All Rights Reserved. 2 | 3 | #include "FlyingNavBenchmark.h" 4 | #include "Modules/ModuleManager.h" 5 | 6 | IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, FlyingNavBenchmark, "FlyingNavBenchmark" ); 7 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/Source/FlyingNavBenchmark/FlyingNavBenchmark.h: -------------------------------------------------------------------------------- 1 | // Copyright 1998-2019 Epic Games, Inc. All Rights Reserved. 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | 7 | -------------------------------------------------------------------------------- /FlyingNavBenchmark/Source/FlyingNavBenchmarkEditor.Target.cs: -------------------------------------------------------------------------------- 1 | // Copyright 1998-2019 Epic Games, Inc. All Rights Reserved. 2 | 3 | using UnrealBuildTool; 4 | using System.Collections.Generic; 5 | 6 | public class FlyingNavBenchmarkEditorTarget : TargetRules 7 | { 8 | public FlyingNavBenchmarkEditorTarget( TargetInfo Target) : base(Target) 9 | { 10 | Type = TargetType.Editor; 11 | DefaultBuildSettings = BuildSettingsVersion.V2; 12 | ExtraModuleNames.AddRange( new string[] { "FlyingNavBenchmark" } ); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /FlyingQuickstart/Config/DefaultEditor.ini: -------------------------------------------------------------------------------- 1 | [UnrealEd.SimpleMap] 2 | SimpleMapName=/Game/FlyingQuickstart/Maps/FlyingExampleMap 3 | 4 | [EditoronlyBP] 5 | bAllowClassAndBlueprintPinMatching=true 6 | bReplaceBlueprintWithClass= true 7 | bDontLoadBlueprintOutsideEditor= true 8 | bBlueprintIsNotBlueprintType= true 9 | 10 | 11 | -------------------------------------------------------------------------------- /FlyingQuickstart/Config/DefaultEditorPerProjectUserSettings.ini: -------------------------------------------------------------------------------- 1 | [ContentBrowser] 2 | ContentBrowserTab1.SelectedPaths=/Game/FlyingBP -------------------------------------------------------------------------------- /FlyingQuickstart/Config/DefaultEngine.ini: -------------------------------------------------------------------------------- 1 | [URL] 2 | GameName=FlyingQuickstart 3 | 4 | [/Script/EngineSettings.GameMapsSettings] 5 | EditorStartupMap=/Game/FlyingBP/Maps/FlyingExampleMap 6 | GameDefaultMap=/Game/FlyingBP/Maps/FlyingExampleMap 7 | TransitionMap= 8 | bUseSplitscreen=True 9 | TwoPlayerSplitscreenLayout=Horizontal 10 | ThreePlayerSplitscreenLayout=FavorTop 11 | GlobalDefaultGameMode=/Script/Engine.GameMode 12 | GlobalDefaultGameMode=/Game/FlyingBP/Blueprints/FlyingGameMode.FlyingGameMode_C 13 | GlobalDefaultServerGameMode=None 14 | 15 | [/Script/IOSRuntimeSettings.IOSRuntimeSettings] 16 | MinimumiOSVersion=IOS_11 17 | 18 | 19 | [/Script/Engine.Engine] 20 | +ActiveGameNameRedirects=(OldGameName="TP_FlyingBP",NewGameName="/Script/FlyingQuickstart") 21 | +ActiveGameNameRedirects=(OldGameName="/Script/TP_FlyingBP",NewGameName="/Script/FlyingQuickstart") 22 | 23 | [/Script/HardwareTargeting.HardwareTargetingSettings] 24 | TargetedHardwareClass=Desktop 25 | AppliedTargetedHardwareClass=Desktop 26 | DefaultGraphicsPerformance=Maximum 27 | AppliedDefaultGraphicsPerformance=Maximum 28 | 29 | [/Script/NavigationSystem.NavigationSystemV1] 30 | DefaultAgentName=None 31 | CrowdManagerClass=/Script/AIModule.CrowdManager 32 | bAutoCreateNavigationData=True 33 | bSpawnNavDataInNavBoundsLevel=False 34 | bAllowClientSideNavigation=False 35 | bShouldDiscardSubLevelNavData=True 36 | bTickWhilePaused=False 37 | bInitialBuildingLocked=False 38 | bSkipAgentHeightCheckWhenPickingNavData=False 39 | DataGatheringMode=Instant 40 | bGenerateNavigationOnlyAroundNavigationInvokers=False 41 | ActiveTilesUpdateInterval=1.000000 42 | +SupportedAgents=(Name="FlyingAgent",Color=(B=0,G=0,R=255,A=255),DefaultQueryExtent=(X=50.000000,Y=50.000000,Z=250.000000),NavDataClass=/Script/FlyingNavSystem.FlyingNavigationData,AgentRadius=100.000000,AgentHeight=144.000000,AgentStepHeight=-1.000000,NavWalkingSearchHeightScale=0.500000,PreferredNavData=/Script/FlyingNavSystem.FlyingNavigationData,bCanCrouch=False,bCanJump=False,bCanWalk=False,bCanSwim=False,bCanFly=False) 43 | +SupportedAgents=(Name="RecastAgent",Color=(B=0,G=255,R=140,A=164),DefaultQueryExtent=(X=50.000000,Y=50.000000,Z=250.000000),NavDataClass=/Script/NavigationSystem.RecastNavMesh,AgentRadius=35.000000,AgentHeight=144.000000,AgentStepHeight=-1.000000,NavWalkingSearchHeightScale=0.500000,PreferredNavData=/Script/NavigationSystem.RecastNavMesh,bCanCrouch=False,bCanJump=False,bCanWalk=False,bCanSwim=False,bCanFly=False) 44 | SupportedAgentsMask=(bSupportsAgent0=True,bSupportsAgent1=True,bSupportsAgent2=True,bSupportsAgent3=True,bSupportsAgent4=True,bSupportsAgent5=True,bSupportsAgent6=True,bSupportsAgent7=True,bSupportsAgent8=True,bSupportsAgent9=True,bSupportsAgent10=True,bSupportsAgent11=True,bSupportsAgent12=True,bSupportsAgent13=True,bSupportsAgent14=True,bSupportsAgent15=True) 45 | DirtyAreasUpdateFreq=60.000000 46 | 47 | 48 | -------------------------------------------------------------------------------- /FlyingQuickstart/Config/DefaultGame.ini: -------------------------------------------------------------------------------- 1 | [ProjectSettings] 2 | GameID=52CAC4B899E84C718B788F32C0C8C90F 3 | ProjectName=Flying BP Game Template 4 | 5 | [/Script/EngineSettings.GeneralProjectSettings] 6 | ProjectID=9A4A23B4466B4B2856306099E0AB3914 7 | -------------------------------------------------------------------------------- /FlyingQuickstart/Config/DefaultInput.ini: -------------------------------------------------------------------------------- 1 | 2 | [/Script/Engine.InputSettings] 3 | -AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) 4 | -AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) 5 | -AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) 6 | -AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) 7 | -AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) 8 | -AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) 9 | +AxisConfig=(AxisKeyName="MagicLeap_Right_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 10 | +AxisConfig=(AxisKeyName="MagicLeap_Right_Touch1_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 11 | +AxisConfig=(AxisKeyName="MagicLeap_Right_Touch1_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 12 | +AxisConfig=(AxisKeyName="MagicLeap_Right_Touch1_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 13 | +AxisConfig=(AxisKeyName="OculusTouchpad_Touchpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 14 | +AxisConfig=(AxisKeyName="OculusTouchpad_Touchpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 15 | +AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 16 | +AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 17 | +AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 18 | +AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 19 | +AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) 20 | +AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) 21 | +AxisConfig=(AxisKeyName="MouseWheelAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 22 | +AxisConfig=(AxisKeyName="Gamepad_LeftTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 23 | +AxisConfig=(AxisKeyName="Gamepad_RightTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 24 | +AxisConfig=(AxisKeyName="MotionController_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 25 | +AxisConfig=(AxisKeyName="MotionController_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 26 | +AxisConfig=(AxisKeyName="MotionController_Left_TriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 27 | +AxisConfig=(AxisKeyName="MotionController_Left_Grip1Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 28 | +AxisConfig=(AxisKeyName="MotionController_Left_Grip2Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 29 | +AxisConfig=(AxisKeyName="MotionController_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 30 | +AxisConfig=(AxisKeyName="MotionController_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 31 | +AxisConfig=(AxisKeyName="MotionController_Right_TriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 32 | +AxisConfig=(AxisKeyName="MotionController_Right_Grip1Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 33 | +AxisConfig=(AxisKeyName="MotionController_Right_Grip2Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 34 | +AxisConfig=(AxisKeyName="Gamepad_Special_Left_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 35 | +AxisConfig=(AxisKeyName="Gamepad_Special_Left_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 36 | +AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 37 | +AxisConfig=(AxisKeyName="OculusTouch_Left_FaceButton1",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 38 | +AxisConfig=(AxisKeyName="OculusTouch_Left_Trigger",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 39 | +AxisConfig=(AxisKeyName="OculusTouch_Left_FaceButton2",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 40 | +AxisConfig=(AxisKeyName="OculusTouch_Left_IndexPointing",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 41 | +AxisConfig=(AxisKeyName="OculusTouch_Left_ThumbUp",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 42 | +AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 43 | +AxisConfig=(AxisKeyName="OculusTouch_Right_FaceButton1",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 44 | +AxisConfig=(AxisKeyName="OculusTouch_Right_Trigger",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 45 | +AxisConfig=(AxisKeyName="OculusTouch_Right_FaceButton2",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 46 | +AxisConfig=(AxisKeyName="OculusTouch_Right_IndexPointing",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 47 | +AxisConfig=(AxisKeyName="OculusTouch_Right_ThumbUp",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 48 | +AxisConfig=(AxisKeyName="Daydream_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 49 | +AxisConfig=(AxisKeyName="Daydream_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 50 | +AxisConfig=(AxisKeyName="Daydream_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 51 | +AxisConfig=(AxisKeyName="Daydream_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 52 | +AxisConfig=(AxisKeyName="Vive_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 53 | +AxisConfig=(AxisKeyName="Vive_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 54 | +AxisConfig=(AxisKeyName="Vive_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 55 | +AxisConfig=(AxisKeyName="Vive_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 56 | +AxisConfig=(AxisKeyName="Vive_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 57 | +AxisConfig=(AxisKeyName="Vive_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 58 | +AxisConfig=(AxisKeyName="MixedReality_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 59 | +AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 60 | +AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 61 | +AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 62 | +AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 63 | +AxisConfig=(AxisKeyName="MixedReality_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 64 | +AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 65 | +AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 66 | +AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 67 | +AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 68 | +AxisConfig=(AxisKeyName="OculusGo_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 69 | +AxisConfig=(AxisKeyName="OculusGo_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 70 | +AxisConfig=(AxisKeyName="OculusGo_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 71 | +AxisConfig=(AxisKeyName="OculusGo_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 72 | +AxisConfig=(AxisKeyName="OculusTouch_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 73 | +AxisConfig=(AxisKeyName="OculusTouch_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 74 | +AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 75 | +AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 76 | +AxisConfig=(AxisKeyName="OculusTouch_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 77 | +AxisConfig=(AxisKeyName="OculusTouch_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 78 | +AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 79 | +AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 80 | +AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 81 | +AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 82 | +AxisConfig=(AxisKeyName="ValveIndex_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 83 | +AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 84 | +AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 85 | +AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 86 | +AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 87 | +AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 88 | +AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Touch",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 89 | +AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 90 | +AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 91 | +AxisConfig=(AxisKeyName="ValveIndex_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 92 | +AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 93 | +AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 94 | +AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 95 | +AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 96 | +AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 97 | +AxisConfig=(AxisKeyName="MotionController_Left_Thumbstick_Z",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 98 | +AxisConfig=(AxisKeyName="MagicLeap_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 99 | +AxisConfig=(AxisKeyName="MagicLeap_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 100 | +AxisConfig=(AxisKeyName="MagicLeap_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 101 | +AxisConfig=(AxisKeyName="MagicLeap_Left_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 102 | +AxisConfig=(AxisKeyName="MagicLeap_Left_Touch1_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 103 | +AxisConfig=(AxisKeyName="MagicLeap_Left_Touch1_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 104 | +AxisConfig=(AxisKeyName="MagicLeap_Left_Touch1_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 105 | +AxisConfig=(AxisKeyName="MotionController_Right_Thumbstick_Z",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 106 | +AxisConfig=(AxisKeyName="MagicLeap_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 107 | +AxisConfig=(AxisKeyName="MagicLeap_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 108 | +AxisConfig=(AxisKeyName="MagicLeap_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 109 | bAltEnterTogglesFullscreen=True 110 | bF11TogglesFullscreen=True 111 | bUseMouseForTouch=False 112 | bEnableMouseSmoothing=True 113 | bEnableFOVScaling=True 114 | bCaptureMouseOnLaunch=True 115 | bAlwaysShowTouchInterface=False 116 | bShowConsoleOnFourFingerTap=True 117 | bEnableGestureRecognizer=False 118 | bUseAutocorrect=False 119 | DefaultViewportMouseCaptureMode=CapturePermanently_IncludingInitialMouseDown 120 | DefaultViewportMouseLockMode=LockOnCapture 121 | FOVScale=0.011110 122 | DoubleClickTime=0.200000 123 | +AxisMappings=(AxisName="MoveUp",Scale=1.000000,Key=W) 124 | +AxisMappings=(AxisName="MoveUp",Scale=-1.000000,Key=S) 125 | +AxisMappings=(AxisName="MoveUp",Scale=1.000000,Key=Gamepad_LeftStick_Up) 126 | +AxisMappings=(AxisName="MoveUp",Scale=-1.000000,Key=Gamepad_LeftStick_Down) 127 | +AxisMappings=(AxisName="MoveUp",Scale=1.000000,Key=Up) 128 | +AxisMappings=(AxisName="MoveUp",Scale=-1.000000,Key=Down) 129 | +AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=D) 130 | +AxisMappings=(AxisName="MoveRight",Scale=-1.000000,Key=A) 131 | +AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=Gamepad_LeftStick_Right) 132 | +AxisMappings=(AxisName="MoveRight",Scale=-1.000000,Key=Gamepad_LeftStick_Left) 133 | +AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=Right) 134 | +AxisMappings=(AxisName="MoveRight",Scale=-1.000000,Key=Left) 135 | +AxisMappings=(AxisName="Thrust",Scale=1.000000,Key=LeftShift) 136 | +AxisMappings=(AxisName="Thrust",Scale=1.000000,Key=RightShift) 137 | +AxisMappings=(AxisName="Thrust",Scale=-1.000000,Key=LeftControl) 138 | +AxisMappings=(AxisName="Thrust",Scale=-1.000000,Key=RightControl) 139 | +AxisMappings=(AxisName="MoveUp",Scale=1.000000,Key=Gamepad_LeftY) 140 | +AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=Gamepad_LeftX) 141 | +AxisMappings=(AxisName="Thrust",Scale=1.000000,Key=SpaceBar) 142 | +AxisMappings=(AxisName="Thrust",Scale=-1.000000,Key=Gamepad_RightStick_Up) 143 | +AxisMappings=(AxisName="Thrust",Scale=1.000000,Key=Gamepad_RightStick_Down) 144 | +AxisMappings=(AxisName="Thrust",Scale=1.000000,Key=Gamepad_RightY) 145 | +AxisMappings=(AxisName="Thrust",Scale=1.000000,Key=Vive_Left_Trigger_Axis) 146 | +AxisMappings=(AxisName="Thrust",Scale=-1.000000,Key=Vive_Right_Trigger_Axis) 147 | +AxisMappings=(AxisName="Thrust",Scale=1.000000,Key=MixedReality_Left_Trigger_Axis) 148 | +AxisMappings=(AxisName="Thrust",Scale=-1.000000,Key=MixedReality_Right_Trigger_Axis) 149 | +AxisMappings=(AxisName="Thrust",Scale=1.000000,Key=OculusTouch_Left_Trigger_Axis) 150 | +AxisMappings=(AxisName="Thrust",Scale=-1.000000,Key=OculusTouch_Right_Trigger_Axis) 151 | +AxisMappings=(AxisName="Thrust",Scale=1.000000,Key=ValveIndex_Left_Trigger_Axis) 152 | +AxisMappings=(AxisName="Thrust",Scale=-1.000000,Key=ValveIndex_Right_Trigger_Axis) 153 | +AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=Vive_Left_Trackpad_X) 154 | +AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=Vive_Right_Trackpad_X) 155 | +AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=MixedReality_Left_Thumbstick_X) 156 | +AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=MixedReality_Right_Thumbstick_X) 157 | +AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=OculusTouch_Left_Thumbstick_X) 158 | +AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=OculusTouch_Right_Thumbstick_X) 159 | +AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=ValveIndex_Left_Thumbstick_X) 160 | +AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=ValveIndex_Right_Thumbstick_X) 161 | +AxisMappings=(AxisName="MoveUp",Scale=1.000000,Key=Vive_Left_Trackpad_Y) 162 | +AxisMappings=(AxisName="MoveUp",Scale=1.000000,Key=Vive_Right_Trackpad_Y) 163 | +AxisMappings=(AxisName="MoveUp",Scale=1.000000,Key=MixedReality_Left_Thumbstick_Y) 164 | +AxisMappings=(AxisName="MoveUp",Scale=1.000000,Key=MixedReality_Right_Thumbstick_Y) 165 | +AxisMappings=(AxisName="MoveUp",Scale=1.000000,Key=OculusTouch_Left_Thumbstick_Y) 166 | +AxisMappings=(AxisName="MoveUp",Scale=1.000000,Key=OculusTouch_Right_Thumbstick_Y) 167 | +AxisMappings=(AxisName="MoveUp",Scale=1.000000,Key=ValveIndex_Left_Thumbstick_Y) 168 | +AxisMappings=(AxisName="MoveUp",Scale=1.000000,Key=ValveIndex_Right_Thumbstick_Y) 169 | DefaultTouchInterface=/Engine/MobileResources/HUD/DefaultVirtualJoysticks.DefaultVirtualJoysticks 170 | -ConsoleKeys=Tilde 171 | +ConsoleKeys=Tilde 172 | 173 | 174 | -------------------------------------------------------------------------------- /FlyingQuickstart/Content/Flying/Meshes/BaseMaterial.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlenderSleuth/FlyingNavSystemSupport/2e398d0f5d72767811453bc0f1aa36db33f2ad22/FlyingQuickstart/Content/Flying/Meshes/BaseMaterial.uasset -------------------------------------------------------------------------------- /FlyingQuickstart/Content/Flying/Meshes/GrayMaterial.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlenderSleuth/FlyingNavSystemSupport/2e398d0f5d72767811453bc0f1aa36db33f2ad22/FlyingQuickstart/Content/Flying/Meshes/GrayMaterial.uasset -------------------------------------------------------------------------------- /FlyingQuickstart/Content/Flying/Meshes/UFO.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlenderSleuth/FlyingNavSystemSupport/2e398d0f5d72767811453bc0f1aa36db33f2ad22/FlyingQuickstart/Content/Flying/Meshes/UFO.uasset -------------------------------------------------------------------------------- /FlyingQuickstart/Content/Flying/Meshes/UFOMaterial.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlenderSleuth/FlyingNavSystemSupport/2e398d0f5d72767811453bc0f1aa36db33f2ad22/FlyingQuickstart/Content/Flying/Meshes/UFOMaterial.uasset -------------------------------------------------------------------------------- /FlyingQuickstart/Content/FlyingBP/AI/AIC_FollowingController.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlenderSleuth/FlyingNavSystemSupport/2e398d0f5d72767811453bc0f1aa36db33f2ad22/FlyingQuickstart/Content/FlyingBP/AI/AIC_FollowingController.uasset -------------------------------------------------------------------------------- /FlyingQuickstart/Content/FlyingBP/AI/BB_FollowingPawn.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlenderSleuth/FlyingNavSystemSupport/2e398d0f5d72767811453bc0f1aa36db33f2ad22/FlyingQuickstart/Content/FlyingBP/AI/BB_FollowingPawn.uasset -------------------------------------------------------------------------------- /FlyingQuickstart/Content/FlyingBP/AI/BP_FollowingPawn.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlenderSleuth/FlyingNavSystemSupport/2e398d0f5d72767811453bc0f1aa36db33f2ad22/FlyingQuickstart/Content/FlyingBP/AI/BP_FollowingPawn.uasset -------------------------------------------------------------------------------- /FlyingQuickstart/Content/FlyingBP/AI/BT_FollowingBehavior.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlenderSleuth/FlyingNavSystemSupport/2e398d0f5d72767811453bc0f1aa36db33f2ad22/FlyingQuickstart/Content/FlyingBP/AI/BT_FollowingBehavior.uasset -------------------------------------------------------------------------------- /FlyingQuickstart/Content/FlyingBP/Blueprints/FlyingGameMode.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlenderSleuth/FlyingNavSystemSupport/2e398d0f5d72767811453bc0f1aa36db33f2ad22/FlyingQuickstart/Content/FlyingBP/Blueprints/FlyingGameMode.uasset -------------------------------------------------------------------------------- /FlyingQuickstart/Content/FlyingBP/Blueprints/FlyingPawn.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlenderSleuth/FlyingNavSystemSupport/2e398d0f5d72767811453bc0f1aa36db33f2ad22/FlyingQuickstart/Content/FlyingBP/Blueprints/FlyingPawn.uasset -------------------------------------------------------------------------------- /FlyingQuickstart/Content/FlyingBP/FlyingOverview.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlenderSleuth/FlyingNavSystemSupport/2e398d0f5d72767811453bc0f1aa36db33f2ad22/FlyingQuickstart/Content/FlyingBP/FlyingOverview.uasset -------------------------------------------------------------------------------- /FlyingQuickstart/Content/FlyingBP/Maps/FlyingExampleMap.umap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlenderSleuth/FlyingNavSystemSupport/2e398d0f5d72767811453bc0f1aa36db33f2ad22/FlyingQuickstart/Content/FlyingBP/Maps/FlyingExampleMap.umap -------------------------------------------------------------------------------- /FlyingQuickstart/Content/FlyingBP/Maps/FlyingExampleMap_BuiltData.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlenderSleuth/FlyingNavSystemSupport/2e398d0f5d72767811453bc0f1aa36db33f2ad22/FlyingQuickstart/Content/FlyingBP/Maps/FlyingExampleMap_BuiltData.uasset -------------------------------------------------------------------------------- /FlyingQuickstart/Content/Geometry/Meshes/1M_Cube.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlenderSleuth/FlyingNavSystemSupport/2e398d0f5d72767811453bc0f1aa36db33f2ad22/FlyingQuickstart/Content/Geometry/Meshes/1M_Cube.uasset -------------------------------------------------------------------------------- /FlyingQuickstart/Content/Geometry/Meshes/1M_Cube_Chamfer.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlenderSleuth/FlyingNavSystemSupport/2e398d0f5d72767811453bc0f1aa36db33f2ad22/FlyingQuickstart/Content/Geometry/Meshes/1M_Cube_Chamfer.uasset -------------------------------------------------------------------------------- /FlyingQuickstart/Content/Geometry/Meshes/CubeMaterial.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlenderSleuth/FlyingNavSystemSupport/2e398d0f5d72767811453bc0f1aa36db33f2ad22/FlyingQuickstart/Content/Geometry/Meshes/CubeMaterial.uasset -------------------------------------------------------------------------------- /FlyingQuickstart/Content/Geometry/Meshes/TemplateFloor.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlenderSleuth/FlyingNavSystemSupport/2e398d0f5d72767811453bc0f1aa36db33f2ad22/FlyingQuickstart/Content/Geometry/Meshes/TemplateFloor.uasset -------------------------------------------------------------------------------- /FlyingQuickstart/FlyingQuickstart.uproject: -------------------------------------------------------------------------------- 1 | { 2 | "FileVersion": 3, 3 | "EngineAssociation": "4.24", 4 | "Category": "", 5 | "Description": "", 6 | "Plugins": [ 7 | { 8 | "Name": "FlyingNavSystem", 9 | "Enabled": true 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Flying Navigation System Support 2 | 3 | ## 2025 Hiatus Notice 4 | Hi everyone. 5 | 6 | Thank you all so much for the support of the Flying Navigation System plugin. I couldn’t have imagined it’d be so popular, but I’m very glad it’s been a useful tool (and made it into a few published games!). These past few years I’ve been very happy to provide support for the plugin, updating with new features and fixing bugs as well as stepping through troubleshooting. However, as I’ve planned for a while, I will be going on a backpacking trip from February 2025 until the end of the year. As such, support for the plugin will be going on a temporary hiatus. Because I won’t have a laptop with me, I won’t even be able to update the plugin to newer Unreal versions (beyond 5.5), which is rather unfortunate. I will see if I can maintain this minimum of support by tracking down a computer somewhere, but I cannot guarantee it. 7 | 8 | With all that in mind, I’m by no means planning on abandoning the plugin. I still have not completed the project I built it for in the first place, so my plan once I get back is to dedicate more time to that project, which in turn will require improvements and new features in the Flying Navigation System. 9 | 10 | For anyone that’s bought the plugin recently and feeling short-changed by this announcement, I’d be happy to put through any refunds. For those looking for support next year, I have tried to make the documentation as comprehensive as possible, and this discord server has an extensive history of troubleshooting and application discussions. I will also still be around in January, cleaning up some final points and able to help. 11 | 12 | Cheers everyone, 13 | 14 | Ben. 15 | 16 | ## Documentation 17 | Please see [here](https://blendersleuth.github.io/FlyingNavSystemSite/) for full documentation. 18 | You can get extra support and join the discussion on our [Discord](https://discord.gg/eHsYcRa4JU) support server. 19 | 20 | ## Demo Projects 21 | Download the FlyingDemo project and play around with it. A packaged version is available from [Releases](https://github.com/BlenderSleuth/FlyingNavSystemSupport/releases), or you can clone and build it yourself (don't download with the GitHub button though, because the repository uses [git-lfs](https://git-lfs.com/)). 22 | 23 | There is also a benchmark project which I used for the benchmarks [here](https://blendersleuth.github.io/FlyingNavSystemSite/benchmarks.html). 24 | 25 | ## Reporting Issues 26 | For bugs or feature requests please open an [issue](https://github.com/BlenderSleuth/FlyingNavSystemSupport/issues) on this repository, or find help on Discord. 27 | --------------------------------------------------------------------------------