Browse Source

docs: add 'Editor Viewport'

Daniele Bartolini 6 days ago
parent
commit
2836d0b8e4

BIN
docs/level_editor/images/box_selection.png


BIN
docs/level_editor/images/grid_size_dialog.png


+ 55 - 0
docs/level_editor/images/local_world_axis.svg

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   version="1.1"
+   id="svg1"
+   width="54"
+   height="140"
+   viewBox="0 0 54 140"
+   sodipodi:docname="local_world_axis.svg"
+   inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <defs
+     id="defs1" />
+  <sodipodi:namedview
+     id="namedview1"
+     pagecolor="#ffffff"
+     bordercolor="#000000"
+     borderopacity="0.25"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     inkscape:zoom="5.8184787"
+     inkscape:cx="15.639827"
+     inkscape:cy="72.183817"
+     inkscape:window-width="2560"
+     inkscape:window-height="1368"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g1" />
+  <g
+     inkscape:groupmode="layer"
+     inkscape:label="Image"
+     id="g1">
+    <image
+       width="54"
+       height="140"
+       preserveAspectRatio="none"
+       xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAACMCAYAAAA3FFrOAAAAAXNSR0IB2cksfwAAAARnQU1BAACx&#10;jwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAABJRJREFU&#10;eNrtnD9MG1ccgD+fsYlPgBpaJbKIlEZCSNgGWwXWwNIAW5Zkid0hDKRj10pBmaIMHZpMzpB2wKkC&#10;HWjoEJGpUqVCKqdGxrhCgqWBGiElITZcyh9zHVBcU7AbuLPP7/q+yb73fPf7/Hv37u75+Tl6enp0&#10;bIhidQBSTIpJMTGRYqIhxURDiomGFBMNKSYahsWCwU7C4WtWe5gv1tHRQSQSttrDfLFaRYqJhhQT&#10;DSkmGlJMNKSYaNhWrM7oDjo7OwGYmnpyZHl//6AlYrbNmBQTDSkmGoZ7xf+iVG9ZjtHRGLHYQ2vF&#10;Zmamy5Ynk8lj73Nubs5oWDjkrAHBkGKiIcVEQ4qJhhQTjbK3VNlsFk3T2NvbszrOAyiKgqqqNDU1&#10;HV8sm82yubmJoig4nU6rXQ6xsbEBUFKuZFPUNA1Fqd2W6nQ60TStZHnJyGut+R03xtpNiUGkmGhI&#10;MdGQYqXo7u7ixo1hqz0qIdZtT7FaxbZidbr+z7Ciw+GwOh7TsG/GKn2Ach1LPB4nHn9eGbFKN79y&#10;YtEoFROzbVOUYqIhxUTDtmIVv46FQp9YImbbjEkx0ZBiomFarzg7+5tpQUWj94lG71srFo/HiUZN&#10;cyrs0ygmiD2v2KOHEWx7jkkx0ZBiovH/E6vlH9bfJ8aSJaqqks/nrY69JPl8HlVVS5aXvEC/mz9R&#10;qxNYGhoaTjaB5Z1cuQ/XMrV/IkkxKSY2Ukw0pJhoSDHRkGKiIcVEQ4qJhik/Sny4tcVgJoP/zRsa&#10;d3Z4WV9PvLmZp14vWxaNnRj+V217Nsvw4iL1R4yPrKgqd9vayLlcVRcz9HV+tLVVUgqgRdP4YmGB&#10;xp0dscQGMpmC1OqpU3zV3s6XwSA/nzlTqON9+5YrL15UfS6kITH/+nrh9eiFCyw1NPDa7ea78+d5&#10;6vUC8IeqMjs4yL17X9Pc3Fw1MUOdR+PubuH1K7f7QNnEuXO8drnI9fYycuc2Ho+HS5c+5dGjsaqI&#10;GcpYscxAJnOo/KezZ/H1dOPxeJic/JGxsfGqSAE4W1pabp30w027u7TmcgB8vLlJna6z8K9xyGQy&#10;ydLSEhMTP1A8/7jSGMrYlNfLStEw80AmQ9/a2qF609MzVZUyLPaXonC3rY0/PR4AllWV3MWLNbGm&#10;qaGmCLDtdJI4fZoPtrf55fJlbt65TVdXF4uLiywvrxyqHwgE6OvrZX4+Xdh29eoVHA6FtSOyfVJM&#10;ud/JuVx829rKZ58P4/F4ePx4kmfPfj2ybigUZGjo+oFtQ0PXCYWCpkmBiRNYdF1nZOQWAwP9jI2N&#10;V/2cqpgYwPr6+pHXqUAggM/XDoDf7wf2m18xfr+/sC2d/p1UKmUolqosLROJhI/VocRiDxkdjdW+&#10;WDHh8DUikfCBNeGmpp6YsrJRMbZ90LStmG3PsYrP4gZIpVKMj38PgM/nIxDwF97Dfg+ZSs2TTqcL&#10;9Y1SFbFEYpZEYhbY7zwCAT8PHnxzQCyRSMjO430wfK947AM6nbx8+aqQQQC3200ymWR1ddW048i1&#10;30RDiomGLcV0XbenGNg0Yw6Hw55iYNOM2Vrsb4I/WE/W+cdLAAAAAElFTkSuQmCC&#10;"
+       id="image1" />
+    <rect
+       style="fill:none;stroke:#ff0000;stroke-width:4;paint-order:stroke fill markers"
+       id="rect1"
+       width="48.466278"
+       height="90.401634"
+       x="2.7498598"
+       y="2.921726" />
+  </g>
+</svg>

