mirror of
https://github.com/Mercantec-GHC/h5-projekt-mst.git
synced 2026-08-26 21:27:38 +02:00
fix rendering order
This commit is contained in:
parent
121bf802aa
commit
04b1943040
2
game/Cargo.lock
generated
2
game/Cargo.lock
generated
@ -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",
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
[package]
|
||||
name = "unnamed-game-engine"
|
||||
name = "skate-slope"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
|
||||
@ -18,35 +18,41 @@ impl Scene {
|
||||
}
|
||||
|
||||
pub fn render<R: Renderer>(&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::<Vec<_>>();
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -120,7 +120,7 @@ struct ShapeGroupShape {
|
||||
}
|
||||
|
||||
struct ShapeGroup {
|
||||
shapes: Vec<ShapeGroupShape>,
|
||||
pub shapes: Vec<ShapeGroupShape>,
|
||||
}
|
||||
|
||||
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)),
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user