PolyTerrain debugging

When Preview, bake, or Play misbehave, confirm Registry gates first, then use Outliner timing, Build To, and the ImGui diagnostics panel.

ImGui diagnostics

  1. Set /O3DE/PolyTerrain/DebugOverlayEnabled to true (and Enabled).
  2. Open ImGui → Poly Partition Diagnostics (requires ImGui Gem).

Typical columns: per-section last eval ms, ContentHash, pending dirty AABB, Build To layer, eval path (CPU / GPU when GPU Preview is used).

Outliner also shows last eval ms and ContentHash tooltips without ImGui.

Build To and incremental Preview

ToolUse
Outliner Build ToTruncate Preview to a Priority Layer while iterating
Rebuild PreviewSynchronous full (or Build To) refresh; invalidates in-flight GPU / async jobs
PreviewRebuildBudgetMsRaise slightly if dense sections feel sticky; prefer Refine-only dirty regions
GpuPreviewEnabledFaster Sculpt Preview only—never changes bake

Dirty rebuilds may run on AZ::Job and publish one frame later. Explicit RebuildPreview stays synchronous.

Constraints and budgets

TopicGuidance
Preview strokeTarget ≤ ~1.5 ms budget (PreviewRebuildBudgetMs); overflow goes async
Section spanPrefer ≤ ~2 km per section
Preview verticesCap via MPD Preview max complexity (default design target ~256 K)
Compiled / collisionVariant and Collision Transformer budgets (e.g. collision ~16 K tris)
DeterminismCPU evaluator is ContentHash authority; GPU Preview may differ slightly

Troubleshooting

SymptomLikely causeWhat to try
No Poly Terrain Mode menuRegistry offSet Enabled and EditorModeEnabled; restart editor
Modifiers do nothingWrong layer / targetLayers must match MPD names; check m_targetPartition and Outliner order
Preview slowSection too denseRaise budget, Refine only dirty areas, Build To, or enable GPU Preview for eligible Sculpt
Bake skipped / staleAP not running / hashConfirm AssetProcessor; force non-incremental only if needed; check MPD pipeline
Seam cracks after RefineExpected at displaced bordersSkirt Transformer; keep Shared border verts locked on Coarsen
Heightfield + mesh fightDual collidersSync Bridge exclusion; blend band; avoid dual physics owners on the same XY
VT / trails blankVtEnabled false or no volumeEnable VT; assign .vt; cover with VT Volume + Box Shape
PIE missing terrainNot baked / not in cellBuild Compiled Sections; confirm PrefabProcessor / WS cell membership
Boolean no holeNon-watertight / failed CSGFix operand topology; check editor warnings; weights need re-paint after Boolean
Paint looks wrong after BooleanWeights clearedMove WeightPaint above Boolean; re-paint
PCG Write no-op at runtimeGate / missing componentPcgRuntimeExecutionEnabled; pre-place PCG Write / Patch / MeshProjection components
Weight stamp ignoredGate / non-authorityRuntimeWeightRewriteEnabled; clients cannot Submit when Multiplayer authority is server

Limits reminder

  • Not a TerrainDataRequestBus provider—use GetUnifiedSurfacePointD or compiled mesh / SurfaceData.
  • Gem enable ≠ edit mode ≠ VT ≠ weight rewrite (separate keys).
  • Section entities are not net actors; only weight overlays replicate with the Multiplayer submodule.

Next steps


Copyright © 2026 DawnEngine. All rights reserved.

DawnEngine is a commercial 3D engine distributed under the DawnEngine end-user license agreement. Engine binaries and source are proprietary and are not covered by the licenses below.

Documentation only: the prose and templates on this site are a derivative work of Open 3D Engine (O3DE) documentation by the O3DE Contributors, used under CC BY 4.0 (documentation content), Apache 2.0 (site code), and the MIT license (inline code samples).

The open-source 3D engine that DawnEngine is built on top of is Open 3D Engine . DawnEngine is not affiliated with, endorsed by, or sponsored by The Linux Foundation or the O3DE project. “O3DE” and “Open 3D Engine” are trademarks of The Linux Foundation.