diff --git a/game/Cargo.lock b/game/Cargo.lock index 9ce22de..399e5b4 100644 --- a/game/Cargo.lock +++ b/game/Cargo.lock @@ -39,7 +39,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d73fc820b0b6b9bd0557de7b799ec9da1ca4f35fcd1cb42f7ceb85e640d1477" [[package]] -name = "unnamed-game-engine" +name = "skate-slope" version = "0.1.0" dependencies = [ "sdl3", diff --git a/game/Cargo.toml b/game/Cargo.toml index 7dbdca6..0ec6a64 100644 --- a/game/Cargo.toml +++ b/game/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "unnamed-game-engine" +name = "skate-slope" version = "0.1.0" edition = "2021" diff --git a/game/src/engine/scene.rs b/game/src/engine/scene.rs index 31e97fe..993282c 100644 --- a/game/src/engine/scene.rs +++ b/game/src/engine/scene.rs @@ -18,35 +18,41 @@ impl Scene { } pub fn render(&mut self, r: &mut R, camera: V3) { - self.objects.sort_by(|a, b| { - let a = a - .triangle - .points() - .map(|p| p.distance(camera)) - .into_iter() - .max_by(|a, b| a.total_cmp(b)) - .unwrap(); - let b = b - .triangle - .points() - .map(|p| p.distance(camera)) - .into_iter() - .max_by(|a, b| a.total_cmp(b)) - .unwrap(); - b.total_cmp(&a) - }); - - let drawn_triangles = self + let mut indices_with_scores = self .objects .iter() - .filter(|v| { - v.triangle.0 .2 >= -1.0 && v.triangle.1 .2 >= -1.0 && v.triangle.2 .2 >= -1.0 + .enumerate() + .map(|(i, object)| { + let mut point_scores = object.triangle.points().map(|p| p.distance(camera)); + point_scores.sort_by(|a, b| a.total_cmp(b)); + + (i, point_scores[0]) }) - .map(|v| (v.triangle.project_2d(), v.outline_color, v.fill_color)); - for (triangle, outline_color, fill_color) in drawn_triangles { - r.draw_triangle(triangle.clone(), fill_color); - r.draw_line(triangle.0, triangle.1, outline_color); - r.draw_line(triangle.0, triangle.2, outline_color); + .rev() + .collect::>(); + + indices_with_scores.sort_by(|a, b| b.1.total_cmp(&a.1)); + + for (i, _) in indices_with_scores { + let object = &self.objects[i]; + + // check if behind camera + if !(object.triangle.0 .2 >= -1.0 + && object.triangle.1 .2 >= -1.0 + && object.triangle.2 .2 >= -1.0) + { + continue; + } + + if object.triangle.normal().dot(object.triangle.0 - camera) >= 0.0 { + continue; + } + + let triangle = object.triangle.project_2d(); + + r.draw_triangle(triangle.clone(), object.fill_color); + r.draw_line(triangle.0, triangle.1, object.outline_color); + r.draw_line(triangle.0, triangle.2, object.outline_color); } } diff --git a/game/src/main.rs b/game/src/main.rs index e7779e6..70be3c1 100644 --- a/game/src/main.rs +++ b/game/src/main.rs @@ -120,7 +120,7 @@ struct ShapeGroupShape { } struct ShapeGroup { - shapes: Vec, + pub shapes: Vec, } impl ShapeGroup { @@ -188,6 +188,7 @@ impl Object { fn render(&self, scene: &mut Scene) { match self.kind { ObjectKind::SkateBoard { pos, rot, .. } => { + let camera_pos = V3(0.0, 0.0, -1.0); let board = ShapeGroup::new(vec![ ShapeGroupShape { shape: Shape::new_cube(V3(0.2, 0.01, 0.05)),