BIN
docs/level_editor/images/move_rotate_scale.png


+ 55 - 0
docs/level_editor/images/relative_absolute_snap.svg

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   version="1.1"
+   id="svg1"
+   width="53"
+   height="145"
+   viewBox="0 0 53 145"
+   sodipodi:docname="relative_absolute_snap.svg"
+   inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <defs
+     id="defs1" />
+  <sodipodi:namedview
+     id="namedview1"
+     pagecolor="#ffffff"
+     bordercolor="#000000"
+     borderopacity="0.25"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     inkscape:zoom="3.9724138"
+     inkscape:cx="1.0069444"
+     inkscape:cy="83.576389"
+     inkscape:window-width="2560"
+     inkscape:window-height="1368"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g1" />
+  <g
+     inkscape:groupmode="layer"
+     inkscape:label="Image"
+     id="g1">
+    <image
+       width="53"
+       height="145"
+       preserveAspectRatio="none"
+       xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADUAAACRCAYAAABja/CIAAAAAXNSR0IB2cksfwAAAARnQU1BAACx&#10;jwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA8RJREFU&#10;eNrtnEFyokAUhn8gm2D0ALlDNKCeZsw6HmOO4aw1Z5jKbrLH6VTlDqnKNhqzkp6FRQa1G8UW6Nd5&#10;3yolTXif3fSDFp43HA4lHMNvOgCWMpGKoqjpuIy4cElmSyovI4RoOiZzqaLeeX9/x+fnJ9brddNx&#10;bhEEAcIwRLvdVm738lN6JiiEwGKxwHK5hO/bOZekaYqrqyul2FbEQggIIRBFEVarlbVCAOD7Plar&#10;lXqb6kMhhHVDToUuRnu7wgCWogJLUYGlVAwGfYzH97W0qVFqcETA52lzLJ7uzvf19RVBEBTu/Pz8&#10;9yxB7DKZ/MJk8utgu/V6jevr673PLw7ueeDg/X4fw+GgMIiybZIkMfpSjHoKAMbje4zH97i9jStv&#10;s4uqp6IoMuspm8jfYZCXystkkJdS3alXJpWdI3nys2WZc6csfEVBBU6+qoPrEmv2edG+qvZWJ1/V&#10;RJFH1940+QIOnFOqdcvKpvQkSTCZbP4+5trvVLIlvezviqXmSJI5gM3QqkoqL5bJkR9+ebGsp5yR&#10;yss5JwVw8lUfnO98a7jzPYtUkzh7RaGCpajAUlTYy1PZReHb21vTsR1ENzt/Se1evodhaP0jB61W&#10;Sy2lWgwEgHa7DSmltQ+HtFotdDodtZRKKKPT6Wh3tJnA9/2fTQdxbuw8YViKpejCUlRgKSoYS/V6&#10;XYxGP2ppU5vUzc0N7u5GtbQ5Fs/kXY/Hx99nCWKX6XSG2ezh5P2N1v2m0xm63S56vS6m05m2Xdk2&#10;Ly8vRl+KkdRs9oDRaHM+FH2z52pzLDz7UcE5KScfuAIceDYpL1T5b751Cu2usbiffKWU8Dyv1MGt&#10;Tr5SytJinHxr5EuqzLCzna1zyhUxt4efSzgp5Wby1f0+dezBrUy+mcwpcrYm373hZ9JztrA3UVCW&#10;0Uq5IObklM5SVGApKrAUFZysm7QnRV0IKHg0jjJGtx62cuGSTMb3mf2oU/irB9VaZHtr6cBmUXOx&#10;WODj4wO+71v5zsdyuQSAw7XI8oJO1CLLLzl7nmfdkFOhi5HX0qnAUlRwTkpKSV8quyCXUn7l2lpq&#10;kVVJ9t58HP9/67SWWmR1iAkhEMcx4jim/8TLrhzg4ETBUpRgKSo4KeXUlO5c4RouWmg7qsVYZ4Zf&#10;HuOe6vf7APSVeaqsuKjDyZ5iKSqwFBUqz1On1Cs7thZZZVJPT38Kt8/n89L/s/FaZE3CZbuow1JU&#10;YCkqaKVsn86LYtRKhWGINE2bjltLmqa4vLxUbtNeUZCvRaaDai2y7zVRUIalqPAP2tIV9TMa55AA&#10;AAAASUVORK5CYII=&#10;"
+       id="image1" />
+    <rect
+       style="fill:none;stroke:#ff0000;stroke-width:4;paint-order:stroke fill markers"
+       id="rect1"
+       width="48.081596"
+       height="89.869789"
+       x="2.5173612"
+       y="2.5173612" />
+  </g>
+</svg>

