487 lines
13 KiB
Markdown
487 lines
13 KiB
Markdown
# 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
|