13 KiB
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:
-
Option A: Asteroids API Extension
Model::direct(&path) .color_tint([r, g, b, a]) // New API needed .build() -
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:
// 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:
-
Texture Downloader (similar to ModelDownloader):
pub struct TextureDownloader { cache_dir: PathBuf, // Similar to ModelDownloader but for images } // Downloads .png, .jpg, .webp, etc. fn download_texture(url: &str) -> Option<PathBuf> -
Material Texture Binding:
- Load texture as Bevy Image asset
- Bind to model's material base color texture
- Handle UV mapping and texture coordinates
-
Asteroids API Extension (hypothetical):
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:
// 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:
-
ATP Client Implementation:
- Connect to Overte asset server
- Authenticate with asset server credentials
- Request assets by hash
- Handle asset caching
-
Integration with ModelCache:
// 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:
-
Async Rendering Update:
- Render placeholder while downloading
- Replace with actual model when download completes
- Requires frame update notification to bridge
-
Progress Indicators:
- Show download progress in XR (progress bar, spinner)
- Use Stardust UI elements for visual feedback
-
Retry Logic:
- Exponential backoff for failed downloads
- Max retry count
- Fallback to primitives after retries exhausted
-
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:
-
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)
-
Cache Validation:
- Check if remote models have been updated (HTTP ETag)
- Re-download if changed
- Configurable refresh policy
-
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:
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):
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):
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:
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:
// 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)
- Color tinting - Requires asteroids API extension
- Transparency/alpha - Material configuration
- Texture support - Download + material binding
Phase 2: Protocols (2-3 weeks)
- ATP protocol support
- Model download optimization
- Cache management improvements
Phase 3: Entity Types (1-2 weeks)
- Light entities
- Text entities
- Zone entities (basic)
Phase 4: Dynamic Features (2-3 weeks)
- Real-time property updates
- In-memory caching
- Progress indicators
Phase 5: Advanced (4+ weeks)
- Physics synchronization
- Avatar rendering
- Spatial audio
- 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