fix rendering order

This commit is contained in:
Mikkel Troels Kongsted 2026-04-01 12:09:26 +02:00
parent 121bf802aa
commit 04b1943040
4 changed files with 36 additions and 29 deletions

2
game/Cargo.lock generated
View File

@ -39,7 +39,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d73fc820b0b6b9bd0557de7b799ec9da1ca4f35fcd1cb42f7ceb85e640d1477" checksum = "1d73fc820b0b6b9bd0557de7b799ec9da1ca4f35fcd1cb42f7ceb85e640d1477"
[[package]] [[package]]
name = "unnamed-game-engine" name = "skate-slope"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"sdl3", "sdl3",

View File

@ -1,5 +1,5 @@
[package] [package]
name = "unnamed-game-engine" name = "skate-slope"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"

View File

@ -18,35 +18,41 @@ impl Scene {
} }
pub fn render<R: Renderer>(&mut self, r: &mut R, camera: V3) { pub fn render<R: Renderer>(&mut self, r: &mut R, camera: V3) {
self.objects.sort_by(|a, b| { let mut indices_with_scores = self
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
.objects .objects
.iter() .iter()
.filter(|v| { .enumerate()
v.triangle.0 .2 >= -1.0 && v.triangle.1 .2 >= -1.0 && v.triangle.2 .2 >= -1.0 .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)); .rev()
for (triangle, outline_color, fill_color) in drawn_triangles { .collect::<Vec<_>>();
r.draw_triangle(triangle.clone(), fill_color);
r.draw_line(triangle.0, triangle.1, outline_color); indices_with_scores.sort_by(|a, b| b.1.total_cmp(&a.1));
r.draw_line(triangle.0, triangle.2, outline_color);
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);
} }
} }

View File

@ -120,7 +120,7 @@ struct ShapeGroupShape {
} }
struct ShapeGroup { struct ShapeGroup {
shapes: Vec<ShapeGroupShape>, pub shapes: Vec<ShapeGroupShape>,
} }
impl ShapeGroup { impl ShapeGroup {
@ -188,6 +188,7 @@ impl Object {
fn render(&self, scene: &mut Scene) { fn render(&self, scene: &mut Scene) {
match self.kind { match self.kind {
ObjectKind::SkateBoard { pos, rot, .. } => { ObjectKind::SkateBoard { pos, rot, .. } => {
let camera_pos = V3(0.0, 0.0, -1.0);
let board = ShapeGroup::new(vec![ let board = ShapeGroup::new(vec![
ShapeGroupShape { ShapeGroupShape {
shape: Shape::new_cube(V3(0.2, 0.01, 0.05)), shape: Shape::new_cube(V3(0.2, 0.01, 0.05)),