Compare commits

..

12 Commits

Author SHA1 Message Date
7a8eb7f827 suppr external world partition 2026-04-12 18:43:15 +02:00
ea20f1c279 Force opaque UI backgrounds with WhiteBrush
Default SBorder brush is semi-transparent in PIE. Using explicit
WhiteBrush (solid 1x1 texture) ensures fully opaque panels everywhere.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 18:39:24 +02:00
bc33a8f64b Make UI panel backgrounds fully opaque (alpha 1.0)
Fixes inconsistency between PIE (transparent) and packaged (opaque).
All SBorder BackgroundColor alpha changed from 0.85 to 1.0.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 18:38:07 +02:00
a91aac1192 Fix Play button: unload sublevel + use full map path for OpenLevel
OpenLevel("test") was resolving to the streamed sublevel instance
(test_LevelInstance_5) instead of the actual map. Fix:
- Unload sublevel via LoadBaseLevelAsSublevel("None") before OpenLevel
- Use full path "/Game/{BaseLevel}" to avoid ambiguity

Also: all widget lambdas now get SpawnManager/SceneSerializer fresh from
PlayerController (critical fix for packaged builds where weak ptrs are null).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 18:35:52 +02:00
693cf143a3 Add Unreal/Build/ to gitignore and remove tracked build artifacts
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 18:20:33 +02:00
7a008c7e60 Fix packaged build: weak ptr timing, factory module, hard refs, brace fix
Critical fixes for packaged builds:
- Widget weak ptrs (SpawnManager/SceneSerializer) are null in packaged due to
  HUD deferred init. All button lambdas now get references fresh from
  PlayerController via GetOwningPlayer() cast instead of cached weak ptrs.
- HUD BeginPlay deferred by one tick (SetTimerForNextTick) to ensure
  PlayerController has initialized SpawnManager before wiring.

Module split:
- Factories moved to separate PS_EditorTools module (Type: Editor)
  to fix UHT error with UFactory in packaging builds.
- PS_Editor module no longer depends on UnrealEd for factories.

Asset references:
- TSoftObjectPtr/TSoftClassPtr changed to TObjectPtr/TSubclassOf for
  MasterCatalog, SpawnCatalogs, and ActorClass entries. Hard references
  ensure assets are cooked in packaged builds.

Other fixes:
- GetActorLabel() replaced with GetClass()->GetName() (editor-only API)
- Missing brace in Browse dialog BaseLevel sync code
- BaseLevel sync only when scenario specifies a LevelName (no more clearing on empty)
- Save As dialog with native Windows file picker
- Debug info in catalog UI when empty (shows chain: Master→Catalogs→Entries)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 18:17:52 +02:00
aa4313057c Fix editor restore: init order, combo callback, scenario name
- SceneSerializer created before subsystem check (was nullptr crash)
- ComboBox OnSelectionChanged ignores ESelectInfo::Direct (programmatic)
  to prevent NativeConstruct from clearing the just-loaded scenario
- SaveNameField restored from LastEditedScenarioName on return
- Added ReturnToEditor/OpenEditor to GameInstanceSubsystem
- EditorMapName auto-saved on Play for return navigation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 16:23:32 +02:00
9c43fd523a Standalone editor: scenario workflow, BaseLevel combo, ReturnToEditor
Editor workflow:
- Removed auto-detection of BaseLevel (strip _Editor). Editor is standalone.
- User selects BaseLevel from ComboBox (populated from MasterCatalog.BaseLevels)
- "None" option for editing without a base level
- Selecting BaseLevel: clears current scenario, hides persistent level actors,
  loads sublevel. Selecting "None" restores persistent level actors.

UI terminology: Scene → Scenario (save field, buttons, notifications)

GameInstanceSubsystem:
- Renamed PendingSceneName → PendingScenarioName
- Added LastEditedScenarioName/LastEditedBaseLevel (persist after Consume)
- SetPendingScenario() stores in both Pending and LastEdited
- ReturnToEditor() restores Pending from LastEdited, opens editor map
- EditorMapName auto-saved on first Play, used by ReturnToEditor
- OpenEditor() / ReturnToEditor() callable from gameplay BP

