Skip to content

Commit b37c04a

Browse files
committed
refactor: update
Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
1 parent 1d62ad8 commit b37c04a

15 files changed

Lines changed: 139 additions & 65 deletions

File tree

simple_renderer/src/fragment.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pub struct Fragment {
1111
pub uv: Vec2,
1212
pub color: Color,
1313
pub depth: f32,
14+
pub world_position: Vec3,
1415
}
1516

1617
#[cfg(test)]
@@ -25,10 +26,12 @@ mod tests {
2526
uv: Vec2::new(0.5, 0.5),
2627
color: Color::WHITE,
2728
depth: 0.5,
29+
world_position: Vec3::new(1.0, 2.0, 3.0),
2830
};
2931
assert_eq!(f.screen_coord, [100, 200]);
3032
assert_eq!(f.normal, Vec3::Y);
3133
assert_eq!(f.depth, 0.5);
34+
assert_eq!(f.world_position, Vec3::new(1.0, 2.0, 3.0));
3235
}
3336

3437
#[test]
@@ -39,6 +42,7 @@ mod tests {
3942
uv: Vec2::ZERO,
4043
color: Color::RED,
4144
depth: 0.1,
45+
world_position: Vec3::ZERO,
4246
};
4347
let f2 = f.clone();
4448
assert_eq!(f2.screen_coord, f.screen_coord);

simple_renderer/src/lib.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
pub mod buffer;
22
pub mod color;
33
pub mod error;
4-
pub mod face;
5-
pub mod fragment;
4+
pub(crate) mod face;
5+
pub(crate) mod fragment;
66
pub mod light;
7-
pub mod material;
8-
pub mod math;
7+
pub(crate) mod material;
8+
pub(crate) mod math;
99
pub mod model;
10-
pub mod rasterizer;
10+
pub(crate) mod rasterizer;
1111
pub mod renderer;
12-
pub mod renderers;
12+
pub(crate) mod renderers;
1313
pub mod shader;
14-
pub mod uniform;
14+
pub(crate) mod uniform;
1515
pub mod vertex;
1616

1717
// Convenience re-exports

simple_renderer/src/rasterizer.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ impl Rasterizer {
7575
let c1 = v1.color;
7676
let c2 = v2.color;
7777

78+
let wp0 = v0.world_position;
79+
let wp1 = v1.world_position;
80+
let wp2 = v2.world_position;
81+
7882
// Parallel over rows.
7983
let rows: Vec<i32> = (y_min..=y_max).collect();
8084
rows.par_iter()
@@ -92,13 +96,15 @@ impl Rasterizer {
9296
let normal = interpolate_vec3(n0, n1, n2, corrected);
9397
let uv = interpolate_vec2(uv0, uv1, uv2, corrected);
9498
let color = interpolate_color(c0, c1, c2, corrected);
99+
let world_position = interpolate_vec3(wp0, wp1, wp2, corrected);
95100

96101
row_frags.push(Fragment {
97102
screen_coord: [x, y],
98103
normal,
99104
uv,
100105
color,
101106
depth,
107+
world_position,
102108
});
103109
}
104110
row_frags
@@ -205,6 +211,7 @@ mod tests {
205211
tex_coords: Vec2::ZERO,
206212
color: Color::WHITE,
207213
clip_position: None,
214+
world_position: Vec3::ZERO,
208215
}
209216
}
210217

simple_renderer/src/renderer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ impl SimpleRenderer {
5151
}
5252
}
5353

54-
pub fn draw_model(&self, model: &Model, shader: &Shader, buffer: &mut [u32]) -> bool {
54+
pub fn draw_model(&self, model: &Model, shader: &Shader, buffer: &mut [u32]) -> crate::error::Result<()> {
5555
self.renderer
5656
.render(model, shader, buffer, self.width, self.height)
5757
}

simple_renderer/src/renderers/base.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ pub fn perspective_division(vertex: &Vertex) -> Vertex {
2828
tex_coords: vertex.tex_coords,
2929
color: vertex.color,
3030
clip_position: vertex.clip_position,
31+
world_position: vertex.world_position,
3132
}
3233
}
3334

@@ -52,6 +53,7 @@ pub fn viewport_transform(vertex: &Vertex, width: usize, height: usize) -> Verte
5253
tex_coords: vertex.tex_coords,
5354
color: vertex.color,
5455
clip_position: vertex.clip_position,
56+
world_position: vertex.world_position,
5557
}
5658
}
5759

@@ -72,6 +74,7 @@ mod tests {
7274
tex_coords: Vec2::ZERO,
7375
color: Color::WHITE,
7476
clip_position: Some(Vec4::new(x, y, z, w)),
77+
world_position: Vec3::ZERO,
7578
}
7679
}
7780

