168 lines
7.7 KiB
Markdown
168 lines
7.7 KiB
Markdown
### Objective Summary
|
||
|
||
This revised plan details the addition of an **Attach** mode to the Prop Editor (`[ Arrange | Reshape | Attach ]`), introducing a flexible, **Role-Based Dynamic Anchor Architecture** for vector prop files (`.prop`). Instead of hardcoding weapon-centric anchors (like a fixed muzzle), anchors are defined as named dictionary entries assigned specific functional roles—such as `pivot`, `grip`, `emitter`, `impact`, or `mount`. Coupled with interactive canvas gizmos, a live semi-transparent Stickman Hand Preview silhouette, and `StickmanRig` IK attachment logic, this system allows any prop (from flashlights and magic staves to broadswords and rifles) to be held, flipped, and interacted with accurately across all facing profiles.
|
||
|
||
---
|
||
|
||
### 1. Dynamic Role-Based Anchor Data Architecture (`.prop` Schema)
|
||
|
||
The `.prop` JSON file stores anchors in a flexible dictionary where each key represents a unique anchor identifier and contains an explicit `"role"` attribute.
|
||
|
||
#### JSON Data Layout
|
||
|
||
```json
|
||
{
|
||
"version": "1.0",
|
||
"prop_name": "Arcane Staff",
|
||
"anchors": {
|
||
"origin": {
|
||
"role": "pivot",
|
||
"x": 0.0,
|
||
"y": 0.0
|
||
},
|
||
"primary_grip": {
|
||
"role": "grip",
|
||
"x": 0.0,
|
||
"y": 18.0,
|
||
"rotation_deg": 0.0,
|
||
"z_index_offset": 1,
|
||
"allowed_hands": "both"
|
||
},
|
||
"secondary_grip": {
|
||
"role": "grip",
|
||
"x": 0.0,
|
||
"y": -12.0,
|
||
"rotation_deg": 0.0,
|
||
"z_index_offset": 1,
|
||
"allowed_hands": "left_only"
|
||
},
|
||
"crystal_head": {
|
||
"role": "emitter",
|
||
"x": 0.0,
|
||
"y": -48.0,
|
||
"rotation_deg": -90.0
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
#### Key Parameter Schema
|
||
|
||
- **`role`**: Enforced category enum (`pivot`, `grip`, `emitter`, `impact`, `mount`, `custom`) defining visual gizmo styling and runtime behavior.
|
||
- **`x`, `y**`: Pixel offset relative to the prop’s root origin point (0,0).
|
||
- **`rotation_deg`**: Angular rotation applied to the prop geometry when attached, aligning prop handles seamlessly with a stickman’s hand/wrist joint.
|
||
- **`z_index_offset`**: Integer sorting shift (e.g., -1 or +1) controlling whether prop elements render behind or in front of the holding hand.
|
||
- **`allowed_hands`**: Hand access permission (`both`, `left_only`, `right_only`) used during character interaction checks.
|
||
|
||
#### Standard Anchor Role Registry
|
||
|
||
- **`pivot`**: The mandatory root origin (0,0) used for spawning, ground collision, terrain placement, and linear/angular center-of-mass physics when thrown.
|
||
- **`grip`**: Hand attachment targets for primary or secondary holding locations.
|
||
- **`emitter`**: Action output coordinates for spell particles, flashlights/light cones, projectile spawns, spray nozzles, or laser beams.
|
||
- **`impact`**: Point-of-contact coordinates for melee striking edges, spear points, or hammer heads.
|
||
- **`mount`**: Auxiliary attachment locations for modular accessories, scopes, or vehicle mounts.
|
||
|
||
---
|
||
|
||
### 2. UI Integration & 'Attach' Mode Setup
|
||
|
||
#### Segmented Mode Switcher
|
||
|
||
- Expand the canvas toolbar mode control to three tabs: **`[ Arrange | Reshape | Attach ]`**.
|
||
- Selecting **Attach** hides shape vertex handles and activates the anchor editing overlay.
|
||
|
||
#### Attach Mode Toolbar
|
||
|
||
- **Show Hand Overlay**: Toggle button to display/hide the semi-transparent stickman lower-arm and hand preview.
|
||
- **Snap to Grid**: Toggle button for snapping anchor translation coordinates.
|
||
- **Show Inactive Gizmos**: Toggle visibility for non-selected background anchors.
|
||
|
||
#### Anchor Management Panel (Sidebar Inspector)
|
||
|
||
- **Anchor List Control**:
|
||
- Scrollable list showing all defined anchors with **Add Anchor**, **Delete**, and **Rename** buttons.
|
||
- Ability to add dynamic custom anchors and assign them any standard role.
|
||
|
||
- **Property Fields**:
|
||
- **Role Selector**: Dropdown menu (`Pivot`, `Grip`, `Emitter`, `Impact`, `Mount`, `Custom`).
|
||
- **Position Inputs**: Numeric fields for X and Y coordinates with arrow incrementors.
|
||
- **Rotation Slider**: Angle adjustment (-180° to +180°) with numeric spinbox.
|
||
- **Z-Index Offset**: Integer field (-5 to +5) for layer sorting relative to hands.
|
||
- **Allowed Hands**: Dropdown (`Both`, `Left Only`, `Right Only`).
|
||
|
||
- **Quick Preset Generator**: Buttons to instantly apply standard layouts (e.g., _One-Handed Grip_, _Two-Handed Weapon_, _Tool / Extinguisher Nozzle_, _Melee Edge_).
|
||
|
||
---
|
||
|
||
### 3. Canvas Visual Tools & Interactive Editing
|
||
|
||
#### Role-Based Gizmo Markers
|
||
|
||
Each anchor role renders with a distinct visual icon and color code on the canvas:
|
||
|
||
- **`pivot`**: Yellow Crosshair (locked to or editable near origin).
|
||
- **`grip`**: Cyan / Orange Hand Icon (primary vs. secondary grips).
|
||
- **`emitter`**: Red Target Reticle (shows direction vector arrow for particle/beam orientation).
|
||
- **`impact`**: Bright Pink Diamond / Slash Marker (indicates tip or edge).
|
||
- **`mount`**: Purple Ring Anchor.
|
||
|
||
#### Canvas Interaction Mechanics
|
||
|
||
- **Translation Dragging**: Click and drag any anchor gizmo across the viewport with full grid-snap support.
|
||
- **Rotation Arc Ring**: Selecting a `grip` or `emitter` anchor displays a surrounding rotation ring handle. Dragging the ring dynamically dials in `rotation_deg` while updating the live inspector readout.
|
||
|
||
#### Stickman Hand Preview Silhouette Overlay
|
||
|
||
- **Visual Representation**: When enabled, draws a semi-transparent stickman lower-arm and hand silhouette attached directly to the currently selected `grip` anchor.
|
||
- **Real-Time Alignment**:
|
||
- The arm and hand rotate dynamically in response to `rotation_deg` adjustments.
|
||
- The preview respects `z_index_offset`, rendering the hand over or under prop geometry to give immediate visual feedback.
|
||
- Guarantees sword hilts, briefcase handles, and tool grips fit stickman hands before running gameplay tests.
|
||
|
||
---
|
||
|
||
### 4. Rig Compatibility & Runtime Behavior (`StickmanRig`)
|
||
|
||
- **IK Hand Attachment**:
|
||
- `StickmanRig` queries the prop's `grip` anchors during pick-up or equip actions, snapping the wrist joint of `LeftLowerArm` or `RightLowerArm` to the exact anchor location.
|
||
|
||
- **Facing Profile Mirroring**:
|
||
- When a character flips (e.g., facing left with `scale.x = -1`), the prop mirrors along with the rig.
|
||
- Symmetrical anchor positioning ensures tools and weapons flip naturally without offset errors.
|
||
|
||
- **Action & Effect Dispatching**:
|
||
- When firing, casting, or emitting light, runtime scripts search for anchors with the `emitter` role to instantiate particles, light nodes, or hitscan traces.
|
||
- Melee collision scripts query `impact` anchors to detect high-velocity hit points.
|
||
|
||
- **Throwing Physics**:
|
||
- Dropping or throwing a prop applies linear/angular velocity calculations relative to the `pivot` anchor position.
|
||
|
||
---
|
||
|
||
### 5. Implementation Roadmap
|
||
|
||
1. **Anchor Data Model & JSON Updates**:
|
||
|
||
- Refactor internal dictionary parsers to support role-based dynamic key schemas.
|
||
- Update `.prop` saving and loading procedures to serialize custom anchor entries and their `role` tags.
|
||
|
||
2. **UI Switcher & Sidebar Panel**:
|
||
|
||
- Add the `Attach` tab to the primary mode control `[ Arrange | Reshape | Attach ]`.
|
||
- Build the Anchor Management sidebar panel with role selectors, dynamic list controls, and property spinboxes.
|
||
|
||
3. **Canvas Rendering & Gizmo Input**:
|
||
|
||
- Implement canvas drawing routines for role-specific gizmos (`pivot`, `grip`, `emitter`, `impact`, `mount`).
|
||
- Add gizmo click-picking, drag translation, and rotation ring interaction handles.
|
||
|
||
4. **Hand Preview Silhouette System**:
|
||
|
||
- Create the semi-transparent lower-arm and hand preview overlay attached to `grip` anchors.
|
||
- Connect real-time rotation and Z-order sorting updates to the overlay renderer.
|
||
|
||
5. **Autosave, Thumbnail & Runtime Verification**:
|
||
|
||
- Hook anchor adjustments into editor dirty-state tracking, undo/redo stacks, and autosave routines.
|
||
- Verify exported `.prop` files in the asset selector preview and validate runtime IK snapping on the test stage.
|