Play button: resets input mode before OpenLevel (fixes cursor in FirstPerson GM)

Test assets: FirstPerson template for testing Play/ReturnToEditor flow

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 16:12:10 +02:00
472811b858 Add PROSERVE integration: sublevel loading, Play button, GameInstance subsystem
Architecture for single editor map workflow:
- MasterCatalog.BaseLevels lists available base levels
- BaseLevel selector in UI (cycle button) loads selected level as sublevel
- Sublevel provides visual context only — save/load only touches PS_Editor objects
- No auto-load at startup: user picks via UI or PROSERVE sets via subsystem

GameInstanceSubsystem (survives OpenLevel):
- PendingSceneName + PendingBaseLevel set by PROSERVE before opening editor
- Editor reads them at BeginPlay: loads sublevel + scene automatically
- ConsumePendingScene() for gameplay side to read and clear

Play button:
- Auto-saves current scene
- Stores scene name in GameInstanceSubsystem
- Opens the BaseLevel via OpenLevel

SceneLoader:
- bStripEditorComponents parameter (default true) removes Spawnable/Editable
  components after load for clean gameplay actors

SceneData v3: LevelName field associates scenes with base levels.
Scene list filtered by selected BaseLevel.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 15:32:43 +02:00
aafcbbb7f9 Add BaseLevelNameOverride for dedicated editor maps
PlayerController gets a BaseLevelNameOverride property. When set (e.g. "Warehouse"),
scenes are tagged with that level name instead of the auto-detected map name.

Use case: editing on "Warehouse_Editor" map but scenes should be associated
with the "Warehouse" base level for PROSERVE runtime loading.

Save, load list, and scene filtering all respect this override.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 12:01:43 +02:00
4dc0f400b4 Add level-based scene organization and filtering
SceneData now includes LevelName field (auto-detected from current map on save).
Version bumped to 3. Backward compatible (empty LevelName for old files).

SceneLoader:
- GetSavedSceneNames(LevelFilter) filters by associated level
- GetSceneLevelName() reads level association without full parse
- GetSavedSceneNamesForCurrentLevel() convenience for game code

Editor UI:
- Scene list grouped: "This level" (highlighted) + "Other levels" (dimmed)
- Shows current level name above the list

PROSERVE integration pattern:
  // List scenarios for current level
  auto Scenes = UPS_Editor_SceneLoader::GetSavedSceneNamesForCurrentLevel(this);
  // Load a specific scenario
  UPS_Editor_SceneLoader::LoadScene(this, "Scenario_A", OutActors);

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 11:43:00 +02:00
77f2da027e Add standalone SceneLoader for game runtime initialization
UPS_Editor_SceneLoader is a BlueprintFunctionLibrary that loads PS_Editor
JSON scenes without any editor infrastructure (no PlayerController, Gizmo,
SelectionManager, or UI required).

Usage from any GameMode:
  TArray<AActor*> Actors;
  UPS_Editor_SceneLoader::LoadScene(this, "MyScene", Actors);

Handles: class loading (BP + C++), transforms, custom editable properties
via reflection (ImportText), and spline point data. All functions are
BlueprintCallable for BP GameMode usage.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 11:32:09 +02:00
122 changed files with 1197 additions and 76 deletions

View File