@@ -126,6 +129,7 @@ mod tests {
126129
tex_coords: Vec2::new(0.3, 0.7),
127130
color: Color::RED,
128131
clip_position: Some(Vec4::new(1.0, 2.0, 3.0, 2.0)),
132+
world_position: Vec3::ZERO,
129133
};
130134
let ndc = perspective_division(&v);
131135
assert_eq!(ndc.normal, Vec3::Y);
@@ -190,6 +194,7 @@ mod tests {
190194
tex_coords: Vec2::new(0.1, 0.9),
191195
color: Color::BLUE,
192196
clip_position: Some(Vec4::new(0.0, 0.0, 0.5, 1.0)),
197+
world_position: Vec3::ZERO,
193198
};
194199
let s = viewport_transform(&v, 200, 200);
195200
assert_eq!(s.normal, Vec3::X);

simple_renderer/src/renderers/deferred.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,13 @@ impl Renderer for DeferredRenderer {
5151
out_buffer: &mut [u32],
5252
width: usize,
5353
height: usize,
54-
) -> bool {
54+
) -> crate::error::Result<()> {
5555
// 1. Clone shader + prepare caches
5656
let mut shader = shader.clone();
5757
shader.prepare_caches();
5858

5959
let t = Instant::now();
60-
// 2. Vertex transform (sequential — vertex_shader writes frag_pos_varying)
60+
// 2. Vertex transform (sequential)
6161
let vertices = model.vertices();
6262
let processed_vertices: Vec<_> = vertices
6363
.iter()
@@ -89,6 +89,7 @@ impl Renderer for DeferredRenderer {
8989
uv: Vec2::ZERO,
9090
color: Color::new(0, 0, 0, 0),
9191
depth: f32::INFINITY,
92+
world_position: Vec3::ZERO,
9293
};
9394

9495
// Per-thread result: (depth_buf, fragment_buf, face_index_buf)
@@ -181,7 +182,7 @@ impl Renderer for DeferredRenderer {
181182
debug!("=======================================");
182183
}
183184

184-
true
185+
Ok(())
185186
}
186187
}
187188

