* Batching the copy of textures to arrays didn't take into account the target slice
* shader variations cached for landscape mobile texture enabled / disabled.
#rb jonathan.bard
#jira UE-210377
[CL 32544804 by don boogert in ue5-main branch]
* 2 implementations for now : ULandscapeEditLayer (standard edit layer, that can be sculpted/painted) and ULandscapeEditLayerSplines (replaces the current "Reserved for Splines" edit layer system)
* The edit layers have a bunch of virtual functions to customize their behavior (affects heightmaps/weightmaps/visibility? contains persistent textures? can be edited via standard tools? supports collapsing? etc.)
* A composition pattern was used : FLandscapeLayer owns an Instanced ULandscapeEditLayerBase property (null not allowed) although the public "LandscapeLayers" list was deprecated in favor of a private "LandscapeEditLayers" in order to stop users being able to mutate the list of layers and their properties freely
* ALandscape::GetLayer was deprecated in favor of ALandscape::GetLayerConst in order to enforce a single, controlled, access to the layer data (via public methods), instead of the current free-for-all way
Landscape UX changes/improvements :
* Landscape edit layers are now added via a more standard '+' button (like standard array properties) and will then request the user to pick a class of edit layer (standard or splines for now, but any non-abstract edit layer class is discoverable) via a modal dialog. The type of the edit layer cannot be changed after the fact (the "Reserve For Splines" / "Remove Reserve for Splines" actions are therefore gone)
* Deletion of edit layer is done via a button or via context menu
* Edit layers context menu will now display all available options (instead of hiding some) but will disable the ones that are not available and will display the reason why that's the case in the tooltip (e.g. cannot rename a locked edit layer)
* The Collapse Layer action has been made available all the time (instead of only when the Manage panel is active) and now also supports collapsing the splines layer onto a standard layer underneath (but not the other way around), because it's supported, since the Splines layer does have standard heightmaps/weightmaps
* The edit layers have the ability to define custom actions generically, which will dynamically extend the context menu on that edit layer (the "Update Splines" actions on the Splines edit layer uses this system)
* Added a drag indicator on edit layers to streamline this reorderable list
Left to do:
* Move most settings from FLandscapeLayer to ULandscapeEditLayer and implement a generic system for responding to property changes in both the landscape and landscape UI, instead of exposing several ad-hoc functions (SetLayerName, SetLayerLocked, etc.) on the landscape and the landscape UI code (plus, it will allow to get those to react to changes to settings defined in an plugin's edit layer)
* Prevent useless heightmaps/weightmaps from being created on procedural edit layers that don't need persistent textures (water, landscape patch, etc.) This is a memory optimization : at least, we already prevent those to be edited, which is a common mistake with the current BP brush system, as users can sculpt/paint on a water edit layer, since it's a standard edit layer and they're allowed to
* Move the systems that act as proper edit layers (LandscapePatchManager, WaterBrushManager) from BP brush to the landscape edit layer class system
* Integrate proper icons for edit layer classes to help the user tell at a glance the type of layer (e.g. splines layer)
#jira UE-209960
#tests Editor
#rb don.boogert
[CL 32477586 by jonathan bard in ue5-main branch]
#rb jonathan.bard
#jira UE-209489
#tests I validated landscape grass instance placements are much more accurate in editor
#11613
[CL 32328086 by PetterVMC in ue5-main branch]
Compensates by scaling the FirstLevel VSM depending on the OrthoWidth being used, which has the added benefit of reducing performance for VSM LODs that are not required for Ortho passes. Added a LineTrace system for estimating the location when a ViewTarget is not selected.
Also removes the PostProcess disable setting that previously blocked EyeAdaptation from being applied to Lumen, so SkyLight etc shadows now resolve appropriately, resolving bugs that appear in editor debug views + minimaps.
Also switches Editor debug views to use ortho auto plane calculations/fixes a crash when zooming out. CVars also added for disabling these settings, or forcing different LODBiases in VSMs.
Refactored NearPlane updates to an easier to follow logic path and added compensation for ViewOrigin to ViewTargets.
#jira UE-206860, FORT-604328
#rb Laura.Hermanns, Andrew.Lauritzen
[CL 32322246 by jon cain in ue5-main branch]
Switched to FMemoryWriter64 for large landscape nanite caching
Adding a CVar to control when landscape nanite export is cached
Adding static lighting test map to LandscapeExtras terrain project
#rb jonathan.bard
#virtualized
[CL 32279194 by chris tchou in ue5-main branch]
This widget will host warnings or messages with the ability to automate actions for the user.
Current actionable messages:
* Invalid Landscape grassmaps, with associated rebuild action
* Invalid Landscape physical materials, with associated rebuild action
* Invalid Landscape nanite meshes with associated rebuild action
* Invalid grassmaps, physical materials, nanite meshes will be agregated to only one message if multiple rebuild are necessary
* Landscape proxy packages needs to be updated, with associated mark dirty action
#jira UE-204527
#rb Jonathan.Bard
[CL 32224398 by luc eygasier in ue5-main branch]
This widget will host warnings or messages with the ability to automate actions for the user.
Current actionable messages:
* Invalid Landscape grassmaps, with associated rebuild action
* Invalid Landscape physical materials, with associated rebuild action
* Invalid Landscape nanite meshes with associated rebuild action
* Invalid grassmaps, physical materials, nanite meshes will be agregated to only one message if multiple rebuild are necessary
* Landscape proxy packages needs to be updated, with associated mark dirty action
#jira UE-204527
#rb chris.tchou, jonathan.bard
[CL 32190792 by luc eygasier in ue5-main branch]
Removes package from ModifiedPackages when a package is dirty.
#rb chris.tchou, jonathan.bard
#jira UE-204527
[CL 32188912 by luc eygasier in ue5-main branch]
* Fixes XZ texcoord material node (data was getting stomped by lightmap UVs in nanite meshes)
* Speeds up nanite build step by manually calculating lightmap UV coordinates (30% faster on a 1k x 1k landscape)
* Fixes DDC cache key issue (was getting collisions on landscapes that got split into multiple nanite meshes), and re-enables DDC caching of the mesh description
#rb don.boogert
#jira UE-208189
#virtualized
[CL 32124074 by chris tchou in ue5-main branch]
Grass maps are not recalculated per-platform, so there's no reason to evict them when the feature level changes.
#jira UE-208555
#rb luc.eygasier
[CL 32103550 by chris tchou in ue5-main branch]
Previously, landscape info would grab DrawScale from the first registered Proxy that had a valid transform, and then issue warnings on any discrepancy with later registered Proxies. This is not really necessary as the transforms all get fixed up to match the main landscape Actor when both are registered, so the warning is removed.
However, the DrawScale is grabbed somewhat incorrectly. If we first register a streaming proxy that has incorrect scale because it was never updated, then it will lock onto the incorrect value of DrawScale. The code was changed to prefer the Actor DrawScale over any streaming proxy DrawScale.
Also fixed an issue with the PropertyChanged code pertaining to the scale, that would spuriously issue warnings if you pasted a scale with mismatched signs on X and Y.
I think ideally we would get rid of the DrawScale cached value, as I don't see the value in caching it over computing it. But it is used in many places, so is a large change to deprecate.
#rb jonathan.bard
[CL 32020449 by chris tchou in ue5-main branch]
-Added a new type of mappping, FLandscapeStaticLightingGlobalVolumeMapping (akin to FStaticLightingGlobalVolumeMapping) that makes Lightmass use the exported Landscape mesh as a surface for caching but then discards the lightmaps
#rb jonathan.bard
#jira UE-194661
[CL 31818485 by dominic couture in ue5-main branch]
1021x1021 landscape nanite build:
original, no cache: 40.6 s
original, nanite cache only: 16.5 s
with added static mesh cache: 6.6 s
#rb jonathan.bard
#jira UE-205347
[CL 31774789 by chris tchou in ue5-main branch]
The GPU Readback will never return IsReady() within a loop in a single frame, so we must force it to complete anyways.
I chose to just have it force a completion after 5 ticks, which is just a simple metric that should keep it from being hit in the amortized case (readbacks come back in 3 ticks at most), but will quickly get hit in the BuildNow() case.
#rb jonathan.bard
#jira UE-207360
[CL 31744046 by chris tchou in ue5-main branch]