@@ -0,0 +1,16 @@
{
"permissions": {
"allow": [
"Bash(reg query:*)",
"Bash(\"C:/Program Files/Epic Games/UE_5.5/Engine/Build/BatchFiles/Build.bat\" PS_ProserveEditorEditor Win64 Development -Project=\"C:/ASTERION/GIT/PS_ProserveEditor/Unreal/PS_ProserveEditor.uproject\" -WaitMutex -FromMsBuild)",
"Bash(cp \"C:/Users/j_foucher/.claude/projects/C--ASTERION-GIT-PS-ProserveEditor/memory/MEMORY.md\" \"C:/ASTERION/GIT/PS_ProserveEditor/.claude/memory/MEMORY.md\")",
"Bash(cp \"C:/Users/j_foucher/.claude/projects/C--ASTERION-GIT-PS-ProserveEditor/memory/project_ps_editor.md\" \"C:/ASTERION/GIT/PS_ProserveEditor/.claude/memory/project_ps_editor.md\")",
"Bash(cp \"C:/Users/j_foucher/.claude/projects/C--ASTERION-GIT-PS-ProserveEditor/memory/feedback_naming.md\" \"C:/ASTERION/GIT/PS_ProserveEditor/.claude/memory/feedback_naming.md\")",
"Bash(cp \"C:/Users/j_foucher/.claude/projects/C--ASTERION-GIT-PS-ProserveEditor/memory/reference_build.md\" \"C:/ASTERION/GIT/PS_ProserveEditor/.claude/memory/reference_build.md\")",
"Bash(cp \"C:/Users/j_foucher/.claude/projects/C--ASTERION-GIT-PS-ProserveEditor/memory/feedback_build_workflow.md\" \"C:/ASTERION/GIT/PS_ProserveEditor/.claude/memory/feedback_build_workflow.md\")",
"Bash(powershell -Command \"\\(Get-ItemProperty 'HKLM:\\\\SOFTWARE\\\\EpicGames\\\\Unreal Engine\\\\5.5' -Name 'InstalledDirectory'\\).InstalledDirectory\")",
"Bash(\"C:\\\\Program Files\\\\Epic Games\\\\UE_5.5\\\\Engine\\\\Build\\\\BatchFiles\\\\Build.bat\" PS_ProserveEditorEditor Win64 Development -Project=\"C:\\\\ASTERION\\\\GIT\\\\PS_ProserveEditor\\\\Unreal\\\\PS_ProserveEditor.uproject\" -WaitMutex -FromMsBuild)",
"Bash(tasklist)"
]
}
}

1
.gitignore vendored
View File

@@ -6,6 +6,7 @@ Unreal/Binaries/
Unreal/Intermediate/ Unreal/Intermediate/
Unreal/Saved/ Unreal/Saved/
Unreal/DerivedDataCache/ Unreal/DerivedDataCache/
Unreal/Build/
# UE build artifacts (plugins) # UE build artifacts (plugins)
Unreal/Plugins/*/Binaries/ Unreal/Plugins/*/Binaries/

View File

@@ -1,8 +1,8 @@
[/Script/EngineSettings.GameMapsSettings] [/Script/EngineSettings.GameMapsSettings]
GameDefaultMap=/Game/test.test GameDefaultMap=/Game/test_Editor.test_Editor
EditorStartupMap=/Game/test.test EditorStartupMap=/Game/test_Editor.test_Editor
GlobalDefaultGameMode=/Script/PS_Editor.PS_Editor_GameMode GlobalDefaultGameMode=/Script/PS_Editor.PS_Editor_GameMode
[/Script/Engine.RendererSettings] [/Script/Engine.RendererSettings]
@@ -10,9 +10,9 @@ r.AllowStaticLighting=False
r.GenerateMeshDistanceFields=True r.GenerateMeshDistanceFields=True
r.DynamicGlobalIlluminationMethod=1 r.DynamicGlobalIlluminationMethod=0
r.ReflectionMethod=1 r.ReflectionMethod=0
r.SkinCache.CompileShaders=True r.SkinCache.CompileShaders=True

View File