@@ -267,7 +268,7 @@ mod tests {
267268

268269
let mut buffer = vec![0u32; width * height];
269270
let result = renderer.render(&model, &shader, &mut buffer, width, height);
270-
assert!(result);
271+
assert!(result.is_ok());
271272

272273
let nonzero_count = buffer.iter().filter(|&&p| p != 0).count();
273274
assert!(
@@ -295,7 +296,7 @@ mod tests {
295296
);
296297

297298
let mut buffer = vec![0u32; width * height];
298-
renderer.render(&model, &shader, &mut buffer, width, height);
299+
let _ = renderer.render(&model, &shader, &mut buffer, width, height);
299300

300301
let nonzero_count = buffer.iter().filter(|&&p| p != 0).count();
301302
assert!(
@@ -323,7 +324,7 @@ mod tests {
323324

324325
let mut buffer = vec![0u32; width * height];
325326
let result = renderer.render(&model, &shader, &mut buffer, width, height);
326-
assert!(result);
327+
assert!(result.is_ok());
327328

328329
let nonzero_count = buffer.iter().filter(|&&p| p != 0).count();
329330
assert_eq!(
@@ -349,7 +350,7 @@ mod tests {
349350
);
350351

351352
let mut buffer = vec![0u32; width * height];
352-
renderer.render(&model, &shader, &mut buffer, width, height);
353+
let _ = renderer.render(&model, &shader, &mut buffer, width, height);
353354

354355
let nonzero_count = buffer.iter().filter(|&&p| p != 0).count();
355356
assert_eq!(
@@ -386,7 +387,7 @@ mod tests {
386387

387388
let mut buffer = vec![0u32; width * height];
388389
let result = renderer.render(&model, &shader, &mut buffer, width, height);
389-
assert!(result);
390+
assert!(result.is_ok());
390391

391392
let nonzero_count = buffer.iter().filter(|&&p| p != 0).count();
392393
assert!(

simple_renderer/src/renderers/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ use crate::shader::Shader;
1414
pub trait Renderer: Send {
1515
/// Render `model` into `out_buffer` (row-major, `width × height` pixels).
1616
///
17-
/// Returns `true` on success.
17+
/// Returns `Ok(())` on success.
1818
fn render(
1919
&self,
2020
model: &Model,
2121
shader: &Shader,
2222
out_buffer: &mut [u32],
2323
width: usize,
2424
height: usize,
25-
) -> bool;
25+
) -> crate::error::Result<()>;
2626
}

simple_renderer/src/renderers/per_triangle.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,13 @@ impl Renderer for PerTriangleRenderer {
4444
out_buffer: &mut [u32],
4545
width: usize,
4646
height: usize,
47-
) -> bool {
47+
) -> crate::error::Result<()> {
4848
// 1. Clone shader + prepare caches
4949
let mut shader = shader.clone();
5050
shader.prepare_caches();
5151

5252
let t = Instant::now();
53-
// 2. Vertex transform (sequential — vertex_shader writes frag_pos_varying)
53+
// 2. Vertex transform (sequential)
5454
let vertices = model.vertices();
5555
let processed_vertices: Vec<_> = vertices
5656
.iter()
@@ -158,7 +158,7 @@ impl Renderer for PerTriangleRenderer {
158158
debug!("Total: {:8.3} ms", sum_ms);
159159
debug!("==========================================");
160160
}
161-
true
161+
Ok(())
162162
}
163163
}
164164

@@ -252,7 +252,7 @@ mod tests {
252252

253253
let mut buffer = vec![0u32; width * height];
254254
let result = renderer.render(&model, &shader, &mut buffer, width, height);
255-
assert!(result);
255+
assert!(result.is_ok());
256256

257257
let nonzero_count = buffer.iter().filter(|&&p| p != 0).count();
258258
assert!(
@@ -282,7 +282,7 @@ mod tests {
282282
);
283283

284284
let mut buffer = vec![0u32; width * height];
285-
renderer.render(&model, &shader, &mut buffer, width, height);
285+
let _ = renderer.render(&model, &shader, &mut buffer, width, height);
286286

287287
let nonzero_count = buffer.iter().filter(|&&p| p != 0).count();
288288
assert_eq!(
@@ -311,7 +311,7 @@ mod tests {
311311
);
312312

313313
let mut buffer = vec![0u32; width * height];
314-
renderer.render(&model, &shader, &mut buffer, width, height);
314+
let _ = renderer.render(&model, &shader, &mut buffer, width, height);
315315

316316
let nonzero_count = buffer.iter().filter(|&&p| p != 0).count();
317317
assert_eq!(

simple_renderer/src/renderers/tile_based.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,14 @@ impl Renderer for TileBasedRenderer {
7676
out_buffer: &mut [u32],
7777
width: usize,
7878
height: usize,
79-
) -> bool {
79+
) -> crate::error::Result<()> {
8080
// 1. Clone shader + prepare caches
8181
let mut shader = shader.clone();
8282
shader.prepare_caches();
8383

8484
let t = Instant::now();
8585
// 2. Vertex transform to SoA
86-
let soa = tile_common::vertex_transform_soa(model, &mut shader, width, height);
86+
let soa = tile_common::vertex_transform_soa(model, &shader, width, height);
8787
let vertex_ms = t.elapsed().as_secs_f64() * 1000.0;
8888

8989
let t = Instant::now();
@@ -195,7 +195,7 @@ impl Renderer for TileBasedRenderer {
195195
debug!("=========================================");
196196
}
197197

198-
true
198+
Ok(())
199199
}
200200
}
201201

@@ -395,6 +395,12 @@ fn rasterize_tile(
395395
uv,
396396
color,
397397
depth: zvals[j],
398+
world_position: {
399+
let wp0 = grid.soa.world_pos[i0];
400+
let wp1 = grid.soa.world_pos[i1];
401+
let wp2 = grid.soa.world_pos[i2];
402+
wp0 * b0c + wp1 * b1c + wp2 * b2c
403+
},
398404
};
399405

400406
if use_early_z {
@@ -498,7 +504,7 @@ mod tests {
498504

499505
let mut buffer = vec![0u32; width * height];
500506
let result = renderer.render(&model, &shader, &mut buffer, width, height);
501-
assert!(result);
507+
assert!(result.is_ok());
502508

503509
let nonzero_count = buffer.iter().filter(|&&p| p != 0).count();
504510
assert!(
@@ -524,7 +530,7 @@ mod tests {
524530
);
525531

526532
let mut buffer = vec![0u32; width * height];
527-
renderer.render(&model, &shader, &mut buffer, width, height);
533+
let _ = renderer.render(&model, &shader, &mut buffer, width, height);
528534

529535
let nonzero_count = buffer.iter().filter(|&&p| p != 0).count();
530536
assert_eq!(
@@ -551,7 +557,7 @@ mod tests {
551557

552558
let mut buffer = vec![0u32; width * height];
553559
let result = renderer.render(&model, &shader, &mut buffer, width, height);
554-
assert!(result);
560+
assert!(result.is_ok());
555561

556562
let nonzero_count = buffer.iter().filter(|&&p| p != 0).count();
557563
assert_eq!(
@@ -578,7 +584,7 @@ mod tests {
578584

579585
let mut buffer = vec![0u32; width * height];
580586
let result = renderer.render(&model, &shader, &mut buffer, width, height);
581-
assert!(result);
587+
assert!(result.is_ok());
582588

583589
let nonzero_count = buffer.iter().filter(|&&p| p != 0).count();
584590
assert!(
@@ -604,7 +610,7 @@ mod tests {
604610
);
605611

606612
let mut buffer = vec![0u32; width * height];
607-
renderer.render(&model, &shader, &mut buffer, width, height);
613+
let _ = renderer.render(&model, &shader, &mut buffer, width, height);
608614

609615
let nonzero_count = buffer.iter().filter(|&&p| p != 0).count();
610616
assert_eq!(
@@ -631,7 +637,7 @@ mod tests {
631637

632638
let mut buffer = vec![0u32; width * height];
633639
let result = renderer.render(&model, &shader, &mut buffer, width, height);
634-
assert!(result);
640+
assert!(result.is_ok());
635641

636642
let nonzero_count = buffer.iter().filter(|&&p| p != 0).count();
637643
assert!(

0 commit comments

Comments
 (0)