QA - M1 Brush-based blockout acceptance signoff #37

Open
opened 2026-06-06 13:14:43 -04:00 by Rbanh · 8 comments
Owner

Summary

Milestone-level QA/signoff ticket for M1 - Brush-based blockout. This ticket intentionally reopens milestone tracking even though implementation tickets #10-#15 are closed, so acceptance can be approved as a collective editor workflow.

Scope

Validate the shipped brush milestone end-to-end in the editor, including brush schema/hydration, draw workflow, edit modes, CSG, per-face material/UV authoring, validation, repair, save behavior, undo/redo, and docs/workflow coherence.

Combined Acceptance Checklist

BS-JD-101 - Brush authoring schema and hydration MVP (#10)

  • Convex brush data serializes in scenes and migrates with schema.
  • Hydration creates visible mesh and collider output.
  • Generated entities are never saved.
  • Brush actor appears in hierarchy/inspector with clear metadata.

BS-JD-102 - Quick add and draw-brush tool (#11)

  • User can create a basic convex brush from the viewport.
  • Preview updates before commit.
  • Escape/right-click cancels with no dirty state.
  • Commit creates one undo entry.

QA-approved and committed locally as 48b1448 (Improve quick brush creation workflow). Enhancements include concave-to-convex composition, duplicate point normalization, optimized convex part merging, viewport key hints, and two-step height selection before final commit.

BS-JD-103 - Brush element edit modes (#12)

  • Brush vertices, edges, and faces can be selected and transformed.
  • Clip mode previews result before commit.
  • Invalid edits are rejected with clear status text.
  • Edits are undoable as grouped operations.

BS-JD-104 - Brush CSG operations (#13)

  • Subtract, intersect, and convex merge operate on selected brushes.
  • Preview and commit/cancel behavior is consistent.
  • Results hydrate to valid mesh/collider output.
  • Invalid results report cause and do not dirty the scene.

BS-JD-105 - Per-face material and UV controls (#14)

  • Each face can reference a material or texture.
  • UV offset/scale/rotation edits preview and persist.
  • Drag/drop assignment works for brush faces.
  • Saved scene remains authoring-data only.

BS-JD-106 - Brush validation, repair, and diagnostics (#15)

  • Invalid brushes are detected before hydration produces bad geometry.
  • Diagnostics identify affected face/edge/vertex where possible.
  • Repair actions are undoable.
  • Save validation blocks unrecoverable invalid brush data.

Suggested QA Pass

  • Create a new brush from the viewport, commit it, undo/redo it, save/reload the scene.
  • Select a brush and exercise Vertex, Edge, Face, and Clip modes.
  • Verify invalid drag/clip/CSG paths show status and leave scene state clean.
  • Run subtract/intersect/merge_convex and validate preview, Enter commit, Esc cancel.
  • Assign material/texture refs to selected faces via picker and drag/drop; verify persistence after save/reload.
  • Open Window -> Brush Diagnostics; verify invalid rows, Select, and Reset Cube behavior.
  • Inspect saved .scn.ron to confirm generated brush mesh children are stripped.

Signoff Notes

Use this ticket for QA findings and final M1 approval. If any checklist item fails, open or link a follow-up issue and leave this ticket open until the milestone is accepted.

## Summary Milestone-level QA/signoff ticket for **M1 - Brush-based blockout**. This ticket intentionally reopens milestone tracking even though implementation tickets #10-#15 are closed, so acceptance can be approved as a collective editor workflow. ## Scope Validate the shipped brush milestone end-to-end in the editor, including brush schema/hydration, draw workflow, edit modes, CSG, per-face material/UV authoring, validation, repair, save behavior, undo/redo, and docs/workflow coherence. ## Combined Acceptance Checklist ### BS-JD-101 - Brush authoring schema and hydration MVP (#10) - [x] Convex brush data serializes in scenes and migrates with schema. - [x] Hydration creates visible mesh and collider output. - [x] Generated entities are never saved. - [x] Brush actor appears in hierarchy/inspector with clear metadata. ### BS-JD-102 - Quick add and draw-brush tool (#11) - [x] User can create a basic convex brush from the viewport. - [x] Preview updates before commit. - [x] Escape/right-click cancels with no dirty state. - [x] Commit creates one undo entry. QA-approved and committed locally as `48b1448` (`Improve quick brush creation workflow`). Enhancements include concave-to-convex composition, duplicate point normalization, optimized convex part merging, viewport key hints, and two-step height selection before final commit. ### BS-JD-103 - Brush element edit modes (#12) - [ ] Brush vertices, edges, and faces can be selected and transformed. - [ ] Clip mode previews result before commit. - [ ] Invalid edits are rejected with clear status text. - [ ] Edits are undoable as grouped operations. ### BS-JD-104 - Brush CSG operations (#13) - [ ] Subtract, intersect, and convex merge operate on selected brushes. - [ ] Preview and commit/cancel behavior is consistent. - [ ] Results hydrate to valid mesh/collider output. - [ ] Invalid results report cause and do not dirty the scene. ### BS-JD-105 - Per-face material and UV controls (#14) - [ ] Each face can reference a material or texture. - [ ] UV offset/scale/rotation edits preview and persist. - [ ] Drag/drop assignment works for brush faces. - [ ] Saved scene remains authoring-data only. ### BS-JD-106 - Brush validation, repair, and diagnostics (#15) - [ ] Invalid brushes are detected before hydration produces bad geometry. - [ ] Diagnostics identify affected face/edge/vertex where possible. - [ ] Repair actions are undoable. - [ ] Save validation blocks unrecoverable invalid brush data. ## Suggested QA Pass - [x] Create a new brush from the viewport, commit it, undo/redo it, save/reload the scene. - [ ] Select a brush and exercise Vertex, Edge, Face, and Clip modes. - [ ] Verify invalid drag/clip/CSG paths show status and leave scene state clean. - [ ] Run subtract/intersect/merge_convex and validate preview, Enter commit, Esc cancel. - [ ] Assign material/texture refs to selected faces via picker and drag/drop; verify persistence after save/reload. - [ ] Open Window -> Brush Diagnostics; verify invalid rows, Select, and Reset Cube behavior. - [ ] Inspect saved `.scn.ron` to confirm generated brush mesh children are stripped. ## Signoff Notes Use this ticket for QA findings and final M1 approval. If any checklist item fails, open or link a follow-up issue and leave this ticket open until the milestone is accepted.
Rbanh added this to the M1 - Brush-based blockout milestone 2026-06-06 13:14:43 -04:00
Author
Owner

BS-JD-103 / #12 checklist hardening update:

Committed locally as 1b9fbeb (Group brush clip history edits). Clip mode now commits transform + brush changes as one grouped history command, so one undo/redo step should restore/apply the whole clip operation together.

Verification passed:

  • cargo fmt --check
  • cargo test -p editor brush_edit
  • cargo check -p editor --all-targets
  • cargo check --workspace --all-targets
  • cargo check --workspace --all-targets --all-features

Leaving the #37 checklist unchecked until interactive QA confirms the edit-mode flow.

BS-JD-103 / #12 checklist hardening update: Committed locally as `1b9fbeb` (`Group brush clip history edits`). Clip mode now commits transform + brush changes as one grouped history command, so one undo/redo step should restore/apply the whole clip operation together. Verification passed: - `cargo fmt --check` - `cargo test -p editor brush_edit` - `cargo check -p editor --all-targets` - `cargo check --workspace --all-targets` - `cargo check --workspace --all-targets --all-features` Leaving the #37 checklist unchecked until interactive QA confirms the edit-mode flow.
Author
Owner

BS-JD-104 / #13 checklist hardening update:

Committed locally as 3f85d25 (Group brush CSG history edits). CSG commit now records the primary transform/brush update and merge/intersect operand deletion as one grouped history command, so undo/redo should step the whole CSG operation together.

Verification passed:

  • cargo fmt --check
  • cargo test -p editor brush_csg
  • cargo check -p editor --all-targets
  • cargo check --workspace --all-targets
  • cargo check --workspace --all-targets --all-features

Leaving the #37 checklist unchecked until interactive QA confirms subtract/intersect/merge behavior.

BS-JD-104 / #13 checklist hardening update: Committed locally as `3f85d25` (`Group brush CSG history edits`). CSG commit now records the primary transform/brush update and merge/intersect operand deletion as one grouped history command, so undo/redo should step the whole CSG operation together. Verification passed: - `cargo fmt --check` - `cargo test -p editor brush_csg` - `cargo check -p editor --all-targets` - `cargo check --workspace --all-targets` - `cargo check --workspace --all-targets --all-features` Leaving the #37 checklist unchecked until interactive QA confirms subtract/intersect/merge behavior.
Author
Owner

BS-JD-105 / #14 checklist audit:

No additional local code changes were needed in this pass. Face-mode inspector controls, Asset Browser-aware material/texture picker/drop rows, persisted BrushFaceDesc refs/UV fields, and shared hydration face grouping are present. Verification rerun with cargo test -p shared brush and cargo check -p editor --all-targets.

Leaving the #37 checklist unchecked until interactive QA confirms material/texture assignment, UV preview, and save/reload persistence.

BS-JD-105 / #14 checklist audit: No additional local code changes were needed in this pass. Face-mode inspector controls, Asset Browser-aware material/texture picker/drop rows, persisted `BrushFaceDesc` refs/UV fields, and shared hydration face grouping are present. Verification rerun with `cargo test -p shared brush` and `cargo check -p editor --all-targets`. Leaving the #37 checklist unchecked until interactive QA confirms material/texture assignment, UV preview, and save/reload persistence.
Author
Owner

BS-JD-106 / #15 checklist audit:

No additional local code changes were needed in this pass. Shared validation, hydration skip, save blocking, inspector diagnostics, Window -> Brush Diagnostics, and undoable Reset Cube repair are present.

Verification rerun:

  • cargo test -p shared brush
  • cargo test -p shared actor
  • cargo check -p editor --all-targets

Leaving the #37 checklist unchecked until interactive QA confirms diagnostics selection/reset and invalid-brush save blocking.

BS-JD-106 / #15 checklist audit: No additional local code changes were needed in this pass. Shared validation, hydration skip, save blocking, inspector diagnostics, Window -> Brush Diagnostics, and undoable Reset Cube repair are present. Verification rerun: - `cargo test -p shared brush` - `cargo test -p shared actor` - `cargo check -p editor --all-targets` Leaving the #37 checklist unchecked until interactive QA confirms diagnostics selection/reset and invalid-brush save blocking.
Author
Owner

Brush edit mode QA finding from #12 has a local QA-ready fix awaiting user validation. The M1 signoff checklist remains open.

Specific items to re-test before checking off BS-JD-103:

  • Vertex/Edge/Face/Clip modes visibly enter brush editing state.
  • Actor transform gizmo is absent while element modes are active and returns on Esc/Object mode.
  • First click on a vertex/edge/face selects without moving geometry.
  • Press/drag on an already-selected element moves only that selected brush element selection.
  • Empty-space click clears element selection without moving the brush actor.
  • Invalid edits still reject with clear status text and undo/redo remains grouped.

No push has been performed.

Brush edit mode QA finding from #12 has a local QA-ready fix awaiting user validation. The M1 signoff checklist remains open. Specific items to re-test before checking off BS-JD-103: - Vertex/Edge/Face/Clip modes visibly enter brush editing state. - Actor transform gizmo is absent while element modes are active and returns on `Esc`/Object mode. - First click on a vertex/edge/face selects without moving geometry. - Press/drag on an already-selected element moves only that selected brush element selection. - Empty-space click clears element selection without moving the brush actor. - Invalid edits still reject with clear status text and undo/redo remains grouped. No push has been performed.
Author
Owner

BS-JD-103 QA retest scope changed: the brush element fix now uses the standard transform gizmo on the selected vertex/edge/face set.

Retest additions:

  • Select a brush element and confirm the transform gizmo appears at that element selection pivot.
  • W translates selected brush vertices/edges/faces.
  • E rotates selected brush vertices/edges/faces around the selection pivot.
  • R scales selected brush vertices/edges/faces around the selection pivot.
  • The actor itself should not move unless returning to Object mode.
  • Undo/redo should treat each gizmo drag as one grouped brush edit.
  • Invalid transformed geometry should be rejected and restored.

No push has been performed.

BS-JD-103 QA retest scope changed: the brush element fix now uses the standard transform gizmo on the selected vertex/edge/face set. Retest additions: - Select a brush element and confirm the transform gizmo appears at that element selection pivot. - `W` translates selected brush vertices/edges/faces. - `E` rotates selected brush vertices/edges/faces around the selection pivot. - `R` scales selected brush vertices/edges/faces around the selection pivot. - The actor itself should not move unless returning to Object mode. - Undo/redo should treat each gizmo drag as one grouped brush edit. - Invalid transformed geometry should be rejected and restored. No push has been performed.
Author
Owner

M1 continuation checkpoint on 2026-06-24 after the Bevy 0.19 upgrade:

Closed implementation ticket #12 after re-verifying the brush element edit path on the current tree.

Automated checks run:

  • cargo test -p editor brush_edit -> 5 passed
  • cargo test -p editor brush_csg -> 3 passed
  • cargo test -p shared brush -> 17 passed
  • cargo test -p shared actor -> 8 passed
  • cargo check -p editor --all-targets -> passed

Current status:

  • M1 implementation tickets #10-#15 are closed.
  • This QA/signoff ticket remains open for interactive editor acceptance: create/edit/clip/CSG/material/diagnostics/save-reload workflows should still be exercised in the live editor before closing the milestone.
M1 continuation checkpoint on 2026-06-24 after the Bevy 0.19 upgrade: Closed implementation ticket #12 after re-verifying the brush element edit path on the current tree. Automated checks run: - `cargo test -p editor brush_edit` -> 5 passed - `cargo test -p editor brush_csg` -> 3 passed - `cargo test -p shared brush` -> 17 passed - `cargo test -p shared actor` -> 8 passed - `cargo check -p editor --all-targets` -> passed Current status: - M1 implementation tickets #10-#15 are closed. - This QA/signoff ticket remains open for interactive editor acceptance: create/edit/clip/CSG/material/diagnostics/save-reload workflows should still be exercised in the live editor before closing the milestone.
Author
Owner

Corrective M1 audit after Bevy 0.19 / Avian 0.7 upgrade:

Implemented locally:

  • Fixed brush face UV hydration so persisted uv_rotation is actually applied to generated mesh UVs. UV offset/scale/rotation now sanitize non-finite authoring values before mesh emission, with diagnostics for invalid UV data.
  • Fixed the vendored transform gizmo Bevy 0.19 render path beyond the original MeshPipeline init panic. The gizmo pipeline key now follows mesh-view requirements for target format, atmosphere, SSAO, distance fog, tonemap-in-shader, tonemapping mode, and deband dithering.
  • Fixed Bevy hierarchy B0004 warnings from generated brush/icon children by ensuring level-object roots have the Bevy visibility hierarchy components before generated children are attached.
  • Updated editor brush/hydration docs for the implemented UV and visibility behavior.

Verification run locally:

  • cargo fmt
  • cargo test -p shared -> 44 passed
  • cargo test --workspace brush -> editor 13, scene 1, shared 18 brush-filtered tests passed
  • cargo check --workspace --all-targets -> passed with existing egui deprecation warnings
  • cargo build -p editor --features dev -> passed after cleaning stale shared/game_hot artifacts
  • live-session smoke: timeout 25s cargo run -p editor --features dev -> editor reached runtime, Solari became ready, no transform-gizmo render validation panic, no atmosphere/device-loss crash, and no B0004 hierarchy warnings before timeout

Residual scope:

  • Leave this QA/signoff ticket open. The automated and startup smoke pass is not a substitute for manually exercising Vertex/Edge/Face/Clip, CSG preview/commit/cancel, material/texture drag/drop, save/reload stripping, and Brush Diagnostics in the editor.
  • Remaining observed warnings are the existing egui API deprecations, an external liblsfg-vk-layer.so Vulkan loader warning, and expected MSAA-disabled warnings under deferred rendering.
Corrective M1 audit after Bevy 0.19 / Avian 0.7 upgrade: Implemented locally: - Fixed brush face UV hydration so persisted `uv_rotation` is actually applied to generated mesh UVs. UV offset/scale/rotation now sanitize non-finite authoring values before mesh emission, with diagnostics for invalid UV data. - Fixed the vendored transform gizmo Bevy 0.19 render path beyond the original `MeshPipeline` init panic. The gizmo pipeline key now follows mesh-view requirements for target format, atmosphere, SSAO, distance fog, tonemap-in-shader, tonemapping mode, and deband dithering. - Fixed Bevy hierarchy B0004 warnings from generated brush/icon children by ensuring level-object roots have the Bevy visibility hierarchy components before generated children are attached. - Updated editor brush/hydration docs for the implemented UV and visibility behavior. Verification run locally: - `cargo fmt` - `cargo test -p shared` -> 44 passed - `cargo test --workspace brush` -> editor 13, scene 1, shared 18 brush-filtered tests passed - `cargo check --workspace --all-targets` -> passed with existing egui deprecation warnings - `cargo build -p editor --features dev` -> passed after cleaning stale `shared`/`game_hot` artifacts - live-session smoke: `timeout 25s cargo run -p editor --features dev` -> editor reached runtime, Solari became ready, no transform-gizmo render validation panic, no atmosphere/device-loss crash, and no B0004 hierarchy warnings before timeout Residual scope: - Leave this QA/signoff ticket open. The automated and startup smoke pass is not a substitute for manually exercising Vertex/Edge/Face/Clip, CSG preview/commit/cancel, material/texture drag/drop, save/reload stripping, and Brush Diagnostics in the editor. - Remaining observed warnings are the existing egui API deprecations, an external `liblsfg-vk-layer.so` Vulkan loader warning, and expected MSAA-disabled warnings under deferred rendering.
Sign in to join this conversation.
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: Falling-Metal-Interactive/Blacksite#37
No description provided.