diff --git a/docs/animation.md b/docs/animation.md index c610ffd7..cf9930d5 100644 --- a/docs/animation.md +++ b/docs/animation.md @@ -9,7 +9,7 @@ Give any object a **clip**: a named animation made of keyframes. Open a door, ru ## Opening the timeline -Select an object, then open the **+ Animation** tab — it sits with Flow and the UV editor in the bottom dock, and undocks into a floating window with the ⧉ button. +Select an object, then open the **+ Animation** tab — it sits with Flow and the UV editor in the bottom dock, and the dock's **Undock** button (right end of the tab strip) takes it out as a floating window. The window has three parts: diff --git a/docs/avatars.md b/docs/avatars.md index fa37c21f..49e85d83 100644 --- a/docs/avatars.md +++ b/docs/avatars.md @@ -14,21 +14,44 @@ Nine characters ship with the app: **Knight**, **Mage**, **Rogue**, **Hooded rog ![The nine characters](img/avatars/characters.png) -If you never pick one, you get **Surprise me**: a character chosen from your id, so everyone sees the same one for you. +If you never pick one, you get **Auto**: a character chosen from your id, so everyone sees the same one for you. The same characters are also an Explorer pack, **Packs ▸ Adventurers**, that you can place in a scene as animated models (see [Packs](packs.md#adventurers-124)). ## Customize Character Profile menu (your picture, top right) ▸ **Customize Character** — also **Settings ▸ Interface ▸ Avatars ▸ Customize -character…**. A side panel opens and the camera moves to **your own character**, standing where you are, so you see -yourself the way other people do. +character…**. A drawer opens (a bottom sheet on a phone) and puts **your own character** in a plain **studio**: a +neutral backdrop in your theme's colours, a floor disc and a soft key light. -![The Customize character panel with the camera on your own character](img/avatars/customize-panel.png) +![Customize character on a computer: your character in the studio on the left, the drawer with Show in scene, Surprise me and the presets on the right](img/avatars/studio-desktop.png) + +### The studio + +The scene is hidden from *your* view only while you customise — nothing in it changes, and other people in the session +keep seeing the scene (and you) as before. + +- **Orbit** — drag in the free part of the view to turn the camera around your character like a turntable; the wheel or + a pinch zooms. +- **Show in scene** — the switch at the top of the panel previews your character in the current scene instead, handy to + check how a colour reads against the world. The choice is remembered for next time. +- Your whole character **stays in view** whatever the screen does: resize the drawer or the window, rotate a phone, or + fold or unfold a foldable — the camera re-frames on every layout change. + +### Choosing a look + +- **Presets** — **Auto** (picked from your id), the nine rigged characters (step through them with ‹ ›) and the + **Classic head**. Picking one shows *its* defaults: its own head, no hat, its own outfit colours. +- **Custom** — change any part (head, hat, outfit or head colour) and a **Custom** entry appears and is selected. + Picking a preset again resets to that preset; picking **Custom** brings your edits back. +- **Surprise me** — a new random character on every press: body, head, hat and colours, never the same one twice in a + row. A surprise you like is your Custom look; press **Apply** to keep it. + +The name label and your ping colour and sound are your own preferences: presets and Surprise me leave them alone. | Section | What you choose | |---|---| -| **Character** | one of the nine — step through them with ‹ › — or **Surprise me** or **Classic head** | +| **Character** | a preset — **Auto**, one of the nine, or **Classic head** — or **Surprise me**; your own edits are **Custom** | | **Head** | the character's own head, a stylised **Sphere**, **Box**, **Capsule** or **Cone** in your colour, or **My photo** (your profile picture on a card; needs a profile photo) | | **Hat** | None, Cap, Top hat or Crown — it sits on whatever head you chose | | **Colours** | **Outfit** recolours the character's clothes (skin and face keep theirs; **Original** puts them back); **Head** colours a stylised head or the classic avatar | @@ -40,8 +63,8 @@ narrower — the keyboard works too (focus the edge, then the arrow keys; S camera keeps your character in the part of the screen the drawer leaves free. The size is remembered on this device. Every change shows on your character at once; nothing reaches other people until you press **Apply**, which saves it and -shows it to everyone. **Cancel**, Esc or ✕ throw the changes away. Either way the camera returns exactly to -where your view was before you opened it. +shows it to everyone. **Cancel**, Esc, ✕ or swiping the sheet away throw the changes away. Either way the +camera and the scene come back exactly as they were before you opened it. ## Showing everyone as classic heads diff --git a/docs/code-workspace.md b/docs/code-workspace.md index 192b412f..a262ed1c 100644 --- a/docs/code-workspace.md +++ b/docs/code-workspace.md @@ -16,9 +16,10 @@ It opens by itself when you ask for code: - the dock's **+** menu ▸ **Code**, or the optional `{}` toolbar button (add it with *Customize the toolbar*); - **Graph JSON** in the workspace's header opens the graph the Node editor is showing. -It docks as a tab at the bottom, beside the Node editor and the Explorer, or floats as a window (**⧉** to float, -**⇩ Dock** to put it back). Everything on this page works in both. In a narrow window or on a phone the -[sidebars](#sidebars) open **over** the editor, one at a time (toggle buttons in the header). +It docks as a tab at the bottom, beside the Node editor and the Explorer, or floats as a window (the dock's **Undock** button to float, +the window's **Dock** to put it back). Everything on this page works in both. In a narrow window or on a phone the +[sidebars](#sidebars) open **over** the editor, one at a time (toggle buttons in the header); on a phone they start +hidden, and one you open stays open next time. When the workspace has the keyboard, it keeps it: WASD never fly the camera from here (see [Keys follow the panel you are in](controls.md#keys-follow-the-panel-you-are-in)). In the undocked diff --git a/docs/connection.md b/docs/connection.md index 7550d3e8..3604c6bc 100644 --- a/docs/connection.md +++ b/docs/connection.md @@ -13,10 +13,41 @@ It has two halves: - **📋 Your ID** — the button on the left shows your own peer ID. Click it to **copy your invite link** (your app URL with your ID attached, e.g. `https://theprototype.app/#AB12CD`) to the clipboard. Until the connection to the signaling server is ready it reads *Generating…*. - **Connect field** — paste a peer's ID into *Enter peer ID to connect* and press **Connect** to request a connection. -Since 1.30, once you are connected the bar **collapses to a compact chip** — a status dot, the session, the avatars -of who is here and your mic; click it to open the full bar again (its collapse button folds it back). While the signaling link -is down the status badge says how long it has been trying (*Reconnecting · 2 min*); the attempt count is in the drawer's -**Info** tab. On a phone the bar is always the chip — tap it for your ID, the join field, Info and Toasts. +Since 1.30, once you are connected the bar **collapses to a compact chip** — the status dot, the avatars of who is here +and your mic; click it to open the full bar again (its collapse button folds it back). On a phone the bar is always the +chip — tap it for your ID, the join field, Info and Toasts. The signaling link's attempt count is in the drawer's +**Info** tab. + +### The status dot + +Since 1.32 the connection status is a **coloured dot**. On a computer the full bar keeps your invite ID and the peer-ID +field, with the dot at its left end. On a phone the chip at the top of the screen says the state beside the dot — +**Connected**, **Connecting…** or **Offline** — whenever the top bar has room. When the bar is crowded (people are +connected and you are in a call, so the peers button and the microphone take the space) it shrinks back to the dot and +a ▾ (and the microphone while you are in a call). + +| Dot | Means | +|---|---| +| grey | not connected | +| yellow, pulsing | connecting, waiting for someone to approve, or reconnecting to the peer server | +| green | connected | +| red | the peer server cannot be reached (the app keeps retrying) | + +Point at the dot — or press and hold it on a touch screen — for the full sentence, such as *Connected to 2 peers*; +while the signaling link is down it also says how long it has been trying. On a phone a tap on the chip opens the full +connection details. + +![The phone's top bar when it is crowded: the logo, the connection chip with a green dot, ▾ and the microphone, then the bell and the peers](img/connection/status-dot-phone.png){ width="420" } + +### Who is here: the peers panel + +The peers button in the top bar (beside the bell, with the number of people) opens the **Connected** panel. Its header +matches the notification centre's, and each person is **one row**: their avatar, their name (shortened with … — point +at it for the full name), a second line with where they are and their role, and their actions on the right — **Watch**, +**Go to** or the role list. On a computer the panel is 320–420 px wide and grows with long names, so nothing wraps or +breaks. On a phone it opens as a sheet like the notifications: a grab bar on top, and a swipe down closes it. + +![The Connected panel on a computer: five people, one row each — avatar, name, the scene they are in and their p-number underneath, and Editor or Viewer with Go to or Watch on the right](img/connection/peers-panel-desktop.png){ width="515" } ### Inviting someone @@ -123,7 +154,7 @@ A momentary network blip no longer throws you out, either. A peer that drops for ## When the signaling link drops -The link to the signaling server is not the link to your peers — losing it does not end a session you are already in, it only stops new people finding you. When it drops the app reconnects on its own, backing off a little further between tries and **never giving up**, and the Connect pill carries a chip while it is retrying so a dead link does not read as a dead app. Coming back online, or returning to the tab, retries immediately instead of waiting out the backoff. A peer connection that closed is rebuilt rather than abandoned. +The link to the signaling server is not the link to your peers — losing it does not end a session you are already in, it only stops new people finding you. When it drops the app reconnects on its own, backing off a little further between tries and **never giving up**, and the [status dot](#the-status-dot) pulses yellow while it is retrying so a dead link does not read as a dead app. Coming back online, or returning to the tab, retries immediately instead of waiting out the backoff — and since 1.32 it does so **silently**: switching apps on a phone and coming back no longer toasts. If the server stays unreachable for about a minute, the dot turns red and **one** entry appears in the notification centre; the retries carry on. A peer connection that closed is rebuilt rather than abandoned. ## Diagnostics you can copy @@ -172,5 +203,5 @@ It carries an **Open Settings** button that jumps straight to **Settings ▸ Con | *AB12 declined your connection request* | The host pressed **Reject**. Ask them before dialling again. | | *AB12's session is full (16 people)* | Everyone connects to everyone, so a session has a ceiling. Someone has to leave before another person can join — **Try again** on the toast re-asks. | | *Could not reach … — back on your previous peer server.* | **Apply** could not open the server you picked, so nothing changed — check the host, port and path. | -| *Lost the peer server - reconnecting...* / *The peer server closed the link - reconnecting...* | The link to the signaling server dropped; the app retries on its own and never gives up. *Reconnected to the peer server.* confirms it is back. Your open session keeps going meanwhile. | -| *Cannot reach the signaling server - the connection request was not sent.* | You pressed **Connect** while the signaling link is down. Wait for the reconnect chip to clear, or switch servers in Settings ▸ Connection. | +| A **red** status dot, and one *Can't reach the peer server — still retrying.* entry in the notification centre | The link to the signaling server has been down for about a minute; the app keeps retrying on its own and never gives up, and the dot turns green or grey again once it is back. Shorter drops — a tab switch, a moment offline — reconnect silently. Your open session keeps going meanwhile. | +| *Cannot reach the signaling server - the connection request was not sent.* | You pressed **Connect** while the signaling link is down. Wait for the status dot to stop pulsing, or switch servers in Settings ▸ Connection. | diff --git a/docs/controls.md b/docs/controls.md index d6714554..23ad8cc0 100644 --- a/docs/controls.md +++ b/docs/controls.md @@ -22,6 +22,7 @@ If the guess is still wrong on your hardware, pick it yourself: right-click the - **Click** an object to select it — the transform gizmo attaches. - **Double-click** it to open its properties (right-click ▸ *Properties* and the object list do the same). Pin the properties panel if you'd rather it followed every selection. +- **New objects do not open the properties.** Adding a primitive, placing a pack item or prefab, or pasting selects the new object but leaves the properties panel closed; if the panel is already open, it switches to the new object. - **Click empty space** to deselect. - **Shift+click** adds or removes objects from a multi-selection (the last-picked object is the primary). - **Shift+drag** on empty space draws a box-select marquee. @@ -39,8 +40,13 @@ Object list, Node editor, Explorer, Animation), or press **I**: - **Edit** (the default) — every click selects, so every object, module pieces included, can be picked and moved. - **Interact** — clicks and drags work the way they do in play, without starting the game: - piano keys play, buttons press, On Click nodes fire, and a press on a crate carries it while a - simulation runs. Nothing gets selected. + piano keys play, buttons press, On Click nodes fire, and a press on a crate + [carries it](physics.md#carrying-things-in-interact) while a simulation runs. Nothing gets selected. + +**Interact keeps your selection for later.** Turning Interact on clears the selection — no outline, no gizmo: you are +playing, not editing — and turning it off brings back what was selected, minus anything deleted meanwhile. If you +picked something else while in Interact (from the Objects list, say), that newer choice is kept instead. On a phone the +[selection toolbar](interface.md#the-selection-toolbar) stays up while Interact is on, so you can turn it off again. **Play** is the third mode, entered with the play button as before. @@ -166,7 +172,16 @@ With **Multi-select** on: It works the same inside a mesh editing session, on vertices, edges and faces. Everything else already has a touch path: long-press the viewport for the right-click menu, and the -**+** button opens the same create menu. +**+** button opens the same create menu. On a phone the same toggle is **Select multiple** on the +[selection toolbar](interface.md#the-selection-toolbar). + +### Tapping to select on a touch screen + +- Tap an object to select it; **tap it again to deselect it**. +- With **Select multiple** on, each tap toggles that object in or out of the selection. +- A double-tap still does your [double-click action](#what-double-click-does) (by default: open its properties). +- To reach an object hidden behind another, use the Objects list. (A mouse can still click the same spot again, or + Alt+click, to select what is behind.) ### Duplicating @@ -343,6 +358,10 @@ A **right-click while you drag a window** — by its title bar, a resize corner menu; a normal right-click elsewhere behaves as before. Tabs that sit in a window's title bar, like the undocked [Code](code-workspace.md) window's, can be clicked, while the title bar around them still drags the window. +For the bottom dock's own buttons — **Undock**, closing a view from its tab, **Dock all tabs** on a floating window — +and for docking a window into an exact slot by dropping it on the dock's tab bar, see +[Windows and tabs](interface.md#windows-and-tabs). + ### Docking to a screen edge Drag a window's header to the **left or right edge** of the screen and a blue strip appears: @@ -373,6 +392,10 @@ under a name, and switch between arrangements in one click. updates that layout. - **Use:** click a saved layout to apply it. Rename or delete it from the same list. +**Menu ▸ Layouts** opens the list as a regular dialog; Esc, its **✕** or a click outside closes it. On a folded +phone it is the **Layouts** tab of the bottom dock instead (also on the dock's **+**) — see +[The dock on a phone](interface.md#the-dock-on-a-phone). + Layouts are kept on this device. A reload still starts with a clean slate: a layout is applied only when you pick one. ## The toolbar @@ -389,17 +412,44 @@ The bar at the bottom of the screen is yours to arrange. **Right-click** (or lon | Entry | What it does | |---|---| | **Swap with ▸** | exchange this button for one that is not on the bar | +| **Edit positions** | drag every button into place on the bar itself — see [Edit positions](#edit-positions) | | **Move left / Move right** | one place along the bar — past the play button when it is next | | **Hide button** | take it off the bar (Customize toolbar brings it back) | | **Move toolbar** | slide the whole bar along the bottom: click to place it, the arrow keys nudge, Esc puts it back. Disabled on a screen too narrow to move it | | **Reset toolbar position** | back to the middle | | **Always on top** | paint the bar over the dock and floating windows (by default they cover it) | | **Collapse / Expand toolbar** | shrink the bar down to the play button, and back | -| **Customize toolbar…** | a checklist of every tool: tick to show, untick to hide, ▲/▼ to reorder; **Reset toolbar** goes back to the default buttons and order | +| **Customize toolbar…** | a checklist of every tool, the two corner stacks included: tick to show, untick to hide, ▲/▼ to reorder; **Edit positions…** at the top; **Reset toolbar** goes back to the default buttons and order | + +### Edit positions + +Right-click any button on the bottom toolbar — or press and hold it on a touch screen — and pick **Edit positions**. The +toolbar and the two corner stacks switch to edit mode: + +- **Drag** any button to a new place: along the bar, or into the bottom-left or bottom-right corner stack. **Play** can + move along the bar but always stays on it. +- The small red **−** on a button removes it; its place shows a small green **+**. +- A green **+** opens a list of every button from *Customize toolbar…* that is not placed yet (Play is never in it). + Pick one to put it in that place. +- Each corner holds up to **three** buttons, stacked bottom to top. By default the left corner has the AI assistant and + the **+** (add) button, the right corner Chat and the microphone. +- With the keyboard: Tab to a button, then the **arrow keys** move it (← / → along the + bar and into the corners, ↑ / ↓ inside a corner) and Delete removes it. +- The round green **✓** at the top right of the toolbar **applies** the new layout. Esc, or a click anywhere + else, cancels it. + +![Edit positions on a computer: every button has a red −, green + slots sit at the ends of the bar and on top of each corner stack, and the green ✓ applies](img/controls/edit-positions.png) + +The layout is saved on this device, like *Customize toolbar…*. **Reset toolbar** (in Customize) or **Settings ▸ Reset +window positions** puts everything back. A custom button order no longer shows the wrong icons after a reload. On a +folded phone the app shows its own phone bar instead — edit that one from **More ▸ Edit bar…**, or hold one of its +buttons; there **More** can come off the bar and **Play** can move along it (see [On a phone](interface.md#on-a-phone)). The **play button**'s right-click menu chooses how you play — **Play (desktop)**, **Enter VR**, **Enter AR passthrough** (greyed out where the device cannot) — and, in a scene that is a game, **Test play (start from the menu)**, which resets the -game to its menu and starts from the Start screen. See [Build a Game Loop](build-a-game.md#test-play). +game to its menu and starts from the Start screen. See [Build a Game Loop](build-a-game.md#test-play). On a folded phone, +press and hold Play for the phone's version of this menu — *Play as*, *Test play*, **Move left / Move right** and +**Edit bar…**; see [On a phone](interface.md#on-a-phone). ## The Settings window diff --git a/docs/explorer.md b/docs/explorer.md index c47abac5..82a9c26e 100644 --- a/docs/explorer.md +++ b/docs/explorer.md @@ -131,16 +131,29 @@ The header's **Thumbnails / List** toggle switches views. The list has sortable - **Single-click** selects an item and shows its details in the **ⓘ Properties** panel. - **Double-click** opens it in a **preview window** (below); text files open in a floating code editor (Ctrl+S saves back to the item). -- **Right-click** an item for Open, Download, Share, Rename, Delete, Properties (and *Copy contents* for text files). +- **Right-click** an item for Open, Download, Share, Rename, Delete, Properties (and *Copy contents* for text files, + **Edit image…** for images — see [The Image editor](image-editor.md)). - The search box filters the whole library by name; the breadcrumb path bar (toggleable) shows where you are. **Keyboard navigation** in the grid: arrow keys move the selection, Enter opens, Backspace goes up a level, Esc clears the selection, Delete deletes the selection. +### On a phone + +- **Press and hold** a file or folder to open its actions as a sheet: Rename, Duplicate, Copy, Download, Share, + Properties, Delete and the rest. The sheet stays open when you lift your finger (Android's own long-press signal used + to close it straight away), and the browser's own long-press menu and text callout do not appear on Explorer items. +- **Hold, then move** to pick the item up and drop it into a folder. +- While you **rename** an item, the selected text is readable in every theme. +- The Explorer's toolbar **scrolls sideways** when it does not fit, so the project name is always reachable. + +On a phone the Explorer is a tab of the bottom dock, like Properties, Objects and the other windows — see [The dock on a phone](interface.md#the-dock-on-a-phone). +Its sidebar starts hidden so the files get the screen; open it with its edge button and it stays open next time. + ### Selecting several - Ctrl+click adds or removes a card; Shift+click selects the range from the last card you clicked (Ctrl+Shift+click adds the range). - Ctrl+A selects everything in the folder, Ctrl+I inverts the selection. With the grid focused these keys never reach the scene behind the panel. -- **Drag on empty grid space** to draw a marquee (with the mouse — on a touch screen a drag scrolls the grid, and a long press picks a card up instead). Hold Ctrl to add to what is already selected. +- **Drag on empty grid space** to draw a marquee (with the mouse — on a touch screen a drag scrolls the grid, and holding a card, then moving, picks it up instead). Hold Ctrl to add to what is already selected. - Right-click a selection for the batch actions: **Download N files as .zip**, **Export N objects as GLTF**, **Share** / **Unshare N items**, Copy, Cut, Duplicate and Delete. - Drag a selection onto a folder to move all of it, or into the viewport to place every object. @@ -182,7 +195,8 @@ Right-click a file or a folder for **Duplicate** (**Duplicate folder**), **Copy* ### The preview window -Images open zoomable (**−** / **+** / **1:1**, drag to pan), sounds open with a player, and 3D models open on a turntable with an **animation transport** — play, step a frame with , and ., scrub, pick a clip — and a mesh-stats line. The **←** / **→** buttons page through the folder without closing the window, and **⌐** goes up a level. +Images open zoomable (**−** / **+** / **1:1**, drag to pan) with a pencil button that opens the +[Image editor](image-editor.md), sounds open with a player, and 3D models open on a turntable with an **animation transport** — play, step a frame with , and ., scrub, pick a clip — and a mesh-stats line. The **←** / **→** buttons page through the folder without closing the window, and **⌐** goes up a level. The window's **⚙** holds two things worth knowing: **Opacity** fades the window so you can model against a reference picture, and **Passthrough** lets clicks reach the scene underneath while the header stays live to move it or switch it back. **Allow multiple windows** opens each file in a window of its own instead of re-pointing the one you have. @@ -228,7 +242,7 @@ New in 1.31: drag any object — a pack item, one of your Library models, a pref nothing in the undo history. - **Colours.** The ghost turns **amber** when it would sit mostly inside another object (you can still place it — a cup in a cabinet is fine) and **red** where there is nothing to place it on (letting go there does nothing). -- **On a phone or tablet**, press and hold a card until it lifts, then drag; the Explorer tucks itself away so you can +- **On a phone or tablet**, press and hold a card and move your finger to drag it (holding still opens its actions instead); the Explorer tucks itself away so you can see where you are dropping. Items drop upright (or aligned to the surface) — the rotation keys need a keyboard. ### Ghost tiers: the real model or its box @@ -268,7 +282,8 @@ all pack downloads**. ### Images, audio and text -- **Images** dropped onto an object become its **texture**. +- **Images** dropped onto an object become its **texture**. A big photo is scaled down to 1024 px on its longest side + instead of being refused — see [Big photos as textures](image-editor.md#big-photos-as-textures). - **Audio and text** are used where they plug in — sound nodes, scripts, and any module that claims the drop (a sample onto a pad). diff --git a/docs/image-editor.md b/docs/image-editor.md new file mode 100644 index 00000000..c2a41c0a --- /dev/null +++ b/docs/image-editor.md @@ -0,0 +1,95 @@ +# Image Editor + +New in 1.32: the **Image editor** crops, rotates, flips, resizes and adjusts a picture in your +[Explorer](explorer.md) library. When you save, every texture made from that picture updates for everyone in the +session. + +![The Image editor on a computer: the picture on the left, the Edit page with Rotate and flip, Crop, Resize and Adjust on the right](img/image-editor/editor-desktop.png) + +## Opening it + +- Right-click an image in the Explorer ▸ **Edit image…** +- The **pencil** button in an image's [preview window](explorer.md#the-preview-window). +- **Edit** beside a texture in the Inspector (**Material ▸ Texture**). +- The dock's **+** ▸ **Image editor** opens it as a dock tab — see [In the dock](#in-the-dock). + +## Looking at the picture + +The picture fills the canvas. Scroll or pinch to zoom, drag to pan, and use **Fit** or **1:1** in the toolbar. The +toolbar also shows the picture's size and format, and how many textures were made from it. + +The sidebar on the right has two pages: **Edit** and **Versions**. + +## Edit + +- **Rotate and flip**: 90° left and right, mirror horizontally and vertically. +- **Crop**: press **Crop…**, then drag on the picture to draw the box. Drag inside the box to move it, or drag a corner + to resize it. The shape can be **Free**, **1:1** or **Original**, and **X**, **Y**, **W** and **H** take typed + values. Enter or **Apply crop** applies it; Esc or **Cancel** cancels. +- **Resize**: width and height, with **Keep proportions**. Quick buttons for **50%**, **200%** and **Power of 2** (the + size graphics cards handle best for textures), then **Apply resize**. +- **Adjust**: **Brightness**, **Contrast** and **Saturation** sliders, applied live. **Reset adjustments** puts them + back. + +![Cropping on a computer in the light theme: the crop box over the picture, with X, Y, W and H and Apply crop in the sidebar](img/image-editor/crop-desktop-light.png) + +## Saving + +- **Save** (Ctrl+S) writes over the same Explorer file: same name, same folder, shared with the + same people. **Every material whose texture was made from this image updates, for everyone in the session**, as one + undo step in the scene. The toolbar says how many textures that is. +- **Save as copy** writes *name copy.png* beside it. The original and its textures stay as they were, and the editor + carries on with the copy. +- The editor has its own **Undo** and **Redo** (Ctrl+Z / Ctrl+Shift+Z) + for edits you have not saved yet. They never touch the scene's undo. Closing with unsaved edits asks first. + +## Versions + +The **Versions** page lists every saved state of this image with a thumbnail, date and size, and **Restore** on each. +**Restore original** at the top goes back to the picture as it first came in. + +![The Versions page: Restore original at the top, the current edit and the original below it](img/image-editor/versions-desktop.png) + +## Textures and their images + +A texture remembers the library image it was made from when you apply it from the Explorer. **Edit** in the Inspector +on any other texture — one picked from disk, or one that came with an imported model — first puts it into the library +as *‹object› texture.webp*, then opens it, so it updates on **Save** the same way. + +Painting over a texture in the [UV editor](uv-editor.md#painting) breaks the link: a later save of the image will not +paint over your strokes. + +## Big photos as textures + +Pick any photo as a texture — **Inspector ▸ Material ▸ Texture ▸ Set texture…**, or drop an Explorer image on the +object — and it is scaled down to fit 1024 px on its longest side and applied. Since 1.32 nothing is refused for being +large. Only a file over 64 MB is turned away, because a phone cannot decode it. + +## In the dock + +The Image editor can live in the bottom dock like the other editors: pick **Image editor** from the dock's **+** menu +(on a phone, the **Windows** sheet), press its header's **Dock** button, or drag it onto the dock's tab bar. The dock's +**Undock** button floats it again; floating stays the default. + +- Opened from the **+** with no image, it tells you to open one from the Explorer (right-click an image ▸ **Edit + image…**). Opening an image while it is docked brings the dock tab forward. +- Closing the tab with unsaved edits asks first, as the window does. + +![The Image editor as a tab in the bottom dock, beside Animation, Node editor, Explorer, Flow Code and UV editor](img/image-editor/docked.png) + +## On a phone + +The editor is a full-width sheet between the top bar and the bottom bar, so **Play** stays tappable. The Edit and +Versions pages sit under the picture instead of beside it, and **Crop…** scrolls its **Apply crop** button into view. +Since 1.32 they start **closed**, so the picture gets the screen: tap ✎ (Edit) or ⟲ (Versions) under the picture to +open one, and it stays open next time. + +![The Image editor on a phone: the picture at the top, the Edit page under it, the bottom bar with Play below](img/image-editor/editor-phone.png){ width="300" } + +## Limits + +- Versions are kept **on this device**: the original plus the last 19 saves per image. Peers receive the saved image, + not its history. +- PNG, JPEG and WebP save in their own format. GIF and BMP save as PNG. +- The largest side the editor produces is 8192 px. +- A texture is stored at up to 1024 px, whatever the size of the image. diff --git a/docs/img/avatars/customize-panel.png b/docs/img/avatars/customize-panel.png deleted file mode 100644 index a6a78e10..00000000 Binary files a/docs/img/avatars/customize-panel.png and /dev/null differ diff --git a/docs/img/avatars/studio-desktop.png b/docs/img/avatars/studio-desktop.png new file mode 100644 index 00000000..3271252b Binary files /dev/null and b/docs/img/avatars/studio-desktop.png differ diff --git a/docs/img/connection/peers-panel-desktop.png b/docs/img/connection/peers-panel-desktop.png new file mode 100644 index 00000000..1ae7dd76 Binary files /dev/null and b/docs/img/connection/peers-panel-desktop.png differ diff --git a/docs/img/connection/status-dot-phone.png b/docs/img/connection/status-dot-phone.png new file mode 100644 index 00000000..5fb24435 Binary files /dev/null and b/docs/img/connection/status-dot-phone.png differ diff --git a/docs/img/controls/edit-positions.png b/docs/img/controls/edit-positions.png new file mode 100644 index 00000000..ed24fe8f Binary files /dev/null and b/docs/img/controls/edit-positions.png differ diff --git a/docs/img/image-editor/crop-desktop-light.png b/docs/img/image-editor/crop-desktop-light.png new file mode 100644 index 00000000..245dfb29 Binary files /dev/null and b/docs/img/image-editor/crop-desktop-light.png differ diff --git a/docs/img/image-editor/docked.png b/docs/img/image-editor/docked.png new file mode 100644 index 00000000..25131277 Binary files /dev/null and b/docs/img/image-editor/docked.png differ diff --git a/docs/img/image-editor/editor-desktop.png b/docs/img/image-editor/editor-desktop.png new file mode 100644 index 00000000..a84aa7ac Binary files /dev/null and b/docs/img/image-editor/editor-desktop.png differ diff --git a/docs/img/image-editor/editor-phone.png b/docs/img/image-editor/editor-phone.png new file mode 100644 index 00000000..3702a915 Binary files /dev/null and b/docs/img/image-editor/editor-phone.png differ diff --git a/docs/img/image-editor/versions-desktop.png b/docs/img/image-editor/versions-desktop.png new file mode 100644 index 00000000..45a57845 Binary files /dev/null and b/docs/img/image-editor/versions-desktop.png differ diff --git a/docs/img/interface/dialog-delete-flow.png b/docs/img/interface/dialog-delete-flow.png new file mode 100644 index 00000000..81c9f8eb Binary files /dev/null and b/docs/img/interface/dialog-delete-flow.png differ diff --git a/docs/img/interface/dock-tabs-properties-phone.png b/docs/img/interface/dock-tabs-properties-phone.png new file mode 100644 index 00000000..11e07330 Binary files /dev/null and b/docs/img/interface/dock-tabs-properties-phone.png differ diff --git a/docs/img/interface/menu-project-compact.png b/docs/img/interface/menu-project-compact.png new file mode 100644 index 00000000..f6a28ec7 Binary files /dev/null and b/docs/img/interface/menu-project-compact.png differ diff --git a/docs/img/interface/selection-toolbar-phone.png b/docs/img/interface/selection-toolbar-phone.png new file mode 100644 index 00000000..d0d43e65 Binary files /dev/null and b/docs/img/interface/selection-toolbar-phone.png differ diff --git a/docs/img/modules/core-phone.png b/docs/img/modules/core-phone.png new file mode 100644 index 00000000..bfcab755 Binary files /dev/null and b/docs/img/modules/core-phone.png differ diff --git a/docs/img/node-editor/breadcrumb-siblings.png b/docs/img/node-editor/breadcrumb-siblings.png new file mode 100644 index 00000000..2f565131 Binary files /dev/null and b/docs/img/node-editor/breadcrumb-siblings.png differ diff --git a/docs/img/notes/note-page-phone.png b/docs/img/notes/note-page-phone.png new file mode 100644 index 00000000..cec45ede Binary files /dev/null and b/docs/img/notes/note-page-phone.png differ diff --git a/docs/img/profiler/details-sidebar.png b/docs/img/profiler/details-sidebar.png new file mode 100644 index 00000000..f636012a Binary files /dev/null and b/docs/img/profiler/details-sidebar.png differ diff --git a/docs/img/saving/save-options.png b/docs/img/saving/save-options.png new file mode 100644 index 00000000..8836c5ce Binary files /dev/null and b/docs/img/saving/save-options.png differ diff --git a/docs/img/settings/rows-phone.png b/docs/img/settings/rows-phone.png new file mode 100644 index 00000000..9753141a Binary files /dev/null and b/docs/img/settings/rows-phone.png differ diff --git a/docs/img/water/phone-simplified-notice.png b/docs/img/water/phone-simplified-notice.png deleted file mode 100644 index 31b4e048..00000000 Binary files a/docs/img/water/phone-simplified-notice.png and /dev/null differ diff --git a/docs/index.md b/docs/index.md index 0aef31e3..1149fb99 100644 --- a/docs/index.md +++ b/docs/index.md @@ -24,6 +24,62 @@ with a contributing guide and an `llms.txt` for coding agents. ## What's new +**1.32 — your 1.31 review, fixed.** On a phone every sheet has [one grab bar](interface.md#sheets-on-a-phone): drag +it to resize the sheet, swipe it down to close it, and no sheet covers **Play**. **Customize character** and **Profile +settings** open again from the profile menu, and in the Explorer you [press and hold](explorer.md#on-a-phone) a file +or folder for its actions. [Docked windows](interface.md#docked-windows) close from their tab; **Undock** sits beside +*Minimize the dock* (**Settings ▸ Interface ▸ Windows & chrome ▸ Undock button** can take every tab out as one +window), a floating window with tabs can **Dock all tabs**, a tab dragged onto a floating window joins it, and the +phone's **+** opens a **Windows** sheet. Long names stay on one line, and **Layouts** is a regular dialog (a dock tab on a phone). Automatic +quality no longer switches water refraction and the rest off and on, and says what it lowered +[once, with **Keep full quality**](performance.md#when-quality-is-lowered-for-you). A big photo now +[becomes a texture](image-editor.md#big-photos-as-textures) instead of being refused, and the new +[Image editor](image-editor.md) crops, rotates, resizes and adjusts a picture and updates its textures for everyone. +**Templates ▸ Examples ▸ Aquarium** is a reef from the new [Aquarium Kit](packs.md#aquarium-kit-132), swimming with +four new motion nodes — [Follow Path](nodes/followpath.md), [Wander](nodes/wander.md), +[Orient to Velocity](nodes/orientvelocity.md) and [Body Wave](nodes/bodywave.md) — with a +[Fish scales](materials.md#fish-scales-and-the-look-tier) preset. LOD groups no longer stay on their first level in +scenes with water. + +**…and from your review of the 1.32 preview.** Right-click (or press and hold) a toolbar button ▸ +[Edit positions](controls.md#edit-positions) to drag the toolbar and corner buttons into place — **−** removes, **+** +adds, **✓** applies. On a phone the [selection toolbar](interface.md#the-selection-toolbar)'s **Inspect** opens *and +closes* the properties, a tap on a selected object deselects it, adding an object no longer opens the properties, and +[Interact](controls.md#edit-and-interact) gives your selection back when you leave it and +[carries things](physics.md#carrying-things-in-interact) from the point you grabbed. Phone sheets +[pull down to close](interface.md#sheets-on-a-phone) from their list, the main menu closes on a press outside it, and a +note steps through [all the notes](notifications.md#adding-a-note). Tabbed windows drag by touch, and on a computer you +can [drop a window onto the dock's tab bar](interface.md#docked-windows) exactly where you want it; the dock's **+** +lists every window, the [Image editor](image-editor.md#in-the-dock) included. **Customize character** opens a +[studio](avatars.md#the-studio) around your character, and **Surprise me** deals a new look on every press. +[Dialogs](interface.md#dialogs) cover the whole screen, and questions — *Delete flow*, *Restore previous session?* — +are dialogs instead of toasts. The connection pill shows a [coloured dot](connection.md#the-status-dot), and +reconnecting after a tab switch no longer toasts. The node editor has a one-line +[breadcrumb bar](node-editor.md#the-breadcrumb-bar), and the Profiler a [Details and Settings](profiler.md#details-and-settings) +sidebar and a resizable split. And from the second look at the preview: + +- On a phone, **Properties, Objects, Notes, Configure Scene and Layouts** are [tabs of the bottom dock](interface.md#the-dock-on-a-phone) + beside the Explorer, instead of drawers behind it. **Inspect** brings Properties to the front, nothing covers **Play**, + and unfolding the phone puts each panel back in its sidebar or window — folding brings the tabs back. +- Tapping the bottom-bar button of the view on screen [minimizes the dock](interface.md#on-a-phone); the main menu closes + as Configure Scene opens on a phone (on a computer it stays open). +- **More** can come off the phone's bottom bar, and **Play** can move along it. Play starts as plain Play on a phone; + pick VR or AR from its press-and-hold menu and its icon follows. +- The selection toolbar follows a sheet as you resize it, without lagging behind, and the profile sheet no longer repeats + your picture. +- The phone's Connect chip says **Connected**, **Connecting…** or **Offline** beside the [dot](connection.md#the-status-dot) + when there is room. +- The [peers panel](connection.md#who-is-here-the-peers-panel) is wider, one row per person; on a phone it is a sheet like + the notifications. +- The main menu's [Project section](interface.md#the-main-menus-project-actions) has a compact two-column layout — + **New from template…**, **Load** | **Save ▾**, **Import** | **Export…** — and **▾** opens one + [Save options](saving.md#save-options) dialog. A phone keeps the list; **Settings ▸ Interface ▸ Project actions** switches. +- [Settings rows](settings.md#reading-a-row) keep a switch, a short list, a colour or a button beside their name again, and + stack only what cannot fit. +- [Modules](modules.md#the-modules-manager) on a phone keep their buttons to the right and expand a long description on a + tap. In Browse, install several at once: each card says **Installing…** until it is done, and a failed one says why with + **Retry**. + **1.31 — drag to place.** Drag any object from [Explorer ▸ Packs or ▸ Library](explorer.md#placing-objects) onto the viewport and a ghost shows where it will land and how big it is — width × depth × height in metres beside the pointer, the real model when it is already loaded and light enough, its box otherwise. R or the wheel turns diff --git a/docs/interface.md b/docs/interface.md index b1048edc..d3e8a301 100644 --- a/docs/interface.md +++ b/docs/interface.md @@ -17,15 +17,19 @@ The light theme and every custom `.theme.json` restyle all of it; see [Themes & - **The toolbar** at the bottom is one glass bar: Move, Rotate, Scale, Interact, **Play** (the only orange button), then the windows you keep there (Objects, Node editor, Explorer, Animation…). The accent fill marks the armed tool or an open - window. It is still yours to arrange — right-click any button; see [The toolbar](controls.md#the-toolbar). -- **The logo** (top-left) opens the main menu, grouped as Project · Scene · Collaborate · App. -- **The Connect bar** (top centre) shows your ID — click it to copy your invite link — the field to join someone, and - the status as a badge. Once you are connected it **collapses to a chip**: a status dot, the session, the avatars of who - is here and your mic. Click the chip to open the full bar again. While the link to the signaling server is down it - says for how long ("Reconnecting · 2 min"); the attempt count is in **Connect ▸ Info**. See - [Connection](connection.md#the-connect-panel). -- **Top right**: scene notes, the notification bell (with a count) and the peers list sit in one group beside your - picture, which opens your profile menu (**Customize character**, **Profile settings**). + window. It is still yours to arrange — right-click any button (or press and hold it) ▸ **Edit positions** to drag the + buttons into place; see [The toolbar](controls.md#the-toolbar). The two **corner stacks** — bottom-left (the AI + assistant and **+**) and bottom-right (Chat and the microphone) — are arranged the same way. +- **The logo** (top-left) opens the main menu, grouped as Project · Scene · Collaborate · App — see + [The main menu's Project actions](#the-main-menus-project-actions). A press anywhere outside the menu closes it; + pressing another button (a bottom-bar tab, the bell, Play) closes it and does that button's job in the same press, + and pressing the 3D view only closes it — nothing gets selected or deselected. +- **The Connect bar** (top centre) shows your ID — click it to copy your invite link — and the field to join someone, + with the **status dot** at its left end. Once you are connected it **collapses to a chip**: the dot, the avatars of who + is here and your mic. Click the chip to open the full bar again. On a computer the dot has no words beside it — point + at it to read them; see [The status dot](connection.md#the-status-dot). +- **Top right**: scene notes, the notification bell (with a count) and the [peers panel](connection.md#who-is-here-the-peers-panel) + sit in one group beside your picture, which opens your profile menu (**Customize character**, **Profile settings**). - **Toasts** are calm cards under the Connect bar, at most three at a time; more collect behind **+N more**. See [Toasts](notifications.md#toasts). - Someone who is **speaking** in voice chat gets a soft green ring on their avatar. @@ -44,10 +48,52 @@ can be rebound there like any shortcut. Every docked or floating window — Explorer, Objects, Chat, AI assistant, Notes, the Notification centre, the node editor, Flow code, Animation, UV, Shader, HUD editor, Profiler, the Code workspace — has the same header: icon, title, the window's own actions, then pin and close in the same places. Windows in one group, and the views in the bottom dock, -share **one tab strip**: pill tabs with the view's icon and their own **✕** to close that view (it shows on the -active tab and when you point at one); a docked view no longer repeats its name under its tab. More tabs than fit -scroll sideways (the wheel or a swipe; the strip fades where more tabs are hidden) while **+** stays in place. -Moving, docking, splitting and tabbing work exactly as before — see [Floating windows](controls.md#floating-windows). +share **one tab strip**: pill tabs with the view's icon and their own **✕** to close that view. More tabs than fit +scroll sideways (the wheel or a swipe; the strip fades where more tabs are hidden) while **+** stays in place, and the +strip **keeps its scroll** when you pick a tab. Moving, docking, splitting and tabbing are described in +[Floating windows](controls.md#floating-windows). + +**Long names** — an object or file name in a window header — stay on one line and end in "…", so they never push the +window's buttons out of place. Point at the name (or press and hold it on a touch screen) to read it whole. On a narrow +phone the [Animation](animation.md) window puts the name on its own line above its controls. + +### Docked windows + +Since 1.32 a window in the bottom dock has no **✕** or undock button of its own: + +- **Close it from its tab.** Every tab carries its **✕**. +- **Undock** sits at the right end of the dock's tab strip, just left of **Minimize the dock**. It takes the window you + are looking at out of the dock as a floating window. To have it take **every** docked window out as one floating + window with tabs instead, set **Settings ▸ Interface ▸ Windows & chrome ▸ Undock button** to *All as one tabbed + group* (the default is *Active window*). +- You can also drag a tab out of the strip to undock that one window. +- **The dock's +** lists every window that can live in the dock — the [Node editor](node-editor.md) and the + [Image editor](image-editor.md#in-the-dock) included, the same list as the phone's **Windows** sheet. Windows already + in the dock are highlighted, and each row says what a click does: **Remove** (closes it), **Dock** (brings a floating + window in) or **Open** (opens it as a dock tab). + +**Dock a window exactly where you want it** (desktop): drag a floating window by its header — or tear a tab out of a +tabbed window, or drag a whole tabbed window by its tab bar — onto the **dock's tab bar**. The window turns +see-through, the tab bar is outlined and a **caret** shows the slot between the docked tabs where it will land; let go +and it docks exactly there. The bottom edge of the screen still docks a window at the end of the tabs (and is the target +when the dock is empty or minimized). Everywhere else a floating window simply moves — over the open dock, over the side +drawers, partly off screen — and stays under the cursor the whole way; a header that ends up under the Controls bar is +nudged above it when you let go. + +### Floating windows with tabs + +- **Join a window as a tab:** drag a tab out of the dock and drop it onto a floating window. It joins that window as a + tab instead of opening a second window. +- **Dock all tabs:** a floating window with tabs has a dock button just left of **Close all tabs**. It puts every tab + back in the dock. For a window with one tab, drag its tab to the dock, or use the window's **Dock** button. +- **Move it by touch:** drag its tab bar — or any of its tab names — and the whole window follows your finger, on a phone + or an unfolded foldable alike. A tap on a tab still switches to it. +- **Hold a tab** (press and hold; right-click with a mouse) for its menu: **Ungroup this tab** (it floats on its own + again, just beside the group), **Dock this tab** (only that view goes into the bottom dock — greyed out for windows + that have no docked mode, such as Objects or Chat) and **Close** (closes that view; the rest of the group stays). + +**Layouts…** (**Menu ▸ Layouts**) opens a regular dialog for your saved arrangements — on a folded phone, a +[tab of the bottom dock](#the-dock-on-a-phone) — see [Workspace layouts](controls.md#workspace-layouts). Lists scroll with a thin scrollbar that appears only while you scroll or point at them; there are no chunky native scrollbars anywhere. @@ -62,6 +108,21 @@ then **Focus**, **Ping** and **Add note**, then the editing modes. Rarer work is (align to ground, origin, pivot…), **Mesh ▸** (convert, boolean…), **Physics & effects ▸** (joints, particles, flow effects), **Prefab ▸** on a placed prefab copy, and **Save as… ▸**. Every action and its shortcut is still there. +### The main menu's Project actions + +The **Project** section at the top of the main menu has two layouts, picked in **Settings ▸ Interface ▸ Lists & menus ▸ +Project actions**: + +- **Compact** (the default on a computer and an unfolded phone) is a two-column grid: **New from template…** across the + top, then **Load** | **Save ▾**, then **Import** | **Export…**. **Save** saves straight away with your last-used + options; its **▾** opens [Save options](saving.md#save-options) — what to save and what the file includes. + **Export…** opens Publish / Export. +- **List** (the default on a folded phone) is one row per action — Templates, Import, Load, Save, Publish / Export — + with the **Project | Scene | ⚙** switch under Save; the **⚙** opens the same Save options. +- **Auto** is List on a phone and Compact everywhere else. Searching the settings for *burger* or *compact* finds it. + +![The main menu's Project section in the Compact layout: New from template… across the top, then Load beside Save with its ▾, then Import beside Export…](img/interface/menu-project-compact.png){ width="290" } + ## Dialogs Modules, Sessions, Checkpoints, Templates, Storage, Publish / Export, Import and every confirmation share one dialog @@ -70,25 +131,66 @@ answers bottom-right. Each view has **one** emphasised action; a destructive ans the close button behave as before. **Customize character** is a drawer you can resize by its edge — see [Your Character](avatars.md#customize-character). +Since 1.32 every dialog — Settings, Modules, Sessions, Templates, confirmations — **covers the whole screen**, the logo +and its menu button included; close it with its own ✕, **Done**, Esc or a click outside. **What's new** +opens above everything else: the logo, undo and redo, the connection pill, notifications, your profile and the bottom +bar. + +**Questions are dialogs, outcomes are toasts.** Anything that asks you to decide something destructive or blocking is a +dialog: *Delete flow*, *Restore previous session?*, deleting a group or a prefab, rebuilding a mesh or terrain that +discards your edits, leaving a session to join another, exporting everything when nothing is selected, a scene too large +for this device. Passive results — *Saved*, *Copied*, *Exported…* — stay [toasts](notifications.md#toasts) and are kept +in the notification centre. Requests from other people (to load a session, to take control, to see your private scene) +stay cards in the corner, like connection requests: a dialog would take over your screen from afar. + +![Delete this flow? as a dialog over the dimmed screen: the logo and the toolbar are covered too, Delete flow in red beside Cancel](img/interface/dialog-delete-flow.png) + ## On a phone -Below 640 px wide the app switches to a phone layout with less on screen and nothing missing: +Below 640 px wide — a folded phone — the app switches to a phone layout with less on screen and nothing missing. An +unfolded phone and a computer share the desktop layout. -- **Top**: the logo (main menu) on the left, a **Connect chip** in the middle — tap it for your invite link, the join - field, Info and Toasts — and the notification bell and your picture on the right. +- **Top**: the logo (main menu) on the left, a **Connect chip** in the middle and, on the right, the notification bell, + the peers button (while someone is connected) and your picture. The chip shows the + [status dot](connection.md#the-status-dot) with the state beside it — **Connected**, **Connecting…** or **Offline** — + whenever the top bar has room; when the bar is crowded (people are connected and you are in a call, so the peers + button and the microphone take the space) it shrinks to the dot and ▾. Tap it for your invite link, the join field, + Info and Toasts. - **Bottom bar**: **Add · Objects · Play · Explorer · More**. Play stays the only orange control. **More** holds the - rest: Chat, the AI assistant, Notes, the node editor and every other window, the viewport tools and stats. -- **Make the bar yours**: **More ▸ Edit bar…**, or a long press on any tab, picks which views take the four slots - (More always stays). The choice is kept on this device; **Reset** goes back to the default. -- **The selection toolbar** appears only while something is selected: Move, Rotate, Scale, Inspect, Undo and Redo. - With nothing selected — just looking around — there is no toolbar; **More ▸ Edit** has Undo, Redo, Select multiple - and Interact mode. -- **Sheets sit above the bottom bar.** Objects, Explorer and the other docked views, the Inspector, Notifications, Add - and More open as bottom sheets with a handle — drag (or tap the handle) between peek, half and full height — and - the bar with Play stays visible and tappable. The selection toolbar rides on top of whatever sheet is open, so you - can pick an object in Objects and move or undo without closing it. Each sheet reopens at the height you left it, on - this device. The menus you open by long-pressing the scene are short-lived action sheets that may cover the bar - until you pick something or tap outside. + rest: Chat, the AI assistant, Notes, Scene, the node editor and every other window, the viewport tools and stats. +- **A bar button toggles its view.** Tapping Objects, Explorer or any view you put on the bar while its tab is on + screen **minimizes** the dock — every tab stays open and the 3D view clears; tap it again to bring it back. With + **Settings ▸ Interface ▸ Windows & chrome ▸ Allow undocking on touch screens** on and that window floating, the button + opens and closes the floating window instead. +- **Make the bar yours**: **More ▸ Edit bar…**, or press and hold any item on the bar, picks which views sit on it — + **More** included, which can come off the bar too. The first time you take it off, a note says how to get it back: + *press and hold any item on the bottom bar* (**Keep More** puts it straight back). The editor's header reads + **More ▸ Edit bar…** — tap **More** to go back to the More menu. The choice is kept on this device; **Reset** goes back + to the default. +- **Play plays on the screen** on a phone or tablet until you choose otherwise (a headset still enters VR). **Press and + hold Play** for its menu: *Play as* (Play, Enter VR, Enter AR passthrough), *Test play* in a game scene, **Move left / + Move right** (Play moves along the bar, and this device remembers where) and **Edit bar…**. Choosing *Enter VR* or + *Enter AR passthrough* turns Play's icon into the headset (with *A R* for passthrough), as on a computer; + **Settings ▸ VR ▸ Play on the screen, even in a headset** is the same choice. +- **The selection toolbar** appears only while something is selected — see + [The selection toolbar](#the-selection-toolbar). With nothing selected — just looking around — there is no toolbar; + **More ▸ Edit** has Undo, Redo, Select multiple and Interact mode. +- **Panels are tabs of the bottom dock.** Properties, Objects, Notes, Configure Scene and Layouts sit in the dock beside + the Explorer and the node editor — see [The dock on a phone](#the-dock-on-a-phone). +- **Menus are sheets** that open over the dock from the bottom: the main menu, More, the profile menu, notifications, the + peers panel, the Connection sheet, Add and the press-and-hold action sheets, Chat, the AI assistant, the tool palettes + (mesh edit, sculpt, spline) and Customize character — see [Sheets on a phone](#sheets-on-a-phone). The bar with Play + stays visible and tappable. Above the dock, the Add list and the other sheets that work on the selection, the + selection toolbar rides just above the top edge — never on top of it — and follows that edge in the same frame while + you drag a grab bar, so you can pick an object in Objects and move or undo without closing it. While a **menu** is + open — the main menu, the profile menu, notifications, Connection, More, an object's or the viewport's action sheet, + Customize character, Settings or any dialog — the selection toolbar hides, and it comes back when the menu closes. +- **Docked windows open with their sidebars hidden**: the Explorer, Node editor, UV editor, HUD editor, Profiler, Image + editor and Code workspace give the screen to their work area (folded or unfolded). Open a side panel with its edge + button or tab; it stays open next time, for that window. +- **The dock's +** at the end of its tab strip opens a **Windows** sheet: every window — the five dock panels included — + with a show/hide switch. With floating windows allowed on the phone (**Settings ▸ Interface ▸ Windows & chrome ▸ Allow + undocking on touch screens**), **+** works as on a computer — a menu that adds a window to the dock. - **Editors fit a phone**: the [Animation](animation.md#on-a-phone) window shows one pane at a time, the [Shader editor](shader-graph.md#on-a-phone) gives the canvas the whole screen with the palette and properties as sheets, and every toolbar that does not fit — UV editor tools, Profiler controls — scrolls sideways (with a fade where @@ -98,6 +200,82 @@ Below 640 px wide the app switches to a phone layout with less on screen and not Touch targets are at least 44 px, switches 51 × 31, and text fields use 16 px text so the browser never zooms. +### The dock on a phone + +On a folded phone the panels you work in are **tabs of the bottom dock**, in the same strip as the Explorer, the node +editor and the other editors: + +| Tab | What it shows | Opens from | +|---|---|---| +| **Properties** | the selected object's properties | **Inspect** in the selection toolbar | +| **Objects** | the object list | the bar's **Objects** | +| **Notes** | the scene's notes; opening a note shows it as a page of the tab, closing it returns to the list | **More ▸ Notes** | +| **Configure Scene** | the scene's settings | **More ▸ Scene**, or the main menu's **Configure Scene** | +| **Layouts** | save and switch [workspace layouts](controls.md#workspace-layouts) | the main menu's **Layouts**, or the dock's **+** | + +- **All tabs share one height.** Drag the dock's grab bar to resize it; swipe it down to minimize the dock. +- **A tab's ✕** closes that panel. The dock's **+** lists every window, these five included, with a show/hide switch. +- **Several can be open at once** — the properties no longer close when you open the notes. +- **Play stays on top** of whatever is open. +- **The main menu closes** as Configure Scene opens, since its tab is underneath the menu. On a computer the menu stays + open beside the drawer. + +![On a folded phone: the selection toolbar above the dock, whose tab strip holds Explorer and Properties (in front) with + beside them; the Properties tab shows the selected Box, and the bottom bar with Play sits underneath](img/interface/dock-tabs-properties-phone.png){ width="360" } + +**Folding and unfolding.** Unfold the phone (or widen the window past 640 px) and each tab goes back to its place on the +bigger screen: Properties and Configure Scene to the Inspector drawer on the right, Objects to its floating window, Notes +to the notes drawer, Layouts to the Layouts dialog. Fold it again and the same tabs come back, with the one you were +looking at in front. What you open or close on the bigger screen carries over. The right-hand column shows one drawer at +a time, so the other one waits and is a tab again on the next fold. A reload starts with a clean slate. + +### Sheets on a phone + +Since 1.32 every sheet works the same way: + +- **One grab bar** sits at the top of each sheet. It never scrolls away with the sheet's contents. +- **Drag the bar** to make the sheet taller or shorter. It stops at a minimum and a maximum height, and each sheet + **remembers** its height on this device. +- **Swipe the bar down to the bottom** to close the sheet; a tap on the bar steps its size. +- **No sheet covers Play** or the selection toolbar, and none rises into the top bar. + +Since the 1.32 review a sheet also **moves by its body**, the way a phone's own sheets do — Add, the main menu, the +notification centre, the profile menu, More and Chat: + +- A list inside the sheet **scrolls** as usual. When the list is at its top, **pulling down** moves the sheet, and + letting go far enough — or **flicking** down — closes it. +- A drag that started as a scroll stays a scroll: scrolling up and back down in one movement never closes the sheet. + Pulled down and then back up, the sheet stops at its height and the list carries on scrolling. +- A quick flick closes the sheet from any height; a gentle one steps down to the next size. Past its tallest size the + sheet stretches with resistance and springs back. +- Sideways strips, sliders, number fields and canvases inside a sheet keep their own gestures. +- **The dock minimizes instead of closing.** Its grab bar — or a pull down from the top of a tab's list — minimizes the + dock with every tab still open (Properties, Objects, Notes, the Explorer, the node editor and the rest). The bottom + bar's buttons bring it back. +- **Your profile menu** — tap your picture — is a sheet too, without a second copy of your picture in its header (it is + already at the top right). **Customize character** and **Profile settings** open from it with a tap. +- **The peers panel** — the peers button in the top bar — opens as a sheet like the notifications: grab bar, swipe down + to close. See [Who is here](connection.md#who-is-here-the-peers-panel). + +For the Explorer's long-press actions on a phone, see [Explorer: on a phone](explorer.md#on-a-phone). + +### The selection toolbar + +When something is selected, a toolbar floats above the bottom bar — or above the dock or sheet that is open, moving +with its top edge in the same frame while you resize it: + +| Button | What it does | +|---|---| +| **Move / Rotate / Scale** | the gizmo mode (keys 1 / 2 / 3) | +| **Select multiple** | a toggle: while it is on, every tap adds or removes an object (there is no Shift on a phone) | +| **Interact** | a toggle: tap the scene to play with it instead of editing (I) — see [Edit and Interact](controls.md#edit-and-interact) | +| **Inspect** (the sliders icon) | opens the object's properties as the dock's **Properties** tab, or brings that tab to the front when another tab is in front; tap it again to close it. It looks pressed only while Properties is the tab on screen | +| **Undo / Redo** | | + +Every toggle shows its state: a filled (tinted) button is on. Tapping a selected object deselects it — see +[Tapping to select](controls.md#tapping-to-select-on-a-touch-screen). + +![The selection toolbar on a folded phone: Move (on), Rotate, Scale, Select multiple, Interact, then Inspect, then Undo and Redo, above the bottom bar with Play](img/interface/selection-toolbar-phone.png){ width="360" } + ## For module authors Every part shown here is on the **/kit** page of the app, in every state, and module panels can use the same parts — see diff --git a/docs/lod.md b/docs/lod.md index 70998421..644c698f 100644 --- a/docs/lod.md +++ b/docs/lod.md @@ -61,6 +61,19 @@ group to the object; the level files are only downloaded when the object is firs need one, and once for every copy in the scene. Pieces placed before their pack had LOD files pick them up automatically. Pack authors: see the `lods` field in the core repo's `PACKS.md`. +## A simple stand-in until the model arrives (fallback groups) + +A group can say that the object ITSELF is only a **stand-in**: `userData.lod.fallback = true`. Its own meshes (a few +primitives — a box-and-cone fish) are then LOD0 and draw only while the real model is not there yet (its pack file is +still loading) or cannot be reached (offline, a blocked CDN). Level 1 is the real model — a pack item or any GLB, which +does not need to share a single node name with the stand-in — and levels 2 onward are its own LOD files, picked by +screen size as usual. + +The **Aquarium** example is built this way: every fish, coral and plant is a primitive stand-in whose fallback group +names an [Aquarium Kit](packs.md) model. The scene file stays small (the models are references), it opens instantly with +its stand-ins, and anyone who cannot reach the pack still sees a working tank. Selection, physics and saving always use +the stand-in; motion nodes like [Body Wave](nodes/bodywave.md) bend the drawn model too. + ## In VR The VR **Properties** panel has a **LOD** row: it reads the level being drawn (`Auto · LOD1`, or diff --git a/docs/main-graph.md b/docs/main-graph.md index fcfc3f91..bccbf456 100644 --- a/docs/main-graph.md +++ b/docs/main-graph.md @@ -9,8 +9,8 @@ screen. ## Where it is -- **Node editor** (N) ▸ **Flows** ▸ **Main** — the first row of the list. The chip at the top of the canvas - says *Main graph*. It is the same scene-wide graph that was called *Scene* before 1.23. +- **Node editor** (N) ▸ **Flows** ▸ **Main** — the first row of the list. The breadcrumb bar at the top of + the canvas reads **⌂ Scene** (point at it for *Scene — the Main graph*). It is the same scene-wide graph that was called *Scene* before 1.23. - **⚙** on the right edge of the node editor opens the side panel; its **ⓘ Params** tab shows the selected node's properties. - Double-click a node, or right-click it ▸ **Open code**, to see its code. diff --git a/docs/materials.md b/docs/materials.md index 47c68bc4..57b2b2b8 100644 --- a/docs/materials.md +++ b/docs/materials.md @@ -1,8 +1,8 @@ # Material Presets A **material preset** is a named look for an object's surface — colour, roughness, metalness, glow, transparency and up -to two image maps (a texture and a normal map) — that you apply with one click. Seven come built in: **Wood**, **Metal**, -**Plastic**, **Glass**, **Stone**, **Rubber** and **Neon**. You can save your own, rename and delete them, and everyone +to two image maps (a texture and a normal map) — that you apply with one click. Eight come built in: **Wood**, **Metal**, +**Plastic**, **Glass**, **Stone**, **Rubber**, **Fish scales** and **Neon**. You can save your own, rename and delete them, and everyone in your session sees your presets and can use them. **Where:** select an object and open its properties (double-click it, or right-click ▸ **Properties**). In the @@ -25,6 +25,25 @@ in your session sees your presets and can use them. ![Editing your presets: rename, download and delete on your own swatches](img/materials/presets-edit.png) +## Fish scales and the look tier + +**Fish scales** is an iridescent look: a thin film over the surface shifts its colour with the viewing angle (the +silver-blue flash of a turning fish), over a procedural relief of overlapping scales, with a light clear coat and a hint +of see-through (transmission) so a fin reads thin. Recolour it in the Inspector for any fish, snake, dragon or beetle +shell. The Aquarium's fish wear it. + +Some of that costs more than every device can pay, so each device draws a material at its own **look tier** — decided +the way water quality is (from the headset and the automatic quality level), never written into the scene: + +| Device | Draws | +|---|---| +| Desktop, full quality | everything | +| Phone (or a lowered quality level) | everything but transmission — it renders the whole scene a second time | +| Headset (or the lowest levels) | no transmission, no thin film, no sheen — the plain lit surface | + +The look you chose is what is saved and what your peers receive; a device drawing less keeps the full numbers beside the +material, so saving on a headset and opening on a desktop shows the full look again. + ## What gets saved, and where - Your presets live **on this device** (browser storage). They are not part of the scene file. An object that wears a diff --git a/docs/modules.md b/docs/modules.md index 0ce8722b..5a94aab5 100644 --- a/docs/modules.md +++ b/docs/modules.md @@ -8,6 +8,14 @@ Open it from **Menu ▸ Modules**. Since 1.30 **Install from file…** sits in t show counts, a **Filter modules** field narrows whatever the tab lists (name, description, author, tags), and each module is one row — name, version, description, its actions, the download-as-example icon and its on/off switch. +Since 1.32 every row is laid out the same way at any width, a phone included: the name and description on the left, the +controls on the **right** — on **Core**, the download icon and the switch; on **User**, **Remove** and the switch; on +**Browse**, **Install** (or **Retry**). A module's own actions — Button & door's **+ Button**, Pong's **spawn / remove**, +**Update** — sit under its name and description. A description that is cut short ends in a chevron: tap the text to read +all of it, tap again to fold it. The dev-URL row fits a phone's width too. + +![Modules ▸ Core on a folded phone: each module's download icon and switch on the right, + Button and Pong: spawn / remove under their descriptions, and VR Sleeve Palette's description tapped open in full](img/modules/core-phone.png){ width="300" } + - **Core modules** ship with the app (hello, button, pong, VR sleeve). Toggle each on or off: both are **live** (since 1.20, disabling no longer needs a reload). - The dungeon generator, piano, avatar controller, VR essentials and drivable car used to ship in the app; they now live in the **Browse** gallery, so install them there when you want them. Everyone in a session needs the same modules for shared behaviour to match — including anyone who joins later. - **⬇ Download as example** exports a core module as a zip — the best starting point for writing your own. @@ -31,7 +39,9 @@ The manager's **Install zip** / **Install URL** buttons load third-party modules - **URL** — a base URL serving the same layout (GitHub `tree` links are converted automatically; the host needs CORS). **Update** on the card re-fetches from the same URL. - **Browse** — a gallery of community modules from [github.com/theprototype-app/modules](https://github.com/theprototype-app/modules), installed with one click. Installed entries dim; an **Update** button appears when the gallery lists a newer version. The same trust model applies — gallery modules run unsandboxed. -Installing from Browse keeps you on Browse, so you can install several in a row. The **User** tab's count grows (and pulses) to show where they went; opening it scrolls to the newest card and flashes it. Every module's buttons, its Dev URL row and Remove live on that card. +Installing from Browse keeps you on Browse, so you can install several in a row. Click **Install** on as many modules as +you like — each installs on its own, none cancels another, and its card shows **Installing…** until it finishes. If one +fails, its card says why (for example a download error) with **Retry**; **Details** shows the full message. The **User** tab's count grows (and pulses) to show where they went; opening it scrolls to the newest card and flashes it. Every module's buttons, its Dev URL row and Remove live on that card. User modules install, update, disable and remove **live** — the manager genuinely unloads everything a module registered (menus, nodes, effects, handlers, timers, listeners) without a page reload, and so does switching a core module off. diff --git a/docs/node-editor.md b/docs/node-editor.md index 0ee45dfc..67c858bd 100644 --- a/docs/node-editor.md +++ b/docs/node-editor.md @@ -74,6 +74,23 @@ view. **Settings ▸ Input ▸ Node editor ▸ Node editor opens** chooses *Where it was left (framed when new)* (the default) or *Framed — every node in view*, which ignores saved views and always frames. Search **framed** in Settings to find it. +## The breadcrumb bar + +Since 1.32 one line across the top of the node editor says where you are — **⌂ Scene › Angelfish 1 › ⧉ Movement**. It +sits above the graph, so it never covers a node. Tap or click a crumb to see what sits beside it and jump there: + +- **Scene** or the **object** crumb lists every flow in the scene: *Main — the Scene graph* and each object that has its + own flow. The one you are on is ticked; picking it takes you back to the top of that flow. +- A **group** crumb (⧉) lists the other groups at the same level. + +Long names end in "…": point at a crumb (or **press and hold** it on a phone) to read the whole name. The ⤴ button at the +right end — or Esc — leaves a group, and the bin deletes the object's flow (it asks first, in a dialog). +Jumping between the Scene and an object's flow is two taps: the crumb, then the row. + +![The breadcrumb bar in the docked node editor: ⌂ Scene › Angelfish 1…, with the object crumb's list open — Main, the Scene graph, then the object flows, the current one ticked](img/node-editor/breadcrumb-siblings.png) + +On a phone the minimap is off by default; **⚙ Settings ▸ Minimap** turns it on. + ## Tidy graph The node editor can lay a graph out for you. @@ -98,8 +115,8 @@ Select some nodes and press Ctrl+G (or right-click ▸ **G sockets are the wires that cross the group's edge. Nothing about what the graph does changes: the nodes inside still run exactly as before. -- **Double-click** the group (or press Tab) to open it. A breadcrumb at the top shows where you are; - Esc, Tab or the breadcrumb take you back out. +- **Double-click** the group (or press Tab) to open it. The [breadcrumb bar](#the-breadcrumb-bar) at the top + shows where you are; Esc, Tab, ⤴ or a crumb take you back out. - Inside, **Group inputs** and **Group outputs** stand for the outside. Drag an inner socket onto their **+ new** row to expose it as a group socket. - Draw a wire onto a group's socket from outside and it connects to the real socket inside. diff --git a/docs/nodes.md b/docs/nodes.md index 204be40a..e219b508 100644 --- a/docs/nodes.md +++ b/docs/nodes.md @@ -136,6 +136,10 @@ node with code (Script, Behaviour, a module's node) opens that code — see | [**Bounce**](nodes/bounce.md) | Bounces the connected object up and down off its resting height, like a dribbled ball. | | [**Orbit**](nodes/orbit.md) | Circles the connected object around its resting position on the horizontal plane. | | [**Path patrol**](nodes/pathpatrol.md) | Walks the connected object along a series of waypoints you click into the scene, facing along the path. | +| [**Follow Path**](nodes/followpath.md) | Moves the connected object along a smooth path - a drawn Spline, a Flow path or its own waypoints - at a speed, looping, ping-ponging or once, facing along it and leaning into the turns. | +| [**Wander**](nodes/wander.md) | Drifts the connected object around a smooth, never-repeating target inside an area object (a water volume, a room) or a box around where it was placed. | +| [**Orient to Velocity**](nodes/orientvelocity.md) | Turns the connected object to face the way it is moving, smoothly, leaning into turns - put it after Wander, Orbit or any mover. | +| [**Body Wave**](nodes/bodywave.md) | Bends the connected object with a wave travelling along its body - a swimming fish, a snake, a flag, a tail - stronger and faster the faster it moves. | | [**Rotate / Motor**](fluids.md#nodes) | Turns its object about one of its own axes at an rpm with a spin-up; on a dynamic body during a simulation, a motor of a given torque. Paddles it turns push fluid (1.25). | | [**Float Along Flow**](fluids.md#nodes) | Carries its object along the nearest (or wired) flow path at the path's speed, bobbing and facing the current (1.25). | | [**Animation Finished**](nodes/animfinished.md) | Fires a pulse when the connected object's animation clip reaches its end. | diff --git a/docs/nodes/bodywave.md b/docs/nodes/bodywave.md new file mode 100644 index 00000000..28c42d28 --- /dev/null +++ b/docs/nodes/bodywave.md @@ -0,0 +1,34 @@ +# Body Wave + +Bends the connected object with a wave travelling along its body — a swimming fish, a snake, a flag, a tail — stronger and faster the faster it moves, curving into turns. A shader effect: physics and picking keep the rest pose. + +**Output:** effect (wire into an [Object Selector](objectselector.md), or leave it in an object's own flow) + +## Inputs + +Every range parameter has a socket (a wired value overrides its slider). + +## Parameters + +| Parameter | Default | Range | Meaning | +|---|---|---|---| +| amplitude | 0.08 | 0 – 0.5 | sideways swing at the tail, as a share of the body length | +| wavelength | 1 | 0.2 – 4 | body lengths per wave (1 = one S along the body) | +| frequency | 1.5 | 0 – 10 Hz | beats per second at rest | +| stiffness | 0.3 | 0 – 0.95 | the front share that does not bend (a fish's head) | +| falloff | 2 | 0.25 – 6 | how sharply the swing grows toward the tail | +| speedGain | 1 | 0 – 10 | extra Hz per m/s of speed | +| ampGain | 0.5 | 0 – 5 | extra amplitude per m/s | +| turnBend | 0.5 | 0 – 2 | how far the body bows into a turn | +| forward | +z | axis | the nose axis (the wave runs from it to the tail) | +| side | horizontal | horizontal / vertical | the bend direction: horizontal = a fish or snake, vertical = a whale or dolphin | +| reverse | off | | the wave runs tail → head (a flag rippling toward its pole) | + +The bend is computed in the vertex shader over every mesh in the object (and over a fallback LOD group's real model), measured along the forward axis from the nose. Each waving mesh gets its own copy of its material while the wave runs (so two fish sharing a material can swim differently); the original comes back, with any edit you made meanwhile, when the wave stops. Saves are untouched. + +## Practical example + +A flag on a pole: a plane flag whose pole edge points `-x` — set `forward` -x, `side` horizontal, `reverse` on, stiffness 0, amplitude 0.15, frequency 2. + +!!! note + The shadow keeps the rest shape, and normals are not bent — keep the amplitude modest for close-ups. diff --git a/docs/nodes/followpath.md b/docs/nodes/followpath.md new file mode 100644 index 00000000..758e52f4 --- /dev/null +++ b/docs/nodes/followpath.md @@ -0,0 +1,39 @@ +# Follow Path + +Moves the connected object along a smooth path — a drawn **Spline**, a **Flow path** or its own waypoints — at a speed, looping, ping-ponging or once, facing along it and leaning into the turns. An offset spreads several riders out along one path. + +**Output:** effect (wire into an [Object Selector](objectselector.md), or leave it in an object's own flow — it then moves that object) + +## Inputs + +| Handle | Type | Meaning | +|---|---|---| +| path | object | the path to ride: a Spline (Draw ▸ Spline) or a Flow path. Unwired, the node rides its own `points` | +| speed, offset, bank, maxBank | number | override the card sliders when wired | + +## Parameters + +| Parameter | Default | Range / options | +|---|---|---| +| speed | 0.5 | -5 – 5 m/s (negative rides it backwards) | +| offset | 0 | 0 – 1: where along the path it starts (0.5 = halfway round) | +| mode | loop | `loop` (wraps, a closed path circles) · `pingpong` (there and back) · `once` (stops at the end) | +| align | on | face along the path | +| pitch | on | tilt up and down with the path (off keeps the nose level — a car, a walker) | +| bank | 0.5 | 0 – 1: how much it leans into turns | +| maxBank | 30 | 0 – 80°: the steepest lean | +| forward | +z | the axis the model's nose points along: `+z`, `-z`, `+x`, `-x` | +| points | — | world-space waypoints, used when nothing is wired to `path` (templates and the AI assistant write them) | + +The path is a **centripetal Catmull-Rom** curve through the points (the spline tool's own curve), walked at constant speed by arc length. The pose is a pure function of the path and the shared clock, so every peer sees the object at the same point — nothing is sent while it moves. Banking comes from the path's curvature times the speed: a tight bend at speed leans further than a gentle one. + +## Practical example + +Two fish circling a tank, half a lap apart: + +1. Draw a closed **Spline** around the inside of the tank and hide it (eye icon in the object list). +2. Give each fish a **Follow Path** node (in its own flow), wire the spline's **Object Selector** into `path`. +3. Speed 0.4, bank 0.7; the second fish gets `offset` 0.5. Add a [Body Wave](bodywave.md) so they swim, not slide. + +!!! tip + A model whose nose is not along +Z (most rigs face +Z, many imported cars face +X) — set `forward` instead of rotating the model. diff --git a/docs/nodes/orientvelocity.md b/docs/nodes/orientvelocity.md new file mode 100644 index 00000000..5ff66caf --- /dev/null +++ b/docs/nodes/orientvelocity.md @@ -0,0 +1,28 @@ +# Orient to Velocity + +Turns the connected object to face the way it is moving, smoothly, leaning into turns — put it after Wander, Orbit or any mover so it looks where it goes. + +**Output:** effect (wire into an [Object Selector](objectselector.md), or leave it in an object's own flow) + +## Inputs + +| Handle | Type | Meaning | +|---|---|---| +| turnSpeed, bank, maxBank, minSpeed | number | override the card sliders when wired | + +## Parameters + +| Parameter | Default | Range / options | +|---|---|---| +| turnSpeed | 4 | 0.1 – 30 per second: how quickly it swings round to the new heading | +| bank | 0.5 | 0 – 1: how much it leans into turns | +| maxBank | 30 | 0 – 80° | +| minSpeed | 0.02 | m/s below which it keeps its last heading (a hovering object does not spin) | +| pitch | on | tilt up and down with the motion | +| forward | +z | the model's nose axis | + +It reads the object's motion **after** every other effect on it has run (the runtime orders movers first, whatever order the graph lists them in), so it works with any mover — Wander, Orbit, Bounce, a script. Each peer smooths its own copy; they converge on the same heading. + +## Practical example + +A drone that faces where it drifts: **Wander** (area = the room) + **Orient to Velocity** (turnSpeed 3, bank 0.8) on the drone's flow. diff --git a/docs/nodes/wander.md b/docs/nodes/wander.md new file mode 100644 index 00000000..b32020a9 --- /dev/null +++ b/docs/nodes/wander.md @@ -0,0 +1,31 @@ +# Wander + +Drifts the connected object around a smooth, never-repeating target inside an **area object** (a water volume, a room) or a box around where it was placed — fish, birds, fireflies, idle drones. + +**Output:** effect (wire into an [Object Selector](objectselector.md), or leave it in an object's own flow) + +## Inputs + +| Handle | Type | Meaning | +|---|---|---| +| area | object | stay inside this object's bounds (shrunk by `margin`). Unwired: a box of `rx` × `ry` × `rz` half-extents around the object's resting position | +| speed, seed, margin, rx, ry, rz | number | override the card sliders when wired | + +## Parameters + +| Parameter | Default | Range | +|---|---|---| +| speed | 0.3 | 0 – 3: how fast the target moves (1 ≈ one wide swing every 6 s) | +| seed | 0 | 0 – 999: 0 = take it from the object, so copies never move in step | +| margin | 0.2 | 0 – 2 m kept clear of the area's sides | +| rx, ry, rz | 1, 0.3, 1 | half-extents of the box when no area is wired | + +The target is three octaves of smooth noise per axis at incommensurate rates — it never repeats, never jumps, and always stays inside the box. It is a pure function of the shared clock, so every peer sees the same wanderer in the same place. + +## Practical example + +Clownfish that potter about the tank: + +1. Give the fish a **Wander** node and wire an Object Selector of the **water volume** into `area`; margin 0.4, speed 0.2. +2. Add [Orient to Velocity](orientvelocity.md) so it faces where it is going, and [Body Wave](bodywave.md) so it swims. +3. Duplicate the fish: with `seed` 0 each copy wanders its own way. diff --git a/docs/notifications.md b/docs/notifications.md index 38350c9c..32284e65 100644 --- a/docs/notifications.md +++ b/docs/notifications.md @@ -8,14 +8,17 @@ A **🔔 bell** button sits in the top-right chrome. Click it to open a dropdown Every toast the app shows — connection events, simulation start/stop, imports, warnings — is recorded here with a relative timestamp (*just now*, *5m ago*, *2h ago*, *1d ago*), so a message you missed while it was on screen is never lost. The list keeps the most recent **50** entries and survives reloads. Opening the panel clears the unread badge; **Clear all** empties the history. -Since 1.30 a message that repeats — *Cannot reach the peer server. Retrying…* every few seconds — is **one entry with -×N** and the latest time; click it to see each time it arrived. +Since 1.30 a message that repeats is **one entry with ×N** and the latest time; click it to see each time it arrived. +Since 1.32 reconnecting to the peer server says nothing at all — only a link that stays down for about a minute leaves +one entry here (see [The status dot](connection.md#the-status-dot)). The center is a read-only log — connection requests are actioned from the toast itself (see below), not from here. ## Toasts -Toasts pop up briefly for feedback. Two things are worth knowing: +Toasts pop up briefly for feedback — the outcome of something you did (*Saved*, *Copied*, *Exported…*). Since 1.32 a +question that needs your decision, such as *Delete flow* or *Restore previous session?*, is a +[dialog](interface.md#dialogs) instead of a toast. Two things are worth knowing: - **Ordinary toasts sit *below* modals**, so an open Settings or Modules dialog is never blocked by a transient message. - **Connection requests and approvals stay on top** — a peer asking to join is always visible, even over a modal. @@ -66,6 +69,9 @@ you can delete your own reply (**×**). Adding, editing or deleting a note and r Clicking a saved note's marker opens it to read: its text, label, author and date, with **Delete**, **Follow** (fly to the pin and keep following it) and **Edit**, which brings back the card above. +Since 1.32 an open note has **‹ ›** in its header that step through **all** the scene's notes in pin order (wrapping +round), with *n/N* showing where you are — on a computer and on a phone. + **Markers.** On a desktop a note is a small badge beside its exact spot, joined to it by a thin leader line. A note that is behind something stays visible but faded, with a dashed leader. When several notes crowd together they merge into one badge with a count — click it and they spread out. In VR, note pins stay on their objects while you grab and move the @@ -79,7 +85,12 @@ The **📝 notes** button in the top-right chrome (just left of the bell) opens - Each row shows the note's name and text, which object it is on, and who wrote it. **Click a row** to fly to the note and open it; the pencil edits it and the bin deletes it. - The eye button in the header **shows or hides the note pins** in the viewport (on your screen only). -- On a narrow screen, where the drawer is a bottom sheet, drag its top handle to resize it. +**On a phone** the notes are the **Notes** tab of the bottom dock (**More ▸ Notes**; see +[The dock on a phone](interface.md#the-dock-on-a-phone)), and the dock's grab bar resizes it. Opening a note shows it as a +**page of the Notes tab**: its ‹ › step through the notes, and closing it — ✕, or swiping it down — returns to the list +exactly where you left it. The note page and the list share one height, and neither covers **Play**. + +![A note open as a page of the notes on a folded phone: ‹ 5/14 › in its header, Reply, then Delete, Follow and Edit above the bottom bar](img/notes/note-page-phone.png){ width="300" } **Settings ▸ Controls ▸ Double-click to open notes** makes a single click on a marker — and the ‹ › arrows — only fly the camera to the note, with the card opening on a double click: handy for walking through a scene full of notes without a diff --git a/docs/object-flows.md b/docs/object-flows.md index 54722ec5..0dc8771c 100644 --- a/docs/object-flows.md +++ b/docs/object-flows.md @@ -7,11 +7,11 @@ Every object can now carry **its own node graph**, alongside the shared **Scene - The **Scene flow** is the shared, world-level graph you have always had. - An **object flow** is a private graph document owned by one object. All graphs replicate live to every peer and are saved with sessions, autosave and `.tpscene` exports. -The editor's scope **follows your selection**: select an object and the Flow editor shows *that object's* flow (the chip at the top says which); deselect and you are back in the Scene flow. Flow Code shows whichever graph the editor is showing. +The editor's scope **follows your selection**: select an object and the Flow editor shows *that object's* flow (the [breadcrumb bar](node-editor.md#the-breadcrumb-bar) at the top says which — tap its crumb to jump to another flow); deselect and you are back in the Scene flow. Flow Code shows whichever graph the editor is showing. ## Creating and deleting a flow -Select an object that has no flow yet — the editor shows **" has no flow yet"** with a one-click **Create flow** button (adding a node from the palette creates it too). To remove one, open the object's flow and press the 🗑 next to the scope chip; a confirmation lists how many nodes will be removed for everyone. Deleting a flow is undoable — Ctrl+Z restores the whole graph. +Select an object that has no flow yet — the editor shows **" has no flow yet"** with a one-click **Create flow** button (adding a node from the palette creates it too). To remove one, open the object's flow and press the 🗑 at the right end of the breadcrumb bar; a **Delete this flow?** dialog says how many nodes will be removed for everyone. Deleting a flow is undoable — Ctrl+Z restores the whole graph. ## No Object Selector needed diff --git a/docs/packs.md b/docs/packs.md index 45a6ec43..f155b511 100644 --- a/docs/packs.md +++ b/docs/packs.md @@ -88,6 +88,14 @@ budget. Hooded rogue, Barbarian and four skeletons, from Kay Lousberg's CC0 KayKit packs — to place in a scene as animated models. See [Your Character](avatars.md). +## Aquarium Kit (1.32) + +**Packs ▸ Aquarium Kit** holds three realistic reef fish (clownfish, regal blue tang, emperor angelfish), a reef rock +arch a fish can swim through, a staghorn coral and two aquatic plants (Amazon sword, eelgrass). The fish turn about their +**middle** with their nose along **+Z** — what [Follow Path](nodes/followpath.md), [Orient to Velocity](nodes/orientvelocity.md) +and [Body Wave](nodes/bodywave.md) expect — and carry a thin-film iridescence (see [Fish scales](materials.md#fish-scales-and-the-look-tier)). +The **Aquarium** example (Templates ▸ Examples) uses all of them. + ## For pack authors A pack is a folder or zip with a `manifest.json` at the root: diff --git a/docs/performance.md b/docs/performance.md index b324bd9b..064997cb 100644 --- a/docs/performance.md +++ b/docs/performance.md @@ -108,8 +108,8 @@ and a panel explains it rather than leaving you looking at a tab that appears to ## The quality governor -Before any of the stops above, the app tries to keep the frames. **Settings ▸ Scene ▸ Reduce -quality when the scene is heavy** (on by default): when a heavy scene cannot hold 30 frames a +Before any of the stops above, the app tries to keep the frames. **Settings ▸ Scene ▸ Performance ▸ +Reduce quality when the scene is heavy** (on by default): when a heavy scene cannot hold 30 frames a second on this machine, quality comes down one step at a time, and each step is given back as soon as frames recover. @@ -129,16 +129,15 @@ shadow pass draws every mesh a second time and so is where the cost actually is: While it is acting, a **Reduced quality (scene is heavy)** chip sits beside the object count, and its tooltip names exactly which steps are in force. Click the chip to **hold** it there — useful when you would rather have steady frames than watch quality breathe in and out — and click it -again to give full quality back. The first time it ever acts in a session it also says so in a -toast, because the chip lives in the object list's footer and that window can be closed. +again to give full quality back. **On a phone** the governor judges frames against the phone's own refresh rate (60, 90 or 120 Hz), and never lowers quality on a scene that is trivially light — a menu, an empty room. **A phone starts lighter.** A phone or small tablet is limited by how many pixels it can fill, not by how many objects it draws, so with automatic quality on it starts the app at step 4 — shadows off, resolution 72 %, ambient occlusion off — and climbs back up -by the ordinary rule when it holds its frames. A toast offers **Use full quality** if you would rather start at full -detail (no automatic step for a minute after that). +by the ordinary rule when it holds its frames. The [notice](#when-quality-is-lowered-for-you) says what was lowered; +its **Keep full quality** starts you at full detail for the rest of the visit. **In a headset** the governor judges by the headset's own refresh rate (72, 90 or 120 Hz) instead of 30 fps. With automatic quality on, a VR session starts with **shadows off** and keeps them off for the session — the Quest budget — and never lowers the eye @@ -148,6 +147,21 @@ game whose Settings pin a **Quality** preset (Low, Medium, High) overrides all o Nothing the governor does changes the scene for anybody else, and nothing it does is written to a preference: it is a fact about this device right now. +### When quality is lowered for you + +When this device lowers quality on its own to keep frames smooth — shadows, resolution, ambient occlusion, the scene +look, particles, [water](water.md#quality) and fluid quality — it tells you with a small toast, once per session +for each thing it lowers: *Lowered water quality to keep it smooth · **Keep full quality***. The notice shows on any +device, whether or not the object list is open. It never shows in Play or in a headset; a drop there is announced when +you are back. + +**Keep full quality** gives full quality back and keeps it for the rest of this visit. Your +**Reduce quality when the scene is heavy** switch is unchanged, so the next visit is protected again. + +**No switching back and forth.** Since 1.32, if a step came back once and the frames dropped again, it stays lowered for +the rest of the scene instead of switching off and on. The chip's tooltip says so. Opening another scene, **Keep full +quality**, or turning automatic quality off and on gives it a fresh start. + ## Budgets in CI For contributors to the core repo: every Games-tab game and every General-tab level is held to diff --git a/docs/physics.md b/docs/physics.md index fea31675..f4802d48 100644 --- a/docs/physics.md +++ b/docs/physics.md @@ -106,10 +106,19 @@ While a simulation is running you can grab a dynamic object and throw it: - **Play mode** — enter play mode, put the crosshair on the object and hold the left button. It comes to you and follows the camera; **scroll** to push it further away or pull it closer; let go to throw. See below. - **Desktop editor** — drag it with the move gizmo. Releasing hands it back to the physics engine with the velocity of your throw. +- **Interact mode** — press on it and drag, with a finger or the mouse; see [Carrying things in Interact](#carrying-things-in-interact). - **VR** — grip-grab it and let go; the release imparts the throw. Throw speed is capped at 20 m/s, and the cap applies to the *magnitude*, so a hard diagonal throw goes where you aimed it rather than being bent toward an axis. +### Carrying things in Interact + +With a simulation running, press on a dynamic object in [Interact mode](controls.md#edit-and-interact) and drag: the +object is held at the **exact point you touched** and moves with your finger or cursor, at the same distance from the +camera — near or far — so it no longer jumps toward the camera when you take it. Let go while still moving to throw it; +a slow release puts it down. Throws from Interact are capped at **8 m/s**. With a mouse, the wheel pushes the held object +away or pulls it closer. A second finger never drags the held object. + ## Play mode is interact mode In play mode the crosshair grows into a ring over anything you can pick up. diff --git a/docs/profiler.md b/docs/profiler.md index 1f18bda2..34431ef2 100644 --- a/docs/profiler.md +++ b/docs/profiler.md @@ -13,8 +13,8 @@ nothing leaves the device unless you export a file, turn on ## Opening the Profiler The Profiler is a tab in the bottom dock, next to the Explorer: press **+** in the dock's tab -strip and choose **Profiler**. Like the other dock views, **⧉** undocks it into a floating window -and **⇩ Dock** puts it back. +strip and choose **Profiler**. Like the other dock views, the dock's **Undock** button takes it out +as a floating window and the window's **Dock** puts it back. ## Recording @@ -90,14 +90,38 @@ Tree, Who draws most and CPU phases need a **Detailed** recording; a light one c frame only, and says so. When no capture falls inside your selection, the nearest one is shown and labelled as such. -**Click a row** to select that object in the scene and open its settings — straight to its -[LOD section](lod.md) when it has a LOD group, which is often the fix. +**Click a row** (in the Tree or *Who draws most*) to pick that object: its numbers fill the +[Details](#details-and-settings) sidebar, and it is selected in the scene with its settings open — straight to its +[LOD section](lod.md) when it has a LOD group, which is often the fix. Switch off **⚙ Settings ▸ Select picked objects +in the scene** and a row only fills Details. !!! info "Triangles are what was drawn" A capture counts the triangles that were actually drawn, *after* [automatic levels of detail](lod.md) swapped in a lighter version. A far-away model can show far fewer triangles than it holds; hover the number to see both. +### Details and Settings + +Since 1.32 the Profiler has a sidebar on each side. The **left** one lists the recordings; it hides and comes back with +its edge button, like the Explorer's. The **right** one has two tabs: + +- **ⓘ Details** — what the selection cost. With nothing selected it is the whole recording, after a click on the graph + that one frame, after a drag the range: frame time (p50 / p95 / max), FPS, draw calls and triangles against the Quest + budget (150 / 300k), GPU time when the device measures it, the quality level, stalls and the heaviest CPU phases. From + a **Detailed** recording it also shows how many materials were drawn, what each module or game cost, and the **picked + object** — its draw calls, triangles, meshes, materials and CPU time. +- **⚙ Settings** — *Timeline graphs* (FPS, Frame ms, Draw calls, Triangles, Quality; one always stays), *Quest budget + lines*, *Follow a live stream*, *Select picked objects in the scene* (on by default) and *FPS and draw calls overlay* + (the same switch as **Settings ▸ Interface**). + +**The splitter** between the graph and the list resizes them: drag it, or focus it and use the arrow keys; +double-click resets it. On a very wide screen the graph and the list sit side by side and the bar resizes the columns. +The sidebars, the tab and the split are remembered on this device. + +![The Profiler docked on a computer: the recordings on the left, the timeline and the Tree in the middle with Heavy crate picked, and Details on the right for the frame at 2.1 s](img/profiler/details-sidebar.png) + +On a phone the Profiler opens with both sidebars hidden, so the graph gets the screen. + ### Compare **Compare** puts two recordings side by side: choose one as **A** (the baseline) and one as **B**. diff --git a/docs/publish-export.md b/docs/publish-export.md index 3e25bb94..b5a407a2 100644 --- a/docs/publish-export.md +++ b/docs/publish-export.md @@ -1,6 +1,6 @@ # Publish & Export -**Menu ▸ Publish / Export** puts a scene somewhere other people can play it. The window has four tabs: +**Menu ▸ Publish / Export** (**Export…** in the main menu's Compact layout) puts a scene somewhere other people can play it. The window has four tabs: | Tab | What it does | |---|---| diff --git a/docs/saving.md b/docs/saving.md index c20e4afc..49fb88c3 100644 --- a/docs/saving.md +++ b/docs/saving.md @@ -2,17 +2,36 @@ How to save and load your work: the recommended `.tpscene` bundle, the whole-project `.tp`, GLTF interchange, named sessions, and autosave. -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: **Project | Scene | ⚙**. +The main menu (the logo button) has **Import** (bring 3D files into the scene), **Load** (open a saved file) and **Save** in its **Project** section. Since 1.32 that section has two layouts (see [The main menu's Project actions](interface.md#the-main-menus-project-actions)): + +- **Compact** (a computer or an unfolded phone): **New from template…**, then **Load** | **Save ▾**, then **Import** | **Export…**. **Save** saves straight away with your last-used options; **▾** opens [Save options](#save-options). +- **List** (a folded phone): one row per action, with a format switch under **Save**: **Project | Scene | ⚙**. The **⚙** opens the same Save options. + +Either way you save one of two things: - **Project** saves the whole project as one `.tp` file — the Explorer library, every scene and its history (see [Projects](projects.md#the-tp-file)). - **Scene** saves the open scene as a `.tpscene` bundle (below). -- **⚙** opens the export settings. Its last two switches, **Show GLTF format** and **Show JSON format** (both off by default), add a second row with those formats. + +GLTF and JSON join them once you offer them in Save options. + +### Save options + +**Save options** puts every save setting in one dialog: + +- **Save as** — **Project** (`.tp`) or **Scene** (`.tpscene`), plus GLTF and JSON once you offer them. +- **A scene (.tpscene) includes** — Assets, Imported packs, Flow graph (see [below](#scene-tpscene-recommended)). +- **A project (.tp) includes** — Scene version history. +- **More formats** — **Offer GLTF** and **Offer JSON** (both off by default) add those formats. + +Its **Save** remembers the options and saves; **Cancel** forgets the changes. + +![Save options on a computer: Save as Project or Scene, what a scene and a project include, and More formats, with Cancel and Save at the bottom](img/saving/save-options.png){ width="400" } Ctrl+S saves the **open scene** as a new version in the [Explorer](explorer.md); a scene that has never been named asks for a name first. ## Where you left off -Restoring a session — from the **Restore** prompt, from *auto-restore* in +Restoring a session — from the **Restore previous session?** dialog, from *auto-restore* in *Settings ▸ Scene*, or by loading a scene file — brings back more than the objects: - the **panels and windows** you had open, and which dock tab was in front, @@ -26,7 +45,7 @@ had nothing open will not close the panels *you* have open. ## Starting from a template -**Menu ▸ Templates** opens a picker of ready-made scenes, in four tabs: +**Menu ▸ Templates** (**New from template…** in the Compact layout) opens a picker of ready-made scenes, in four tabs: - **General** — starting points and walkable kit levels, including a **Blank** card that clears the scene (it asks first). - **Examples** — worked showcases to pull apart and learn from. 1.22 adds five: **Aquarium**, **Pool party** and @@ -69,9 +88,9 @@ A `.tpscene` file is a zip bundle containing everything a scene needs: - **imported packs** (optional), - **the flow graph** — nodes and edges (optional). -The **⚙ export settings** dialog (next to the format switch) controls what the bundle includes: +[Save options](#save-options) control what the bundle includes: -| Checkbox | Default | +| Switch | Default | |---|---| | Assets (audio, textures, configs) | on | | Imported packs | off | @@ -84,11 +103,11 @@ The **⚙ export settings** dialog (next to the format switch) controls what the ## GLTF -Turn it on first with **⚙ ▸ Show GLTF format**. Saves the whole scene as standard GLTF — use this to take your work into other 3D tools. Loading accepts `.gltf` back. Animated flow effects are parked at their base pose during export so the file stores clean transforms. +Turn it on first with **Save options ▸ Offer GLTF**. Exports the **selected objects** as standard GLTF — use this to take your work into other 3D tools. With nothing selected it asks first and offers **Export all** for the whole scene. Loading accepts `.gltf` back. Animated flow effects are parked at their base pose during export so the file stores clean transforms. ## JSON (legacy) -A legacy scene format, hidden by default. Enable it via **⚙ ▸ Show JSON format** if you need it; otherwise prefer Scene. +A legacy scene format, hidden by default. Enable it via **Save options ▸ Offer JSON** if you need it; otherwise prefer Scene. ## Sessions manager @@ -105,7 +124,7 @@ A legacy scene format, hidden by default. Enable it via **⚙ ▸ Show JSON form A snapshot of the scene, node graph and camera is written to your browser automatically — 30 seconds after a change, plus every 3 minutes. On a **heavy scene** a snapshot takes longer to prepare, so the delay stretches (up to 5 minutes) to keep saving from stuttering the app; the [Storage panel](explorer.md#storage) (the Explorer's storage chip, or **Settings ▸ Explorer ▸ Storage used ▸ Show breakdown**) shows the current cadence and what the last snapshot cost. If a snapshot **cannot be written** — the disk is full, say — a toast stays up with **Manage storage**, and the Storage panel says *Autosave is failing*. Autosave can be turned off in **Settings**. -If a snapshot exists when you open the app, a **restore** prompt offers to bring it back. If the last attempt to restore it never finished a frame, the prompt warns you — that snapshot may be what stopped the app, so think before pressing **Restore**. +If a snapshot exists when you open the app, a **Restore previous session?** dialog offers to bring it back. If the last attempt to restore it never finished a frame, the prompt warns you — that snapshot may be what stopped the app, so think before pressing **Restore**. **Auto-restore on load** (*Settings ▸ Scene*, off by default) skips the prompt: your last scene is simply there when the app opens, and a notice tells you it was restored so an empty canvas is still one click away. diff --git a/docs/settings.md b/docs/settings.md index c5df56c4..478f5af9 100644 --- a/docs/settings.md +++ b/docs/settings.md @@ -41,6 +41,15 @@ second Esc closes Settings. Every setting is one row: its name and a one-line description on the left, the control on the right. Switches are on / off; two to four choices are a segmented control; a value with a range is a slider with its number beside it. +Since 1.32 each row decides its own layout from the room it really has in the **Settings window**, not from the size +of the screen. A small control — a switch, a colour swatch, a key box, a short dropdown, a single button, a number, a +segmented choice that fits — stays on the same line as its name. Only a control that cannot fit beside the name and its +description — a wide segmented choice, a text field, a slider on a narrow phone — moves onto its own line underneath. So +the same row can sit on one line on an unfolded phone or a computer and stack on a folded phone. A segmented choice too +wide even for its own line (**Scene ▸ Editing ▸ Double-click action** on a phone) shows its options in two columns. + +![Settings ▸ Scene on a folded phone: Double-click action's four choices in two columns under its name, while Length's dropdown, Angle's Degrees | Radians and the Duplicates switches stay beside their names](img/settings/rows-phone.png){ width="300" } + | Badge | Means | |---|---| | **This device** | the setting is kept only on this computer or headset | @@ -78,3 +87,5 @@ Changes save as you make them — there is no Save button; **Done** closes the w | Sky image quality | new in 1.27 | **Scene ▸ Performance ▸ Sky image quality** — **Auto** / **Full (1k)** / **Low (headset)**, this device only; see [Sky image quality](camera.md#sky-image-quality) | | World grab snapping | new in 1.28 | **VR ▸ Controls ▸ World grab snapping** — on by default, this device only; see [Snapping the world while you grab it](vr.md#snapping-the-world-while-you-grab-it) | | Placement preview | new in 1.31 | **Scene ▸ Performance ▸ Placement preview** — **Full model** / **Within budget** / **Box only**, plus the preview triangle budget and **Show dimensions**, this device only; see [The Placement preview setting](explorer.md#the-placement-preview-setting) | +| Undock button | new in 1.32 | **Interface ▸ Windows & chrome ▸ Undock button** — **Active window** / **All as one tabbed group**, this device only; see [Docked windows](interface.md#docked-windows) | +| Project actions | new in 1.32 | **Interface ▸ Lists & menus ▸ Project actions** — **Auto** / **Compact** / **List**, this device only: how the main menu lays out New from template, Load, Save, Import and Export; Auto is List on a phone and Compact elsewhere. See [The main menu's Project actions](interface.md#the-main-menus-project-actions) | diff --git a/docs/touch-controls.md b/docs/touch-controls.md index 7096a236..7d103097 100644 --- a/docs/touch-controls.md +++ b/docs/touch-controls.md @@ -11,7 +11,7 @@ and any button can wear your own pressed and released images. ![The touch controls layout editor, with the Jump button selected](img/touch/layout-editor.png) -For the phone layout itself — the bottom bar, the context strip and bottom sheets — see +For the phone layout itself — the bottom bar, the selection toolbar, the dock and its tabs, and the sheets — see [The Interface: On a phone](interface.md#on-a-phone). ## When they show diff --git a/docs/uv-editor.md b/docs/uv-editor.md index b50d0108..af6c7f2f 100644 --- a/docs/uv-editor.md +++ b/docs/uv-editor.md @@ -6,7 +6,7 @@ Everything here is shared: a peer sees your unwrap, your brush strokes and your ## Opening it -The UV editor is a tab in the bottom dock, next to the node editor. Open it from the dock's **+** menu ▸ **UV editor**. Select a mesh in the viewport and its UV map appears; **⧉** undocks it into a floating window, **⇩ Dock** puts it back. +The UV editor is a tab in the bottom dock, next to the node editor. Open it from the dock's **+** menu ▸ **UV editor**. Select a mesh in the viewport and its UV map appears; the dock's **Undock** button takes it out as a floating window, and the window's **Dock** puts it back. The editor follows your **selection**. If you have an Edit Mesh session open it targets that object, and if you select a group it finds the textured mesh inside it. @@ -126,6 +126,9 @@ Pick the **Paint** tool and draw — on the UV map or straight on the model in t If the slot has no texture yet, painting creates one. +Painting over a texture ends its link to the library image it was made from, so a later save in the +[Image editor](image-editor.md#textures-and-their-images) will not paint over your strokes. + ### Pen pressure Paint with a **pen** and pressure shapes the stroke. The **Pen pressure** switch in the Brush panel picks what it changes: diff --git a/docs/water.md b/docs/water.md index aa68ad45..76586049 100644 --- a/docs/water.md +++ b/docs/water.md @@ -133,11 +133,10 @@ back up by itself in the seconds after a scene has loaded — full refraction on tanks; one that cannot keep up gets the lighter look. On the lighter look, **Refraction**, **Ripples** and **Caustics** control the lensing bands and glints. -When the quality level simplifies the water, a small notice says so once per session: *Simplified water for this device -— Settings ▸ Scene ▸ Water quality ▸ High shows refraction*. Tap the path to open the setting, **✕** to dismiss. It never -shows in Play or in VR. - -![On a phone: the Simplified water notice under the Aquarium, with its link to Water quality ▸ High](img/water/phone-simplified-notice.png) +When the device lowers the water on its own, the one [quality notice](performance.md#when-quality-is-lowered-for-you) +says so once per session — *Lowered water quality to keep it smooth* — with **Keep full quality** to have full water +back for the rest of the visit. Since 1.32 the water no longer switches its refraction off and on by itself: if full +quality came back once and the frames dropped again, it stays lowered for the rest of the scene. Search Settings for *water*, *caustics* or *refraction* to find the row. @@ -145,7 +144,8 @@ Search Settings for *water*, *caustics* or *refraction* to find the row. **Menu ▸ Templates ▸ Examples** has three water scenes: **Aquarium**, **Pool party** and **Island ocean** (its boat floats and rides the swell). Pool party and Island ocean have -[Start simulation on load](physics.md#start-simulation-on-load) on, so they move as soon as they open. For particle +[Start simulation on load](physics.md#start-simulation-on-load) on, so they move as soon as they open. Since 1.32 +the Aquarium is a reef, with fish from the [Aquarium Kit](packs.md#aquarium-kit-132) pack. For particle water, see **Water works** on the [Fluids](fluids.md#example-water-works) page. ## For module authors diff --git a/mkdocs.yml b/mkdocs.yml index 31763ed0..6b5b7bc7 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -23,6 +23,7 @@ nav: - Splines: splines.md - Snapping: snapping.md - UV & Textures: uv-editor.md + - Image Editor: image-editor.md - Shader Graph: shader-graph.md - Shader Nodes: shader-nodes.md - Scene Look (Post-processing): post-processing.md @@ -101,6 +102,10 @@ nav: - Jiggle: nodes/jiggle.md - Orbit: nodes/orbit.md - Path Patrol: nodes/pathpatrol.md + - Follow Path: nodes/followpath.md + - Wander: nodes/wander.md + - Orient to Velocity: nodes/orientvelocity.md + - Body Wave: nodes/bodywave.md - Mass: nodes/mass.md - Bounciness: nodes/bounciness.md - Friction: nodes/friction.md