#![allow(dead_code)]
use crate::math::{Point3, UnitQuaternion};
use crate::{
icvfx::composite::{CompositorConfig, IcvfxCompositor},
led::{
render::{LedRenderer, LedRendererConfig},
LedPanel, LedWall,
},
metrics::MetricsCollector,
tracking::{
camera::{CameraTracker, CameraTrackerConfig},
CameraPose,
},
workflows::{ArWorkflow, HybridWorkflow, LedWallWorkflow},
QualityMode, Result, VirtualProduction, VirtualProductionConfig, WorkflowType,
};
pub fn example_basic_led_wall() -> Result<()> {
#[cfg(test)]
let (frame_w, frame_h, panel_res) = (64usize, 64usize, (64usize, 64usize));
#[cfg(not(test))]
let (frame_w, frame_h, panel_res) = (1920usize, 1080usize, (1920usize, 1080usize));
let mut led_wall = LedWall::new("Main Wall".to_string());
led_wall.add_panel(LedPanel::new(
Point3::new(0.0, 0.0, 0.0),
5.0, 3.0, panel_res, 2.5, ));
let config = LedRendererConfig::default();
let mut renderer = LedRenderer::new(config)?;
renderer.set_led_wall(led_wall);
let tracker_config = CameraTrackerConfig {
max_latency_ms: f64::MAX / 2.0, ..CameraTrackerConfig::default()
};
let mut tracker = CameraTracker::new(tracker_config)?;
#[cfg(test)]
let num_frames = 2u64;
#[cfg(not(test))]
let num_frames = 3u64;
for frame_num in 0..num_frames {
let timestamp_ns = frame_num * 16_666_667;
let camera_pose = tracker.update(timestamp_ns)?;
let source_frame = vec![0u8; frame_w * frame_h * 3]; let _led_output =
renderer.render(&camera_pose, &source_frame, frame_w, frame_h, timestamp_ns)?;
}
Ok(())
}
pub fn example_icvfx_workflow() -> Result<()> {
#[cfg(test)]
let (w, h, num_frames) = (64usize, 64usize, 2u64);
#[cfg(not(test))]
let (w, h, num_frames) = (3840usize, 2160usize, 100u64);
let config = CompositorConfig {
resolution: (w, h),
depth_compositing: true,
motion_blur: false,
quality: 1.0,
};
let mut compositor = IcvfxCompositor::new(config)?;
for frame_num in 0..num_frames {
let timestamp_ns = frame_num * 16_666_667;
let foreground = vec![0u8; w * h * 3];
let background = vec![255u8; w * h * 3];
let depth = vec![0.5f32; w * h];
let _result = compositor.composite(&foreground, &background, Some(&depth), timestamp_ns)?;
}
Ok(())
}
pub fn example_multi_camera_setup() -> Result<()> {
let config = VirtualProductionConfig::default()
.with_num_cameras(4)
.with_target_fps(60.0)
.with_quality(QualityMode::Final);
let vp = VirtualProduction::new(config)?;
if let Some(multicam) = vp.multicam_manager() {
println!("Managing {} cameras", multicam.config().num_cameras);
}
Ok(())
}
pub fn example_led_wall_with_metrics() -> Result<()> {
#[cfg(test)]
let (frame_w, frame_h) = (64usize, 64usize);
#[cfg(not(test))]
let (frame_w, frame_h) = (1920usize, 1080usize);
let mut workflow = LedWallWorkflow::with_panel_resolution((frame_w, frame_h))?;
let mut metrics = MetricsCollector::new(60);
workflow.start_recording("session-001".to_string(), 0)?;
for frame_num in 0..3 {
let timestamp_ns = frame_num * 16_666_667;
metrics.record_frame();
let camera_pose = CameraPose::new(
Point3::new(0.0, 1.5, 5.0),
UnitQuaternion::identity(),
timestamp_ns,
);
let source_frame = vec![128u8; frame_w * frame_h * 3];
let _output =
workflow.process_frame(&camera_pose, &source_frame, frame_w, frame_h, timestamp_ns)?;
if frame_num % 60 == 0 {
let quality = crate::metrics::QualityMetrics {
tracking_confidence: 0.95,
color_accuracy: 0.98,
sync_accuracy_us: 500,
brightness_uniformity: 0.97,
};
metrics.update_quality(quality);
println!("\n{}", metrics.generate_report());
}
}
workflow.stop_recording();
Ok(())
}
pub fn example_hybrid_workflow() -> Result<()> {
#[cfg(test)]
let (w, h, num_frames) = (64usize, 64usize, 2u64);
#[cfg(not(test))]
let (w, h, num_frames) = (1920usize, 1080usize, 100u64);
let mut workflow = HybridWorkflow::with_resolution(w, h)?;
workflow.start_session("hybrid-001".to_string(), 0)?;
for frame_num in 0..num_frames {
let timestamp_ns = frame_num * 16_666_667;
let foreground = vec![0u8; w * h * 3];
let background = vec![255u8; w * h * 3];
let _composite = workflow.composite_frame(&foreground, &background, timestamp_ns)?;
}
Ok(())
}
pub fn example_ar_workflow() -> Result<()> {
#[cfg(test)]
let (w, h, num_frames) = (64usize, 64usize, 2u64);
#[cfg(not(test))]
let (w, h, num_frames) = (1920usize, 1080usize, 100u64);
let mut workflow = ArWorkflow::with_resolution(w, h)?;
workflow.start("ar-session-001".to_string(), 0)?;
for frame_num in 0..num_frames {
let timestamp_ns = frame_num * 16_666_667;
let camera_feed = vec![128u8; w * h * 3];
let virtual_content = vec![255u8; w * h * 3];
let _result = workflow.overlay(&camera_feed, &virtual_content, timestamp_ns)?;
}
Ok(())
}
pub fn example_camera_tracking() -> Result<()> {
let config = CameraTrackerConfig {
update_rate: 120.0, optical_tracking: true,
imu_tracking: true,
fusion_weight: 0.7,
smoothing_window: 5,
max_latency_ms: 5.0,
};
let mut tracker = CameraTracker::new(config)?;
for frame_num in 0..1000 {
let timestamp_ns = frame_num * 8_333_333;
let pose = tracker.update(timestamp_ns)?;
if pose.confidence < 0.5 {
println!("Warning: Low tracking confidence: {}", pose.confidence);
}
if frame_num % 100 == 0 {
println!(
"Frame {}: Position = ({:.2}, {:.2}, {:.2}), Confidence = {:.2}",
frame_num, pose.position.x, pose.position.y, pose.position.z, pose.confidence
);
}
}
Ok(())
}
pub fn example_complete_pipeline() -> Result<()> {
#[cfg(test)]
let (w, h, panel_res) = (64usize, 64usize, (64usize, 64usize));
#[cfg(not(test))]
let (w, h, panel_res) = (3840usize, 2160usize, (3840usize, 2160usize));
let config = VirtualProductionConfig {
workflow: WorkflowType::LedWall,
target_fps: 60.0,
sync_accuracy_ms: 0.5,
quality: QualityMode::Final,
color_calibration: true,
lens_correction: true,
num_cameras: 1,
motion_capture: false,
unreal_integration: false,
};
let mut vp = VirtualProduction::new(config)?;
vp.set_compositor_resolution(w, h)?;
let mut led_wall = LedWall::new("Main Volume".to_string());
led_wall.add_panel(LedPanel::new(
Point3::new(0.0, 0.0, 0.0),
10.0,
6.0,
panel_res,
1.8,
));
vp.led_renderer_mut().set_led_wall(led_wall);
let mut metrics = MetricsCollector::new(60);
println!("Starting virtual production...");
for frame_num in 0..2 {
let timestamp_ns = frame_num * 16_666_667;
let start_tracking = std::time::Instant::now();
let camera_pose = vp.camera_tracker_mut().update(timestamp_ns)?;
metrics.record_tracking_latency(start_tracking.elapsed());
let start_render = std::time::Instant::now();
let source_frame = vec![128u8; w * h * 3];
let led_output =
vp.led_renderer_mut()
.render(&camera_pose, &source_frame, w, h, timestamp_ns)?;
metrics.record_render_latency(start_render.elapsed());
let start_composite = std::time::Instant::now();
let foreground = vec![0u8; w * h * 3];
let _composite =
vp.compositor_mut()
.composite(&foreground, &led_output.pixels, None, timestamp_ns)?;
metrics.record_composite_latency(start_composite.elapsed());
metrics.record_frame();
metrics.update_total_latency();
if frame_num % 60 == 0 {
println!("\nFrame {frame_num}/3600");
println!("{}", metrics.generate_report());
}
}
println!("\nProduction complete!");
println!("Final metrics:");
println!("{}", metrics.generate_report());
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_example_basic_led_wall() {
let result = example_basic_led_wall();
assert!(result.is_ok());
}
#[test]
fn test_example_icvfx_workflow() {
let result = example_icvfx_workflow();
assert!(result.is_ok());
}
#[test]
fn test_example_multi_camera_setup() {
let result = example_multi_camera_setup();
assert!(result.is_ok());
}
#[test]
fn test_example_hybrid_workflow() {
let result = example_hybrid_workflow();
assert!(result.is_ok());
}
#[test]
fn test_example_ar_workflow() {
let result = example_ar_workflow();
assert!(result.is_ok());
}
#[test]
fn test_example_camera_tracking() {
let result = example_camera_tracking();
assert!(result.is_ok());
}
}