diff --git a/src/main.rs b/src/main.rs index 39c498f..657fb0a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,20 +1,79 @@ -use hello::geometry::Geometry; -use hello::math::Mat4x4; +use hello::geometry::{self, Geometry, Sphere}; +use hello::math::{Mat4x4, Point3}; -enum SceneGraphNode { - Geometry(Mat4x4, Geometry), - SubNode(Mat4x4, Box), +#[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 x in 0..width { + for y 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: Texture, +} + +impl RenderableGeometry { + fn new(transform: Mat4x4, geometry: Geometry, texture: Texture) -> RenderableGeometry { + RenderableGeometry { + transform, + geometry, + texture, + } + } } fn main() { - let v1 = 5; - let v2 = &v1; - let v3 = Box::new(v1); + let tex = Texture::load_texture(); - println!("v1: {}", v1); - println!("v2: {}", v2); - println!("v3: {}", v3); + let geo1 = RenderableGeometry::new( + Mat4x4::ident(), + Geometry::Sphere(Sphere::new(Point3::new(0.0, 0.0, 0.0), 1.0)), + tex.clone(), + ); - assert_eq!(v1, *v2); - assert_eq!(v1, *v3); + 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(), + ); } diff --git a/src/math.rs b/src/math.rs index 5e64b9e..fa5b481 100644 --- a/src/math.rs +++ b/src/math.rs @@ -94,6 +94,12 @@ pub struct Mat4x4 { v: f64, } +impl Mat4x4 { + pub fn ident() -> Mat4x4 { + Mat4x4 { v: 0.0 } + } +} + #[cfg(test)] mod tests { use super::*;