Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 25 additions & 12 deletions docs/VISUAL_FEATURE_COVERAGE.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,15 +65,28 @@ What moved to **covered** in the second public-product pass:
and `layer-buildup.webm` (layer-range sweep — the progressive reveal), in the feature gallery and the
workers concept page.

Still on the **to-capture** list (honest remainder — recorded, not forgotten):

- `needs animation`: **time scrub**, interaction-aware quality, user-scrub-wins, and the *actual*
load-time progressive/`hold` reveal (the layer-buildup clip stands in for it today).
- `needs comparison`: **object-aware framing** (whole-job vs model-aware), **fresh vs stale**
progress, **render scope** (plate/object subset before/after).
- `needs screenshot`: **diagnostics panel** in-context, **transparent-background capture** over a
checkerboard, per-mode **color legends** (feature/object/power), circular/polygon **bed** shots
with a flatter model for a cleaner outline.
**Remainder cleared** (new MIT fixture `skirt-brim-model.gcode` = a model wrapped by skirt + brim):

- `object-aware framing` — **captured**: `frame-all` vs `frame-object` comparison (skirt included vs
the part framed alone). In the gallery.
- `setFeatureRoleVisible` (hide brim/skirt) — **captured**: `frame-all` vs `adhesion-hidden` before/
after (skirt ring present vs gone). In the gallery.
- `getRenderStats` diagnostics in-context — **captured**: `diagnostics-panel` (the demo panel reading
backend/GPU/geometry/counts/timings beside the render). In the gallery.

Genuinely deferred, each with a recorded reason (valid dispositions, not silent omissions):

- **Transparent-background capture** — `capture({background:'transparent'})` returns correct alpha on
real hardware (AnyBridge validated on an RTX 4070), but **headless SwiftShader flattens the
render-target readback to opaque**, so a truthful composite can't be produced in the CI/dev
environment. The harness recipe (`transparent-checker`) is retained for a GPU-backed run.
- **Interaction-aware quality** — the feature *is* the motion (detail drops while orbiting, restores
on settle); a still can't carry it and a synthetic clip would misrepresent it. Documented in prose.
- **True load-time progressive/`hold` reveal** — the `layer-buildup` clip stands in; an authentic
load capture is timing-sensitive under headless SwiftShader.
- **Time scrub** animation — visually near-identical to `scrub-sweep`; redundant.
- **Fresh vs stale progress**, **render scope** (plate/object subset), per-mode **color legends** —
feasible, lower-priority polish; left for a future review round.

These are tracked here so the next release's Public Product + Documentation + Visual Review picks
them up rather than rediscovering them.
Expand All @@ -90,7 +103,7 @@ them up rather than rediscovering them.
| Retraction / de-retraction markers | ✅ | ✅ | `retraction-markers` | ✅ | gallery | — | covered |
| Seam moves | ✅ | partial | — | mention | gallery | — | needs screenshot |
| Source-line ↔ segment mapping ("debugger": `pickSegment` + `segmentAtSourceLine`) | ✅ | ❌ | — | ❌ | gallery | recipes | needs demo exposure + needs screenshot |
| Show/hide a feature role (`setFeatureRoleVisible` — e.g. hide brim/skirt) | ✅ | ✅ (toggle) | — | ❌ | gallery | — | covered (demo + tests); screenshot with a brim file pending |
| Show/hide a feature role (`setFeatureRoleVisible` — e.g. hide brim/skirt) | ✅ | ✅ (toggle) | `adhesion-hidden` | ❌ | gallery | — | covered — before/after with the skirt-brim fixture in the gallery |

## 2. Coloring & analysis modes

Expand Down Expand Up @@ -129,7 +142,7 @@ them up rather than rediscovering them.
| Renderer build stages (`stage` event) | ✅ | ❌ | — | ✅ (prose) | gallery | concept-workers | needs animation |
| Interaction-aware quality | ✅ | ❌ | — | ✅ (prose) | gallery | concept-workers | needs animation |
| Disclosed decimation / degradation | ✅ | ✅ (disclosure) | — | ✅ (prose) | gallery | concept-workers | needs screenshot (disclosure text) |
| Render diagnostics (`getRenderStats`) | ✅ | ✅ (panel) | — | ✅ | gallery | concept-workers | demo + README + gallery covered; in-context panel screenshot pending |
| Render diagnostics (`getRenderStats`) | ✅ | ✅ (panel) | `diagnostics-panel` | ✅ | gallery | concept-workers | covered — panel-in-context screenshot in the gallery |
| Geometry worker pool (parallel tubes) | ✅ | ❌ | — | mention | gallery | concept-workers | not visually meaningful (diagnostics panel proxies it) |
| WebGL context-loss recovery | ✅ | ❌ | — | mention | — | — | not visually meaningful |

