ca-grow-ops-manager/specs/facility-3d-viewer.md
fullsizemalt c7f8bc8cec
Some checks are pending
Deploy to Production / deploy (push) Waiting to run
Test / backend-test (push) Waiting to run
Test / frontend-test (push) Waiting to run
feat: walkthrough 'completed today' status + 3D viewer spec
- Added /walkthroughs/today API endpoint
- Show clear status when walkthrough is already completed
- Show 'Continue Walkthrough' for in-progress ones
- Added facility-3d-viewer.md spec
- Installed React Three Fiber dependencies
2025-12-12 22:17:10 -08:00

204 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Facility 3D Viewer Specification
## Overview
A 3D visualization tool that renders the entire facility structure showing every plant position in real-time. This replaces the complex drag-and-drop Layout Designer with a simpler, data-driven visualization.
## Core Concept
**Input-Based, Not Drag-and-Drop**
- Facility structure is defined via forms with dimension inputs
- Rooms, tables, and sections have numeric dimensions (length × width × height)
- Positions are auto-generated based on row/column/tier configuration
- Focus is on **viewing and monitoring**, not layout editing
## Data Model
```
Property
└── Building(s)
└── Floor(s) [dimensions: width × height]
└── Room(s) [position: x,y | dimensions: width × height]
└── Section(s) [position: x,y | dimensions: width × height | rows × columns × tiers]
└── Position(s) [row, column, tier]
└── Plant (optional) [batchId, tagNumber, status]
```
## 3D Scene Structure
### Camera & Controls
- **Default View**: Bird's eye view of selected floor
- **Orbit Controls**: Rotate, zoom, pan
- **Floor Selector**: Quick switch between floors
- **Room Focus**: Click room to zoom in
### Visual Elements
| Element | 3D Representation | Interactive |
|---------|-------------------|-------------|
| Floor | Flat plane with grid | Selectable |
| Room | Colored box outline | Clickable, shows popup |
| Table/Rack | Solid platform | Clickable |
| Plant Position | Small sphere/cube | Hover shows details |
| Plant (occupied) | Green cylinder | Click for plant info |
| Empty Position | Gray dot | Click to assign plant |
### Color Coding
**Room Types**
- VEG: Green tint
- FLOWER: Purple tint
- MOTHER: Blue tint
- DRY: Orange tint
- CURE: Brown tint
**Position Status**
- EMPTY: Gray (#888)
- OCCUPIED (Healthy): Green (#22c55e)
- OCCUPIED (Needs Attention): Yellow (#eab308)
- OCCUPIED (Issue): Red (#ef4444)
- RESERVED: Blue (#3b82f6)
- DAMAGED: Dark Red (#991b1b)
## UI Layout
```
┌─────────────────────────────────────────────────────┐
│ 3D Facility Viewer [Floor: ▼] │
├─────────────┬───────────────────────────────────────┤
│ │ │
│ Floor │ │
│ Legend │ 3D Canvas │
│ │ (React Three Fiber) │
│ · VEG │ │
│ · FLOWER │ │
│ · MOTHER │ │
│ │ │
├─────────────┴───────────────────────────────────────┤
│ Selected: Flower Room A > Table A1 > R3C4 │
│ Plant: GG4-001 | Batch: B001 | Stage: FLOWERING │
└─────────────────────────────────────────────────────┘
```
## API Requirements
### GET /api/layout/floors/:id/3d
Returns complete floor data optimized for 3D rendering:
```json
{
"floor": {
"id": "...",
"name": "Upper Floor",
"width": 4000,
"height": 3000,
"rooms": [
{
"id": "...",
"name": "Flower Room A",
"type": "FLOWER",
"posX": 50,
"posY": 50,
"width": 900,
"height": 700,
"sections": [
{
"id": "...",
"name": "Table A1",
"type": "TABLE",
"posX": 50,
"posY": 50,
"width": 200,
"height": 280,
"rows": 5,
"columns": 8,
"positions": [
{
"id": "...",
"row": 1,
"column": 1,
"status": "OCCUPIED",
"plant": {
"tagNumber": "GG4-001",
"batchId": "...",
"batchName": "Gorilla Glue #4 - B001",
"status": "ACTIVE"
}
}
]
}
]
}
]
}
}
```
## Implementation Stack
- **React Three Fiber**: React renderer for Three.js
- **@react-three/drei**: Useful helpers (OrbitControls, Text, etc.)
- **@react-three/postprocessing**: Optional visual effects
- **Zustand**: State management for selections
## Component Structure
```
<Facility3DViewer>
<FloorSelector />
<Canvas>
<Camera />
<OrbitControls />
<Lights />
<Floor3D>
<Room3D> (for each room)
<Section3D> (tables/racks)
<Position3D> (plant spots)
</Section3D>
</Room3D>
</Floor3D>
</Canvas>
<InfoPanel />
</Facility3DViewer>
```
## Interactions
1. **Hover Position** → Show tooltip with address and status
2. **Click Position** → Select, show details in panel
3. **Click Room** → Zoom camera to room
4. **Click Table** → Highlight table, show section stats
5. **Double-click Position** → Open plant detail modal
## Performance Considerations
- Use instanced meshes for positions (hundreds of objects)
- LOD (Level of Detail) for distant objects
- Frustum culling (built into Three.js)
- Lazy load position data per room
## Phase 1 Implementation
1. ✅ Seed demo facility with sections and positions (DONE)
2. 🔲 Create /api/layout/floors/:id/3d endpoint
3. 🔲 Install React Three Fiber dependencies
4. 🔲 Create basic Facility3DViewer component
5. 🔲 Render floor plane with room boxes
6. 🔲 Add section rendering (tables as platforms)
7. 🔲 Render positions as spheres
8. 🔲 Add color coding by status
9. 🔲 Add click interactions
10. 🔲 Add info panel
## Future Enhancements
- Real-time updates via WebSocket
- Time-lapse view of plant movements
- Heatmap overlay (temperature, humidity from sensors)
- Export 3D snapshot as image
- VR mode for walkthrough