use std::sync::{Arc, RwLock};
use std::collections::{HashMap};
use std::time::Instant;
pub use super::{
Camera, Light, Material, RenderMode, RenderStats, SceneObject, Transform, XRPlatform,
};
#[derive(Debug, Clone)]
pub struct MetaverseConfig {
pub render_mode: RenderMode,
pub target_fps: u32,
pub resolution: (u32, u32),
pub enable_multiuser: bool,
pub max_users: u32,
pub enable_spatial_audio: bool,
pub enable_holographic_display: bool,
pub xr_platform: XRPlatform,
}
impl Default for MetaverseConfig {
fn default() -> Self {
Self {
render_mode: RenderMode::Rasterization,
target_fps: 90,
resolution: (1920, 1080),
enable_multiuser: false,
max_users: 10,
enable_spatial_audio: true,
enable_holographic_display: false,
xr_platform: XRPlatform::WebXR,
}
}
}
pub struct MetaverseEngine {
config: MetaverseConfig,
objects: HashMap<String, SceneObject>,
lights: Vec<Light>,
camera: Camera,
stats: RenderStats,
rendering: bool,
last_frame_time: Option<Instant>,
holographic_engine: Option<Arc<RwLock<()>>>,
}
impl MetaverseEngine {
pub fn new(config: MetaverseConfig) -> Result<Self, MetaverseError> {
Ok(Self {
config,
objects: HashMap::new(),
lights: vec![Light::default()],
camera: Camera::default(),
stats: RenderStats::default(),
rendering: false,
last_frame_time: None,
holographic_engine: None,
})
}
pub fn config(&self) -> &MetaverseConfig {
&self.config
}
pub fn is_rendering(&self) -> bool {
self.rendering
}
pub fn start_rendering(&mut self) -> Result<(), MetaverseError> {
self.rendering = true;
self.last_frame_time = Some(Instant::now());
Ok(())
}
pub fn stop_rendering(&mut self) {
self.rendering = false;
}
pub fn render_frame(&self) -> Result<RenderStats, MetaverseError> {
let start: _ = Instant::now();
let mut stats = RenderStats::default();
stats.triangles = self.objects.len() as u64 * 1000;
stats.draw_calls = self.objects.len() as u64;
let elapsed: _ = start.elapsed();
stats.frame_time_ms = elapsed.as_secs_f64() * 1000.0;
stats.fps = 1000.0 / stats.frame_time_ms.max(0.001);
stats.latency_ms = elapsed.as_secs_f64() * 1000.0;
Ok(stats)
}
pub fn add_object(&mut self, object: SceneObject) {
self.objects.insert(object.name().to_string(), object);
}
pub fn remove_object(&mut self, name: &str) -> Option<SceneObject> {
self.objects.remove(name)
}
pub fn get_object(&self, name: &str) -> Option<&SceneObject> {
self.objects.get(name)
}
pub fn add_light(&mut self, light: Light) {
self.lights.push(light);
}
pub fn set_camera(&mut self, camera: Camera) {
self.camera = camera;
}
pub fn camera(&self) -> &Camera {
&self.camera
}
pub fn stats(&self) -> &RenderStats {
&self.stats
}
pub fn integrate_holographic<T>(&self, _holographic: &T) -> Result<(), MetaverseError> {
Ok(())
}
pub fn object_count(&self) -> usize {
self.objects.len()
}
}
#[derive(Debug, Clone)]
pub enum MetaverseError {
InitializationFailed(String),
RenderFailed(String),
ResourceLoadFailed(String),
NetworkError(String),
}
impl std::fmt::Display for MetaverseError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::InitializationFailed(msg) => write!(f, "初始化失败: {}", msg),
Self::RenderFailed(msg) => write!(f, "渲染失败: {}", msg),
Self::ResourceLoadFailed(msg) => write!(f, "资源加载失败: {}", msg),
Self::NetworkError(msg) => write!(f, "网络错误: {}", msg),
}
}
}
impl std::error::Error for MetaverseError {}