├── .gitignore ├── Config ├── DefaultEditor.ini ├── DefaultEngine.ini ├── DefaultGame.ini ├── DefaultGameUserSettings.ini └── DefaultInput.ini ├── Content └── RealSense │ ├── 3DScan │ ├── Blueprints │ │ ├── BP_Scan3DGameMode.uasset │ │ ├── ButtonsState.uasset │ │ ├── RealSensePawn.uasset │ │ ├── ScanActor.uasset │ │ └── UI │ │ │ ├── Scan3DHUD.uasset │ │ │ └── Scan3DUI.uasset │ ├── Faces │ │ └── .gitignore │ ├── Maps │ │ └── Scan3D.umap │ └── Materials │ │ └── VertexColorMat.uasset │ ├── CameraViewer │ ├── Blueprints │ │ ├── BP_CameraViewerGameMode.uasset │ │ ├── BP_CameraViewerGameMode1.uasset │ │ ├── BP_CameraViewerGameMode2.uasset │ │ ├── CameraViewerHUD.uasset │ │ ├── CameraViewerHUD2.uasset │ │ └── CameraViewerUI.uasset │ └── Maps │ │ └── CameraViewer.umap │ ├── Common │ └── Blueprints │ │ ├── ComboBoxItem.uasset │ │ └── gradient.uasset │ ├── HeadTracking │ ├── Blueprints │ │ ├── BP_HeadTrackingGameMode.uasset │ │ ├── HeadTrackingPawn.uasset │ │ └── HeadTrackingPlayerController.uasset │ └── Maps │ │ └── HeadTracking.umap │ └── RealSenseFunctionLibrary.uasset ├── Plugins └── RealSensePlugin │ ├── RealSensePlugin.uplugin │ ├── Resources │ └── Icon128.png │ └── Source │ └── RealSensePlugin │ ├── Private │ ├── CameraStreamComponent.cpp │ ├── HeadTrackingComponent.cpp │ ├── RealSenseBlueprintLibrary.cpp │ ├── RealSenseComponent.cpp │ ├── RealSenseImpl.cpp │ ├── RealSenseImpl.h │ ├── RealSensePlugin.cpp │ ├── RealSensePluginPrivatePCH.h │ ├── RealSenseSessionManager.cpp │ ├── RealSenseUtils.cpp │ └── Scan3DComponent.cpp │ ├── Public │ ├── CameraStreamComponent.h │ ├── HeadTrackingComponent.h │ ├── IRealSensePlugin.h │ ├── RealSenseBlueprintLibrary.h │ ├── RealSenseComponent.h │ ├── RealSenseSessionManager.h │ ├── RealSenseTypes.h │ ├── RealSenseUtils.h │ └── Scan3DComponent.h │ └── RealSensePlugin.Build.cs ├── README.md ├── RealSenseSandbox.uproject ├── Source ├── RealSenseSandbox.Target.cs ├── RealSenseSandbox │ ├── RealSenseSandbox.Build.cs │ ├── RealSenseSandbox.cpp │ └── RealSenseSandbox.h └── RealSenseSandboxEditor.Target.cs ├── UE4 RealSense Plugin Getting Started Guide.docx └── license.txt /.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/ -------------------------------------------------------------------------------- /Config/DefaultEditor.ini: -------------------------------------------------------------------------------- 1 | [EditoronlyBP] 2 | bAllowClassAndBlueprintPinMatching=true 3 | bReplaceBlueprintWithClass=true 4 | bDontLoadBlueprintOutsideEditor=true 5 | bBlueprintIsNotBlueprintType=true 6 | -------------------------------------------------------------------------------- /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/HardwareTargeting.HardwareTargetingSettings] 50 | TargetedHardwareClass=Desktop 51 | AppliedTargetedHardwareClass=Desktop 52 | DefaultGraphicsPerformance=Maximum 53 | AppliedDefaultGraphicsPerformance=Maximum 54 | 55 | [/Script/Engine.Engine] 56 | TinyFontName=/Engine/EngineFonts/RobotoTiny.RobotoTiny 57 | SmallFontName=/Engine/EngineFonts/Roboto.Roboto 58 | MediumFontName=/Engine/EngineFonts/Roboto.Roboto 59 | LargeFontName=/Engine/EngineFonts/Roboto.Roboto 60 | SubtitleFontName=/Engine/EngineFonts/Roboto.Roboto 61 | ConsoleClassName=/Script/Engine.Console 62 | GameViewportClientClassName=/Script/Engine.GameViewportClient 63 | LocalPlayerClassName=/Script/Engine.LocalPlayer 64 | WorldSettingsClassName=/Script/Engine.WorldSettings 65 | NavigationSystemClassName=/Script/Engine.NavigationSystem 66 | AvoidanceManagerClassName=/Script/Engine.AvoidanceManager 67 | PhysicsCollisionHandlerClassName=/Script/Engine.PhysicsCollisionHandler 68 | GameUserSettingsClassName=/Script/Engine.GameUserSettings 69 | AIControllerClassName=/Script/AIModule.AIController 70 | LevelScriptActorClassName=/Script/Engine.LevelScriptActor 71 | DefaultBlueprintBaseClassName=/Script/Engine.Actor 72 | GameSingletonClassName=None 73 | DefaultTireTypeName=/Engine/EngineTireTypes/DefaultTireType.DefaultTireType 74 | DefaultPreviewPawnClassName=/Script/Engine.DefaultPawn 75 | PlayOnConsoleSaveDir=Autosaves 76 | DefaultTextureName=/Engine/EngineResources/DefaultTexture.DefaultTexture 77 | DefaultDiffuseTextureName=/Engine/EngineMaterials/DefaultDiffuse.DefaultDiffuse 78 | DefaultBSPVertexTextureName=/Engine/EditorResources/BSPVertex.BSPVertex 79 | HighFrequencyNoiseTextureName=/Engine/EngineMaterials/Good64x64TilingNoiseHighFreq.Good64x64TilingNoiseHighFreq 80 | DefaultBokehTextureName=/Engine/EngineMaterials/DefaultBokeh.DefaultBokeh 81 | WireframeMaterialName=/Engine/EngineDebugMaterials/WireframeMaterial.WireframeMaterial 82 | GeomMaterialName=/Engine/EngineDebugMaterials/GeomMaterial.GeomMaterial 83 | DebugMeshMaterialName=/Engine/EngineDebugMaterials/DebugMeshMaterial.DebugMeshMaterial 84 | LevelColorationLitMaterialName=/Engine/EngineDebugMaterials/LevelColorationLitMaterial.LevelColorationLitMaterial 85 | LevelColorationUnlitMaterialName=/Engine/EngineDebugMaterials/LevelColorationUnlitMaterial.LevelColorationUnlitMaterial 86 | LightingTexelDensityName=/Engine/EngineDebugMaterials/MAT_LevelColorationLitLightmapUV.MAT_LevelColorationLitLightmapUV 87 | ShadedLevelColorationLitMaterialName=/Engine/EngineDebugMaterials/ShadedLevelColorationLitMaterial.ShadedLevelColorationLitMaterial 88 | ShadedLevelColorationUnlitMaterialName=/Engine/EngineDebugMaterials/ShadedLevelColorationUnlitMateri.ShadedLevelColorationUnlitMateri 89 | RemoveSurfaceMaterialName=/Engine/EngineMaterials/RemoveSurfaceMaterial.RemoveSurfaceMaterial 90 | VertexColorMaterialName=/Engine/EngineDebugMaterials/VertexColorMaterial.VertexColorMaterial 91 | VertexColorViewModeMaterialName_ColorOnly=/Engine/EngineDebugMaterials/VertexColorViewMode_ColorOnly.VertexColorViewMode_ColorOnly 92 | VertexColorViewModeMaterialName_AlphaAsColor=/Engine/EngineDebugMaterials/VertexColorViewMode_AlphaAsColor.VertexColorViewMode_AlphaAsColor 93 | VertexColorViewModeMaterialName_RedOnly=/Engine/EngineDebugMaterials/VertexColorViewMode_RedOnly.VertexColorViewMode_RedOnly 94 | VertexColorViewModeMaterialName_GreenOnly=/Engine/EngineDebugMaterials/VertexColorViewMode_GreenOnly.VertexColorViewMode_GreenOnly 95 | VertexColorViewModeMaterialName_BlueOnly=/Engine/EngineDebugMaterials/VertexColorViewMode_BlueOnly.VertexColorViewMode_BlueOnly 96 | BoneWeightMaterialName=/Engine/EngineDebugMaterials/BoneWeightMaterial.BoneWeightMaterial 97 | ConstraintLimitMaterialName=/Engine/EditorMaterials/PhAT_JointLimitMaterial.PhAT_JointLimitMaterial 98 | InvalidLightmapSettingsMaterialName=/Engine/EngineMaterials/M_InvalidLightmapSettings.M_InvalidLightmapSettings 99 | PreviewShadowsIndicatorMaterialName=/Engine/EditorMaterials/PreviewShadowIndicatorMaterial.PreviewShadowIndicatorMaterial 100 | ArrowMaterialName=/Engine/EditorMaterials/GizmoMaterial.GizmoMaterial 101 | LightingOnlyBrightness=(R=0.300000,G=0.300000,B=0.300000,A=1.000000) 102 | -LightComplexityColors=(R=0,G=0,B=0,A=1) 103 | -LightComplexityColors=(R=0,G=255,B=0,A=1) 104 | -LightComplexityColors=(R=63,G=191,B=0,A=1) 105 | -LightComplexityColors=(R=127,G=127,B=0,A=1) 106 | -LightComplexityColors=(R=191,G=63,B=0,A=1) 107 | -LightComplexityColors=(R=255,G=0,B=0,A=1) 108 | +LightComplexityColors=(B=0,G=0,R=0,A=1) 109 | +LightComplexityColors=(B=0,G=255,R=0,A=1) 110 | +LightComplexityColors=(B=0,G=191,R=63,A=1) 111 | +LightComplexityColors=(B=0,G=127,R=127,A=1) 112 | +LightComplexityColors=(B=0,G=63,R=191,A=1) 113 | +LightComplexityColors=(B=0,G=0,R=255,A=1) 114 | -ShaderComplexityColors=(R=0.0,G=1.0,B=0.127,A=1.0) 115 | -ShaderComplexityColors=(R=0.0,G=1.0,B=0.0,A=1.0) 116 | -ShaderComplexityColors=(R=0.046,G=0.52,B=0.0,A=1.0) 117 | -ShaderComplexityColors=(R=0.215,G=0.215,B=0.0,A=1.0) 118 | -ShaderComplexityColors=(R=0.52,G=0.046,B=0.0,A=1.0) 119 | -ShaderComplexityColors=(R=0.7,G=0.0,B=0.0,A=1.0) 120 | -ShaderComplexityColors=(R=1.0,G=0.0,B=0.0,A=1.0) 121 | -ShaderComplexityColors=(R=1.0,G=0.0,B=0.5,A=1.0) 122 | -ShaderComplexityColors=(R=1.0,G=0.9,B=0.9,A=1.0) 123 | +ShaderComplexityColors=(R=0.000000,G=1.000000,B=0.127000,A=1.000000) 124 | +ShaderComplexityColors=(R=0.000000,G=1.000000,B=0.000000,A=1.000000) 125 | +ShaderComplexityColors=(R=0.046000,G=0.520000,B=0.000000,A=1.000000) 126 | +ShaderComplexityColors=(R=0.215000,G=0.215000,B=0.000000,A=1.000000) 127 | +ShaderComplexityColors=(R=0.520000,G=0.046000,B=0.000000,A=1.000000) 128 | +ShaderComplexityColors=(R=0.700000,G=0.000000,B=0.000000,A=1.000000) 129 | +ShaderComplexityColors=(R=1.000000,G=0.000000,B=0.000000,A=1.000000) 130 | +ShaderComplexityColors=(R=1.000000,G=0.000000,B=0.500000,A=1.000000) 131 | +ShaderComplexityColors=(R=1.000000,G=0.900000,B=0.900000,A=1.000000) 132 | -StationaryLightOverlapColors=(R=0.0,G=1.0,B=0.127,A=1.0) 133 | -StationaryLightOverlapColors=(R=0.0,G=1.0,B=0.0,A=1.0) 134 | -StationaryLightOverlapColors=(R=0.046,G=0.52,B=0.0,A=1.0) 135 | -StationaryLightOverlapColors=(R=0.215,G=0.215,B=0.0,A=1.0) 136 | -StationaryLightOverlapColors=(R=0.52,G=0.046,B=0.0,A=1.0) 137 | -StationaryLightOverlapColors=(R=0.7,G=0.0,B=0.0,A=1.0) 138 | -StationaryLightOverlapColors=(R=1.0,G=0.0,B=0.0,A=1.0) 139 | -StationaryLightOverlapColors=(R=1.0,G=0.0,B=0.5,A=1.0) 140 | -StationaryLightOverlapColors=(R=1.0,G=0.9,B=0.9,A=1.0) 141 | +StationaryLightOverlapColors=(R=0.000000,G=1.000000,B=0.127000,A=1.000000) 142 | +StationaryLightOverlapColors=(R=0.000000,G=1.000000,B=0.000000,A=1.000000) 143 | +StationaryLightOverlapColors=(R=0.046000,G=0.520000,B=0.000000,A=1.000000) 144 | +StationaryLightOverlapColors=(R=0.215000,G=0.215000,B=0.000000,A=1.000000) 145 | +StationaryLightOverlapColors=(R=0.520000,G=0.046000,B=0.000000,A=1.000000) 146 | +StationaryLightOverlapColors=(R=0.700000,G=0.000000,B=0.000000,A=1.000000) 147 | +StationaryLightOverlapColors=(R=1.000000,G=0.000000,B=0.000000,A=1.000000) 148 | +StationaryLightOverlapColors=(R=1.000000,G=0.000000,B=0.500000,A=1.000000) 149 | +StationaryLightOverlapColors=(R=1.000000,G=0.900000,B=0.900000,A=1.000000) 150 | MaxPixelShaderAdditiveComplexityCount=2000.000000 151 | MaxES2PixelShaderAdditiveComplexityCount=600.000000 152 | MinLightMapDensity=0.000000 153 | IdealLightMapDensity=0.200000 154 | MaxLightMapDensity=0.800000 155 | bRenderLightMapDensityGrayscale=False 156 | RenderLightMapDensityGrayscaleScale=1.000000 157 | RenderLightMapDensityColorScale=1.000000 158 | LightMapDensityVertexMappedColor=(R=0.650000,G=0.650000,B=0.250000,A=1.000000) 159 | LightMapDensitySelectedColor=(R=1.000000,G=0.200000,B=1.000000,A=1.000000) 160 | -StatColorMappings=(StatName="AverageFPS",ColorMap=((In=15.0,Out=(R=255)),(In=30,Out=(R=255,G=255)),(In=45.0,Out=(G=255)))) 161 | -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)))) 162 | -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)))) 163 | +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) 164 | +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) 165 | +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) 166 | EditorBrushMaterialName=/Engine/EngineMaterials/EditorBrushMaterial.EditorBrushMaterial 167 | DefaultPhysMaterialName=/Engine/EngineMaterials/DefaultPhysicalMaterial.DefaultPhysicalMaterial 168 | -ActiveClassRedirects=(OldClassName="GameplayCueNotify",NewClassName="GameplayCueNotify_Static") 169 | -ActiveClassRedirects=(OldClassName="GameplayCueNotify_Blueprint",NewClassName="GameplayCueNotify_Actor") 170 | -ActiveClassRedirects=(OldClassName="RB_BodySetup",NewClassName="BodySetup") 171 | -ActiveClassRedirects=(OldClassName="AnimTreeInstance",NewClassName="AnimInstance") 172 | -ActiveClassRedirects=(OldClassName="VimInstance",NewClassName="AnimInstance") 173 | -ActiveClassRedirects=(OldClassName="VimBlueprint",NewClassName="AnimBlueprint") 174 | -ActiveClassRedirects=(OldClassName="VimGeneratedClass",NewClassName="AnimBlueprintGeneratedClass") 175 | -ActiveClassRedirects=(OldClassName="VimBlueprintFactory",NewClassName="AnimBlueprintFactory") 176 | -ActiveClassRedirects=(OldClassName="ReverbVolume",NewClassName="AudioVolume") 177 | -ActiveClassRedirects=(OldClassName="ReverbVolumeToggleable",NewClassName="AudioVolume") 178 | -ActiveClassRedirects=(OldClassName="BlueprintActorBase",NewClassName="Actor") 179 | -ActiveClassRedirects=(OldClassName="WorldInfo",NewClassName="WorldSettings") 180 | -ActiveClassRedirects=(OldClassName="RB_Handle",NewClassName="PhysicsHandleComponent") 181 | -ActiveClassRedirects=(OldClassName="RB_RadialForceComponent",NewClassName="RadialForceComponent") 182 | -ActiveClassRedirects=(OldClassName="SoundMode",NewClassName="SoundMix") 183 | -ActiveClassRedirects=(OldClassName="RB_ThrusterComponent",NewClassName="PhysicsThrusterComponent") 184 | -ActiveClassRedirects=(OldClassName="RB_Thruster",NewClassName="PhysicsThruster") 185 | -ActiveClassRedirects=(OldClassName="RB_ConstraintSetup",NewClassName="PhysicsConstraintTemplate") 186 | -ActiveClassRedirects=(OldClassName="RB_BSJointSetup",NewClassName="PhysicsConstraintTemplate") 187 | -ActiveClassRedirects=(OldClassName="RB_HingeSetup",NewClassName="PhysicsConstraintTemplate") 188 | -ActiveClassRedirects=(OldClassName="RB_PrismaticSetup",NewClassName="PhysicsConstraintTemplate") 189 | -ActiveClassRedirects=(OldClassName="RB_SkelJointSetup",NewClassName="PhysicsConstraintTemplate") 190 | -ActiveClassRedirects=(OldClassName="RB_ConstraintComponent",NewClassName="PhysicsConstraintComponent") 191 | -ActiveClassRedirects=(OldClassName="RB_ConstraintActor",NewClassName="PhysicsConstraintActor") 192 | -ActiveClassRedirects=(OldClassName="RB_BSJointActor",NewClassName="PhysicsBSJointActor") 193 | -ActiveClassRedirects=(OldClassName="RB_HingeActor",NewClassName="PhysicsHingeActor") 194 | -ActiveClassRedirects=(OldClassName="RB_PrismaticActor",NewClassName="PhysicsPrismaticActor") 195 | -ActiveClassRedirects=(OldClassName="PhysicsBSJointActor",NewClassName="PhysicsConstraintActor") 196 | -ActiveClassRedirects=(OldClassName="PhysicsHingeActor",NewClassName="PhysicsConstraintActor") 197 | -ActiveClassRedirects=(OldClassName="PhysicsPrismaticActor",NewClassName="PhysicsConstraintActor") 198 | -ActiveClassRedirects=(OldClassName="EMovementMode",NewClassName="/Script/Engine.EngineTypes:EMovementMode") 199 | -ActiveClassRedirects=(OldClassName="SensingComponent",NewClassName="PawnSensingComponent") 200 | -ActiveClassRedirects=(OldClassName="MovementComp_Character",NewClassName="CharacterMovementComponent") 201 | -ActiveClassRedirects=(OldClassName="MovementComp_Rotating",NewClassName="RotatingMovementComponent") 202 | -ActiveClassRedirects=(OldClassName="MovementComp_Projectile",NewClassName="ProjectileMovementComponent") 203 | -ActiveClassRedirects=(OldClassName="VehicleSim",NewClassName="VehicleMovementComponent") 204 | -ActiveClassRedirects=(OldClassName="VehicleSimNoDrive",NewClassName="VehicleMovementComponentNoDrive") 205 | -ActiveClassRedirects=(OldClassName="MovementComp_Vehicle",NewClassName="VehicleMovementComponent") 206 | -ActiveClassRedirects=(OldClassName="MovementComp_VehicleNoDrive",NewClassName="VehicleMovementComponentNoDrive") 207 | -ActiveClassRedirects=(OldClassName="DefaultPawnMovement",NewClassName="FloatingPawnMovement") 208 | -ActiveClassRedirects=(OldClassName="StaticMeshReplicatedComponent",NewClassName="StaticMeshComponent") 209 | -ActiveClassRedirects=(OldClassName="SkeletalMeshReplicatedComponent",NewClassName="SkeletalMeshComponent") 210 | -ActiveClassRedirects=(OldClassName="Vehicle",NewClassName="WheeledVehicle") 211 | -ActiveClassRedirects=(OldClassName="VehicleMovementComponent",NewClassName="WheeledVehicleMovementComponent") 212 | -ActiveClassRedirects=(OldClassName="VehicleMovementComponent4W",NewClassName="WheeledVehicleMovementComponent4W") 213 | -ActiveClassRedirects=(OldClassName="PointLightComponent",OldSubobjName="PointLightComponent0",NewSubobjName="LightComponent0") 214 | -ActiveClassRedirects=(OldClassName="DirectionalLightComponent",OldSubobjName="DirectionalLightComponent0",NewSubobjName="LightComponent0") 215 | -ActiveClassRedirects=(OldClassName="SpotLightComponent",OldSubobjName="SpotLightComponent0",NewSubobjName="LightComponent0") 216 | -ActiveClassRedirects=(OldClassName="DefaultPawn",OldSubobjName="SpectatorMovement0",NewSubobjName="MovementComponent0") 217 | -ActiveClassRedirects=(OldClassName="DefaultPawn",OldSubobjName="DefaultPawnMovement0",NewSubobjName="MovementComponent0") 218 | -ActiveClassRedirects=(OldClassName="/Script/BlueprintGraph.K2Node_CastToInterface",NewClassName="/Script/BlueprintGraph.K2Node_DynamicCast") 219 | -ActiveClassRedirects=(OldClassName="K2Node_CallSuperFunction",NewClassName="/Script/BlueprintGraph.K2Node_CallParentFunction") 220 | -ActiveClassRedirects=(OldClassName="K2Node_MathExpression",NewClassName="/Script/BlueprintGraph.K2Node_MathExpression") 221 | -ActiveClassRedirects=(OldClassName="/Script/CoreUObject.K2Node_MathExpression",NewClassName="/Script/BlueprintGraph.K2Node_MathExpression") 222 | -ActiveClassRedirects=(OldClassName="K2Node_Comment",NewClassName="/Script/UnrealEd.EdGraphNode_Comment") 223 | -ActiveClassRedirects=(OldClassName="EdGraphNode_Comment",NewClassName="/Script/UnrealEd.EdGraphNode_Comment") 224 | -ActiveClassRedirects=(OldClassName="SpotLightMovable",NewClassName="SpotLight") 225 | -ActiveClassRedirects=(OldClassName="SpotLightStatic",NewClassName="SpotLight") 226 | -ActiveClassRedirects=(OldClassName="SpotLightStationary",NewClassName="SpotLight") 227 | -ActiveClassRedirects=(OldClassName="PointLightMovable",NewClassName="PointLight") 228 | -ActiveClassRedirects=(OldClassName="PointLightStatic",NewClassName="PointLight") 229 | -ActiveClassRedirects=(OldClassName="PointLightStationary",NewClassName="PointLight") 230 | -ActiveClassRedirects=(OldClassName="DirectionalLightMovable",NewClassName="DirectionalLight") 231 | -ActiveClassRedirects=(OldClassName="DirectionalLightStatic",NewClassName="DirectionalLight") 232 | -ActiveClassRedirects=(OldClassName="DirectionalLightStationary",NewClassName="DirectionalLight") 233 | -ActiveClassRedirects=(OldClassName="InterpActor",NewClassName="StaticMeshActor") 234 | -ActiveClassRedirects=(OldClassName="PhysicsActor",NewClassName="StaticMeshActor") 235 | -ActiveClassRedirects=(OldClassName="SkeletalPhysicsActor",NewClassName="SkeletalMeshActor") 236 | -ActiveClassRedirects=(OldClassName="SingleAnimSkeletalActor",NewClassName="SkeletalMeshActor") 237 | -ActiveClassRedirects=(OldClassName="SingleAnimSkeletalComponent",NewClassName="SkeletalMeshComponent") 238 | -ActiveClassRedirects=(OldClassName="DynamicBlockingVolume",NewClassName="BlockingVolume") 239 | -ActiveClassRedirects=(OldClassName="DynamicPhysicsVolume",NewClassName="PhysicsVolume") 240 | -ActiveClassRedirects=(OldClassName="DynamicTriggerVolume",NewClassName="TriggerVolume") 241 | -ActiveClassRedirects=(OldClassName="AnimNode_SkeletalControlBase",NewClassName="/Script/Engine.AnimNode_SkeletalControlBase") 242 | -ActiveClassRedirects=(OldClassName="AnimNode_TwoBoneIK",NewClassName="/Script/Engine.AnimNode_TwoBoneIK") 243 | -ActiveClassRedirects=(OldClassName="AnimNode_RotationMultiplier",NewClassName="/Script/Engine.AnimNode_RotationMultiplier") 244 | -ActiveClassRedirects=(OldClassName="AnimNode_ModifyBone",NewClassName="/Script/Engine.AnimNode_ModifyBone") 245 | -ActiveClassRedirects=(OldClassName="AnimNode_CopyBone",NewClassName="/Script/Engine.AnimNode_CopyBone") 246 | -ActiveClassRedirects=(OldClassName="AnimNode_SpringBone",NewClassName="/Script/Engine.AnimNode_SpringBone") 247 | -ActiveClassRedirects=(OldClassName="NavAreaMeta",NewClassName="/Script/Engine.NavArea_Default",InstanceOnly="true") 248 | -ActiveClassRedirects=(OldClassName="NavAreaDefinition",NewClassName="/Script/Engine.NavArea") 249 | -ActiveClassRedirects=(OldClassName="NavAreaDefault",NewClassName="/Script/Engine.NavArea_Default") 250 | -ActiveClassRedirects=(OldClassName="NavAreaNull",NewClassName="/Script/Engine.NavArea_Null") 251 | -ActiveClassRedirects=(OldClassName="SmartNavLinkComponent",NewClassName="/Script/Engine.NavLinkCustomComponent") 252 | -ActiveClassRedirects=(OldClassName="ELockedAxis", NewClassName="EDOFMode") 253 | -ActiveClassRedirects=(OldClassName="BehaviorTreeNode",NewClassName="BehaviorTreeGraphNode") 254 | -ActiveClassRedirects=(OldClassName="BehaviorTreeNode_Composite",NewClassName="BehaviorTreeGraphNode_Composite") 255 | -ActiveClassRedirects=(OldClassName="BehaviorTreeNode_Decorator",NewClassName="BehaviorTreeGraphNode_Decorator") 256 | -ActiveClassRedirects=(OldClassName="BehaviorTreeNode_Root",NewClassName="BehaviorTreeGraphNode_Root") 257 | -ActiveClassRedirects=(OldClassName="BehaviorTreeNode_Task",NewClassName="BehaviorTreeGraphNode_Task") 258 | -ActiveClassRedirects=(OldClassName="BTTask_GoTo",NewClassName="BTTask_MoveTo") 259 | -ActiveClassRedirects=(OldClassName="BTTask_RunQuery",NewClassName="BTTask_RunEQSQuery") 260 | -ActiveClassRedirects=(OldClassName="MoveComponentAction",NewClassName="/Script/Engine/KismetSystemLibrary.MoveComponentAction") 261 | -ActiveClassRedirects=(OldClassName="AIDebugComponent",NewClassName="GameplayDebuggingComponent") 262 | -ActiveClassRedirects=(OldClassName="MaterialExpressionTerrainLayerCoords",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerCoords") 263 | -ActiveClassRedirects=(OldClassName="MaterialExpressionTerrainLayerSwitch",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerSwitch") 264 | -ActiveClassRedirects=(OldClassName="MaterialExpressionTerrainLayerWeight",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerWeight") 265 | -ActiveClassRedirects=(OldClassName="Landscape",NewClassName="/Script/Landscape.Landscape") 266 | -ActiveClassRedirects=(OldClassName="LandscapeGizmoActiveActor",NewClassName="/Script/Landscape.LandscapeGizmoActiveActor") 267 | -ActiveClassRedirects=(OldClassName="LandscapeGizmoActor",NewClassName="/Script/Landscape.LandscapeGizmoActor") 268 | -ActiveClassRedirects=(OldClassName="LandscapeProxy",NewClassName="/Script/Landscape.LandscapeProxy") 269 | -ActiveClassRedirects=(OldClassName="ControlPointMeshComponent",NewClassName="/Script/Landscape.ControlPointMeshComponent") 270 | -ActiveClassRedirects=(OldClassName="LandscapeComponent",NewClassName="/Script/Landscape.LandscapeComponent") 271 | -ActiveClassRedirects=(OldClassName="LandscapeGizmoRenderComponent",NewClassName="/Script/Landscape.LandscapeGizmoRenderComponent") 272 | -ActiveClassRedirects=(OldClassName="LandscapeHeightfieldCollisionComponent",NewClassName="/Script/Landscape.LandscapeHeightfieldCollisionComponent") 273 | -ActiveClassRedirects=(OldClassName="LandscapeInfo",NewClassName="/Script/Landscape.LandscapeInfo") 274 | -ActiveClassRedirects=(OldClassName="LandscapeInfoMap",NewClassName="/Script/Landscape.LandscapeInfoMap") 275 | -ActiveClassRedirects=(OldClassName="LandscapeLayerInfoObject",NewClassName="/Script/Landscape.LandscapeLayerInfoObject") 276 | -ActiveClassRedirects=(OldClassName="LandscapeMaterialInstanceConstant",NewClassName="/Script/Landscape.LandscapeMaterialInstanceConstant") 277 | -ActiveClassRedirects=(OldClassName="LandscapeMeshCollisionComponent",NewClassName="/Script/Landscape.LandscapeMeshCollisionComponent") 278 | -ActiveClassRedirects=(OldClassName="LandscapeSplineControlPoint",NewClassName="/Script/Landscape.LandscapeSplineControlPoint") 279 | -ActiveClassRedirects=(OldClassName="LandscapeSplineSegment",NewClassName="/Script/Landscape.LandscapeSplineSegment") 280 | -ActiveClassRedirects=(OldClassName="LandscapeSplinesComponent",NewClassName="/Script/Landscape.LandscapeSplinesComponent") 281 | -ActiveClassRedirects=(OldClassName="MaterialExpressionLandscapeLayerBlend",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerBlend") 282 | -ActiveClassRedirects=(OldClassName="MaterialExpressionLandscapeLayerCoords",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerCoords") 283 | -ActiveClassRedirects=(OldClassName="MaterialExpressionLandscapeLayerSwitch",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerSwitch") 284 | -ActiveClassRedirects=(OldClassName="MaterialExpressionLandscapeLayerWeight",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerWeight") 285 | -ActiveClassRedirects=(OldClassName="MaterialExpressionLandscapeVisibilityMask",NewClassName="/Script/Landscape.MaterialExpressionLandscapeVisibilityMask") 286 | -ActiveClassRedirects=(OldClassName="ProceduralFoliageActor",NewClassName="ProceduralFoliageVolume") 287 | -ActiveClassRedirects=(OldClassName="ProceduralFoliage",NewClassName="ProceduralFoliageSpawner") 288 | -ActiveClassRedirects=(OldClassName="AnimationCompressionAlgorithm",NewClassName="AnimCompress") 289 | -ActiveClassRedirects=(OldClassName="AnimationCompressionAlgorithm_Automatic",NewClassName="AnimCompress_Automatic") 290 | -ActiveClassRedirects=(OldClassName="AnimationCompressionAlgorithm_BitwiseCompressOnly",NewClassName="AnimCompress_BitwiseCompressOnly") 291 | -ActiveClassRedirects=(OldClassName="AnimationCompressionAlgorithm_LeastDestructive",NewClassName="AnimCompress_LeastDestructive") 292 | -ActiveClassRedirects=(OldClassName="AnimationCompressionAlgorithm_PerTrackCompression",NewClassName="AnimCompress_PerTrackCompression") 293 | -ActiveClassRedirects=(OldClassName="AnimationCompressionAlgorithm_RemoveEverySecondKey",NewClassName="AnimCompress_RemoveEverySecondKey") 294 | -ActiveClassRedirects=(OldClassName="AnimationCompressionAlgorithm_RemoveLinearKeys",NewClassName="AnimCompress_RemoveLinearKeys") 295 | -ActiveClassRedirects=(OldClassName="AnimationCompressionAlgorithm_RemoveTrivialKeys",NewClassName="AnimCompress_RemoveTrivialKeys") 296 | -ActiveClassRedirects=(OldClassName="AnimationCompressionAlgorithm_RevertToRaw",NewClassName="AnimCompress_RevertToRaw") 297 | -ActiveClassRedirects=(OldClassName="AIController",NewClassName="/Script/AIModule.AIController") 298 | -ActiveClassRedirects=(OldClassName="AIResourceInterface",NewClassName="/Script/AIModule.AIResourceInterface") 299 | -ActiveClassRedirects=(OldClassName="AISystem",NewClassName="/Script/AIModule.AISystem") 300 | -ActiveClassRedirects=(OldClassName="AITypes",NewClassName="/Script/AIModule.AITypes") 301 | -ActiveClassRedirects=(OldClassName="BrainComponent",NewClassName="/Script/AIModule.BrainComponent") 302 | -ActiveClassRedirects=(OldClassName="KismetAIAsyncTaskProxy",NewClassName="/Script/AIModule.AIAsyncTaskBlueprintProxy") 303 | -ActiveClassRedirects=(OldClassName="KismetAIHelperLibrary",NewClassName="/Script/AIModule.AIBlueprintHelperLibrary") 304 | -ActiveClassRedirects=(OldClassName="BehaviorTree",NewClassName="/Script/AIModule.BehaviorTree") 305 | -ActiveClassRedirects=(OldClassName="BehaviorTreeComponent",NewClassName="/Script/AIModule.BehaviorTreeComponent") 306 | -ActiveClassRedirects=(OldClassName="BehaviorTreeManager",NewClassName="/Script/AIModule.BehaviorTreeManager") 307 | -ActiveClassRedirects=(OldClassName="BehaviorTreeTypes",NewClassName="/Script/AIModule.BehaviorTreeTypes") 308 | -ActiveClassRedirects=(OldClassName="BlackboardComponent",NewClassName="/Script/AIModule.BlackboardComponent") 309 | -ActiveClassRedirects=(OldClassName="BlackboardData",NewClassName="/Script/AIModule.BlackboardData") 310 | -ActiveClassRedirects=(OldClassName="BTAuxiliaryNode",NewClassName="/Script/AIModule.BTAuxiliaryNode") 311 | -ActiveClassRedirects=(OldClassName="BTCompositeNode",NewClassName="/Script/AIModule.BTCompositeNode") 312 | -ActiveClassRedirects=(OldClassName="BTDecorator",NewClassName="/Script/AIModule.BTDecorator") 313 | -ActiveClassRedirects=(OldClassName="BTFunctionLibrary",NewClassName="/Script/AIModule.BTFunctionLibrary") 314 | -ActiveClassRedirects=(OldClassName="BTNode",NewClassName="/Script/AIModule.BTNode") 315 | -ActiveClassRedirects=(OldClassName="BTService",NewClassName="/Script/AIModule.BTService") 316 | -ActiveClassRedirects=(OldClassName="BTTaskNode",NewClassName="/Script/AIModule.BTTaskNode") 317 | -ActiveClassRedirects=(OldClassName="BlackboardKeyAllTypes",NewClassName="/Script/AIModule.BlackboardKeyAllTypes") 318 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType",NewClassName="/Script/AIModule.BlackboardKeyType") 319 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_Bool",NewClassName="/Script/AIModule.BlackboardKeyType_Bool") 320 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_Class",NewClassName="/Script/AIModule.BlackboardKeyType_Class") 321 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_Enum",NewClassName="/Script/AIModule.BlackboardKeyType_Enum") 322 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_Float",NewClassName="/Script/AIModule.BlackboardKeyType_Float") 323 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_Int",NewClassName="/Script/AIModule.BlackboardKeyType_Int") 324 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_Name",NewClassName="/Script/AIModule.BlackboardKeyType_Name") 325 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_NativeEnum",NewClassName="/Script/AIModule.BlackboardKeyType_NativeEnum") 326 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_Object",NewClassName="/Script/AIModule.BlackboardKeyType_Object") 327 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_String",NewClassName="/Script/AIModule.BlackboardKeyType_String") 328 | -ActiveClassRedirects=(OldClassName="BlackboardKeyType_Vector",NewClassName="/Script/AIModule.BlackboardKeyType_Vector") 329 | -ActiveClassRedirects=(OldClassName="BTComposite_Selector",NewClassName="/Script/AIModule.BTComposite_Selector") 330 | -ActiveClassRedirects=(OldClassName="BTComposite_Sequence",NewClassName="/Script/AIModule.BTComposite_Sequence") 331 | -ActiveClassRedirects=(OldClassName="BTComposite_SimpleParallel",NewClassName="/Script/AIModule.BTComposite_SimpleParallel") 332 | -ActiveClassRedirects=(OldClassName="BTDecorator_Blackboard",NewClassName="/Script/AIModule.BTDecorator_Blackboard") 333 | -ActiveClassRedirects=(OldClassName="BTDecorator_BlackboardBase",NewClassName="/Script/AIModule.BTDecorator_BlackboardBase") 334 | -ActiveClassRedirects=(OldClassName="BTDecorator_BlueprintBase",NewClassName="/Script/AIModule.BTDecorator_BlueprintBase") 335 | -ActiveClassRedirects=(OldClassName="BTDecorator_CompareBBEntries",NewClassName="/Script/AIModule.BTDecorator_CompareBBEntries") 336 | -ActiveClassRedirects=(OldClassName="BTDecorator_ConeCheck",NewClassName="/Script/AIModule.BTDecorator_ConeCheck") 337 | -ActiveClassRedirects=(OldClassName="BTDecorator_Cooldown",NewClassName="/Script/AIModule.BTDecorator_Cooldown") 338 | -ActiveClassRedirects=(OldClassName="BTDecorator_DoesPathExist",NewClassName="/Script/AIModule.BTDecorator_DoesPathExist") 339 | -ActiveClassRedirects=(OldClassName="BTDecorator_ForceSuccess",NewClassName="/Script/AIModule.BTDecorator_ForceSuccess") 340 | -ActiveClassRedirects=(OldClassName="BTDecorator_KeepInCone",NewClassName="/Script/AIModule.BTDecorator_KeepInCone") 341 | -ActiveClassRedirects=(OldClassName="BTDecorator_Loop",NewClassName="/Script/AIModule.BTDecorator_Loop") 342 | -ActiveClassRedirects=(OldClassName="BTDecorator_Optional",NewClassName="/Script/AIModule.BTDecorator_ForceSuccess") 343 | -ActiveClassRedirects=(OldClassName="BTDecorator_ReachedMoveGoal",NewClassName="/Script/AIModule.BTDecorator_ReachedMoveGoal") 344 | -ActiveClassRedirects=(OldClassName="BTDecorator_TimeLimit",NewClassName="/Script/AIModule.BTDecorator_TimeLimit") 345 | -ActiveClassRedirects=(OldClassName="BTService_BlackboardBase",NewClassName="/Script/AIModule.BTService_BlackboardBase") 346 | -ActiveClassRedirects=(OldClassName="BTService_BlueprintBase",NewClassName="/Script/AIModule.BTService_BlueprintBase") 347 | -ActiveClassRedirects=(OldClassName="BTService_DefaultFocus",NewClassName="/Script/AIModule.BTService_DefaultFocus") 348 | -ActiveClassRedirects=(OldClassName="BTTask_BlackboardBase",NewClassName="/Script/AIModule.BTTask_BlackboardBase") 349 | -ActiveClassRedirects=(OldClassName="BTTask_BlueprintBase",NewClassName="/Script/AIModule.BTTask_BlueprintBase") 350 | -ActiveClassRedirects=(OldClassName="BTTask_MakeNoise",NewClassName="/Script/AIModule.BTTask_MakeNoise") 351 | -ActiveClassRedirects=(OldClassName="BTTask_MoveDirectlyToward",NewClassName="/Script/AIModule.BTTask_MoveDirectlyToward") 352 | -ActiveClassRedirects=(OldClassName="BTTask_MoveTo",NewClassName="/Script/AIModule.BTTask_MoveTo") 353 | -ActiveClassRedirects=(OldClassName="BTTask_PlaySound",NewClassName="/Script/AIModule.BTTask_PlaySound") 354 | -ActiveClassRedirects=(OldClassName="BTTask_RunBehavior",NewClassName="/Script/AIModule.BTTask_RunBehavior") 355 | -ActiveClassRedirects=(OldClassName="BTTask_RunEQSQuery",NewClassName="/Script/AIModule.BTTask_RunEQSQuery") 356 | -ActiveClassRedirects=(OldClassName="BTTask_Wait",NewClassName="/Script/AIModule.BTTask_Wait") 357 | -ActiveClassRedirects=(OldClassName="EnvQuery",NewClassName="/Script/AIModule.EnvQuery") 358 | -ActiveClassRedirects=(OldClassName="EnvQueryContext",NewClassName="/Script/AIModule.EnvQueryContext") 359 | -ActiveClassRedirects=(OldClassName="EnvQueryGenerator",NewClassName="/Script/AIModule.EnvQueryGenerator") 360 | -ActiveClassRedirects=(OldClassName="EnvQueryManager",NewClassName="/Script/AIModule.EnvQueryManager") 361 | -ActiveClassRedirects=(OldClassName="EnvQueryOption",NewClassName="/Script/AIModule.EnvQueryOption") 362 | -ActiveClassRedirects=(OldClassName="EnvQueryTest",NewClassName="/Script/AIModule.EnvQueryTest") 363 | -ActiveClassRedirects=(OldClassName="EnvQueryTypes",NewClassName="/Script/AIModule.EnvQueryTypes") 364 | -ActiveClassRedirects=(OldClassName="EQSQueryResultSourceInterface",NewClassName="/Script/AIModule.EQSQueryResultSourceInterface") 365 | -ActiveClassRedirects=(OldClassName="EQSRenderingComponent",NewClassName="/Script/AIModule.EQSRenderingComponent") 366 | -ActiveClassRedirects=(OldClassName="EQSTestingPawn",NewClassName="/Script/AIModule.EQSTestingPawn") 367 | -ActiveClassRedirects=(OldClassName="EnvQueryContext_BlueprintBase",NewClassName="/Script/AIModule.EnvQueryContext_BlueprintBase") 368 | -ActiveClassRedirects=(OldClassName="EnvQueryContext_Item",NewClassName="/Script/AIModule.EnvQueryContext_Item") 369 | -ActiveClassRedirects=(OldClassName="EnvQueryContext_Querier",NewClassName="/Script/AIModule.EnvQueryContext_Querier") 370 | -ActiveClassRedirects=(OldClassName="EnvQueryGenerator_Composite",NewClassName="/Script/AIModule.EnvQueryGenerator_Composite") 371 | -ActiveClassRedirects=(OldClassName="EnvQueryGenerator_OnCircle",NewClassName="/Script/AIModule.EnvQueryGenerator_OnCircle") 372 | -ActiveClassRedirects=(OldClassName="EnvQueryGenerator_PathingGrid",NewClassName="/Script/AIModule.EnvQueryGenerator_PathingGrid") 373 | -ActiveClassRedirects=(OldClassName="EnvQueryGenerator_ProjectedPoints",NewClassName="/Script/AIModule.EnvQueryGenerator_ProjectedPoints") 374 | -ActiveClassRedirects=(OldClassName="EnvQueryGenerator_SimpleGrid",NewClassName="/Script/AIModule.EnvQueryGenerator_SimpleGrid") 375 | -ActiveClassRedirects=(OldClassName="EnvQueryAllItemTypes",NewClassName="/Script/AIModule.EnvQueryAllItemTypes") 376 | -ActiveClassRedirects=(OldClassName="EnvQueryItemType",NewClassName="/Script/AIModule.EnvQueryItemType") 377 | -ActiveClassRedirects=(OldClassName="EnvQueryItemType_Actor",NewClassName="/Script/AIModule.EnvQueryItemType_Actor") 378 | -ActiveClassRedirects=(OldClassName="EnvQueryItemType_ActorBase",NewClassName="/Script/AIModule.EnvQueryItemType_ActorBase") 379 | -ActiveClassRedirects=(OldClassName="EnvQueryItemType_Direction",NewClassName="/Script/AIModule.EnvQueryItemType_Direction") 380 | -ActiveClassRedirects=(OldClassName="EnvQueryItemType_Point",NewClassName="/Script/AIModule.EnvQueryItemType_Point") 381 | -ActiveClassRedirects=(OldClassName="EnvQueryItemType_VectorBase",NewClassName="/Script/AIModule.EnvQueryItemType_VectorBase") 382 | -ActiveClassRedirects=(OldClassName="EnvQueryTest_Distance",NewClassName="/Script/AIModule.EnvQueryTest_Distance") 383 | -ActiveClassRedirects=(OldClassName="EnvQueryTest_Dot",NewClassName="/Script/AIModule.EnvQueryTest_Dot") 384 | -ActiveClassRedirects=(OldClassName="EnvQueryTest_Pathfinding",NewClassName="/Script/AIModule.EnvQueryTest_Pathfinding") 385 | -ActiveClassRedirects=(OldClassName="EnvQueryTest_Trace",NewClassName="/Script/AIModule.EnvQueryTest_Trace") 386 | -ActiveClassRedirects=(OldClassName="CrowdAgentInterface",NewClassName="/Script/AIModule.CrowdAgentInterface") 387 | -ActiveClassRedirects=(OldClassName="CrowdFollowingComponent",NewClassName="/Script/AIModule.CrowdFollowingComponent") 388 | -ActiveClassRedirects=(OldClassName="CrowdManager",NewClassName="/Script/AIModule.CrowdManager") 389 | -ActiveClassRedirects=(OldClassName="PathFollowingComponent",NewClassName="/Script/AIModule.PathFollowingComponent") 390 | -ActiveClassRedirects=(OldClassName="PawnSensingComponent",NewClassName="/Script/AIModule.PawnSensingComponent") 391 | -ActiveClassRedirects=(OldClassName="EditorGameAgnosticSettings",NewClassName="/Script/UnrealEd.EditorSettings") 392 | -ActiveClassRedirects=(OldClassName="EditorUserSettings",NewClassName="/Script/UnrealEd.EditorPerProjectUserSettings") 393 | -ActiveClassRedirects=(OldClassName="SpriteComponent",NewClassName="BillboardComponent") 394 | -ActiveClassRedirects=(OldClassName="MaterialSpriteComponent",NewClassName="MaterialBillboardComponent") 395 | -ActiveClassRedirects=(OldClassName="WidgetBlueprint",NewClassName="/Script/UMGEditor.WidgetBlueprint") 396 | -ActiveClassRedirects=(OldClassName="SReply",NewClassName="EventReply") 397 | -ActiveClassRedirects=(OldClassName="ScriptComponent",NewClassName="ScriptPluginComponent") 398 | -ActiveClassRedirects=(OldClassName="PaperRenderComponent",NewClassName="/Script/Paper2D.PaperSpriteComponent") 399 | -ActiveClassRedirects=(OldClassName="PaperAnimatedRenderComponent",NewClassName="/Script/Paper2D.PaperFlipbookComponent") 400 | -ActiveClassRedirects=(OldClassName="PaperRenderActor",NewClassName="/Script/Paper2D.PaperSpriteActor") 401 | -ActiveClassRedirects=(OldClassName="PaperTileMapRenderComponent",NewClassName="/Script/Paper2D.PaperTileMapComponent") 402 | -ActiveClassRedirects=(OldClassName="PaperSpriteSheet",NewClassName="/Script/PaperSpritesheetImporter.PaperSpriteSheet") 403 | -ActiveClassRedirects=(OldClassName="ECollisionTraceFlag",NewClassName="/Script/Engine.BodySetupEnums:ECollisionTraceFlag") 404 | -ActiveClassRedirects=(OldClassName="EBodyCollisionResponse",NewClassName="/Script/Engine.BodySetupEnums:EBodyCollisionResponse") 405 | -ActiveClassRedirects=(OldClassName="EPhysicsType",NewClassName="/Script/Engine.BodySetupEnums:EPhysicsType") 406 | -ActiveClassRedirects=(OldClassName="PlayerCamera",NewClassName="PlayerCameraManager") 407 | -ActiveClassRedirects=(OldClassName="EModifyFrequency",NewClassName="EComponentMobility") 408 | -ActiveClassRedirects=(OldClassName="EMaterialLightingModel",NewClassName="EMaterialShadingModel") 409 | -ActiveClassRedirects=(OldClassName="GameReplicationInfo",NewClassName="/Script/Engine.GameState") 410 | -ActiveClassRedirects=(OldClassName="GameInfo",NewClassName="/Script/Engine.GameMode") 411 | -ActiveClassRedirects=(OldClassName="PlayerReplicationInfo",NewClassName="/Script/Engine.PlayerState") 412 | -ActiveClassRedirects=(OldClassName="AnimGraphNode_BlendSpace",NewClassName="/Script/AnimGraph.AnimGraphNode_BlendSpacePlayer") 413 | -ActiveClassRedirects=(OldClassName="AnimNode_BlendSpace",NewClassName="/Script/Engine.AnimNode_BlendSpacePlayer") 414 | -ActiveClassRedirects=(OldClassName="ETransitionGetterType",NewClassName="ETransitionGetter::Type") 415 | -ActiveClassRedirects=(OldClassName="ESlateCheckBoxState", NewClassName="ECheckBoxState") 416 | -ActiveClassRedirects=(OldClassName="SlateWidgetStyleAsset", NewClassName="/Script/SlateCore.SlateWidgetStyleAsset") 417 | -ActiveClassRedirects=(OldClassName="SlateWidgetStyleContainerBase", NewClassName="/Script/SlateCore.SlateWidgetStyleContainerBase") 418 | -ActiveClassRedirects=(OldClassName="InstancedFoliageSettings", NewClassName="/Script/Foliage.FoliageType_InstancedStaticMesh") 419 | -ActiveClassRedirects=(OldClassName="FoliageType", NewClassName="/Script/Foliage.FoliageType") 420 | -ActiveClassRedirects=(OldClassName="FoliageType_InstancedStaticMesh", NewClassName="/Script/Foliage.FoliageType_InstancedStaticMesh") 421 | -ActiveClassRedirects=(OldClassName="InstancedFoliageActor", NewClassName="/Script/Foliage.InstancedFoliageActor") 422 | -ActiveClassRedirects=(OldClassName="InteractiveFoliageComponent", NewClassName="/Script/Foliage.InteractiveFoliageComponent") 423 | -ActiveClassRedirects=(OldClassName="FoliageVertexColorMask", NewClassName="/Script/Foliage.FoliageVertexColorMask") 424 | -ActiveClassRedirects=(OldClassName="EmitterSpawnable", NewClassName="Emitter") 425 | -ActiveClassRedirects=(OldClassName="EBoneSpaces",NewClassName="/Script/Engine.SkinnedMeshComponent:EBoneSpaces") 426 | +ActiveClassRedirects=(ObjectName=,OldClassName="GameplayCueNotify",NewClassName="GameplayCueNotify_Static",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 427 | +ActiveClassRedirects=(ObjectName=,OldClassName="GameplayCueNotify_Blueprint",NewClassName="GameplayCueNotify_Actor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 428 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_BodySetup",NewClassName="BodySetup",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 429 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimTreeInstance",NewClassName="AnimInstance",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 430 | +ActiveClassRedirects=(ObjectName=,OldClassName="VimInstance",NewClassName="AnimInstance",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 431 | +ActiveClassRedirects=(ObjectName=,OldClassName="VimBlueprint",NewClassName="AnimBlueprint",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 432 | +ActiveClassRedirects=(ObjectName=,OldClassName="VimGeneratedClass",NewClassName="AnimBlueprintGeneratedClass",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 433 | +ActiveClassRedirects=(ObjectName=,OldClassName="VimBlueprintFactory",NewClassName="AnimBlueprintFactory",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 434 | +ActiveClassRedirects=(ObjectName=,OldClassName="ReverbVolume",NewClassName="AudioVolume",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 435 | +ActiveClassRedirects=(ObjectName=,OldClassName="ReverbVolumeToggleable",NewClassName="AudioVolume",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 436 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlueprintActorBase",NewClassName="Actor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 437 | +ActiveClassRedirects=(ObjectName=,OldClassName="WorldInfo",NewClassName="WorldSettings",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 438 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_Handle",NewClassName="PhysicsHandleComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 439 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_RadialForceComponent",NewClassName="RadialForceComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 440 | +ActiveClassRedirects=(ObjectName=,OldClassName="SoundMode",NewClassName="SoundMix",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 441 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_ThrusterComponent",NewClassName="PhysicsThrusterComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 442 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_Thruster",NewClassName="PhysicsThruster",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 443 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_ConstraintSetup",NewClassName="PhysicsConstraintTemplate",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 444 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_BSJointSetup",NewClassName="PhysicsConstraintTemplate",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 445 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_HingeSetup",NewClassName="PhysicsConstraintTemplate",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 446 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_PrismaticSetup",NewClassName="PhysicsConstraintTemplate",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 447 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_SkelJointSetup",NewClassName="PhysicsConstraintTemplate",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 448 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_ConstraintComponent",NewClassName="PhysicsConstraintComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 449 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_ConstraintActor",NewClassName="PhysicsConstraintActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 450 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_BSJointActor",NewClassName="PhysicsBSJointActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 451 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_HingeActor",NewClassName="PhysicsHingeActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 452 | +ActiveClassRedirects=(ObjectName=,OldClassName="RB_PrismaticActor",NewClassName="PhysicsPrismaticActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 453 | +ActiveClassRedirects=(ObjectName=,OldClassName="PhysicsBSJointActor",NewClassName="PhysicsConstraintActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 454 | +ActiveClassRedirects=(ObjectName=,OldClassName="PhysicsHingeActor",NewClassName="PhysicsConstraintActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 455 | +ActiveClassRedirects=(ObjectName=,OldClassName="PhysicsPrismaticActor",NewClassName="PhysicsConstraintActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 456 | +ActiveClassRedirects=(ObjectName=,OldClassName="EMovementMode",NewClassName="/Script/Engine.EngineTypes:EMovementMode",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 457 | +ActiveClassRedirects=(ObjectName=,OldClassName="SensingComponent",NewClassName="PawnSensingComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 458 | +ActiveClassRedirects=(ObjectName=,OldClassName="MovementComp_Character",NewClassName="CharacterMovementComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 459 | +ActiveClassRedirects=(ObjectName=,OldClassName="MovementComp_Rotating",NewClassName="RotatingMovementComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 460 | +ActiveClassRedirects=(ObjectName=,OldClassName="MovementComp_Projectile",NewClassName="ProjectileMovementComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 461 | +ActiveClassRedirects=(ObjectName=,OldClassName="VehicleSim",NewClassName="VehicleMovementComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 462 | +ActiveClassRedirects=(ObjectName=,OldClassName="VehicleSimNoDrive",NewClassName="VehicleMovementComponentNoDrive",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 463 | +ActiveClassRedirects=(ObjectName=,OldClassName="MovementComp_Vehicle",NewClassName="VehicleMovementComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 464 | +ActiveClassRedirects=(ObjectName=,OldClassName="MovementComp_VehicleNoDrive",NewClassName="VehicleMovementComponentNoDrive",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 465 | +ActiveClassRedirects=(ObjectName=,OldClassName="DefaultPawnMovement",NewClassName="FloatingPawnMovement",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 466 | +ActiveClassRedirects=(ObjectName=,OldClassName="StaticMeshReplicatedComponent",NewClassName="StaticMeshComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 467 | +ActiveClassRedirects=(ObjectName=,OldClassName="SkeletalMeshReplicatedComponent",NewClassName="SkeletalMeshComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 468 | +ActiveClassRedirects=(ObjectName=,OldClassName="Vehicle",NewClassName="WheeledVehicle",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 469 | +ActiveClassRedirects=(ObjectName=,OldClassName="VehicleMovementComponent",NewClassName="WheeledVehicleMovementComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 470 | +ActiveClassRedirects=(ObjectName=,OldClassName="VehicleMovementComponent4W",NewClassName="WheeledVehicleMovementComponent4W",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 471 | +ActiveClassRedirects=(ObjectName=,OldClassName="PointLightComponent",NewClassName=,OldSubobjName="PointLightComponent0",NewSubobjName="LightComponent0",InstanceOnly=False) 472 | +ActiveClassRedirects=(ObjectName=,OldClassName="DirectionalLightComponent",NewClassName=,OldSubobjName="DirectionalLightComponent0",NewSubobjName="LightComponent0",InstanceOnly=False) 473 | +ActiveClassRedirects=(ObjectName=,OldClassName="SpotLightComponent",NewClassName=,OldSubobjName="SpotLightComponent0",NewSubobjName="LightComponent0",InstanceOnly=False) 474 | +ActiveClassRedirects=(ObjectName=,OldClassName="DefaultPawn",NewClassName=,OldSubobjName="SpectatorMovement0",NewSubobjName="MovementComponent0",InstanceOnly=False) 475 | +ActiveClassRedirects=(ObjectName=,OldClassName="DefaultPawn",NewClassName=,OldSubobjName="DefaultPawnMovement0",NewSubobjName="MovementComponent0",InstanceOnly=False) 476 | +ActiveClassRedirects=(ObjectName=,OldClassName="/Script/BlueprintGraph.K2Node_CastToInterface",NewClassName="/Script/BlueprintGraph.K2Node_DynamicCast",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 477 | +ActiveClassRedirects=(ObjectName=,OldClassName="K2Node_CallSuperFunction",NewClassName="/Script/BlueprintGraph.K2Node_CallParentFunction",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 478 | +ActiveClassRedirects=(ObjectName=,OldClassName="K2Node_MathExpression",NewClassName="/Script/BlueprintGraph.K2Node_MathExpression",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 479 | +ActiveClassRedirects=(ObjectName=,OldClassName="/Script/CoreUObject.K2Node_MathExpression",NewClassName="/Script/BlueprintGraph.K2Node_MathExpression",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 480 | +ActiveClassRedirects=(ObjectName=,OldClassName="K2Node_Comment",NewClassName="/Script/UnrealEd.EdGraphNode_Comment",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 481 | +ActiveClassRedirects=(ObjectName=,OldClassName="EdGraphNode_Comment",NewClassName="/Script/UnrealEd.EdGraphNode_Comment",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 482 | +ActiveClassRedirects=(ObjectName=,OldClassName="SpotLightMovable",NewClassName="SpotLight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 483 | +ActiveClassRedirects=(ObjectName=,OldClassName="SpotLightStatic",NewClassName="SpotLight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 484 | +ActiveClassRedirects=(ObjectName=,OldClassName="SpotLightStationary",NewClassName="SpotLight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 485 | +ActiveClassRedirects=(ObjectName=,OldClassName="PointLightMovable",NewClassName="PointLight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 486 | +ActiveClassRedirects=(ObjectName=,OldClassName="PointLightStatic",NewClassName="PointLight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 487 | +ActiveClassRedirects=(ObjectName=,OldClassName="PointLightStationary",NewClassName="PointLight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 488 | +ActiveClassRedirects=(ObjectName=,OldClassName="DirectionalLightMovable",NewClassName="DirectionalLight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 489 | +ActiveClassRedirects=(ObjectName=,OldClassName="DirectionalLightStatic",NewClassName="DirectionalLight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 490 | +ActiveClassRedirects=(ObjectName=,OldClassName="DirectionalLightStationary",NewClassName="DirectionalLight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 491 | +ActiveClassRedirects=(ObjectName=,OldClassName="InterpActor",NewClassName="StaticMeshActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 492 | +ActiveClassRedirects=(ObjectName=,OldClassName="PhysicsActor",NewClassName="StaticMeshActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 493 | +ActiveClassRedirects=(ObjectName=,OldClassName="SkeletalPhysicsActor",NewClassName="SkeletalMeshActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 494 | +ActiveClassRedirects=(ObjectName=,OldClassName="SingleAnimSkeletalActor",NewClassName="SkeletalMeshActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 495 | +ActiveClassRedirects=(ObjectName=,OldClassName="SingleAnimSkeletalComponent",NewClassName="SkeletalMeshComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 496 | +ActiveClassRedirects=(ObjectName=,OldClassName="DynamicBlockingVolume",NewClassName="BlockingVolume",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 497 | +ActiveClassRedirects=(ObjectName=,OldClassName="DynamicPhysicsVolume",NewClassName="PhysicsVolume",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 498 | +ActiveClassRedirects=(ObjectName=,OldClassName="DynamicTriggerVolume",NewClassName="TriggerVolume",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 499 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimNode_SkeletalControlBase",NewClassName="/Script/Engine.AnimNode_SkeletalControlBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 500 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimNode_TwoBoneIK",NewClassName="/Script/Engine.AnimNode_TwoBoneIK",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 501 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimNode_RotationMultiplier",NewClassName="/Script/Engine.AnimNode_RotationMultiplier",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 502 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimNode_ModifyBone",NewClassName="/Script/Engine.AnimNode_ModifyBone",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 503 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimNode_CopyBone",NewClassName="/Script/Engine.AnimNode_CopyBone",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 504 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimNode_SpringBone",NewClassName="/Script/Engine.AnimNode_SpringBone",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 505 | +ActiveClassRedirects=(ObjectName=,OldClassName="NavAreaMeta",NewClassName="/Script/Engine.NavArea_Default",OldSubobjName=,NewSubobjName=,InstanceOnly=True) 506 | +ActiveClassRedirects=(ObjectName=,OldClassName="NavAreaDefinition",NewClassName="/Script/Engine.NavArea",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 507 | +ActiveClassRedirects=(ObjectName=,OldClassName="NavAreaDefault",NewClassName="/Script/Engine.NavArea_Default",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 508 | +ActiveClassRedirects=(ObjectName=,OldClassName="NavAreaNull",NewClassName="/Script/Engine.NavArea_Null",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 509 | +ActiveClassRedirects=(ObjectName=,OldClassName="SmartNavLinkComponent",NewClassName="/Script/Engine.NavLinkCustomComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 510 | +ActiveClassRedirects=(ObjectName=,OldClassName="ELockedAxis",NewClassName="EDOFMode",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 511 | +ActiveClassRedirects=(ObjectName=,OldClassName="BehaviorTreeNode",NewClassName="BehaviorTreeGraphNode",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 512 | +ActiveClassRedirects=(ObjectName=,OldClassName="BehaviorTreeNode_Composite",NewClassName="BehaviorTreeGraphNode_Composite",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 513 | +ActiveClassRedirects=(ObjectName=,OldClassName="BehaviorTreeNode_Decorator",NewClassName="BehaviorTreeGraphNode_Decorator",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 514 | +ActiveClassRedirects=(ObjectName=,OldClassName="BehaviorTreeNode_Root",NewClassName="BehaviorTreeGraphNode_Root",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 515 | +ActiveClassRedirects=(ObjectName=,OldClassName="BehaviorTreeNode_Task",NewClassName="BehaviorTreeGraphNode_Task",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 516 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_GoTo",NewClassName="BTTask_MoveTo",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 517 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_RunQuery",NewClassName="BTTask_RunEQSQuery",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 518 | +ActiveClassRedirects=(ObjectName=,OldClassName="MoveComponentAction",NewClassName="/Script/Engine/KismetSystemLibrary.MoveComponentAction",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 519 | +ActiveClassRedirects=(ObjectName=,OldClassName="AIDebugComponent",NewClassName="GameplayDebuggingComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 520 | +ActiveClassRedirects=(ObjectName=,OldClassName="MaterialExpressionTerrainLayerCoords",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerCoords",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 521 | +ActiveClassRedirects=(ObjectName=,OldClassName="MaterialExpressionTerrainLayerSwitch",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerSwitch",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 522 | +ActiveClassRedirects=(ObjectName=,OldClassName="MaterialExpressionTerrainLayerWeight",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerWeight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 523 | +ActiveClassRedirects=(ObjectName=,OldClassName="Landscape",NewClassName="/Script/Landscape.Landscape",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 524 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeGizmoActiveActor",NewClassName="/Script/Landscape.LandscapeGizmoActiveActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 525 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeGizmoActor",NewClassName="/Script/Landscape.LandscapeGizmoActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 526 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeProxy",NewClassName="/Script/Landscape.LandscapeProxy",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 527 | +ActiveClassRedirects=(ObjectName=,OldClassName="ControlPointMeshComponent",NewClassName="/Script/Landscape.ControlPointMeshComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 528 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeComponent",NewClassName="/Script/Landscape.LandscapeComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 529 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeGizmoRenderComponent",NewClassName="/Script/Landscape.LandscapeGizmoRenderComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 530 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeHeightfieldCollisionComponent",NewClassName="/Script/Landscape.LandscapeHeightfieldCollisionComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 531 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeInfo",NewClassName="/Script/Landscape.LandscapeInfo",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 532 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeInfoMap",NewClassName="/Script/Landscape.LandscapeInfoMap",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 533 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeLayerInfoObject",NewClassName="/Script/Landscape.LandscapeLayerInfoObject",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 534 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeMaterialInstanceConstant",NewClassName="/Script/Landscape.LandscapeMaterialInstanceConstant",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 535 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeMeshCollisionComponent",NewClassName="/Script/Landscape.LandscapeMeshCollisionComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 536 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeSplineControlPoint",NewClassName="/Script/Landscape.LandscapeSplineControlPoint",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 537 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeSplineSegment",NewClassName="/Script/Landscape.LandscapeSplineSegment",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 538 | +ActiveClassRedirects=(ObjectName=,OldClassName="LandscapeSplinesComponent",NewClassName="/Script/Landscape.LandscapeSplinesComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 539 | +ActiveClassRedirects=(ObjectName=,OldClassName="MaterialExpressionLandscapeLayerBlend",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerBlend",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 540 | +ActiveClassRedirects=(ObjectName=,OldClassName="MaterialExpressionLandscapeLayerCoords",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerCoords",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 541 | +ActiveClassRedirects=(ObjectName=,OldClassName="MaterialExpressionLandscapeLayerSwitch",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerSwitch",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 542 | +ActiveClassRedirects=(ObjectName=,OldClassName="MaterialExpressionLandscapeLayerWeight",NewClassName="/Script/Landscape.MaterialExpressionLandscapeLayerWeight",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 543 | +ActiveClassRedirects=(ObjectName=,OldClassName="MaterialExpressionLandscapeVisibilityMask",NewClassName="/Script/Landscape.MaterialExpressionLandscapeVisibilityMask",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 544 | +ActiveClassRedirects=(ObjectName=,OldClassName="ProceduralFoliageActor",NewClassName="ProceduralFoliageVolume",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 545 | +ActiveClassRedirects=(ObjectName=,OldClassName="ProceduralFoliage",NewClassName="ProceduralFoliageSpawner",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 546 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimationCompressionAlgorithm",NewClassName="AnimCompress",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 547 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimationCompressionAlgorithm_Automatic",NewClassName="AnimCompress_Automatic",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 548 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimationCompressionAlgorithm_BitwiseCompressOnly",NewClassName="AnimCompress_BitwiseCompressOnly",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 549 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimationCompressionAlgorithm_LeastDestructive",NewClassName="AnimCompress_LeastDestructive",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 550 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimationCompressionAlgorithm_PerTrackCompression",NewClassName="AnimCompress_PerTrackCompression",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 551 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimationCompressionAlgorithm_RemoveEverySecondKey",NewClassName="AnimCompress_RemoveEverySecondKey",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 552 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimationCompressionAlgorithm_RemoveLinearKeys",NewClassName="AnimCompress_RemoveLinearKeys",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 553 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimationCompressionAlgorithm_RemoveTrivialKeys",NewClassName="AnimCompress_RemoveTrivialKeys",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 554 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimationCompressionAlgorithm_RevertToRaw",NewClassName="AnimCompress_RevertToRaw",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 555 | +ActiveClassRedirects=(ObjectName=,OldClassName="AIController",NewClassName="/Script/AIModule.AIController",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 556 | +ActiveClassRedirects=(ObjectName=,OldClassName="AIResourceInterface",NewClassName="/Script/AIModule.AIResourceInterface",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 557 | +ActiveClassRedirects=(ObjectName=,OldClassName="AISystem",NewClassName="/Script/AIModule.AISystem",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 558 | +ActiveClassRedirects=(ObjectName=,OldClassName="AITypes",NewClassName="/Script/AIModule.AITypes",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 559 | +ActiveClassRedirects=(ObjectName=,OldClassName="BrainComponent",NewClassName="/Script/AIModule.BrainComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 560 | +ActiveClassRedirects=(ObjectName=,OldClassName="KismetAIAsyncTaskProxy",NewClassName="/Script/AIModule.AIAsyncTaskBlueprintProxy",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 561 | +ActiveClassRedirects=(ObjectName=,OldClassName="KismetAIHelperLibrary",NewClassName="/Script/AIModule.AIBlueprintHelperLibrary",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 562 | +ActiveClassRedirects=(ObjectName=,OldClassName="BehaviorTree",NewClassName="/Script/AIModule.BehaviorTree",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 563 | +ActiveClassRedirects=(ObjectName=,OldClassName="BehaviorTreeComponent",NewClassName="/Script/AIModule.BehaviorTreeComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 564 | +ActiveClassRedirects=(ObjectName=,OldClassName="BehaviorTreeManager",NewClassName="/Script/AIModule.BehaviorTreeManager",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 565 | +ActiveClassRedirects=(ObjectName=,OldClassName="BehaviorTreeTypes",NewClassName="/Script/AIModule.BehaviorTreeTypes",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 566 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardComponent",NewClassName="/Script/AIModule.BlackboardComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 567 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardData",NewClassName="/Script/AIModule.BlackboardData",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 568 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTAuxiliaryNode",NewClassName="/Script/AIModule.BTAuxiliaryNode",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 569 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTCompositeNode",NewClassName="/Script/AIModule.BTCompositeNode",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 570 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator",NewClassName="/Script/AIModule.BTDecorator",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 571 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTFunctionLibrary",NewClassName="/Script/AIModule.BTFunctionLibrary",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 572 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTNode",NewClassName="/Script/AIModule.BTNode",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 573 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTService",NewClassName="/Script/AIModule.BTService",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 574 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTaskNode",NewClassName="/Script/AIModule.BTTaskNode",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 575 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyAllTypes",NewClassName="/Script/AIModule.BlackboardKeyAllTypes",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 576 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType",NewClassName="/Script/AIModule.BlackboardKeyType",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 577 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_Bool",NewClassName="/Script/AIModule.BlackboardKeyType_Bool",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 578 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_Class",NewClassName="/Script/AIModule.BlackboardKeyType_Class",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 579 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_Enum",NewClassName="/Script/AIModule.BlackboardKeyType_Enum",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 580 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_Float",NewClassName="/Script/AIModule.BlackboardKeyType_Float",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 581 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_Int",NewClassName="/Script/AIModule.BlackboardKeyType_Int",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 582 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_Name",NewClassName="/Script/AIModule.BlackboardKeyType_Name",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 583 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_NativeEnum",NewClassName="/Script/AIModule.BlackboardKeyType_NativeEnum",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 584 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_Object",NewClassName="/Script/AIModule.BlackboardKeyType_Object",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 585 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_String",NewClassName="/Script/AIModule.BlackboardKeyType_String",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 586 | +ActiveClassRedirects=(ObjectName=,OldClassName="BlackboardKeyType_Vector",NewClassName="/Script/AIModule.BlackboardKeyType_Vector",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 587 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTComposite_Selector",NewClassName="/Script/AIModule.BTComposite_Selector",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 588 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTComposite_Sequence",NewClassName="/Script/AIModule.BTComposite_Sequence",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 589 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTComposite_SimpleParallel",NewClassName="/Script/AIModule.BTComposite_SimpleParallel",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 590 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_Blackboard",NewClassName="/Script/AIModule.BTDecorator_Blackboard",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 591 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_BlackboardBase",NewClassName="/Script/AIModule.BTDecorator_BlackboardBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 592 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_BlueprintBase",NewClassName="/Script/AIModule.BTDecorator_BlueprintBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 593 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_CompareBBEntries",NewClassName="/Script/AIModule.BTDecorator_CompareBBEntries",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 594 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_ConeCheck",NewClassName="/Script/AIModule.BTDecorator_ConeCheck",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 595 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_Cooldown",NewClassName="/Script/AIModule.BTDecorator_Cooldown",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 596 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_DoesPathExist",NewClassName="/Script/AIModule.BTDecorator_DoesPathExist",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 597 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_ForceSuccess",NewClassName="/Script/AIModule.BTDecorator_ForceSuccess",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 598 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_KeepInCone",NewClassName="/Script/AIModule.BTDecorator_KeepInCone",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 599 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_Loop",NewClassName="/Script/AIModule.BTDecorator_Loop",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 600 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_Optional",NewClassName="/Script/AIModule.BTDecorator_ForceSuccess",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 601 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_ReachedMoveGoal",NewClassName="/Script/AIModule.BTDecorator_ReachedMoveGoal",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 602 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTDecorator_TimeLimit",NewClassName="/Script/AIModule.BTDecorator_TimeLimit",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 603 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTService_BlackboardBase",NewClassName="/Script/AIModule.BTService_BlackboardBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 604 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTService_BlueprintBase",NewClassName="/Script/AIModule.BTService_BlueprintBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 605 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTService_DefaultFocus",NewClassName="/Script/AIModule.BTService_DefaultFocus",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 606 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_BlackboardBase",NewClassName="/Script/AIModule.BTTask_BlackboardBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 607 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_BlueprintBase",NewClassName="/Script/AIModule.BTTask_BlueprintBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 608 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_MakeNoise",NewClassName="/Script/AIModule.BTTask_MakeNoise",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 609 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_MoveDirectlyToward",NewClassName="/Script/AIModule.BTTask_MoveDirectlyToward",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 610 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_MoveTo",NewClassName="/Script/AIModule.BTTask_MoveTo",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 611 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_PlaySound",NewClassName="/Script/AIModule.BTTask_PlaySound",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 612 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_RunBehavior",NewClassName="/Script/AIModule.BTTask_RunBehavior",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 613 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_RunEQSQuery",NewClassName="/Script/AIModule.BTTask_RunEQSQuery",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 614 | +ActiveClassRedirects=(ObjectName=,OldClassName="BTTask_Wait",NewClassName="/Script/AIModule.BTTask_Wait",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 615 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQuery",NewClassName="/Script/AIModule.EnvQuery",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 616 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryContext",NewClassName="/Script/AIModule.EnvQueryContext",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 617 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryGenerator",NewClassName="/Script/AIModule.EnvQueryGenerator",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 618 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryManager",NewClassName="/Script/AIModule.EnvQueryManager",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 619 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryOption",NewClassName="/Script/AIModule.EnvQueryOption",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 620 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryTest",NewClassName="/Script/AIModule.EnvQueryTest",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 621 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryTypes",NewClassName="/Script/AIModule.EnvQueryTypes",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 622 | +ActiveClassRedirects=(ObjectName=,OldClassName="EQSQueryResultSourceInterface",NewClassName="/Script/AIModule.EQSQueryResultSourceInterface",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 623 | +ActiveClassRedirects=(ObjectName=,OldClassName="EQSRenderingComponent",NewClassName="/Script/AIModule.EQSRenderingComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 624 | +ActiveClassRedirects=(ObjectName=,OldClassName="EQSTestingPawn",NewClassName="/Script/AIModule.EQSTestingPawn",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 625 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryContext_BlueprintBase",NewClassName="/Script/AIModule.EnvQueryContext_BlueprintBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 626 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryContext_Item",NewClassName="/Script/AIModule.EnvQueryContext_Item",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 627 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryContext_Querier",NewClassName="/Script/AIModule.EnvQueryContext_Querier",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 628 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryGenerator_Composite",NewClassName="/Script/AIModule.EnvQueryGenerator_Composite",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 629 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryGenerator_OnCircle",NewClassName="/Script/AIModule.EnvQueryGenerator_OnCircle",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 630 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryGenerator_PathingGrid",NewClassName="/Script/AIModule.EnvQueryGenerator_PathingGrid",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 631 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryGenerator_ProjectedPoints",NewClassName="/Script/AIModule.EnvQueryGenerator_ProjectedPoints",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 632 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryGenerator_SimpleGrid",NewClassName="/Script/AIModule.EnvQueryGenerator_SimpleGrid",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 633 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryAllItemTypes",NewClassName="/Script/AIModule.EnvQueryAllItemTypes",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 634 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryItemType",NewClassName="/Script/AIModule.EnvQueryItemType",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 635 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryItemType_Actor",NewClassName="/Script/AIModule.EnvQueryItemType_Actor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 636 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryItemType_ActorBase",NewClassName="/Script/AIModule.EnvQueryItemType_ActorBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 637 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryItemType_Direction",NewClassName="/Script/AIModule.EnvQueryItemType_Direction",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 638 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryItemType_Point",NewClassName="/Script/AIModule.EnvQueryItemType_Point",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 639 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryItemType_VectorBase",NewClassName="/Script/AIModule.EnvQueryItemType_VectorBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 640 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryTest_Distance",NewClassName="/Script/AIModule.EnvQueryTest_Distance",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 641 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryTest_Dot",NewClassName="/Script/AIModule.EnvQueryTest_Dot",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 642 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryTest_Pathfinding",NewClassName="/Script/AIModule.EnvQueryTest_Pathfinding",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 643 | +ActiveClassRedirects=(ObjectName=,OldClassName="EnvQueryTest_Trace",NewClassName="/Script/AIModule.EnvQueryTest_Trace",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 644 | +ActiveClassRedirects=(ObjectName=,OldClassName="CrowdAgentInterface",NewClassName="/Script/AIModule.CrowdAgentInterface",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 645 | +ActiveClassRedirects=(ObjectName=,OldClassName="CrowdFollowingComponent",NewClassName="/Script/AIModule.CrowdFollowingComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 646 | +ActiveClassRedirects=(ObjectName=,OldClassName="CrowdManager",NewClassName="/Script/AIModule.CrowdManager",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 647 | +ActiveClassRedirects=(ObjectName=,OldClassName="PathFollowingComponent",NewClassName="/Script/AIModule.PathFollowingComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 648 | +ActiveClassRedirects=(ObjectName=,OldClassName="PawnSensingComponent",NewClassName="/Script/AIModule.PawnSensingComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 649 | +ActiveClassRedirects=(ObjectName=,OldClassName="EditorGameAgnosticSettings",NewClassName="/Script/UnrealEd.EditorSettings",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 650 | +ActiveClassRedirects=(ObjectName=,OldClassName="EditorUserSettings",NewClassName="/Script/UnrealEd.EditorPerProjectUserSettings",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 651 | +ActiveClassRedirects=(ObjectName=,OldClassName="SpriteComponent",NewClassName="BillboardComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 652 | +ActiveClassRedirects=(ObjectName=,OldClassName="MaterialSpriteComponent",NewClassName="MaterialBillboardComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 653 | +ActiveClassRedirects=(ObjectName=,OldClassName="WidgetBlueprint",NewClassName="/Script/UMGEditor.WidgetBlueprint",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 654 | +ActiveClassRedirects=(ObjectName=,OldClassName="SReply",NewClassName="EventReply",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 655 | +ActiveClassRedirects=(ObjectName=,OldClassName="ScriptComponent",NewClassName="ScriptPluginComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 656 | +ActiveClassRedirects=(ObjectName=,OldClassName="PaperRenderComponent",NewClassName="/Script/Paper2D.PaperSpriteComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 657 | +ActiveClassRedirects=(ObjectName=,OldClassName="PaperAnimatedRenderComponent",NewClassName="/Script/Paper2D.PaperFlipbookComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 658 | +ActiveClassRedirects=(ObjectName=,OldClassName="PaperRenderActor",NewClassName="/Script/Paper2D.PaperSpriteActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 659 | +ActiveClassRedirects=(ObjectName=,OldClassName="PaperTileMapRenderComponent",NewClassName="/Script/Paper2D.PaperTileMapComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 660 | +ActiveClassRedirects=(ObjectName=,OldClassName="PaperSpriteSheet",NewClassName="/Script/PaperSpritesheetImporter.PaperSpriteSheet",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 661 | +ActiveClassRedirects=(ObjectName=,OldClassName="ECollisionTraceFlag",NewClassName="/Script/Engine.BodySetupEnums:ECollisionTraceFlag",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 662 | +ActiveClassRedirects=(ObjectName=,OldClassName="EBodyCollisionResponse",NewClassName="/Script/Engine.BodySetupEnums:EBodyCollisionResponse",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 663 | +ActiveClassRedirects=(ObjectName=,OldClassName="EPhysicsType",NewClassName="/Script/Engine.BodySetupEnums:EPhysicsType",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 664 | +ActiveClassRedirects=(ObjectName=,OldClassName="PlayerCamera",NewClassName="PlayerCameraManager",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 665 | +ActiveClassRedirects=(ObjectName=,OldClassName="EModifyFrequency",NewClassName="EComponentMobility",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 666 | +ActiveClassRedirects=(ObjectName=,OldClassName="EMaterialLightingModel",NewClassName="EMaterialShadingModel",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 667 | +ActiveClassRedirects=(ObjectName=,OldClassName="GameReplicationInfo",NewClassName="/Script/Engine.GameState",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 668 | +ActiveClassRedirects=(ObjectName=,OldClassName="GameInfo",NewClassName="/Script/Engine.GameMode",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 669 | +ActiveClassRedirects=(ObjectName=,OldClassName="PlayerReplicationInfo",NewClassName="/Script/Engine.PlayerState",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 670 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimGraphNode_BlendSpace",NewClassName="/Script/AnimGraph.AnimGraphNode_BlendSpacePlayer",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 671 | +ActiveClassRedirects=(ObjectName=,OldClassName="AnimNode_BlendSpace",NewClassName="/Script/Engine.AnimNode_BlendSpacePlayer",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 672 | +ActiveClassRedirects=(ObjectName=,OldClassName="ETransitionGetterType",NewClassName="ETransitionGetter::Type",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 673 | +ActiveClassRedirects=(ObjectName=,OldClassName="ESlateCheckBoxState",NewClassName="ECheckBoxState",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 674 | +ActiveClassRedirects=(ObjectName=,OldClassName="SlateWidgetStyleAsset",NewClassName="/Script/SlateCore.SlateWidgetStyleAsset",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 675 | +ActiveClassRedirects=(ObjectName=,OldClassName="SlateWidgetStyleContainerBase",NewClassName="/Script/SlateCore.SlateWidgetStyleContainerBase",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 676 | +ActiveClassRedirects=(ObjectName=,OldClassName="InstancedFoliageSettings",NewClassName="/Script/Foliage.FoliageType_InstancedStaticMesh",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 677 | +ActiveClassRedirects=(ObjectName=,OldClassName="FoliageType",NewClassName="/Script/Foliage.FoliageType",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 678 | +ActiveClassRedirects=(ObjectName=,OldClassName="FoliageType_InstancedStaticMesh",NewClassName="/Script/Foliage.FoliageType_InstancedStaticMesh",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 679 | +ActiveClassRedirects=(ObjectName=,OldClassName="InstancedFoliageActor",NewClassName="/Script/Foliage.InstancedFoliageActor",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 680 | +ActiveClassRedirects=(ObjectName=,OldClassName="InteractiveFoliageComponent",NewClassName="/Script/Foliage.InteractiveFoliageComponent",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 681 | +ActiveClassRedirects=(ObjectName=,OldClassName="FoliageVertexColorMask",NewClassName="/Script/Foliage.FoliageVertexColorMask",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 682 | +ActiveClassRedirects=(ObjectName=,OldClassName="EmitterSpawnable",NewClassName="Emitter",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 683 | +ActiveClassRedirects=(ObjectName=,OldClassName="EBoneSpaces",NewClassName="/Script/Engine.SkinnedMeshComponent:EBoneSpaces",OldSubobjName=,NewSubobjName=,InstanceOnly=False) 684 | -ActiveStructRedirects=(OldStructName="ProceduralFoliageTypeData",NewStructName="FoliageTypeObject") 685 | -ActiveStructRedirects=(OldStructName="VimDebugData",NewStructName="AnimBlueprintDebugData") 686 | -ActiveStructRedirects=(OldStructName="KeyboardEvent",NewStructName="KeyEvent") 687 | -ActiveStructRedirects=(OldStructName="KeyboardFocusEvent",NewStructName="FocusEvent") 688 | -ActiveStructRedirects=(OldStructName="SpritePolygon",NewStructName="SpriteGeometryShape") 689 | -ActiveStructRedirects=(OldStructName="SpritePolygonCollection",NewStructName="SpriteGeometryCollection") 690 | -ActiveStructRedirects=(OldStructName="AnimNode_BlendSpace",NewStructName="AnimNode_BlendSpacePlayer") 691 | -ActiveStructRedirects=(OldStructName="FFormatTextArgument",NewStructName="/Script/Engine.FFormatTextArgument") 692 | +ActiveStructRedirects=(OldStructName="ProceduralFoliageTypeData",NewStructName="FoliageTypeObject") 693 | +ActiveStructRedirects=(OldStructName="VimDebugData",NewStructName="AnimBlueprintDebugData") 694 | +ActiveStructRedirects=(OldStructName="KeyboardEvent",NewStructName="KeyEvent") 695 | +ActiveStructRedirects=(OldStructName="KeyboardFocusEvent",NewStructName="FocusEvent") 696 | +ActiveStructRedirects=(OldStructName="SpritePolygon",NewStructName="SpriteGeometryShape") 697 | +ActiveStructRedirects=(OldStructName="SpritePolygonCollection",NewStructName="SpriteGeometryCollection") 698 | +ActiveStructRedirects=(OldStructName="AnimNode_BlendSpace",NewStructName="AnimNode_BlendSpacePlayer") 699 | +ActiveStructRedirects=(OldStructName="FFormatTextArgument",NewStructName="/Script/Engine.FFormatTextArgument") 700 | PreIntegratedSkinBRDFTextureName=/Engine/EngineMaterials/PreintegratedSkinBRDF.PreintegratedSkinBRDF 701 | MiniFontTextureName=/Engine/EngineMaterials/MiniFont.MiniFont 702 | WeightMapPlaceholderTextureName=/Engine/EngineMaterials/WeightMapPlaceholderTexture.WeightMapPlaceholderTexture 703 | LightMapDensityTextureName=/Engine/EngineMaterials/DefaultWhiteGrid.DefaultWhiteGrid 704 | NearClipPlane=10.000000 705 | bHardwareSurveyEnabled=True 706 | bSubtitlesEnabled=True 707 | bSubtitlesForcedOff=False 708 | TimeBetweenPurgingPendingKillObjects=60.000000 709 | bUseBackgroundLevelStreaming=True 710 | AsyncLoadingTimeLimit=5.000000 711 | bAsyncLoadingUseFullTimeLimit=True 712 | PriorityAsyncLoadingExtraTime=20.000000 713 | LevelStreamingActorsUpdateTimeLimit=5.000000 714 | LevelStreamingComponentsRegistrationGranularity=10 715 | MaximumLoopIterationCount=1000000 716 | bCanBlueprintsTickByDefault=True 717 | bEnableEditorPSysRealtimeLOD=False 718 | bUseFixedFrameRate=False 719 | FixedFrameRate=30.000000 720 | bSmoothFrameRate=True 721 | SmoothedFrameRateRange=(LowerBound=(Type=Inclusive,Value=22.000000),UpperBound=(Type=Exclusive,Value=120.000000)) 722 | bCheckForMultiplePawnsSpawnedInAFrame=False 723 | NumPawnsAllowedToBeSpawnedInAFrame=2 724 | bShouldGenerateLowQualityLightmaps=True 725 | MeshLODRange=0.000000 726 | bAllowMatureLanguage=False 727 | CameraRotationThreshold=45.000000 728 | CameraTranslationThreshold=10000.000000 729 | PrimitiveProbablyVisibleTime=8.000000 730 | MaxOcclusionPixelsFraction=0.100000 731 | bPauseOnLossOfFocus=False 732 | MaxParticleResize=0 733 | MaxParticleResizeWarn=0 734 | PhysicErrorCorrection=(LinearDeltaThresholdSq=5.000000,LinearInterpAlpha=0.200000,LinearRecipFixTime=1.000000,AngularDeltaThreshold=0.628319,AngularInterpAlpha=0.100000,AngularRecipFixTime=1.000000,BodySpeedThresholdSq=0.200000) 735 | NetClientTicksPerSecond=200.000000 736 | DisplayGamma=2.200000 737 | MinDesiredFrameRate=35.000000 738 | DefaultSelectedMaterialColor=(R=0.840000,G=0.920000,B=0.020000,A=1.000000) 739 | bEnableOnScreenDebugMessages=True 740 | bSuppressMapWarnings=False 741 | bCookSeparateSharedMPGameContent=False 742 | bDisableAILogging=False 743 | bEnableVisualLogRecordingOnStart=0 744 | ParticleEventManagerClassPath=/Script/Engine.ParticleEventManager 745 | -NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/OnlineSubsystemUtils.IpNetDriver",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver") 746 | -NetDriverDefinitions=(DefName="DemoNetDriver",DriverClassName="/Script/Engine.DemoNetDriver",DriverClassNameFallback="/Script/Engine.DemoNetDriver") 747 | +NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/OnlineSubsystemUtils.IpNetDriver",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver") 748 | +NetDriverDefinitions=(DefName="DemoNetDriver",DriverClassName="/Script/Engine.DemoNetDriver",DriverClassNameFallback="/Script/Engine.DemoNetDriver") 749 | 750 | [/Script/EngineSettings.GameMapsSettings] 751 | EditorStartupMap=/Game/RealSense/3DScan/Maps/Scan3D 752 | LocalMapOptions= 753 | TransitionMap= 754 | bUseSplitscreen=True 755 | TwoPlayerSplitscreenLayout=Horizontal 756 | ThreePlayerSplitscreenLayout=FavorTop 757 | GameInstanceClass=/Script/Engine.GameInstance 758 | GameDefaultMap=/Game/RealSense/3DScan/Maps/Scan3D 759 | ServerDefaultMap=/Engine/Maps/Entry 760 | GlobalDefaultGameMode=/Script/Engine.GameMode 761 | GlobalDefaultServerGameMode=None 762 | 763 | 764 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /Content/RealSense/3DScan/Blueprints/BP_Scan3DGameMode.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/3DScan/Blueprints/BP_Scan3DGameMode.uasset -------------------------------------------------------------------------------- /Content/RealSense/3DScan/Blueprints/ButtonsState.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/3DScan/Blueprints/ButtonsState.uasset -------------------------------------------------------------------------------- /Content/RealSense/3DScan/Blueprints/RealSensePawn.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/3DScan/Blueprints/RealSensePawn.uasset -------------------------------------------------------------------------------- /Content/RealSense/3DScan/Blueprints/ScanActor.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/3DScan/Blueprints/ScanActor.uasset -------------------------------------------------------------------------------- /Content/RealSense/3DScan/Blueprints/UI/Scan3DHUD.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/3DScan/Blueprints/UI/Scan3DHUD.uasset -------------------------------------------------------------------------------- /Content/RealSense/3DScan/Blueprints/UI/Scan3DUI.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/3DScan/Blueprints/UI/Scan3DUI.uasset -------------------------------------------------------------------------------- /Content/RealSense/3DScan/Faces/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /Content/RealSense/3DScan/Maps/Scan3D.umap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/3DScan/Maps/Scan3D.umap -------------------------------------------------------------------------------- /Content/RealSense/3DScan/Materials/VertexColorMat.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/3DScan/Materials/VertexColorMat.uasset -------------------------------------------------------------------------------- /Content/RealSense/CameraViewer/Blueprints/BP_CameraViewerGameMode.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/CameraViewer/Blueprints/BP_CameraViewerGameMode.uasset -------------------------------------------------------------------------------- /Content/RealSense/CameraViewer/Blueprints/BP_CameraViewerGameMode1.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/CameraViewer/Blueprints/BP_CameraViewerGameMode1.uasset -------------------------------------------------------------------------------- /Content/RealSense/CameraViewer/Blueprints/BP_CameraViewerGameMode2.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/CameraViewer/Blueprints/BP_CameraViewerGameMode2.uasset -------------------------------------------------------------------------------- /Content/RealSense/CameraViewer/Blueprints/CameraViewerHUD.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/CameraViewer/Blueprints/CameraViewerHUD.uasset -------------------------------------------------------------------------------- /Content/RealSense/CameraViewer/Blueprints/CameraViewerHUD2.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/CameraViewer/Blueprints/CameraViewerHUD2.uasset -------------------------------------------------------------------------------- /Content/RealSense/CameraViewer/Blueprints/CameraViewerUI.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/CameraViewer/Blueprints/CameraViewerUI.uasset -------------------------------------------------------------------------------- /Content/RealSense/CameraViewer/Maps/CameraViewer.umap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/CameraViewer/Maps/CameraViewer.umap -------------------------------------------------------------------------------- /Content/RealSense/Common/Blueprints/ComboBoxItem.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/Common/Blueprints/ComboBoxItem.uasset -------------------------------------------------------------------------------- /Content/RealSense/Common/Blueprints/gradient.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/Common/Blueprints/gradient.uasset -------------------------------------------------------------------------------- /Content/RealSense/HeadTracking/Blueprints/BP_HeadTrackingGameMode.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/HeadTracking/Blueprints/BP_HeadTrackingGameMode.uasset -------------------------------------------------------------------------------- /Content/RealSense/HeadTracking/Blueprints/HeadTrackingPawn.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/HeadTracking/Blueprints/HeadTrackingPawn.uasset -------------------------------------------------------------------------------- /Content/RealSense/HeadTracking/Blueprints/HeadTrackingPlayerController.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/HeadTracking/Blueprints/HeadTrackingPlayerController.uasset -------------------------------------------------------------------------------- /Content/RealSense/HeadTracking/Maps/HeadTracking.umap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/HeadTracking/Maps/HeadTracking.umap -------------------------------------------------------------------------------- /Content/RealSense/RealSenseFunctionLibrary.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Content/RealSense/RealSenseFunctionLibrary.uasset -------------------------------------------------------------------------------- /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 | } -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Resources/Icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/Plugins/RealSensePlugin/Resources/Icon128.png -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/CameraStreamComponent.cpp: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | 17 | #include "RealSensePluginPrivatePCH.h" 18 | #include "CameraStreamComponent.h" 19 | 20 | UCameraStreamComponent::UCameraStreamComponent(const class FObjectInitializer& ObjInit) 21 | : Super(ObjInit) 22 | { 23 | m_feature = RealSenseFeature::CAMERA_STREAMING; 24 | } 25 | 26 | // Adds the CAMERA_STREAMING feature to the RealSenseSessionManager and 27 | // initializes the ColorTexture and DepthTexture objects. 28 | void UCameraStreamComponent::InitializeComponent() 29 | { 30 | Super::InitializeComponent(); 31 | 32 | ColorTexture = UTexture2D::CreateTransient(1, 1, EPixelFormat::PF_B8G8R8A8); 33 | DepthTexture = UTexture2D::CreateTransient(1, 1, EPixelFormat::PF_B8G8R8A8); 34 | } 35 | 36 | // Copies the ColorBuffer and DepthBuffer from the RealSenseSessionManager. 37 | void UCameraStreamComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, 38 | FActorComponentTickFunction *ThisTickFunction) 39 | { 40 | if (globalRealSenseSession->IsCameraRunning() == false) { 41 | return; 42 | } 43 | 44 | ColorBuffer = globalRealSenseSession->GetColorBuffer(); 45 | DepthBuffer = globalRealSenseSession->GetDepthBuffer(); 46 | } 47 | 48 | // If the supplied resolution is valid, this function will pass that resolution 49 | // along to the RealSenseSessionManager and recreate the ColorTexture objects 50 | // to have the same resolution. 51 | void UCameraStreamComponent::SetColorCameraResolution(EColorResolution resolution) 52 | { 53 | if (resolution == EColorResolution::UNDEFINED) { 54 | return; 55 | } 56 | 57 | Super::SetColorCameraResolution(resolution); 58 | 59 | int ColorImageWidth = globalRealSenseSession->GetColorImageWidth(); 60 | int ColorImageHeight = globalRealSenseSession->GetColorImageHeight(); 61 | ColorTexture = UTexture2D::CreateTransient(ColorImageWidth, ColorImageHeight, 62 | PF_B8G8R8A8); 63 | ColorTexture->UpdateResource(); 64 | } 65 | 66 | // If the supplied resolution is valid, this function will pass that resolution 67 | // along to the RealSenseSessionManager and recreate the DepthTexture objects 68 | // to have the same resolution. 69 | void UCameraStreamComponent::SetDepthCameraResolution(EDepthResolution resolution) 70 | { 71 | if (resolution == EDepthResolution::UNDEFINED) { 72 | return; 73 | } 74 | 75 | Super::SetDepthCameraResolution(resolution); 76 | 77 | int DepthImageWidth = globalRealSenseSession->GetDepthImageWidth(); 78 | int DepthImageHeight = globalRealSenseSession->GetDepthImageHeight(); 79 | DepthTexture = UTexture2D::CreateTransient(DepthImageWidth, DepthImageHeight, 80 | PF_B8G8R8A8); 81 | DepthTexture->UpdateResource(); 82 | } 83 | 84 | // Enable 3D segmentation. 85 | void UCameraStreamComponent::Enable3DSegmentation(bool b3DSeg) 86 | { 87 | if (b3DSeg) 88 | { 89 | m_feature = RealSenseFeature::SEGMENTATION_3D; 90 | Super::EnableFeature(); 91 | } 92 | } -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/HeadTrackingComponent.cpp: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | #include "RealSensePluginPrivatePCH.h" 17 | #include "HeadTrackingComponent.h" 18 | 19 | UHeadTrackingComponent::UHeadTrackingComponent(const class FObjectInitializer& ObjInit) 20 | : Super(ObjInit) 21 | { 22 | m_feature = RealSenseFeature::HEAD_TRACKING; 23 | } 24 | 25 | void UHeadTrackingComponent::InitializeComponent() 26 | { 27 | Super::InitializeComponent(); 28 | 29 | HeadCount = 0; 30 | HeadPosition = FVector(0.0f, 0.0f, 0.0f); 31 | HeadRotation = FRotator(0.0f, 0.0f, 0.0f); 32 | } 33 | 34 | void UHeadTrackingComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, 35 | FActorComponentTickFunction *ThisTickFunction) 36 | { 37 | if (globalRealSenseSession->IsCameraRunning() == false) { 38 | return; 39 | } 40 | 41 | HeadCount = globalRealSenseSession->GetHeadCount(); 42 | HeadPosition = globalRealSenseSession->GetHeadPosition(); 43 | HeadRotation = globalRealSenseSession->GetHeadRotation(); 44 | } 45 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/RealSenseBlueprintLibrary.cpp: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | 17 | #include "RealSensePluginPrivatePCH.h" 18 | #include "RealSenseBlueprintLibrary.h" 19 | 20 | URealSenseBlueprintLibrary::URealSenseBlueprintLibrary(const class FObjectInitializer& ObjInit) 21 | : Super(ObjInit) 22 | { 23 | } 24 | 25 | FString URealSenseBlueprintLibrary::EColorResolutionToString(EColorResolution value) 26 | { 27 | switch (value) { 28 | case EColorResolution::RES1: 29 | return FString("1920 x 1080 x 30"); 30 | case EColorResolution::RES2: 31 | return FString("1280 x 720 x 30"); 32 | case EColorResolution::RES3: 33 | return FString("640 x 480 x 60"); 34 | case EColorResolution::RES4: 35 | return FString("640 x 480 x 30"); 36 | case EColorResolution::RES5: 37 | return FString("320 x 240 x 60"); 38 | case EColorResolution::RES6: 39 | return FString("320 x 240 x 30"); 40 | default: 41 | return FString(" "); 42 | } 43 | } 44 | 45 | FString URealSenseBlueprintLibrary::EDepthResolutionToString(EDepthResolution value) 46 | { 47 | switch (value) { 48 | case EDepthResolution::RES1: 49 | return FString("640 x 480 x 60 (F200)"); 50 | case EDepthResolution::RES2: 51 | return FString("640 x 480 x 30 (F200)"); 52 | case EDepthResolution::RES3: 53 | return FString("628 x 468 x 90 (R200)"); 54 | case EDepthResolution::RES4: 55 | return FString("628 x 468 x 60 (R200)"); 56 | case EDepthResolution::RES5: 57 | return FString("628 x 468 x 30 (R200)"); 58 | case EDepthResolution::RES6: 59 | return FString("480 x 360 x 90 (R200)"); 60 | case EDepthResolution::RES7: 61 | return FString("480 x 360 x 60 (R200)"); 62 | case EDepthResolution::RES8: 63 | return FString("480 x 360 x 30 (R200)"); 64 | case EDepthResolution::RES9: 65 | return FString("320 x 240 x 90 (R200)"); 66 | case EDepthResolution::RES10: 67 | return FString("320 x 240 x 60 (R200)"); 68 | case EDepthResolution::RES11: 69 | return FString("320 x 240 x 30 (R200)"); 70 | default: 71 | return FString(" "); 72 | } 73 | } 74 | 75 | FString URealSenseBlueprintLibrary::ECameraModelToString(ECameraModel value) 76 | { 77 | switch (value) { 78 | case ECameraModel::F200: 79 | return FString("Front-Facing (F200)"); 80 | case ECameraModel::R200: 81 | return FString("World-Facing (R200)"); 82 | case ECameraModel::SR300: 83 | return FString("Short-Range (SR300)"); 84 | case ECameraModel::Other: 85 | return FString("Unknown Camera Model"); 86 | default: 87 | return FString(" "); 88 | } 89 | } 90 | 91 | // Copies the data from the input Buffer into the PlatformData of the Texture object. 92 | // For convenience, this function returns a pointer to the input Texture that was 93 | // modified. 94 | UTexture2D* URealSenseBlueprintLibrary::ColorBufferToTexture(const TArray& Buffer, UTexture2D* Texture) 95 | { 96 | if (Texture == nullptr) { 97 | return nullptr; 98 | } 99 | 100 | // Test that the Buffer and Texture have the same capacity 101 | if (Buffer.Num() != Texture->GetSizeX() * Texture->GetSizeY()) { 102 | return nullptr; 103 | } 104 | 105 | // The Texture's PlatformData needs to be locked before it can be modified. 106 | auto out = reinterpret_cast(Texture->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE)); 107 | 108 | // There are four bytes per pixel, one each for Red, Green, Blue, and Alpha. 109 | uint8 bytesPerPixel = 4; 110 | uint32 size = Texture->GetSizeX() * Texture->GetSizeY() * bytesPerPixel; 111 | memcpy_s(out, size, Buffer.GetData(), size); 112 | 113 | Texture->PlatformData->Mips[0].BulkData.Unlock(); 114 | Texture->UpdateResource(); 115 | 116 | return Texture; 117 | } 118 | 119 | // Copies the data from the input Buffer into the PlatformData of the Texture object. 120 | // For convenience, this function returns a pointer to the input Texture that was modified. 121 | UTexture2D* URealSenseBlueprintLibrary::DepthBufferToTexture(const TArray& Buffer, UTexture2D* Texture) 122 | { 123 | if (Texture == nullptr) { 124 | return nullptr; 125 | } 126 | 127 | // Test that the Buffer and Texture have the same capacity 128 | if (Buffer.Num() != Texture->GetSizeX() * Texture->GetSizeY()) { 129 | return nullptr; 130 | } 131 | 132 | // The Texture's PlatformData needs to be locked before it can be modified. 133 | auto out = reinterpret_cast(Texture->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE)); 134 | 135 | for (int32 x : Buffer) { 136 | // Convert the depth value (in millimeters) into a value between 0 - 255. 137 | uint8 d = ConvertDepthValueTo8Bit(x, Texture->GetSizeX()); 138 | *out++ = d; 139 | *out++ = d; 140 | *out++ = d; 141 | *out++ = 255; 142 | } 143 | 144 | Texture->PlatformData->Mips[0].BulkData.Unlock(); 145 | Texture->UpdateResource(); 146 | 147 | return Texture; 148 | } 149 | 150 | // Finds all .OBJ files in the specified Directory, relative to the Content 151 | // path of the game. 152 | TArray URealSenseBlueprintLibrary::GetMeshFiles(FString Directory) 153 | { 154 | // Ensure that the directory ends with a trailing slash 155 | if (Directory.EndsWith("/") == false) { 156 | Directory.Append("/"); 157 | } 158 | 159 | // Get the absolute path of the game's Content directory and append the 160 | // specified path to it, along with the filename. 161 | FString Dir = FPaths::GameContentDir() + Directory + TEXT("*.obj"); 162 | 163 | IFileManager& FileManager = IFileManager::Get(); 164 | TArray MeshFiles; 165 | FileManager.FindFiles(MeshFiles, *Dir, true, false); 166 | 167 | return MeshFiles; 168 | } 169 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/RealSenseComponent.cpp: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | #include "RealSensePluginPrivatePCH.h" 17 | #include "RealSenseComponent.h" 18 | 19 | // Specifies that this component should be initialized and can tick. 20 | URealSenseComponent::URealSenseComponent(const class FObjectInitializer& ObjInit) 21 | : Super(ObjInit) 22 | { 23 | bWantsInitializeComponent = true; 24 | PrimaryComponentTick.bCanEverTick = true; 25 | 26 | CameraModel = ECameraModel::None; 27 | CameraFirmware = "0.0.0.0"; 28 | 29 | ColorHorizontalFOV = 0.0f; 30 | ColorVerticalFOV = 0.0f; 31 | DepthHorizontalFOV = 0.0f; 32 | DepthVerticalFOV = 0.0f; 33 | 34 | globalRealSenseSession = nullptr; 35 | } 36 | 37 | // When initialized, this component will check if a RealSenseSessionManager actor 38 | // exists in the scene. If the actor exists, this component stores a reference to 39 | // it. If it does not, a new RealSenseSessionManager actor will be spawned, and a 40 | // reference to it will be saved. 41 | void URealSenseComponent::InitializeComponent() 42 | { 43 | if (globalRealSenseSession == nullptr) { 44 | for (TActorIterator Itr(GetWorld()); Itr; ++Itr) { 45 | globalRealSenseSession = (ARealSenseSessionManager*)*Itr; 46 | } 47 | if (globalRealSenseSession == nullptr) { 48 | RS_LOG(Log, "Creating RealSenseSessionManager Actor") 49 | globalRealSenseSession = GetWorld()->SpawnActor(ARealSenseSessionManager::StaticClass()); 50 | } 51 | } 52 | 53 | if (globalRealSenseSession) 54 | { 55 | globalRealSenseSession->EnableFeature(m_feature); 56 | } 57 | } 58 | 59 | // Queries the camera model, firmware, and field of view data from the RealSense 60 | // camera. 61 | void URealSenseComponent::BeginPlay() 62 | { 63 | CameraModel = globalRealSenseSession->GetCameraModel(); 64 | CameraFirmware = globalRealSenseSession->GetCameraFirmware(); 65 | 66 | ColorHorizontalFOV = globalRealSenseSession->GetColorHorizontalFOV(); 67 | ColorVerticalFOV = globalRealSenseSession->GetColorVerticalFOV(); 68 | 69 | DepthHorizontalFOV = globalRealSenseSession->GetDepthHorizontalFOV(); 70 | DepthVerticalFOV = globalRealSenseSession->GetDepthVerticalFOV(); 71 | } 72 | 73 | void URealSenseComponent::EnableFeature() 74 | { 75 | globalRealSenseSession->EnableFeature(m_feature); 76 | } 77 | 78 | void URealSenseComponent::DisableFeature() 79 | { 80 | globalRealSenseSession->DisableFeature(m_feature); 81 | } 82 | 83 | void URealSenseComponent::StartCamera() 84 | { 85 | globalRealSenseSession->StartCamera(); 86 | } 87 | 88 | void URealSenseComponent::StopCamera() 89 | { 90 | globalRealSenseSession->StopCamera(); 91 | } 92 | 93 | bool URealSenseComponent::IsCameraRunning() 94 | { 95 | return globalRealSenseSession->IsCameraRunning(); 96 | } 97 | 98 | FStreamResolution URealSenseComponent::GetColorCameraResolution() 99 | { 100 | return globalRealSenseSession->GetColorCameraResolution(); 101 | } 102 | 103 | void URealSenseComponent::SetColorCameraResolution(EColorResolution resolution) 104 | { 105 | if (resolution != EColorResolution::UNDEFINED) { 106 | globalRealSenseSession->SetColorCameraResolution(resolution); 107 | } 108 | } 109 | 110 | FStreamResolution URealSenseComponent::GetDepthCameraResolution() 111 | { 112 | return globalRealSenseSession->GetDepthCameraResolution(); 113 | } 114 | 115 | void URealSenseComponent::SetDepthCameraResolution(EDepthResolution resolution) 116 | { 117 | if (resolution != EDepthResolution::UNDEFINED) { 118 | globalRealSenseSession->SetDepthCameraResolution(resolution); 119 | } 120 | } 121 | 122 | bool URealSenseComponent::IsStreamSetValid(EColorResolution ColorResolution, 123 | EDepthResolution DepthResolution) 124 | { 125 | return globalRealSenseSession->IsStreamSetValid(ColorResolution, DepthResolution); 126 | } 127 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/RealSenseImpl.cpp: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | #include "RealSensePluginPrivatePCH.h" 17 | #include "RealSenseImpl.h" 18 | 19 | // Creates handles to the RealSense Session and SenseManager and iterates over 20 | // all video capture devices to find a RealSense camera. 21 | // 22 | // Creates three RealSenseDataFrames (background, mid, and foreground) to 23 | // share RealSense data between the camera processing thread and the main thread. 24 | RealSenseImpl::RealSenseImpl() 25 | { 26 | session = std::unique_ptr(PXCSession::CreateInstance()); 27 | assert(session != nullptr); 28 | 29 | senseManager = std::unique_ptr(session->CreateSenseManager()); 30 | assert(senseManager != nullptr); 31 | 32 | capture = std::unique_ptr(nullptr); 33 | device = std::unique_ptr(nullptr); 34 | deviceInfo = {}; 35 | 36 | // Loop through video capture devices to find a RealSense Camera 37 | PXCSession::ImplDesc desc1 = {}; 38 | desc1.group = PXCSession::IMPL_GROUP_SENSOR; 39 | desc1.subgroup = PXCSession::IMPL_SUBGROUP_VIDEO_CAPTURE; 40 | for (int m = 0; ; m++) { 41 | if (device) 42 | break; 43 | 44 | PXCSession::ImplDesc desc2 = {}; 45 | if (session->QueryImpl(&desc1, m, &desc2) != PXC_STATUS_NO_ERROR) 46 | break; 47 | 48 | PXCCapture* tmp; 49 | if (session->CreateImpl(&desc2, &tmp) != PXC_STATUS_NO_ERROR) 50 | continue; 51 | capture.reset(tmp); 52 | 53 | for (int j = 0; ; j++) { 54 | if (capture->QueryDeviceInfo(j, &deviceInfo) != PXC_STATUS_NO_ERROR) 55 | break; 56 | 57 | if ((deviceInfo.model == PXCCapture::DeviceModel::DEVICE_MODEL_F200) || 58 | (deviceInfo.model == PXCCapture::DeviceModel::DEVICE_MODEL_R200) || 59 | (deviceInfo.model == PXCCapture::DeviceModel::DEVICE_MODEL_R200_ENHANCED) || 60 | (deviceInfo.model == PXCCapture::DeviceModel::DEVICE_MODEL_SR300)) { 61 | device = std::unique_ptr(capture->CreateDevice(j)); 62 | } 63 | } 64 | } 65 | 66 | p3DScan = std::unique_ptr(nullptr); 67 | pFace = std::unique_ptr(nullptr); 68 | 69 | RealSenseFeatureSet = 0; 70 | bCameraStreamingEnabled = false; 71 | bScan3DEnabled = false; 72 | bFaceEnabled = false; 73 | 74 | bCameraThreadRunning = false; 75 | 76 | fgFrame = std::unique_ptr(new RealSenseDataFrame()); 77 | midFrame = std::unique_ptr(new RealSenseDataFrame()); 78 | bgFrame = std::unique_ptr(new RealSenseDataFrame()); 79 | 80 | colorResolution = {}; 81 | depthResolution = {}; 82 | 83 | if (device == nullptr) { 84 | colorHorizontalFOV = 0.0f; 85 | colorVerticalFOV = 0.0f; 86 | depthHorizontalFOV = 0.0f; 87 | depthVerticalFOV = 0.0f; 88 | } 89 | else { 90 | PXCPointF32 cfov = device->QueryColorFieldOfView(); 91 | colorHorizontalFOV = cfov.x; 92 | colorVerticalFOV = cfov.y; 93 | 94 | PXCPointF32 dfov = device->QueryDepthFieldOfView(); 95 | depthHorizontalFOV = dfov.x; 96 | depthVerticalFOV = dfov.y; 97 | } 98 | 99 | scan3DResolution = {}; 100 | scan3DFileFormat = PXC3DScan::FileFormat::OBJ; 101 | 102 | bScanStarted = false; 103 | bScanStopped = false; 104 | bReconstructEnabled = false; 105 | bScanCompleted = false; 106 | bScan3DImageSizeChanged = false; 107 | } 108 | 109 | // Terminate the camera thread and release the Core SDK handles. 110 | // SDK Module handles are handled internally and should not be released manually. 111 | RealSenseImpl::~RealSenseImpl() 112 | { 113 | if (bCameraThreadRunning) { 114 | bCameraThreadRunning = false; 115 | cameraThread.join(); 116 | } 117 | } 118 | 119 | // Camera Processing Thread 120 | // Initialize the RealSense SenseManager and initiate camera processing loop: 121 | // Step 1: Acquire new camera frame 122 | // Step 2: Load shared settings 123 | // Step 3: Perform Core SDK and middleware processing and store results 124 | // in background RealSenseDataFrame 125 | // Step 4: Swap the background and mid RealSenseDataFrames 126 | void RealSenseImpl::CameraThread() 127 | { 128 | uint64 currentFrame = 0; 129 | 130 | fgFrame->number = 0; 131 | midFrame->number = 0; 132 | bgFrame->number = 0; 133 | 134 | pxcStatus status = senseManager->Init(); 135 | RS_LOG_STATUS(status, "SenseManager Initialized") 136 | 137 | assert(status == PXC_STATUS_NO_ERROR); 138 | 139 | if (bFaceEnabled) { 140 | faceData = pFace->CreateOutput(); 141 | } 142 | 143 | while (bCameraThreadRunning == true) { 144 | // Acquires new camera frame 145 | status = senseManager->AcquireFrame(true); 146 | assert(status == PXC_STATUS_NO_ERROR); 147 | 148 | bgFrame->number = ++currentFrame; 149 | 150 | // Performs Core SDK and middleware processing and store results 151 | // in background RealSenseDataFrame 152 | 153 | if (bSeg3DEnabled) 154 | { 155 | PXCImage* segmentedImage = p3DSeg->AcquireSegmentedImage(); 156 | if (segmentedImage) 157 | { 158 | CopySegmentedImageToBuffer(segmentedImage, bgFrame->colorImage, colorResolution.width, colorResolution.height); 159 | SAFE_RELEASE(segmentedImage); 160 | } 161 | } 162 | 163 | else if (bCameraStreamingEnabled) { 164 | PXCCapture::Sample* sample = senseManager->QuerySample(); 165 | 166 | CopyColorImageToBuffer(sample->color, bgFrame->colorImage, colorResolution.width, colorResolution.height); 167 | CopyDepthImageToBuffer(sample->depth, bgFrame->depthImage, depthResolution.width, depthResolution.height); 168 | } 169 | 170 | if (bScan3DEnabled) { 171 | if (bScanStarted) { 172 | PXC3DScan::Configuration config = p3DScan->QueryConfiguration(); 173 | config.startScan = true; 174 | p3DScan->SetConfiguration(config); 175 | bScanStarted = false; 176 | } 177 | 178 | if (bScanStopped) { 179 | PXC3DScan::Configuration config = p3DScan->QueryConfiguration(); 180 | config.startScan = false; 181 | p3DScan->SetConfiguration(config); 182 | bScanStopped = false; 183 | } 184 | 185 | PXCImage* scanImage = p3DScan->AcquirePreviewImage(); 186 | if (scanImage) { 187 | UpdateScan3DImageSize(scanImage->QueryInfo()); 188 | CopyColorImageToBuffer(scanImage, bgFrame->scanImage, scan3DResolution.width, scan3DResolution.height); 189 | scanImage->Release(); 190 | } 191 | 192 | if (bReconstructEnabled) { 193 | status = p3DScan->Reconstruct(scan3DFileFormat, scan3DFilename.GetCharArray().GetData()); 194 | bReconstructEnabled = false; 195 | bScanCompleted = true; 196 | } 197 | } 198 | 199 | if (bFaceEnabled) { 200 | faceData->Update(); 201 | bgFrame->headCount = faceData->QueryNumberOfDetectedFaces(); 202 | if (bgFrame->headCount > 0) { 203 | PXCFaceData::Face* face = faceData->QueryFaceByIndex(0); 204 | PXCFaceData::PoseData* poseData = face->QueryPose(); 205 | 206 | if (poseData) { 207 | PXCFaceData::HeadPosition headPosition = {}; 208 | poseData->QueryHeadPosition(&headPosition); 209 | bgFrame->headPosition = FVector(headPosition.headCenter.x, headPosition.headCenter.y, headPosition.headCenter.z); 210 | 211 | PXCFaceData::PoseEulerAngles headRotation = {}; 212 | poseData->QueryPoseAngles(&headRotation); 213 | bgFrame->headRotation = FRotator(headRotation.pitch, headRotation.yaw, headRotation.roll); 214 | } 215 | } 216 | } 217 | 218 | senseManager->ReleaseFrame(); 219 | 220 | // Swaps background and mid RealSenseDataFrames 221 | std::unique_lock lockIntermediate(midFrameMutex); 222 | bgFrame.swap(midFrame); 223 | } 224 | } 225 | 226 | // If it is not already running, starts a new camera processing thread 227 | void RealSenseImpl::StartCamera() 228 | { 229 | if (bCameraThreadRunning == false) { 230 | EnableMiddleware(); 231 | bCameraThreadRunning = true; 232 | cameraThread = std::thread([this]() { CameraThread(); }); 233 | } 234 | } 235 | 236 | // If there is a camera processing thread running, this function terminates it. 237 | // Then it resets the SenseManager pipeline (by closing it and re-enabling the 238 | // previously specified feature set). 239 | void RealSenseImpl::StopCamera() 240 | { 241 | if (bCameraThreadRunning) { 242 | bCameraThreadRunning = false; 243 | cameraThread.join(); 244 | } 245 | senseManager->Close(); 246 | } 247 | 248 | // Swaps the mid and foreground RealSenseDataFrames. 249 | void RealSenseImpl::SwapFrames() 250 | { 251 | std::unique_lock lock(midFrameMutex); 252 | if (fgFrame->number < midFrame->number) { 253 | fgFrame.swap(midFrame); 254 | } 255 | } 256 | 257 | void RealSenseImpl::EnableMiddleware() 258 | { 259 | if (bScan3DEnabled) { 260 | senseManager->Enable3DScan(); 261 | p3DScan = std::unique_ptr(senseManager->Query3DScan()); 262 | } 263 | if (bFaceEnabled) { 264 | senseManager->EnableFace(); 265 | pFace = std::unique_ptr(senseManager->QueryFace()); 266 | } 267 | if (bSeg3DEnabled) 268 | { 269 | senseManager->Enable3DSeg(); 270 | p3DSeg = std::unique_ptr(senseManager->Query3DSeg()); 271 | } 272 | } 273 | 274 | void RealSenseImpl::EnableFeature(RealSenseFeature feature) 275 | { 276 | switch (feature) { 277 | case RealSenseFeature::CAMERA_STREAMING: 278 | bCameraStreamingEnabled = true; 279 | return; 280 | case RealSenseFeature::SCAN_3D: 281 | bScan3DEnabled = true; 282 | return; 283 | case RealSenseFeature::HEAD_TRACKING: 284 | bFaceEnabled = true; 285 | return; 286 | case RealSenseFeature::SEGMENTATION_3D: 287 | bSeg3DEnabled = true; 288 | return; 289 | } 290 | } 291 | 292 | void RealSenseImpl::DisableFeature(RealSenseFeature feature) 293 | { 294 | switch (feature) { 295 | case RealSenseFeature::CAMERA_STREAMING: 296 | bCameraStreamingEnabled = false; 297 | return; 298 | case RealSenseFeature::SCAN_3D: 299 | bScan3DEnabled = false; 300 | return; 301 | case RealSenseFeature::HEAD_TRACKING: 302 | bFaceEnabled = false; 303 | return; 304 | case RealSenseFeature::SEGMENTATION_3D: 305 | bSeg3DEnabled = false; 306 | return; 307 | } 308 | } 309 | 310 | // Returns the connceted device's model as a Blueprintable enum value. 311 | const ECameraModel RealSenseImpl::GetCameraModel() const 312 | { 313 | switch (deviceInfo.model) { 314 | case PXCCapture::DeviceModel::DEVICE_MODEL_F200: 315 | return ECameraModel::F200; 316 | case PXCCapture::DeviceModel::DEVICE_MODEL_R200: 317 | case PXCCapture::DeviceModel::DEVICE_MODEL_R200_ENHANCED: 318 | return ECameraModel::R200; 319 | case PXCCapture::DeviceModel::DEVICE_MODEL_SR300: 320 | return ECameraModel::SR300; 321 | default: 322 | return ECameraModel::Other; 323 | } 324 | } 325 | 326 | // Returns the connected camera's firmware version as a human-readable string. 327 | const FString RealSenseImpl::GetCameraFirmware() const 328 | { 329 | return FString::Printf(TEXT("%d.%d.%d.%d"), deviceInfo.firmware[0], 330 | deviceInfo.firmware[1], 331 | deviceInfo.firmware[2], 332 | deviceInfo.firmware[3]); 333 | } 334 | 335 | // Enables the color camera stream of the SenseManager using the specified resolution 336 | // and resizes the colorImage buffer of the RealSenseDataFrames to match. 337 | void RealSenseImpl::SetColorCameraResolution(EColorResolution resolution) 338 | { 339 | colorResolution = GetEColorResolutionValue(resolution); 340 | 341 | status = senseManager->EnableStream(PXCCapture::StreamType::STREAM_TYPE_COLOR, 342 | colorResolution.width, 343 | colorResolution.height, 344 | colorResolution.fps); 345 | 346 | assert(status == PXC_STATUS_NO_ERROR); 347 | 348 | const uint8 bytesPerPixel = 4; 349 | const uint32 colorImageSize = colorResolution.width * colorResolution.height * bytesPerPixel; 350 | bgFrame->colorImage.SetNumZeroed(colorImageSize); 351 | midFrame->colorImage.SetNumZeroed(colorImageSize); 352 | fgFrame->colorImage.SetNumZeroed(colorImageSize); 353 | } 354 | 355 | // Enables the depth camera stream of the SenseManager using the specified resolution 356 | // and resizes the depthImage buffer of the RealSenseDataFrames to match. 357 | void RealSenseImpl::SetDepthCameraResolution(EDepthResolution resolution) 358 | { 359 | depthResolution = GetEDepthResolutionValue(resolution); 360 | status = senseManager->EnableStream(PXCCapture::StreamType::STREAM_TYPE_DEPTH, 361 | depthResolution.width, 362 | depthResolution.height, 363 | depthResolution.fps); 364 | 365 | assert(status == PXC_STATUS_NO_ERROR); 366 | 367 | if (status == PXC_STATUS_NO_ERROR) { 368 | const uint32 depthImageSize = depthResolution.width * depthResolution.height; 369 | bgFrame->depthImage.SetNumZeroed(depthImageSize); 370 | midFrame->depthImage.SetNumZeroed(depthImageSize); 371 | fgFrame->depthImage.SetNumZeroed(depthImageSize); 372 | } 373 | } 374 | 375 | // Creates a StreamProfile for the specified color and depth resolutions and 376 | // uses the RSSDK function IsStreamProfileSetValid to test if the two 377 | // camera resolutions are supported together as a set. 378 | bool RealSenseImpl::IsStreamSetValid(EColorResolution ColorResolution, EDepthResolution DepthResolution) const 379 | { 380 | FStreamResolution CRes = GetEColorResolutionValue(ColorResolution); 381 | FStreamResolution DRes = GetEDepthResolutionValue(DepthResolution); 382 | 383 | PXCCapture::Device::StreamProfileSet profiles = {}; 384 | 385 | PXCImage::ImageInfo colorInfo; 386 | colorInfo.width = CRes.width; 387 | colorInfo.height = CRes.height; 388 | colorInfo.format = GetPXCPixelFormat(CRes.format); 389 | colorInfo.reserved = 0; 390 | 391 | profiles.color.imageInfo = colorInfo; 392 | profiles.color.frameRate = { CRes.fps, CRes.fps }; 393 | profiles.color.options = PXCCapture::Device::StreamOption::STREAM_OPTION_ANY; 394 | 395 | PXCImage::ImageInfo depthInfo; 396 | depthInfo.width = DRes.width; 397 | depthInfo.height = DRes.height; 398 | depthInfo.format = GetPXCPixelFormat(DRes.format); 399 | depthInfo.reserved = 0; 400 | 401 | profiles.depth.imageInfo = depthInfo; 402 | profiles.depth.frameRate = { DRes.fps, DRes.fps }; 403 | profiles.depth.options = PXCCapture::Device::StreamOption::STREAM_OPTION_ANY; 404 | 405 | return (device->IsStreamProfileSetValid(&profiles) != 0); 406 | } 407 | 408 | // Creates a new configuration for the 3D Scanning module, specifying the 409 | // scanning mode, solidify, and texture options, and initializing the 410 | // startScan flag to false to postpone the start of scanning. 411 | void RealSenseImpl::ConfigureScanning(EScan3DMode scanningMode, bool bSolidify, bool bTexture) 412 | { 413 | PXC3DScan::Configuration config = {}; 414 | 415 | config.mode = GetPXCScanningMode(scanningMode); 416 | 417 | config.options = PXC3DScan::ReconstructionOption::NONE; 418 | if (bSolidify) { 419 | config.options = config.options | PXC3DScan::ReconstructionOption::SOLIDIFICATION; 420 | } 421 | if (bTexture) { 422 | config.options = config.options | PXC3DScan::ReconstructionOption::TEXTURE; 423 | } 424 | 425 | config.startScan = false; 426 | 427 | status = p3DScan->SetConfiguration(config); 428 | assert(status == PXC_STATUS_NO_ERROR); 429 | } 430 | 431 | // Manually sets the 3D volume in which the 3D scanning module will collect 432 | // data and the voxel resolution to use while scanning. 433 | void RealSenseImpl::SetScanningVolume(FVector boundingBox, int32 resolution) 434 | { 435 | PXC3DScan::Area area; 436 | area.shape.width = boundingBox.X; 437 | area.shape.height = boundingBox.Y; 438 | area.shape.depth = boundingBox.Z; 439 | area.resolution = resolution; 440 | 441 | status = p3DScan->SetArea(area); 442 | assert(status == PXC_STATUS_NO_ERROR); 443 | } 444 | 445 | // Sets the scanStarted flag to true. On the next iteration of the camera 446 | // processing loop, it will load this flag and tell the 3D Scanning configuration 447 | // to begin scanning. 448 | void RealSenseImpl::StartScanning() 449 | { 450 | bScanStarted = true; 451 | bScanCompleted = false; 452 | } 453 | 454 | // Sets the scanStopped flag to true. On the next iteration of the camera 455 | // processing loop, it will load this flag and tell the 3D Scanning configuration 456 | // to stop scanning. 457 | void RealSenseImpl::StopScanning() 458 | { 459 | bScanStopped = true; 460 | } 461 | 462 | // Stores the file format and filename to use for saving the scan and sets the 463 | // reconstructEnabled flag to true. On the next iteration of the camera processing 464 | // loop, it will load this flag and reconstruct the scanned data as a mesh file. 465 | void RealSenseImpl::SaveScan(EScan3DFileFormat saveFileFormat, const FString& filename) 466 | { 467 | scan3DFileFormat = GetPXCScanFileFormat(saveFileFormat); 468 | scan3DFilename = filename; 469 | bReconstructEnabled = true; 470 | } 471 | 472 | // The input ImageInfo object contains the wight and height of the preview image 473 | // provided by the 3D Scanning module. The image size can be changed automatically 474 | // by the middleware, so this function checks if the size has changed. 475 | // 476 | // If true, sets the 3D scan resolution to reflect the new size and resizes the 477 | // scanImage buffer of the RealSenseDataFrames to match. 478 | void RealSenseImpl::UpdateScan3DImageSize(PXCImage::ImageInfo info) 479 | { 480 | if ((scan3DResolution.width == info.width) && 481 | (scan3DResolution.height == info.height)) { 482 | bScan3DImageSizeChanged = false; 483 | return; 484 | } 485 | 486 | scan3DResolution.width = info.width; 487 | scan3DResolution.height = info.height; 488 | 489 | const uint8 bytesPerPixel = 4; 490 | const uint32 scanImageSize = scan3DResolution.width * scan3DResolution.height * bytesPerPixel; 491 | bgFrame->scanImage.SetNumZeroed(scanImageSize); 492 | midFrame->scanImage.SetNumZeroed(scanImageSize); 493 | fgFrame->scanImage.SetNumZeroed(scanImageSize); 494 | 495 | bScan3DImageSizeChanged = true; 496 | } 497 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/RealSenseImpl.h: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | #pragma once 17 | 18 | #include "AllowWindowsPlatformTypes.h" 19 | #include 20 | #include 21 | #include "HideWindowsPlatformTypes.h" 22 | 23 | #include "CoreMisc.h" 24 | #include "RealSenseTypes.h" 25 | #include "RealSenseUtils.h" 26 | #include "RealSenseBlueprintLibrary.h" 27 | #include "PXCSenseManager.h" 28 | 29 | // Stores all relevant data computed from one frame of RealSense camera data. 30 | // Advice: Use this structure in a multiple-buffer configuration to share 31 | // RealSense data between threads. 32 | // Example usage: 33 | // Thread 1: Process camera data and populate background_frame 34 | // Swap background_frame with mid_frame 35 | // Thread 2: Swap mid_frame with foreground_frame 36 | // Read data from foreground_frame 37 | struct RealSenseDataFrame { 38 | uint64 number; // Stores an ID for the frame based on its occurrence in time 39 | TArray colorImage; // Container for the camera's raw color stream data 40 | TArray depthImage; // Container for the camera's raw depth stream data 41 | TArray scanImage; // Container for the scan preview image provided by the 3DScan middleware 42 | 43 | int headCount; 44 | FVector headPosition; 45 | FRotator headRotation; 46 | 47 | RealSenseDataFrame() : number(0), headCount(0) {} 48 | }; 49 | 50 | // Implements the functionality of the Intel(R) RealSense(TM) SDK and associated 51 | // middleware modules as used by the RealSenseSessionManager Actor class. 52 | // 53 | // NOTE: Some function declarations do not have a function comment because the 54 | // comment is written in RealSenseSessionManager.h. 55 | class RealSenseImpl { 56 | public: 57 | // Creates a new RealSense Session and queries physical device information. 58 | RealSenseImpl(); 59 | 60 | // Terminates the camera processing thread and releases handles to Core SDK objects. 61 | ~RealSenseImpl(); 62 | 63 | // Performs RealSense Core and Middleware processing based on the enabled 64 | // feature set. 65 | // 66 | // This function is meant to be run on its own thread to minimize the 67 | // performance impact on the game thread. 68 | void CameraThread(); 69 | 70 | void StartCamera(); 71 | 72 | void StopCamera(); 73 | 74 | // Swaps the data frames to load the latest processed data into the 75 | // foreground frame. 76 | void SwapFrames(); 77 | 78 | inline bool IsCameraThreadRunning() const { return bCameraThreadRunning; } 79 | 80 | // Core SDK Support 81 | 82 | void EnableMiddleware(); 83 | 84 | void EnableFeature(RealSenseFeature feature); 85 | 86 | void DisableFeature(RealSenseFeature feature); 87 | 88 | inline bool IsCameraConnected() const { return (senseManager->IsConnected() != 0); } 89 | 90 | inline float GetColorHorizontalFOV() const { return colorHorizontalFOV; } 91 | 92 | inline float GetColorVerticalFOV() const { return colorVerticalFOV; } 93 | 94 | inline float GetDepthHorizontalFOV() const { return depthHorizontalFOV; } 95 | 96 | inline float GetDepthVerticalFOV() const { return depthVerticalFOV; } 97 | 98 | const ECameraModel GetCameraModel() const; 99 | 100 | const FString GetCameraFirmware() const; 101 | 102 | inline FStreamResolution GetColorCameraResolution() const { return colorResolution; } 103 | 104 | inline int32 GetColorImageWidth() const { return colorResolution.width; } 105 | 106 | inline int32 GetColorImageHeight() const { return colorResolution.height; } 107 | 108 | void SetColorCameraResolution(EColorResolution resolution); 109 | 110 | inline FStreamResolution GetDepthCameraResolution() const { return depthResolution; } 111 | 112 | inline int32 GetDepthImageWidth() const { return depthResolution.width; } 113 | 114 | inline int32 GetDepthImageHeight() const { return depthResolution.height; } 115 | 116 | void SetDepthCameraResolution(EDepthResolution resolution); 117 | 118 | bool IsStreamSetValid(EColorResolution ColorResolution, EDepthResolution DepthResolution) const; 119 | 120 | inline const uint8* GetColorBuffer() const { return fgFrame->colorImage.GetData(); } 121 | 122 | inline const uint16* GetDepthBuffer() const { return fgFrame->depthImage.GetData(); } 123 | 124 | // 3D Scanning Module Support 125 | 126 | void ConfigureScanning(EScan3DMode scanningMode, bool bSolidify, bool bTexture); 127 | 128 | void SetScanningVolume(FVector boundingBox, int32 resolution); 129 | 130 | void StartScanning(); 131 | 132 | void StopScanning(); 133 | 134 | void SaveScan(EScan3DFileFormat saveFileFormat, const FString& filename); 135 | 136 | inline bool IsScanning() const { return (p3DScan->IsScanning() != 0); } 137 | 138 | inline FStreamResolution GetScan3DResolution() const { return scan3DResolution; } 139 | 140 | inline int32 GetScan3DImageWidth() const { return scan3DResolution.width; } 141 | 142 | inline int32 GetScan3DImageHeight() const { return scan3DResolution.height; } 143 | 144 | inline const uint8* GetScanBuffer() const { return fgFrame->scanImage.GetData(); } 145 | 146 | inline bool HasScan3DImageSizeChanged() const { return bScan3DImageSizeChanged; } 147 | 148 | inline bool HasScanCompleted() const { return bScanCompleted; } 149 | 150 | // Head Tracking Support 151 | 152 | inline int GetHeadCount() const { return bgFrame->headCount; } 153 | 154 | inline FVector GetHeadPosition() const { return bgFrame->headPosition; } 155 | 156 | inline FRotator GetHeadRotation() const { return bgFrame->headRotation; } 157 | 158 | private: 159 | // Core SDK handles 160 | 161 | struct RealSenseDeleter { 162 | void operator()(PXCSession* s) { s->Release(); } 163 | void operator()(PXCSenseManager* sm) { sm->Release(); } 164 | void operator()(PXCCapture* c) { c->Release(); } 165 | void operator()(PXCCapture::Device* d) { d->Release(); } 166 | void operator()(PXC3DScan* sc) { ; } 167 | void operator()(PXCFaceModule* sc) { ; } 168 | void operator()(PXC3DSeg* s) { ; } 169 | }; 170 | 171 | std::unique_ptr session; 172 | std::unique_ptr senseManager; 173 | std::unique_ptr capture; 174 | std::unique_ptr device; 175 | 176 | PXCCapture::DeviceInfo deviceInfo; 177 | pxcStatus status; // Status ID used by RSSDK functions 178 | 179 | // SDK Module handles 180 | 181 | std::unique_ptr p3DScan; 182 | std::unique_ptr pFace; 183 | std::unique_ptr p3DSeg; 184 | 185 | // Feature set constructed as the logical OR of RealSenseFeatures 186 | uint32 RealSenseFeatureSet; 187 | 188 | std::atomic_bool bCameraStreamingEnabled; 189 | std::atomic_bool bScan3DEnabled; 190 | std::atomic_bool bFaceEnabled; 191 | std::atomic_bool bSeg3DEnabled; 192 | 193 | // Camera processing members 194 | 195 | std::thread cameraThread; 196 | std::atomic_bool bCameraThreadRunning; 197 | 198 | std::unique_ptr fgFrame; 199 | std::unique_ptr midFrame; 200 | std::unique_ptr bgFrame; 201 | 202 | // Mutex for locking access to the midFrame 203 | std::mutex midFrameMutex; 204 | 205 | // Core SDK members 206 | 207 | FStreamResolution colorResolution; 208 | FStreamResolution depthResolution; 209 | 210 | float colorHorizontalFOV; 211 | float colorVerticalFOV; 212 | float depthHorizontalFOV; 213 | float depthVerticalFOV; 214 | 215 | // 3D Scan members 216 | 217 | FStreamResolution scan3DResolution; 218 | 219 | PXC3DScan::FileFormat scan3DFileFormat; 220 | FString scan3DFilename; 221 | 222 | std::atomic_bool bScanStarted; 223 | std::atomic_bool bScanStopped; 224 | std::atomic_bool bReconstructEnabled; 225 | std::atomic_bool bScanCompleted; 226 | std::atomic_bool bScan3DImageSizeChanged; 227 | 228 | // Face Module members 229 | 230 | PXCFaceConfiguration* faceConfig; 231 | PXCFaceData* faceData; 232 | 233 | // Helper Functions 234 | 235 | void UpdateScan3DImageSize(PXCImage::ImageInfo info); 236 | }; 237 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/RealSensePlugin.cpp: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | #include "RealSensePluginPrivatePCH.h" 17 | 18 | class FRealSensePlugin : public IRealSensePlugin 19 | { 20 | void StartupModule() override {} // This code will execute after the module is loaded into memory 21 | void ShutdownModule() override {} // This function may be called during shutdown or before reloading 22 | }; 23 | IMPLEMENT_MODULE(FRealSensePlugin, RealSensePlugin) -------------------------------------------------------------------------------- /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/RealSenseSessionManager.cpp: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | #include "RealSensePluginPrivatePCH.h" 17 | #include "RealSenseSessionManager.h" 18 | 19 | // Initialized the feature set to 0 (no features enabled) and creates a new 20 | // RealSenseImpl object. 21 | ARealSenseSessionManager::ARealSenseSessionManager(const class FObjectInitializer& Init) 22 | : Super(Init) 23 | { 24 | PrimaryActorTick.bCanEverTick = true; 25 | 26 | RealSenseFeatureSet = 0; 27 | 28 | impl = std::unique_ptr(new RealSenseImpl()); 29 | } 30 | 31 | void ARealSenseSessionManager::BeginPlay() 32 | { 33 | Super::BeginPlay(); 34 | } 35 | 36 | // Grab a new frame of RealSense data and process it based on the current 37 | // set of enabled features. 38 | void ARealSenseSessionManager::Tick(float DeltaTime) 39 | { 40 | Super::Tick(DeltaTime); 41 | 42 | if (impl->IsCameraThreadRunning() == false) { 43 | return; 44 | } 45 | 46 | // Grab the next frame of RealSense data 47 | impl->SwapFrames(); 48 | 49 | if (RealSenseFeatureSet & RealSenseFeature::CAMERA_STREAMING) { 50 | // Update the ColorBuffer 51 | const uint8 bytesPerPixel = 4; 52 | const uint32 ColorImageSize = impl->GetColorImageWidth() * impl->GetColorImageHeight() * bytesPerPixel; 53 | FMemory::Memcpy(ColorBuffer.GetData(), impl->GetColorBuffer(), ColorImageSize); 54 | 55 | // Update the DepthBuffer 56 | DepthBuffer.Empty(); 57 | const uint32 DepthImageSize = impl->GetDepthImageWidth() * impl->GetDepthImageHeight(); 58 | for (auto it = impl->GetDepthBuffer(), end = it + DepthImageSize; it != end; it++) { 59 | DepthBuffer.Add(*it); 60 | } 61 | } 62 | 63 | if (RealSenseFeatureSet & RealSenseFeature::SCAN_3D) { 64 | const uint8 bytesPerPixel = 4; 65 | const uint32 Scan3DImageSize = impl->GetScan3DImageWidth() * impl->GetScan3DImageHeight(); 66 | if (impl->HasScan3DImageSizeChanged()) { 67 | ScanBuffer.SetNumUninitialized(Scan3DImageSize); 68 | } 69 | 70 | // Update the ScanBuffer 71 | if (ScanBuffer.Num() == Scan3DImageSize) { 72 | FMemory::Memcpy(ScanBuffer.GetData(), impl->GetScanBuffer(), Scan3DImageSize * bytesPerPixel); 73 | } 74 | } 75 | } 76 | 77 | void ARealSenseSessionManager::EnableFeature(RealSenseFeature feature) 78 | { 79 | RealSenseFeatureSet |= feature; 80 | impl->EnableFeature(feature); 81 | } 82 | 83 | void ARealSenseSessionManager::DisableFeature(RealSenseFeature feature) 84 | { 85 | RealSenseFeatureSet &= ~feature; 86 | impl->DisableFeature(feature); 87 | } 88 | 89 | bool ARealSenseSessionManager::IsCameraConnected() const 90 | { 91 | return impl->IsCameraConnected(); 92 | } 93 | 94 | bool ARealSenseSessionManager::IsCameraRunning() const 95 | { 96 | return impl->IsCameraThreadRunning(); 97 | } 98 | 99 | void ARealSenseSessionManager::StartCamera() 100 | { 101 | impl->StartCamera(); 102 | } 103 | 104 | void ARealSenseSessionManager::StopCamera() 105 | { 106 | impl->StopCamera(); 107 | } 108 | 109 | int32 ARealSenseSessionManager::GetColorImageWidth() const 110 | { 111 | return impl->GetColorImageWidth(); 112 | } 113 | 114 | int32 ARealSenseSessionManager::GetColorImageHeight() const 115 | { 116 | return impl->GetColorImageHeight(); 117 | } 118 | 119 | int32 ARealSenseSessionManager::GetDepthImageWidth() const 120 | { 121 | return impl->GetDepthImageWidth(); 122 | } 123 | 124 | int32 ARealSenseSessionManager::GetDepthImageHeight() const 125 | { 126 | return impl->GetDepthImageHeight(); 127 | } 128 | 129 | int32 ARealSenseSessionManager::GetScan3DImageWidth() const 130 | { 131 | return impl->GetScan3DImageWidth(); 132 | } 133 | 134 | int32 ARealSenseSessionManager::GetScan3DImageHeight() const 135 | { 136 | return impl->GetScan3DImageHeight(); 137 | } 138 | 139 | float ARealSenseSessionManager::GetColorHorizontalFOV() const 140 | { 141 | return impl->GetColorHorizontalFOV(); 142 | } 143 | 144 | float ARealSenseSessionManager::GetColorVerticalFOV() const 145 | { 146 | return impl->GetColorVerticalFOV(); 147 | } 148 | 149 | float ARealSenseSessionManager::GetDepthHorizontalFOV() const 150 | { 151 | return impl->GetDepthHorizontalFOV(); 152 | } 153 | 154 | float ARealSenseSessionManager::GetDepthVerticalFOV() const 155 | { 156 | return impl->GetDepthVerticalFOV(); 157 | } 158 | 159 | ECameraModel ARealSenseSessionManager::GetCameraModel() const 160 | { 161 | return impl->GetCameraModel(); 162 | } 163 | 164 | FString ARealSenseSessionManager::GetCameraFirmware() const 165 | { 166 | return impl->GetCameraFirmware(); 167 | } 168 | 169 | // Sets the color camera resolution and resizes the ColorBuffer to match 170 | void ARealSenseSessionManager::SetColorCameraResolution(EColorResolution resolution) 171 | { 172 | impl->SetColorCameraResolution(resolution); 173 | ColorBuffer.SetNumUninitialized(impl->GetColorImageWidth() * impl->GetColorImageHeight()); 174 | } 175 | 176 | void ARealSenseSessionManager::SetDepthCameraResolution(EDepthResolution resolution) 177 | { 178 | impl->SetDepthCameraResolution(resolution); 179 | } 180 | 181 | FStreamResolution ARealSenseSessionManager::GetColorCameraResolution() const 182 | { 183 | return impl->GetColorCameraResolution(); 184 | } 185 | 186 | FStreamResolution ARealSenseSessionManager::GetDepthCameraResolution() const 187 | { 188 | return impl->GetDepthCameraResolution(); 189 | } 190 | 191 | bool ARealSenseSessionManager::IsStreamSetValid(EColorResolution ColorResolution, EDepthResolution DepthResolution) const 192 | { 193 | return impl->IsStreamSetValid(ColorResolution, DepthResolution); 194 | } 195 | 196 | TArray ARealSenseSessionManager::GetColorBuffer() const 197 | { 198 | return ColorBuffer; 199 | } 200 | 201 | TArray ARealSenseSessionManager::GetDepthBuffer() const 202 | { 203 | return DepthBuffer; 204 | } 205 | 206 | TArray ARealSenseSessionManager::GetScanBuffer() const 207 | { 208 | return ScanBuffer; 209 | } 210 | 211 | void ARealSenseSessionManager::ConfigureScanning(EScan3DMode ScanningMode, bool bSolidify, bool bTexture) 212 | { 213 | impl->ConfigureScanning(ScanningMode, bSolidify, bTexture); 214 | } 215 | 216 | void ARealSenseSessionManager::StartScanning() 217 | { 218 | impl->StartScanning(); 219 | } 220 | 221 | void ARealSenseSessionManager::StopScanning() 222 | { 223 | impl->StopScanning(); 224 | } 225 | 226 | void ARealSenseSessionManager::SaveScan(EScan3DFileFormat SaveFileFormat, FString Filename) 227 | { 228 | impl->SaveScan(SaveFileFormat, Filename); 229 | } 230 | 231 | void ARealSenseSessionManager::SetScanningVolume(FVector BoundingBox, int32 Resolution) 232 | { 233 | impl->SetScanningVolume(BoundingBox, Resolution); 234 | } 235 | 236 | bool ARealSenseSessionManager::IsScanning() const 237 | { 238 | return impl->IsScanning(); 239 | } 240 | 241 | bool ARealSenseSessionManager::HasScan3DImageSizeChanged() const 242 | { 243 | return impl->HasScan3DImageSizeChanged(); 244 | } 245 | 246 | bool ARealSenseSessionManager::HasScanCompleted() const 247 | { 248 | return impl->HasScanCompleted(); 249 | } 250 | 251 | int ARealSenseSessionManager::GetHeadCount() const 252 | { 253 | return impl->GetHeadCount(); 254 | } 255 | 256 | FVector ARealSenseSessionManager::GetHeadPosition() const 257 | { 258 | return impl->GetHeadPosition(); 259 | } 260 | 261 | FRotator ARealSenseSessionManager::GetHeadRotation() const 262 | { 263 | return impl->GetHeadRotation(); 264 | } -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/RealSenseUtils.cpp: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | #include "RealSensePluginPrivatePCH.h" 17 | #include "RealSenseUtils.h" 18 | 19 | DEFINE_LOG_CATEGORY(RealSensePlugin); 20 | 21 | // Shuffles the input Vector's coordinates around to convert it 22 | // to Unreal world space. 23 | FVector ConvertRSVectorToUnreal(FVector v) 24 | { 25 | return FVector(v.Z, v.X, -v.Y); 26 | } 27 | 28 | // Maps the depth value to a number between 0 - 255 so it can 29 | // be represented as an 8-bit color. 30 | uint8 ConvertDepthValueTo8Bit(int32 depth, int32 width) 31 | { 32 | // The F200 and R200 cameras support different maximum depths. 33 | float max_depth = 0.0f; 34 | if (width == 640) { 35 | max_depth = 1000.0f; // 1 meter 36 | } 37 | else { 38 | max_depth = 3000.0f; // 3 meters 39 | } 40 | 41 | // A depth value of 0 indicates no data available. 42 | // This value will be mapped to the color black. 43 | if ((depth == 0) || (depth > max_depth)) { 44 | return 0; 45 | } 46 | 47 | return (255 * ((max_depth - depth) / max_depth)); 48 | } 49 | 50 | PXCImage::PixelFormat GetPXCPixelFormat(ERealSensePixelFormat format) 51 | { 52 | switch (format) { 53 | case ERealSensePixelFormat::COLOR_RGB32: 54 | return PXCImage::PixelFormat::PIXEL_FORMAT_RGB32; 55 | case ERealSensePixelFormat::DEPTH_G16_MM: 56 | return PXCImage::PixelFormat::PIXEL_FORMAT_DEPTH; 57 | default: 58 | return PXCImage::PixelFormat::PIXEL_FORMAT_ANY; 59 | } 60 | } 61 | 62 | PXC3DScan::ScanningMode GetPXCScanningMode(EScan3DMode mode) 63 | { 64 | switch (mode) { 65 | case EScan3DMode::OBJECT: 66 | return PXC3DScan::ScanningMode::OBJECT_ON_PLANAR_SURFACE_DETECTION; 67 | case EScan3DMode::FACE: 68 | return PXC3DScan::ScanningMode::FACE; 69 | default: 70 | return PXC3DScan::ScanningMode::FACE; 71 | } 72 | } 73 | 74 | PXC3DScan::FileFormat GetPXCScanFileFormat(EScan3DFileFormat format) 75 | { 76 | switch (format) { 77 | case EScan3DFileFormat::OBJ: 78 | return PXC3DScan::FileFormat::OBJ; 79 | default: 80 | return PXC3DScan::FileFormat::OBJ; 81 | } 82 | } 83 | 84 | // Extracts the width, height, and fps values from each enumerated resolution. 85 | // Note: The only color pixel format currently supported is RGB32. 86 | FStreamResolution GetEColorResolutionValue(EColorResolution res) 87 | { 88 | FStreamResolution resolution = {}; 89 | switch (res) { 90 | case EColorResolution::RES1: 91 | return{ 1920, 1080, 30.0f, ERealSensePixelFormat::COLOR_RGB32 }; 92 | case EColorResolution::RES2: 93 | return{ 1280, 720, 30.0f, ERealSensePixelFormat::COLOR_RGB32 }; 94 | case EColorResolution::RES3: 95 | return{ 640, 480, 60.0f, ERealSensePixelFormat::COLOR_RGB32 }; 96 | case EColorResolution::RES4: 97 | return{ 640, 480, 30.0f, ERealSensePixelFormat::COLOR_RGB32 }; 98 | case EColorResolution::RES5: 99 | return{ 320, 240, 60.0f, ERealSensePixelFormat::COLOR_RGB32 }; 100 | case EColorResolution::RES6: 101 | return{ 320, 240, 30.0f, ERealSensePixelFormat::COLOR_RGB32 }; 102 | default: 103 | return{ 0, 0, 0.0f, ERealSensePixelFormat::PIXEL_FORMAT_ANY }; 104 | } 105 | } 106 | 107 | // Extracts the width, height, and fps values from each enumerated resolution. 108 | // Note: The only depth pixel format currently supported is 16-bit grayscale. 109 | FStreamResolution GetEDepthResolutionValue(EDepthResolution res) 110 | { 111 | FStreamResolution resolution = {}; 112 | switch (res) { 113 | case EDepthResolution::RES1: 114 | return{ 640, 480, 60.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 115 | case EDepthResolution::RES2: 116 | return{ 640, 480, 30.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 117 | case EDepthResolution::RES3: 118 | return{ 628, 468, 90.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 119 | case EDepthResolution::RES4: 120 | return{ 628, 468, 60.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 121 | case EDepthResolution::RES5: 122 | return{ 628, 468, 30.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 123 | case EDepthResolution::RES6: 124 | return{ 480, 360, 90.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 125 | case EDepthResolution::RES7: 126 | return{ 480, 360, 60.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 127 | case EDepthResolution::RES8: 128 | return{ 480, 360, 30.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 129 | case EDepthResolution::RES9: 130 | return{ 320, 240, 90.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 131 | case EDepthResolution::RES10: 132 | return{ 320, 240, 60.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 133 | case EDepthResolution::RES11: 134 | return{ 320, 240, 30.0f, ERealSensePixelFormat::DEPTH_G16_MM }; 135 | default: 136 | return{ 0, 0, 0.0f, ERealSensePixelFormat::PIXEL_FORMAT_ANY }; 137 | } 138 | } 139 | 140 | // Original function borrowed from RSSDK sp_glut_utils.h 141 | // Copies the data from the PXCImage into the input data buffer. 142 | void CopyColorImageToBuffer(PXCImage* image, TArray& data, const uint32 width, const uint32 height) 143 | { 144 | assert(image != nullptr); 145 | 146 | // Extracts the raw data from the PXCImage object. 147 | PXCImage::ImageData imageData; 148 | pxcStatus result = image->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::PIXEL_FORMAT_RGB24, &imageData); 149 | if (result != PXC_STATUS_NO_ERROR) { 150 | return; 151 | } 152 | 153 | uint32 i = 0; 154 | for (uint32 y = 0; y < height; ++y) { 155 | // color points to one row of color image data. 156 | const pxcBYTE* color = imageData.planes[0] + (imageData.pitches[0] * y); 157 | for (uint32 x = 0; x < width; ++x, color += 3) { 158 | data[i++] = color[0]; 159 | data[i++] = color[1]; 160 | data[i++] = color[2]; 161 | data[i++] = 0xff; // alpha = 255 162 | } 163 | } 164 | 165 | image->ReleaseAccess(&imageData); 166 | } 167 | 168 | // Original function borrowed from RSSDK sp_glut_utils.h 169 | // Copies the data from the PXCImage into the input data buffer. 170 | void CopySegmentedImageToBuffer(PXCImage* image, TArray& data, const uint32 width, const uint32 height) 171 | { 172 | assert(image != nullptr); 173 | 174 | // Extracts the raw data from the PXCImage object. 175 | PXCImage::ImageData imageData; 176 | pxcStatus result = image->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::PIXEL_FORMAT_RGB32, &imageData); 177 | if (result != PXC_STATUS_NO_ERROR) { 178 | return; 179 | } 180 | 181 | uint32 i = 0; 182 | const char GREY = 0x7f; 183 | for (uint32 y = 0; y < height; ++y) { 184 | // color points to one row of color image data. 185 | const pxcBYTE* color = imageData.planes[0] + (imageData.pitches[0] * y); 186 | for (uint32 x = 0; x < width; ++x, color += 4) { 187 | data[i++] = color[0]; 188 | data[i++] = color[1]; 189 | data[i++] = color[2]; 190 | data[i++] = color[3]; 191 | } 192 | } 193 | 194 | image->ReleaseAccess(&imageData); 195 | } 196 | 197 | // Original function borrowed from RSSDK sp_glut_utils.h 198 | // Copies the data from the PXCImage into the input data buffer. 199 | void CopyDepthImageToBuffer(PXCImage* image, TArray& data, const uint32 width, const uint32 height) 200 | { 201 | assert(image != nullptr); 202 | 203 | // Extracts the raw data from the PXCImage object. 204 | PXCImage::ImageData imageData; 205 | pxcStatus result = image->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::PIXEL_FORMAT_DEPTH, &imageData); 206 | if (result != PXC_STATUS_NO_ERROR) 207 | return; 208 | 209 | const uint32 numBytes = width * sizeof(uint16); 210 | 211 | uint32 i = 0; 212 | for (uint32 y = 0; y < height; ++y) { 213 | // depth points to one row of depth image data. 214 | const pxcBYTE* depth = imageData.planes[0] + (imageData.pitches[0] * y); 215 | for (uint32 x = 0; x < width; ++x, depth += 2) { 216 | data[i++] = *depth; 217 | } 218 | } 219 | 220 | image->ReleaseAccess(&imageData); 221 | } 222 | 223 | void LoadMeshFile(const FString& filename, TArray& Vertices, TArray& Triangles, TArray& Colors) 224 | { 225 | // TODO: Check if Reserving Lines ahead of time is faster 226 | TArray Lines; 227 | if (FFileHelper::LoadANSITextFileToStrings(filename.GetCharArray().GetData(), NULL, Lines) == false) 228 | return; 229 | 230 | Vertices.Empty(); 231 | Triangles.Empty(); 232 | Colors.Empty(); 233 | 234 | float x = 0.0f; 235 | float y = 0.0f; 236 | float z = 0.0f; 237 | float r = 0.0f; 238 | float g = 0.0f; 239 | float b = 0.0f; 240 | 241 | int v1 = 0; 242 | int v2 = 0; 243 | int v3 = 0; 244 | 245 | TArray Tokens; 246 | 247 | for (FString Line : Lines) { 248 | if (Line.IsEmpty()) { 249 | continue; 250 | } 251 | else if (Line[0] == 'v') { 252 | if (Line[1] == ' ') { 253 | Tokens.Empty(); 254 | Line.ParseIntoArrayWS(Tokens, L"", true); 255 | x = FCString::Atof(*(Tokens[1])); 256 | y = FCString::Atof(*(Tokens[2])); 257 | z = FCString::Atof(*(Tokens[3])); 258 | r = FCString::Atof(*(Tokens[4])); 259 | g = FCString::Atof(*(Tokens[5])); 260 | b = FCString::Atof(*(Tokens[6])); 261 | Vertices.Add(ConvertRSVectorToUnreal(FVector(x, y, z)) * 150); 262 | Colors.Add(FColor((uint8)(r * 255), (uint8)(g * 255), (uint8)(b * 255))); 263 | } 264 | } 265 | else if (Line[0] == 'f') { 266 | Tokens.Empty(); 267 | Line.ParseIntoArrayWS(Tokens, L"//", true); 268 | // Need to subtract 1 from the vertex indices because .OBJ files start indexing them at at 1, not 0 269 | v1 = FCString::Atoi(*(Tokens[1])); 270 | v2 = FCString::Atoi(*(Tokens[3])); 271 | v3 = FCString::Atoi(*(Tokens[5])); 272 | Triangles.Add(v1 - 1); 273 | Triangles.Add(v2 - 1); 274 | Triangles.Add(v3 - 1); 275 | } 276 | } 277 | 278 | FVector MeshCenter = FVector(0.0f, 0.0f, 0.0f); 279 | for (FVector Vert : Vertices) { 280 | MeshCenter += Vert; 281 | } 282 | 283 | MeshCenter /= Vertices.Num(); 284 | 285 | for (int i = 0; i < Vertices.Num(); i++) { 286 | Vertices[i] -= MeshCenter; 287 | } 288 | } 289 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Private/Scan3DComponent.cpp: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | #include "RealSensePluginPrivatePCH.h" 17 | #include "Scan3DComponent.h" 18 | 19 | UScan3DComponent::UScan3DComponent(const class FObjectInitializer& ObjInit) 20 | : Super(ObjInit) 21 | { 22 | bHasScanStarted = false; 23 | m_feature = RealSenseFeature::SCAN_3D; 24 | } 25 | 26 | // Adds the SCAN_3D feature to the RealSenseSessionManager and initializes the 27 | // ScanTexture object. 28 | void UScan3DComponent::InitializeComponent() 29 | { 30 | Super::InitializeComponent(); 31 | 32 | ScanTexture = UTexture2D::CreateTransient(1, 1, EPixelFormat::PF_B8G8R8A8); 33 | } 34 | 35 | // Copies the ScanBuffer and checks if a current scan has just completed. 36 | // If it has, the OnScanComplete event is broadcast. 37 | void UScan3DComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, 38 | FActorComponentTickFunction *ThisTickFunction) 39 | { 40 | if (globalRealSenseSession->IsCameraRunning() == false) { 41 | return; 42 | } 43 | 44 | // The 3D Scanning preview image size can be changed automatically by the 45 | // middleware, so it is important to check every tick if the image size 46 | // has changed so that the ScanTexture object can be resized to match. 47 | if (globalRealSenseSession->HasScan3DImageSizeChanged()) { 48 | int Scan3DImageWidth = globalRealSenseSession->GetScan3DImageWidth(); 49 | int Scan3DImageHeight = globalRealSenseSession->GetScan3DImageHeight(); 50 | ScanTexture = UTexture2D::CreateTransient(Scan3DImageWidth, Scan3DImageHeight, 51 | EPixelFormat::PF_B8G8R8A8); 52 | ScanTexture->UpdateResource(); 53 | } 54 | 55 | ScanBuffer = globalRealSenseSession->GetScanBuffer(); 56 | 57 | if (globalRealSenseSession->HasScanCompleted() && bHasScanStarted) { 58 | OnScanComplete.Broadcast(); 59 | bHasScanStarted = false; 60 | } 61 | } 62 | 63 | void UScan3DComponent::ConfigureScanning(EScan3DMode ScanningMode, bool bSolidify) 64 | { 65 | globalRealSenseSession->ConfigureScanning(ScanningMode, bSolidify, false); 66 | } 67 | 68 | void UScan3DComponent::StartScanning() 69 | { 70 | globalRealSenseSession->StartScanning(); 71 | bHasScanStarted = true; 72 | } 73 | 74 | void UScan3DComponent::StopScanning() 75 | { 76 | globalRealSenseSession->StopScanning(); 77 | } 78 | 79 | void UScan3DComponent::SaveScan(FString Filename) 80 | { 81 | Filename = FPaths::GameContentDir().Append(Filename); 82 | globalRealSenseSession->SaveScan(EScan3DFileFormat::OBJ, Filename); 83 | } 84 | 85 | void UScan3DComponent::LoadScan(FString Filename) 86 | { 87 | Filename = FPaths::GameContentDir().Append(Filename); 88 | LoadMeshFile(Filename, Vertices, Triangles, Colors); 89 | } 90 | 91 | bool UScan3DComponent::IsScanning() 92 | { 93 | return globalRealSenseSession->IsScanning(); 94 | } 95 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Public/CameraStreamComponent.h: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | #pragma once 17 | 18 | #include "RealSenseComponent.h" 19 | #include "CameraStreamComponent.generated.h" 20 | 21 | // This component provides access to a buffer of RGB camera data and 22 | // a buffer of depth camera data, as well as convenient Texture objects 23 | // for displaying this data. 24 | UCLASS(editinlinenew, meta = (BlueprintSpawnableComponent), ClassGroup = RealSense) 25 | class UCameraStreamComponent : public URealSenseComponent 26 | { 27 | GENERATED_UCLASS_BODY() 28 | 29 | // Array of RGBA color values representing a single frame of video captured 30 | // by the RealSense RGB camera at the resolution specified by calling 31 | // SetColorCameraResolution(). 32 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 33 | TArray ColorBuffer; 34 | 35 | // Array of depth values (in millimeters) stored as a single frame of video 36 | // captured by the RealSense depth camera at the resolution specified by 37 | // calling SetDepthCameraResolution(). 38 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 39 | TArray DepthBuffer; 40 | 41 | // Texture2D object used to easily visualize the ColorBuffer. 42 | // This texture is initialized upon setting the color camera resolution, and 43 | // should be set by calling ColorBufferToTexture(). 44 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 45 | UTexture2D* ColorTexture; 46 | 47 | // Texture2D object used to easily visualize the DepthBuffer. 48 | // This texture is initialized upon setting the color camera resolution, and 49 | // should be set by calling DepthBufferToTexture(). 50 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 51 | UTexture2D* DepthTexture; 52 | 53 | // Sets the resolution that the RealSense RGB camera should use. 54 | // This function must be called before StartCamera() in order to 55 | // enable the RGB camera. 56 | UFUNCTION(BlueprintCallable, Category = "RealSense") 57 | virtual void SetColorCameraResolution(EColorResolution Resolution) override; 58 | 59 | // Sets the resolution that the RealSense depth camera should use. 60 | // This function must be called before StartCamera() in order to 61 | // enable the depth camera. 62 | UFUNCTION(BlueprintCallable, Category = "RealSense") 63 | virtual void SetDepthCameraResolution(EDepthResolution Resolution) override; 64 | 65 | // Enable 3D segmentation 66 | // This function must be called before StartCamera() in order to 67 | // enable 3D segmentation. 68 | UFUNCTION(BlueprintCallable, Category = "RealSense") 69 | virtual void Enable3DSegmentation(bool b3DSeg); 70 | 71 | UCameraStreamComponent(); 72 | 73 | void InitializeComponent() override; 74 | 75 | void TickComponent(float DeltaTime, enum ELevelTick TickType, 76 | FActorComponentTickFunction *ThisTickFunction) override; 77 | }; 78 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Public/HeadTrackingComponent.h: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | #pragma once 17 | 18 | #include "RealSenseComponent.h" 19 | #include "HeadTrackingComponent.generated.h" 20 | 21 | UCLASS(editinlinenew, meta = (BlueprintSpawnableComponent), ClassGroup = RealSense) 22 | class UHeadTrackingComponent : public URealSenseComponent 23 | { 24 | GENERATED_UCLASS_BODY() 25 | 26 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 27 | int32 HeadCount; 28 | 29 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 30 | FVector HeadPosition; 31 | 32 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 33 | FRotator HeadRotation; 34 | 35 | UHeadTrackingComponent(); 36 | 37 | void InitializeComponent() override; 38 | 39 | void TickComponent(float DeltaTime, enum ELevelTick TickType, 40 | FActorComponentTickFunction *ThisTickFunction) override; 41 | 42 | private: 43 | }; 44 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Public/IRealSensePlugin.h: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | #pragma once 17 | 18 | #include "ModuleManager.h" 19 | 20 | struct IRealSensePlugin : public IModuleInterface 21 | { 22 | static inline IRealSensePlugin& Get() { return FModuleManager::LoadModuleChecked("RealSensePlugin"); } 23 | static inline bool IsAvailable() { return FModuleManager::Get().IsModuleLoaded("RealSensePlugin"); } 24 | }; 25 | 26 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Public/RealSenseBlueprintLibrary.h: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | #pragma once 17 | 18 | #include "RealSenseTypes.h" 19 | #include "RealSenseUtils.h" 20 | #include "RealSenseBlueprintLibrary.generated.h" 21 | 22 | UCLASS() 23 | class URealSenseBlueprintLibrary : public UBlueprintFunctionLibrary 24 | { 25 | GENERATED_UCLASS_BODY() 26 | 27 | // Returns a string representation of the input ColorResolution 28 | UFUNCTION(BlueprintCallable, BlueprintPure, Category = "RealSense Utilities") 29 | static FString EColorResolutionToString(EColorResolution value); 30 | 31 | // Returns a string representation of the input DepthResolution 32 | UFUNCTION(BlueprintCallable, BlueprintPure, Category = "RealSense Utilities") 33 | static FString EDepthResolutionToString(EDepthResolution value); 34 | 35 | // Returns a string representation of the input CameraModel 36 | UFUNCTION(BlueprintCallable, BlueprintPure, Category = "RealSense Utilities") 37 | static FString ECameraModelToString(ECameraModel value); 38 | 39 | // Fills a Texture2D object with the data from a buffer of FSimpleColors. 40 | // This function will return null if the size of the input buffer does not 41 | // match the resolution of the Texture2D object. 42 | // @param Buffer - TArray of FSimpleColor values (RGBA) 43 | // @param Texture - Texture2D object to fill with data 44 | // @return The input Texture2D object, modified to contain the data from the 45 | // input buffer 46 | UFUNCTION(BlueprintCallable, Category = "RealSense Utilities") 47 | static UTexture2D* ColorBufferToTexture(const TArray& Buffer, 48 | UTexture2D* Texture); 49 | 50 | // Fills a Texture2D object with the data from a buffer of integers 51 | // (representing depth values). 52 | // This function will return null if the size of the input buffer does not 53 | // match the resolution of the Texture2D object. 54 | // @param Buffer - TArray of integer values (depth in millimeters) 55 | // @param Texture - Texture2D object to fill with data 56 | // @return The input Texture2D object, modified to contain the data from the 57 | // input buffer 58 | UFUNCTION(BlueprintCallable, Category = "RealSense Utilities") 59 | static UTexture2D* DepthBufferToTexture(const TArray& Buffer, 60 | UTexture2D* Texture); 61 | 62 | // Returns an array of .OBJ filenames found in the specified directory. 63 | // Note: The path is relative to the /Game/Content asset directory. 64 | // Example: GetMeshFiles("Scans/Faces") searches for .OBJ files in 65 | // /Games/Content/Scans/Faces. 66 | UFUNCTION(BlueprintCallable, Category = "RealSense Utilities") 67 | static TArray GetMeshFiles(FString Directory); 68 | }; -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Public/RealSenseComponent.h: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | #pragma once 17 | 18 | #include "RealSenseSessionManager.h" 19 | #include "RealSenseTypes.h" 20 | #include "RealSenseComponent.generated.h" 21 | 22 | // Base Class for all RealSense Components 23 | // This class maintains basic camera information and common functions 24 | // that all RealSense components need, such as StartCamera and 25 | // StopCamera and setting the color and depth resolutions. 26 | UCLASS() 27 | class URealSenseComponent : public UActorComponent 28 | { 29 | GENERATED_UCLASS_BODY() 30 | 31 | // Horizontal Field of View of the RealSense RGB Camera 32 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 33 | float ColorHorizontalFOV; 34 | 35 | // Vertical Field of View of the RealSense RGB Camera 36 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 37 | float ColorVerticalFOV; 38 | 39 | // Horizontal Field of View of the RealSense Depth Camera 40 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 41 | float DepthHorizontalFOV; 42 | 43 | // Vertical Field of View of the RealSense Depth Camera 44 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 45 | float DepthVerticalFOV; 46 | 47 | // Model of the connected RealSense device (F200 or R200) 48 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 49 | ECameraModel CameraModel; 50 | 51 | // Firmware version of the connected RealSense device 52 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 53 | FString CameraFirmware; 54 | 55 | // This function initiates a RealSense camera processing thread that collects 56 | // camera data, such as raw color and depth images and middleware-specific 57 | // constructs. You should call this function after setting the color and/or depth 58 | // camera resolutions. 59 | UFUNCTION(BlueprintCallable, Category = "RealSense") 60 | void StartCamera(); 61 | 62 | // This function terminates the RealSense camera processing thread. Once terminated, 63 | // RealSense data will no longer be updated until after another call to 64 | // StartCamera(). 65 | UFUNCTION(BlueprintCallable, Category = "RealSense") 66 | void StopCamera(); 67 | 68 | // Enabling this feature will instruct the camera processing thread to start / 69 | // resume processing of this feature. 70 | UFUNCTION(BlueprintCallable, Category = "RealSense") 71 | void EnableFeature(); 72 | 73 | // Disabling this feature will instruct the camera processing thread to pause 74 | // processing of this feature. 75 | UFUNCTION(BlueprintCallable, Category = "RealSense") 76 | void DisableFeature(); 77 | 78 | // Returns true if the RealSense camera processing thread is currently running. 79 | UFUNCTION(BlueprintCallable, BlueprintPure, Category = "RealSense") 80 | bool IsCameraRunning(); 81 | 82 | // Returns the color camera resolution as an FStreamResolution object: 83 | // width, height, fps, and pixel format. 84 | UFUNCTION(BlueprintCallable, BlueprintPure, Category = "RealSense") 85 | FStreamResolution GetColorCameraResolution(); 86 | 87 | // Sets the color camera resolution from an enumerated set of resolution options. 88 | UFUNCTION(BlueprintCallable, Category = "RealSense") 89 | virtual void SetColorCameraResolution(EColorResolution resolution); 90 | 91 | // Returns the depth camera resolution as an FStreamResolution object: 92 | // width, height, fps, and pixel format. 93 | UFUNCTION(BlueprintCallable, BlueprintPure, Category = "RealSense") 94 | FStreamResolution GetDepthCameraResolution(); 95 | 96 | // Sets the depth camera resolution from an enumerated set of resolution options. 97 | UFUNCTION(BlueprintCallable, Category = "RealSense") 98 | virtual void SetDepthCameraResolution(EDepthResolution resolution); 99 | 100 | // Returns true if the combination of color and depth camera resolutions can be 101 | // used together. Call this function before setting either the color and depth 102 | // camera resolutions to ensure that there will be no errors initializing the 103 | // RealSense camera processing thread. 104 | UFUNCTION(BlueprintCallable, Category = "RealSense") 105 | bool IsStreamSetValid(EColorResolution ColorResolution, 106 | EDepthResolution DepthResolution); 107 | 108 | URealSenseComponent(); 109 | 110 | void InitializeComponent() override; 111 | 112 | void BeginPlay() override; 113 | 114 | protected: 115 | // Reference to the global RealSenseSessionmanager actor 116 | ARealSenseSessionManager* globalRealSenseSession; 117 | 118 | RealSenseFeature m_feature; 119 | }; 120 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Public/RealSenseSessionManager.h: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | #pragma once 17 | 18 | #include "RealSenseImpl.h" 19 | #include "RealSenseTypes.h" 20 | 21 | #include "RealSenseSessionManager.generated.h" 22 | 23 | DECLARE_DYNAMIC_MULTICAST_DELEGATE(FRealSenseNullaryDelegate); 24 | 25 | UCLASS(ClassGroup = RealSense) 26 | class ARealSenseSessionManager : public AActor 27 | { 28 | GENERATED_UCLASS_BODY() 29 | 30 | // Enables the provided feature 31 | void EnableFeature(RealSenseFeature feature); 32 | 33 | // Disables the provided feature 34 | void DisableFeature(RealSenseFeature feature); 35 | 36 | // RealSenseComponent Support 37 | 38 | // Starts the camera processing thread. 39 | void StartCamera(); 40 | 41 | // Stops the camera processing thread. 42 | void StopCamera(); 43 | 44 | // Returns true if the camera processing thread is currently executing. 45 | bool IsCameraRunning() const; 46 | 47 | // Returns true if there is a physical camera connected. 48 | bool IsCameraConnected() const; 49 | 50 | // Returns the horizontal field of view of the RealSense RGB camera. 51 | float GetColorHorizontalFOV() const; 52 | 53 | // Returns the vertical field of view of the RealSense RGB camera. 54 | float GetColorVerticalFOV() const; 55 | 56 | // Returns the horizontal field of view of the RealSense depth camera. 57 | float GetDepthHorizontalFOV() const; 58 | 59 | // Returns the vertical field of view of the RealSense depth camera. 60 | float GetDepthVerticalFOV() const; 61 | 62 | // Returns the model of the connected camera: R200, F200, or Other. 63 | ECameraModel GetCameraModel() const; 64 | 65 | // Returns the connected camera's firmware version as a human readable string. 66 | FString GetCameraFirmware() const; 67 | 68 | // Returns the user-defined resolution of the RealSense RGB camera. 69 | FStreamResolution GetColorCameraResolution() const; 70 | 71 | // Returns the width of the user-defined resolution of the RealSense RGB camera. 72 | int32 GetColorImageWidth() const; 73 | 74 | // Returns the height of the user-defined resolution of the RealSense RGB camera. 75 | int32 GetColorImageHeight() const; 76 | 77 | // Set the resolution to be used by the RealSense RGB camera. 78 | void SetColorCameraResolution(EColorResolution resolution); 79 | 80 | // Returns the user-defined resolution of the RealSense depth camera. 81 | FStreamResolution GetDepthCameraResolution() const; 82 | 83 | // Returns the width of the user-defined resolution of the RealSense depth camera. 84 | int32 GetDepthImageWidth() const; 85 | 86 | // Returns the height of the user-defined resolution of the RealSense depth camera. 87 | int32 GetDepthImageHeight() const; 88 | 89 | // Set the resolution to be used by the RealSense depth camera. 90 | void SetDepthCameraResolution(EDepthResolution resolution); 91 | 92 | // Returns true if the combination of RGB camera resolution and depth camera 93 | // resolution is valid. Validity is determined internally by the RSSDK. 94 | bool IsStreamSetValid(EColorResolution ColorResolution, EDepthResolution DepthResolution) const; 95 | 96 | // CameraStreamComponent Support 97 | 98 | // Returns a pointer to the latest frame obtained from the RealSense RGB camera. 99 | TArray GetColorBuffer() const; 100 | 101 | // Returns a pointer to the latest frame obtained from the RealSense depth camera. 102 | TArray GetDepthBuffer() const; 103 | 104 | // Scan3DComponent Support 105 | 106 | // Configures the 3D Scanning middleware. 107 | // 108 | // Scanning Modes : Face, Head, Body, Object, Variable 109 | // If you use Variable scanning mode, you must also set the scanning volume 110 | // to reflect the 3D space you wish to scan. 111 | // 112 | // If solidify is true, the mesh created by the middleware will be closed. 113 | // 114 | // If texture is true, the middleware will create a texture file along with 115 | // the mesh. If false, the mesh file will be include vertex color information. 116 | void ConfigureScanning(EScan3DMode ScanningMode, bool bSolidify, bool bTexture); 117 | 118 | // Only use this function if 3D Scanning is set to Variable mode. 119 | // Sets the bounding box of the 3D space in which you wish to scan 120 | // and the voxel resolution to use. 121 | void SetScanningVolume(FVector BoundingBox, int32 Resolution); 122 | 123 | // Instructs the 3D Scanning module to begin its attempt to scan. 124 | // Scanning will not actually begin until internal pre-requisites of the 125 | // scanning module are satisfied, such as the presence of a minimum 126 | // amount of geometry. 127 | void StartScanning(); 128 | 129 | // Instructs the 3D Scanning module to stop scanning. 130 | void StopScanning(); 131 | 132 | // Saves the scanned data to a file with the specified format and filename. 133 | // Currently only the OBJ format is supported. 134 | void SaveScan(EScan3DFileFormat SaveFileFormat, FString filename); 135 | 136 | // Returns true if the 3D scanning module is currently scanning. 137 | bool IsScanning() const; 138 | 139 | // Returns the middleware-defined resolution used by the 3D scanning module. 140 | FStreamResolution GetScan3DResolution() const; 141 | 142 | // Returns the width of the middleware-defined resolution used by the 143 | // 3D scanning module. 144 | int32 GetScan3DImageWidth() const; 145 | 146 | // Returns the height of the middleware-defined resolution used by the 147 | // 3D scanning module. 148 | int32 GetScan3DImageHeight() const; 149 | 150 | // Returns a pointer to the latest frame obtained from the 3D scanning 151 | // module, representing a preview of the current scanning progress. 152 | TArray GetScanBuffer() const; 153 | 154 | // Returns true if the resolution of the 3D scanning module has changed. 155 | bool HasScan3DImageSizeChanged() const; 156 | 157 | // Returns true when the 3D scanning module finishes saving a scan. 158 | bool HasScanCompleted() const; 159 | 160 | // HeadTrackingComponent Support 161 | 162 | // Return the current head count 163 | int GetHeadCount() const; 164 | 165 | // Return the current head position 166 | FVector GetHeadPosition() const; 167 | 168 | // Return the current head rotation 169 | FRotator GetHeadRotation() const; 170 | 171 | ARealSenseSessionManager(); 172 | 173 | virtual void BeginPlay() override; 174 | 175 | virtual void Tick(float DeltaSeconds) override; 176 | 177 | private: 178 | std::unique_ptr impl; 179 | 180 | uint8 RealSenseFeatureSet; 181 | 182 | TArray ColorBuffer; 183 | TArray DepthBuffer; 184 | TArray ScanBuffer; 185 | }; 186 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Public/RealSenseTypes.h: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | #pragma once 17 | 18 | #include "RealSenseTypes.generated.h" 19 | 20 | // List of features provided by the RealSense SDK 21 | enum RealSenseFeature : uint8 { 22 | CAMERA_STREAMING = 0x1, 23 | SCAN_3D = 0x2, 24 | HEAD_TRACKING = 0x4, 25 | SEGMENTATION_3D = 0x8, 26 | }; 27 | 28 | // Resolutions supported by the RealSense RGB camera 29 | UENUM(BlueprintType) 30 | enum class EColorResolution : uint8 { 31 | UNDEFINED = 0 UMETA(DisplayName = " "), 32 | RES1 = 1 UMETA(DisplayName = "1920 x 1080 x 30"), 33 | RES2 = 2 UMETA(DisplayName = "1280 x 720 x 30"), 34 | RES3 = 3 UMETA(DisplayName = "640 x 480 x 60"), 35 | RES4 = 4 UMETA(DisplayName = "640 x 480 x 30"), 36 | RES5 = 5 UMETA(DisplayName = "320 x 240 x 60"), 37 | RES6 = 6 UMETA(DisplayName = "320 x 240 x 30"), 38 | }; 39 | 40 | // Resolutions supported by the RealSense depth camera 41 | // (F200) denotes that this resolution is only supported by the F200 camera. 42 | // (R200) denotes that this resolution is only supported by the R200 camera. 43 | UENUM(BlueprintType) 44 | enum class EDepthResolution : uint8 { 45 | UNDEFINED = 0 UMETA(DisplayName = " "), 46 | RES1 = 1 UMETA(DisplayName = "640 x 480 x 60 (F200)"), 47 | RES2 = 2 UMETA(DisplayName = "640 x 480 x 30 (F200)"), 48 | RES3 = 3 UMETA(DisplayName = "628 x 468 x 90 (R200)"), 49 | RES4 = 4 UMETA(DisplayName = "628 x 468 x 60 (R200)"), 50 | RES5 = 5 UMETA(DisplayName = "628 x 468 x 30 (R200)"), 51 | RES6 = 6 UMETA(DisplayName = "480 x 360 x 90 (R200)"), 52 | RES7 = 7 UMETA(DisplayName = "480 x 360 x 60 (R200)"), 53 | RES8 = 8 UMETA(DisplayName = "480 x 360 x 30 (R200)"), 54 | RES9 = 9 UMETA(DisplayName = "320 x 240 x 90 (R200)"), 55 | RES10 = 10 UMETA(DisplayName = "320 x 240 x 60 (R200)"), 56 | RES11 = 11 UMETA(DisplayName = "320 x 240 x 30 (R200)"), 57 | }; 58 | 59 | // RSSDK Pixel Format exposed to Blueprint (see pxcimage.h) 60 | UENUM(BlueprintType) 61 | enum class ERealSensePixelFormat : uint8 { 62 | PIXEL_FORMAT_ANY = 0, // Unknown/undefined 63 | COLOR_RGB32, // BGRA layout 64 | DEPTH_G16_MM, // 16-bit unsigned integer with precision mm. 65 | }; 66 | 67 | // Supported RealSense camera models 68 | UENUM(BlueprintType) 69 | enum class ECameraModel : uint8 { 70 | None = 0 UMETA(DisplayName = " "), 71 | F200 = 1 UMETA(DisplayName = "Front-Facing (F200)"), 72 | SR300 = 2 UMETA(DisplayName = "Short-Range (SR300)"), 73 | R200 = 3 UMETA(DisplayName = "World-Facing (R200)"), 74 | Other = 4 UMETA(DisplayName = "Unknown Camera Model") 75 | }; 76 | 77 | // Supported modes for the 3D Scanning middleware 78 | UENUM(BlueprintType) 79 | enum class EScan3DMode : uint8 { 80 | OBJECT = 0 UMETA(DisplayName = "Object"), 81 | FACE = 1 UMETA(DisplayName = "Face") 82 | }; 83 | 84 | // File types supported by the 3D Scanning middleware for saving scans 85 | UENUM(BlueprintType) 86 | enum class EScan3DFileFormat : uint8 { 87 | OBJ = 0 UMETA(DisplayName = "OBJ") 88 | }; 89 | 90 | // Basic 32-bit color structure (RGBA) 91 | USTRUCT(BlueprintType) 92 | struct FSimpleColor 93 | { 94 | GENERATED_USTRUCT_BODY() 95 | 96 | UPROPERTY(EditAnywhere, BlueprintReadWrite) 97 | uint8 R; 98 | UPROPERTY(EditAnywhere, BlueprintReadWrite) 99 | uint8 G; 100 | UPROPERTY(EditAnywhere, BlueprintReadWrite) 101 | uint8 B; 102 | UPROPERTY(EditAnywhere, BlueprintReadWrite) 103 | uint8 A; 104 | }; 105 | 106 | // Resolution of a RealSense camera stream 107 | USTRUCT(BlueprintType) 108 | struct FStreamResolution 109 | { 110 | GENERATED_USTRUCT_BODY() 111 | 112 | UPROPERTY(EditAnywhere, BlueprintReadWrite) 113 | int32 width; 114 | UPROPERTY(EditAnywhere, BlueprintReadWrite) 115 | int32 height; 116 | UPROPERTY(EditAnywhere, BlueprintReadWrite) 117 | float fps; 118 | UPROPERTY(EditAnywhere, BlueprintReadWrite) 119 | ERealSensePixelFormat format; 120 | }; 121 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Public/RealSenseUtils.h: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | #pragma once 17 | 18 | #include "RealSenseTypes.h" 19 | #include "pxc3dscan.h" 20 | #include 21 | 22 | // Log Category that can be used by all RealSensePlugin source files that inclue this file 23 | DECLARE_LOG_CATEGORY_EXTERN(RealSensePlugin, Log, All); 24 | 25 | #if defined ( WIN32 ) 26 | #define __func__ __FUNCTION__ 27 | #endif 28 | 29 | // Modified macro from tutorial by Spoof and Kris: https://wiki.unrealengine.com/Log_Macro_with_Netmode_and_Colour 30 | #define RS_LOG(Verbosity, Format, ...) \ 31 | { \ 32 | const FString Msg = FString::Printf(TEXT(Format), ##__VA_ARGS__); \ 33 | UE_LOG(RealSensePlugin, Verbosity, TEXT("%s() : %s"), TEXT(__func__), *Msg); \ 34 | } 35 | 36 | // Helper log macro for logging pxcStatus codes 37 | #define RS_LOG_STATUS(Status, Format, ...) \ 38 | { \ 39 | const FString Msg = FString::Printf(TEXT(Format), ##__VA_ARGS__); \ 40 | const int Stat = static_cast(Status); \ 41 | if (Stat < 0) \ 42 | UE_LOG(RealSensePlugin, Error, TEXT("%s() : %s : %d"), TEXT(__func__), *Msg, Stat) \ 43 | else if (Stat == 0) \ 44 | UE_LOG(RealSensePlugin, Log, TEXT("%s() : %s : %d"), TEXT(__func__), *Msg, Stat) \ 45 | else if (Stat > 0) \ 46 | UE_LOG(RealSensePlugin, Warning, TEXT("%s() : %s : %d"), TEXT(__func__), *Msg, Stat) \ 47 | } 48 | 49 | // Converts a Vector from RealSense camera space to UE4 world space. 50 | FVector ConvertRSVectorToUnreal(FVector v); 51 | 52 | // Converts a depth value (in millimeters) to an 8-bit scale (between 0 - 255). 53 | uint8 ConvertDepthValueTo8Bit(int32 depth, int32 width); 54 | 55 | // Returns a StreamResolution structure containing the values from the enumerated ColorResolution 56 | FStreamResolution GetEColorResolutionValue(EColorResolution res); 57 | 58 | // Returns a StreamResolution structure containing the values from the enumerated DepthResolution 59 | FStreamResolution GetEDepthResolutionValue(EDepthResolution res); 60 | 61 | // Converts a Blueprint-exposed RealSensePixelFormat to a PXCImage::PixelFormat 62 | PXCImage::PixelFormat GetPXCPixelFormat(ERealSensePixelFormat format); 63 | 64 | // Converts a Blueprint-exposed RealSensePixelFormat to a PXCImage::PixelFormat 65 | PXC3DScan::ScanningMode GetPXCScanningMode(EScan3DMode mode); 66 | 67 | // Converts a Blueprint-exposed RealSensePixelFormat to a PXCImage::PixelFormat 68 | PXC3DScan::FileFormat GetPXCScanFileFormat(EScan3DFileFormat format); 69 | 70 | // Copies the data from the input color PXCImage into the input data structure. 71 | void CopyColorImageToBuffer(PXCImage* image, TArray& data, const uint32 width, const uint32 height); 72 | 73 | // Copies the data from the input color PXCImage into the input data structure. 74 | void CopySegmentedImageToBuffer(PXCImage* image, TArray& data, const uint32 width, const uint32 height); 75 | 76 | // Copies the data from the input depth PXCImage into the input data structure. 77 | void CopyDepthImageToBuffer(PXCImage* image, TArray& data, const uint32 width, const uint32 height); 78 | 79 | void LoadMeshFile(const FString& filename, TArray& Vertices, TArray& Triangles, TArray& Colors); 80 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/Public/Scan3DComponent.h: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | #pragma once 17 | 18 | #include "RealSenseComponent.h" 19 | #include "Scan3DComponent.generated.h" 20 | 21 | UCLASS(editinlinenew, meta = (BlueprintSpawnableComponent), ClassGroup = RealSense) 22 | class UScan3DComponent : public URealSenseComponent 23 | { 24 | GENERATED_UCLASS_BODY() 25 | 26 | // Array of RGBA color values representing a preview image displaying the 27 | // current progress of scanning. This buffer will be empty until scanning 28 | // has started. 29 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 30 | TArray ScanBuffer; 31 | 32 | // Convenient Texture2D object used to easily visualize the ScanBuffer. 33 | // This texture can be set by calling ColorBufferToTexture(). 34 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 35 | UTexture2D* ScanTexture; 36 | 37 | // Array of mesh vertices. This array is populated by the LoadScan() function. 38 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 39 | TArray Vertices; 40 | 41 | // Array of mesh triangles. This array is populated by the LoadScan() function. 42 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 43 | TArray Triangles; 44 | 45 | // Array of mesh vertex colors. This array is populated by the LoadScan() function. 46 | UPROPERTY(BlueprintReadOnly, Category = "RealSense") 47 | TArray Colors; 48 | 49 | // Triggered after a scan has been saved to disk. A call to SaveScan() will 50 | // asynchronously save the scan. You can use this event to be notified when the 51 | // scan has finished saving. 52 | UPROPERTY(BlueprintAssignable, Category = "RealSense") 53 | FRealSenseNullaryDelegate OnScanComplete; 54 | 55 | // Sets the scanning mode and options for 3D Scanning. After calling this function, 56 | // the scanning preview image will be available in the ScanBuffer. 57 | UFUNCTION(BlueprintCallable, Category = "RealSense") 58 | void ConfigureScanning(EScan3DMode ScanningMode, bool bSolidify); 59 | 60 | // Allows the scanning process to begin. Scanning will not actually begin until 61 | // the pre-requisites for the specified scanning mode have been met. 62 | UFUNCTION(BlueprintCallable, Category = "RealSense") 63 | void StartScanning(); 64 | 65 | // Stops the scanning process. 66 | UFUNCTION(BlueprintCallable, Category = "RealSense") 67 | void StopScanning(); 68 | 69 | // Stops the scanning process and asynchronously saves the scanned data to a mesh 70 | // file with the specified file format and file name. 71 | UFUNCTION(BlueprintCallable, Category = "RealSense") 72 | void SaveScan(FString Filename); 73 | 74 | // Opens the specified .OBJ file and loads the mesh information into this 75 | // component's Vertices, Triangles, and Colors arrays. 76 | UFUNCTION(BlueprintCallable, Category = "RealSense") 77 | void LoadScan(FString Filename); 78 | 79 | // Returns true if the scanning is currently happening. Use this function after 80 | // calling StartScanning() to know when the scanning process has begun. 81 | UFUNCTION(BlueprintCallable, BlueprintPure, Category = "RealSense") 82 | bool IsScanning(); 83 | 84 | UScan3DComponent(); 85 | 86 | void InitializeComponent() override; 87 | 88 | void TickComponent(float DeltaTime, enum ELevelTick TickType, 89 | FActorComponentTickFunction *ThisTickFunction) override; 90 | 91 | private: 92 | // Used internally to know when to listen for ScanComplete events. 93 | bool bHasScanStarted{ false }; 94 | }; 95 | -------------------------------------------------------------------------------- /Plugins/RealSensePlugin/Source/RealSensePlugin/RealSensePlugin.Build.cs: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | using System; 17 | using System.IO; 18 | 19 | namespace UnrealBuildTool.Rules 20 | { 21 | public class RealSensePlugin : ModuleRules 22 | { 23 | public RealSensePlugin(TargetInfo Target) 24 | { 25 | // https://answers.unrealengine.com/questions/51798/how-can-i-enable-unwind-semantics-for-c-style-exce.html 26 | UEBuildConfiguration.bForceEnableExceptions = true; 27 | 28 | PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine" }); 29 | PrivateDependencyModuleNames.AddRange(new string[] { "RHI", "RenderCore", "ShaderCore" }); 30 | 31 | PrivateIncludePaths.AddRange(new string[] { "RealSensePlugin/Private" }); 32 | 33 | string RealSenseDirectory = Environment.GetEnvironmentVariable("RSSDK_DIR"); 34 | string RealSenseIncludeDirectory = RealSenseDirectory + "include"; 35 | string RealSenseLibrary32Directory = RealSenseDirectory + "lib\\Win32\\libpxc.lib"; 36 | string RealSenseLibrary64Directory = RealSenseDirectory + "lib\\x64\\libpxc.lib"; 37 | 38 | PublicIncludePaths.Add(RealSenseIncludeDirectory); 39 | PublicAdditionalLibraries.Add(RealSenseLibrary32Directory); 40 | PublicAdditionalLibraries.Add(RealSenseLibrary64Directory); 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### RealSense Plugin for Unreal Engine 4 2 | 3 | #### Overview 4 | The RealSense Plugin provides support for the Intel RealSense SDK to Unreal Engine 4 developers by exposing features of the SDK to the Blueprints Visual Scripting System. 5 | 6 | The plugin is architected as a set of components, each of which encapsulates a specific set of features. Is also makes use of an actor known as the RealSense Session Manager, which manages access to the RealSense SDK functions and maintains the master copy of all RealSense data. It is instantiated automatically when the first RealSense component is created and it allows for the use of multiple instances of the same RealSense component class, easing the process of sharing data between objects. 7 | 8 | RealSense processing takes place on its own dedicated thread. On every tick of the game thread, the RealSense Session Manager polls for new RealSense data, and updates the RealSense components accordingly. This separation helps keep the game thread running quickly even when the RealSense thread is doing some heavy lifting. 9 | 10 | - - - 11 | 12 | For more details, you can read this [article](https://software.intel.com/en-us/articles/intel-realsense-sdk-plug-in-for-unreal-engine-4). 13 | 14 | You can also check out these tutorial videos to get started using the RealSense plugin: 15 | 16 | https://youtu.be/mrIiBssoI0w 17 | 18 | https://youtu.be/WMqG3UZkBTE 19 | 20 | - - - 21 | 22 | #### Available Cameras 23 | * SR300 Short-Range RealSense Camera 24 | * F200 Front-Facing RealSense Camera 25 | * R200 World-Facing RealSense Camera 26 | 27 | #### Other Hardware Requirements 28 | * 4th Generation Intel CPU or higher 29 | 30 | #### Software Requirements 31 | * [Intel(R) RealSense(TM) SDK 2016 R1](https://software.intel.com/en-us/intel-realsense-sdk/download) 32 | * The correct DCM for your camera (found also at the previous link) 33 | * Unreal Engine 4.8 or higher 34 | * SR300 - Windows 10 only 35 | * F200 / R200 - Windows 8.1 or 10 36 | 37 | #### Featured Components 38 | * Camera Streams - Provides access to raw color and depth image buffers 39 | * Scan 3D - Supports the scanning of faces and objects into 3D models 40 | 41 | #### In-Progress Components 42 | * Head Tracking - Provides data for the user's head position and rotation 43 | * Scene Perception - Supports the scanning of small scenes into 3D models 44 | -------------------------------------------------------------------------------- /RealSenseSandbox.uproject: -------------------------------------------------------------------------------- 1 | { 2 | "FileVersion": 3, 3 | "EngineAssociation": "{4C4C848D-4FC9-79F7-5E2D-2AB8C27123E8}", 4 | "Category": "", 5 | "Description": "", 6 | "Modules": [ 7 | { 8 | "Name": "RealSenseSandbox", 9 | "Type": "Runtime", 10 | "LoadingPhase": "Default" 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /Source/RealSenseSandbox.Target.cs: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | 17 | using UnrealBuildTool; 18 | using System.Collections.Generic; 19 | 20 | public class RealSenseSandboxTarget : TargetRules 21 | { 22 | public RealSenseSandboxTarget(TargetInfo Target) 23 | { 24 | Type = TargetType.Game; 25 | } 26 | 27 | // 28 | // TargetRules interface. 29 | // 30 | 31 | public override void SetupBinaries( 32 | TargetInfo Target, 33 | ref List OutBuildBinaryConfigurations, 34 | ref List OutExtraModuleNames 35 | ) 36 | { 37 | OutExtraModuleNames.AddRange( new string[] { "RealSenseSandbox" } ); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Source/RealSenseSandbox/RealSenseSandbox.Build.cs: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | 17 | using UnrealBuildTool; 18 | 19 | public class RealSenseSandbox : ModuleRules 20 | { 21 | public RealSenseSandbox(TargetInfo Target) 22 | { 23 | PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" }); 24 | 25 | PrivateDependencyModuleNames.AddRange(new string[] { }); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Source/RealSenseSandbox/RealSenseSandbox.cpp: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | 17 | #include "RealSenseSandbox.h" 18 | 19 | IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, RealSenseSandbox, "RealSenseSandbox" ); 20 | -------------------------------------------------------------------------------- /Source/RealSenseSandbox/RealSenseSandbox.h: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | 17 | #pragma once 18 | 19 | #include "Engine.h" 20 | 21 | -------------------------------------------------------------------------------- /Source/RealSenseSandboxEditor.Target.cs: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////////////////// 2 | // Copyright 2017 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | ///////////////////////////////////////////////////////////////////////////////////////////// 16 | 17 | using UnrealBuildTool; 18 | using System.Collections.Generic; 19 | 20 | public class RealSenseSandboxEditorTarget : TargetRules 21 | { 22 | public RealSenseSandboxEditorTarget(TargetInfo Target) 23 | { 24 | Type = TargetType.Editor; 25 | } 26 | 27 | // 28 | // TargetRules interface. 29 | // 30 | 31 | public override void SetupBinaries( 32 | TargetInfo Target, 33 | ref List OutBuildBinaryConfigurations, 34 | ref List OutExtraModuleNames 35 | ) 36 | { 37 | OutExtraModuleNames.AddRange( new string[] { "RealSenseSandbox" } ); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /UE4 RealSense Plugin Getting Started Guide.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameTechDev/UE4RealSensePlugin/f51a96f529557bec9096ab0d934eb08d7cafba12/UE4 RealSense Plugin Getting Started Guide.docx -------------------------------------------------------------------------------- /license.txt: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | 5 | http://www.apache.org/licenses/ 6 | 7 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 8 | 9 | 1. Definitions. 10 | 11 | "License" shall mean the terms and conditions for use, reproduction, and 12 | distribution as defined by Sections 1 through 9 of this document. 13 | 14 | "Licensor" shall mean the copyright owner or entity authorized by the copyright 15 | owner that is granting the License. 16 | 17 | "Legal Entity" shall mean the union of the acting entity and all other entities 18 | that control, are controlled by, or are under common control with that entity. 19 | For the purposes of this definition, "control" means (i) the power, direct or 20 | indirect, to cause the direction or management of such entity, whether by 21 | contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity exercising 25 | permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, including 28 | but not limited to software source code, documentation source, and configuration 29 | files. 30 | 31 | "Object" form shall mean any form resulting from mechanical transformation or 32 | translation of a Source form, including but not limited to compiled object code, 33 | generated documentation, and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or Object form, made 36 | available under the License, as indicated by a copyright notice that is included 37 | in or attached to the work (an example is provided in the Appendix below). 38 | 39 | "Derivative Works" shall mean any work, whether in Source or Object form, that 40 | is based on (or derived from) the Work and for which the editorial revisions, 41 | annotations, elaborations, or other modifications represent, as a whole, an 42 | original work of authorship. For the purposes of this License, Derivative Works 43 | shall not include works that remain separable from, or merely link (or bind by 44 | name) to the interfaces of, the Work and Derivative Works thereof. 45 | 46 | "Contribution" shall mean any work of authorship, including the original version 47 | of the Work and any modifications or additions to that Work or Derivative Works 48 | thereof, that is intentionally submitted to Licensor for inclusion in the Work 49 | by the copyright owner or by an individual or Legal Entity authorized to submit 50 | on behalf of the copyright owner. For the purposes of this definition, 51 | "submitted" means any form of electronic, verbal, or written communication sent 52 | to the Licensor or its representatives, including but not limited to 53 | communication on electronic mailing lists, source code control systems, and 54 | issue tracking systems that are managed by, or on behalf of, the Licensor for 55 | the purpose of discussing and improving the Work, but excluding communication 56 | that is conspicuously marked or otherwise designated in writing by the copyright 57 | owner as "Not a Contribution." 58 | 59 | "Contributor" shall mean Licensor and any individual or Legal Entity on behalf 60 | of whom a Contribution has been received by Licensor and subsequently 61 | incorporated within the Work. 62 | 63 | 2. Grant of Copyright License. Subject to the terms and conditions of this 64 | License, each Contributor hereby grants to You a perpetual, worldwide, 65 | non-exclusive, no-charge, royalty-free, irrevocable copyright license to 66 | reproduce, prepare Derivative Works of, publicly display, publicly perform, 67 | sublicense, and distribute the Work and such Derivative Works in Source or 68 | Object form. 69 | 70 | 3. Grant of Patent License. Subject to the terms and conditions of this License, 71 | each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, 72 | no-charge, royalty-free, irrevocable (except as stated in this section) patent 73 | license to make, have made, use, offer to sell, sell, import, and otherwise 74 | transfer the Work, where such license applies only to those patent claims 75 | licensable by such Contributor that are necessarily infringed by their 76 | Contribution(s) alone or by combination of their Contribution(s) with the Work 77 | to which such Contribution(s) was submitted. If You institute patent litigation 78 | against any entity (including a cross-claim or counterclaim in a lawsuit) 79 | alleging that the Work or a Contribution incorporated within the Work 80 | constitutes direct or contributory patent infringement, then any patent licenses 81 | granted to You under this License for that Work shall terminate as of the date 82 | such litigation is filed. 83 | 84 | 4. Redistribution. You may reproduce and distribute copies of the Work or 85 | Derivative Works thereof in any medium, with or without modifications, and in 86 | Source or Object form, provided that You meet the following conditions: 87 | You must give any other recipients of the Work or Derivative Works a copy of 88 | this License; and 89 | 90 | 91 | You must cause any modified files to carry prominent notices stating that You 92 | changed the files; and 93 | 94 | 95 | You must retain, in the Source form of any Derivative Works that You 96 | distribute, all copyright, patent, trademark, and attribution notices from the 97 | Source form of the Work, excluding those notices that do not pertain to any 98 | part of the Derivative Works; and 99 | 100 | 101 | If the Work includes a "NOTICE" text file as part of its distribution, then 102 | any Derivative Works that You distribute must include a readable copy of the 103 | attribution notices contained within such NOTICE file, excluding those notices 104 | that do not pertain to any part of the Derivative Works, in at least one of 105 | the following places: within a NOTICE text file distributed as part of the 106 | Derivative Works; within the Source form or documentation, if provided along 107 | with the Derivative Works; or, within a display generated by the Derivative 108 | Works, if and wherever such third-party notices normally appear. The contents 109 | of the NOTICE file are for informational purposes only and do not modify the 110 | License. You may add Your own attribution notices within Derivative Works that 111 | You distribute, alongside or as an addendum to the NOTICE text from the Work, 112 | provided that such additional attribution notices cannot be construed as 113 | modifying the License. 114 | You may add Your own copyright statement to Your modifications and may provide 115 | additional or different license terms and conditions for use, reproduction, or 116 | distribution of Your modifications, or for any such Derivative Works as a whole, 117 | provided Your use, reproduction, and distribution of the Work otherwise complies 118 | with the conditions stated in this License. 119 | 120 | 5. Submission of Contributions. Unless You explicitly state otherwise, any 121 | Contribution intentionally submitted for inclusion in the Work by You to the 122 | Licensor shall be under the terms and conditions of this License, without any 123 | additional terms or conditions. Notwithstanding the above, nothing herein shall 124 | supersede or modify the terms of any separate license agreement you may have 125 | executed with Licensor regarding such Contributions. 126 | 127 | 6. Trademarks. This License does not grant permission to use the trade names, 128 | trademarks, service marks, or product names of the Licensor, except as required 129 | for reasonable and customary use in describing the origin of the Work and 130 | reproducing the content of the NOTICE file. 131 | 132 | 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in 133 | writing, Licensor provides the Work (and each Contributor provides its 134 | Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 135 | KIND, either express or implied, including, without limitation, any warranties 136 | or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 137 | PARTICULAR PURPOSE. You are solely responsible for determining the 138 | appropriateness of using or redistributing the Work and assume any risks 139 | associated with Your exercise of permissions under this License. 140 | 141 | 8. Limitation of Liability. In no event and under no legal theory, whether in 142 | tort (including negligence), contract, or otherwise, unless required by 143 | applicable law (such as deliberate and grossly negligent acts) or agreed to in 144 | writing, shall any Contributor be liable to You for damages, including any 145 | direct, indirect, special, incidental, or consequential damages of any character 146 | arising as a result of this License or out of the use or inability to use the 147 | Work (including but not limited to damages for loss of goodwill, work stoppage, 148 | computer failure or malfunction, or any and all other commercial damages or 149 | losses), even if such Contributor has been advised of the possibility of such 150 | damages. 151 | 152 | 9. Accepting Warranty or Additional Liability. While redistributing the Work or 153 | Derivative Works thereof, You may choose to offer, and charge a fee for, 154 | acceptance of support, warranty, indemnity, or other liability obligations 155 | and/or rights consistent with this License. However, in accepting such 156 | obligations, You may act only on Your own behalf and on Your sole 157 | responsibility, not on behalf of any other Contributor, and only if You agree to 158 | indemnify, defend, and hold each Contributor harmless for any liability incurred 159 | by, or claims asserted against, such Contributor by reason of your accepting any 160 | such warranty or additional liability. 161 | 162 | END OF TERMS AND CONDITIONS 163 | 164 | APPENDIX: How to apply the Apache License to your work 165 | 166 | To apply the Apache License to your work, attach the following boilerplate 167 | notice, with the fields enclosed by brackets "[]" replaced with your own 168 | identifying information. (Don't include the brackets!) The text should be 169 | enclosed in the appropriate comment syntax for the file format. We also 170 | recommend that a file or class name and description of purpose be included on 171 | the same "printed page" as the copyright notice for easier identification within 172 | third-party archives. 173 | 174 | Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, 175 | Version 2.0 (the "License"); you may not use this file except in compliance with 176 | the License. You may obtain a copy of the License at 177 | http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or 178 | agreed to in writing, software distributed under the License is distributed on 179 | an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 180 | or implied. See the License for the specific language governing permissions and 181 | limitations under the License. 182 | --------------------------------------------------------------------------------