From 457cd803c1063ca599bf369b26c85f05c4fa2ab9 Mon Sep 17 00:00:00 2001 From: "j.foucher" Date: Thu, 19 Feb 2026 12:36:36 +0100 Subject: [PATCH] Initial Import --- .gitignore | 5 + Unreal/PS_AI_Agent/Config/DefaultEditor.ini | 0 Unreal/PS_AI_Agent/Config/DefaultEngine.ini | 92 + Unreal/PS_AI_Agent/Config/DefaultGame.ini | 3 + Unreal/PS_AI_Agent/Config/DefaultInput.ini | 84 + Unreal/PS_AI_Agent/Content/TestMap.umap | Bin 0 -> 45595 bytes Unreal/PS_AI_Agent/PS_AI_Agent.sln | 2323 +++++++++++++++++ Unreal/PS_AI_Agent/PS_AI_Agent.uproject | 22 + .../PS_AI_Agent/Source/PS_AI_Agent.Target.cs | 15 + .../Source/PS_AI_Agent/PS_AI_Agent.Build.cs | 23 + .../Source/PS_AI_Agent/PS_AI_Agent.cpp | 6 + .../Source/PS_AI_Agent/PS_AI_Agent.h | 6 + .../Source/PS_AI_AgentEditor.Target.cs | 15 + 13 files changed, 2594 insertions(+) create mode 100644 .gitignore create mode 100644 Unreal/PS_AI_Agent/Config/DefaultEditor.ini create mode 100644 Unreal/PS_AI_Agent/Config/DefaultEngine.ini create mode 100644 Unreal/PS_AI_Agent/Config/DefaultGame.ini create mode 100644 Unreal/PS_AI_Agent/Config/DefaultInput.ini create mode 100644 Unreal/PS_AI_Agent/Content/TestMap.umap create mode 100644 Unreal/PS_AI_Agent/PS_AI_Agent.sln create mode 100644 Unreal/PS_AI_Agent/PS_AI_Agent.uproject create mode 100644 Unreal/PS_AI_Agent/Source/PS_AI_Agent.Target.cs create mode 100644 Unreal/PS_AI_Agent/Source/PS_AI_Agent/PS_AI_Agent.Build.cs create mode 100644 Unreal/PS_AI_Agent/Source/PS_AI_Agent/PS_AI_Agent.cpp create mode 100644 Unreal/PS_AI_Agent/Source/PS_AI_Agent/PS_AI_Agent.h create mode 100644 Unreal/PS_AI_Agent/Source/PS_AI_AgentEditor.Target.cs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2b752f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +Unreal/PS_AI_Agent/.vsconfig +Unreal/PS_AI_Agent/.vs/ +Unreal/PS_AI_Agent/Binaries/ +Unreal/PS_AI_Agent/Intermediate/ +Unreal/PS_AI_Agent/Saved/ diff --git a/Unreal/PS_AI_Agent/Config/DefaultEditor.ini b/Unreal/PS_AI_Agent/Config/DefaultEditor.ini new file mode 100644 index 0000000..e69de29 diff --git a/Unreal/PS_AI_Agent/Config/DefaultEngine.ini b/Unreal/PS_AI_Agent/Config/DefaultEngine.ini new file mode 100644 index 0000000..f5a7606 --- /dev/null +++ b/Unreal/PS_AI_Agent/Config/DefaultEngine.ini @@ -0,0 +1,92 @@ + + +[/Script/EngineSettings.GameMapsSettings] +GameDefaultMap=/Engine/Maps/Templates/OpenWorld + +[/Script/Engine.RendererSettings] +r.AllowStaticLighting=False + +r.GenerateMeshDistanceFields=True + +r.DynamicGlobalIlluminationMethod=1 + +r.ReflectionMethod=1 + +r.SkinCache.CompileShaders=True + +r.RayTracing=True + +r.Shadow.Virtual.Enable=1 + +r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=True + +r.DefaultFeature.LocalExposure.HighlightContrastScale=0.8 + +r.DefaultFeature.LocalExposure.ShadowContrastScale=0.8 + +[/Script/WindowsTargetPlatform.WindowsTargetSettings] +DefaultGraphicsRHI=DefaultGraphicsRHI_DX12 +DefaultGraphicsRHI=DefaultGraphicsRHI_DX12 +-D3D12TargetedShaderFormats=PCD3D_SM5 ++D3D12TargetedShaderFormats=PCD3D_SM6 +-D3D11TargetedShaderFormats=PCD3D_SM5 ++D3D11TargetedShaderFormats=PCD3D_SM5 +Compiler=Default +AudioSampleRate=48000 +AudioCallbackBufferFrameSize=1024 +AudioNumBuffersToEnqueue=1 +AudioMaxChannels=0 +AudioNumSourceWorkers=4 +SpatializationPlugin= +SourceDataOverridePlugin= +ReverbPlugin= +OcclusionPlugin= +CompressionOverrides=(bOverrideCompressionTimes=False,DurationThreshold=5.000000,MaxNumRandomBranches=0,SoundCueQualityIndex=0) +CacheSizeKB=65536 +MaxChunkSizeOverrideKB=0 +bResampleForDevice=False +MaxSampleRate=48000.000000 +HighSampleRate=32000.000000 +MedSampleRate=24000.000000 +LowSampleRate=12000.000000 +MinSampleRate=8000.000000 +CompressionQualityModifier=1.000000 +AutoStreamingThreshold=0.000000 +SoundCueCookQualityIndex=-1 + +[/Script/LinuxTargetPlatform.LinuxTargetSettings] +-TargetedRHIs=SF_VULKAN_SM5 ++TargetedRHIs=SF_VULKAN_SM6 + +[/Script/HardwareTargeting.HardwareTargetingSettings] +TargetedHardwareClass=Desktop +AppliedTargetedHardwareClass=Desktop +DefaultGraphicsPerformance=Maximum +AppliedDefaultGraphicsPerformance=Maximum + +[/Script/WorldPartitionEditor.WorldPartitionEditorSettings] +CommandletClass=Class'/Script/UnrealEd.WorldPartitionConvertCommandlet' + +[/Script/Engine.UserInterfaceSettings] +bAuthorizeAutomaticWidgetVariableCreation=False +FontDPIPreset=Standard +FontDPI=72 + +[/Script/Engine.Engine] ++ActiveGameNameRedirects=(OldGameName="TP_Blank",NewGameName="/Script/PS_AI_Agent") ++ActiveGameNameRedirects=(OldGameName="/Script/TP_Blank",NewGameName="/Script/PS_AI_Agent") + +[/Script/AndroidFileServerEditor.AndroidFileServerRuntimeSettings] +bEnablePlugin=True +bAllowNetworkConnection=True +SecurityToken=20B62484477FC40F53C0F199ACDDFFB7 +bIncludeInShipping=False +bAllowExternalStartInShipping=False +bCompileAFSProject=False +bUseCompression=False +bLogFiles=False +bReportStats=False +ConnectionType=USBOnly +bUseManualIPAddress=False +ManualIPAddress= + diff --git a/Unreal/PS_AI_Agent/Config/DefaultGame.ini b/Unreal/PS_AI_Agent/Config/DefaultGame.ini new file mode 100644 index 0000000..d53d951 --- /dev/null +++ b/Unreal/PS_AI_Agent/Config/DefaultGame.ini @@ -0,0 +1,3 @@ + +[/Script/EngineSettings.GeneralProjectSettings] +ProjectID=C89AEFD7484597308B8E6EB1C7AE0965 diff --git a/Unreal/PS_AI_Agent/Config/DefaultInput.ini b/Unreal/PS_AI_Agent/Config/DefaultInput.ini new file mode 100644 index 0000000..a919105 --- /dev/null +++ b/Unreal/PS_AI_Agent/Config/DefaultInput.ini @@ -0,0 +1,84 @@ +[/Script/Engine.InputSettings] +-AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) +-AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) +-AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) +-AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) +-AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) +-AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) +-AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) ++AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MouseWheelAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_LeftTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_RightTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_Special_Left_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_Special_Left_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +bAltEnterTogglesFullscreen=True +bF11TogglesFullscreen=True +bUseMouseForTouch=False +bEnableMouseSmoothing=True +bEnableFOVScaling=True +bCaptureMouseOnLaunch=True +bEnableLegacyInputScales=True +bEnableMotionControls=True +bFilterInputByPlatformUser=False +bShouldFlushPressedKeysOnViewportFocusLost=True +bAlwaysShowTouchInterface=False +bShowConsoleOnFourFingerTap=True +bEnableGestureRecognizer=False +bUseAutocorrect=False +DefaultViewportMouseCaptureMode=CapturePermanently_IncludingInitialMouseDown +DefaultViewportMouseLockMode=LockOnCapture +FOVScale=0.011110 +DoubleClickTime=0.200000 +DefaultPlayerInputClass=/Script/EnhancedInput.EnhancedPlayerInput +DefaultInputComponentClass=/Script/EnhancedInput.EnhancedInputComponent +DefaultTouchInterface=/Engine/MobileResources/HUD/DefaultVirtualJoysticks.DefaultVirtualJoysticks +-ConsoleKeys=Tilde ++ConsoleKeys=Tilde + diff --git a/Unreal/PS_AI_Agent/Content/TestMap.umap b/Unreal/PS_AI_Agent/Content/TestMap.umap new file mode 100644 index 0000000000000000000000000000000000000000..60876e498bcad2dc3f64a2ce806921c0a338f2eb GIT binary patch literal 45595 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