@@ -1,3 +1,108 @@
[/Script/EngineSettings.GeneralProjectSettings] [/Script/EngineSettings.GeneralProjectSettings]
ProjectID=1BC6BAE446981E654DB42F8C5E2303EC ProjectID=1BC6BAE446981E654DB42F8C5E2303EC
[/Script/UnrealEd.ProjectPackagingSettings]
Build=IfProjectHasCode
BuildConfiguration=PPBC_Development
BuildTarget=
FullRebuild=False
ForDistribution=False
IncludeDebugFiles=False
BlueprintNativizationMethod=Disabled
bIncludeNativizedAssetsInProjectGeneration=False
bExcludeMonolithicEngineHeadersInNativizedCode=False
UsePakFile=True
bUseIoStore=True
bUseZenStore=False
bMakeBinaryConfig=False
bGenerateChunks=False
bGenerateNoChunks=False
bChunkHardReferencesOnly=False
bForceOneChunkPerFile=False
MaxChunkSize=0
bBuildHttpChunkInstallData=False
HttpChunkInstallDataDirectory=(Path="")
WriteBackMetadataToAssetRegistry=Disabled
bWritePluginSizeSummaryJsons=False
bCompressed=True
PackageCompressionFormat=Oodle
bForceUseProjectCompressionFormatIgnoreHardwareOverride=False
PackageAdditionalCompressionOptions=
PackageCompressionMethod=Kraken
PackageCompressionLevel_DebugDevelopment=4
PackageCompressionLevel_TestShipping=4
PackageCompressionLevel_Distribution=7
PackageCompressionMinBytesSaved=1024
PackageCompressionMinPercentSaved=5
bPackageCompressionEnableDDC=False
PackageCompressionMinSizeToConsiderDDC=0
HttpChunkInstallDataVersion=
IncludePrerequisites=True
IncludeAppLocalPrerequisites=False
bShareMaterialShaderCode=True
bDeterministicShaderCodeOrder=False
bSharedMaterialNativeLibraries=True
ApplocalPrerequisitesDirectory=(Path="")
IncludeCrashReporter=False
InternationalizationPreset=English
-CulturesToStage=en
+CulturesToStage=en
LocalizationTargetCatchAllChunkId=0
bCookAll=False
bCookMapsOnly=False
bTreatWarningsAsErrorsOnCook=False
bSkipEditorContent=False
bSkipMovies=False
-IniKeyDenylist=KeyStorePassword
-IniKeyDenylist=KeyPassword
-IniKeyDenylist=DebugKeyStorePassword
-IniKeyDenylist=DebugKeyPassword
-IniKeyDenylist=rsa.privateexp
-IniKeyDenylist=rsa.modulus
-IniKeyDenylist=rsa.publicexp
-IniKeyDenylist=aes.key
-IniKeyDenylist=SigningPublicExponent
-IniKeyDenylist=SigningModulus
-IniKeyDenylist=SigningPrivateExponent
-IniKeyDenylist=EncryptionKey
-IniKeyDenylist=DevCenterUsername
-IniKeyDenylist=DevCenterPassword
-IniKeyDenylist=IOSTeamID
-IniKeyDenylist=SigningCertificate
-IniKeyDenylist=MobileProvision
-IniKeyDenylist=IniKeyDenylist
-IniKeyDenylist=IniSectionDenylist
+IniKeyDenylist=KeyStorePassword
+IniKeyDenylist=KeyPassword
+IniKeyDenylist=DebugKeyStorePassword
+IniKeyDenylist=DebugKeyPassword
+IniKeyDenylist=rsa.privateexp
+IniKeyDenylist=rsa.modulus
+IniKeyDenylist=rsa.publicexp
+IniKeyDenylist=aes.key
+IniKeyDenylist=SigningPublicExponent
+IniKeyDenylist=SigningModulus
+IniKeyDenylist=SigningPrivateExponent
+IniKeyDenylist=EncryptionKey
+IniKeyDenylist=DevCenterUsername
+IniKeyDenylist=DevCenterPassword
+IniKeyDenylist=IOSTeamID
+IniKeyDenylist=SigningCertificate
+IniKeyDenylist=MobileProvision
+IniKeyDenylist=IniKeyDenylist
+IniKeyDenylist=IniSectionDenylist
-IniSectionDenylist=HordeStorageServers
-IniSectionDenylist=StorageServers
-IniSectionDenylist=/Script/AndroidFileServerEditor.AndroidFileServerRuntimeSettings
+IniSectionDenylist=HordeStorageServers
+IniSectionDenylist=StorageServers
+IniSectionDenylist=/Script/AndroidFileServerEditor.AndroidFileServerRuntimeSettings
+MapsToCook=(FilePath="/Game/test")
+MapsToCook=(FilePath="/Game/test_Editor")
+DirectoriesToAlwaysCook=(Path="/NNEDenoiser")
+DirectoriesToAlwaysCook=(Path="/PS_Editor")
bRetainStagedDirectory=False
CustomStageCopyHandler=

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More