diff --git a/src/main.rs b/src/main.rs index 4ea0d3b..6e3e220 100644 --- a/src/main.rs +++ b/src/main.rs @@ -49,15 +49,14 @@ fn main() { let mut scene = vec![Object { vertices: vec![ - // Point3D(0.0, f64::MAX / 2.0, 1.0), - // Point3D(f64::MAX / 2.0, -f64::MAX / 2.0, 1.0), - // Point3D(-f64::MAX / 2.0, -f64::MAX / 2.0, 1.0), - // Point3D(0.0, 0.0, f64::MAX / 2.0), - // Point3D(0.0, 0.0, 0.0), - Point3D(f64::MAX / 2.0, f64::MAX / 2.0, 0.0) + Point3D(0.0, f64::MAX / 2.0, 0.0), + Point3D(f64::MAX / 2.0, -f64::MAX / 2.0, 0.0), + Point3D(-f64::MAX / 2.0, -f64::MAX / 2.0, 0.0), ], edges: vec![ - (Point3D(0.0, 0.0, 0.0), Point3D(f64::MAX / 2.0, f64::MAX / 2.0, 0.0)) + (Point3D(0.0, f64::MAX / 2.0, 0.0), Point3D(f64::MAX / 2.0, -f64::MAX / 2.0, 0.0)), + (Point3D(f64::MAX / 2.0, -f64::MAX / 2.0, 0.0), Point3D(-f64::MAX / 2.0, -f64::MAX / 2.0, 0.0)), + (Point3D(-f64::MAX / 2.0, -f64::MAX / 2.0, 0.0), Point3D(0.0, f64::MAX / 2.0, 0.0)) ], }]; diff --git a/src/points.rs b/src/points.rs index 295d1ad..68a1d83 100644 --- a/src/points.rs +++ b/src/points.rs @@ -1,6 +1,6 @@ use crate::consts::*; -#[derive(Debug)] +#[derive(Debug, Clone, Copy)] pub struct Point2D(pub f64, pub f64); impl Point2D { pub fn to_canvas_coordinates(&self) -> Point3D { @@ -18,7 +18,7 @@ impl Point2D { } } -#[derive(Debug)] +#[derive(Debug, Clone, Copy)] pub struct Point3D(pub f64, pub f64, pub f64); impl Point3D { pub fn to_screen_coordinates(&self) -> Point2D { diff --git a/src/render.rs b/src/render.rs index 7cacc9e..85006b1 100644 --- a/src/render.rs +++ b/src/render.rs @@ -13,7 +13,7 @@ fn to_rgb((red, green, blue): Subpixels) -> Pixel { pixel } -const fn index_buffer(buf: &mut [u32], x: f64, y: f64) -> &mut u32 { +fn index_buffer(buf: &mut [u32], x: f64, y: f64) -> &mut u32 { let x = x.round_ties_even(); // Banker's round let y = y.round_ties_even(); @@ -41,13 +41,11 @@ pub fn render(t: u128, scene: &Scene, buf: &mut [u32]) { } for edge in &obj.edges { // Draw lines - dbg!(&edge.0, &edge.1); let start = edge.0.to_screen_coordinates(); let end = edge.1.to_screen_coordinates(); - dbg!(&start, &end); if (end.0 - start.0).abs() == 0.0 { // Vertical line case - m is undefined - for y in (start.0.min(end.0) as u32)..(end.0.max(start.0) + 1.0) as u32 { + for y in (start.1.min(end.1) as u32)..(end.1.max(start.1) + 1.0) as u32 { *index_buffer(buf, end.0, y as f64) = to_rgb((255, 255, 255)); } continue @@ -56,7 +54,8 @@ pub fn render(t: u128, scene: &Scene, buf: &mut [u32]) { let m = (end.1 - start.1) / (end.0 - start.0); // m = rise/run let c = start.1 as f64 - m * start.0 as f64; // c = y - mx - for x in (start.0 as usize)..(end.0 as usize) { + dbg!(start, end, "==="); + for x in (start.0.min(end.0) as usize)..(end.0.max(start.0) as usize) { let x = x as f64; let y = m * x + c; // y = mx + c *index_buffer(buf, x, y) = to_rgb((255, 255, 255));