From 1f33d8719308493b91fe1086271b1aaa2396c4bd Mon Sep 17 00:00:00 2001 From: Jon Janzen Date: Sat, 20 Mar 2021 20:12:47 -0600 Subject: [PATCH] can make a ppm --- Cargo.lock | 16 ++++++++++++++++ Cargo.toml | 2 ++ canvas/src/lib.rs | 8 ++++++++ src/main.rs | 33 ++++++++++++++++++++++++++------- 4 files changed, 52 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dd1d7cf..7e69a7f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,6 +15,20 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +[[package]] +name = "canvas" +version = "0.1.0" +dependencies = [ + "color", +] + +[[package]] +name = "color" +version = "0.1.0" +dependencies = [ + "approx", +] + [[package]] name = "num-traits" version = "0.2.14" @@ -35,5 +49,7 @@ dependencies = [ name = "tuples" version = "0.1.0" dependencies = [ + "canvas", + "color", "structs", ] diff --git a/Cargo.toml b/Cargo.toml index 5a86c4f..808f13e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,4 +7,6 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +canvas = { path = "canvas" } +color = { path = "color" } structs = { path = "structs" } diff --git a/canvas/src/lib.rs b/canvas/src/lib.rs index a8aa2e5..4dee0bd 100644 --- a/canvas/src/lib.rs +++ b/canvas/src/lib.rs @@ -14,6 +14,14 @@ impl Canvas { pixels : vec![vec![Color::new(0.0, 0.0, 0.0); width]; height], } } + + pub fn width(&self) -> usize { + self.width + } + + pub fn height(&self) -> usize { + self.height + } } impl Canvas { diff --git a/src/main.rs b/src/main.rs index 3fc15d3..c15d1fc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,10 @@ +use canvas::Canvas; +use color::Color; use structs::Tuple; use std::fmt; +use std::fs::File; +use std::io::prelude::*; #[derive(Debug)] struct Environment { @@ -57,15 +61,30 @@ fn main() { let mut ball = Projectile::new( Tuple::point(0.0, 0.0, 1.0), - Tuple::vector(10.0, 0.0, 100.0), + Tuple::vector(2.2, 0.0, 21.0), ); - let mut tick = 0; - println!("tick {} the ball {}", tick, ball); - while ball.position.z() > 0.0 { - ball.tick(&env); + let mut canvas = Canvas::new(300, 300); + let color = Color::new(1.0, 1.0, 0.0); + while ball.position.z() < canvas.height() as f32 + && ball.position.z() >= 0.0 + && ball.position.x() < canvas.width() as f32 + && ball.position.x() >= 0.0 { + canvas.write_pixel(ball.position.x() as usize, canvas.height() - ball.position.z() as usize, color); - println!("tick {} the ball {}", tick, ball); - tick += 1; + ball.tick(&env); } + + let ppm = canvas.to_ppm(); + + let mut f = match File::create("out.ppm") { + Ok(f) => f, + Err(e) => panic!("file error. {}", e), + }; + + let _ = match f.write_all(ppm.as_bytes()) { + Ok(w) => w, + Err(e) => panic!("did not write. {}", e), + }; + }