├── Content └── RealSense │ ├── 3DScan │ ├── Faces │ │ └── .gitignore │ ├── Maps │ │ └── Scan3D.umap │ ├── Blueprints │ │ ├── ScanActor.uasset │ │ ├── UI │ │ │ ├── Scan3DUI.uasset │ │ │ └── Scan3DHUD.uasset │ │ ├── ButtonsState.uasset │ │ ├── RealSensePawn.uasset │ │ └── BP_Scan3DGameMode.uasset │ └── Materials │ │ └── VertexColorMat.uasset │ ├── RealSenseFunctionLibrary.uasset │ ├── Common │ └── Blueprints │ │ ├── gradient.uasset │ │ └── ComboBoxItem.uasset │ └── CameraViewer │ ├── Maps │ └── CameraViewer.umap │ └── Blueprints │ ├── CameraViewerHUD.uasset │ ├── CameraViewerUI.uasset │ ├── BP_CameraViewerGameMode.uasset │ └── BP_CameraViewerGameMode1.uasset ├── Plugins └── RealSensePlugin │ ├── Resources │ └── Icon128.png │ ├── Source │ └── RealSensePlugin │ │ ├── Private │ │ ├── RealSensePluginPrivatePCH.h │ │ ├── RealSensePlugin.cpp │ │ ├── CameraStreamComponent.cpp │ │ ├── Scan3DComponent.cpp │ │ ├── RealSenseComponent.cpp │ │ ├── RealSenseBlueprintLibrary.cpp │ │ ├── RealSenseSessionManager.cpp │ │ ├── RealSenseImpl.h │ │ ├── RealSenseUtils.cpp │ │ └── RealSenseImpl.cpp │ │ ├── Public │ │ ├── IRealSensePlugin.h │ │ ├── CameraStreamComponent.h │ │ ├── RealSenseBlueprintLibrary.h │ │ ├── RealSenseUtils.h │ │ ├── Scan3DComponent.h │ │ ├── RealSenseTypes.h │ │ ├── RealSenseComponent.h │ │ └── RealSenseSessionManager.h │ │ └── RealSensePlugin.Build.cs │ └── RealSensePlugin.uplugin ├── UE4 RealSense Plugin Getting Started Guide.docx ├── Source ├── RealSenseSandbox │ ├── RealSenseSandbox.h │ ├── RealSenseSandbox.cpp │ └── RealSenseSandbox.Build.cs ├── RealSenseSandbox.Target.cs └── RealSenseSandboxEditor.Target.cs ├── Config ├── DefaultEditor.ini ├── DefaultGameUserSettings.ini ├── DefaultGame.ini ├── DefaultInput.ini └── DefaultEngine.ini ├── .gitignore ├── RealSenseSandbox.uproject └── README.md /Content/RealSense/3DScan/Faces/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /Content/RealSense/3DScan/Maps/Scan3D.umap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuronekodaisuki/UE4RealSensePlugin/HEAD/Content/RealSense/3DScan/Maps/Scan3D.umap -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Resources/Icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuronekodaisuki/UE4RealSensePlugin/HEAD/Plugins/RealSensePlugin/Resources/Icon128.png -------------------------------------------------------------------------------- /Content/RealSense/RealSenseFunctionLibrary.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuronekodaisuki/UE4RealSensePlugin/HEAD/Content/RealSense/RealSenseFunctionLibrary.uasset -------------------------------------------------------------------------------- /UE4 RealSense Plugin Getting Started Guide.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuronekodaisuki/UE4RealSensePlugin/HEAD/UE4 RealSense Plugin Getting Started Guide.docx -------------------------------------------------------------------------------- /Content/RealSense/Common/Blueprints/gradient.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuronekodaisuki/UE4RealSensePlugin/HEAD/Content/RealSense/Common/Blueprints/gradient.uasset -------------------------------------------------------------------------------- /Content/RealSense/3DScan/Blueprints/ScanActor.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuronekodaisuki/UE4RealSensePlugin/HEAD/Content/RealSense/3DScan/Blueprints/ScanActor.uasset -------------------------------------------------------------------------------- /Content/RealSense/3DScan/Blueprints/UI/Scan3DUI.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuronekodaisuki/UE4RealSensePlugin/HEAD/Content/RealSense/3DScan/Blueprints/UI/Scan3DUI.uasset -------------------------------------------------------------------------------- /Content/RealSense/CameraViewer/Maps/CameraViewer.umap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuronekodaisuki/UE4RealSensePlugin/HEAD/Content/RealSense/CameraViewer/Maps/CameraViewer.umap -------------------------------------------------------------------------------- /Content/RealSense/3DScan/Blueprints/ButtonsState.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuronekodaisuki/UE4RealSensePlugin/HEAD/Content/RealSense/3DScan/Blueprints/ButtonsState.uasset -------------------------------------------------------------------------------- /Content/RealSense/3DScan/Blueprints/RealSensePawn.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuronekodaisuki/UE4RealSensePlugin/HEAD/Content/RealSense/3DScan/Blueprints/RealSensePawn.uasset -------------------------------------------------------------------------------- /Content/RealSense/3DScan/Blueprints/UI/Scan3DHUD.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuronekodaisuki/UE4RealSensePlugin/HEAD/Content/RealSense/3DScan/Blueprints/UI/Scan3DHUD.uasset -------------------------------------------------------------------------------- /Content/RealSense/3DScan/Materials/VertexColorMat.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuronekodaisuki/UE4RealSensePlugin/HEAD/Content/RealSense/3DScan/Materials/VertexColorMat.uasset -------------------------------------------------------------------------------- /Content/RealSense/Common/Blueprints/ComboBoxItem.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuronekodaisuki/UE4RealSensePlugin/HEAD/Content/RealSense/Common/Blueprints/ComboBoxItem.uasset -------------------------------------------------------------------------------- /Source/RealSenseSandbox/RealSenseSandbox.h: -------------------------------------------------------------------------------- 1 | // Fill out your copyright notice in the Description page of Project Settings. 2 | 3 | #pragma once 4 | 5 | #include "Engine.h" 6 | 7 | -------------------------------------------------------------------------------- /Content/RealSense/3DScan/Blueprints/BP_Scan3DGameMode.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuronekodaisuki/UE4RealSensePlugin/HEAD/Content/RealSense/3DScan/Blueprints/BP_Scan3DGameMode.uasset -------------------------------------------------------------------------------- /Content/RealSense/CameraViewer/Blueprints/CameraViewerHUD.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuronekodaisuki/UE4RealSensePlugin/HEAD/Content/RealSense/CameraViewer/Blueprints/CameraViewerHUD.uasset -------------------------------------------------------------------------------- /Content/RealSense/CameraViewer/Blueprints/CameraViewerUI.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuronekodaisuki/UE4RealSensePlugin/HEAD/Content/RealSense/CameraViewer/Blueprints/CameraViewerUI.uasset -------------------------------------------------------------------------------- /Config/DefaultEditor.ini: -------------------------------------------------------------------------------- 1 | [EditoronlyBP] 2 | bAllowClassAndBlueprintPinMatching=true 3 | bReplaceBlueprintWithClass=true 4 | bDontLoadBlueprintOutsideEditor=true 5 | bBlueprintIsNotBlueprintType=true 6 | -------------------------------------------------------------------------------- /Content/RealSense/CameraViewer/Blueprints/BP_CameraViewerGameMode.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuronekodaisuki/UE4RealSensePlugin/HEAD/Content/RealSense/CameraViewer/Blueprints/BP_CameraViewerGameMode.uasset -------------------------------------------------------------------------------- /Content/RealSense/CameraViewer/Blueprints/BP_CameraViewerGameMode1.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuronekodaisuki/UE4RealSensePlugin/HEAD/Content/RealSense/CameraViewer/Blueprints/BP_CameraViewerGameMode1.uasset -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | Binaries/ 2 | Build/ 3 | Intermediate/ 4 | Saved/ 5 | Content/StarterContent 6 | Content/*.obj 7 | 8 | *.sdf 9 | *.sln 10 | *.suo 11 | *.opensdf 12 | 13 | Plugins/RealSensePlugin/Binaries/ 14 | Plugins/RealSensePlugin/Intermediate/ -------------------------------------------------------------------------------- /Source/RealSenseSandbox/RealSenseSandbox.cpp: -------------------------------------------------------------------------------- 1 | // Fill out your copyright notice in the Description page of Project Settings. 2 | 3 | #include "RealSenseSandbox.h" 4 | 5 | IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, RealSenseSandbox, "RealSenseSandbox" ); 6 | -------------------------------------------------------------------------------- /RealSenseSandbox.uproject: -------------------------------------------------------------------------------- 1 | { 2 | "FileVersion": 3, 3 | "EngineAssociation": "4.8", 4 | "Category": "", 5 | "Description": "", 6 | "Modules": [ 7 | { 8 | "Name": "RealSenseSandbox", 9 | "Type": "Runtime", 10 | "LoadingPhase": "Default" 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/RealSensePluginPrivatePCH.h: -------------------------------------------------------------------------------- 1 | // Copyright 1998-2014 Epic Games, Inc. All Rights Reserved. 2 | 3 | #include "Engine.h" 4 | 5 | // You should place include statements to your module's private header files here. You only need to 6 | // add includes for headers that are used in most of your module's source files though. 7 | #include "IRealSensePlugin.h" -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/RealSensePlugin.cpp: -------------------------------------------------------------------------------- 1 | #include "RealSensePluginPrivatePCH.h" 2 | 3 | class FRealSensePlugin : public IRealSensePlugin 4 | { 5 | void StartupModule() override {} // This code will execute after the module is loaded into memory 6 | void ShutdownModule() override {} // This function may be called during shutdown or before reloading 7 | }; 8 | IMPLEMENT_MODULE(FRealSensePlugin, RealSensePlugin) -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Public/IRealSensePlugin.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "ModuleManager.h" 4 | 5 | struct IRealSensePlugin : public IModuleInterface 6 | { 7 | static inline IRealSensePlugin& Get() { return FModuleManager::LoadModuleChecked("RealSensePlugin"); } 8 | static inline bool IsAvailable() { return FModuleManager::Get().IsModuleLoaded("RealSensePlugin"); } 9 | }; 10 | 11 | -------------------------------------------------------------------------------- /Source/RealSenseSandbox/RealSenseSandbox.Build.cs: -------------------------------------------------------------------------------- 1 | // Fill out your copyright notice in the Description page of Project Settings. 2 | 3 | using UnrealBuildTool; 4 | 5 | public class RealSenseSandbox : ModuleRules 6 | { 7 | public RealSenseSandbox(TargetInfo Target) 8 | { 9 | PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" }); 10 | 11 | PrivateDependencyModuleNames.AddRange(new string[] { }); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/RealSensePlugin.uplugin: -------------------------------------------------------------------------------- 1 | { 2 | "FileVersion" : 3, 3 | 4 | "FriendlyName" : "Intel(R) RealSense(TM) Plugin", 5 | "Version" : 1, 6 | "VersionName" : "0.1", 7 | "CreatedBy" : "Intel Corporation", 8 | "CreatedByURL" : "http://www.intel.com", 9 | "EngineVersion" : 1579795, 10 | "Description" : "Support for Intel(R) RealSense(TM) Technology", 11 | "Category" : "RealSense", 12 | "CanContainContent" : true, 13 | 14 | "Modules" : 15 | [ 16 | { 17 | "Name" : "RealSensePlugin", 18 | "Type" : "Runtime" 19 | } 20 | ] 21 | } -------------------------------------------------------------------------------- /Config/DefaultGameUserSettings.ini: -------------------------------------------------------------------------------- 1 | [ScalabilityGroups] 2 | sg.ResolutionQuality=100 3 | sg.ViewDistanceQuality=3 4 | sg.AntiAliasingQuality=3 5 | sg.ShadowQuality=3 6 | sg.PostProcessQuality=3 7 | sg.TextureQuality=3 8 | sg.EffectsQuality=3 9 | 10 | [/Script/Engine.GameUserSettings] 11 | bUseVSync=False 12 | ResolutionSizeX=1280 13 | ResolutionSizeY=720 14 | LastUserConfirmedResolutionSizeX=1280 15 | LastUserConfirmedResolutionSizeY=720 16 | WindowPosX=-1 17 | WindowPosY=-1 18 | bUseDesktopResolutionForFullscreen=True 19 | FullscreenMode=2 20 | LastConfirmedFullscreenMode=2 21 | Version=5 22 | 23 | 24 | -------------------------------------------------------------------------------- /Source/RealSenseSandbox.Target.cs: -------------------------------------------------------------------------------- 1 | // Fill out your copyright notice in the Description page of Project Settings. 2 | 3 | using UnrealBuildTool; 4 | using System.Collections.Generic; 5 | 6 | public class RealSenseSandboxTarget : TargetRules 7 | { 8 | public RealSenseSandboxTarget(TargetInfo Target) 9 | { 10 | Type = TargetType.Game; 11 | } 12 | 13 | // 14 | // TargetRules interface. 15 | // 16 | 17 | public override void SetupBinaries( 18 | TargetInfo Target, 19 | ref List OutBuildBinaryConfigurations, 20 | ref List OutExtraModuleNames 21 | ) 22 | { 23 | OutExtraModuleNames.AddRange( new string[] { "RealSenseSandbox" } ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Source/RealSenseSandboxEditor.Target.cs: -------------------------------------------------------------------------------- 1 | // Fill out your copyright notice in the Description page of Project Settings. 2 | 3 | using UnrealBuildTool; 4 | using System.Collections.Generic; 5 | 6 | public class RealSenseSandboxEditorTarget : TargetRules 7 | { 8 | public RealSenseSandboxEditorTarget(TargetInfo Target) 9 | { 10 | Type = TargetType.Editor; 11 | } 12 | 13 | // 14 | // TargetRules interface. 15 | // 16 | 17 | public override void SetupBinaries( 18 | TargetInfo Target, 19 | ref List OutBuildBinaryConfigurations, 20 | ref List OutExtraModuleNames 21 | ) 22 | { 23 | OutExtraModuleNames.AddRange( new string[] { "RealSenseSandbox" } ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Config/DefaultGame.ini: -------------------------------------------------------------------------------- 1 | [/Script/EngineSettings.GeneralProjectSettings] 2 | ProjectID=579CA4AE4E75740FFFC3339DEC701AFF 3 | 4 | [StartupActions] 5 | bAddPacks=False 6 | 7 | [/Script/UnrealEd.ProjectPackagingSettings] 8 | BuildConfiguration=PPBC_Development 9 | StagingDirectory=(Path="D:/RealSense/Projects/Unreal/Builds") 10 | FullRebuild=True 11 | ForDistribution=False 12 | IncludeDebugFiles=True 13 | UsePakFile=True 14 | bGenerateChunks=False 15 | bBuildHttpChunkInstallData=False 16 | HttpChunkInstallDataDirectory=(Path=) 17 | HttpChunkInstallDataVersion= 18 | IncludePrerequisites=True 19 | IncludeCrashReporter=True 20 | InternationalizationPreset=English 21 | -CulturesToStage=en 22 | +CulturesToStage=en 23 | DefaultCulture=en 24 | bCookAll=False 25 | bCookMapsOnly=False 26 | bCompressed=False 27 | 28 | 29 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/RealSensePlugin.Build.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | 4 | namespace UnrealBuildTool.Rules 5 | { 6 | public class RealSensePlugin : ModuleRules 7 | { 8 | public RealSensePlugin(TargetInfo Target) 9 | { 10 | // https://answers.unrealengine.com/questions/51798/how-can-i-enable-unwind-semantics-for-c-style-exce.html 11 | UEBuildConfiguration.bForceEnableExceptions = true; 12 | 13 | PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine" }); 14 | PrivateDependencyModuleNames.AddRange(new string[] { "RHI", "RenderCore", "ShaderCore" }); 15 | 16 | PrivateIncludePaths.AddRange(new string[] { "RealSensePlugin/Private" }); 17 | 18 | string RealSenseDirectory = Environment.GetEnvironmentVariable("RSSDK_DIR"); 19 | string RealSenseIncludeDirectory = RealSenseDirectory + "include"; 20 | string RealSenseLibrary32Directory = RealSenseDirectory + "lib\\Win32\\libpxc.lib"; 21 | string RealSenseLibrary64Directory = RealSenseDirectory + "lib\\x64\\libpxc.lib"; 22 | 23 | PublicIncludePaths.Add(RealSenseIncludeDirectory); 24 | PublicAdditionalLibraries.Add(RealSenseLibrary32Directory); 25 | PublicAdditionalLibraries.Add(RealSenseLibrary64Directory); 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /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="Gamepad_LeftX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 10 | +AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 11 | +AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 12 | +AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 13 | +AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) 14 | +AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) 15 | bAltEnterTogglesFullscreen=True 16 | bUseMouseForTouch=False 17 | bEnableMouseSmoothing=True 18 | bEnableFOVScaling=True 19 | FOVScale=0.011110 20 | DoubleClickTime=0.200000 21 | +AxisMappings=(AxisName="MouseX",Key=MouseX,Scale=-5.000000) 22 | +AxisMappings=(AxisName="MouseY",Key=MouseY,Scale=-5.000000) 23 | bAlwaysShowTouchInterface=False 24 | bShowConsoleOnFourFingerTap=True 25 | DefaultTouchInterface=/Engine/MobileResources/HUD/DefaultVirtualJoysticks.DefaultVirtualJoysticks 26 | ConsoleKey=None 27 | -ConsoleKeys=Tilde 28 | +ConsoleKeys=Tilde 29 | 30 | 31 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Public/CameraStreamComponent.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "RealSenseComponent.h" 4 | #include "CameraStreamComponent.generated.h" 5 | 6 | // This component provides access to a buffer of RGB camera data and 7 | // a buffer of depth camera data, as well as convenient Texture objects 8 | // for displaying this data. 9 | UCLASS(editinlinenew, meta = (BlueprintSpawnableComponent), ClassGroup = RealSense) 10 | class UCameraStreamComponent : public URealSenseComponent 11 | { 12 | GENERATED_UCLASS_BODY() 13 | 14 | // Array of RGBA color values representing a single frame of video captured 15 | // by the RealSense RGB camera at the resolution specified by calling 16 | // SetColorCameraResolution(). 17 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 18 | TArray ColorBuffer; 19 | 20 | // Array of depth values (in millimeters) stored as a single frame of video 21 | // captured by the RealSense depth camera at the resolution specified by 22 | // calling SetDepthCameraResolution(). 23 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 24 | TArray DepthBuffer; 25 | 26 | // Texture2D object used to easily visualize the ColorBuffer. 27 | // This texture is initialized upon setting the color camera resolution, and 28 | // should be set by calling ColorBufferToTexture(). 29 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 30 | UTexture2D* ColorTexture; 31 | 32 | // Texture2D object used to easily visualize the DepthBuffer. 33 | // This texture is initialized upon setting the color camera resolution, and 34 | // should be set by calling DepthBufferToTexture(). 35 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 36 | UTexture2D* DepthTexture; 37 | 38 | // Sets the resolution that the RealSense RGB camera should use. 39 | // This function must be called before StartCamera() in order to 40 | // enable the RGB camera. 41 | UFUNCTION(BlueprintCallable, Category = "RealSense") 42 | virtual void SetColorCameraResolution(EColorResolution Resolution) override; 43 | 44 | // Sets the resolution that the RealSense depth camera should use. 45 | // This function must be called before StartCamera() in order to 46 | // enable the depth camera. 47 | UFUNCTION(BlueprintCallable, Category = "RealSense") 48 | virtual void SetDepthCameraResolution(EDepthResolution Resolution) override; 49 | 50 | UCameraStreamComponent(); 51 | 52 | void InitializeComponent() override; 53 | 54 | void TickComponent(float DeltaTime, enum ELevelTick TickType, 55 | FActorComponentTickFunction *ThisTickFunction) override; 56 | }; 57 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Public/RealSenseBlueprintLibrary.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "RealSenseTypes.h" 4 | #include "RealSenseUtils.h" 5 | #include "RealSenseBlueprintLibrary.generated.h" 6 | 7 | UCLASS() 8 | class URealSenseBlueprintLibrary : public UBlueprintFunctionLibrary 9 | { 10 | GENERATED_UCLASS_BODY() 11 | 12 | // Returns a string representation of the input ColorResolution 13 | UFUNCTION(BlueprintCallable, BlueprintPure, Category = "RealSense Utilities") 14 | static FString EColorResolutionToString(EColorResolution value); 15 | 16 | // Returns a string representation of the input DepthResolution 17 | UFUNCTION(BlueprintCallable, BlueprintPure, Category = "RealSense Utilities") 18 | static FString EDepthResolutionToString(EDepthResolution value); 19 | 20 | // Returns a string representation of the input CameraModel 21 | UFUNCTION(BlueprintCallable, BlueprintPure, Category = "RealSense Utilities") 22 | static FString ECameraModelToString(ECameraModel value); 23 | 24 | // Fills a Texture2D object with the data from a buffer of FSimpleColors. 25 | // This function will return null if the size of the input buffer does not 26 | // match the resolution of the Texture2D object. 27 | // @param Buffer - TArray of FSimpleColor values (RGBA) 28 | // @param Texture - Texture2D object to fill with data 29 | // @return The input Texture2D object, modified to contain the data from the 30 | // input buffer 31 | UFUNCTION(BlueprintCallable, Category = "RealSense Utilities") 32 | static UTexture2D* ColorBufferToTexture(const TArray& Buffer, 33 | UTexture2D* Texture); 34 | 35 | // Fills a Texture2D object with the data from a buffer of integers 36 | // (representing depth values). 37 | // This function will return null if the size of the input buffer does not 38 | // match the resolution of the Texture2D object. 39 | // @param Buffer - TArray of integer values (depth in millimeters) 40 | // @param Texture - Texture2D object to fill with data 41 | // @return The input Texture2D object, modified to contain the data from the 42 | // input buffer 43 | UFUNCTION(BlueprintCallable, Category = "RealSense Utilities") 44 | static UTexture2D* DepthBufferToTexture(const TArray& Buffer, 45 | UTexture2D* Texture); 46 | 47 | // Returns an array of .OBJ filenames found in the specified directory. 48 | // Note: The path is relative to the /Game/Content asset directory. 49 | // Example: GetMeshFiles("Scans/Faces") searches for .OBJ files in 50 | // /Games/Content/Scans/Faces. 51 | UFUNCTION(BlueprintCallable, Category = "RealSense Utilities") 52 | static TArray GetMeshFiles(FString Directory); 53 | }; -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/CameraStreamComponent.cpp: -------------------------------------------------------------------------------- 1 | #include "RealSensePluginPrivatePCH.h" 2 | #include "CameraStreamComponent.h" 3 | 4 | UCameraStreamComponent::UCameraStreamComponent(const class FObjectInitializer& ObjInit) 5 | : Super(ObjInit) 6 | { 7 | } 8 | 9 | // Adds the CAMERA_STREAMING feature to the RealSenseSessionManager and 10 | // initializes the ColorTexture and DepthTexture objects. 11 | void UCameraStreamComponent::InitializeComponent() 12 | { 13 | Super::InitializeComponent(); 14 | 15 | if (globalRealSenseSession != nullptr) { 16 | globalRealSenseSession->AddRealSenseFeature(RealSenseFeature::CAMERA_STREAMING); 17 | } 18 | 19 | ColorTexture = UTexture2D::CreateTransient(1, 1, EPixelFormat::PF_B8G8R8A8); 20 | DepthTexture = UTexture2D::CreateTransient(1, 1, EPixelFormat::PF_B8G8R8A8); 21 | } 22 | 23 | // Copies the ColorBuffer and DepthBuffer from the RealSenseSessionManager. 24 | void UCameraStreamComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, 25 | FActorComponentTickFunction *ThisTickFunction) 26 | { 27 | if (globalRealSenseSession->IsCameraRunning() == false) { 28 | return; 29 | } 30 | 31 | ColorBuffer = globalRealSenseSession->GetColorBuffer(); 32 | DepthBuffer = globalRealSenseSession->GetDepthBuffer(); 33 | } 34 | 35 | // If the supplied resolution is valid, this function will pass that resolution 36 | // along to the RealSenseSessionManager and recreate the ColorTexture objects 37 | // to have the same resolution. 38 | void UCameraStreamComponent::SetColorCameraResolution(EColorResolution resolution) 39 | { 40 | if (resolution == EColorResolution::UNDEFINED) { 41 | return; 42 | } 43 | 44 | Super::SetColorCameraResolution(resolution); 45 | 46 | int ColorImageWidth = globalRealSenseSession->GetColorImageWidth(); 47 | int ColorImageHeight = globalRealSenseSession->GetColorImageHeight(); 48 | ColorTexture = UTexture2D::CreateTransient(ColorImageWidth, ColorImageHeight, 49 | PF_B8G8R8A8); 50 | ColorTexture->UpdateResource(); 51 | } 52 | 53 | // If the supplied resolution is valid, this function will pass that resolution 54 | // along to the RealSenseSessionManager and recreate the DepthTexture objects 55 | // to have the same resolution. 56 | void UCameraStreamComponent::SetDepthCameraResolution(EDepthResolution resolution) 57 | { 58 | if (resolution == EDepthResolution::UNDEFINED) { 59 | return; 60 | } 61 | 62 | Super::SetDepthCameraResolution(resolution); 63 | 64 | int DepthImageWidth = globalRealSenseSession->GetDepthImageWidth(); 65 | int DepthImageHeight = globalRealSenseSession->GetDepthImageHeight(); 66 | DepthTexture = UTexture2D::CreateTransient(DepthImageWidth, DepthImageHeight, 67 | PF_B8G8R8A8); 68 | DepthTexture->UpdateResource(); 69 | } 70 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/Scan3DComponent.cpp: -------------------------------------------------------------------------------- 1 | #include "RealSensePluginPrivatePCH.h" 2 | #include "Scan3DComponent.h" 3 | 4 | UScan3DComponent::UScan3DComponent(const class FObjectInitializer& ObjInit) 5 | : Super(ObjInit) 6 | { 7 | bHasScanStarted = false; 8 | } 9 | 10 | // Adds the SCAN_3D feature to the RealSenseSessionManager and initializes the 11 | // ScanTexture object. 12 | void UScan3DComponent::InitializeComponent() 13 | { 14 | Super::InitializeComponent(); 15 | 16 | if (globalRealSenseSession != nullptr) { 17 | globalRealSenseSession->AddRealSenseFeature(RealSenseFeature::SCAN_3D); 18 | } 19 | 20 | ScanTexture = UTexture2D::CreateTransient(1, 1, EPixelFormat::PF_B8G8R8A8); 21 | } 22 | 23 | // Copies the ScanBuffer and checks if a current scan has just completed. 24 | // If it has, the OnScanComplete event is broadcast. 25 | void UScan3DComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, 26 | FActorComponentTickFunction *ThisTickFunction) 27 | { 28 | if (globalRealSenseSession->IsCameraRunning() == false) { 29 | return; 30 | } 31 | 32 | // The 3D Scanning preview image size can be changed automatically by the 33 | // middleware, so it is important to check every tick if the image size 34 | // has changed so that the ScanTexture object can be resized to match. 35 | if (globalRealSenseSession->HasScan3DImageSizeChanged()) { 36 | int Scan3DImageWidth = globalRealSenseSession->GetScan3DImageWidth(); 37 | int Scan3DImageHeight = globalRealSenseSession->GetScan3DImageHeight(); 38 | ScanTexture = UTexture2D::CreateTransient(Scan3DImageWidth, Scan3DImageHeight, 39 | EPixelFormat::PF_B8G8R8A8); 40 | ScanTexture->UpdateResource(); 41 | } 42 | 43 | ScanBuffer = globalRealSenseSession->GetScanBuffer(); 44 | 45 | if (globalRealSenseSession->HasScanCompleted() && bHasScanStarted) { 46 | OnScanComplete.Broadcast(); 47 | bHasScanStarted = false; 48 | } 49 | } 50 | 51 | void UScan3DComponent::ConfigureScanning(EScan3DMode ScanningMode, bool bSolidify) 52 | { 53 | globalRealSenseSession->ConfigureScanning(ScanningMode, bSolidify, false); 54 | } 55 | 56 | void UScan3DComponent::StartScanning() 57 | { 58 | globalRealSenseSession->StartScanning(); 59 | bHasScanStarted = true; 60 | } 61 | 62 | void UScan3DComponent::StopScanning() 63 | { 64 | globalRealSenseSession->StopScanning(); 65 | } 66 | 67 | void UScan3DComponent::SaveScan(FString Filename) 68 | { 69 | Filename = FPaths::GameContentDir().Append(Filename); 70 | globalRealSenseSession->SaveScan(EScan3DFileFormat::OBJ, Filename); 71 | } 72 | 73 | void UScan3DComponent::LoadScan(FString Filename) 74 | { 75 | Filename = FPaths::GameContentDir().Append(Filename); 76 | LoadMeshFile(Filename, Vertices, Triangles, Colors); 77 | } 78 | 79 | bool UScan3DComponent::IsScanning() 80 | { 81 | return globalRealSenseSession->IsScanning(); 82 | } 83 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Public/RealSenseUtils.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "RealSenseTypes.h" 4 | #include "pxc3dscan.h" 5 | 6 | // Log Category that can be used by all RealSensePlugin source files that inclue this file 7 | DECLARE_LOG_CATEGORY_EXTERN(RealSensePlugin, Log, All); 8 | 9 | #if defined ( WIN32 ) 10 | #define __func__ __FUNCTION__ 11 | #endif 12 | 13 | // Modified macro from tutorial by Spoof and Kris: https://wiki.unrealengine.com/Log_Macro_with_Netmode_and_Colour 14 | #define RS_LOG(Verbosity, Format, ...) \ 15 | { \ 16 | const FString Msg = FString::Printf(TEXT(Format), ##__VA_ARGS__); \ 17 | UE_LOG(RealSensePlugin, Verbosity, TEXT("%s() : %s"), TEXT(__func__), *Msg); \ 18 | } 19 | 20 | // Helper log macro for logging pxcStatus codes 21 | #define RS_LOG_STATUS(Status, Format, ...) \ 22 | { \ 23 | const FString Msg = FString::Printf(TEXT(Format), ##__VA_ARGS__); \ 24 | const int Stat = static_cast(Status); \ 25 | if (Stat < 0) \ 26 | UE_LOG(RealSensePlugin, Error, TEXT("%s() : %s : %d"), TEXT(__func__), *Msg, Stat) \ 27 | else if (Stat == 0) \ 28 | UE_LOG(RealSensePlugin, Log, TEXT("%s() : %s : %d"), TEXT(__func__), *Msg, Stat) \ 29 | else if (Stat > 0) \ 30 | UE_LOG(RealSensePlugin, Warning, TEXT("%s() : %s : %d"), TEXT(__func__), *Msg, Stat) \ 31 | } 32 | 33 | // Converts a Vector from RealSense camera space to UE4 world space. 34 | FVector ConvertRSVectorToUnreal(FVector v); 35 | 36 | // Converts a depth value (in millimeters) to an 8-bit scale (between 0 - 255). 37 | uint8 ConvertDepthValueTo8Bit(int32 depth, int32 width); 38 | 39 | // Returns a StreamResolution structure containing the values from the enumerated ColorResolution 40 | FStreamResolution GetEColorResolutionValue(EColorResolution res); 41 | 42 | // Returns a StreamResolution structure containing the values from the enumerated DepthResolution 43 | FStreamResolution GetEDepthResolutionValue(EDepthResolution res); 44 | 45 | // Converts a Blueprint-exposed RealSensePixelFormat to a PXCImage::PixelFormat 46 | PXCImage::PixelFormat GetPXCPixelFormat(ERealSensePixelFormat format); 47 | 48 | // Converts a Blueprint-exposed RealSensePixelFormat to a PXCImage::PixelFormat 49 | PXC3DScan::ScanningMode GetPXCScanningMode(EScan3DMode mode); 50 | 51 | // Converts a Blueprint-exposed RealSensePixelFormat to a PXCImage::PixelFormat 52 | PXC3DScan::FileFormat GetPXCScanFileFormat(EScan3DFileFormat format); 53 | 54 | // Copies the data from the input color PXCImage into the input data structure. 55 | void CopyColorImageToBuffer(PXCImage* image, TArray& data, const uint32 width, const uint32 height); 56 | 57 | // Copies the data from the input depth PXCImage into the input data structure. 58 | void CopyDepthImageToBuffer(PXCImage* image, TArray& data, const uint32 width, const uint32 height); 59 | 60 | void LoadMeshFile(const FString& filename, TArray& Vertices, TArray& Triangles, TArray& Colors); 61 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/RealSenseComponent.cpp: -------------------------------------------------------------------------------- 1 | #include "RealSensePluginPrivatePCH.h" 2 | #include "RealSenseComponent.h" 3 | 4 | // Specifies that this component should be initialized and can tick. 5 | URealSenseComponent::URealSenseComponent(const class FObjectInitializer& ObjInit) 6 | : Super(ObjInit) 7 | { 8 | bWantsInitializeComponent = true; 9 | PrimaryComponentTick.bCanEverTick = true; 10 | 11 | CameraModel = ECameraModel::None; 12 | CameraFirmware = "0.0.0.0"; 13 | 14 | ColorHorizontalFOV = 0.0f; 15 | ColorVerticalFOV = 0.0f; 16 | DepthHorizontalFOV = 0.0f; 17 | DepthVerticalFOV = 0.0f; 18 | 19 | globalRealSenseSession = nullptr; 20 | } 21 | 22 | // When initialized, this component will check if a RealSenseSessionManager actor 23 | // exists in the scene. If the actor exists, this component stores a reference to 24 | // it. If it does not, a new RealSenseSessionManager actor will be spawned, and a 25 | // reference to it will be saved. 26 | void URealSenseComponent::InitializeComponent() 27 | { 28 | if (globalRealSenseSession == nullptr) { 29 | for (TActorIterator Itr(GetWorld()); Itr; ++Itr) { 30 | globalRealSenseSession = (ARealSenseSessionManager*)*Itr; 31 | } 32 | if (globalRealSenseSession == nullptr) { 33 | RS_LOG(Log, "Creating RealSenseSessionManager Actor") 34 | globalRealSenseSession = GetWorld()->SpawnActor(ARealSenseSessionManager::StaticClass()); 35 | } 36 | } 37 | } 38 | 39 | // Queries the camera model, firmware, and field of view data from the RealSense 40 | // camera. 41 | void URealSenseComponent::BeginPlay() 42 | { 43 | CameraModel = globalRealSenseSession->GetCameraModel(); 44 | CameraFirmware = globalRealSenseSession->GetCameraFirmware(); 45 | 46 | ColorHorizontalFOV = globalRealSenseSession->GetColorHorizontalFOV(); 47 | ColorVerticalFOV = globalRealSenseSession->GetColorVerticalFOV(); 48 | 49 | DepthHorizontalFOV = globalRealSenseSession->GetDepthHorizontalFOV(); 50 | DepthVerticalFOV = globalRealSenseSession->GetDepthVerticalFOV(); 51 | } 52 | 53 | void URealSenseComponent::StartCamera() 54 | { 55 | globalRealSenseSession->StartCamera(); 56 | } 57 | 58 | void URealSenseComponent::StopCamera() 59 | { 60 | globalRealSenseSession->StopCamera(); 61 | } 62 | 63 | bool URealSenseComponent::IsCameraRunning() 64 | { 65 | return globalRealSenseSession->IsCameraRunning(); 66 | } 67 | 68 | FStreamResolution URealSenseComponent::GetColorCameraResolution() 69 | { 70 | return globalRealSenseSession->GetColorCameraResolution(); 71 | } 72 | 73 | void URealSenseComponent::SetColorCameraResolution(EColorResolution resolution) 74 | { 75 | if (resolution != EColorResolution::UNDEFINED) { 76 | globalRealSenseSession->SetColorCameraResolution(resolution); 77 | } 78 | } 79 | 80 | FStreamResolution URealSenseComponent::GetDepthCameraResolution() 81 | { 82 | return globalRealSenseSession->GetDepthCameraResolution(); 83 | } 84 | 85 | void URealSenseComponent::SetDepthCameraResolution(EDepthResolution resolution) 86 | { 87 | if (resolution != EDepthResolution::UNDEFINED) { 88 | globalRealSenseSession->SetDepthCameraResolution(resolution); 89 | } 90 | } 91 | 92 | bool URealSenseComponent::IsStreamSetValid(EColorResolution ColorResolution, 93 | EDepthResolution DepthResolution) 94 | { 95 | return globalRealSenseSession->IsStreamSetValid(ColorResolution, DepthResolution); 96 | } 97 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Public/Scan3DComponent.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "RealSenseComponent.h" 4 | #include "Scan3DComponent.generated.h" 5 | 6 | UCLASS(editinlinenew, meta = (BlueprintSpawnableComponent), ClassGroup = RealSense) 7 | class UScan3DComponent : public URealSenseComponent 8 | { 9 | GENERATED_UCLASS_BODY() 10 | 11 | // Array of RGBA color values representing a preview image displaying the 12 | // current progress of scanning. This buffer will be empty until scanning 13 | // has started. 14 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 15 | TArray ScanBuffer; 16 | 17 | // Convenient Texture2D object used to easily visualize the ScanBuffer. 18 | // This texture can be set by calling ColorBufferToTexture(). 19 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 20 | UTexture2D* ScanTexture; 21 | 22 | // Array of mesh vertices. This array is populated by the LoadScan() function. 23 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 24 | TArray Vertices; 25 | 26 | // Array of mesh triangles. This array is populated by the LoadScan() function. 27 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 28 | TArray Triangles; 29 | 30 | // Array of mesh vertex colors. This array is populated by the LoadScan() function. 31 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 32 | TArray Colors; 33 | 34 | // Triggered after a scan has been saved to disk. A call to SaveScan() will 35 | // asynchronously save the scan. You can use this event to be notified when the 36 | // scan has finished saving. 37 | UPROPERTY(BlueprintAssignable, Category = "RealSense") 38 | FRealSenseNullaryDelegate OnScanComplete; 39 | 40 | // Sets the scanning mode and options for 3D Scanning. After calling this function, 41 | // the scanning preview image will be available in the ScanBuffer. 42 | UFUNCTION(BlueprintCallable, Category = "RealSense") 43 | void ConfigureScanning(EScan3DMode ScanningMode, bool bSolidify); 44 | 45 | // Allows the scanning process to begin. Scanning will not actually begin until 46 | // the pre-requisites for the specified scanning mode have been met. 47 | UFUNCTION(BlueprintCallable, Category = "RealSense") 48 | void StartScanning(); 49 | 50 | // Stops the scanning process. 51 | UFUNCTION(BlueprintCallable, Category = "RealSense") 52 | void StopScanning(); 53 | 54 | // Stops the scanning process and asynchronously saves the scanned data to a mesh 55 | // file with the specified file format and file name. 56 | UFUNCTION(BlueprintCallable, Category = "RealSense") 57 | void SaveScan(FString Filename); 58 | 59 | // Opens the specified .OBJ file and loads the mesh information into this 60 | // component's Vertices, Triangles, and Colors arrays. 61 | UFUNCTION(BlueprintCallable, Category = "RealSense") 62 | void LoadScan(FString Filename); 63 | 64 | // Returns true if the scanning is currently happening. Use this function after 65 | // calling StartScanning() to know when the scanning process has begun. 66 | UFUNCTION(BlueprintCallable, BlueprintPure, Category = "RealSense") 67 | bool IsScanning(); 68 | 69 | UScan3DComponent(); 70 | 71 | void InitializeComponent() override; 72 | 73 | void TickComponent(float DeltaTime, enum ELevelTick TickType, 74 | FActorComponentTickFunction *ThisTickFunction) override; 75 | 76 | private: 77 | // Used internally to know when to listen for ScanComplete events. 78 | bool bHasScanStarted{ false }; 79 | }; 80 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### RealSense Plugin for Unreal Engine 4 2 | 3 | #### Overview 4 | The purpose of this plugin is to provide support for the RealSense SDK inside of the Unreal Engine 4 Editor. SDK features are exposed via Blueprint components and Blueprint functions, and can be referenced in C++ for developers who write code. 5 | 6 | Developers gain access to the SDK and its supported middleware through actor components, each of which encapsulate a specific set of features. For example, there is a Camera Streams Component that controls the resolution of the color and depth cameras and provides access to the raw image buffers. And there is a Scan 3D Component that provides support for the 3D Scanning middleware, including setting the scan configuration, accessing the preview image buffer, and saving the scan out to disk. For a complete list of featured and in-progress components, see the list below. 7 | 8 | Multiple RealSense components of different types may be present in the same UE4 scene, as can multiple instances of the same component. This is possible because each component communicates with a global Session Manager Actor (GSM) that maintains a singular state of all RealSense settings and data. A GSM is instantiated automatically when the first RealSense component is created, and is virtually invisible to the developer. 9 | 10 | Behind the scenes, each component reads from and writes to the GSMr to ensure consistency across components. The GSM creates a dedicated thread that performs all RealSense processing, and the game thread polls for updates from this thread on every tick. This separation helps keep the game thread running quickly even when the RealSense thread is doing some heavy lifting. 11 | 12 | - - - 13 | 14 | For more details, please see the full article at: https://software.intel.com/en-us/articles/intel-realsense-sdk-plug-in-for-unreal-engine-4 15 | 16 | Also, check out these tutorial videos to get started using the RealSense plugin: 17 | 18 | https://youtu.be/mrIiBssoI0w 19 | 20 | https://youtu.be/WMqG3UZkBTE 21 | 22 | - - - 23 | 24 | #### Hardware Requirements 25 | * [F200 Front-Facing RealSense Camera](http://click.intel.com/intel-realsense-developer-kit.html) __OR__ 26 | * [R200 World-Facing RealSense Camera](http://click.intel.com/intel-realsense-developer-kit-r200.html) 27 | * 4th Generation Intel(R) CPU or higher 28 | * Intel Graphics supporting Open CL 1.2 (If using Scene Perception Component) 29 | 30 | #### Software Requirements 31 | * [Intel(R) RealSense(TM) SDK R5](https://software.intel.com/en-us/intel-realsense-sdk/download) 32 | * Unreal Engine 4.8 (or higher) 33 | * Windows 8.1 or 10 34 | * Visual Studio 2013 or higher 35 | 36 | #### Featured Components 37 | * Camera Streams - Provides access to raw color and depth image buffers 38 | * Scan 3D - Supports the scanning of faces and objects into 3D models 39 | 40 | #### In-Progress Components 41 | * Head Tracking - Provides data for the user's head position and rotation 42 | * Scene Perception - Supports the scanning of small scenes into 3D models 43 | 44 | 45 | #### Known Non-Compliance with UE4 Coding Standard 46 | This plugin makes use of C++11 std::unique_ptr objects, instead of the TSharedPtr type in places where a custom deleter is needed. 47 | Many of the built-in RealSense types (like PXCSession) are unable to use a TSharedPtr because the TSharedPtr DestroyObject function, cannot access private members in the PXCBase class. 48 | 49 | I do not know of an equivalent data type in UE4 for std::atomic types, so I have kept std::atomic_bool variables in places where I need shared booleans between threads. 50 | 51 | Having read UE4 Threading tutorials, the amount of overhead compared to a simple call to std::thread() makes it seem not worth the extra effort, so I have kept std::thread, std::mutex, and std::unique_locks in my code. 52 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Public/RealSenseTypes.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "RealSenseTypes.generated.h" 4 | 5 | // List of features provided by the RealSense SDK 6 | enum RealSenseFeature : uint8 { 7 | CAMERA_STREAMING = 0x1, 8 | SCAN_3D = 0x2, 9 | }; 10 | 11 | // Resolutions supported by the RealSense RGB camera 12 | UENUM(BlueprintType) 13 | enum class EColorResolution : uint8 { 14 | UNDEFINED = 0 UMETA(DisplayName = " "), 15 | RES1 = 1 UMETA(DisplayName = "1920 x 1080 x 30"), 16 | RES2 = 2 UMETA(DisplayName = "1280 x 720 x 30"), 17 | RES3 = 3 UMETA(DisplayName = "640 x 480 x 60"), 18 | RES4 = 4 UMETA(DisplayName = "640 x 480 x 30"), 19 | RES5 = 5 UMETA(DisplayName = "320 x 240 x 60"), 20 | RES6 = 6 UMETA(DisplayName = "320 x 240 x 30"), 21 | }; 22 | 23 | // Resolutions supported by the RealSense depth camera 24 | // (F200) denotes that this resolution is only supported by the F200 camera. 25 | // (R200) denotes that this resolution is only supported by the R200 camera. 26 | UENUM(BlueprintType) 27 | enum class EDepthResolution : uint8 { 28 | UNDEFINED = 0 UMETA(DisplayName = " "), 29 | RES1 = 1 UMETA(DisplayName = "640 x 480 x 60 (F200)"), 30 | RES2 = 2 UMETA(DisplayName = "640 x 480 x 30 (F200)"), 31 | RES3 = 3 UMETA(DisplayName = "628 x 468 x 90 (R200)"), 32 | RES4 = 4 UMETA(DisplayName = "628 x 468 x 60 (R200)"), 33 | RES5 = 5 UMETA(DisplayName = "628 x 468 x 30 (R200)"), 34 | RES6 = 6 UMETA(DisplayName = "480 x 360 x 90 (R200)"), 35 | RES7 = 7 UMETA(DisplayName = "480 x 360 x 60 (R200)"), 36 | RES8 = 8 UMETA(DisplayName = "480 x 360 x 30 (R200)"), 37 | RES9 = 9 UMETA(DisplayName = "320 x 240 x 90 (R200)"), 38 | RES10 = 10 UMETA(DisplayName = "320 x 240 x 60 (R200)"), 39 | RES11 = 11 UMETA(DisplayName = "320 x 240 x 30 (R200)"), 40 | }; 41 | 42 | // RSSDK Pixel Format exposed to Blueprint (see pxcimage.h) 43 | UENUM(BlueprintType) 44 | enum class ERealSensePixelFormat : uint8 { 45 | PIXEL_FORMAT_ANY = 0, // Unknown/undefined 46 | COLOR_RGB32, // BGRA layout 47 | DEPTH_G16_MM, // 16-bit unsigned integer with precision mm. 48 | }; 49 | 50 | // Supported RealSense camera models 51 | UENUM(BlueprintType) 52 | enum class ECameraModel : uint8 { 53 | None = 0 UMETA(DisplayName = " "), 54 | F200 = 1 UMETA(DisplayName = "Front-Facing (F200)"), 55 | SR300 = 2 UMETA(DisplayName = "Short-Range (SR300)"), 56 | R200 = 3 UMETA(DisplayName = "World-Facing (R200)"), 57 | Other = 4 UMETA(DisplayName = "Unknown Camera Model") 58 | }; 59 | 60 | // Supported modes for the 3D Scanning middleware 61 | UENUM(BlueprintType) 62 | enum class EScan3DMode : uint8 { 63 | OBJECT = 0 UMETA(DisplayName = "Object"), 64 | FACE = 1 UMETA(DisplayName = "Face") 65 | }; 66 | 67 | // File types supported by the 3D Scanning middleware for saving scans 68 | UENUM(BlueprintType) 69 | enum class EScan3DFileFormat : uint8 { 70 | OBJ = 0 UMETA(DisplayName = "OBJ") 71 | }; 72 | 73 | // Basic 32-bit color structure (RGBA) 74 | USTRUCT(BlueprintType) 75 | struct FSimpleColor 76 | { 77 | GENERATED_USTRUCT_BODY() 78 | 79 | UPROPERTY(EditAnywhere, BlueprintReadWrite) 80 | uint8 R; 81 | UPROPERTY(EditAnywhere, BlueprintReadWrite) 82 | uint8 G; 83 | UPROPERTY(EditAnywhere, BlueprintReadWrite) 84 | uint8 B; 85 | UPROPERTY(EditAnywhere, BlueprintReadWrite) 86 | uint8 A; 87 | }; 88 | 89 | // Resolution of a RealSense camera stream 90 | USTRUCT(BlueprintType) 91 | struct FStreamResolution 92 | { 93 | GENERATED_USTRUCT_BODY() 94 | 95 | UPROPERTY(EditAnywhere, BlueprintReadWrite) 96 | int32 width; 97 | UPROPERTY(EditAnywhere, BlueprintReadWrite) 98 | int32 height; 99 | UPROPERTY(EditAnywhere, BlueprintReadWrite) 100 | float fps; 101 | UPROPERTY(EditAnywhere, BlueprintReadWrite) 102 | ERealSensePixelFormat format; 103 | }; 104 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Public/RealSenseComponent.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "RealSenseSessionManager.h" 4 | #include "RealSenseTypes.h" 5 | #include "RealSenseComponent.generated.h" 6 | 7 | // Base Class for all RealSense Components 8 | // This class maintains basic camera information and common functions 9 | // that all RealSense components need, such as StartCamera and 10 | // StopCamera and setting the color and depth resolutions. 11 | UCLASS() 12 | class URealSenseComponent : public UActorComponent 13 | { 14 | GENERATED_UCLASS_BODY() 15 | 16 | // Horizontal Field of View of the RealSense RGB Camera 17 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 18 | float ColorHorizontalFOV; 19 | 20 | // Vertical Field of View of the RealSense RGB Camera 21 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 22 | float ColorVerticalFOV; 23 | 24 | // Horizontal Field of View of the RealSense Depth Camera 25 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 26 | float DepthHorizontalFOV; 27 | 28 | // Vertical Field of View of the RealSense Depth Camera 29 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 30 | float DepthVerticalFOV; 31 | 32 | // Model of the connected RealSense device (F200 or R200) 33 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 34 | ECameraModel CameraModel; 35 | 36 | // Firmware version of the connected RealSense device 37 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 38 | FString CameraFirmware; 39 | 40 | // This function initiates a RealSense camera processing thread that collects 41 | // camera data, such as raw color and depth images and middleware-specific 42 | // constructs. You should call this function after setting the color and/or depth 43 | // camera resolutions. 44 | UFUNCTION(BlueprintCallable, Category = "RealSense") 45 | void StartCamera(); 46 | 47 | // This function terminates the RealSense camera processing thread. Once terminated, 48 | // RealSense data will no longer be updated until after another call to 49 | // StartCamera(). 50 | UFUNCTION(BlueprintCallable, Category = "RealSense") 51 | void StopCamera(); 52 | 53 | // Returns true if the RealSense camera processing thread is currently running. 54 | UFUNCTION(BlueprintCallable, BlueprintPure, Category = "RealSense") 55 | bool IsCameraRunning(); 56 | 57 | // Returns the color camera resolution as an FStreamResolution object: 58 | // width, height, fps, and pixel format. 59 | UFUNCTION(BlueprintCallable, BlueprintPure, Category = "RealSense") 60 | FStreamResolution GetColorCameraResolution(); 61 | 62 | // Sets the color camera resolution from an enumerated set of resolution options. 63 | UFUNCTION(BlueprintCallable, Category = "RealSense") 64 | virtual void SetColorCameraResolution(EColorResolution resolution); 65 | 66 | // Returns the depth camera resolution as an FStreamResolution object: 67 | // width, height, fps, and pixel format. 68 | UFUNCTION(BlueprintCallable, BlueprintPure, Category = "RealSense") 69 | FStreamResolution GetDepthCameraResolution(); 70 | 71 | // Sets the depth camera resolution from an enumerated set of resolution options. 72 | UFUNCTION(BlueprintCallable, Category = "RealSense") 73 | virtual void SetDepthCameraResolution(EDepthResolution resolution); 74 | 75 | // Returns true if the combination of color and depth camera resolutions can be 76 | // used together. Call this function before setting either the color and depth 77 | // camera resolutions to ensure that there will be no errors initializing the 78 | // RealSense camera processing thread. 79 | UFUNCTION(BlueprintCallable, Category = "RealSense") 80 | bool IsStreamSetValid(EColorResolution ColorResolution, 81 | EDepthResolution DepthResolution); 82 | 83 | URealSenseComponent(); 84 | 85 | void InitializeComponent() override; 86 | 87 | void BeginPlay() override; 88 | 89 | protected: 90 | // Reference to the global RealSenseSessionmanager actor 91 | ARealSenseSessionManager* globalRealSenseSession; 92 | }; 93 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/RealSenseBlueprintLibrary.cpp: -------------------------------------------------------------------------------- 1 | #include "RealSensePluginPrivatePCH.h" 2 | #include "RealSenseBlueprintLibrary.h" 3 | 4 | URealSenseBlueprintLibrary::URealSenseBlueprintLibrary(const class FObjectInitializer& ObjInit) 5 | : Super(ObjInit) 6 | { 7 | } 8 | 9 | FString URealSenseBlueprintLibrary::EColorResolutionToString(EColorResolution value) 10 | { 11 | switch (value) { 12 | case EColorResolution::RES1: 13 | return FString("1920 x 1080 x 30"); 14 | case EColorResolution::RES2: 15 | return FString("1280 x 720 x 30"); 16 | case EColorResolution::RES3: 17 | return FString("640 x 480 x 60"); 18 | case EColorResolution::RES4: 19 | return FString("640 x 480 x 30"); 20 | case EColorResolution::RES5: 21 | return FString("320 x 240 x 60"); 22 | case EColorResolution::RES6: 23 | return FString("320 x 240 x 30"); 24 | default: 25 | return FString(" "); 26 | } 27 | } 28 | 29 | FString URealSenseBlueprintLibrary::EDepthResolutionToString(EDepthResolution value) 30 | { 31 | switch (value) { 32 | case EDepthResolution::RES1: 33 | return FString("640 x 480 x 60 (F200)"); 34 | case EDepthResolution::RES2: 35 | return FString("640 x 480 x 30 (F200)"); 36 | case EDepthResolution::RES3: 37 | return FString("628 x 468 x 90 (R200)"); 38 | case EDepthResolution::RES4: 39 | return FString("628 x 468 x 60 (R200)"); 40 | case EDepthResolution::RES5: 41 | return FString("628 x 468 x 30 (R200)"); 42 | case EDepthResolution::RES6: 43 | return FString("480 x 360 x 90 (R200)"); 44 | case EDepthResolution::RES7: 45 | return FString("480 x 360 x 60 (R200)"); 46 | case EDepthResolution::RES8: 47 | return FString("480 x 360 x 30 (R200)"); 48 | case EDepthResolution::RES9: 49 | return FString("320 x 240 x 90 (R200)"); 50 | case EDepthResolution::RES10: 51 | return FString("320 x 240 x 60 (R200)"); 52 | case EDepthResolution::RES11: 53 | return FString("320 x 240 x 30 (R200)"); 54 | default: 55 | return FString(" "); 56 | } 57 | } 58 | 59 | FString URealSenseBlueprintLibrary::ECameraModelToString(ECameraModel value) 60 | { 61 | switch (value) { 62 | case ECameraModel::F200: 63 | return FString("Front-Facing (F200)"); 64 | case ECameraModel::R200: 65 | return FString("World-Facing (R200)"); 66 | case ECameraModel::SR300: 67 | return FString("Short-Range (SR300)"); 68 | case ECameraModel::Other: 69 | return FString("Unknown Camera Model"); 70 | default: 71 | return FString(" "); 72 | } 73 | } 74 | 75 | // Copies the data from the input Buffer into the PlatformData of the Texture object. 76 | // For convenience, this function returns a pointer to the input Texture that was 77 | // modified. 78 | UTexture2D* URealSenseBlueprintLibrary::ColorBufferToTexture(const TArray& Buffer, UTexture2D* Texture) 79 | { 80 | if (Texture == nullptr) { 81 | return nullptr; 82 | } 83 | 84 | // Test that the Buffer and Texture have the same capacity 85 | if (Buffer.Num() != Texture->GetSizeX() * Texture->GetSizeY()) { 86 | return nullptr; 87 | } 88 | 89 | // The Texture's PlatformData needs to be locked before it can be modified. 90 | auto out = reinterpret_cast(Texture->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE)); 91 | 92 | // There are four bytes per pixel, one each for Red, Green, Blue, and Alpha. 93 | uint8 bytesPerPixel = 4; 94 | uint32 size = Texture->GetSizeX() * Texture->GetSizeY() * bytesPerPixel; 95 | memcpy_s(out, size, Buffer.GetData(), size); 96 | 97 | Texture->PlatformData->Mips[0].BulkData.Unlock(); 98 | Texture->UpdateResource(); 99 | 100 | return Texture; 101 | } 102 | 103 | // Copies the data from the input Buffer into the PlatformData of the Texture object. 104 | // For convenience, this function returns a pointer to the input Texture that was modified. 105 | UTexture2D* URealSenseBlueprintLibrary::DepthBufferToTexture(const TArray& Buffer, UTexture2D* Texture) 106 | { 107 | if (Texture == nullptr) { 108 | return nullptr; 109 | } 110 | 111 | // Test that the Buffer and Texture have the same capacity 112 | if (Buffer.Num() != Texture->GetSizeX() * Texture->GetSizeY()) { 113 | return nullptr; 114 | } 115 | 116 | // The Texture's PlatformData needs to be locked before it can be modified. 117 | auto out = reinterpret_cast(Texture->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE)); 118 | 119 | for (int32 x : Buffer) { 120 | // Convert the depth value (in millimeters) into a value between 0 - 255. 121 | uint8 d = ConvertDepthValueTo8Bit(x, Texture->GetSizeX()); 122 | *out++ = d; 123 | *out++ = d; 124 | *out++ = d; 125 | *out++ = 255; 126 | } 127 | 128 | Texture->PlatformData->Mips[0].BulkData.Unlock(); 129 | Texture->UpdateResource(); 130 | 131 | return Texture; 132 | } 133 | 134 | // Finds all .OBJ files in the specified Directory, relative to the Content 135 | // path of the game. 136 | TArray URealSenseBlueprintLibrary::GetMeshFiles(FString Directory) 137 | { 138 | // Ensure that the directory ends with a trailing slash 139 | if (Directory.EndsWith("/") == false) { 140 | Directory.Append("/"); 141 | } 142 | 143 | // Get the absolute path of the game's Content directory and append the 144 | // specified path to it, along with the filename. 145 | FString Dir = FPaths::GameContentDir() + Directory + TEXT("*.obj"); 146 | 147 | IFileManager& FileManager = IFileManager::Get(); 148 | TArray MeshFiles; 149 | FileManager.FindFiles(MeshFiles, *Dir, true, false); 150 | 151 | return MeshFiles; 152 | } 153 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Public/RealSenseSessionManager.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "RealSenseImpl.h" 4 | #include "RealSenseTypes.h" 5 | 6 | #include "RealSenseSessionManager.generated.h" 7 | 8 | DECLARE_DYNAMIC_MULTICAST_DELEGATE(FRealSenseNullaryDelegate); 9 | 10 | UCLASS(ClassGroup = RealSense) 11 | class ARealSenseSessionManager : public AActor 12 | { 13 | GENERATED_UCLASS_BODY() 14 | 15 | // Adds a new feature to the RealSense feature set 16 | void AddRealSenseFeature(RealSenseFeature feature); 17 | 18 | // RealSenseComponent Support 19 | 20 | // Starts the camera processing thread. 21 | void StartCamera(); 22 | 23 | // Stops the camera processing thread. 24 | void StopCamera(); 25 | 26 | // Returns true if the camera processing thread is currently executing. 27 | bool IsCameraRunning() const; 28 | 29 | // Returns true if there is a physical camera connected. 30 | bool IsCameraConnected() const; 31 | 32 | // Returns the horizontal field of view of the RealSense RGB camera. 33 | float GetColorHorizontalFOV() const; 34 | 35 | // Returns the vertical field of view of the RealSense RGB camera. 36 | float GetColorVerticalFOV() const; 37 | 38 | // Returns the horizontal field of view of the RealSense depth camera. 39 | float GetDepthHorizontalFOV() const; 40 | 41 | // Returns the vertical field of view of the RealSense depth camera. 42 | float GetDepthVerticalFOV() const; 43 | 44 | // Returns the model of the connected camera: R200, F200, or Other. 45 | ECameraModel GetCameraModel() const; 46 | 47 | // Returns the connected camera's firmware version as a human readable string. 48 | FString GetCameraFirmware() const; 49 | 50 | // Returns the user-defined resolution of the RealSense RGB camera. 51 | FStreamResolution GetColorCameraResolution() const; 52 | 53 | // Returns the width of the user-defined resolution of the RealSense RGB camera. 54 | int32 GetColorImageWidth() const; 55 | 56 | // Returns the height of the user-defined resolution of the RealSense RGB camera. 57 | int32 GetColorImageHeight() const; 58 | 59 | // Set the resolution to be used by the RealSense RGB camera. 60 | void SetColorCameraResolution(EColorResolution resolution); 61 | 62 | // Returns the user-defined resolution of the RealSense depth camera. 63 | FStreamResolution GetDepthCameraResolution() const; 64 | 65 | // Returns the width of the user-defined resolution of the RealSense depth camera. 66 | int32 GetDepthImageWidth() const; 67 | 68 | // Returns the height of the user-defined resolution of the RealSense depth camera. 69 | int32 GetDepthImageHeight() const; 70 | 71 | // Set the resolution to be used by the RealSense depth camera. 72 | void SetDepthCameraResolution(EDepthResolution resolution); 73 | 74 | // Returns true if the combination of RGB camera resolution and depth camera 75 | // resolution is valid. Validity is determined internally by the RSSDK. 76 | bool IsStreamSetValid(EColorResolution ColorResolution, EDepthResolution DepthResolution) const; 77 | 78 | // CameraStreamComponent Support 79 | 80 | // Returns a pointer to the latest frame obtained from the RealSense RGB camera. 81 | TArray GetColorBuffer() const; 82 | 83 | // Returns a pointer to the latest frame obtained from the RealSense depth camera. 84 | TArray GetDepthBuffer() const; 85 | 86 | // Scan3DComponent Support 87 | 88 | // Configures the 3D Scanning middleware. 89 | // 90 | // Scanning Modes : Face, Head, Body, Object, Variable 91 | // If you use Variable scanning mode, you must also set the scanning volume 92 | // to reflect the 3D space you wish to scan. 93 | // 94 | // If solidify is true, the mesh created by the middleware will be closed. 95 | // 96 | // If texture is true, the middleware will create a texture file along with 97 | // the mesh. If false, the mesh file will be include vertex color information. 98 | void ConfigureScanning(EScan3DMode ScanningMode, bool bSolidify, bool bTexture); 99 | 100 | // Only use this function if 3D Scanning is set to Variable mode. 101 | // Sets the bounding box of the 3D space in which you wish to scan 102 | // and the voxel resolution to use. 103 | void SetScanningVolume(FVector BoundingBox, int32 Resolution); 104 | 105 | // Instructs the 3D Scanning module to begin its attempt to scan. 106 | // Scanning will not actually begin until internal pre-requisites of the 107 | // scanning module are satisfied, such as the presence of a minimum 108 | // amount of geometry. 109 | void StartScanning(); 110 | 111 | // Instructs the 3D Scanning module to stop scanning. 112 | void StopScanning(); 113 | 114 | // Saves the scanned data to a file with the specified format and filename. 115 | // Currently only the OBJ format is supported. 116 | void SaveScan(EScan3DFileFormat SaveFileFormat, FString filename); 117 | 118 | // Returns true if the 3D scanning module is currently scanning. 119 | bool IsScanning() const; 120 | 121 | // Returns the middleware-defined resolution used by the 3D scanning module. 122 | FStreamResolution GetScan3DResolution() const; 123 | 124 | // Returns the width of the middleware-defined resolution used by the 125 | // 3D scanning module. 126 | int32 GetScan3DImageWidth() const; 127 | 128 | // Returns the height of the middleware-defined resolution used by the 129 | // 3D scanning module. 130 | int32 GetScan3DImageHeight() const; 131 | 132 | // Returns a pointer to the latest frame obtained from the 3D scanning 133 | // module, representing a preview of the current scanning progress. 134 | TArray GetScanBuffer() const; 135 | 136 | // Returns true if the resolution of the 3D scanning module has changed. 137 | bool HasScan3DImageSizeChanged() const; 138 | 139 | // Returns true when the 3D scanning module finishes saving a scan. 140 | bool HasScanCompleted() const; 141 | 142 | ARealSenseSessionManager(); 143 | 144 | virtual void BeginPlay() override; 145 | 146 | virtual void Tick(float DeltaSeconds) override; 147 | 148 | private: 149 | std::unique_ptr impl; 150 | 151 | uint8 RealSenseFeatureSet; 152 | 153 | TArray ColorBuffer; 154 | TArray DepthBuffer; 155 | TArray ScanBuffer; 156 | }; 157 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/RealSenseSessionManager.cpp: -------------------------------------------------------------------------------- 1 | #include "RealSensePluginPrivatePCH.h" 2 | #include "RealSenseSessionManager.h" 3 | 4 | // Initialized the feature set to 0 (no features enabled) and creates a new 5 | // RealSenseImpl object. 6 | ARealSenseSessionManager::ARealSenseSessionManager(const class FObjectInitializer& Init) 7 | : Super(Init) 8 | { 9 | PrimaryActorTick.bCanEverTick = true; 10 | 11 | RealSenseFeatureSet = 0; 12 | 13 | impl = std::unique_ptr(new RealSenseImpl()); 14 | } 15 | 16 | // Enable the current set of specified features 17 | void ARealSenseSessionManager::BeginPlay() 18 | { 19 | impl->EnableRealSenseFeatures(RealSenseFeatureSet); 20 | } 21 | 22 | // Grab a new frame of RealSense data and process it based on the current 23 | // set of enabled features. 24 | void ARealSenseSessionManager::Tick(float DeltaTime) 25 | { 26 | Super::Tick(DeltaTime); 27 | 28 | if (impl->IsCameraThreadRunning() == false) { 29 | return; 30 | } 31 | 32 | // Grab the next frame of RealSense data 33 | impl->SwapFrames(); 34 | 35 | if (RealSenseFeatureSet & RealSenseFeature::CAMERA_STREAMING) { 36 | // Update the ColorBuffer 37 | const uint8 bytesPerPixel = 4; 38 | const uint32 ColorImageSize = impl->GetColorImageWidth() * impl->GetColorImageHeight() * bytesPerPixel; 39 | FMemory::Memcpy(ColorBuffer.GetData(), impl->GetColorBuffer(), ColorImageSize); 40 | 41 | // Update the DepthBuffer 42 | DepthBuffer.Empty(); 43 | const uint32 DepthImageSize = impl->GetDepthImageWidth() * impl->GetDepthImageHeight(); 44 | for (auto it = impl->GetDepthBuffer(), end = it + DepthImageSize; it != end; it++) { 45 | DepthBuffer.Add(*it); 46 | } 47 | } 48 | 49 | if (RealSenseFeatureSet & RealSenseFeature::SCAN_3D) { 50 | const uint8 bytesPerPixel = 4; 51 | const uint32 Scan3DImageSize = impl->GetScan3DImageWidth() * impl->GetScan3DImageHeight(); 52 | if (impl->HasScan3DImageSizeChanged()) { 53 | ScanBuffer.SetNumUninitialized(Scan3DImageSize); 54 | } 55 | 56 | // Update the ScanBuffer 57 | if (ScanBuffer.Num() == Scan3DImageSize) { 58 | FMemory::Memcpy(ScanBuffer.GetData(), impl->GetScanBuffer(), Scan3DImageSize * bytesPerPixel); 59 | } 60 | } 61 | } 62 | 63 | void ARealSenseSessionManager::AddRealSenseFeature(RealSenseFeature feature) 64 | { 65 | RealSenseFeatureSet |= feature; 66 | } 67 | 68 | bool ARealSenseSessionManager::IsCameraConnected() const 69 | { 70 | return impl->IsCameraConnected(); 71 | } 72 | 73 | bool ARealSenseSessionManager::IsCameraRunning() const 74 | { 75 | return impl->IsCameraThreadRunning(); 76 | } 77 | 78 | void ARealSenseSessionManager::StartCamera() 79 | { 80 | impl->StartCamera(); 81 | } 82 | 83 | void ARealSenseSessionManager::StopCamera() 84 | { 85 | impl->StopCamera(); 86 | } 87 | 88 | int32 ARealSenseSessionManager::GetColorImageWidth() const 89 | { 90 | return impl->GetColorImageWidth(); 91 | } 92 | 93 | int32 ARealSenseSessionManager::GetColorImageHeight() const 94 | { 95 | return impl->GetColorImageHeight(); 96 | } 97 | 98 | int32 ARealSenseSessionManager::GetDepthImageWidth() const 99 | { 100 | return impl->GetDepthImageWidth(); 101 | } 102 | 103 | int32 ARealSenseSessionManager::GetDepthImageHeight() const 104 | { 105 | return impl->GetDepthImageHeight(); 106 | } 107 | 108 | int32 ARealSenseSessionManager::GetScan3DImageWidth() const 109 | { 110 | return impl->GetScan3DImageWidth(); 111 | } 112 | 113 | int32 ARealSenseSessionManager::GetScan3DImageHeight() const 114 | { 115 | return impl->GetScan3DImageHeight(); 116 | } 117 | 118 | float ARealSenseSessionManager::GetColorHorizontalFOV() const 119 | { 120 | return impl->GetColorHorizontalFOV(); 121 | } 122 | 123 | float ARealSenseSessionManager::GetColorVerticalFOV() const 124 | { 125 | return impl->GetColorVerticalFOV(); 126 | } 127 | 128 | float ARealSenseSessionManager::GetDepthHorizontalFOV() const 129 | { 130 | return impl->GetDepthHorizontalFOV(); 131 | } 132 | 133 | float ARealSenseSessionManager::GetDepthVerticalFOV() const 134 | { 135 | return impl->GetDepthVerticalFOV(); 136 | } 137 | 138 | ECameraModel ARealSenseSessionManager::GetCameraModel() const 139 | { 140 | return impl->GetCameraModel(); 141 | } 142 | 143 | FString ARealSenseSessionManager::GetCameraFirmware() const 144 | { 145 | return impl->GetCameraFirmware(); 146 | } 147 | 148 | // Sets the color camera resolution and resizes the ColorBuffer to match 149 | void ARealSenseSessionManager::SetColorCameraResolution(EColorResolution resolution) 150 | { 151 | impl->SetColorCameraResolution(resolution); 152 | ColorBuffer.SetNumUninitialized(impl->GetColorImageWidth() * impl->GetColorImageHeight()); 153 | } 154 | 155 | void ARealSenseSessionManager::SetDepthCameraResolution(EDepthResolution resolution) 156 | { 157 | impl->SetDepthCameraResolution(resolution); 158 | } 159 | 160 | FStreamResolution ARealSenseSessionManager::GetColorCameraResolution() const 161 | { 162 | return impl->GetColorCameraResolution(); 163 | } 164 | 165 | FStreamResolution ARealSenseSessionManager::GetDepthCameraResolution() const 166 | { 167 | return impl->GetDepthCameraResolution(); 168 | } 169 | 170 | bool ARealSenseSessionManager::IsStreamSetValid(EColorResolution ColorResolution, EDepthResolution DepthResolution) const 171 | { 172 | return impl->IsStreamSetValid(ColorResolution, DepthResolution); 173 | } 174 | 175 | TArray ARealSenseSessionManager::GetColorBuffer() const 176 | { 177 | return ColorBuffer; 178 | } 179 | 180 | TArray ARealSenseSessionManager::GetDepthBuffer() const 181 | { 182 | return DepthBuffer; 183 | } 184 | 185 | TArray ARealSenseSessionManager::GetScanBuffer() const 186 | { 187 | return ScanBuffer; 188 | } 189 | 190 | void ARealSenseSessionManager::ConfigureScanning(EScan3DMode ScanningMode, bool bSolidify, bool bTexture) 191 | { 192 | impl->ConfigureScanning(ScanningMode, bSolidify, bTexture); 193 | } 194 | 195 | void ARealSenseSessionManager::StartScanning() 196 | { 197 | impl->StartScanning(); 198 | } 199 | 200 | void ARealSenseSessionManager::StopScanning() 201 | { 202 | impl->StopScanning(); 203 | } 204 | 205 | void ARealSenseSessionManager::SaveScan(EScan3DFileFormat SaveFileFormat, FString Filename) 206 | { 207 | impl->SaveScan(SaveFileFormat, Filename); 208 | } 209 | 210 | void ARealSenseSessionManager::SetScanningVolume(FVector BoundingBox, int32 Resolution) 211 | { 212 | impl->SetScanningVolume(BoundingBox, Resolution); 213 | } 214 | 215 | bool ARealSenseSessionManager::IsScanning() const 216 | { 217 | return impl->IsScanning(); 218 | } 219 | 220 | bool ARealSenseSessionManager::HasScan3DImageSizeChanged() const 221 | { 222 | return impl->HasScan3DImageSizeChanged(); 223 | } 224 | 225 | bool ARealSenseSessionManager::HasScanCompleted() const 226 | { 227 | return impl->HasScanCompleted(); 228 | } 229 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/RealSenseImpl.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "AllowWindowsPlatformTypes.h" 4 | #include 5 | #include 6 | #include "HideWindowsPlatformTypes.h" 7 | 8 | #include "CoreMisc.h" 9 | #include "RealSenseTypes.h" 10 | #include "RealSenseUtils.h" 11 | #include "RealSenseBlueprintLibrary.h" 12 | #include "PXCSenseManager.h" 13 | 14 | // Stores all relevant data computed from one frame of RealSense camera data. 15 | // Advice: Use this structure in a multiple-buffer configuration to share 16 | // RealSense data between threads. 17 | // Example usage: 18 | // Thread 1: Process camera data and populate background_frame 19 | // Swap background_frame with mid_frame 20 | // Thread 2: Swap mid_frame with foreground_frame 21 | // Read data from foreground_frame 22 | struct RealSenseDataFrame { 23 | uint64 number; // Stores an ID for the frame based on its occurrence in time 24 | TArray colorImage; // Container for the camera's raw color stream data 25 | TArray depthImage; // Container for the camera's raw depth stream data 26 | TArray scanImage; // Container for the scan preview image provided by the 3DScan middleware 27 | 28 | RealSenseDataFrame() : number(0) {} 29 | }; 30 | 31 | // Implements the functionality of the Intel(R) RealSense(TM) SDK and associated 32 | // middleware modules as used by the RealSenseSessionManager Actor class. 33 | // 34 | // NOTE: Some function declarations do not have a function comment because the 35 | // comment is written in RealSenseSessionManager.h. 36 | class RealSenseImpl { 37 | public: 38 | // Creates a new RealSense Session and queries physical device information. 39 | RealSenseImpl(); 40 | 41 | // Terminates the camera processing thread and releases handles to Core SDK objects. 42 | ~RealSenseImpl(); 43 | 44 | // Performs RealSense Core and Middleware processing based on the enabled 45 | // feature set. 46 | // 47 | // This function is meant to be run on its own thread to minimize the 48 | // performance impact on the game thread. 49 | void CameraThread(); 50 | 51 | void StartCamera(); 52 | 53 | void StopCamera(); 54 | 55 | // Swaps the data frames to load the latest processed data into the 56 | // foreground frame. 57 | void SwapFrames(); 58 | 59 | inline bool IsCameraThreadRunning() const { return bCameraThreadRunning; } 60 | 61 | // Core SDK Support 62 | 63 | // Enables the middleware specified by the input feature set and creates 64 | // handles to the necessary RSSDK objects. 65 | void EnableRealSenseFeatures(uint32 featureSet); 66 | 67 | inline bool IsCameraConnected() const { return (senseManager->IsConnected() != 0); } 68 | 69 | inline float GetColorHorizontalFOV() const { return colorHorizontalFOV; } 70 | 71 | inline float GetColorVerticalFOV() const { return colorVerticalFOV; } 72 | 73 | inline float GetDepthHorizontalFOV() const { return depthHorizontalFOV; } 74 | 75 | inline float GetDepthVerticalFOV() const { return depthVerticalFOV; } 76 | 77 | const ECameraModel GetCameraModel() const; 78 | 79 | const FString GetCameraFirmware() const; 80 | 81 | inline FStreamResolution GetColorCameraResolution() const { return colorResolution; } 82 | 83 | inline int32 GetColorImageWidth() const { return colorResolution.width; } 84 | 85 | inline int32 GetColorImageHeight() const { return colorResolution.height; } 86 | 87 | void SetColorCameraResolution(EColorResolution resolution); 88 | 89 | inline FStreamResolution GetDepthCameraResolution() const { return depthResolution; } 90 | 91 | inline int32 GetDepthImageWidth() const { return depthResolution.width; } 92 | 93 | inline int32 GetDepthImageHeight() const { return depthResolution.height; } 94 | 95 | void SetDepthCameraResolution(EDepthResolution resolution); 96 | 97 | bool IsStreamSetValid(EColorResolution ColorResolution, EDepthResolution DepthResolution) const; 98 | 99 | inline const uint8* GetColorBuffer() const { return fgFrame->colorImage.GetData(); } 100 | 101 | inline const uint16* GetDepthBuffer() const { return fgFrame->depthImage.GetData(); } 102 | 103 | // 3D Scanning Module Support 104 | 105 | void ConfigureScanning(EScan3DMode scanningMode, bool bSolidify, bool bTexture); 106 | 107 | void SetScanningVolume(FVector boundingBox, int32 resolution); 108 | 109 | void StartScanning(); 110 | 111 | void StopScanning(); 112 | 113 | void SaveScan(EScan3DFileFormat saveFileFormat, const FString& filename); 114 | 115 | inline bool IsScanning() const { return (p3DScan->IsScanning() != 0); } 116 | 117 | inline FStreamResolution GetScan3DResolution() const { return scan3DResolution; } 118 | 119 | inline int32 GetScan3DImageWidth() const { return scan3DResolution.width; } 120 | 121 | inline int32 GetScan3DImageHeight() const { return scan3DResolution.height; } 122 | 123 | inline const uint8* GetScanBuffer() const { return fgFrame->scanImage.GetData(); } 124 | 125 | inline bool HasScan3DImageSizeChanged() const { return bScan3DImageSizeChanged; } 126 | 127 | inline bool HasScanCompleted() const { return bScanCompleted; } 128 | 129 | private: 130 | // Core SDK handles 131 | 132 | struct RealSenseDeleter { 133 | void operator()(PXCSession* s) { s->Release(); } 134 | void operator()(PXCSenseManager* sm) { sm->Release(); } 135 | void operator()(PXCCapture* c) { c->Release(); } 136 | void operator()(PXCCapture::Device* d) { d->Release(); } 137 | void operator()(PXC3DScan* sc) { ; } 138 | }; 139 | 140 | std::unique_ptr session; 141 | std::unique_ptr senseManager; 142 | std::unique_ptr capture; 143 | std::unique_ptr device; 144 | 145 | PXCCapture::DeviceInfo deviceInfo; 146 | pxcStatus status; // Status ID used by RSSDK functions 147 | 148 | // SDK Module handles 149 | 150 | std::unique_ptr p3DScan; 151 | 152 | // Feature set constructed as the logical OR of RealSenseFeatures 153 | uint32 RealSenseFeatureSet; 154 | 155 | std::atomic_bool bColorStreamingEnabled; 156 | std::atomic_bool bDepthStreamingEnabled; 157 | std::atomic_bool bScan3DEnabled; 158 | 159 | // Camera processing members 160 | 161 | std::thread cameraThread; 162 | std::atomic_bool bCameraThreadRunning; 163 | 164 | std::unique_ptr fgFrame; 165 | std::unique_ptr midFrame; 166 | std::unique_ptr bgFrame; 167 | 168 | // Mutex for locking access to the midFrame 169 | std::mutex midFrameMutex; 170 | 171 | // Core SDK members 172 | 173 | FStreamResolution colorResolution; 174 | FStreamResolution depthResolution; 175 | 176 | float colorHorizontalFOV; 177 | float colorVerticalFOV; 178 | float depthHorizontalFOV; 179 | float depthVerticalFOV; 180 | 181 | // 3D Scan members 182 | 183 | FStreamResolution scan3DResolution; 184 | 185 | PXC3DScan::FileFormat scan3DFileFormat; 186 | FString scan3DFilename; 187 | 188 | std::atomic_bool bScanStarted; 189 | std::atomic_bool bScanStopped; 190 | std::atomic_bool bReconstructEnabled; 191 | std::atomic_bool bScanCompleted; 192 | std::atomic_bool bScan3DImageSizeChanged; 193 | 194 | // Helper Functions 195 | 196 | void UpdateScan3DImageSize(PXCImage::ImageInfo info); 197 | }; 198 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/RealSenseUtils.cpp: -------------------------------------------------------------------------------- 1 | #include "RealSensePluginPrivatePCH.h" 2 | #include "RealSenseUtils.h" 3 | 4 | DEFINE_LOG_CATEGORY(RealSensePlugin); 5 | 6 | // Shuffles the input Vector's coordinates around to convert it 7 | // to Unreal world space. 8 | FVector ConvertRSVectorToUnreal(FVector v) 9 | { 10 | return FVector(v.Z, v.X, -v.Y); 11 | } 12 | 13 | // Maps the depth value to a number between 0 - 255 so it can 14 | // be represented as an 8-bit color. 15 | uint8 ConvertDepthValueTo8Bit(int32 depth, int32 width) 16 | { 17 | // The F200 and R200 cameras support different maximum depths. 18 | float max_depth = 0.0f; 19 | if (width == 640) { 20 | max_depth = 1000.0f; // 1 meter 21 | } 22 | else { 23 | max_depth = 3000.0f; // 3 meters 24 | } 25 | 26 | // A depth value of 0 indicates no data available. 27 | // This value will be mapped to the color black. 28 | if ((depth == 0) || (depth > max_depth)) { 29 | return 0; 30 | } 31 | 32 | return (255 * ((max_depth - depth) / max_depth)); 33 | } 34 | 35 | PXCImage::PixelFormat GetPXCPixelFormat(ERealSensePixelFormat format) 36 | { 37 | switch (format) { 38 | case ERealSensePixelFormat::COLOR_RGB32: 39 | return PXCImage::PixelFormat::PIXEL_FORMAT_RGB32; 40 | case ERealSensePixelFormat::DEPTH_G16_MM: 41 | return PXCImage::PixelFormat::PIXEL_FORMAT_DEPTH; 42 | default: 43 | return PXCImage::PixelFormat::PIXEL_FORMAT_ANY; 44 | } 45 | } 46 | 47 | PXC3DScan::ScanningMode GetPXCScanningMode(EScan3DMode mode) 48 | { 49 | switch (mode) { 50 | case EScan3DMode::OBJECT: 51 | return PXC3DScan::ScanningMode::OBJECT_ON_PLANAR_SURFACE_DETECTION; 52 | case EScan3DMode::FACE: 53 | return PXC3DScan::ScanningMode::FACE; 54 | default: 55 | return PXC3DScan::ScanningMode::FACE; 56 | } 57 | } 58 | 59 | PXC3DScan::FileFormat GetPXCScanFileFormat(EScan3DFileFormat format) 60 | { 61 | switch (format) { 62 | case EScan3DFileFormat::OBJ: 63 | return PXC3DScan::FileFormat::OBJ; 64 | default: 65 | return PXC3DScan::FileFormat::OBJ; 66 | } 67 | } 68 | 69 | // Extracts the width, height, and fps values from each enumerated resolution. 70 | // Note: The only color pixel format currently supported is RGB32. 71 | FStreamResolution GetEColorResolutionValue(EColorResolution res) 72 | { 73 | FStreamResolution resolution = {}; 74 | switch (res) { 75 | case EColorResolution::RES1: 76 | return{ 1920, 1080, 30.0f, ERealSensePixelFormat::COLOR_RGB32 }; 77 | case EColorResolution::RES2: 78 | return{ 1280, 720, 30.0f, ERealSensePixelFormat::COLOR_RGB32 }; 79 | case EColorResolution::RES3: 80 | return{ 640, 480, 60.0f, ERealSensePixelFormat::COLOR_RGB32 }; 81 | case EColorResolution::RES4: 82 | return{ 640, 480, 30.0f, ERealSensePixelFormat::COLOR_RGB32 }; 83 | case EColorResolution::RES5: 84 | return{ 320, 240, 60.0f, ERealSensePixelFormat::COLOR_RGB32 }; 85 | case EColorResolution::RES6: 86 | return{ 320, 240, 30.0f, ERealSensePixelFormat::COLOR_RGB32 }; 87 | default: 88 | return{ 0, 0, 0.0f, ERealSensePixelFormat::PIXEL_FORMAT_ANY }; 89 | } 90 | } 91 | 92 | // Extracts the width, height, and fps values from each enumerated resolution. 93 | // Note: The only depth pixel format currently supported is 16-bit grayscale. 94 | FStreamResolution GetEDepthResolutionValue(EDepthResolution res) 95 | { 96 | FStreamResolution resolution = {}; 97 | switch (res) { 98 | case EDepthResolution::RES1: 99 | return{ 640, 480, 60.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 100 | case EDepthResolution::RES2: 101 | return{ 640, 480, 30.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 102 | case EDepthResolution::RES3: 103 | return{ 628, 468, 90.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 104 | case EDepthResolution::RES4: 105 | return{ 628, 468, 60.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 106 | case EDepthResolution::RES5: 107 | return{ 628, 468, 30.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 108 | case EDepthResolution::RES6: 109 | return{ 480, 360, 90.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 110 | case EDepthResolution::RES7: 111 | return{ 480, 360, 60.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 112 | case EDepthResolution::RES8: 113 | return{ 480, 360, 30.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 114 | case EDepthResolution::RES9: 115 | return{ 320, 240, 90.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 116 | case EDepthResolution::RES10: 117 | return{ 320, 240, 60.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 118 | case EDepthResolution::RES11: 119 | return{ 320, 240, 30.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 120 | default: 121 | return{ 0, 0, 0.0f, ERealSensePixelFormat::PIXEL_FORMAT_ANY }; 122 | } 123 | } 124 | 125 | // Original function borrowed from RSSDK sp_glut_utils.h 126 | // Copies the data from the PXCImage into the input data buffer. 127 | void CopyColorImageToBuffer(PXCImage* image, TArray& data, const uint32 width, const uint32 height) 128 | { 129 | // Extracts the raw data from the PXCImage object. 130 | PXCImage::ImageData imageData; 131 | pxcStatus result = image->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::PIXEL_FORMAT_RGB24, &imageData); 132 | if (result != PXC_STATUS_NO_ERROR) { 133 | return; 134 | } 135 | 136 | uint32 i = 0; 137 | for (uint32 y = 0; y < height; ++y) { 138 | // color points to one row of color image data. 139 | const pxcBYTE* color = imageData.planes[0] + (imageData.pitches[0] * y); 140 | for (uint32 x = 0; x < width; ++x, color += 3) { 141 | data[i++] = color[0]; 142 | data[i++] = color[1]; 143 | data[i++] = color[2]; 144 | data[i++] = 0xff; // alpha = 255 145 | } 146 | } 147 | 148 | image->ReleaseAccess(&imageData); 149 | } 150 | 151 | // Original function borrowed from RSSDK sp_glut_utils.h 152 | // Copies the data from the PXCImage into the input data buffer. 153 | void CopyDepthImageToBuffer(PXCImage* image, TArray& data, const uint32 width, const uint32 height) 154 | { 155 | // Extracts the raw data from the PXCImage object. 156 | PXCImage::ImageData imageData; 157 | pxcStatus result = image->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::PIXEL_FORMAT_DEPTH, &imageData); 158 | if (result != PXC_STATUS_NO_ERROR) 159 | return; 160 | 161 | const uint32 numBytes = width * sizeof(uint16); 162 | 163 | uint32 i = 0; 164 | for (uint32 y = 0; y < height; ++y) { 165 | // depth points to one row of depth image data. 166 | const pxcBYTE* depth = imageData.planes[0] + (imageData.pitches[0] * y); 167 | for (uint32 x = 0; x < width; ++x, depth += 2) { 168 | data[i++] = *depth; 169 | } 170 | } 171 | 172 | image->ReleaseAccess(&imageData); 173 | } 174 | 175 | void LoadMeshFile(const FString& filename, TArray& Vertices, TArray& Triangles, TArray& Colors) 176 | { 177 | // TODO: Check if Reserving Lines ahead of time is faster 178 | TArray Lines; 179 | if (FFileHelper::LoadANSITextFileToStrings(filename.GetCharArray().GetData(), NULL, Lines) == false) 180 | return; 181 | 182 | Vertices.Empty(); 183 | Triangles.Empty(); 184 | Colors.Empty(); 185 | 186 | float x = 0.0f; 187 | float y = 0.0f; 188 | float z = 0.0f; 189 | float r = 0.0f; 190 | float g = 0.0f; 191 | float b = 0.0f; 192 | 193 | int v1 = 0; 194 | int v2 = 0; 195 | int v3 = 0; 196 | 197 | TArray Tokens; 198 | 199 | for (FString Line : Lines) { 200 | if (Line.IsEmpty()) { 201 | continue; 202 | } 203 | else if (Line[0] == 'v') { 204 | if (Line[1] == ' ') { 205 | Tokens.Empty(); 206 | Line.ParseIntoArrayWS(Tokens, L"", true); 207 | x = FCString::Atof(*(Tokens[1])); 208 | y = FCString::Atof(*(Tokens[2])); 209 | z = FCString::Atof(*(Tokens[3])); 210 | r = FCString::Atof(*(Tokens[4])); 211 | g = FCString::Atof(*(Tokens[5])); 212 | b = FCString::Atof(*(Tokens[6])); 213 | Vertices.Add(ConvertRSVectorToUnreal(FVector(x, y, z)) * 150); 214 | Colors.Add(FColor((uint8)(r * 255), (uint8)(g * 255), (uint8)(b * 255))); 215 | } 216 | } 217 | else if (Line[0] == 'f') { 218 | Tokens.Empty(); 219 | Line.ParseIntoArrayWS(Tokens, L"//", true); 220 | // Need to subtract 1 from the vertex indices because .OBJ files start indexing them at at 1, not 0 221 | v1 = FCString::Atoi(*(Tokens[1])); 222 | v2 = FCString::Atoi(*(Tokens[3])); 223 | v3 = FCString::Atoi(*(Tokens[5])); 224 | Triangles.Add(v1 - 1); 225 | Triangles.Add(v2 - 1); 226 | Triangles.Add(v3 - 1); 227 | } 228 | } 229 | 230 | FVector MeshCenter = FVector(0.0f, 0.0f, 0.0f); 231 | for (FVector Vert : Vertices) { 232 | MeshCenter += Vert; 233 | } 234 | 235 | MeshCenter /= Vertices.Num(); 236 | 237 | for (int i = 0; i < Vertices.Num(); i++) { 238 | Vertices[i] -= MeshCenter; 239 | } 240 | } 241 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/RealSenseImpl.cpp: -------------------------------------------------------------------------------- 1 | #include "RealSensePluginPrivatePCH.h" 2 | #include "RealSenseImpl.h" 3 | 4 | // Creates handles to the RealSense Session and SenseManager and iterates over 5 | // all video capture devices to find a RealSense camera. 6 | // 7 | // Creates three RealSenseDataFrames (background, mid, and foreground) to 8 | // share RealSense data between the camera processing thread and the main thread. 9 | RealSenseImpl::RealSenseImpl() 10 | { 11 | session = std::unique_ptr(PXCSession::CreateInstance()); 12 | assert(session != nullptr); 13 | 14 | senseManager = std::unique_ptr(session->CreateSenseManager()); 15 | assert(senseManager != nullptr); 16 | 17 | capture = std::unique_ptr(nullptr); 18 | device = std::unique_ptr(nullptr); 19 | deviceInfo = {}; 20 | 21 | // Loop through video capture devices to find a RealSense Camera 22 | PXCSession::ImplDesc desc1 = {}; 23 | desc1.group = PXCSession::IMPL_GROUP_SENSOR; 24 | desc1.subgroup = PXCSession::IMPL_SUBGROUP_VIDEO_CAPTURE; 25 | for (int m = 0; ; m++) { 26 | if (device) 27 | break; 28 | 29 | PXCSession::ImplDesc desc2 = {}; 30 | if (session->QueryImpl(&desc1, m, &desc2) != PXC_STATUS_NO_ERROR) 31 | break; 32 | 33 | PXCCapture* tmp; 34 | if (session->CreateImpl(&desc2, &tmp) != PXC_STATUS_NO_ERROR) 35 | continue; 36 | capture.reset(tmp); 37 | 38 | for (int j = 0; ; j++) { 39 | if (capture->QueryDeviceInfo(j, &deviceInfo) != PXC_STATUS_NO_ERROR) 40 | break; 41 | 42 | if ((deviceInfo.model == PXCCapture::DeviceModel::DEVICE_MODEL_F200) || 43 | (deviceInfo.model == PXCCapture::DeviceModel::DEVICE_MODEL_R200) || 44 | (deviceInfo.model == PXCCapture::DeviceModel::DEVICE_MODEL_R200_ENHANCED) || 45 | (deviceInfo.model == PXCCapture::DeviceModel::DEVICE_MODEL_SR300)) { 46 | device = std::unique_ptr(capture->CreateDevice(j)); 47 | } 48 | } 49 | } 50 | 51 | p3DScan = std::unique_ptr(nullptr); 52 | 53 | RealSenseFeatureSet = 0; 54 | bColorStreamingEnabled = false; 55 | bDepthStreamingEnabled = false; 56 | bScan3DEnabled = false; 57 | 58 | bCameraThreadRunning = false; 59 | 60 | fgFrame = std::unique_ptr(new RealSenseDataFrame()); 61 | midFrame = std::unique_ptr(new RealSenseDataFrame()); 62 | bgFrame = std::unique_ptr(new RealSenseDataFrame()); 63 | 64 | colorResolution = {}; 65 | depthResolution = {}; 66 | 67 | if (device == nullptr) { 68 | colorHorizontalFOV = 0.0f; 69 | colorVerticalFOV = 0.0f; 70 | depthHorizontalFOV = 0.0f; 71 | depthVerticalFOV = 0.0f; 72 | } 73 | else { 74 | PXCPointF32 cfov = device->QueryColorFieldOfView(); 75 | colorHorizontalFOV = cfov.x; 76 | colorVerticalFOV = cfov.y; 77 | 78 | PXCPointF32 dfov = device->QueryDepthFieldOfView(); 79 | depthHorizontalFOV = dfov.x; 80 | depthVerticalFOV = dfov.y; 81 | } 82 | 83 | scan3DResolution = {}; 84 | scan3DFileFormat = PXC3DScan::FileFormat::OBJ; 85 | 86 | bScanStarted = false; 87 | bScanStopped = false; 88 | bReconstructEnabled = false; 89 | bScanCompleted = false; 90 | bScan3DImageSizeChanged = false; 91 | } 92 | 93 | // Terminate the camera thread and release the Core SDK handles. 94 | // SDK Module handles are handled internally and should not be released manually. 95 | RealSenseImpl::~RealSenseImpl() 96 | { 97 | if (bCameraThreadRunning) { 98 | bCameraThreadRunning = false; 99 | cameraThread.join(); 100 | } 101 | } 102 | 103 | // Camera Processing Thread 104 | // Initialize the RealSense SenseManager and initiate camera processing loop: 105 | // Step 1: Acquire new camera frame 106 | // Step 2: Load shared settings 107 | // Step 3: Perform Core SDK and middleware processing and store results 108 | // in background RealSenseDataFrame 109 | // Step 4: Swap the background and mid RealSenseDataFrames 110 | void RealSenseImpl::CameraThread() 111 | { 112 | uint64 currentFrame = 0; 113 | 114 | fgFrame->number = 0; 115 | midFrame->number = 0; 116 | bgFrame->number = 0; 117 | 118 | pxcStatus status = senseManager->Init(); 119 | RS_LOG_STATUS(status, "SenseManager Initialized") 120 | 121 | assert(status == PXC_STATUS_NO_ERROR); 122 | 123 | while (bCameraThreadRunning == true) { 124 | // Acquires new camera frame 125 | status = senseManager->AcquireFrame(true); 126 | assert(status == PXC_STATUS_NO_ERROR); 127 | 128 | bgFrame->number = ++currentFrame; 129 | 130 | PXCCapture::Sample* sample = senseManager->QuerySample(); 131 | 132 | // Performs Core SDK and middleware processing and store results 133 | // in background RealSenseDataFrame 134 | if (bColorStreamingEnabled) { 135 | if (sample->color) { 136 | CopyColorImageToBuffer(sample->color, bgFrame->colorImage, colorResolution.width, colorResolution.height); 137 | } 138 | } 139 | 140 | if (bDepthStreamingEnabled) { 141 | if (sample->depth) { 142 | CopyDepthImageToBuffer(sample->depth, bgFrame->depthImage, depthResolution.width, depthResolution.height); 143 | } 144 | } 145 | 146 | if (bScan3DEnabled) { 147 | if (bScanStarted) { 148 | PXC3DScan::Configuration config = p3DScan->QueryConfiguration(); 149 | config.startScan = true; 150 | p3DScan->SetConfiguration(config); 151 | bScanStarted = false; 152 | } 153 | 154 | if (bScanStopped) { 155 | PXC3DScan::Configuration config = p3DScan->QueryConfiguration(); 156 | config.startScan = false; 157 | p3DScan->SetConfiguration(config); 158 | bScanStopped = false; 159 | } 160 | 161 | PXCImage* scanImage = p3DScan->AcquirePreviewImage(); 162 | if (scanImage) { 163 | UpdateScan3DImageSize(scanImage->QueryInfo()); 164 | CopyColorImageToBuffer(scanImage, bgFrame->scanImage, scan3DResolution.width, scan3DResolution.height); 165 | scanImage->Release(); 166 | } 167 | 168 | if (bReconstructEnabled) { 169 | status = p3DScan->Reconstruct(scan3DFileFormat, scan3DFilename.GetCharArray().GetData()); 170 | bReconstructEnabled = false; 171 | bScanCompleted = true; 172 | } 173 | } 174 | 175 | senseManager->ReleaseFrame(); 176 | 177 | // Swaps background and mid RealSenseDataFrames 178 | std::unique_lock lockIntermediate(midFrameMutex); 179 | bgFrame.swap(midFrame); 180 | } 181 | } 182 | 183 | // If it is not already running, starts a new camera processing thread 184 | void RealSenseImpl::StartCamera() 185 | { 186 | if (bCameraThreadRunning == false) { 187 | bCameraThreadRunning = true; 188 | cameraThread = std::thread([this]() { CameraThread(); }); 189 | } 190 | } 191 | 192 | // If there is a camera processing thread running, this function terminates it. 193 | // Then it resets the SenseManager pipeline (by closing it and re-enabling the 194 | // previously specified feature set). 195 | void RealSenseImpl::StopCamera() 196 | { 197 | if (bCameraThreadRunning) { 198 | bCameraThreadRunning = false; 199 | cameraThread.join(); 200 | } 201 | senseManager->Close(); 202 | EnableRealSenseFeatures(RealSenseFeatureSet); 203 | } 204 | 205 | // Swaps the mid and foreground RealSenseDataFrames. 206 | void RealSenseImpl::SwapFrames() 207 | { 208 | std::unique_lock lock(midFrameMutex); 209 | if (fgFrame->number < midFrame->number) { 210 | fgFrame.swap(midFrame); 211 | } 212 | } 213 | 214 | // Enables the specified Core SDK and middleware modules and creates handles 215 | // to the related SDK objects. 216 | void RealSenseImpl::EnableRealSenseFeatures(uint32 featureSet) 217 | { 218 | if (device == nullptr) { 219 | GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Red, 220 | TEXT("No RealSense Camera Detected")); 221 | } 222 | 223 | RealSenseFeatureSet = featureSet; 224 | if (featureSet & RealSenseFeature::CAMERA_STREAMING) { 225 | bColorStreamingEnabled = true; 226 | bDepthStreamingEnabled = true; 227 | } 228 | if (featureSet & RealSenseFeature::SCAN_3D) { 229 | senseManager->Enable3DScan(); 230 | p3DScan = std::unique_ptr(senseManager->Query3DScan()); 231 | bScan3DEnabled = true; 232 | } 233 | } 234 | 235 | // Returns the connceted device's model as a Blueprintable enum value. 236 | const ECameraModel RealSenseImpl::GetCameraModel() const 237 | { 238 | switch (deviceInfo.model) { 239 | case PXCCapture::DeviceModel::DEVICE_MODEL_F200: 240 | return ECameraModel::F200; 241 | case PXCCapture::DeviceModel::DEVICE_MODEL_R200: 242 | case PXCCapture::DeviceModel::DEVICE_MODEL_R200_ENHANCED: 243 | return ECameraModel::R200; 244 | case PXCCapture::DeviceModel::DEVICE_MODEL_SR300: 245 | return ECameraModel::SR300; 246 | default: 247 | return ECameraModel::Other; 248 | } 249 | } 250 | 251 | // Returns the connected camera's firmware version as a human-readable string. 252 | const FString RealSenseImpl::GetCameraFirmware() const 253 | { 254 | return FString::Printf(TEXT("%d.%d.%d.%d"), deviceInfo.firmware[0], 255 | deviceInfo.firmware[1], 256 | deviceInfo.firmware[2], 257 | deviceInfo.firmware[3]); 258 | } 259 | 260 | // Enables the color camera stream of the SenseManager using the specified resolution 261 | // and resizes the colorImage buffer of the RealSenseDataFrames to match. 262 | void RealSenseImpl::SetColorCameraResolution(EColorResolution resolution) 263 | { 264 | colorResolution = GetEColorResolutionValue(resolution); 265 | 266 | status = senseManager->EnableStream(PXCCapture::StreamType::STREAM_TYPE_COLOR, 267 | colorResolution.width, 268 | colorResolution.height, 269 | colorResolution.fps); 270 | 271 | assert(status == PXC_STATUS_NO_ERROR); 272 | 273 | const uint8 bytesPerPixel = 4; 274 | const uint32 colorImageSize = colorResolution.width * colorResolution.height * bytesPerPixel; 275 | bgFrame->colorImage.SetNumZeroed(colorImageSize); 276 | midFrame->colorImage.SetNumZeroed(colorImageSize); 277 | fgFrame->colorImage.SetNumZeroed(colorImageSize); 278 | } 279 | 280 | // Enables the depth camera stream of the SenseManager using the specified resolution 281 | // and resizes the depthImage buffer of the RealSenseDataFrames to match. 282 | void RealSenseImpl::SetDepthCameraResolution(EDepthResolution resolution) 283 | { 284 | depthResolution = GetEDepthResolutionValue(resolution); 285 | status = senseManager->EnableStream(PXCCapture::StreamType::STREAM_TYPE_DEPTH, 286 | depthResolution.width, 287 | depthResolution.height, 288 | depthResolution.fps); 289 | 290 | assert(status == PXC_STATUS_NO_ERROR); 291 | 292 | if (status == PXC_STATUS_NO_ERROR) { 293 | const uint32 depthImageSize = depthResolution.width * depthResolution.height; 294 | bgFrame->depthImage.SetNumZeroed(depthImageSize); 295 | midFrame->depthImage.SetNumZeroed(depthImageSize); 296 | fgFrame->depthImage.SetNumZeroed(depthImageSize); 297 | } 298 | } 299 | 300 | // Creates a StreamProfile for the specified color and depth resolutions and 301 | // uses the RSSDK function IsStreamProfileSetValid to test if the two 302 | // camera resolutions are supported together as a set. 303 | bool RealSenseImpl::IsStreamSetValid(EColorResolution ColorResolution, EDepthResolution DepthResolution) const 304 | { 305 | FStreamResolution CRes = GetEColorResolutionValue(ColorResolution); 306 | FStreamResolution DRes = GetEDepthResolutionValue(DepthResolution); 307 | 308 | PXCCapture::Device::StreamProfileSet profiles = {}; 309 | 310 | PXCImage::ImageInfo colorInfo; 311 | colorInfo.width = CRes.width; 312 | colorInfo.height = CRes.height; 313 | colorInfo.format = GetPXCPixelFormat(CRes.format); 314 | colorInfo.reserved = 0; 315 | 316 | profiles.color.imageInfo = colorInfo; 317 | profiles.color.frameRate = { CRes.fps, CRes.fps }; 318 | profiles.color.options = PXCCapture::Device::StreamOption::STREAM_OPTION_ANY; 319 | 320 | PXCImage::ImageInfo depthInfo; 321 | depthInfo.width = DRes.width; 322 | depthInfo.height = DRes.height; 323 | depthInfo.format = GetPXCPixelFormat(DRes.format); 324 | depthInfo.reserved = 0; 325 | 326 | profiles.depth.imageInfo = depthInfo; 327 | profiles.depth.frameRate = { DRes.fps, DRes.fps }; 328 | profiles.depth.options = PXCCapture::Device::StreamOption::STREAM_OPTION_ANY; 329 | 330 | return (device->IsStreamProfileSetValid(&profiles) != 0); 331 | } 332 | 333 | // Creates a new configuration for the 3D Scanning module, specifying the 334 | // scanning mode, solidify, and texture options, and initializing the 335 | // startScan flag to false to postpone the start of scanning. 336 | void RealSenseImpl::ConfigureScanning(EScan3DMode scanningMode, bool bSolidify, bool bTexture) 337 | { 338 | PXC3DScan::Configuration config = {}; 339 | 340 | config.mode = GetPXCScanningMode(scanningMode); 341 | 342 | config.options = PXC3DScan::ReconstructionOption::NONE; 343 | if (bSolidify) { 344 | config.options = config.options | PXC3DScan::ReconstructionOption::SOLIDIFICATION; 345 | } 346 | if (bTexture) { 347 | config.options = config.options | PXC3DScan::ReconstructionOption::TEXTURE; 348 | } 349 | 350 | config.startScan = false; 351 | 352 | status = p3DScan->SetConfiguration(config); 353 | assert(status == PXC_STATUS_NO_ERROR); 354 | } 355 | 356 | // Manually sets the 3D volume in which the 3D scanning module will collect 357 | // data and the voxel resolution to use while scanning. 358 | void RealSenseImpl::SetScanningVolume(FVector boundingBox, int32 resolution) 359 | { 360 | PXC3DScan::Area area; 361 | area.shape.width = boundingBox.X; 362 | area.shape.height = boundingBox.Y; 363 | area.shape.depth = boundingBox.Z; 364 | area.resolution = resolution; 365 | 366 | status = p3DScan->SetArea(area); 367 | assert(status == PXC_STATUS_NO_ERROR); 368 | } 369 | 370 | // Sets the scanStarted flag to true. On the next iteration of the camera 371 | // processing loop, it will load this flag and tell the 3D Scanning configuration 372 | // to begin scanning. 373 | void RealSenseImpl::StartScanning() 374 | { 375 | bScanStarted = true; 376 | bScanCompleted = false; 377 | } 378 | 379 | // Sets the scanStopped flag to true. On the next iteration of the camera 380 | // processing loop, it will load this flag and tell the 3D Scanning configuration 381 | // to stop scanning. 382 | void RealSenseImpl::StopScanning() 383 | { 384 | bScanStopped = true; 385 | } 386 | 387 | // Stores the file format and filename to use for saving the scan and sets the 388 | // reconstructEnabled flag to true. On the next iteration of the camera processing 389 | // loop, it will load this flag and reconstruct the scanned data as a mesh file. 390 | void RealSenseImpl::SaveScan(EScan3DFileFormat saveFileFormat, const FString& filename) 391 | { 392 | scan3DFileFormat = GetPXCScanFileFormat(saveFileFormat); 393 | scan3DFilename = filename; 394 | bReconstructEnabled = true; 395 | } 396 | 397 | // The input ImageInfo object contains the wight and height of the preview image 398 | // provided by the 3D Scanning module. The image size can be changed automatically 399 | // by the middleware, so this function checks if the size has changed. 400 | // 401 | // If true, sets the 3D scan resolution to reflect the new size and resizes the 402 | // scanImage buffer of the RealSenseDataFrames to match. 403 | void RealSenseImpl::UpdateScan3DImageSize(PXCImage::ImageInfo info) 404 | { 405 | if ((scan3DResolution.width == info.width) && 406 | (scan3DResolution.height == info.height)) { 407 | bScan3DImageSizeChanged = false; 408 | return; 409 | } 410 | 411 | scan3DResolution.width = info.width; 412 | scan3DResolution.height = info.height; 413 | 414 | const uint8 bytesPerPixel = 4; 415 | const uint32 scanImageSize = scan3DResolution.width * scan3DResolution.height * bytesPerPixel; 416 | bgFrame->scanImage.SetNumZeroed(scanImageSize); 417 | midFrame->scanImage.SetNumZeroed(scanImageSize); 418 | fgFrame->scanImage.SetNumZeroed(scanImageSize); 419 | 420 | bScan3DImageSizeChanged = true; 421 | } 422 | -------------------------------------------------------------------------------- /Config/DefaultEngine.ini: -------------------------------------------------------------------------------- 1 | [URL] 2 | [/Script/Engine.UserInterfaceSettings] 3 | RenderFocusRule=NavigationOnly 4 | DefaultCursor=None 5 | TextEditBeamCursor=None 6 | CrosshairsCursor=None 7 | GrabHandCursor=None 8 | GrabHandClosedCursor=None 9 | SlashedCircleCursor=None 10 | ApplicationScale=1.000000 11 | UIScaleRule=ShortestSide 12 | CustomScalingRuleClass=None 13 | UIScaleCurve=(EditorCurveData=(Keys=((Time=480.000000,Value=0.666000),(Time=720.000000,Value=0.666000),(Time=953.453125,Value=0.666000),(Time=8640.000000,Value=0.666000))),ExternalCurve=None) 14 | 15 | [/Script/Engine.RendererSettings] 16 | r.MobileHDR=True 17 | r.AllowOcclusionQueries=True 18 | r.MinScreenRadiusForLights=0.030000 19 | r.MinScreenRadiusForDepthPrepass=0.030000 20 | r.PrecomputedVisibilityWarning=False 21 | r.TextureStreaming=True 22 | Compat.UseDXT5NormalMaps=False 23 | r.AllowStaticLighting=True 24 | r.NormalMapsForStaticLighting=False 25 | r.GenerateMeshDistanceFields=False 26 | r.GenerateLandscapeGIData=True 27 | r.Shadow.DistanceFieldPenumbraSize=0.050000 28 | r.TessellationAdaptivePixelsPerTriangle=48.000000 29 | r.SeparateTranslucency=True 30 | r.TranslucentSortPolicy=0 31 | TranslucentSortAxis=(X=0.000000,Y=-1.000000,Z=0.000000) 32 | r.CustomDepth=1 33 | r.DefaultFeature.Bloom=True 34 | r.DefaultFeature.AmbientOcclusion=True 35 | r.DefaultFeature.AmbientOcclusionStaticFraction=True 36 | r.DefaultFeature.AutoExposure=True 37 | r.DefaultFeature.MotionBlur=True 38 | r.DefaultFeature.LensFlare=True 39 | r.DefaultFeature.AntiAliasing=2 40 | r.EarlyZPass=3 41 | r.EarlyZPassMovable=False 42 | r.DBuffer=False 43 | r.ClearSceneMethod=1 44 | r.BasePassOutputsVelocity=False 45 | r.WireframeCullThreshold=5.000000 46 | UIScaleRule=ShortestSide 47 | UIScaleCurve=(EditorCurveData=(Keys=),ExternalCurve=None) 48 | 49 | [/Script/EngineSettings.GameMapsSettings] 50 | EditorStartupMap=/Game/RealSense/3DScan/Maps/Scan3D 51 | LocalMapOptions= 52 | TransitionMap= 53 | bUseSplitscreen=True 54 | TwoPlayerSplitscreenLayout=Horizontal 55 | ThreePlayerSplitscreenLayout=FavorTop 56 | GameInstanceClass=/Script/Engine.GameInstance 57 | GameDefaultMap=/Game/RealSense/3DScan/Maps/Scan3D 58 | ServerDefaultMap=/Engine/Maps/Entry 59 | GlobalDefaultGameMode=None 60 | GlobalDefaultServerGameMode=None 61 | 62 | [/Script/HardwareTargeting.HardwareTargetingSettings] 63 | TargetedHardwareClass=Desktop 64 | AppliedTargetedHardwareClass=Desktop 65 | DefaultGraphicsPerformance=Maximum 66 | AppliedDefaultGraphicsPerformance=Maximum 67 | 68 | [/Script/Engine.Engine] 69 | TinyFontName=/Engine/EngineFonts/RobotoTiny.RobotoTiny 70 | SmallFontName=/Engine/EngineFonts/Roboto.Roboto 71 | MediumFontName=/Engine/EngineFonts/Roboto.Roboto 72 | LargeFontName=/Engine/EngineFonts/Roboto.Roboto 73 | SubtitleFontName=/Engine/EngineFonts/Roboto.Roboto 74 | ConsoleClassName=/Script/Engine.Console 75 | GameViewportClientClassName=/Script/Engine.GameViewportClient 76 | LocalPlayerClassName=/Script/Engine.LocalPlayer 77 | WorldSettingsClassName=/Script/Engine.WorldSettings 78 | NavigationSystemClassName=/Script/Engine.NavigationSystem 79 | AvoidanceManagerClassName=/Script/Engine.AvoidanceManager 80 | PhysicsCollisionHandlerClassName=/Script/Engine.PhysicsCollisionHandler 81 | GameUserSettingsClassName=/Script/Engine.GameUserSettings 82 | AIControllerClassName=/Script/AIModule.AIController 83 | LevelScriptActorClassName=/Script/Engine.LevelScriptActor 84 | DefaultBlueprintBaseClassName=/Script/Engine.Actor 85 | GameSingletonClassName=None 86 | DefaultTireTypeName=/Engine/EngineTireTypes/DefaultTireType.DefaultTireType 87 | DefaultPreviewPawnClassName=/Script/Engine.DefaultPawn 88 | PlayOnConsoleSaveDir=Autosaves 89 | DefaultTextureName=/Engine/EngineResources/DefaultTexture.DefaultTexture 90 | DefaultDiffuseTextureName=/Engine/EngineMaterials/DefaultDiffuse.DefaultDiffuse 91 | DefaultBSPVertexTextureName=/Engine/EditorResources/BSPVertex.BSPVertex 92 | HighFrequencyNoiseTextureName=/Engine/EngineMaterials/Good64x64TilingNoiseHighFreq.Good64x64TilingNoiseHighFreq 93 | DefaultBokehTextureName=/Engine/EngineMaterials/DefaultBokeh.DefaultBokeh 94 | WireframeMaterialName=/Engine/EngineDebugMaterials/WireframeMaterial.WireframeMaterial 95 | GeomMaterialName=/Engine/EngineDebugMaterials/GeomMaterial.GeomMaterial 96 | DebugMeshMaterialName=/Engine/EngineDebugMaterials/DebugMeshMaterial.DebugMeshMaterial 97 | LevelColorationLitMaterialName=/Engine/EngineDebugMaterials/LevelColorationLitMaterial.LevelColorationLitMaterial 98 | LevelColorationUnlitMaterialName=/Engine/EngineDebugMaterials/LevelColorationUnlitMaterial.LevelColorationUnlitMaterial 99 | LightingTexelDensityName=/Engine/EngineDebugMaterials/MAT_LevelColorationLitLightmapUV.MAT_LevelColorationLitLightmapUV 100 | ShadedLevelColorationLitMaterialName=/Engine/EngineDebugMaterials/ShadedLevelColorationLitMaterial.ShadedLevelColorationLitMaterial 101 | ShadedLevelColorationUnlitMaterialName=/Engine/EngineDebugMaterials/ShadedLevelColorationUnlitMateri.ShadedLevelColorationUnlitMateri 102 | RemoveSurfaceMaterialName=/Engine/EngineMaterials/RemoveSurfaceMaterial.RemoveSurfaceMaterial 103 | VertexColorMaterialName=/Engine/EngineDebugMaterials/VertexColorMaterial.VertexColorMaterial 104 | VertexColorViewModeMaterialName_ColorOnly=/Engine/EngineDebugMaterials/VertexColorViewMode_ColorOnly.VertexColorViewMode_ColorOnly 105 | VertexColorViewModeMaterialName_AlphaAsColor=/Engine/EngineDebugMaterials/VertexColorViewMode_AlphaAsColor.VertexColorViewMode_AlphaAsColor 106 | VertexColorViewModeMaterialName_RedOnly=/Engine/EngineDebugMaterials/VertexColorViewMode_RedOnly.VertexColorViewMode_RedOnly 107 | VertexColorViewModeMaterialName_GreenOnly=/Engine/EngineDebugMaterials/VertexColorViewMode_GreenOnly.VertexColorViewMode_GreenOnly 108 | VertexColorViewModeMaterialName_BlueOnly=/Engine/EngineDebugMaterials/VertexColorViewMode_BlueOnly.VertexColorViewMode_BlueOnly 109 | BoneWeightMaterialName=/Engine/EngineDebugMaterials/BoneWeightMaterial.BoneWeightMaterial 110 | ConstraintLimitMaterialName=/Engine/EditorMaterials/PhAT_JointLimitMaterial.PhAT_JointLimitMaterial 111 | InvalidLightmapSettingsMaterialName=/Engine/EngineMaterials/M_InvalidLightmapSettings.M_InvalidLightmapSettings 112 | PreviewShadowsIndicatorMaterialName=/Engine/EditorMaterials/PreviewShadowIndicatorMaterial.PreviewShadowIndicatorMaterial 113 | ArrowMaterialName=/Engine/EditorMaterials/GizmoMaterial.GizmoMaterial 114 | LightingOnlyBrightness=(R=0.300000,G=0.300000,B=0.300000,A=1.000000) 115 | -LightComplexityColors=(R=0,G=0,B=0,A=1) 116 | -LightComplexityColors=(R=0,G=255,B=0,A=1) 117 | -LightComplexityColors=(R=63,G=191,B=0,A=1) 118 | -LightComplexityColors=(R=127,G=127,B=0,A=1) 119 | -LightComplexityColors=(R=191,G=63,B=0,A=1) 120 | -LightComplexityColors=(R=255,G=0,B=0,A=1) 121 | +LightComplexityColors=(B=0,G=0,R=0,A=1) 122 | +LightComplexityColors=(B=0,G=255,R=0,A=1) 123 | +LightComplexityColors=(B=0,G=191,R=63,A=1) 124 | +LightComplexityColors=(B=0,G=127,R=127,A=1) 125 | +LightComplexityColors=(B=0,G=63,R=191,A=1) 126 | +LightComplexityColors=(B=0,G=0,R=255,A=1) 127 | -ShaderComplexityColors=(R=0.0,G=1.0,B=0.127,A=1.0) 128 | -ShaderComplexityColors=(R=0.0,G=1.0,B=0.0,A=1.0) 129 | -ShaderComplexityColors=(R=0.046,G=0.52,B=0.0,A=1.0) 130 | -ShaderComplexityColors=(R=0.215,G=0.215,B=0.0,A=1.0) 131 | -ShaderComplexityColors=(R=0.52,G=0.046,B=0.0,A=1.0) 132 | -ShaderComplexityColors=(R=0.7,G=0.0,B=0.0,A=1.0) 133 | -ShaderComplexityColors=(R=1.0,G=0.0,B=0.0,A=1.0) 134 | -ShaderComplexityColors=(R=1.0,G=0.0,B=0.5,A=1.0) 135 | -ShaderComplexityColors=(R=1.0,G=0.9,B=0.9,A=1.0) 136 | +ShaderComplexityColors=(R=0.000000,G=1.000000,B=0.127000,A=1.000000) 137 | +ShaderComplexityColors=(R=0.000000,G=1.000000,B=0.000000,A=1.000000) 138 | +ShaderComplexityColors=(R=0.046000,G=0.520000,B=0.000000,A=1.000000) 139 | +ShaderComplexityColors=(R=0.215000,G=0.215000,B=0.000000,A=1.000000) 140 | +ShaderComplexityColors=(R=0.520000,G=0.046000,B=0.000000,A=1.000000) 141 | +ShaderComplexityColors=(R=0.700000,G=0.000000,B=0.000000,A=1.000000) 142 | +ShaderComplexityColors=(R=1.000000,G=0.000000,B=0.000000,A=1.000000) 143 | +ShaderComplexityColors=(R=1.000000,G=0.000000,B=0.500000,A=1.000000) 144 | +ShaderComplexityColors=(R=1.000000,G=0.900000,B=0.900000,A=1.000000) 145 | -StationaryLightOverlapColors=(R=0.0,G=1.0,B=0.127,A=1.0) 146 | -StationaryLightOverlapColors=(R=0.0,G=1.0,B=0.0,A=1.0) 147 | -StationaryLightOverlapColors=(R=0.046,G=0.52,B=0.0,A=1.0) 148 | -StationaryLightOverlapColors=(R=0.215,G=0.215,B=0.0,A=1.0) 149 | -StationaryLightOverlapColors=(R=0.52,G=0.046,B=0.0,A=1.0) 150 | -StationaryLightOverlapColors=(R=0.7,G=0.0,B=0.0,A=1.0) 151 | -StationaryLightOverlapColors=(R=1.0,G=0.0,B=0.0,A=1.0) 152 | -StationaryLightOverlapColors=(R=1.0,G=0.0,B=0.5,A=1.0) 153 | -StationaryLightOverlapColors=(R=1.0,G=0.9,B=0.9,A=1.0) 154 | +StationaryLightOverlapColors=(R=0.000000,G=1.000000,B=0.127000,A=1.000000) 155 | +StationaryLightOverlapColors=(R=0.000000,G=1.000000,B=0.000000,A=1.000000) 156 | +StationaryLightOverlapColors=(R=0.046000,G=0.520000,B=0.000000,A=1.000000) 157 | +StationaryLightOverlapColors=(R=0.215000,G=0.215000,B=0.000000,A=1.000000) 158 | +StationaryLightOverlapColors=(R=0.520000,G=0.046000,B=0.000000,A=1.000000) 159 | +StationaryLightOverlapColors=(R=0.700000,G=0.000000,B=0.000000,A=1.000000) 160 | +StationaryLightOverlapColors=(R=1.000000,G=0.000000,B=0.000000,A=1.000000) 161 | +StationaryLightOverlapColors=(R=1.000000,G=0.000000,B=0.500000,A=1.000000) 162 | +StationaryLightOverlapColors=(R=1.000000,G=0.900000,B=0.900000,A=1.000000) 163 | MaxPixelShaderAdditiveComplexityCount=2000.000000 164 | MaxES2PixelShaderAdditiveComplexityCount=600.000000 165 | MinLightMapDensity=0.000000 166 | IdealLightMapDensity=0.200000 167 | MaxLightMapDensity=0.800000 168 | bRenderLightMapDensityGrayscale=False 169 | RenderLightMapDensityGrayscaleScale=1.000000 170 | RenderLightMapDensityColorScale=1.000000 171 | LightMapDensityVertexMappedColor=(R=0.650000,G=0.650000,B=0.250000,A=1.000000) 172 | LightMapDensitySelectedColor=(R=1.000000,G=0.200000,B=1.000000,A=1.000000) 173 | -StatColorMappings=(StatName="AverageFPS",ColorMap=((In=15.0,Out=(R=255)),(In=30,Out=(R=255,G=255)),(In=45.0,Out=(G=255)))) 174 | -StatColorMappings=(StatName="Frametime",ColorMap=((In=1.0,Out=(G=255)),(In=25.0,Out=(G=255)),(In=29.0,Out=(R=255,G=255)),(In=33.0,Out=(R=255)))) 175 | -StatColorMappings=(StatName="Streaming fudge factor",ColorMap=((In=0.0,Out=(G=255)),(In=1.0,Out=(G=255)),(In=2.5,Out=(R=255,G=255)),(In=5.0,Out=(R=255)),(In=10.0,Out=(R=255)))) 176 | +StatColorMappings=(StatName="AverageFPS",ColorMap=((In=15.000000,Out=(B=0,G=0,R=255,A=0)),(In=30.000000,Out=(B=0,G=255,R=255,A=0)),(In=45.000000,Out=(B=0,G=255,R=0,A=0))),DisableBlend=False) 177 | +StatColorMappings=(StatName="Frametime",ColorMap=((In=1.000000,Out=(B=0,G=255,R=0,A=0)),(In=25.000000,Out=(B=0,G=255,R=0,A=0)),(In=29.000000,Out=(B=0,G=255,R=255,A=0)),(In=33.000000,Out=(B=0,G=0,R=255,A=0))),DisableBlend=False) 178 | +StatColorMappings=(StatName="Streaming fudge factor",ColorMap=((Out=(B=0,G=255,R=0,A=0)),(In=1.000000,Out=(B=0,G=255,R=0,A=0)),(In=2.500000,Out=(B=0,G=255,R=255,A=0)),(In=5.000000,Out=(B=0,G=0,R=255,A=0)),(In=10.000000,Out=(B=0,G=0,R=255,A=0))),DisableBlend=False) 179 | EditorBrushMaterialName=/Engine/EngineMaterials/EditorBrushMaterial.EditorBrushMaterial 180 | DefaultPhysMaterialName=/Engine/EngineMaterials/DefaultPhysicalMaterial.DefaultPhysicalMaterial 181 | -ActiveClassRedirects=(OldClassName="GameplayCueNotify",NewClassName="GameplayCueNotify_Static") 182 | -ActiveClassRedirects=(OldClassName="GameplayCueNotify_Blueprint",NewClassName="GameplayCueNotify_Actor") 183 | -ActiveClassRedirects=(OldClassName="RB_BodySetup",NewClassName="BodySetup") 184 | -ActiveClassRedirects=(OldClassName="AnimTreeInstance",NewClassName="AnimInstance") 185 | -ActiveClassRedirects=(OldClassName="VimInstance",NewClassName="AnimInstance") 186 | -ActiveClassRedirects=(OldClassName="VimBlueprint",NewClassName="AnimBlueprint") 187 | -ActiveClassRedirects=(OldClassName="VimGeneratedClass",NewClassName="AnimBlueprintGeneratedClass") 188 | -ActiveClassRedirects=(OldClassName="VimBlueprintFactory",NewClassName="AnimBlueprintFactory") 189 | -ActiveClassRedirects=(OldClassName="ReverbVolume",NewClassName="AudioVolume") 190 | -ActiveClassRedirects=(OldClassName="ReverbVolumeToggleable",NewClassName="AudioVolume") 191 | -ActiveClassRedirects=(OldClassName="BlueprintActorBase",NewClassName="Actor") 192 | -ActiveClassRedirects=(OldClassName="WorldInfo",NewClassName="WorldSettings") 193 | -ActiveClassRedirects=(OldClassName="RB_Handle",NewClassName="PhysicsHandleComponent") 194 | -ActiveClassRedirects=(OldClassName="RB_RadialForceComponent",NewClassName="RadialForceComponent") 195 | -ActiveClassRedirects=(OldClassName="SoundMode",NewClassName="SoundMix") 196 | -ActiveClassRedirects=(OldClassName="RB_ThrusterComponent",NewClassName="PhysicsThrusterComponent") 197 | -ActiveClassRedirects=(OldClassName="RB_Thruster",NewClassName="PhysicsThruster") 198 | -ActiveClassRedirects=(OldClassName="RB_ConstraintSetup",NewClassName="PhysicsConstraintTemplate") 199 | -ActiveClassRedirects=(OldClassName="RB_BSJointSetup",NewClassName="PhysicsConstraintTemplate") 200 | -ActiveClassRedirects=(OldClassName="RB_HingeSetup",NewClassName="PhysicsConstraintTemplate") 201 | -ActiveClassRedirects=(OldClassName="RB_PrismaticSetup",NewClassName="PhysicsConstraintTemplate") 202 | -ActiveClassRedirects=(OldClassName="RB_SkelJointSetup",NewClassName="PhysicsConstraintTemplate") 203 | -ActiveClassRedirects=(OldClassName="RB_ConstraintComponent",NewClassName="PhysicsConstraintComponent") 204 | -ActiveClassRedirects=(OldClassName="RB_ConstraintActor",NewClassName="PhysicsConstraintActor") 205 | -ActiveClassRedirects=(OldClassName="RB_BSJointActor",NewClassName="PhysicsBSJointActor") 206 | -ActiveClassRedirects=(OldClassName="RB_HingeActor",NewClassName="PhysicsHingeActor") 207 | -ActiveClassRedirects=(OldClassName="RB_PrismaticActor",NewClassName="PhysicsPrismaticActor") 208 | -ActiveClassRedirects=(OldClassName="PhysicsBSJointActor",NewClassName="PhysicsConstraintActor") 209 | -ActiveClassRedirects=(OldClassName="PhysicsHingeActor",NewClassName="PhysicsConstraintActor") 210 | -ActiveClassRedirects=(OldClassName="PhysicsPrismaticActor",NewClassName="PhysicsConstraintActor") 211 | -ActiveClassRedirects=(OldClassName="EMovementMode",NewClassName="/Script/Engine.EngineTypes:EMovementMode") 212 | -ActiveClassRedirects=(OldClassName="SensingComponent",NewClassName="PawnSensingComponent") 213 | -ActiveClassRedirects=(OldClassName="MovementComp_Character",NewClassName="CharacterMovementComponent") 214 | -ActiveClassRedirects=(OldClassName="MovementComp_Rotating",NewClassName="RotatingMovementComponent") 215 | -ActiveClassRedirects=(OldClassName="MovementComp_Projectile",NewClassName="ProjectileMovementComponent") 216 | -ActiveClassRedirects=(OldClassName="VehicleSim",NewClassName="VehicleMovementComponent") 217 | -ActiveClassRedirects=(OldClassName="VehicleSimNoDrive",NewClassName="VehicleMovementComponentNoDrive") 218 | -ActiveClassRedirects=(OldClassName="MovementComp_Vehicle",NewClassName="VehicleMovementComponent") 219 | -ActiveClassRedirects=(OldClassName="MovementComp_VehicleNoDrive",NewClassName="VehicleMovementComponentNoDrive") 220 | -ActiveClassRedirects=(OldClassName="DefaultPawnMovement",NewClassName="FloatingPawnMovement") 221 | -ActiveClassRedirects=(OldClassName="StaticMeshReplicatedComponent",NewClassName="StaticMeshComponent") 222 | -ActiveClassRedirects=(OldClassName="SkeletalMeshReplicatedComponent",NewClassName="SkeletalMeshComponent") 223 | -ActiveClassRedirects=(OldClassName="Vehicle",NewClassName="WheeledVehicle") 224 | -ActiveClassRedirects=(OldClassName="VehicleMovementComponent",NewClassName="WheeledVehicleMovementComponent") 225 | -ActiveClassRedirects=(OldClassName="VehicleMovementComponent4W",NewClassName="WheeledVehicleMovementComponent4W") 226 | -ActiveClassRedirects=(OldClassName="PointLightComponent",OldSubobjName="PointLightComponent0",NewSubobjName="LightComponent0") 227 | -ActiveClassRedirects=(OldClassName="DirectionalLightComponent",OldSubobjName="DirectionalLightComponent0",NewSubobjName="LightComponent0") 228 | -ActiveClassRedirects=(OldClassName="SpotLightComponent",OldSubobjName="SpotLightComponent0",NewSubobjName="LightComponent0") 229 | -ActiveClassRedirects=(OldClassName="DefaultPawn",OldSubobjName="SpectatorMovement0",NewSubobjName="MovementComponent0") 230 | -ActiveClassRedirects=(OldClassName="DefaultPawn",OldSubobjName="DefaultPawnMovement0",NewSubobjName="MovementComponent0") 231 | -ActiveClassRedirects=(OldClassName="/Script/BlueprintGraph.K2Node_CastToInterface",NewClassName="/Script/BlueprintGraph.K2Node_DynamicCast") 232 | -ActiveClassRedirects=(OldClassName="K2Node_CallSuperFunction",NewClassName="/Script/BlueprintGraph.K2Node_CallParentFunction") 233 | -ActiveClassRedirects=(OldClassName="K2Node_MathExpression",NewClassName="/Script/BlueprintGraph.K2Node_MathExpression") 234 | -ActiveClassRedirects=(OldClassName="/Script/CoreUObject.K2Node_MathExpression",NewClassName="/Script/BlueprintGraph.K2Node_MathExpression") 235 | -ActiveClassRedirects=(OldClassName="K2Node_Comment",NewClassName="/Script/UnrealEd.EdGraphNode_Comment") 236 | -ActiveClassRedirects=(OldClassName="EdGraphNode_Comment",NewClassName="/Script/UnrealEd.EdGraphNode_Comment") 237 | -ActiveClassRedirects=(OldClassName="SpotLightMovable",NewClassName="SpotLight") 238 | -ActiveClassRedirects=(OldClassName="SpotLightStatic",NewClassName="SpotLight") 239 | -ActiveClassRedirects=(OldClassName="SpotLightStationary",NewClassName="SpotLight") 240 | -ActiveClassRedirects=(OldClassName="PointLightMovable",NewClassName="PointLight") 241 | -ActiveClassRedirects=(OldClassName="PointLightStatic",NewClassName="PointLight") 242 | -ActiveClassRedirects=(OldClassName="PointLightStationary",NewClassName="PointLight") 243 | -ActiveClassRedirects=(OldClassName="DirectionalLightMovable",NewClassName="DirectionalLight") 244 | -ActiveClassRedirects=(OldClassName="DirectionalLightStatic",NewClassName="DirectionalLight") 245 | -ActiveClassRedirects=(OldClassName="DirectionalLightStationary",NewClassName="DirectionalLight") 246 | -ActiveClassRedirects=(OldClassName="InterpActor",NewClassName="StaticMeshActor") 247 | -ActiveClassRedirects=(OldClassName="PhysicsActor",NewClassName="StaticMeshActor") 248 | -ActiveClassRedirects=(OldClassName="SkeletalPhysicsActor",NewClassName="SkeletalMeshActor") 249 | -ActiveClassRedirects=(OldClassName="SingleAnimSkeletalActor",NewClassName="SkeletalMeshActor") 250 | -ActiveClassRedirects=(OldClassName="SingleAnimSkeletalComponent",NewClassName="SkeletalMeshComponent") 251 | -ActiveClassRedirects=(OldClassName="DynamicBlockingVolume",NewClassName="BlockingVolume") 252 | -ActiveClassRedirects=(OldClassName="DynamicPhysicsVolume",NewClassName="PhysicsVolume") 253 | -ActiveClassRedirects=(OldClassName="DynamicTriggerVolume",NewClassName="TriggerVolume") 254 | -ActiveClassRedirects=(OldClassName="AnimNode_SkeletalControlBase",NewClassName="/Script/Engine.AnimNode_SkeletalControlBase") 255 | -ActiveClassRedirects=(OldClassName="AnimNode_TwoBoneIK",NewClassName="/Script/Engine.AnimNode_TwoBoneIK") 256 | -ActiveClassRedirects=(OldClassName="AnimNode_RotationMultiplier",NewClassName="/Script/Engine.AnimNode_RotationMultiplier") 257 | -ActiveClassRedirects=(OldClassName="AnimNode_ModifyBone",NewClassName="/Script/Engine.AnimNode_ModifyBone") 258 | -ActiveClassRedirects=(OldClassName="AnimNode_CopyBone",NewClassName="/Script/Engine.AnimNode_CopyBone") 259 | -ActiveClassRedirects=(OldClassName="AnimNode_SpringBone",NewClassName="/Script/Engine.AnimNode_SpringBone") 260 | -ActiveClassRedirects=(OldClassName="NavAreaMeta",NewClassName="/Script/Engine.NavArea_Default",InstanceOnly="true") 261 | -ActiveClassRedirects=(OldClassName="NavAreaDefinition",NewClassName="/Script/Engine.NavArea") 262 | -ActiveClassRedirects=(OldClassName="NavAreaDefault",NewClassName="/Script/Engine.NavArea_Default") 263 | -ActiveClassRedirects=(OldClassName="NavAreaNull",NewClassName="/Script/Engine.NavArea_Null") 264 | -ActiveClassRedirects=(OldClassName="SmartNavLinkComponent",NewClassName="/Script/Engine.NavLinkCustomComponent") 265 | -ActiveClassRedirects=(OldClassName="ELockedAxis", NewClassName="EDOFMode") 266 | -ActiveClassRedirects=(OldClassName="BehaviorTreeNode",NewClassName="BehaviorTreeGraphNode") 267 | -ActiveClassRedirects=(OldClassName="BehaviorTreeNode_Composite",NewClassName="BehaviorTreeGraphNode_Composite") 268 | -ActiveClassRedirects=(OldClassName="BehaviorTreeNode_Decorator",NewClassName="BehaviorTreeGraphNode_Decorator") 269 | -ActiveClassRedirects=(OldClassName="BehaviorTreeNode_Root",NewClassName="BehaviorTreeGraphNode_Root") 270 | -ActiveClassRedirects=(OldClassName="BehaviorTreeNode_Task",NewClassName="BehaviorTreeGraphNode_Task") 271 | -ActiveClassRedirects=(OldClassName="BTTask_GoTo",NewClassName="BTTask_MoveTo") 272 | -ActiveClassRedirects=(OldClassName="BTTask_RunQuery",NewClassName="BTTask_RunEQSQuery") 273 | -ActiveClassRedirects=(OldClassName="MoveComponentAction",NewClassName="/Script/Engine/KismetSystemLibrary.MoveComponentAction") 274 | -ActiveClassRedirects=(OldClassName="AIDebugComponent",NewClassName="GameplayDebuggingComponent") 275 | -ActiveClassRedirects=(OldClassName="MaterialExpressionTerrainLayerCoords",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerCoords") 276 | -ActiveClassRedirects=(OldClassName="MaterialExpressionTerrainLayerSwitch",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerSwitch") 277 | -ActiveClassRedirects=(OldClassName="MaterialExpressionTerrainLayerWeight",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerWeight") 278 | -ActiveClassRedirects=(OldClassName="Landscape",NewClassName="/Script/Landscape.Landscape") 279 | -ActiveClassRedirects=(OldClassName="LandscapeGizmoActiveActor",NewClassName="/Script/Landscape.LandscapeGizmoActiveActor") 280 | -ActiveClassRedirects=(OldClassName="LandscapeGizmoActor",NewClassName="/Script/Landscape.LandscapeGizmoActor") 281 | -ActiveClassRedirects=(OldClassName="LandscapeProxy",NewClassName="/Script/Landscape.LandscapeProxy") 282 | -ActiveClassRedirects=(OldClassName="ControlPointMeshComponent",NewClassName="/Script/Landscape.ControlPointMeshComponent") 283 | -ActiveClassRedirects=(OldClassName="LandscapeComponent",NewClassName="/Script/Landscape.LandscapeComponent") 284 | -ActiveClassRedirects=(OldClassName="LandscapeGizmoRenderComponent",NewClassName="/Script/Landscape.LandscapeGizmoRenderComponent") 285 | -ActiveClassRedirects=(OldClassName="LandscapeHeightfieldCollisionComponent",NewClassName="/Script/Landscape.LandscapeHeightfieldCollisionComponent") 286 | -ActiveClassRedirects=(OldClassName="LandscapeInfo",NewClassName="/Script/Landscape.LandscapeInfo") 287 | -ActiveClassRedirects=(OldClassName="LandscapeInfoMap",NewClassName="/Script/Landscape.LandscapeInfoMap") 288 | -ActiveClassRedirects=(OldClassName="LandscapeLayerInfoObject",NewClassName="/Script/Landscape.LandscapeLayerInfoObject") 289 | -ActiveClassRedirects=(OldClassName="LandscapeMaterialInstanceConstant",NewClassName="/Script/Landscape.LandscapeMaterialInstanceConstant") 290 | -ActiveClassRedirects=(OldClassName="LandscapeMeshCollisionComponent",NewClassName="/Script/Landscape.LandscapeMeshCollisionComponent") 291 | -ActiveClassRedirects=(OldClassName="LandscapeSplineControlPoint",NewClassName="/Script/Landscape.LandscapeSplineControlPoint") 292 | -ActiveClassRedirects=(OldClassName="LandscapeSplineSegment",NewClassName="/Script/Landscape.LandscapeSplineSegment") 293 | -ActiveClassRedirects=(OldClassName="LandscapeSplinesComponent",NewClassName="/Script/Landscape.LandscapeSplinesComponent") 294 | -ActiveClassRedirects=(OldClassName="MaterialExpressionLandscapeLayerBlend",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerBlend") 295 | -ActiveClassRedirects=(OldClassName="MaterialExpressionLandscapeLayerCoords",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerCoords") 296 | -ActiveClassRedirects=(OldClassName="MaterialExpressionLandscapeLayerSwitch",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerSwitch") 297 | -ActiveClassRedirects=(OldClassName="MaterialExpressionLandscapeLayerWeight",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerWeight") 298 | -ActiveClassRedirects=(OldClassName="MaterialExpressionLandscapeVisibilityMask",NewClassName="/Script/Landscape.MaterialExpressionLandscapeVisibilityMask") 299 | -ActiveClassRedirects=(OldClassName="ProceduralFoliageActor",NewClassName="ProceduralFoliageVolume") 300 | -ActiveClassRedirects=(OldClassName="ProceduralFoliage",NewClassName="ProceduralFoliageSpawner") 301 | -ActiveClassRedirects=(OldClassName="AnimationCompressionAlgorithm",NewClassName="AnimCompress") 302 | -ActiveClassRedirects=(OldClassName="AnimationCompressionAlgorithm_Automatic",NewClassName="AnimCompress_Automatic") 303 | -ActiveClassRedirects=(OldClassName="AnimationCompressionAlgorithm_BitwiseCompressOnly",NewClassName="AnimCompress_BitwiseCompressOnly") 304 | -ActiveClassRedirects=(OldClassName="AnimationCompressionAlgorithm_LeastDestructive",NewClassName="AnimCompress_LeastDestructive") 305 | -ActiveClassRedirects=(OldClassName="AnimationCompressionAlgorithm_PerTrackCompression",NewClassName="AnimCompress_PerTrackCompression") 306 | -ActiveClassRedirects=(OldClassName="AnimationCompressionAlgorithm_RemoveEverySecondKey",NewClassName="AnimCompress_RemoveEverySecondKey") 307 | -ActiveClassRedirects=(OldClassName="AnimationCompressionAlgorithm_RemoveLinearKeys",NewClassName="AnimCompress_RemoveLinearKeys") 308 | -ActiveClassRedirects=(OldClassName="AnimationCompressionAlgorithm_RemoveTrivialKeys",NewClassName="AnimCompress_RemoveTrivialKeys") 309 | -ActiveClassRedirects=(OldClassName="AnimationCompressionAlgorithm_RevertToRaw",NewClassName="AnimCompress_RevertToRaw") 310 | -ActiveClassRedirects=(OldClassName="AIController",NewClassName="/Script/AIModule.AIController") 311 | -ActiveClassRedirects=(OldClassName="AIResourceInterface",NewClassName="/Script/AIModule.AIResourceInterface") 312 | -ActiveClassRedirects=(OldClassName="AISystem",NewClassName="/Script/AIModule.AISystem") 313 | -ActiveClassRedirects=(OldClassName="AITypes",NewClassName="/Script/AIModule.AITypes") 314 | -ActiveClassRedirects=(OldClassName="BrainComponent",NewClassName="/Script/AIModule.BrainComponent") 315 | -ActiveClassRedirects=(OldClassName="KismetAIAsyncTaskProxy",NewClassName="/Script/AIModule.AIAsyncTaskBlueprintProxy") 316 | -ActiveClassRedirects=(OldClassName="KismetAIHelperLibrary",NewClassName="/Script/AIModule.AIBlueprintHelperLibrary") 317 | -ActiveClassRedirects=(OldClassName="BehaviorTree",NewClassName="/Script/AIModule.BehaviorTree") 318 | -ActiveClassRedirects=(OldClassName="BehaviorTreeComponent",NewClassName="/Script/AIModule.BehaviorTreeComponent") 319 | -ActiveClassRedirects=(OldClassName="BehaviorTreeManager",NewClassName="/Script/AIModule.BehaviorTreeManager") 320 | -ActiveClassRedirects=(OldClassName="BehaviorTreeTypes",NewClassName="/Script/AIModule.BehaviorTreeTypes") 321 | -ActiveClassRedirects=(OldClassName="BlackboardComponent",NewClassName="/Script/AIModule.BlackboardComponent") 322 | -ActiveClassRedirects=(OldClassName="BlackboardData",NewClassName="/Script/AIModule.BlackboardData") 323 | -ActiveClassRedirects=(OldClassName="BTAuxiliaryNode",NewClassName="/Script/AIModule.BTAuxiliaryNode") 324 | -ActiveClassRedirects=(OldClassName="BTCompositeNode",NewClassName="/Script/AIModule.BTCompositeNode") 325 | -ActiveClassRedirects=(OldClassName="BTDecorator",NewClassName="/Script/AIModule.BTDecorator") 326 | -ActiveClassRedirects=(OldClassName="BTFunctionLibrary",NewClassName="/Script/AIModule.BTFunctionLibrary") 327 | -ActiveClassRedirects=(OldClassName="BTNode",NewClassName="/Script/AIModule.BTNode") 328 | -ActiveClassRedirects=(OldClassName="BTService",NewClassName="/Script/AIModule.BTService") 329 | -ActiveClassRedirects=(OldClassName="BTTaskNode",NewClassName="/Script/AIModule.BTTaskNode") 330 | -ActiveClassRedirects=(OldClassName="BlackboardKeyAllTypes",NewClassName="/Script/AIModule.BlackboardKeyAllTypes") 331 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType",NewClassName="/Script/AIModule.BlackboardKeyType") 332 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_Bool",NewClassName="/Script/AIModule.BlackboardKeyType_Bool") 333 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_Class",NewClassName="/Script/AIModule.BlackboardKeyType_Class") 334 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_Enum",NewClassName="/Script/AIModule.BlackboardKeyType_Enum") 335 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_Float",NewClassName="/Script/AIModule.BlackboardKeyType_Float") 336 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_Int",NewClassName="/Script/AIModule.BlackboardKeyType_Int") 337 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_Name",NewClassName="/Script/AIModule.BlackboardKeyType_Name") 338 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_NativeEnum",NewClassName="/Script/AIModule.BlackboardKeyType_NativeEnum") 339 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_Object",NewClassName="/Script/AIModule.BlackboardKeyType_Object") 340 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_String",NewClassName="/Script/AIModule.BlackboardKeyType_String") 341 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_Vector",NewClassName="/Script/AIModule.BlackboardKeyType_Vector") 342 | -ActiveClassRedirects=(OldClassName="BTComposite_Selector",NewClassName="/Script/AIModule.BTComposite_Selector") 343 | -ActiveClassRedirects=(OldClassName="BTComposite_Sequence",NewClassName="/Script/AIModule.BTComposite_Sequence") 344 | -ActiveClassRedirects=(OldClassName="BTComposite_SimpleParallel",NewClassName="/Script/AIModule.BTComposite_SimpleParallel") 345 | -ActiveClassRedirects=(OldClassName="BTDecorator_Blackboard",NewClassName="/Script/AIModule.BTDecorator_Blackboard") 346 | -ActiveClassRedirects=(OldClassName="BTDecorator_BlackboardBase",NewClassName="/Script/AIModule.BTDecorator_BlackboardBase") 347 | -ActiveClassRedirects=(OldClassName="BTDecorator_BlueprintBase",NewClassName="/Script/AIModule.BTDecorator_BlueprintBase") 348 | -ActiveClassRedirects=(OldClassName="BTDecorator_CompareBBEntries",NewClassName="/Script/AIModule.BTDecorator_CompareBBEntries") 349 | -ActiveClassRedirects=(OldClassName="BTDecorator_ConeCheck",NewClassName="/Script/AIModule.BTDecorator_ConeCheck") 350 | -ActiveClassRedirects=(OldClassName="BTDecorator_Cooldown",NewClassName="/Script/AIModule.BTDecorator_Cooldown") 351 | -ActiveClassRedirects=(OldClassName="BTDecorator_DoesPathExist",NewClassName="/Script/AIModule.BTDecorator_DoesPathExist") 352 | -ActiveClassRedirects=(OldClassName="BTDecorator_ForceSuccess",NewClassName="/Script/AIModule.BTDecorator_ForceSuccess") 353 | -ActiveClassRedirects=(OldClassName="BTDecorator_KeepInCone",NewClassName="/Script/AIModule.BTDecorator_KeepInCone") 354 | -ActiveClassRedirects=(OldClassName="BTDecorator_Loop",NewClassName="/Script/AIModule.BTDecorator_Loop") 355 | -ActiveClassRedirects=(OldClassName="BTDecorator_Optional",NewClassName="/Script/AIModule.BTDecorator_ForceSuccess") 356 | -ActiveClassRedirects=(OldClassName="BTDecorator_ReachedMoveGoal",NewClassName="/Script/AIModule.BTDecorator_ReachedMoveGoal") 357 | -ActiveClassRedirects=(OldClassName="BTDecorator_TimeLimit",NewClassName="/Script/AIModule.BTDecorator_TimeLimit") 358 | -ActiveClassRedirects=(OldClassName="BTService_BlackboardBase",NewClassName="/Script/AIModule.BTService_BlackboardBase") 359 | -ActiveClassRedirects=(OldClassName="BTService_BlueprintBase",NewClassName="/Script/AIModule.BTService_BlueprintBase") 360 | -ActiveClassRedirects=(OldClassName="BTService_DefaultFocus",NewClassName="/Script/AIModule.BTService_DefaultFocus") 361 | -ActiveClassRedirects=(OldClassName="BTTask_BlackboardBase",NewClassName="/Script/AIModule.BTTask_BlackboardBase") 362 | -ActiveClassRedirects=(OldClassName="BTTask_BlueprintBase",NewClassName="/Script/AIModule.BTTask_BlueprintBase") 363 | -ActiveClassRedirects=(OldClassName="BTTask_MakeNoise",NewClassName="/Script/AIModule.BTTask_MakeNoise") 364 | -ActiveClassRedirects=(OldClassName="BTTask_MoveDirectlyToward",NewClassName="/Script/AIModule.BTTask_MoveDirectlyToward") 365 | -ActiveClassRedirects=(OldClassName="BTTask_MoveTo",NewClassName="/Script/AIModule.BTTask_MoveTo") 366 | -ActiveClassRedirects=(OldClassName="BTTask_PlaySound",NewClassName="/Script/AIModule.BTTask_PlaySound") 367 | -ActiveClassRedirects=(OldClassName="BTTask_RunBehavior",NewClassName="/Script/AIModule.BTTask_RunBehavior") 368 | -ActiveClassRedirects=(OldClassName="BTTask_RunEQSQuery",NewClassName="/Script/AIModule.BTTask_RunEQSQuery") 369 | -ActiveClassRedirects=(OldClassName="BTTask_Wait",NewClassName="/Script/AIModule.BTTask_Wait") 370 | -ActiveClassRedirects=(OldClassName="EnvQuery",NewClassName="/Script/AIModule.EnvQuery") 371 | -ActiveClassRedirects=(OldClassName="EnvQueryContext",NewClassName="/Script/AIModule.EnvQueryContext") 372 | -ActiveClassRedirects=(OldClassName="EnvQueryGenerator",NewClassName="/Script/AIModule.EnvQueryGenerator") 373 | -ActiveClassRedirects=(OldClassName="EnvQueryManager",NewClassName="/Script/AIModule.EnvQueryManager") 374 | -ActiveClassRedirects=(OldClassName="EnvQueryOption",NewClassName="/Script/AIModule.EnvQueryOption") 375 | -ActiveClassRedirects=(OldClassName="EnvQueryTest",NewClassName="/Script/AIModule.EnvQueryTest") 376 | -ActiveClassRedirects=(OldClassName="EnvQueryTypes",NewClassName="/Script/AIModule.EnvQueryTypes") 377 | -ActiveClassRedirects=(OldClassName="EQSQueryResultSourceInterface",NewClassName="/Script/AIModule.EQSQueryResultSourceInterface") 378 | -ActiveClassRedirects=(OldClassName="EQSRenderingComponent",NewClassName="/Script/AIModule.EQSRenderingComponent") 379 | -ActiveClassRedirects=(OldClassName="EQSTestingPawn",NewClassName="/Script/AIModule.EQSTestingPawn") 380 | -ActiveClassRedirects=(OldClassName="EnvQueryContext_BlueprintBase",NewClassName="/Script/AIModule.EnvQueryContext_BlueprintBase") 381 | -ActiveClassRedirects=(OldClassName="EnvQueryContext_Item",NewClassName="/Script/AIModule.EnvQueryContext_Item") 382 | -ActiveClassRedirects=(OldClassName="EnvQueryContext_Querier",NewClassName="/Script/AIModule.EnvQueryContext_Querier") 383 | -ActiveClassRedirects=(OldClassName="EnvQueryGenerator_Composite",NewClassName="/Script/AIModule.EnvQueryGenerator_Composite") 384 | -ActiveClassRedirects=(OldClassName="EnvQueryGenerator_OnCircle",NewClassName="/Script/AIModule.EnvQueryGenerator_OnCircle") 385 | -ActiveClassRedirects=(OldClassName="EnvQueryGenerator_PathingGrid",NewClassName="/Script/AIModule.EnvQueryGenerator_PathingGrid") 386 | -ActiveClassRedirects=(OldClassName="EnvQueryGenerator_ProjectedPoints",NewClassName="/Script/AIModule.EnvQueryGenerator_ProjectedPoints") 387 | -ActiveClassRedirects=(OldClassName="EnvQueryGenerator_SimpleGrid",NewClassName="/Script/AIModule.EnvQueryGenerator_SimpleGrid") 388 | -ActiveClassRedirects=(OldClassName="EnvQueryAllItemTypes",NewClassName="/Script/AIModule.EnvQueryAllItemTypes") 389 | -ActiveClassRedirects=(OldClassName="EnvQueryItemType",NewClassName="/Script/AIModule.EnvQueryItemType") 390 | -ActiveClassRedirects=(OldClassName="EnvQueryItemType_Actor",NewClassName="/Script/AIModule.EnvQueryItemType_Actor") 391 | -ActiveClassRedirects=(OldClassName="EnvQueryItemType_ActorBase",NewClassName="/Script/AIModule.EnvQueryItemType_ActorBase") 392 | -ActiveClassRedirects=(OldClassName="EnvQueryItemType_Direction",NewClassName="/Script/AIModule.EnvQueryItemType_Direction") 393 | -ActiveClassRedirects=(OldClassName="EnvQueryItemType_Point",NewClassName="/Script/AIModule.EnvQueryItemType_Point") 394 | -ActiveClassRedirects=(OldClassName="EnvQueryItemType_VectorBase",NewClassName="/Script/AIModule.EnvQueryItemType_VectorBase") 395 | -ActiveClassRedirects=(OldClassName="EnvQueryTest_Distance",NewClassName="/Script/AIModule.EnvQueryTest_Distance") 396 | -ActiveClassRedirects=(OldClassName="EnvQueryTest_Dot",NewClassName="/Script/AIModule.EnvQueryTest_Dot") 397 | -ActiveClassRedirects=(OldClassName="EnvQueryTest_Pathfinding",NewClassName="/Script/AIModule.EnvQueryTest_Pathfinding") 398 | -ActiveClassRedirects=(OldClassName="EnvQueryTest_Trace",NewClassName="/Script/AIModule.EnvQueryTest_Trace") 399 | -ActiveClassRedirects=(OldClassName="CrowdAgentInterface",NewClassName="/Script/AIModule.CrowdAgentInterface") 400 | -ActiveClassRedirects=(OldClassName="CrowdFollowingComponent",NewClassName="/Script/AIModule.CrowdFollowingComponent") 401 | -ActiveClassRedirects=(OldClassName="CrowdManager",NewClassName="/Script/AIModule.CrowdManager") 402 | -ActiveClassRedirects=(OldClassName="PathFollowingComponent",NewClassName="/Script/AIModule.PathFollowingComponent") 403 | -ActiveClassRedirects=(OldClassName="PawnSensingComponent",NewClassName="/Script/AIModule.PawnSensingComponent") 404 | -ActiveClassRedirects=(OldClassName="EditorGameAgnosticSettings",NewClassName="/Script/UnrealEd.EditorSettings") 405 | -ActiveClassRedirects=(OldClassName="EditorUserSettings",NewClassName="/Script/UnrealEd.EditorPerProjectUserSettings") 406 | -ActiveClassRedirects=(OldClassName="SpriteComponent",NewClassName="BillboardComponent") 407 | -ActiveClassRedirects=(OldClassName="MaterialSpriteComponent",NewClassName="MaterialBillboardComponent") 408 | -ActiveClassRedirects=(OldClassName="WidgetBlueprint",NewClassName="/Script/UMGEditor.WidgetBlueprint") 409 | -ActiveClassRedirects=(OldClassName="SReply",NewClassName="EventReply") 410 | -ActiveClassRedirects=(OldClassName="ScriptComponent",NewClassName="ScriptPluginComponent") 411 | -ActiveClassRedirects=(OldClassName="PaperRenderComponent",NewClassName="/Script/Paper2D.PaperSpriteComponent") 412 | -ActiveClassRedirects=(OldClassName="PaperAnimatedRenderComponent",NewClassName="/Script/Paper2D.PaperFlipbookComponent") 413 | -ActiveClassRedirects=(OldClassName="PaperRenderActor",NewClassName="/Script/Paper2D.PaperSpriteActor") 414 | -ActiveClassRedirects=(OldClassName="PaperTileMapRenderComponent",NewClassName="/Script/Paper2D.PaperTileMapComponent") 415 | -ActiveClassRedirects=(OldClassName="PaperSpriteSheet",NewClassName="/Script/PaperSpritesheetImporter.PaperSpriteSheet") 416 | -ActiveClassRedirects=(OldClassName="ECollisionTraceFlag",NewClassName="/Script/Engine.BodySetupEnums:ECollisionTraceFlag") 417 | -ActiveClassRedirects=(OldClassName="EBodyCollisionResponse",NewClassName="/Script/Engine.BodySetupEnums:EBodyCollisionResponse") 418 | -ActiveClassRedirects=(OldClassName="EPhysicsType",NewClassName="/Script/Engine.BodySetupEnums:EPhysicsType") 419 | -ActiveClassRedirects=(OldClassName="PlayerCamera",NewClassName="PlayerCameraManager") 420 | -ActiveClassRedirects=(OldClassName="EModifyFrequency",NewClassName="EComponentMobility") 421 | -ActiveClassRedirects=(OldClassName="EMaterialLightingModel",NewClassName="EMaterialShadingModel") 422 | -ActiveClassRedirects=(OldClassName="GameReplicationInfo",NewClassName="/Script/Engine.GameState") 423 | -ActiveClassRedirects=(OldClassName="GameInfo",NewClassName="/Script/Engine.GameMode") 424 | -ActiveClassRedirects=(OldClassName="PlayerReplicationInfo",NewClassName="/Script/Engine.PlayerState") 425 | -ActiveClassRedirects=(OldClassName="AnimGraphNode_BlendSpace",NewClassName="/Script/AnimGraph.AnimGraphNode_BlendSpacePlayer") 426 | -ActiveClassRedirects=(OldClassName="AnimNode_BlendSpace",NewClassName="/Script/Engine.AnimNode_BlendSpacePlayer") 427 | -ActiveClassRedirects=(OldClassName="ETransitionGetterType",NewClassName="ETransitionGetter::Type") 428 | -ActiveClassRedirects=(OldClassName="ESlateCheckBoxState", NewClassName="ECheckBoxState") 429 | -ActiveClassRedirects=(OldClassName="SlateWidgetStyleAsset", NewClassName="/Script/SlateCore.SlateWidgetStyleAsset") 430 | -ActiveClassRedirects=(OldClassName="SlateWidgetStyleContainerBase", NewClassName="/Script/SlateCore.SlateWidgetStyleContainerBase") 431 | -ActiveClassRedirects=(OldClassName="InstancedFoliageSettings", NewClassName="/Script/Foliage.FoliageType_InstancedStaticMesh") 432 | -ActiveClassRedirects=(OldClassName="FoliageType", NewClassName="/Script/Foliage.FoliageType") 433 | -ActiveClassRedirects=(OldClassName="FoliageType_InstancedStaticMesh", NewClassName="/Script/Foliage.FoliageType_InstancedStaticMesh") 434 | -ActiveClassRedirects=(OldClassName="InstancedFoliageActor", NewClassName="/Script/Foliage.InstancedFoliageActor") 435 | -ActiveClassRedirects=(OldClassName="InteractiveFoliageComponent", NewClassName="/Script/Foliage.InteractiveFoliageComponent") 436 | -ActiveClassRedirects=(OldClassName="FoliageVertexColorMask", NewClassName="/Script/Foliage.FoliageVertexColorMask") 437 | -ActiveClassRedirects=(OldClassName="EmitterSpawnable", NewClassName="Emitter") 438 | -ActiveClassRedirects=(OldClassName="EBoneSpaces",NewClassName="/Script/Engine.SkinnedMeshComponent:EBoneSpaces") 439 | +ActiveClassRedirects=(ObjectName=,OldClassName="GameplayCueNotify",NewClassName="GameplayCueNotify_Static",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 440 | +ActiveClassRedirects=(ObjectName=,OldClassName="GameplayCueNotify_Blueprint",NewClassName="GameplayCueNotify_Actor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 441 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_BodySetup",NewClassName="BodySetup",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 442 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimTreeInstance",NewClassName="AnimInstance",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 443 | +ActiveClassRedirects=(ObjectName=,OldClassName="VimInstance",NewClassName="AnimInstance",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 444 | +ActiveClassRedirects=(ObjectName=,OldClassName="VimBlueprint",NewClassName="AnimBlueprint",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 445 | +ActiveClassRedirects=(ObjectName=,OldClassName="VimGeneratedClass",NewClassName="AnimBlueprintGeneratedClass",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 446 | +ActiveClassRedirects=(ObjectName=,OldClassName="VimBlueprintFactory",NewClassName="AnimBlueprintFactory",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 447 | +ActiveClassRedirects=(ObjectName=,OldClassName="ReverbVolume",NewClassName="AudioVolume",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 448 | +ActiveClassRedirects=(ObjectName=,OldClassName="ReverbVolumeToggleable",NewClassName="AudioVolume",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 449 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlueprintActorBase",NewClassName="Actor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 450 | +ActiveClassRedirects=(ObjectName=,OldClassName="WorldInfo",NewClassName="WorldSettings",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 451 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_Handle",NewClassName="PhysicsHandleComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 452 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_RadialForceComponent",NewClassName="RadialForceComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 453 | +ActiveClassRedirects=(ObjectName=,OldClassName="SoundMode",NewClassName="SoundMix",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 454 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_ThrusterComponent",NewClassName="PhysicsThrusterComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 455 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_Thruster",NewClassName="PhysicsThruster",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 456 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_ConstraintSetup",NewClassName="PhysicsConstraintTemplate",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 457 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_BSJointSetup",NewClassName="PhysicsConstraintTemplate",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 458 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_HingeSetup",NewClassName="PhysicsConstraintTemplate",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 459 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_PrismaticSetup",NewClassName="PhysicsConstraintTemplate",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 460 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_SkelJointSetup",NewClassName="PhysicsConstraintTemplate",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 461 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_ConstraintComponent",NewClassName="PhysicsConstraintComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 462 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_ConstraintActor",NewClassName="PhysicsConstraintActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 463 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_BSJointActor",NewClassName="PhysicsBSJointActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 464 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_HingeActor",NewClassName="PhysicsHingeActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 465 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_PrismaticActor",NewClassName="PhysicsPrismaticActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 466 | +ActiveClassRedirects=(ObjectName=,OldClassName="PhysicsBSJointActor",NewClassName="PhysicsConstraintActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 467 | +ActiveClassRedirects=(ObjectName=,OldClassName="PhysicsHingeActor",NewClassName="PhysicsConstraintActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 468 | +ActiveClassRedirects=(ObjectName=,OldClassName="PhysicsPrismaticActor",NewClassName="PhysicsConstraintActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 469 | +ActiveClassRedirects=(ObjectName=,OldClassName="EMovementMode",NewClassName="/Script/Engine.EngineTypes:EMovementMode",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 470 | +ActiveClassRedirects=(ObjectName=,OldClassName="SensingComponent",NewClassName="PawnSensingComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 471 | +ActiveClassRedirects=(ObjectName=,OldClassName="MovementComp_Character",NewClassName="CharacterMovementComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 472 | +ActiveClassRedirects=(ObjectName=,OldClassName="MovementComp_Rotating",NewClassName="RotatingMovementComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 473 | +ActiveClassRedirects=(ObjectName=,OldClassName="MovementComp_Projectile",NewClassName="ProjectileMovementComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 474 | +ActiveClassRedirects=(ObjectName=,OldClassName="VehicleSim",NewClassName="VehicleMovementComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 475 | +ActiveClassRedirects=(ObjectName=,OldClassName="VehicleSimNoDrive",NewClassName="VehicleMovementComponentNoDrive",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 476 | +ActiveClassRedirects=(ObjectName=,OldClassName="MovementComp_Vehicle",NewClassName="VehicleMovementComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 477 | +ActiveClassRedirects=(ObjectName=,OldClassName="MovementComp_VehicleNoDrive",NewClassName="VehicleMovementComponentNoDrive",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 478 | +ActiveClassRedirects=(ObjectName=,OldClassName="DefaultPawnMovement",NewClassName="FloatingPawnMovement",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 479 | +ActiveClassRedirects=(ObjectName=,OldClassName="StaticMeshReplicatedComponent",NewClassName="StaticMeshComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 480 | +ActiveClassRedirects=(ObjectName=,OldClassName="SkeletalMeshReplicatedComponent",NewClassName="SkeletalMeshComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 481 | +ActiveClassRedirects=(ObjectName=,OldClassName="Vehicle",NewClassName="WheeledVehicle",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 482 | +ActiveClassRedirects=(ObjectName=,OldClassName="VehicleMovementComponent",NewClassName="WheeledVehicleMovementComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 483 | +ActiveClassRedirects=(ObjectName=,OldClassName="VehicleMovementComponent4W",NewClassName="WheeledVehicleMovementComponent4W",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 484 | +ActiveClassRedirects=(ObjectName=,OldClassName="PointLightComponent",NewClassName=,OldSubobjName="PointLightComponent0",NewSubobjName="LightComponent0",InstanceOnly=False) 485 | +ActiveClassRedirects=(ObjectName=,OldClassName="DirectionalLightComponent",NewClassName=,OldSubobjName="DirectionalLightComponent0",NewSubobjName="LightComponent0",InstanceOnly=False) 486 | +ActiveClassRedirects=(ObjectName=,OldClassName="SpotLightComponent",NewClassName=,OldSubobjName="SpotLightComponent0",NewSubobjName="LightComponent0",InstanceOnly=False) 487 | +ActiveClassRedirects=(ObjectName=,OldClassName="DefaultPawn",NewClassName=,OldSubobjName="SpectatorMovement0",NewSubobjName="MovementComponent0",InstanceOnly=False) 488 | +ActiveClassRedirects=(ObjectName=,OldClassName="DefaultPawn",NewClassName=,OldSubobjName="DefaultPawnMovement0",NewSubobjName="MovementComponent0",InstanceOnly=False) 489 | +ActiveClassRedirects=(ObjectName=,OldClassName="/Script/BlueprintGraph.K2Node_CastToInterface",NewClassName="/Script/BlueprintGraph.K2Node_DynamicCast",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 490 | +ActiveClassRedirects=(ObjectName=,OldClassName="K2Node_CallSuperFunction",NewClassName="/Script/BlueprintGraph.K2Node_CallParentFunction",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 491 | +ActiveClassRedirects=(ObjectName=,OldClassName="K2Node_MathExpression",NewClassName="/Script/BlueprintGraph.K2Node_MathExpression",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 492 | +ActiveClassRedirects=(ObjectName=,OldClassName="/Script/CoreUObject.K2Node_MathExpression",NewClassName="/Script/BlueprintGraph.K2Node_MathExpression",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 493 | +ActiveClassRedirects=(ObjectName=,OldClassName="K2Node_Comment",NewClassName="/Script/UnrealEd.EdGraphNode_Comment",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 494 | +ActiveClassRedirects=(ObjectName=,OldClassName="EdGraphNode_Comment",NewClassName="/Script/UnrealEd.EdGraphNode_Comment",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 495 | +ActiveClassRedirects=(ObjectName=,OldClassName="SpotLightMovable",NewClassName="SpotLight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 496 | +ActiveClassRedirects=(ObjectName=,OldClassName="SpotLightStatic",NewClassName="SpotLight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 497 | +ActiveClassRedirects=(ObjectName=,OldClassName="SpotLightStationary",NewClassName="SpotLight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 498 | +ActiveClassRedirects=(ObjectName=,OldClassName="PointLightMovable",NewClassName="PointLight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 499 | +ActiveClassRedirects=(ObjectName=,OldClassName="PointLightStatic",NewClassName="PointLight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 500 | +ActiveClassRedirects=(ObjectName=,OldClassName="PointLightStationary",NewClassName="PointLight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 501 | +ActiveClassRedirects=(ObjectName=,OldClassName="DirectionalLightMovable",NewClassName="DirectionalLight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 502 | +ActiveClassRedirects=(ObjectName=,OldClassName="DirectionalLightStatic",NewClassName="DirectionalLight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 503 | +ActiveClassRedirects=(ObjectName=,OldClassName="DirectionalLightStationary",NewClassName="DirectionalLight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 504 | +ActiveClassRedirects=(ObjectName=,OldClassName="InterpActor",NewClassName="StaticMeshActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 505 | +ActiveClassRedirects=(ObjectName=,OldClassName="PhysicsActor",NewClassName="StaticMeshActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 506 | +ActiveClassRedirects=(ObjectName=,OldClassName="SkeletalPhysicsActor",NewClassName="SkeletalMeshActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 507 | +ActiveClassRedirects=(ObjectName=,OldClassName="SingleAnimSkeletalActor",NewClassName="SkeletalMeshActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 508 | +ActiveClassRedirects=(ObjectName=,OldClassName="SingleAnimSkeletalComponent",NewClassName="SkeletalMeshComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 509 | +ActiveClassRedirects=(ObjectName=,OldClassName="DynamicBlockingVolume",NewClassName="BlockingVolume",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 510 | +ActiveClassRedirects=(ObjectName=,OldClassName="DynamicPhysicsVolume",NewClassName="PhysicsVolume",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 511 | +ActiveClassRedirects=(ObjectName=,OldClassName="DynamicTriggerVolume",NewClassName="TriggerVolume",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 512 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimNode_SkeletalControlBase",NewClassName="/Script/Engine.AnimNode_SkeletalControlBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 513 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimNode_TwoBoneIK",NewClassName="/Script/Engine.AnimNode_TwoBoneIK",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 514 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimNode_RotationMultiplier",NewClassName="/Script/Engine.AnimNode_RotationMultiplier",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 515 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimNode_ModifyBone",NewClassName="/Script/Engine.AnimNode_ModifyBone",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 516 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimNode_CopyBone",NewClassName="/Script/Engine.AnimNode_CopyBone",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 517 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimNode_SpringBone",NewClassName="/Script/Engine.AnimNode_SpringBone",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 518 | +ActiveClassRedirects=(ObjectName=,OldClassName="NavAreaMeta",NewClassName="/Script/Engine.NavArea_Default",OldSubobjName=,NewSubobjName=,InstanceOnly=True) 519 | +ActiveClassRedirects=(ObjectName=,OldClassName="NavAreaDefinition",NewClassName="/Script/Engine.NavArea",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 520 | +ActiveClassRedirects=(ObjectName=,OldClassName="NavAreaDefault",NewClassName="/Script/Engine.NavArea_Default",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 521 | +ActiveClassRedirects=(ObjectName=,OldClassName="NavAreaNull",NewClassName="/Script/Engine.NavArea_Null",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 522 | +ActiveClassRedirects=(ObjectName=,OldClassName="SmartNavLinkComponent",NewClassName="/Script/Engine.NavLinkCustomComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 523 | +ActiveClassRedirects=(ObjectName=,OldClassName="ELockedAxis",NewClassName="EDOFMode",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 524 | +ActiveClassRedirects=(ObjectName=,OldClassName="BehaviorTreeNode",NewClassName="BehaviorTreeGraphNode",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 525 | +ActiveClassRedirects=(ObjectName=,OldClassName="BehaviorTreeNode_Composite",NewClassName="BehaviorTreeGraphNode_Composite",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 526 | +ActiveClassRedirects=(ObjectName=,OldClassName="BehaviorTreeNode_Decorator",NewClassName="BehaviorTreeGraphNode_Decorator",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 527 | +ActiveClassRedirects=(ObjectName=,OldClassName="BehaviorTreeNode_Root",NewClassName="BehaviorTreeGraphNode_Root",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 528 | +ActiveClassRedirects=(ObjectName=,OldClassName="BehaviorTreeNode_Task",NewClassName="BehaviorTreeGraphNode_Task",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 529 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_GoTo",NewClassName="BTTask_MoveTo",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 530 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_RunQuery",NewClassName="BTTask_RunEQSQuery",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 531 | +ActiveClassRedirects=(ObjectName=,OldClassName="MoveComponentAction",NewClassName="/Script/Engine/KismetSystemLibrary.MoveComponentAction",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 532 | +ActiveClassRedirects=(ObjectName=,OldClassName="AIDebugComponent",NewClassName="GameplayDebuggingComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 533 | +ActiveClassRedirects=(ObjectName=,OldClassName="MaterialExpressionTerrainLayerCoords",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerCoords",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 534 | +ActiveClassRedirects=(ObjectName=,OldClassName="MaterialExpressionTerrainLayerSwitch",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerSwitch",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 535 | +ActiveClassRedirects=(ObjectName=,OldClassName="MaterialExpressionTerrainLayerWeight",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerWeight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 536 | +ActiveClassRedirects=(ObjectName=,OldClassName="Landscape",NewClassName="/Script/Landscape.Landscape",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 537 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeGizmoActiveActor",NewClassName="/Script/Landscape.LandscapeGizmoActiveActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 538 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeGizmoActor",NewClassName="/Script/Landscape.LandscapeGizmoActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 539 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeProxy",NewClassName="/Script/Landscape.LandscapeProxy",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 540 | +ActiveClassRedirects=(ObjectName=,OldClassName="ControlPointMeshComponent",NewClassName="/Script/Landscape.ControlPointMeshComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 541 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeComponent",NewClassName="/Script/Landscape.LandscapeComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 542 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeGizmoRenderComponent",NewClassName="/Script/Landscape.LandscapeGizmoRenderComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 543 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeHeightfieldCollisionComponent",NewClassName="/Script/Landscape.LandscapeHeightfieldCollisionComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 544 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeInfo",NewClassName="/Script/Landscape.LandscapeInfo",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 545 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeInfoMap",NewClassName="/Script/Landscape.LandscapeInfoMap",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 546 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeLayerInfoObject",NewClassName="/Script/Landscape.LandscapeLayerInfoObject",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 547 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeMaterialInstanceConstant",NewClassName="/Script/Landscape.LandscapeMaterialInstanceConstant",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 548 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeMeshCollisionComponent",NewClassName="/Script/Landscape.LandscapeMeshCollisionComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 549 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeSplineControlPoint",NewClassName="/Script/Landscape.LandscapeSplineControlPoint",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 550 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeSplineSegment",NewClassName="/Script/Landscape.LandscapeSplineSegment",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 551 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeSplinesComponent",NewClassName="/Script/Landscape.LandscapeSplinesComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 552 | +ActiveClassRedirects=(ObjectName=,OldClassName="MaterialExpressionLandscapeLayerBlend",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerBlend",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 553 | +ActiveClassRedirects=(ObjectName=,OldClassName="MaterialExpressionLandscapeLayerCoords",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerCoords",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 554 | +ActiveClassRedirects=(ObjectName=,OldClassName="MaterialExpressionLandscapeLayerSwitch",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerSwitch",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 555 | +ActiveClassRedirects=(ObjectName=,OldClassName="MaterialExpressionLandscapeLayerWeight",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerWeight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 556 | +ActiveClassRedirects=(ObjectName=,OldClassName="MaterialExpressionLandscapeVisibilityMask",NewClassName="/Script/Landscape.MaterialExpressionLandscapeVisibilityMask",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 557 | +ActiveClassRedirects=(ObjectName=,OldClassName="ProceduralFoliageActor",NewClassName="ProceduralFoliageVolume",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 558 | +ActiveClassRedirects=(ObjectName=,OldClassName="ProceduralFoliage",NewClassName="ProceduralFoliageSpawner",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 559 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimationCompressionAlgorithm",NewClassName="AnimCompress",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 560 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimationCompressionAlgorithm_Automatic",NewClassName="AnimCompress_Automatic",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 561 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimationCompressionAlgorithm_BitwiseCompressOnly",NewClassName="AnimCompress_BitwiseCompressOnly",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 562 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimationCompressionAlgorithm_LeastDestructive",NewClassName="AnimCompress_LeastDestructive",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 563 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimationCompressionAlgorithm_PerTrackCompression",NewClassName="AnimCompress_PerTrackCompression",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 564 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimationCompressionAlgorithm_RemoveEverySecondKey",NewClassName="AnimCompress_RemoveEverySecondKey",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 565 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimationCompressionAlgorithm_RemoveLinearKeys",NewClassName="AnimCompress_RemoveLinearKeys",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 566 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimationCompressionAlgorithm_RemoveTrivialKeys",NewClassName="AnimCompress_RemoveTrivialKeys",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 567 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimationCompressionAlgorithm_RevertToRaw",NewClassName="AnimCompress_RevertToRaw",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 568 | +ActiveClassRedirects=(ObjectName=,OldClassName="AIController",NewClassName="/Script/AIModule.AIController",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 569 | +ActiveClassRedirects=(ObjectName=,OldClassName="AIResourceInterface",NewClassName="/Script/AIModule.AIResourceInterface",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 570 | +ActiveClassRedirects=(ObjectName=,OldClassName="AISystem",NewClassName="/Script/AIModule.AISystem",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 571 | +ActiveClassRedirects=(ObjectName=,OldClassName="AITypes",NewClassName="/Script/AIModule.AITypes",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 572 | +ActiveClassRedirects=(ObjectName=,OldClassName="BrainComponent",NewClassName="/Script/AIModule.BrainComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 573 | +ActiveClassRedirects=(ObjectName=,OldClassName="KismetAIAsyncTaskProxy",NewClassName="/Script/AIModule.AIAsyncTaskBlueprintProxy",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 574 | +ActiveClassRedirects=(ObjectName=,OldClassName="KismetAIHelperLibrary",NewClassName="/Script/AIModule.AIBlueprintHelperLibrary",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 575 | +ActiveClassRedirects=(ObjectName=,OldClassName="BehaviorTree",NewClassName="/Script/AIModule.BehaviorTree",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 576 | +ActiveClassRedirects=(ObjectName=,OldClassName="BehaviorTreeComponent",NewClassName="/Script/AIModule.BehaviorTreeComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 577 | +ActiveClassRedirects=(ObjectName=,OldClassName="BehaviorTreeManager",NewClassName="/Script/AIModule.BehaviorTreeManager",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 578 | +ActiveClassRedirects=(ObjectName=,OldClassName="BehaviorTreeTypes",NewClassName="/Script/AIModule.BehaviorTreeTypes",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 579 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardComponent",NewClassName="/Script/AIModule.BlackboardComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 580 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardData",NewClassName="/Script/AIModule.BlackboardData",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 581 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTAuxiliaryNode",NewClassName="/Script/AIModule.BTAuxiliaryNode",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 582 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTCompositeNode",NewClassName="/Script/AIModule.BTCompositeNode",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 583 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator",NewClassName="/Script/AIModule.BTDecorator",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 584 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTFunctionLibrary",NewClassName="/Script/AIModule.BTFunctionLibrary",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 585 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTNode",NewClassName="/Script/AIModule.BTNode",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 586 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTService",NewClassName="/Script/AIModule.BTService",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 587 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTaskNode",NewClassName="/Script/AIModule.BTTaskNode",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 588 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyAllTypes",NewClassName="/Script/AIModule.BlackboardKeyAllTypes",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 589 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType",NewClassName="/Script/AIModule.BlackboardKeyType",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 590 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_Bool",NewClassName="/Script/AIModule.BlackboardKeyType_Bool",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 591 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_Class",NewClassName="/Script/AIModule.BlackboardKeyType_Class",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 592 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_Enum",NewClassName="/Script/AIModule.BlackboardKeyType_Enum",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 593 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_Float",NewClassName="/Script/AIModule.BlackboardKeyType_Float",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 594 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_Int",NewClassName="/Script/AIModule.BlackboardKeyType_Int",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 595 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_Name",NewClassName="/Script/AIModule.BlackboardKeyType_Name",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 596 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_NativeEnum",NewClassName="/Script/AIModule.BlackboardKeyType_NativeEnum",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 597 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_Object",NewClassName="/Script/AIModule.BlackboardKeyType_Object",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 598 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_String",NewClassName="/Script/AIModule.BlackboardKeyType_String",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 599 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_Vector",NewClassName="/Script/AIModule.BlackboardKeyType_Vector",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 600 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTComposite_Selector",NewClassName="/Script/AIModule.BTComposite_Selector",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 601 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTComposite_Sequence",NewClassName="/Script/AIModule.BTComposite_Sequence",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 602 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTComposite_SimpleParallel",NewClassName="/Script/AIModule.BTComposite_SimpleParallel",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 603 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_Blackboard",NewClassName="/Script/AIModule.BTDecorator_Blackboard",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 604 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_BlackboardBase",NewClassName="/Script/AIModule.BTDecorator_BlackboardBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 605 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_BlueprintBase",NewClassName="/Script/AIModule.BTDecorator_BlueprintBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 606 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_CompareBBEntries",NewClassName="/Script/AIModule.BTDecorator_CompareBBEntries",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 607 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_ConeCheck",NewClassName="/Script/AIModule.BTDecorator_ConeCheck",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 608 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_Cooldown",NewClassName="/Script/AIModule.BTDecorator_Cooldown",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 609 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_DoesPathExist",NewClassName="/Script/AIModule.BTDecorator_DoesPathExist",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 610 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_ForceSuccess",NewClassName="/Script/AIModule.BTDecorator_ForceSuccess",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 611 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_KeepInCone",NewClassName="/Script/AIModule.BTDecorator_KeepInCone",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 612 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_Loop",NewClassName="/Script/AIModule.BTDecorator_Loop",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 613 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_Optional",NewClassName="/Script/AIModule.BTDecorator_ForceSuccess",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 614 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_ReachedMoveGoal",NewClassName="/Script/AIModule.BTDecorator_ReachedMoveGoal",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 615 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_TimeLimit",NewClassName="/Script/AIModule.BTDecorator_TimeLimit",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 616 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTService_BlackboardBase",NewClassName="/Script/AIModule.BTService_BlackboardBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 617 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTService_BlueprintBase",NewClassName="/Script/AIModule.BTService_BlueprintBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 618 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTService_DefaultFocus",NewClassName="/Script/AIModule.BTService_DefaultFocus",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 619 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_BlackboardBase",NewClassName="/Script/AIModule.BTTask_BlackboardBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 620 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_BlueprintBase",NewClassName="/Script/AIModule.BTTask_BlueprintBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 621 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_MakeNoise",NewClassName="/Script/AIModule.BTTask_MakeNoise",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 622 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_MoveDirectlyToward",NewClassName="/Script/AIModule.BTTask_MoveDirectlyToward",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 623 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_MoveTo",NewClassName="/Script/AIModule.BTTask_MoveTo",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 624 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_PlaySound",NewClassName="/Script/AIModule.BTTask_PlaySound",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 625 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_RunBehavior",NewClassName="/Script/AIModule.BTTask_RunBehavior",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 626 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_RunEQSQuery",NewClassName="/Script/AIModule.BTTask_RunEQSQuery",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 627 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_Wait",NewClassName="/Script/AIModule.BTTask_Wait",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 628 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQuery",NewClassName="/Script/AIModule.EnvQuery",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 629 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryContext",NewClassName="/Script/AIModule.EnvQueryContext",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 630 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryGenerator",NewClassName="/Script/AIModule.EnvQueryGenerator",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 631 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryManager",NewClassName="/Script/AIModule.EnvQueryManager",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 632 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryOption",NewClassName="/Script/AIModule.EnvQueryOption",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 633 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryTest",NewClassName="/Script/AIModule.EnvQueryTest",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 634 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryTypes",NewClassName="/Script/AIModule.EnvQueryTypes",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 635 | +ActiveClassRedirects=(ObjectName=,OldClassName="EQSQueryResultSourceInterface",NewClassName="/Script/AIModule.EQSQueryResultSourceInterface",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 636 | +ActiveClassRedirects=(ObjectName=,OldClassName="EQSRenderingComponent",NewClassName="/Script/AIModule.EQSRenderingComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 637 | +ActiveClassRedirects=(ObjectName=,OldClassName="EQSTestingPawn",NewClassName="/Script/AIModule.EQSTestingPawn",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 638 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryContext_BlueprintBase",NewClassName="/Script/AIModule.EnvQueryContext_BlueprintBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 639 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryContext_Item",NewClassName="/Script/AIModule.EnvQueryContext_Item",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 640 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryContext_Querier",NewClassName="/Script/AIModule.EnvQueryContext_Querier",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 641 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryGenerator_Composite",NewClassName="/Script/AIModule.EnvQueryGenerator_Composite",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 642 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryGenerator_OnCircle",NewClassName="/Script/AIModule.EnvQueryGenerator_OnCircle",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 643 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryGenerator_PathingGrid",NewClassName="/Script/AIModule.EnvQueryGenerator_PathingGrid",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 644 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryGenerator_ProjectedPoints",NewClassName="/Script/AIModule.EnvQueryGenerator_ProjectedPoints",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 645 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryGenerator_SimpleGrid",NewClassName="/Script/AIModule.EnvQueryGenerator_SimpleGrid",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 646 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryAllItemTypes",NewClassName="/Script/AIModule.EnvQueryAllItemTypes",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 647 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryItemType",NewClassName="/Script/AIModule.EnvQueryItemType",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 648 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryItemType_Actor",NewClassName="/Script/AIModule.EnvQueryItemType_Actor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 649 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryItemType_ActorBase",NewClassName="/Script/AIModule.EnvQueryItemType_ActorBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 650 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryItemType_Direction",NewClassName="/Script/AIModule.EnvQueryItemType_Direction",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 651 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryItemType_Point",NewClassName="/Script/AIModule.EnvQueryItemType_Point",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 652 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryItemType_VectorBase",NewClassName="/Script/AIModule.EnvQueryItemType_VectorBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 653 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryTest_Distance",NewClassName="/Script/AIModule.EnvQueryTest_Distance",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 654 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryTest_Dot",NewClassName="/Script/AIModule.EnvQueryTest_Dot",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 655 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryTest_Pathfinding",NewClassName="/Script/AIModule.EnvQueryTest_Pathfinding",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 656 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryTest_Trace",NewClassName="/Script/AIModule.EnvQueryTest_Trace",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 657 | +ActiveClassRedirects=(ObjectName=,OldClassName="CrowdAgentInterface",NewClassName="/Script/AIModule.CrowdAgentInterface",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 658 | +ActiveClassRedirects=(ObjectName=,OldClassName="CrowdFollowingComponent",NewClassName="/Script/AIModule.CrowdFollowingComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 659 | +ActiveClassRedirects=(ObjectName=,OldClassName="CrowdManager",NewClassName="/Script/AIModule.CrowdManager",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 660 | +ActiveClassRedirects=(ObjectName=,OldClassName="PathFollowingComponent",NewClassName="/Script/AIModule.PathFollowingComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 661 | +ActiveClassRedirects=(ObjectName=,OldClassName="PawnSensingComponent",NewClassName="/Script/AIModule.PawnSensingComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 662 | +ActiveClassRedirects=(ObjectName=,OldClassName="EditorGameAgnosticSettings",NewClassName="/Script/UnrealEd.EditorSettings",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 663 | +ActiveClassRedirects=(ObjectName=,OldClassName="EditorUserSettings",NewClassName="/Script/UnrealEd.EditorPerProjectUserSettings",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 664 | +ActiveClassRedirects=(ObjectName=,OldClassName="SpriteComponent",NewClassName="BillboardComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 665 | +ActiveClassRedirects=(ObjectName=,OldClassName="MaterialSpriteComponent",NewClassName="MaterialBillboardComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 666 | +ActiveClassRedirects=(ObjectName=,OldClassName="WidgetBlueprint",NewClassName="/Script/UMGEditor.WidgetBlueprint",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 667 | +ActiveClassRedirects=(ObjectName=,OldClassName="SReply",NewClassName="EventReply",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 668 | +ActiveClassRedirects=(ObjectName=,OldClassName="ScriptComponent",NewClassName="ScriptPluginComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 669 | +ActiveClassRedirects=(ObjectName=,OldClassName="PaperRenderComponent",NewClassName="/Script/Paper2D.PaperSpriteComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 670 | +ActiveClassRedirects=(ObjectName=,OldClassName="PaperAnimatedRenderComponent",NewClassName="/Script/Paper2D.PaperFlipbookComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 671 | +ActiveClassRedirects=(ObjectName=,OldClassName="PaperRenderActor",NewClassName="/Script/Paper2D.PaperSpriteActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 672 | +ActiveClassRedirects=(ObjectName=,OldClassName="PaperTileMapRenderComponent",NewClassName="/Script/Paper2D.PaperTileMapComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 673 | +ActiveClassRedirects=(ObjectName=,OldClassName="PaperSpriteSheet",NewClassName="/Script/PaperSpritesheetImporter.PaperSpriteSheet",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 674 | +ActiveClassRedirects=(ObjectName=,OldClassName="ECollisionTraceFlag",NewClassName="/Script/Engine.BodySetupEnums:ECollisionTraceFlag",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 675 | +ActiveClassRedirects=(ObjectName=,OldClassName="EBodyCollisionResponse",NewClassName="/Script/Engine.BodySetupEnums:EBodyCollisionResponse",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 676 | +ActiveClassRedirects=(ObjectName=,OldClassName="EPhysicsType",NewClassName="/Script/Engine.BodySetupEnums:EPhysicsType",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 677 | +ActiveClassRedirects=(ObjectName=,OldClassName="PlayerCamera",NewClassName="PlayerCameraManager",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 678 | +ActiveClassRedirects=(ObjectName=,OldClassName="EModifyFrequency",NewClassName="EComponentMobility",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 679 | +ActiveClassRedirects=(ObjectName=,OldClassName="EMaterialLightingModel",NewClassName="EMaterialShadingModel",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 680 | +ActiveClassRedirects=(ObjectName=,OldClassName="GameReplicationInfo",NewClassName="/Script/Engine.GameState",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 681 | +ActiveClassRedirects=(ObjectName=,OldClassName="GameInfo",NewClassName="/Script/Engine.GameMode",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 682 | +ActiveClassRedirects=(ObjectName=,OldClassName="PlayerReplicationInfo",NewClassName="/Script/Engine.PlayerState",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 683 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimGraphNode_BlendSpace",NewClassName="/Script/AnimGraph.AnimGraphNode_BlendSpacePlayer",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 684 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimNode_BlendSpace",NewClassName="/Script/Engine.AnimNode_BlendSpacePlayer",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 685 | +ActiveClassRedirects=(ObjectName=,OldClassName="ETransitionGetterType",NewClassName="ETransitionGetter::Type",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 686 | +ActiveClassRedirects=(ObjectName=,OldClassName="ESlateCheckBoxState",NewClassName="ECheckBoxState",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 687 | +ActiveClassRedirects=(ObjectName=,OldClassName="SlateWidgetStyleAsset",NewClassName="/Script/SlateCore.SlateWidgetStyleAsset",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 688 | +ActiveClassRedirects=(ObjectName=,OldClassName="SlateWidgetStyleContainerBase",NewClassName="/Script/SlateCore.SlateWidgetStyleContainerBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 689 | +ActiveClassRedirects=(ObjectName=,OldClassName="InstancedFoliageSettings",NewClassName="/Script/Foliage.FoliageType_InstancedStaticMesh",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 690 | +ActiveClassRedirects=(ObjectName=,OldClassName="FoliageType",NewClassName="/Script/Foliage.FoliageType",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 691 | +ActiveClassRedirects=(ObjectName=,OldClassName="FoliageType_InstancedStaticMesh",NewClassName="/Script/Foliage.FoliageType_InstancedStaticMesh",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 692 | +ActiveClassRedirects=(ObjectName=,OldClassName="InstancedFoliageActor",NewClassName="/Script/Foliage.InstancedFoliageActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 693 | +ActiveClassRedirects=(ObjectName=,OldClassName="InteractiveFoliageComponent",NewClassName="/Script/Foliage.InteractiveFoliageComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 694 | +ActiveClassRedirects=(ObjectName=,OldClassName="FoliageVertexColorMask",NewClassName="/Script/Foliage.FoliageVertexColorMask",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 695 | +ActiveClassRedirects=(ObjectName=,OldClassName="EmitterSpawnable",NewClassName="Emitter",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 696 | +ActiveClassRedirects=(ObjectName=,OldClassName="EBoneSpaces",NewClassName="/Script/Engine.SkinnedMeshComponent:EBoneSpaces",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 697 | -ActiveStructRedirects=(OldStructName="ProceduralFoliageTypeData",NewStructName="FoliageTypeObject") 698 | -ActiveStructRedirects=(OldStructName="VimDebugData",NewStructName="AnimBlueprintDebugData") 699 | -ActiveStructRedirects=(OldStructName="KeyboardEvent",NewStructName="KeyEvent") 700 | -ActiveStructRedirects=(OldStructName="KeyboardFocusEvent",NewStructName="FocusEvent") 701 | -ActiveStructRedirects=(OldStructName="SpritePolygon",NewStructName="SpriteGeometryShape") 702 | -ActiveStructRedirects=(OldStructName="SpritePolygonCollection",NewStructName="SpriteGeometryCollection") 703 | -ActiveStructRedirects=(OldStructName="AnimNode_BlendSpace",NewStructName="AnimNode_BlendSpacePlayer") 704 | -ActiveStructRedirects=(OldStructName="FFormatTextArgument",NewStructName="/Script/Engine.FFormatTextArgument") 705 | +ActiveStructRedirects=(OldStructName="ProceduralFoliageTypeData",NewStructName="FoliageTypeObject") 706 | +ActiveStructRedirects=(OldStructName="VimDebugData",NewStructName="AnimBlueprintDebugData") 707 | +ActiveStructRedirects=(OldStructName="KeyboardEvent",NewStructName="KeyEvent") 708 | +ActiveStructRedirects=(OldStructName="KeyboardFocusEvent",NewStructName="FocusEvent") 709 | +ActiveStructRedirects=(OldStructName="SpritePolygon",NewStructName="SpriteGeometryShape") 710 | +ActiveStructRedirects=(OldStructName="SpritePolygonCollection",NewStructName="SpriteGeometryCollection") 711 | +ActiveStructRedirects=(OldStructName="AnimNode_BlendSpace",NewStructName="AnimNode_BlendSpacePlayer") 712 | +ActiveStructRedirects=(OldStructName="FFormatTextArgument",NewStructName="/Script/Engine.FFormatTextArgument") 713 | PreIntegratedSkinBRDFTextureName=/Engine/EngineMaterials/PreintegratedSkinBRDF.PreintegratedSkinBRDF 714 | MiniFontTextureName=/Engine/EngineMaterials/MiniFont.MiniFont 715 | WeightMapPlaceholderTextureName=/Engine/EngineMaterials/WeightMapPlaceholderTexture.WeightMapPlaceholderTexture 716 | LightMapDensityTextureName=/Engine/EngineMaterials/DefaultWhiteGrid.DefaultWhiteGrid 717 | NearClipPlane=10.000000 718 | bHardwareSurveyEnabled=True 719 | bSubtitlesEnabled=True 720 | bSubtitlesForcedOff=False 721 | TimeBetweenPurgingPendingKillObjects=60.000000 722 | bUseBackgroundLevelStreaming=True 723 | AsyncLoadingTimeLimit=5.000000 724 | bAsyncLoadingUseFullTimeLimit=True 725 | PriorityAsyncLoadingExtraTime=20.000000 726 | LevelStreamingActorsUpdateTimeLimit=5.000000 727 | LevelStreamingComponentsRegistrationGranularity=10 728 | MaximumLoopIterationCount=1000000 729 | bCanBlueprintsTickByDefault=True 730 | bEnableEditorPSysRealtimeLOD=False 731 | bUseFixedFrameRate=False 732 | FixedFrameRate=30.000000 733 | bSmoothFrameRate=True 734 | SmoothedFrameRateRange=(LowerBound=(Type=Inclusive,Value=22.000000),UpperBound=(Type=Exclusive,Value=120.000000)) 735 | bCheckForMultiplePawnsSpawnedInAFrame=False 736 | NumPawnsAllowedToBeSpawnedInAFrame=2 737 | bShouldGenerateLowQualityLightmaps=True 738 | MeshLODRange=0.000000 739 | bAllowMatureLanguage=False 740 | CameraRotationThreshold=45.000000 741 | CameraTranslationThreshold=10000.000000 742 | PrimitiveProbablyVisibleTime=8.000000 743 | MaxOcclusionPixelsFraction=0.100000 744 | bPauseOnLossOfFocus=False 745 | MaxParticleResize=0 746 | MaxParticleResizeWarn=0 747 | PhysicErrorCorrection=(LinearDeltaThresholdSq=5.000000,LinearInterpAlpha=0.200000,LinearRecipFixTime=1.000000,AngularDeltaThreshold=0.628319,AngularInterpAlpha=0.100000,AngularRecipFixTime=1.000000,BodySpeedThresholdSq=0.200000) 748 | NetClientTicksPerSecond=200.000000 749 | DisplayGamma=2.200000 750 | MinDesiredFrameRate=35.000000 751 | DefaultSelectedMaterialColor=(R=0.840000,G=0.920000,B=0.020000,A=1.000000) 752 | bEnableOnScreenDebugMessages=True 753 | bSuppressMapWarnings=False 754 | bCookSeparateSharedMPGameContent=False 755 | bDisableAILogging=False 756 | bEnableVisualLogRecordingOnStart=0 757 | ParticleEventManagerClassPath=/Script/Engine.ParticleEventManager 758 | -NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/OnlineSubsystemUtils.IpNetDriver",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver") 759 | -NetDriverDefinitions=(DefName="DemoNetDriver",DriverClassName="/Script/Engine.DemoNetDriver",DriverClassNameFallback="/Script/Engine.DemoNetDriver") 760 | +NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/OnlineSubsystemUtils.IpNetDriver",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver") 761 | +NetDriverDefinitions=(DefName="DemoNetDriver",DriverClassName="/Script/Engine.DemoNetDriver",DriverClassNameFallback="/Script/Engine.DemoNetDriver") 762 | 763 | 764 | --------------------------------------------------------------------------------