BIN
docs/level_editor/images/selected_cube.png


BIN
docs/level_editor/images/selected_sphere_occluded.png


+ 56 - 0
docs/level_editor/images/toolbar_snap_to_grid.svg

@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   version="1.1"
+   id="svg1"
+   width="53"
+   height="149"
+   viewBox="0 0 53 149"
+   sodipodi:docname="toolbar_snap_to_grid.svg"
+   inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <defs
+     id="defs1" />
+  <sodipodi:namedview
+     id="namedview1"
+     pagecolor="#ffffff"
+     bordercolor="#000000"
+     borderopacity="0.25"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     showgrid="false"
+     inkscape:zoom="3.8657718"
+     inkscape:cx="15.520833"
+     inkscape:cy="68.809028"
+     inkscape:window-width="2560"
+     inkscape:window-height="1368"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g1" />
+  <g
+     inkscape:groupmode="layer"
+     inkscape:label="Image"
+     id="g1">
+    <image
+       width="53"
+       height="149"
+       preserveAspectRatio="none"
+       xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADUAAACVCAYAAAD4+rKeAAAAAXNSR0IB2cksfwAAAARnQU1BAACx&#10;jwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAABL1JREFU&#10;eNrtnD9MW0ccgD/b2MRPgBpaJTJESiMhJGxTWzWsgaUBtizJErtDGEjHrpWKMkUZOjSZyJB2sFMF&#10;OtDQISJTokpNU0FNbOMKCZYGMEJKQgw45Y9xB4plgk1qP9vPd71vst/ds+/z3f3es+93NnV3d2eQ&#10;DLPRDVBSSkoypJSqK1SQTCZJpVLs7e0Z3cZDmM1mNE2jqampOKlkMsnm5iZmsxmLxWK0xxE2NjYA&#10;CorlHX6pVAqzuXZHpsViIZVKFSzP2/JaG3LFtrF2u0MHSkoUlJQoKKl36eryce3akNEO5Zbqkk+q&#10;VlFSoqCkREFJiYKSEgUlJQpSStXpOdnn8wEwM/NH3nKv91NDpKTsKSUlCkpKFHRFv/dRKCoex8jI&#10;HUZG7hgn9eTJ42PLp6eni37NqakpXUIApnyr88vLyzW5hJNLOp2mpaUlb5mUc0pJiYKSEoX/j1Qt&#10;L2L/lzbmLdE0jXQ6bXS7C5JOp9E0rWB53juKg/yEWk0OaWhoKD455EDsuBNrmdqfPEpKZqlMRroU&#10;2v2ekk1MzuEHYDKZjG5HeaVkE4J/L765c0oGSV1zyuP5BL//itEO5ZXq7OwkEPAb7XCEOpBjyOUi&#10;b0iXDSmlKvpb+nGRMRqN8vx5RDyp4yJjMBiqmJSUw09JiYKSEgUppSoa0vv6BgyRkrKnlJQoKClR&#10;KEv0m5x8WLYGBYMhQqF7xklFo1GCwVDZhA5eUy8m9X8UgqCkREFJiYKSEgUlJQpKShSUlCgoKVFQ&#10;UqKgpERBSYmCkhIFJSUKUkrpXiD4cGuLgUQC15s3NO7s8LK+nqnmZh45HGwZtLtH12/pHckkQ/Pz&#10;1OfZwbOkadxqb2fdaq26VMkf5UdbWwWFAFpTKb6cm6NxZ0ccqf5EIiu0cuIE33R08JXHwy+nTmXr&#10;ON6+5dKLF1XP/CxZyrW2ln0cPHeOhYYGXtts/HD2LI8cDgD+0jRmBga4fftbmpubqyZVcqBo3N3N&#10;Pn5lsx0qGz9zhtdWK+s9PQzfvIHdbufChc+4f3+0KlIl91SuSH8icaT88enTOLu7sNvtTEz8zOjo&#10;WFWEACytra3XSzmxaXeXtvV1AD7e3KQuk2HunZ1xkUiEhYUFxsd/quommZJ7atLhYClns2N/IkHv&#10;6uqRek+f/lb1XT8lS/1tNnOrvZ1lux2ARU1j/fz5mthRUPLwA9i2WAifPMkH29v8evEiX9+8gc/n&#10;Y35+nsXFpSP13W43vb09zM7Gs8cuX76EyWRmNU8vl4ru+5h1q5Xv29r4/Ish7HY7Dx5M8OzZ73nr&#10;er0eBgevHjo2OHgVr9dTNiEoU3JIJpNhePg6/f19jI6OGb5zrmz5fmtra3mvQ263G6ezAwCXywXs&#10;D7lcXC5X9lg8/iexWExXWyqeHBII+IsKHqHQPd1ZNFXNePH7rxAI+A9lbE5OPixLPlIuUn5JlFJK&#10;yjlV0WxngFgsxtjYjwA4nU7cblf2OexHwlhslng8nq2vl4pLhcMzhMMzwH6gcLtd3L373SGpcDis&#10;AsX70HXvV/SbWSy8fPkq23MANpuNSCTCyspK2d5HZWaKgpISBSUlCkpKFJSUKCgpUVBSoqCkREFJ&#10;iUJVpDKZTFUXDf4BROtl1RowWMQAAAAASUVORK5CYII=&#10;"
+       id="image1" />
+    <rect
+       style="fill:none;stroke:#ff0000;stroke-width:4;paint-order:stroke fill markers"
+       id="rect1"
+       width="47.597221"
+       height="50.960068"
+       x="2.5868056"
+       y="95.453125" />
+  </g>
+</svg>

