BenPyton/ProceduralDungeon

[BUG?] [Question] Does this work with World Partition type levels? (should it?)

ImBlackMagic opened this issue · 10 comments

Bug Description
Crash to Desktop when one or more of the rooms is a World Partition Type Level and the master level isn't.

Technical informations

  • OS: Windows 10
  • Unreal: 5.0.3-20979098+++UE5+Release-5.0
  • Plugin Version: 2.0.2

Steps To Reproduce
Steps to reproduce the behavior:

  1. Convert a Room to World Partition
  2. Play on Master Level

Expected behavior
Crash to Desktop

Minimal repro project
Change one of the rooms to a world partition level in the provided example UE5 project

Crash Report
I removed my Ids for privacy reasons

Unreal Crash Report
Assertion failed: !WorldDataLayers || WorldDataLayers == NewWorldDataLayers [File:D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\Level.cpp] [Line: 2530]

UnrealEditor_Engine
UnrealEditor_Engine
UnrealEditor_Engine
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_UnrealEd
UnrealEditor_UnrealEd
UnrealEditor
UnrealEditor
UnrealEditor
UnrealEditor
UnrealEditor
UnrealEditor
kernel32
ntdll

I have the full xml crash report if you need it (and the call stacks don't tell much tho), but I don't know how to share it properly, as getting all here seems a bit too much

Conversion Report

Unreal World Partition Report
Conversion completed:
[2022.12.28-21.21.25:622][  0]LogD3D12RHI: Display: Not using pipeline state disk cache per r.D3D12.PSO.DiskCache=0
[2022.12.28-21.21.25:622][  0]LogD3D12RHI: Display: Not using driver-optimized pipeline state disk cache per r.D3D12.PSO.DriverOptimizedDiskCache=0
[2022.12.28-21.21.25:687][  0]LogTextureFormatETC2: Display: ETC2 Texture loading DLL: TextureConverter.dll
[2022.12.28-21.21.25:692][  0]LogTextureFormatOodle: Display: Oodle Texture TFO init; latest sdk version = 2.9.5
[2022.12.28-21.21.25:692][  0]LogTextureFormatOodle: Display: Oodle Texture loading DLL: oo2tex_win64_2.9.5.dll
[2022.12.28-21.21.25:698][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android'
[2022.12.28-21.21.25:698][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android_ASTC'
[2022.12.28-21.21.25:698][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android_DXT'
[2022.12.28-21.21.25:698][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android_ETC2'
[2022.12.28-21.21.25:699][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'AndroidClient'
[2022.12.28-21.21.25:699][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android_ASTCClient'
[2022.12.28-21.21.25:699][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android_DXTClient'
[2022.12.28-21.21.25:699][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android_ETC2Client'
[2022.12.28-21.21.25:699][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android_Multi'
[2022.12.28-21.21.25:699][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android_MultiClient'
[2022.12.28-21.21.25:701][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'HoloLens'
[2022.12.28-21.21.25:701][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'HoloLensClient'
[2022.12.28-21.21.25:703][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'IOS'
[2022.12.28-21.21.25:703][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'IOSClient'
[2022.12.28-21.21.25:705][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Linux'
[2022.12.28-21.21.25:705][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'LinuxEditor'
[2022.12.28-21.21.25:705][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'LinuxServer'
[2022.12.28-21.21.25:705][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'LinuxClient'
[2022.12.28-21.21.25:707][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'LinuxArm64'
[2022.12.28-21.21.25:707][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'LinuxArm64Server'
[2022.12.28-21.21.25:707][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'LinuxArm64Client'
[2022.12.28-21.21.25:709][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'TVOS'
[2022.12.28-21.21.25:709][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'TVOSClient'
[2022.12.28-21.21.25:713][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Windows'
[2022.12.28-21.21.25:713][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'WindowsEditor'
[2022.12.28-21.21.25:713][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'WindowsServer'
[2022.12.28-21.21.25:713][  0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'WindowsClient'
[2022.12.28-21.21.25:713][  0]LogTargetPlatformManager: Display: Building Assets For WindowsEditor
[2022.12.28-21.21.25:718][  0]LogAudioDebug: Display: Lib vorbis DLL was dynamically loaded.
[2022.12.28-21.21.25:763][  0]LogShaderCompilers: Display: Compiling shader autogen file: D:/Usuarios/Joseph/Documents/Unreal Projects/DungeonExample_UE5/Intermediate/ShaderAutogen/PCD3D_SM5/AutogenShaderHeaders.ush
[2022.12.28-21.21.25:763][  0]LogShaderCompilers: Display: Autogen file is unchanged, skipping write.
[2022.12.28-21.21.25:764][  0]LogShaderCompilers: Display: Compiling shader autogen file: D:/Usuarios/Joseph/Documents/Unreal Projects/DungeonExample_UE5/Intermediate/ShaderAutogen/PCD3D_ES31/AutogenShaderHeaders.ush
[2022.12.28-21.21.25:764][  0]LogShaderCompilers: Display: Autogen file is unchanged, skipping write.
[2022.12.28-21.21.25:784][  0]LogDerivedDataCache: Display: ../../../Engine/DerivedDataCache/Compressed.ddp: Opened pak cache for reading. (1230 MiB)
[2022.12.28-21.21.25:794][  0]LogDerivedDataCache: Display: Performance to C:/Users/jiwie/AppData/Local/UnrealEngine/Common/DerivedDataCache: Latency=0.02ms. RandomReadSpeed=221.32MBs, RandomWriteSpeed=166.54MBs. Assigned SpeedClass 'Local'
[2022.12.28-21.21.25:802][  0]LogShaderCompilers: Display: Using Local Shader Compiler with 9 workers.
[2022.12.28-21.21.27:152][  0]LogEditorDomain: Display: EditorDomain is Disabled
[2022.12.28-21.21.27:314][  0]LogTexture: Display: Texture Encode Speed: Final (cook).
[2022.12.28-21.21.27:623][  0]LogCsvProfiler: Display: Metadata set : deviceprofile="WindowsEditor"
[2022.12.28-21.21.27:635][  0]LogTexture: Display: Oodle Texture Encode Speed settings: Fast: RDO Off Lambda=0, Effort=Normal Final: RDO Off Lambda=0, Effort=Normal
[2022.12.28-21.21.29:520][  0]LogAudioCaptureCore: Display: No Audio Capture implementations found. Audio input will be silent.
[2022.12.28-21.21.29:520][  0]LogAudioCaptureCore: Display: No Audio Capture implementations found. Audio input will be silent.
[2022.12.28-21.21.29:936][  0]LogCsvProfiler: Display: Metadata set : largeworldcoordinates="1"
[2022.12.28-21.21.30:134][  0]LogClass: Display: StructProperty FDoorDef::Position is not initialized properly. Module:ProceduralDungeon File:Public/ProceduralDungeonTypes.h
[2022.12.28-21.21.30:135][  0]LogClass: Display: EnumProperty FDoorDef::Direction is not initialized properly. Module:ProceduralDungeon File:Public/ProceduralDungeonTypes.h
[2022.12.28-21.21.30:136][  0]LogClass: Display: 2 Uninitialized script struct members found including 0 object properties
[2022.12.28-21.21.30:137][  0]LogWorldPartitionConvertCommandlet: Display: Conversion started...
[2022.12.28-21.21.30:137][  0]LogWorldPartitionConvertCommandlet: Display: Deleting existing conversion results started...
[2022.12.28-21.21.30:137][  0]LogWorldPartitionConvertCommandlet: Display: Deleting existing conversion results took 123 us
[2022.12.28-21.21.30:142][  0]LogNavigation: Warning: RecastNavMesh /Game/Maps/Rooms/RoomA/RoomA_Level.RoomA_Level:PersistentLevel.RecastNavMesh-Default: ARecastNavMesh: Nav mesh version 13 < Min compatible 20. Nav mesh needs to be rebuilt. 
[2022.12.28-21.21.30:152][  0]LogWorldPartitionConvertCommandlet: Display: FixupSoftObjectPaths started...
[2022.12.28-21.21.30:152][  0]LogWorldPartitionConvertCommandlet: Warning: Error remapping SoftObjectPath /Game/Maps/Rooms/RoomA/RoomA_Level.RoomA_Level:PersistentLevel.RoomA_Level.EventGraph
[2022.12.28-21.21.30:152][  0]LogWorldPartitionConvertCommandlet: Warning:   Source: SerializeScriptProperties.LevelScriptBlueprint.PropertySerialize.LastEditedDocuments.SerializeTaggedProperty.LastEditedDocuments.FArrayProperty::Serialize.PropertySerialize.EditedObjectPath.SerializeTaggedProperty.EditedObjectPath
[2022.12.28-21.21.30:153][  0]LogWorldPartitionConvertCommandlet: Display: FixupSoftObjectPaths took 1 ms
[2022.12.28-21.21.30:181][  0]LogWorldPartitionConvertCommandlet: Display: WorldPartitionConvertCommandlet report:
[2022.12.28-21.21.30:181][  0]LogWorldPartitionConvertCommandlet: Display: Conversion took 44 ms
[2022.12.28-21.21.30:181][  0]LogInit: Display: 
[2022.12.28-21.21.30:182][  0]LogInit: Display: Warning/Error Summary (Unique only)
[2022.12.28-21.21.30:182][  0]LogInit: Display: -----------------------------------
[2022.12.28-21.21.30:182][  0]LogInit: Display: LogNavigation: Warning: RecastNavMesh /Game/Maps/Rooms/RoomA/RoomA_Level.RoomA_Level:PersistentLevel.RecastNavMesh-Default: ARecastNavMesh: Nav mesh version 13 < Min compatible 20. Nav mesh needs to be rebuilt. 
[2022.12.28-21.21.30:182][  0]LogInit: Display: LogWorldPartitionConvertCommandlet: Warning: Error remapping SoftObjectPath /Game/Maps/Rooms/RoomA/RoomA_Level.RoomA_Level:PersistentLevel.RoomA_Level.EventGraph
[2022.12.28-21.21.30:182][  0]LogInit: Display: LogWorldPartitionConvertCommandlet: Warning:   Source: SerializeScriptProperties.LevelScriptBlueprint.PropertySerialize.LastEditedDocuments.SerializeTaggedProperty.LastEditedDocuments.FArrayProperty::Serialize.PropertySerialize.EditedObjectPath.SerializeTaggedProperty.EditedObjectPath
[2022.12.28-21.21.30:183][  0]LogInit: Display: 
[2022.12.28-21.21.30:183][  0]LogInit: Display: Success - 0 error(s), 3 warning(s)
[2022.12.28-21.21.30:183][  0]LogInit: Display: 
Execution of commandlet took:  0.05 seconds
[2022.12.28-21.21.30:325][  0]LogShaderCompilers: Display: ================================================
[2022.12.28-21.21.30:325][  0]LogShaderCompilers: Display: === FShaderJobCache stats ===
[2022.12.28-21.21.30:325][  0]LogShaderCompilers: Display: Total job queries 0, among them cache hits 0 (0.00%)
[2022.12.28-21.21.30:325][  0]LogShaderCompilers: Display: Tracking 0 distinct input hashes that result in 0 distinct outputs (0.00%)
[2022.12.28-21.21.30:326][  0]LogShaderCompilers: Display: RAM used: 0.00 MB (0.00 GB) of 1638.40 MB (1.60 GB) budget. Usage: 0.00%
[2022.12.28-21.21.30:326][  0]LogShaderCompilers: Display: === Shader Compilation stats ===
[2022.12.28-21.21.30:326][  0]LogShaderCompilers: Display: Shaders Compiled: 0
[2022.12.28-21.21.30:326][  0]LogShaderCompilers: Display: Jobs assigned 0, completed 0 (0.00%)
[2022.12.28-21.21.30:326][  0]LogShaderCompilers: Display: Time at least one job was in flight (either pending or executed): 0.00 s
[2022.12.28-21.21.30:326][  0]LogShaderCompilers: Display: ================================================
[2022.12.28-21.21.30:375][  0]LogShaderCompilers: Display: Shaders left to compile 0
[2022.12.28-21.21.30:460][  0]LogD3D12RHI: Display: D3D12 ReleaseResources: 3 items to release
[2022.12.28-21.21.30:460][  0]LogD3D12RHI: Display: D3D12 ReleaseResources: "PrimitiveSceneDataTexture", 40 x 1 x 1, Mips: 1, Format: 0x2, Flags: 0x4
[2022.12.28-21.21.30:461][  0]LogD3D12RHI: Display: D3D12 ReleaseResources: "PrimitiveSceneDataTexture", 40 x 1 x 1, Mips: 1, Format: 0x2, Flags: 0x4
[2022.12.28-21.21.30:461][  0]LogD3D12RHI: Display: D3D12 ReleaseResources: "ParticleCurveTexture", 512 x 512 x 1, Mips: 1, Format: 0x5A, Flags: 0x1

Hi ImBlackMagic,

I've never tested using a world partition as a room level...
I have also never really used world partitions in UE, so I don't really know how it works behind the hood...

Can you tell me more of what you want to do with a room as world partition?

World partitions are generally used for large maps, kind of composed of multiple sub levels loaded and unloaded when needed.

The plugin is similar to world partition, as the master level is like the world partition, and the rooms are like the partitions (however, there are no load/unload of the rooms).

So, it will be more suitable for the master level to be the world partition?
Do you really have very large rooms that needs you to stream parts of them?

As I've said, I don't have much knowledge about world partition...
So until I have some free times to test it, I can't help you more...

Best regards.

Hello, thanks for the fast response, I really appreciate it

Your work is outstanding, I really thank you for sharing

To answer some of your questions:
Q) What do I want to do with a room as world partition?
A) We work in a team and we are using Perforce as source control, traditional world composition levels have to be checked out as a whole and can't be edited with by multiple persons in the team at the same time, World partition levels work by a single actor basis, so it's much better doing it that way, as different parts of the team can work on the level at the same time (Art guy completing the white boxing from the level design guys, that are configuring enemies and the sort)... My boss wants to have fairly large rooms as well (200m by 200m or so... which is large by my standards and make working on them as a single person fairly slow)

Q) So, it will be more suitable for the master level to be the world partition?
A) I haven't tried, I'm just started experimenting with your plugin (which is the absolute best I have found so far, you should consider publishing in the marketplace) I will be trying this next as it could probably work

Q) Do you really have very large rooms that needs you to stream parts of them?
A) Probably not, I have to test if I can have a world partition master level and a world composition room, my gut feeling is that it won't work. I will test though. The overall master level can end up being fairly large, so having it be World Partition with automatic grid streaming would be a god send from a performance standpoint.

Another reason we are moving towards world partition is because the people from Epic said that they are going to be fazing out World composition (this can be found in the patch notes here: https://unrealcommunity.wiki/revisions/6207dd3d3707320fcd2d6809 in the end of the article). They said that world composition is deprecated in UE5, I don't really think they will be removing the system from the engine in this version, but it could happen in UE6, they also stated that World Composition will receive no further updates as well.

Converting the level from world composition to world partition causes it to crash... At least in the example project you provided, probably the conversion went wrong at some point

I created a clean project in 5.1 (it's supposed to have level instancing enabled more complete than 5.0's one at least), your plugin works just fine, although Rider gave me a warning saying the "IsPendingKill" function is deprecated and will probably not work on the next version and shouldn't be used.

The clean levels that started being World Partition work perfectly fine and the plugin doesn't cause a crash when loading the rooms, but the actors inside aren't loaded (you can see in the outliner all the folders, but they are all empty), this is something I've already experienced in the past in UE5 when trying to load a level dynamically from a blueprint, so I can say it's not your plugin at all doing this, but something in the way that UE5 world partition works.

Sorry for the long post, I will be doing further testing today on some of your suggestions, any discovery I make that could help your project I will bring back, I really like your plugin and I would like to see it be more robust and work with the "intended" new level system Epic is forcing down our throats.

Hello again,

I've tested what you suggested, a World Composition Level can be loaded dynamically with your plugin inside a World Partition master level. It works like a charm. This was tested in unreal 5.1 though, I will test in a clean project in unreal 5.0 in the afternoon over here.

It's not the ideal solution for us, because as I've said above, World composition is being phased out, even though is the default way levels are created, and it would work much better for us from the source control angle of things.

Thanks again for sharing your plugin, it's really a work of art and I couldn't be luckier to have found it, I really appreciate it!

I did more testing,

In UE5.0:

  1. Partition master, composition rooms works fine
  2. composition master, composition rooms works fine
    3,4) any master, partition rooms crash to desktop

In UE5.1:
(1) and (2) work fine
3) partition master, partition rooms, it shows that the map is generated, but the room contents are not spawned (probably a UE issue more than anything)
4) composition master, partition rooms, didn't test it as I didn't think it warranted any attention and make no sense in my mind

I will look at number 3 in UE5.1 after the new year, as I think there's probably something that can force the actors to spawn, or maybe it has to do with the autostreaming feature of world partition, regardless, i will look more into it.

Feel free to close this "bug" as it is no issue of your plugin and it's more on the side of Unreal Engine. If I come up with a solution to have word partition level rooms I can come by and leave a suggestion for a fix if you're interested.

Best Regards, and thanks for the response!

Hi ImBlackMagic,

First, thank you very much for all the testing you have done!

In fact, what you said about the deprecation of world composition is important for the plugin compatibility in the future.
The plugin is based on how the world composition is done (it is using the LevelStreaming class to load and unload the rooms).

So I guess I will need to convert that part of the plugin to work with world partition instead...

However, if you don't need to stream parts of your rooms, you can enable the One File Per Actor feature to be able to use it with world composition as well.

But currently, my plugin lacks of a real level streaming feature... So if you have large rooms and lots of rooms, it can have a really high impact on performances...

If your team updates the code of the plugin to add a streaming feature, I really appreciate if you share it here :)

Otherwise, I don't know if I will have enough free time and desire to actively develop new features for the plugin...

Best regards.

thanks for the recommendation on the one file per actor

on the level streaming topic, you can have a world partition type master level, (both in unreal 5.0 and 5.1) you can't have a world partition type room level though (5.0 crashes, 5.1 instances empty levels), but as you said, there's no point in the rooms being world partition per se.

You can probably add streaming volumes to the rooms and be done with the streaming thing (bigger than the actual room to account for proximity to load the whole room, or adjust the streaming volume sizes to account for very big rooms) and use composition type levels for everything.

We are probably not going to do any modifications to your plugin at this stage and try our best to use the stuff is currently available, I will still take a further look into why the actors are not loaded in 5.1 partition master partition room scenario during my free time as it's an issue I would like to see resolved (it's an unreal issue most probably, I will take a look at the level instancing documentation page, but I don't expect for it to help much), so if I have a breakthrough on that front I will come back and check in with you how to proceed.

Best regards, and thanks for the help!

Happy new year!

I've checked quickly the UE5 engine code of World Partition and it uses a derived class of LevelStreaming too.
I think there should be not very much to change in the code to be usable in a world partition master level.

Also, my plugin don't rely at all on World Composition. So it "should" be compatible with world partition.

I also saw in my code an obvious optimization for the culling system.
What i've done in 2019 was to get all actors in the bounding box of the room and enabling/disabling their visibility.
Maybe I could just use the visibility of the level instance instead.
However it will require sole changes to the plugin as the level script blueprints will not update anymore when the level is hidden, and the collisions and other things will disappear too...

When I will have some free time, I will work on that as it is a good optimization for the plugin.

Happy new year to you too!

Best regards.

thanks for the headups, looking forward to it.

On the world partition topic, these were my tests: (maybe I didn't say it very well above)
UE5.0

  1. World partition master, world composition rooms: works perfectly
  2. World composition master, world composition rooms: works perfectly
  3. world partition rooms: crash to desktop

UE5.1 (a warning popped up saying a function was going to be removed in the next version)
1 and 2 from UE5.0 work perfectly here as well
3) world partition rooms: doesn't crash anymore, but the rooms don't have any actors in them (empty levels, I know they are there in the editor because of your plugin gui). It doesn't matter what kind of master level I use, although I'm 100% sure the world partition master level doesn't crash anymore, I can't remember well on the world composition master level

Best regards.

Hi @ImBlackMagic

So, what did you do with your world partition issues?

You closed this issue, so I suppose you've managed to fix your issue in any way, right?
I would like to know, so I could had some explanation on the wiki, or fix some things in the code. 🙂

Best.

didn't fix it per se, world composition is still broken in that regard

we opted to use the experimental feature "One file per Actor" available in the editor settings, and then enabled "Use external actors" in the World settings of the level, which is basically what we needed to do since it allows multiple people to work on the same level using a tool like Perforce or Plastic (SCM that have a file locking feature so only one person at a time can make modifications, mostly for binary files like unreal assets), so if you have issues in that regard I would recommend giving it a look.

Maybe we can close it as "not planned" or "won't fix" for the foreseeable future, as we as a team probably won't fix this issue