178 lines
5.9 KiB
Markdown
178 lines
5.9 KiB
Markdown
# Entity Rendering Implementation for Starworld
|
|
|
|
## Overview
|
|
|
|
This document describes the entity rendering system in Starworld, which loads and displays Overte entities as 3D GLTF/GLB models in the StardustXR compositor.
|
|
|
|
## Current Implementation
|
|
|
|
### 1. Entity Data Structure (`OverteClient.hpp`)
|
|
|
|
**`EntityType` enum:**
|
|
```cpp
|
|
enum class EntityType {
|
|
Unknown, Box, Sphere, Model, Shape, Light, Text,
|
|
|
|
## Current Implementation
|
|
|
|
All core entity rendering features are implemented:
|
|
|
|
- 3D model rendering (GLTF/GLB) for Box, Sphere, Model types
|
|
- HTTP/HTTPS model and texture download and caching (SHA256-based)
|
|
- Primitive model generation (cube, sphere, suzanne) with Blender
|
|
- Transform, dimension, and color/texture data parsing and propagation
|
|
- Color and texture download infrastructure is complete, but visual application is pending StardustXR API support
|
|
- See [`docs/ENTITY_TROUBLESHOOTING.md`](ENTITY_TROUBLESHOOTING.md) for debug flags and troubleshooting
|
|
|
|
## Testing
|
|
|
|
See [`README.md`](../README.md) and [`docs/IMPLEMENTATION_COMPLETE.md`](IMPLEMENTATION_COMPLETE.md) for up-to-date build and test instructions.
|
|
|
|
## Limitations
|
|
|
|
- Color tinting and texture application are not yet visually applied (pending StardustXR API extension)
|
|
- Only Box, Sphere, Model entity types are supported
|
|
- atp:// protocol is not yet supported
|
|
- See [`docs/IMPLEMENTATION_COMPLETE.md`](IMPLEMENTATION_COMPLETE.md) for full status
|
|
|
|
## References
|
|
|
|
- Overte protocol: `third_party/overte-src/libraries/networking/`
|
|
- Stardust API: https://github.com/StardustXR/core
|
|
- See `docs/` for protocol, troubleshooting, and implementation details
|
|
```
|
|
|
|
This creates three demo entities:
|
|
- **CubeA** - Red cube model (20cm)
|
|
- **SphereB** - Green sphere model (15cm)
|
|
- **ModelC** - Blue Suzanne model (25cm)
|
|
|
|
### Live Overte Connection
|
|
|
|
To connect to a real Overte server:
|
|
|
|
```bash
|
|
# Optional: Set credentials
|
|
export OVERTE_USERNAME=your_username
|
|
|
|
# Connect to server
|
|
./build/starworld ws://domain.example.com:40102
|
|
```
|
|
|
|
The client will:
|
|
1. Perform domain handshake
|
|
2. Discover entity server via DomainList packets
|
|
3. Send EntityQuery to request all entities
|
|
4. Parse and render entities with full visual properties
|
|
|
|
## Architecture
|
|
|
|
```
|
|
┌─────────────────┐
|
|
│ Overte Server │
|
|
│ (Entity Server) │
|
|
└────────┬────────┘
|
|
│ UDP Packets (EntityAdd, EntityEdit)
|
|
│ Contains: type, position, rotation, dimensions,
|
|
│ color, modelUrl, textureUrl
|
|
▼
|
|
┌─────────────────────┐
|
|
│ OverteClient.cpp │
|
|
│ - parseEntityPacket│
|
|
│ - OverteEntity │
|
|
└────────┬────────────┘
|
|
│ consumeUpdatedEntities()
|
|
▼
|
|
┌─────────────────────┐
|
|
│ SceneSync.cpp │
|
|
│ - Maps Overte IDs │
|
|
│ to Stardust IDs │
|
|
└────────┬────────────┘
|
|
│ createNode(), setNodeColor(),
|
|
│ setNodeModel(), etc.
|
|
▼
|
|
┌─────────────────────┐
|
|
│ StardustBridge.cpp │
|
|
│ - C++ wrapper │
|
|
│ - dlopen bridge.so │
|
|
└────────┬────────────┘
|
|
│ C-ABI calls: sdxr_set_node_*
|
|
▼
|
|
┌─────────────────────┐
|
|
│ bridge/lib.rs │
|
|
│ - Command queue │
|
|
│ - Shared state │
|
|
└────────┬────────────┘
|
|
│ BridgeState::reify()
|
|
▼
|
|
┌─────────────────────┐
|
|
│ Stardust Server │
|
|
│ - Model rendering │
|
|
│ - GLTF/GLB loading │
|
|
└─────────────────────┘
|
|
```
|
|
|
|
## Implemented Features ✅
|
|
|
|
1. **3D Model Rendering** - Loads GLTF/GLB models using Stardust Model element
|
|
2. **Entity Type Support** - Box (cube), Sphere, Model (Suzanne placeholder)
|
|
3. **Transform Support** - Position, rotation, scale from dimensions
|
|
4. **HTTP Downloads** - ModelCache with SHA256 caching, async libcurl
|
|
5. **Primitive Generation** - Blender export script for test models
|
|
6. **Local Caching** - Two-tier cache (primitives + downloaded models)
|
|
|
|
## Future Enhancements
|
|
|
|
### Short Term
|
|
1. **Material color application** - Apply entity.color to model materials
|
|
2. **Texture support** - Load and apply entity.textureUrl to models
|
|
3. **More entity types** - Add support for Light, Text, PolyLine, etc.
|
|
4. **ATP protocol** - Support atp:// URLs for Overte asset server
|
|
|
|
### Medium Term
|
|
1. **Material parameters** - PBR materials with metallic/roughness
|
|
2. **Animation** - Skeletal animation for rigged models
|
|
3. **Entity updates** - Real-time property changes
|
|
4. **Entity deletion** - Remove entities from scene
|
|
|
|
### Long Term
|
|
1. **Physics sync** - Real-time physics state synchronization
|
|
2. **Script integration** - Execute Overte entity scripts in Stardust context
|
|
3. **Avatar rendering** - Full avatar mesh and animation support
|
|
4. **Audio spatialization** - 3D positional audio from Overte
|
|
|
|
## Build Instructions
|
|
|
|
```bash
|
|
# Build Rust bridge
|
|
cd bridge
|
|
cargo build
|
|
cd ..
|
|
|
|
# Build C++ client
|
|
cd build
|
|
cmake ..
|
|
make
|
|
cd ..
|
|
|
|
# Run
|
|
./build/starworld
|
|
```
|
|
|
|
## Dependencies
|
|
|
|
- **C++17** - Modern C++ features
|
|
- **GLM** - Math library for vectors/matrices
|
|
- **OpenSSL** - MD5 hashing for protocol signatures
|
|
- **Rust nightly** - For Stardust bridge
|
|
- **stardust-xr-asteroids** - Declarative UI framework
|
|
- **stardust-xr-fusion** - Low-level client API
|
|
- **tokio** - Async runtime
|
|
|
|
## References
|
|
|
|
- Overte protocol: `third_party/overte-src/libraries/networking/`
|
|
- Entity types: Based on Overte `EntityTypes.h`
|
|
- Packet formats: Overte NLPacket specification
|
|
- Stardust API: https://github.com/StardustXR/core
|