Init Repo

This commit is contained in:
2026-06-03 09:00:11 +08:00
commit 9be48d8b9e
155 changed files with 14827 additions and 0 deletions
@@ -0,0 +1,30 @@
## ADDED Requirements
### Requirement: Transform manipulator renders only in the focused viewport tile
The transform gizmo (manipulator) SHALL render and accept input only in the tile that was most recently clicked. All other tiles SHALL NOT display the gizmo.
#### Scenario: Focused tile shows gizmo, other tile does not
- **WHEN** the user clicks in tile A (making it focused), then selects a prim
- **THEN** the transform gizmo appears over the selection in tile A only; tile B shows no gizmo
#### Scenario: Move focus to another tile
- **WHEN** the user clicks in tile B while tile A was focused
- **THEN** the gizmo disappears from tile A and appears in tile B over the selection
### Requirement: Manipulator mode and space are global
The manipulator tool mode (Select/Move/Rotate/Scale) and transform space (World/Object) SHALL be global settings shared across all tiles, owned by the `ViewportPanel` container.
#### Scenario: Change manipulator mode in focused tile
- **WHEN** the user presses W (Move) while tile A is focused
- **THEN** the mode switches to Move globally, and if the user clicks in tile B, tile B's gizmo is in Move mode
### Requirement: Keyboard shortcuts route to focused tile
Keyboard shortcuts for the manipulator (Q/W/E/R), frame selection (F), frame all (A), and maximize toggle (Space) SHALL only apply to the focused tile.
#### Scenario: Frames selection in focused tile only
- **WHEN** the user presses F while tile A is focused
- **THEN** tile A's camera frames the selection; other tiles' cameras remain unchanged
#### Scenario: Tool shortcut changes global mode
- **WHEN** the user presses W while tile A is focused
- **THEN** the global manipulator mode changes to Move, and the focused tile (A) shows the Move gizmo if a prim is selected
@@ -0,0 +1,30 @@
## ADDED Requirements
### Requirement: Independent camera per viewport tile
Each viewport tile SHALL own an independent `ViewportCamera` instance. Camera operations (orbit, pan, dolly, zoom, frame) in one tile SHALL NOT affect any other tile's camera.
#### Scenario: Orbit in one tile, other tiles unchanged
- **WHEN** the user Alt+LMB drags to orbit in tile A
- **THEN** tile A's camera rotates, while tiles B, C, D remain at their previous camera positions
#### Scenario: Frame selection in one tile
- **WHEN** the user presses F in a tile
- **THEN** that tile's camera frames the current selection, other tiles are unaffected
### Requirement: Per-tile camera selector dropdown
Each tile SHALL have a compact camera selector (icon + dropdown) showing "Free Camera" and all USD camera prims on the stage. Selecting a USD camera in one tile SHALL NOT affect other tiles.
#### Scenario: Tile A uses Free Camera, Tile B uses a USD camera prim
- **WHEN** the user selects a USD camera prim in tile B's camera dropdown
- **THEN** tile B switches to USD camera mode and renders from that camera's view, while tile A continues in free camera mode
#### Scenario: Both tiles use the same USD camera
- **WHEN** the user selects the same USD camera prim in both tile A and tile B
- **THEN** both tiles render from that camera's view but can navigate independently when one tile goes into free camera mode
### Requirement: Camera list refreshes on dropdown open
Each tile SHALL refresh its camera prim list from the stage whenever its camera dropdown is opened.
#### Scenario: New camera added, then dropdown opened
- **WHEN** the user adds a new UsdGeomCamera prim to the stage and opens a tile's camera dropdown
- **THEN** the dropdown includes the newly added camera prim
@@ -0,0 +1,43 @@
## ADDED Requirements
### Requirement: Per-tile grid toggle
Each viewport tile SHALL have an independent grid visibility setting. Toggling the grid in one tile SHALL NOT affect other tiles.
#### Scenario: Grid on in Tile A, off in Tile B
- **WHEN** the user toggles grid ON in tile A and OFF in tile B
- **THEN** tile A shows the ground grid and tile B does not
### Requirement: Per-tile anti-aliasing toggle
Each viewport tile SHALL have an independent line-AA setting. Toggling AA in one tile SHALL NOT affect other tiles.
#### Scenario: AA on in Tile A, off in Tile B
- **WHEN** the user toggles AA ON in tile A and OFF in tile B
- **THEN** tile A renders line overlays with GL_LINE_SMOOTH, tile B renders without
### Requirement: Per-tile background color
Each viewport tile SHALL have an independent background color. Changing the background color in one tile SHALL NOT affect other tiles.
#### Scenario: Two tiles show different background colors
- **WHEN** the user sets tile A's background to "Black" and tile B's background to "Dark Gray"
- **THEN** tile A renders with a black background and tile B with a dark gray background
### Requirement: Per-tile bounding box display
Each viewport tile SHALL have an independent bounding box display mode (None / Per Object / All Selection). Changing the bbox mode in one tile SHALL NOT affect other tiles.
#### Scenario: BBox mode differs between tiles
- **WHEN** the user sets tile A to "Per Object" bbox mode and tile B to "None"
- **THEN** tile A draws bounding boxes on each selected prim, tile B draws none
### Requirement: Per-tile render delegate
Each viewport tile SHALL support an independent render delegate selection. Changing the render delegate in one tile SHALL NOT affect other tiles.
#### Scenario: Storm in Tile A, HdEmbree in Tile B
- **WHEN** the user selects "HdStorm" for tile A and "HdEmbree" for tile B
- **THEN** tile A renders via HdStorm and tile B via HdEmbree
### Requirement: Compact per-tile toolbar
Each tile's toolbar SHALL use compact icon-only buttons (16×16) arranged in a single horizontal row above the rendered image, consuming no more than 32px height. Tooltips SHALL be available on hover.
#### Scenario: Toolbar renders compactly in a small tile
- **WHEN** a tile is 300px wide in an HSplit layout
- **THEN** the toolbar fits within the tile width without clipping, using a horizontal scroll or overflow dropdown if necessary
@@ -0,0 +1,26 @@
## ADDED Requirements
### Requirement: Shared selection across all viewport tiles
Selection SHALL be shared across all viewport tiles. When a prim is picked in any tile (single click or rect drag), all tiles SHALL update their selection highlight display to show the same set of selected prims.
#### Scenario: Pick in Tile A, Tile B shows highlight
- **WHEN** the user single-clicks a prim in tile A
- **THEN** tile A and tile B both highlight that prim with the selection overlay
#### Scenario: Rect select in Tile B, Tile A updates
- **WHEN** the user rect-drags over multiple prims in tile B
- **THEN** both tile A and tile B highlight the same set of prims
### Requirement: Selection change propagates to SceneHierarchyPanel and PropertyPanel
When selection changes via any viewport tile, the `OnPrimPicked` / `OnPrimsPickedRect` callbacks SHALL fire from the `ViewportPanel` container, just as they do today.
#### Scenario: Pick in viewport updates hierarchy
- **WHEN** the user picks a prim in any tile
- **THEN** the SceneHierarchyPanel and PropertyPanel update to show the selected prim's properties
### Requirement: Shift+click additive selection across tiles
Shift+click SHALL work consistently across all tiles. Prim picked in any tile is added to or removed from the shared selection set.
#### Scenario: Shift+click in Tile A, then Tile B
- **WHEN** the user selects prim P1 in tile A, then Shift+clicks prim P2 in tile B
- **THEN** both P1 and P2 are in the shared selection, highlighted in both tiles
@@ -0,0 +1,55 @@
## ADDED Requirements
### Requirement: Layout presets
The viewport container SHALL support switching between four layout presets at any time: Single (1 tile), HSplit (2 tiles side-by-side), VSplit (2 tiles top-bottom), and Quad (4 tiles in a 2×2 grid).
#### Scenario: Switch layout from Single to HSplit
- **WHEN** the user selects "Horizontal Split" from the layout menu
- **THEN** the viewport splits into two equal-sized tiles side-by-side
#### Scenario: Switch layout from HSplit to Single
- **WHEN** the user selects "Single" from the layout menu
- **THEN** the two tiles merge back into a single tile, and the focused tile's camera/settings are preserved
#### Scenario: Switch from HSplit to Quad
- **WHEN** the user switches from HSplit to Quad
- **THEN** four tiles are created in a 2×2 grid, filling the viewport area
### Requirement: Draggable dividers
The divider line between tiles SHALL be draggable to resize adjacent tiles. Dividers SHALL be 6px wide with visual hover feedback.
#### Scenario: Drag horizontal divider
- **WHEN** the user clicks and drags the divider between two tiles
- **THEN** the divider follows the mouse, and tiles resize proportionally
#### Scenario: Drag divider to edge
- **WHEN** the user drags a divider to within 10% of the viewport edge
- **THEN** the divider snaps back to the 10% boundary to prevent tiles from becoming too small (minimum 100px per dimension)
### Requirement: Layout applies to the entire viewport area
When the layout changes, all tiles SHALL be redistributed to fill the entire available viewport panel content region. No gaps between tiles.
#### Scenario: Resize main window with Quad layout
- **WHEN** the user resizes the main application window
- **THEN** all four tiles resize proportionally to maintain their relative sizes and fill the viewport content area
### Requirement: Space-key maximize restores previous layout
When maximized, pressing Space again SHALL restore the exact layout and divider positions from before maximization.
#### Scenario: Maximize and restore preserves layout
- **WHEN** the user has an HSplit layout with divider at 0.3, then hovers tile B and presses Space, then presses Space again
- **THEN** the viewport returns to HSplit layout with both tiles visible and the divider at 0.3
### Requirement: Escape restores maximized viewport
When maximized, pressing Escape SHALL restore the previous layout (same behavior as Space toggle).
#### Scenario: Escape during maximize
- **WHEN** the viewport is maximized and the user presses Escape
- **THEN** the previous multi-tile layout is restored
### Requirement: Space requires tile hover in multi-tile layouts
In Single layout (only 1 tile), Space SHALL be a no-op — there is nothing to maximize.
#### Scenario: Space ignored in Single layout
- **WHEN** the viewport is already in Single layout and the user presses Space
- **THEN** the viewport remains unchanged in Single layout