use bevy_sensor::{
backend::{detect_platform, BackendConfig},
render_to_buffer, ObjectRotation, RenderConfig, ViewpointConfig,
};
use std::path::PathBuf;
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("WebGPU Backend Rendering Example");
println!("================================\n");
let platform = detect_platform();
println!("Detected platform: {:?}\n", platform);
let backend_config = BackendConfig::new();
let selected_backend = backend_config.selected_backend();
println!("Backend configuration:");
println!(" Selected: {}", selected_backend.name());
println!(
" Fallbacks: {:?}",
backend_config
.fallbacks
.iter()
.map(|b| b.name())
.collect::<Vec<_>>()
);
println!(" Force headless: {}", backend_config.force_headless);
println!();
backend_config.apply_env();
println!("Note: To force WebGPU backend, use:");
println!(" export WGPU_BACKEND=webgpu\n");
let object_dir = PathBuf::from("/tmp/ycb/003_cracker_box");
if !object_dir.exists() {
eprintln!("Object directory not found: {:?}", object_dir);
eprintln!("Please download YCB dataset first:");
eprintln!(" cargo run --example test_render");
return Err("Object directory not found".into());
}
let render_config = RenderConfig::tbp_default();
let viewpoint_config = ViewpointConfig::default();
let viewpoints = bevy_sensor::generate_viewpoints(&viewpoint_config);
println!("Rendering configuration:");
println!(
" Resolution: {}x{}",
render_config.width, render_config.height
);
println!(" Viewpoints: {}", viewpoints.len());
println!(" Object: 003_cracker_box\n");
println!("Rendering with {} backend...", selected_backend.name());
let output = render_to_buffer(
&object_dir,
&viewpoints[0],
&ObjectRotation::identity(),
&render_config,
)?;
println!("✓ Render successful!");
println!();
println!("Output information:");
println!(" Image size: {}x{} pixels", output.width, output.height);
println!(" RGBA data: {} bytes", output.rgba.len());
println!(
" Depth data: {} values ({} bytes)",
output.depth.len(),
output.depth.len() * 8
);
let intrinsics = &output.intrinsics;
println!("\nCamera intrinsics:");
println!(
" Focal length: [{:.2}, {:.2}]",
intrinsics.focal_length[0], intrinsics.focal_length[1]
);
println!(
" Principal point: [{:.2}, {:.2}]",
intrinsics.principal_point[0], intrinsics.principal_point[1]
);
let rgb_image = output.to_rgb_image();
let depth_image = output.to_depth_image();
println!("\nImage format conversions:");
println!(
" RGB image: {}x{} pixels",
rgb_image.len(),
rgb_image[0].len()
);
println!(
" Depth image: {}x{} floats",
depth_image.len(),
depth_image[0].len()
);
println!("\n✓ WebGPU rendering example complete!");
println!("\nTo render multiple viewpoints efficiently, see examples/batch_render_neocortx.rs");
Ok(())
}