+ 1 - 0
docs/level_editor/index.rst

@@ -14,3 +14,4 @@ Console.
 	:maxdepth: 2
 
 	level_editor
+	level_viewport

+ 3 - 3
docs/level_editor/level_editor.rst

@@ -1,8 +1,8 @@
 .. _level_editor:
 
-=====================
-Level Editor overview
-=====================
+===============
+Editor overview
+===============
 
 After opening a :ref:`project` Crown immediately starts compiling the
 resources it contains. Once the process is complete, the Level Editor is

+ 200 - 0
docs/level_editor/level_viewport.rst

@@ -0,0 +1,200 @@
+==============
+Level Viewport
+==============
+
+This section describes how to navigate the Level Viewport so you can inspect,
+edit, and compose scenes comfortably. The viewport supports both quick,
+mouse-only navigation for casual inspection and more precise, keyboard-plus-
+mouse controls for editing and layout work.
+
+Basic mouse navigation
+======================
+
+If you only need a quick look around, the mouse provides simple and immediate
+controls. Rolling the mouse wheel zooms the camera in and out. Clicking and
+dragging the ``Middle Mouse Button`` orbits the view around the current
+interest point. The orbit center typically coincides with the last framed
+selection, so framing an object first (see the :ref:`Framing objects`
+section) gives you a predictable pivot for orbiting.
+
+Keyboard + mouse navigation
+===========================
+
+For more controlled camera adjustments, combine keyboard modifiers with mouse
+actions.
+
+* Hold ``Left Alt`` while dragging with the ``Left Mouse Button`` to rotate
+	around the interest point;
+* Hold ``Left Alt`` and drag with the ``Middle Mouse Button`` to pan the view
+	horizontally and vertically;
+* Hold ``Left Alt`` and drag with the ``Right Mouse Button`` to zoom in and
+	out.
+
+Flythrough navigation
+=====================
+
+When you need to traverse the level at speed, use flythrough mode. Hold the
+``Right Mouse Button`` to control the camera orientation with the mouse, then
+use the keyboard to move the camera as if you were playing a first-person
+game:
+
+* ``W`` / ``S`` to move forward and backward;
+* ``A`` / ``D`` to strafe left and right;
+* ``Q`` / ``E`` to move the camera up and down.
+
+Flythrough mode is handy for scanning large environments, testing sightlines,
+or checking level flow at player height.
+
+Selecting objects
+=================
+
+Selecting objects is the primary way to focus edits and transformations on
+specific objects in the scene. Left-click an object to select it; a dim
+orange outline will be drawn around selected objects in the viewport:
+
+.. image:: images/selected_cube.png
+
+If a selected object is occluded by unselected ones, Crown still highlights it
+with a slightly dimmed orange outline so you can keep working with it even
+when it is not fully visible:
+
+.. image:: images/selected_sphere_occluded.png
+
+To clear the current selection, just left-click an empty area or press
+``Shift + Ctrl + A``.
+
+Multiple selection
+------------------
+
+Hold ``Left Shift`` while left-clicking to add unselected objects to the
+current selection. Conversely, left-click an already selected object to
+remove it from the selection.
+
+To select multiple objects by area, left-click and drag to draw a selection
+rectangle; any object that intersects that rectangle will be selected.
+
+.. image:: images/box_selection.png
+
+Framing objects
+===============
+
+Framing centers and zooms the camera on selected objects so you can work on
+them with a consistent viewpoint.
+
+Select one or more objects and press ``F`` to frame the current selection; the
+camera will pan and zoom so the selected objects fill the viewport
+comfortably. Press ``A`` to frame the entire scene.
+
+Framing is especially useful before orbiting or when you want to set a stable
+interest point for subsequent camera manipulations.
+
+Placing objects
+===============
+
+Place content into the scene by entering place mode or by dragging units from
+the Project Browser.
+
+Press ``Q`` to enter place mode; the cursor then becomes a placement tool and
+a chosen unit can be spawned with a mouse click. If no unit is selected for
+spawning, clicks have no effect. At any time, press ``Esc`` to exit placing
+mode: Crown will enter the tool that was active before entering place mode.
+
+Dragging a Unit directly from the Project Browser into the Level Viewport
+automatically selects the Spawn tool and sets the dragged unit as the current
+spawn candidate.
+
+Click the ``Left Mouse Button`` to place the unit. By default Crown raycasts
+from the camera origin through the mouse cursor to determine the Z height
+where the unit should be positioned. If you click and hold the ``Left Mouse
+Button``, then move the mouse, Crown will place the unit at any XY location
+on the horizontal plane defined by the height where you first clicked. This
+lets you position objects precisely along a fixed elevation.
+
+Moving, rotating, and scaling objects
+=====================================
+
+Transform objects with the standard ``W``, ``E``, and ``R`` keys to enter
+Move, Rotate, and Scale modes respectively.
+
+When one or more objects are selected, Crown displays a transform gizmo at the
+origin of the selection. The gizmo provides axis handles, planar handles and
+a camera-aligned handle. Interact with the gizmo using left-click and drag.
+
+.. image:: images/move_rotate_scale.png
+
+Move gizmo
+----------
+
+* Left-click and drag an axis handle to move the object along that axis.
+* Drag the small red, green, or blue rectangles to move the object constrained
+	to the XY, YZ, or ZX plane respectively.
+* Drag the small gray circle at the gizmo origin to move the object on the
+	plane parallel to the camera view.
+
+Rotate gizmo
+------------
+
+* Drag any red, green, or blue arc to rotate the object around the X, Y, or Z
+	axis.
+* Drag the large gray circle to rotate the object around the axis that is
+	perpendicular to the camera view plane.
+
+Scale gizmo
+-----------
+
+* Drag an axis handle to scale the object along that axis.
+* Drag the colored rectangles (for example red-green to scale on the XY plane)
+	to scale across the respective plane.
+* Drag the large gray circle to scale uniformly on all axes at once.
+
+Local and World axis
+--------------------
+
+Normally, gizmo axes are aligned to the local coordinate system of the
+selected object. That makes transforms intuitive when you want to move,
+rotate, or scale an object relative to its own orientation. However, when an
+object is rotated inconveniently, local axes can make it difficult to perform
+edits that must align to the scene or the world origin.
+
+Switching to the ``World Axis`` mode forces all gizmos to align to the world
+coordinate system regardless of the selected object's local transformations.
+
+Toggle axis mode using the Local/World Axis control in the toolbar:
+
+.. image:: images/local_world_axis.svg
+
+Snapping
+========
+
+By default Crown lets you position and rotate objects freely. When you require
+precision, enable grid and angle snapping to constrain transforms to fixed
+increments. Toggle snapping by clicking the ``Snap To Grid`` button on the
+toolbar:
+
+.. image:: images/toolbar_snap_to_grid.svg
+
+With snapping enabled, movement and rotation will snap to the configured grid
+size and snap angle. Hold ``Left Ctrl`` while performing a transform to
+temporarily disable snapping and make a single free adjustment.
+
+Change the grid cell size or the snap angle with ``Ctrl+G`` and ``Ctrl+H``
+respectively. These shortcuts open dialogs where you can type exact numeric
+values for the grid spacing and angle increment:
+
+.. image:: images/grid_size_dialog.png
+
+Relative and Absolute snapping
+------------------------------
+
+Crown offers two snapping coordinate modes. In Relative Snapping mode the
+snapping grid origin is aligned to the origin of the object being
+transformed; this makes the grid move together with the object and is
+convenient for local adjustments.
+
+In Absolute Snapping mode the snapping grid is fixed at the world origin,
+which is useful for aligning multiple objects to a common global grid.
+
+Switch between the two modes using the ``Relative Snap`` and ``Absolute Snap``
+toolbar buttons.
+
+.. image:: images/relative_absolute_snap.svg