use hello::geometry::{Geometry, Line, Plane, Sphere}; use hello::math::{Mat4x4, Point3, Vector3}; use std::rc::Rc; #[derive(Clone)] struct RGB { red: f64, green: f64, blue: f64, } #[derive(Clone)] struct Texture { width: usize, height: usize, pixel: Vec, } impl Texture { fn load_texture() -> Texture { let width = 640; let height = 480; let mut pixel = Vec::new(); for _ in 0..width { for _ in 0..height { pixel.push(RGB { red: 1.0, green: 1.0, blue: 1.0, }); } } Texture { width, height, pixel, } } } struct RenderableGeometry { transform: Mat4x4, geometry: Geometry, texture: Rc, } impl RenderableGeometry { fn new(transform: Mat4x4, geometry: Geometry, texture: Rc) -> RenderableGeometry { RenderableGeometry { transform, geometry, texture, } } } trait Renderable { fn render(&self); } impl Renderable for Sphere { fn render(&self) { println!("Rendering Sphere!"); } } impl Renderable for Plane { fn render(&self) { println!("Rendering Plane!"); } } impl Renderable for Line { fn render(&self) { println!("Rendering Line!"); } } fn main() { let tex = Rc::new(Texture::load_texture()); let sphere = Geometry::Sphere(Sphere::new(Point3::new(0.0, 0.0, 0.0), 1.0)); let geometries = vec![sphere]; for g in geometries { g.draw(); } let mut renderables: Vec> = Vec::new(); renderables.push(Box::new(Sphere::new(Point3::new(0.0, 0.0, 0.0), 1.0))); renderables.push(Box::new(Plane::new( Point3::new(0.0, 0.0, 0.0), Vector3::new(0.0, 1.0, 0.0), ))); for r in renderables { r.render(); } let geo1 = RenderableGeometry::new( Mat4x4::ident(), Geometry::Sphere(Sphere::new(Point3::new(0.0, 0.0, 0.0), 1.0)), tex.clone(), ); let geo2 = RenderableGeometry::new( Mat4x4::ident(), Geometry::Sphere(Sphere::new(Point3::new(-2.0, 0.0, 0.0), 1.0)), tex.clone(), ); let geo3 = RenderableGeometry::new( Mat4x4::ident(), Geometry::Sphere(Sphere::new(Point3::new(2.0, 0.0, 0.0), 1.0)), tex.clone(), ); println!("Reference counter = {}", Rc::strong_count(&tex)); }