feat: add future enhancements documentation for Overte to Stardust entity rendering
This commit is contained in:
486
docs/FUTURE_ENHANCEMENTS.md
Normal file
486
docs/FUTURE_ENHANCEMENTS.md
Normal file
@@ -0,0 +1,486 @@
|
||||
# Future Enhancements - Overte to Stardust Entity Rendering
|
||||
|
||||
## Overview
|
||||
|
||||
This document outlines the features that are **not yet implemented** but would be valuable additions to complete the Overte-to-Stardust integration. All core functionality for basic 3D model rendering is working, but these enhancements would improve visual fidelity and feature parity with native Overte.
|
||||
|
||||
## Priority 1: Visual Fidelity
|
||||
|
||||
### 1.1 Color Tinting for Models
|
||||
|
||||
**Status**: 🟡 Data captured, not applied
|
||||
**Difficulty**: Medium
|
||||
**Requires**: Extension to asteroids Model API or server-side material manipulation
|
||||
|
||||
**Current State**:
|
||||
- Entity color values (RGB + alpha) are parsed from Overte packets ✅
|
||||
- Color data is stored in the Rust bridge state ✅
|
||||
- Color is logged during rendering ✅
|
||||
- Color is NOT applied to model materials ❌
|
||||
|
||||
**What's Needed**:
|
||||
1. **Option A: Asteroids API Extension**
|
||||
```rust
|
||||
Model::direct(&path)
|
||||
.color_tint([r, g, b, a]) // New API needed
|
||||
.build()
|
||||
```
|
||||
|
||||
2. **Option B: Material Modification in reify()**
|
||||
- Access model's materials after loading
|
||||
- Multiply base color by tint color
|
||||
- Update material in Stardust server
|
||||
- Requires deeper integration with Bevy's material system
|
||||
|
||||
**Implementation Sketch**:
|
||||
```rust
|
||||
// In reify() function
|
||||
match Model::direct(&model_path) {
|
||||
Ok(model) => {
|
||||
// Hypothetical API:
|
||||
let tinted_model = if node.color != [1.0, 1.0, 1.0, 1.0] {
|
||||
model.tint_color(node.color)
|
||||
} else {
|
||||
model
|
||||
};
|
||||
Some(tinted_model.build())
|
||||
}
|
||||
Err(e) => { /* ... */ }
|
||||
}
|
||||
```
|
||||
|
||||
**Alternative Approach**:
|
||||
- Modify GLTF files on download to include color multiplier
|
||||
- Use shader modifications via material extensions
|
||||
- Server-side post-processing of materials
|
||||
|
||||
**References**:
|
||||
- Stardust server: `src/nodes/drawable/model.rs`
|
||||
- Bevy PBR materials: `bevy::pbr::StandardMaterial`
|
||||
- GLTF color factors: `material.pbrMetallicRoughness.baseColorFactor`
|
||||
|
||||
### 1.2 Texture Application
|
||||
|
||||
**Status**: 🟡 Data captured, not applied
|
||||
**Difficulty**: High
|
||||
**Requires**: Texture download system + material texture binding API
|
||||
|
||||
**Current State**:
|
||||
- Entity texture URLs are parsed from Overte packets ✅
|
||||
- Texture URLs are stored in bridge state ✅
|
||||
- Texture URLs are logged ✅
|
||||
- Textures are NOT downloaded or applied ❌
|
||||
|
||||
**What's Needed**:
|
||||
1. **Texture Downloader** (similar to ModelDownloader):
|
||||
```rust
|
||||
pub struct TextureDownloader {
|
||||
cache_dir: PathBuf,
|
||||
// Similar to ModelDownloader but for images
|
||||
}
|
||||
|
||||
// Downloads .png, .jpg, .webp, etc.
|
||||
fn download_texture(url: &str) -> Option<PathBuf>
|
||||
```
|
||||
|
||||
2. **Material Texture Binding**:
|
||||
- Load texture as Bevy Image asset
|
||||
- Bind to model's material base color texture
|
||||
- Handle UV mapping and texture coordinates
|
||||
|
||||
3. **Asteroids API Extension** (hypothetical):
|
||||
```rust
|
||||
Model::direct(&model_path)
|
||||
.base_color_texture(&texture_path)
|
||||
.build()
|
||||
```
|
||||
|
||||
**Implementation Challenges**:
|
||||
- GLTF models may already have embedded textures
|
||||
- Overte textures should override embedded ones
|
||||
- Need to handle texture tiling/repeat settings
|
||||
- UV mapping compatibility between Overte and GLTF
|
||||
|
||||
**Workaround (Current)**:
|
||||
- Use GLTF/GLB models with embedded textures
|
||||
- Entity texture URLs are ignored
|
||||
|
||||
### 1.3 Transparency (Alpha) Support
|
||||
|
||||
**Status**: 🟡 Data captured, partially working
|
||||
**Difficulty**: Low-Medium
|
||||
**Requires**: Material alpha mode configuration
|
||||
|
||||
**Current State**:
|
||||
- Entity alpha values parsed ✅
|
||||
- Alpha stored with color data ✅
|
||||
- Alpha logged but not applied ❌
|
||||
- GLTF models can have embedded alpha ✅
|
||||
|
||||
**What's Needed**:
|
||||
- Set material alpha mode based on entity.alpha value
|
||||
- Configure blending for transparent materials
|
||||
- Handle alpha testing vs alpha blending
|
||||
|
||||
**Implementation**:
|
||||
```rust
|
||||
// When alpha < 1.0, configure material for transparency
|
||||
if node.color[3] < 1.0 {
|
||||
// Set alpha mode on material
|
||||
// May require material modification API
|
||||
}
|
||||
```
|
||||
|
||||
## Priority 2: Protocol Support
|
||||
|
||||
### 2.1 ATP Protocol (Overte Asset Server)
|
||||
|
||||
**Status**: 🔴 Not implemented
|
||||
**Difficulty**: High
|
||||
**Requires**: AssetClient integration, ATP protocol implementation
|
||||
|
||||
**Current State**:
|
||||
- HTTP/HTTPS URLs download correctly ✅
|
||||
- file:// URLs work ✅
|
||||
- atp:// URLs are ignored ❌
|
||||
|
||||
**What's Needed**:
|
||||
1. **ATP Client Implementation**:
|
||||
- Connect to Overte asset server
|
||||
- Authenticate with asset server credentials
|
||||
- Request assets by hash
|
||||
- Handle asset caching
|
||||
|
||||
2. **Integration with ModelCache**:
|
||||
```cpp
|
||||
// In StardustBridge::setNodeModel()
|
||||
if (modelUrl.starts_with("atp:")) {
|
||||
// Parse ATP URL: atp://hash.format
|
||||
// Connect to asset server
|
||||
// Download asset
|
||||
// Cache locally
|
||||
// Pass local path to bridge
|
||||
}
|
||||
```
|
||||
|
||||
**ATP URL Format**:
|
||||
```
|
||||
atp://<hash>.<extension>
|
||||
Example: atp://8f3e9a1b2c4d5e6f.glb
|
||||
```
|
||||
|
||||
**References**:
|
||||
- Overte AssetClient: `libraries/networking/src/AssetClient.cpp`
|
||||
- ATP protocol documentation in Overte source
|
||||
|
||||
### 2.2 Entity Script Execution
|
||||
|
||||
**Status**: 🔴 Not implemented
|
||||
**Difficulty**: Very High
|
||||
**Requires**: JavaScript engine, Overte API compatibility layer
|
||||
|
||||
**Current State**:
|
||||
- Entity script URLs are not parsed
|
||||
- Scripts are not executed
|
||||
- No script API available
|
||||
|
||||
**What's Needed**:
|
||||
- JavaScript runtime (QuickJS, Deno, or V8)
|
||||
- Overte entity script API implementation
|
||||
- Script lifecycle management (load, update, unload)
|
||||
- Sandboxing for security
|
||||
|
||||
**Out of Scope**: This is a massive undertaking and likely not worth it unless there's significant demand for scripted entities.
|
||||
|
||||
## Priority 3: Performance
|
||||
|
||||
### 3.1 Model Download Optimization
|
||||
|
||||
**Status**: 🟡 Works but could be better
|
||||
**Difficulty**: Medium
|
||||
|
||||
**Current Issues**:
|
||||
- First render of HTTP models blocks until download completes
|
||||
- No visual indication of download progress to user
|
||||
- No retry logic for failed downloads
|
||||
|
||||
**Improvements Needed**:
|
||||
1. **Async Rendering Update**:
|
||||
- Render placeholder while downloading
|
||||
- Replace with actual model when download completes
|
||||
- Requires frame update notification to bridge
|
||||
|
||||
2. **Progress Indicators**:
|
||||
- Show download progress in XR (progress bar, spinner)
|
||||
- Use Stardust UI elements for visual feedback
|
||||
|
||||
3. **Retry Logic**:
|
||||
- Exponential backoff for failed downloads
|
||||
- Max retry count
|
||||
- Fallback to primitives after retries exhausted
|
||||
|
||||
4. **Parallel Downloads**:
|
||||
- Download multiple models simultaneously
|
||||
- Connection pooling
|
||||
- Rate limiting to avoid overwhelming servers
|
||||
|
||||
### 3.2 Cache Management
|
||||
|
||||
**Status**: 🟡 Works but unbounded
|
||||
**Difficulty**: Low
|
||||
|
||||
**Current Issues**:
|
||||
- Cache grows indefinitely
|
||||
- No LRU eviction
|
||||
- No cache size limits
|
||||
- No cache cleanup on app exit
|
||||
|
||||
**Improvements Needed**:
|
||||
1. **LRU Eviction**:
|
||||
- Track last access time for each cached model
|
||||
- Remove least recently used when cache exceeds size limit
|
||||
- Configurable max cache size (default: 1GB)
|
||||
|
||||
2. **Cache Validation**:
|
||||
- Check if remote models have been updated (HTTP ETag)
|
||||
- Re-download if changed
|
||||
- Configurable refresh policy
|
||||
|
||||
3. **Manual Cache Management**:
|
||||
- CLI command to clear cache
|
||||
- UI option in settings
|
||||
- Selective deletion (by domain, by age, etc.)
|
||||
|
||||
### 3.3 In-Memory Model Caching
|
||||
|
||||
**Status**: 🔴 Not implemented
|
||||
**Difficulty**: Medium
|
||||
|
||||
**Current State**:
|
||||
- Primitive models loaded from disk every frame
|
||||
- No in-memory caching of model data
|
||||
- Redundant I/O for same models
|
||||
|
||||
**What's Needed**:
|
||||
```rust
|
||||
static MODEL_CACHE: OnceLock<Mutex<HashMap<PathBuf, Handle<Scene>>>> = OnceLock::new();
|
||||
|
||||
fn get_cached_model(path: &PathBuf) -> Option<Handle<Scene>> {
|
||||
MODEL_CACHE.get()?.lock().unwrap().get(path).cloned()
|
||||
}
|
||||
```
|
||||
|
||||
**Benefits**:
|
||||
- Faster rendering for repeated models
|
||||
- Less disk I/O
|
||||
- Better frame times
|
||||
|
||||
## Priority 4: Entity Type Support
|
||||
|
||||
### 4.1 Light Entities
|
||||
|
||||
**Status**: 🔴 Not implemented
|
||||
**Difficulty**: Medium
|
||||
|
||||
**What's Needed**:
|
||||
- Parse light type (point, spot, directional)
|
||||
- Parse light color, intensity, range
|
||||
- Create Stardust PointLight/SpotLight/DirectionalLight nodes
|
||||
- Position and orient lights correctly
|
||||
|
||||
**Stardust API** (likely exists):
|
||||
```rust
|
||||
use stardust_xr_asteroids::elements::Light;
|
||||
|
||||
Light::point()
|
||||
.color([r, g, b])
|
||||
.intensity(intensity)
|
||||
.range(range)
|
||||
.build()
|
||||
```
|
||||
|
||||
### 4.2 Text Entities
|
||||
|
||||
**Status**: 🔴 Not implemented
|
||||
**Difficulty**: Low-Medium
|
||||
|
||||
**What's Needed**:
|
||||
- Parse text content and font
|
||||
- Parse text alignment and size
|
||||
- Create Stardust Text nodes
|
||||
- Handle line breaks and wrapping
|
||||
|
||||
**Stardust API** (exists):
|
||||
```rust
|
||||
use stardust_xr_asteroids::elements::Text;
|
||||
|
||||
Text::new(content)
|
||||
.character_height(size)
|
||||
.align_x(XAlign::Center)
|
||||
.build()
|
||||
```
|
||||
|
||||
### 4.3 Zone Entities
|
||||
|
||||
**Status**: 🔴 Not implemented
|
||||
**Difficulty**: Medium
|
||||
|
||||
**What's Needed**:
|
||||
- Parse zone dimensions and shape
|
||||
- Parse zone properties (ambient light, gravity, etc.)
|
||||
- Create Stardust zone/spatial with properties
|
||||
- Handle enter/exit events
|
||||
|
||||
**Stardust API**:
|
||||
```rust
|
||||
Spatial::default()
|
||||
.zoneable(true)
|
||||
.zone_radius(radius)
|
||||
.build()
|
||||
```
|
||||
|
||||
### 4.4 ParticleEffect Entities
|
||||
|
||||
**Status**: 🔴 Not implemented
|
||||
**Difficulty**: High
|
||||
|
||||
**What's Needed**:
|
||||
- Parse particle emitter properties
|
||||
- Create particle system in Stardust
|
||||
- Handle particle textures and physics
|
||||
- Synchronize particle state
|
||||
|
||||
**Challenge**: Stardust may not have particle system support yet.
|
||||
|
||||
## Priority 5: Dynamic Updates
|
||||
|
||||
### 5.1 Real-Time Entity Property Updates
|
||||
|
||||
**Status**: 🟡 Transform updates work, other properties don't
|
||||
**Difficulty**: Medium
|
||||
|
||||
**Current State**:
|
||||
- Transform (position, rotation) updates work ✅
|
||||
- Color changes not reflected ❌
|
||||
- Dimension changes not reflected ❌
|
||||
- Model URL changes not reflected ❌
|
||||
|
||||
**What's Needed**:
|
||||
- Detect property changes in SceneSync
|
||||
- Call appropriate bridge update functions
|
||||
- Trigger re-render in Rust bridge when properties change
|
||||
- Incremental updates instead of full node recreation
|
||||
|
||||
**Implementation**:
|
||||
```cpp
|
||||
// In SceneSync.cpp
|
||||
if (it->second.color != e.color) {
|
||||
stardust.setNodeColor(nodeId, e.color, e.alpha);
|
||||
}
|
||||
if (it->second.dimensions != e.dimensions) {
|
||||
stardust.setNodeDimensions(nodeId, e.dimensions);
|
||||
}
|
||||
// etc.
|
||||
```
|
||||
|
||||
### 5.2 Physics Synchronization
|
||||
|
||||
**Status**: 🔴 Not implemented
|
||||
**Difficulty**: Very High
|
||||
|
||||
**What's Needed**:
|
||||
- Sync physics state from Overte
|
||||
- Apply velocities and forces in Stardust
|
||||
- Handle collisions and rigid body dynamics
|
||||
- Keep physics in sync across network
|
||||
|
||||
**Challenge**: Stardust physics API is limited. May need custom integration.
|
||||
|
||||
## Priority 6: Advanced Features
|
||||
|
||||
### 6.1 Avatar Rendering
|
||||
|
||||
**Status**: 🔴 Not implemented
|
||||
**Difficulty**: Very High
|
||||
|
||||
**What's Needed**:
|
||||
- Parse avatar models and skeletons
|
||||
- Sync avatar animations
|
||||
- Handle avatar attachments and wearables
|
||||
- Render other users' avatars
|
||||
|
||||
**Challenge**: Avatar system is complex and Overte-specific.
|
||||
|
||||
### 6.2 Spatial Audio
|
||||
|
||||
**Status**: 🔴 Not implemented
|
||||
**Difficulty**: High
|
||||
|
||||
**What's Needed**:
|
||||
- Connect to Overte audio mixer
|
||||
- Receive audio streams
|
||||
- Position audio sources in 3D space
|
||||
- Mix and play audio in Stardust
|
||||
|
||||
**Challenge**: Requires audio mixer protocol implementation.
|
||||
|
||||
## Implementation Priority
|
||||
|
||||
### Phase 1: Visual Quality (1-2 weeks)
|
||||
1. Color tinting - Requires asteroids API extension
|
||||
2. Transparency/alpha - Material configuration
|
||||
3. Texture support - Download + material binding
|
||||
|
||||
### Phase 2: Protocols (2-3 weeks)
|
||||
1. ATP protocol support
|
||||
2. Model download optimization
|
||||
3. Cache management improvements
|
||||
|
||||
### Phase 3: Entity Types (1-2 weeks)
|
||||
1. Light entities
|
||||
2. Text entities
|
||||
3. Zone entities (basic)
|
||||
|
||||
### Phase 4: Dynamic Features (2-3 weeks)
|
||||
1. Real-time property updates
|
||||
2. In-memory caching
|
||||
3. Progress indicators
|
||||
|
||||
### Phase 5: Advanced (4+ weeks)
|
||||
1. Physics synchronization
|
||||
2. Avatar rendering
|
||||
3. Spatial audio
|
||||
4. Entity scripts
|
||||
|
||||
## Getting Help
|
||||
|
||||
### To Implement Color Tinting
|
||||
- Contact Stardust developers about extending asteroids Model API
|
||||
- Check if material tinting can be done via existing Material API
|
||||
- Look into shader-based color multiplication
|
||||
|
||||
### To Implement ATP Protocol
|
||||
- Study Overte's AssetClient implementation
|
||||
- Document ATP packet format
|
||||
- Create minimal ATP client in C++
|
||||
|
||||
### To Implement Physics
|
||||
- Investigate Stardust's physics capabilities
|
||||
- Determine if Rapier or other physics engine is available
|
||||
- Design physics sync protocol
|
||||
|
||||
## Conclusion
|
||||
|
||||
The core rendering pipeline is **complete and functional**. These enhancements would improve visual fidelity and feature parity, but are not required for basic Overte world viewing in StardustXR.
|
||||
|
||||
Prioritize based on user needs:
|
||||
- **Visual artists**: Color tinting, textures, transparency
|
||||
- **Content creators**: ATP protocol, advanced entity types
|
||||
- **Developers**: Physics sync, dynamic updates
|
||||
- **Users**: Performance, cache management, progress indicators
|
||||
|
||||
---
|
||||
|
||||
**Document Version**: 1.0
|
||||
**Last Updated**: November 9, 2025
|
||||
**Status**: Planning Phase
|
||||
Reference in New Issue
Block a user