Expand All @@ -140,7 +153,7 @@ them up rather than rediscovering them.
| Camera presets (7 views) | ✅ | ✅ | `camera-top/front/iso` | ✅ | gallery | — | covered (labeled sequence) |
| Perspective vs orthographic | ✅ | ✅ | (in camera trio) | ✅ | gallery | — | covered |
| Saved/restored camera state | ✅ | ✅ | — | mention | — | recipes | not visually meaningful |
| Object-aware framing (`frameContent`) | ✅ | ✅ | — | ✅ (prose) | gallery | concept-ir-capabilities | needs comparison — whole-job vs model-aware |
| Object-aware framing (`frameContent`) | ✅ | ✅ | `frame-all`/`frame-object` | ✅ (prose) | gallery | concept-ir-capabilities | covered — whole-job vs model-aware comparison in the gallery |
| Build-volume cage toggle | ✅ | ✅ | — | mention | gallery | — | needs screenshot |
| Capture / export → Blob | ✅ | ✅ | — | ✅ | gallery | recipes | covered (demo Capture PNG + README + gallery); in-context screenshot pending |
| Transparent / independent-background capture | ✅ | ✅ (via capture) | — | ✅ | gallery | recipes | demo + README covered; checkerboard screenshot pending |
Expand Down
35 changes: 28 additions & 7 deletions docs/manual/feature-gallery.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,16 @@ The core job: turn a sliced file into an interactive picture of the actual moves
order. Scrubbing is a draw-range trim, so it stays smooth even on large models.*

Also here: **segment scrub** (step move-by-move), **time scrub** with an honest print-time estimate
(labeled *slicer estimate* vs *kinematic approximation*), **hide by feature role**
(`setFeatureRoleVisible` — e.g. hide brim/skirt to declutter a part preview), and **source-line ↔
segment mapping** — click a move to find its byte in the file, and back. See [recipes](recipes.md).
(labeled *slicer estimate* vs *kinematic approximation*), and **source-line ↔ segment mapping** —
click a move to find its byte in the file, and back. See [recipes](recipes.md).

**Hide by feature role** (`setFeatureRoleVisible`) — e.g. hide brim/skirt to declutter a part
preview, at the same framing:

| Brim + skirt shown | Adhesion hidden |
|---|---|
| ![A model with its skirt ring and brim shown](../media/frame-all.png) | ![The same view with the skirt and brim hidden, leaving just the model](../media/adhesion-hidden.png) |
| The pink skirt ring and brim frame the part. | `setFeatureRoleVisible(Skirt/Brim, false)` leaves only the model. |

## Coloring & analysis

Expand Down Expand Up @@ -81,6 +88,12 @@ clean `hold` reveal**, staged preparation progress, and **`getRenderStats()`** d
hardware-vs-software GPU, draw calls, timings — never fabricated). See
[workers, streaming & performance](concept-workers.md).

![The demo's Render diagnostics panel populated beside the render — backend 3d-webgl (WebGL 2), software ANGLE/SwiftShader GPU, geometry tubes, segment and draw counts, tube bytes, and timings](../media/diagnostics-panel.png)

*`getRenderStats()` in context — every value read from the actual render, never fabricated; here
reporting a software (SwiftShader) backend, `108,725 / 108,729` segments, 92 draw calls, and the
build/first-frame timings.*

## Cameras, framing & capture

| | | |
Expand All @@ -89,10 +102,18 @@ hardware-vs-software GPU, draw calls, timings — never fabricated). See
| **Front** (ortho) | **Top** (ortho) | **Iso** (perspective) |

Seven **camera presets**, orthographic/perspective, and a serializable **camera state** you can
persist and restore. **Object-aware framing** fits the printed object — excluding skirt, prime line,
and purge — instead of the whole machine volume. **`capture()`** returns the current view as a `Blob`
(PNG/JPEG/WebP), including a **transparent background** for compositing onto cards, from the
interactive viewer *or* the headless still.
persist and restore.

**Object-aware framing** (`frameContent: 'object'`) fits the printed object — excluding skirt, prime
line, and purge — instead of the whole machine volume:

| Whole-job framing | Object-aware framing |
|---|---|
| ![A small model framed together with its wide skirt ring, so the model sits small](../media/frame-all.png) | ![The same model framed tightly on the part, with the skirt excluded](../media/frame-object.png) |
| `'all'` fits everything, so the model is small inside its skirt. | `'object'` fits the part — the skirt/brim fall outside the frame. |

**`capture()`** returns the current view as a `Blob` (PNG/JPEG/WebP), including a **transparent
background** for compositing onto cards, from the interactive viewer *or* the headless still.

## Models & plates — the other renderer

Expand Down
Binary file added docs/media/adhesion-hidden.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/diagnostics-panel.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/frame-all.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/frame-object.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading