use std::io::Cursor;
use vertra::camera::Camera;
use vertra::geometry::Geometry;
use vertra::objects::Object;
use vertra::transform::Transform;
use vertra::vtr;
use vertra::world::World;
fn main() {
let camera = Camera::new()
.with_position([0.0, 5.0, -12.0])
.with_rotation(90.0, -20.0);
let mut world = World::new();
let root_id = world.spawn_object(
Object {
name: "Root".to_string(),
str_id: "root".to_string(),
geometry: Some(Geometry::Cube { size: 1.0 }),
color: [1.0, 0.4, 0.4, 1.0],
transform: Transform::from_position(0.0, 0.0, 0.0),
..Default::default()
},
None,
);
let child_id = world.spawn_object(
Object {
name: "Child".to_string(),
str_id: "child".to_string(),
geometry: Some(Geometry::Sphere {
radius: 0.5,
subdivisions: 16,
}),
color: [0.4, 0.8, 0.4, 1.0],
transform: Transform::from_position(3.0, 0.0, 0.0),
..Default::default()
},
Some(root_id),
);
world.spawn_object(
Object {
name: "Grandchild".to_string(),
str_id: "grandchild".to_string(),
geometry: Some(Geometry::Pyramid {
base_size: 0.8,
height: 1.2,
}),
color: [0.4, 0.4, 1.0, 1.0],
transform: Transform::from_position(2.0, 0.0, 0.0),
..Default::default()
},
Some(child_id),
);
println!("Original scene: {} object(s)", world.objects.len());
let mut buf: Vec<u8> = Vec::new();
vtr::write(&mut buf, &camera, &world).expect("serialization failed");
println!("Serialized to {} byte(s)", buf.len());
let header = vtr::read_header(&mut Cursor::new(&buf)).expect("header read failed");
println!(
"Header: format v{}, engine v{}, {} object(s)",
header.format_version,
header.engine_version_string(),
header.object_count,
);
assert_eq!(header.object_count as usize, world.objects.len());
let loaded = vtr::read(&mut Cursor::new(&buf)).expect("deserialization failed");
println!("Loaded scene: {} object(s)", loaded.world.objects.len());
assert_eq!(
loaded.world.objects.len(),
world.objects.len(),
"object count mismatch"
);
for str_id in ["root", "child", "grandchild"] {
let orig_id = world.get_id(str_id).expect("str_id missing in original");
let load_id = loaded
.world
.get_id(str_id)
.expect("str_id missing after round-trip");
let orig = &world.objects[&orig_id];
let load = &loaded.world.objects[&load_id];
assert_eq!(orig.name, load.name, "name mismatch for {str_id}");
assert_eq!(orig.color, load.color, "color mismatch for {str_id}");
assert_eq!(
orig.transform.position, load.transform.position,
"position mismatch for {str_id}"
);
assert_eq!(
orig.geometry, load.geometry,
"geometry mismatch for {str_id}"
);
println!(" ✓ {str_id:12} name={:?}", load.name);
}
assert_eq!(camera.eye, loaded.camera.eye, "camera eye mismatch");
assert_eq!(camera.fov, loaded.camera.fov, "camera fov mismatch");
println!(" ✓ camera");
println!("\nRound-trip verified ✓");
}