Skip to content

Commit c1a1829

Browse files
AlexZ005claude
andcommitted
[docs] 1.6.0: units, duplicate, touch tools, element box select, workspace, graph lists
- units.md (new, in the nav): the global setting, the typed suffixes, and the three things a unit deliberately does NOT change - stored values, the feel of a drag, and what your peers see - controls.md: selecting without a keyboard (the touch cluster and the Multi-select mode), a Duplicating section with a table of what a copy brings, and numeric fields now covering node/shader/animation cards plus typed units - mesh-editing.md: Shift/Ctrl-drag box select in all three element modes - saving.md: what a restore brings back, and why a plain reload starts clean - node-system.md + shader-graph.md: the Flows / Shaders list in the left pane - module-sdk.md: registerPostEffect and registerPostBackend, including why post is a separate registry from shader (an Effect is not a Material) and what a peer without the module sees Built with --strict. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 099864b commit c1a1829

8 files changed

Lines changed: 163 additions & 0 deletions

File tree

docs/controls.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ How to move the camera, select and transform objects, and find every keyboard sh
1818
- **Shift+click** adds or removes objects from a multi-selection (the last-picked object is the primary).
1919
- **Shift+drag** on empty space draws a box-select marquee.
2020
- **Ctrl+A** selects everything in the scene. Inside a mesh editing session it keeps its other meaning — select every face, edge or vertex — so the two never collide.
21+
- **Ctrl+D** duplicates the selection — see [Duplicating](#duplicating) for what a copy brings with it.
2122
- Selecting an object **locks it for other peers** (one lock per person); a locked object shows who holds it, and its right-click menu offers **Request control** to ask for a handover.
2223

2324
### What double-click does
@@ -33,6 +34,43 @@ An object scaled — or animated — down to almost nothing has no surface left
3334
!!! note
3435
At *exactly* zero scale the viewport click does not reach it yet; select it from the object list instead. That one is a known gap.
3536

37+
### Selecting without a keyboard
38+
39+
On a phone or tablet there is no <kbd>Shift</kbd> to hold and no right-click, so the same
40+
two gestures are available as a **mode**. *Settings ▸ Interface ▸ Touch tools* puts round
41+
**Undo**, **Redo** and **Multi-select** buttons beside the logo — on by default on phones
42+
and narrow windows.
43+
44+
With **Multi-select** on:
45+
46+
- a **tap adds** to the selection instead of replacing it, and
47+
- a **drag on empty space** draws the box-select marquee.
48+
49+
It works the same inside a mesh editing session, on vertices, edges and faces. Everything
50+
else already has a touch path: long-press the viewport for the right-click menu, and the
51+
**+** button opens the same create menu.
52+
53+
### Duplicating
54+
55+
**Ctrl+D** (or right-click ▸ *Duplicate*) makes a working copy. A copy is a copy of
56+
everything that belongs to the object, not just its shape:
57+
58+
| Comes along | |
59+
|---|---|
60+
| geometry, transform, children | always |
61+
| material and its texture slots | always, as its own detached copy |
62+
| physics, origin, camera settings | always |
63+
| **animation clips** | yes — the copy plays its own |
64+
| **object flow graph** | yes, with fresh node ids |
65+
| **shader graph** | yes — otherwise the copy would render frozen |
66+
67+
An embedded **Object Flow** node inside a copied graph keeps pointing at the object it
68+
referenced. Re-aiming it at the copy is a decision only you can make, so it is left alone.
69+
70+
Each of the last three can be switched off in *Settings ▸ Scene ▸ Duplicate* if you would
71+
rather a copy came out bare. An object that inherits the **scene default** shader keeps
72+
inheriting it — it does not get a private snapshot.
73+
3674
### Editing a multi-selection
3775

3876
The properties panel edits **everything you have selected**, not just the last object you clicked. Change a colour, a material, a shadow flag or a physics setting and it applies to the whole set as a **single undo step**; a row whose objects disagree shows a dash until you set it.
@@ -67,6 +105,13 @@ The origin travels with the object: it replicates, saves, undoes, and is baked i
67105

68106
Every number in the app is the same control: **drag** it to scrub, or **type** into it for live updates. <kbd>↑</kbd>/<kbd>↓</kbd> step by one unit — hold <kbd>Ctrl</kbd> for ×10, <kbd>Shift</kbd> for ×100 — and <kbd>Esc</kbd> reverts what you typed.
69107

108+
That includes the numbers inside **node editor cards**, **shader nodes** and the
109+
**animation window** — dragging one of those scrubs the value without dragging the card.
110+
Scrubbing an animation key or a shader parameter is **one undo step**, not one per pixel.
111+
112+
Fields that hold a distance or an angle also accept a typed **unit** (`12cm`, `4in`,
113+
`90deg`) — see [Units](units.md).
114+
70115
### Floating windows
71116

72117
The toolboxes, the Explorer, the flow and animation windows and the panels all behave the same way: drag the header to move, drag the bottom-right corner to resize. A window can never be sized past the edge of the screen — the resize corner always stays reachable — and **double-clicking** the corner resets it to its default size while leaving it where you parked it. Size and position are remembered per window.

docs/mesh-editing.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ Each mode remembers its own selection, so you can hop between them without losin
4444
### Selecting
4545

4646
- **Click** an element to select it; **Ctrl+click** adds to the selection.
47+
- **Shift+drag** or **Ctrl+drag** draws a **box** — every vertex, edge or face inside it joins the selection. Works in all three element modes, and a box always takes whole faces (never half a quad). An empty box changes nothing, so a stray drag cannot wipe your work.
4748
- Selection **commands** appear as words in the *Select* row — they change what is picked, never the geometry:
4849

4950
| Command | Modes | What it picks |

docs/module-sdk.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,43 @@ api.registerFrameTask((time) => { /* every frame, synced seconds */ });
106106
api.registerMenu('Open my panel', () => { /* button on your manager card */ });
107107
```
108108
109+
#### registerPostEffect
110+
111+
The [scene look](post-processing.md) stack is a registry too, so a module can add an
112+
effect a user can then add to the scene like any built-in one:
113+
114+
```js
115+
api.registerPostEffect('bloomier', {
116+
label: 'Bloomier',
117+
group: 'camera',
118+
params: [{ name: 'amount', type: 'number', default: 0.5, min: 0, max: 2 }],
119+
make: (params, ctx) => new SomeEffect({ intensity: params.amount })
120+
});
121+
```
122+
123+
Your kind is **namespaced** to your module, so two modules cannot collide. If your
124+
module is later disabled — or the scene is opened by someone who never installed it —
125+
the authored effect is **kept in the stack and skipped**, not deleted, and it starts
126+
working again the moment the module is back. That is deliberately the same behaviour in
127+
both cases: a peer without your module is in exactly the position of a user who turned
128+
it off.
129+
130+
#### registerPostBackend
131+
132+
For a whole *compiler* rather than a single effect — something that turns a shader
133+
description into an effect:
134+
135+
```js
136+
api.registerPostBackend('fancy', 'Fancy compiler', (spec, ctx) => {
137+
// spec: { fragment, uniforms, readsDepth, blend } -> return an Effect
138+
return buildEffect(spec);
139+
});
140+
```
141+
142+
This is separate from `registerShaderBackend` on purpose: a **shader** backend returns a
143+
*material* and a **post** backend returns an *effect*. An unknown key falls back to the
144+
built-in compiler rather than failing, and the document keeps the key it asked for.
145+
109146
#### registerUnwrapBackend
110147
111148
The [UV editor](uv-editor.md)'s **Unwrap** menu is a registry, so a module can add

docs/node-system.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,17 @@ The Flow editor is a visual node graph that drives scene behavior — animation,
66

77
Press <kbd>N</kbd> or use the flow icon in the bottom hud. The editor docks at the bottom (tabbed with the [Explorer](explorer.md) when both are open) and can be undocked to float.
88

9+
## The Flows list
10+
11+
The left pane carries a collapsible **Flows** section above the node palette. It lists
12+
**Scene** at the root, then every object that actually has a flow graph of its own — it is a way
13+
to get *to* a graph, not a second object list, so an object with none is not in it.
14+
15+
Click a row to select that object and switch the editor to its graph; click **Scene** to
16+
deselect and edit the scene-wide one. Drag the bar under the list to give it more room, and
17+
click the section header to collapse it. An entry whose object has been deleted is shown
18+
greyed out until the next save drops it.
19+
920
## Adding nodes
1021

1122
- **Palette** — the left sidebar lists every node by group with a filter box; drag a node onto the canvas. The palette can be collapsed or moved to the other side with the tabs on its edge.

docs/saving.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,20 @@ How to save and load your work: the recommended `.tpscene` bundle, GLTF intercha
44

55
The main menu (the logo button) has **Import** (bring 3D files into the scene), **Load** (open a saved file) and **Save**, with a format switch underneath: **GLTF | Scene** — and a **** cog for export settings.
66

7+
## Where you left off
8+
9+
Restoring a session — from the **Restore** prompt, from *auto-restore* in
10+
*Settings ▸ Scene*, or by loading a scene file — brings back more than the objects:
11+
12+
- the **panels and windows** you had open, and which dock tab was in front,
13+
- what you had **selected**, and
14+
- an open **Edit Mesh** or **Sculpt** session, with the faces, edges or vertices you had
15+
picked.
16+
17+
A **plain page reload starts clean**, with everything closed. The workspace comes back
18+
when you ask for your scene back, not every time you refresh — and a scene whose author
19+
had nothing open will not close the panels *you* have open.
20+
721
## Starting from a template
822

923
**Menu ▸ Templates** opens a picker of ready-made scenes, in three tabs:

docs/shader-graph.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,17 @@ There is no scope control to get wrong — **the selection is the control**:
2929
The header always says which. An object with its own graph ignores the scene default,
3030
so the order is *own graph → scene default → the object's real material*.
3131

32+
## The Shaders list
33+
34+
The left pane carries a collapsible **Shaders** section above the node palette. It lists
35+
**Scene** at the root, then every object that actually has a shader graph of its own — it is a way
36+
to get *to* a graph, not a second object list, so an object with none is not in it.
37+
38+
Click a row to select that object and switch the editor to its graph; click **Scene** to
39+
deselect and edit the scene-wide one. Drag the bar under the list to give it more room, and
40+
click the section header to collapse it. An entry whose object has been deleted is shown
41+
greyed out until the next save drops it.
42+
3243
## The Surface node
3344

3445
Every graph ends at one **Surface** node. Each of its inputs replaces one part of the

docs/units.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Units
2+
3+
The scene is metres and radians underneath, always. Units change how numbers are **shown to you and typed by you** — nothing else. That makes them a **local preference**: you can work in inches while a peer works in centimetres, and you are both editing the same scene.
4+
5+
## Choosing your units
6+
7+
*Settings ▸ Scene ▸ Units*:
8+
9+
| Setting | Choices | Applies to |
10+
|---|---|---|
11+
| **Length** | m, cm, mm, in, ft | positions, the object origin, snapping steps, bevel width, merge distance |
12+
| **Angle** | degrees, radians | rotations and the rotation snap step |
13+
14+
Fields that are not a distance or an angle are deliberately left alone — a roughness of 0.4, a duration in seconds, a texture pixel and a subdivision count are not measurements, and a unit picker on them would be noise.
15+
16+
## Typing a unit
17+
18+
You do not have to change the setting to enter a value in another unit. Any of these fields accepts a **suffix**, whatever is currently on display, and converts it as you type:
19+
20+
| You type | You get |
21+
|---|---|
22+
| `12cm` | 0.12 m |
23+
| `250mm` | 0.25 m |
24+
| `4in` | 0.1016 m |
25+
| `1.5ft` | 0.4572 m |
26+
| `2'` | 0.6096 m |
27+
| `6"` | 0.1524 m |
28+
| `90deg` | a quarter turn |
29+
| `1.57rad` | the same quarter turn |
30+
31+
A **bare number** means the unit on display. So in a centimetre field, `250` is 2.5 m; in a metre field, `250` is 250 m.
32+
33+
## What does not change
34+
35+
- **Stored values.** Switching from metres to centimetres re-renders the fields and moves nothing. A box at 1.5 m reads `150` in cm and is still at 1.5 m.
36+
- **The feel of a drag.** Scrubbing a field covers the same real distance in every unit — only the number under your cursor is written differently.
37+
- **What your peers see.** Units are never replicated and never saved into a scene, so opening someone's file does not change your setup, and yours does not change theirs.
38+
39+
## Precision
40+
41+
The number of decimals follows the unit, so the field keeps roughly the precision it had. A position showing `1.50` m shows `150` in centimetres — the same centimetre of control, just written without a fractional part. Inches and feet keep a decimal place for the same reason: a whole inch is a coarser step than a centimetre, so the field does not round that far.
42+
43+
The arrow keys always step the **last visible digit**, with <kbd>Ctrl</kbd> for ten times that and <kbd>Shift</kbd> for a hundred — see [Numeric fields](controls.md#numeric-fields).

mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ nav:
44
- Getting Started:
55
- Welcome: index.md
66
- Controls: controls.md
7+
- Units: units.md
78
- Connection: connection.md
89
- Building:
910
- Explorer: explorer.md

0 commit comments

Comments
 (0)