Skip to content

Commit

Permalink
chore: Renderlet has indices, can render indexed geometry, changed 'g…
Browse files Browse the repository at this point in the history
…eometry' to 'vertices' (#93)
  • Loading branch information
schell authored Apr 9, 2024
1 parent a136ae9 commit 5f5f132
Show file tree
Hide file tree
Showing 12 changed files with 84 additions and 35 deletions.
14 changes: 7 additions & 7 deletions crates/renderling/src/atlas/cpu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -578,7 +578,7 @@ mod test {
});
let _renderlet = stage.draw(&crate::Renderlet {
camera,
geometry,
vertices: geometry,
transform,
material,
..Default::default()
Expand Down Expand Up @@ -655,7 +655,7 @@ mod test {
});
let _clamp_prim = stage.draw(&Renderlet {
camera,
geometry,
vertices: geometry,
material: clamp_material_id,
..Default::default()
});
Expand All @@ -666,7 +666,7 @@ mod test {
});
stage.draw(&Renderlet {
camera,
geometry,
vertices: geometry,
material: repeat_material_id,
transform,
..Default::default()
Expand All @@ -679,7 +679,7 @@ mod test {
});
stage.draw(&Renderlet {
camera,
geometry,
vertices: geometry,
material: mirror_material_id,
transform,
..Default::default()
Expand Down Expand Up @@ -767,7 +767,7 @@ mod test {

let _clamp_prim = stage.draw(&Renderlet {
camera,
geometry,
vertices: geometry,
material: clamp_material_id,
..Default::default()
});
Expand All @@ -779,7 +779,7 @@ mod test {

stage.draw(&Renderlet {
camera,
geometry,
vertices: geometry,
material: repeat_material_id,
transform,
..Default::default()
Expand All @@ -793,7 +793,7 @@ mod test {

stage.draw(&Renderlet {
camera,
geometry,
vertices: geometry,
material: mirror_material_id,
transform,
..Default::default()
Expand Down
70 changes: 54 additions & 16 deletions crates/renderling/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,7 @@ mod test {
use crate::{pbr::Material, stage::Vertex};

use glam::{Mat3, Mat4, Quat, Vec2, Vec3, Vec4};
use img_diff::DiffCfg;
use pretty_assertions::assert_eq;

#[test]
Expand Down Expand Up @@ -314,7 +315,7 @@ mod test {
let geometry = stage.append_array(&right_tri_vertices());
let _tri_id = stage.draw(&Renderlet {
camera,
geometry,
vertices: geometry,
..Default::default()
});

Expand Down Expand Up @@ -364,7 +365,7 @@ mod test {
});
let _tri = stage.draw(&Renderlet {
camera,
geometry,
vertices: geometry,
..Default::default()
});

Expand Down Expand Up @@ -393,7 +394,7 @@ mod test {
let transform = stage.append(&Transform::default());
let _tri = stage.draw(&Renderlet {
camera,
geometry,
vertices: geometry,
transform,
..Default::default()
});
Expand Down Expand Up @@ -472,14 +473,51 @@ mod test {
});
let _cube = stage.draw(&Renderlet {
camera,
geometry,
vertices: geometry,
transform,
..Default::default()
});
let img = r.render_image().unwrap();
img_diff::assert_img_eq("cmy_cube/sanity.png", img);
}

#[test]
// Tests our ability to draw a CMYK cube using indexed geometry.
fn cmy_cube_indices() {
let mut r = Renderling::headless(100, 100).with_background_color(Vec4::splat(1.0));
let mut stage = r.new_stage();
stage.configure_graph(&mut r, true);
let camera_position = Vec3::new(0.0, 12.0, 20.0);
let camera = stage.append(&Camera {
projection: Mat4::perspective_rh(std::f32::consts::PI / 4.0, 1.0, 0.1, 100.0),
view: Mat4::look_at_rh(camera_position, Vec3::ZERO, Vec3::Y),
position: camera_position,
});
let vertices = stage.append_array(&math::UNIT_POINTS.map(cmy_gpu_vertex));
let indices = stage.append_array(&math::UNIT_INDICES.map(|i| i as u32));
let transform = stage.append(&Transform {
scale: Vec3::new(6.0, 6.0, 6.0),
rotation: Quat::from_axis_angle(Vec3::Y, -std::f32::consts::FRAC_PI_4),
..Default::default()
});
let _cube = stage.draw(&Renderlet {
camera,
vertices,
indices,
transform,
..Default::default()
});
let img = r.render_image().unwrap();
img_diff::assert_img_eq_cfg(
"cmy_cube/sanity.png",
img,
DiffCfg {
test_name: Some("cmy_cube/indices"),
..Default::default()
},
);
}

#[test]
// Test our ability to create two cubes and toggle the visibility of one of
// them.
Expand All @@ -495,7 +533,7 @@ mod test {
});
let geometry = stage.append_array(&gpu_cube_vertices());
let mut renderlet = Renderlet {
geometry,
vertices: geometry,
camera,
transform: stage.append(&Transform {
translation: Vec3::new(-4.5, 0.0, 0.0),
Expand Down Expand Up @@ -559,7 +597,7 @@ mod test {

let cube_id = stage.draw(&Renderlet {
camera,
geometry: cube_geometry,
vertices: cube_geometry,
transform,
..Default::default()
});
Expand All @@ -568,9 +606,9 @@ mod test {
let img = r.render_image().unwrap();
img_diff::assert_img_eq("cmy_cube/remesh_before.png", img);

// Update the cube mesh to a pyramid by overwriting the `.geometry` field
// Update the cube mesh to a pyramid by overwriting the `.vertices` field
// of `Renderlet`
stage.write(cube_id + Renderlet::offset_of_geometry(), &pyramid_geometry);
stage.write(cube_id + Renderlet::offset_of_vertices(), &pyramid_geometry);

// we should see a pyramid (in sRGB color space)
let img = r.render_image().unwrap();
Expand Down Expand Up @@ -650,7 +688,7 @@ mod test {
});
let cube = stage.draw(&Renderlet {
camera,
geometry,
vertices: geometry,
material,
transform,
..Default::default()
Expand Down Expand Up @@ -718,7 +756,7 @@ mod test {
let _color_prim = {
stage.draw(&Renderlet {
camera,
geometry,
vertices: geometry,
..Default::default()
})
};
Expand All @@ -730,7 +768,7 @@ mod test {
});
stage.draw(&Renderlet {
camera,
geometry,
vertices: geometry,
transform,
material: cheetah_material,
..Default::default()
Expand Down Expand Up @@ -798,7 +836,7 @@ mod test {
);
let _cube = stage.draw(&Renderlet {
camera,
geometry,
vertices: geometry,
material,
..Default::default()
});
Expand Down Expand Up @@ -895,21 +933,21 @@ mod test {
let red_mat4 = yellow_mat4 * offset_mat4;
let red_transform = stage.append(&red_mat4.into());
let _cyan_primitive = stage.draw(&Renderlet {
geometry,
vertices: geometry,
camera,
material: cyan_material,
transform: cyan_transform,
..Default::default()
});
let _yellow_primitive = stage.draw(&Renderlet {
geometry,
vertices: geometry,
camera,
material: yellow_material,
transform: yellow_transform,
..Default::default()
});
let _red_primitive = stage.draw(&Renderlet {
geometry,
vertices: geometry,
camera,
material: red_material,
transform: red_transform,
Expand Down Expand Up @@ -1002,7 +1040,7 @@ mod test {
});
let _sphere = stage.draw(&Renderlet {
camera,
geometry,
vertices: geometry,
transform,
material,
..Default::default()
Expand Down
Binary file modified crates/renderling/src/linkage/stage-renderlet_fragment.spv
Binary file not shown.
Binary file modified crates/renderling/src/linkage/stage-renderlet_vertex.spv
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
13 changes: 10 additions & 3 deletions crates/renderling/src/stage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,8 @@ impl Vertex {
#[derive(Clone, Copy, SlabItem)]
pub struct Renderlet {
pub visible: bool,
pub geometry: Array<Vertex>,
pub vertices: Array<Vertex>,
pub indices: Array<u32>,
pub camera: Id<Camera>,
pub transform: Id<Transform>,
pub material: Id<Material>,
Expand All @@ -190,7 +191,8 @@ impl Default for Renderlet {
fn default() -> Self {
Renderlet {
visible: true,
geometry: Array::default(),
vertices: Array::default(),
indices: Array::default(),
camera: Id::NONE,
transform: Id::NONE,
material: Id::NONE,
Expand Down Expand Up @@ -259,7 +261,12 @@ pub fn renderlet_vertex(
*out_material = renderlet.material;
*out_pbr_config = renderlet.pbr_config;

let vertex_id = renderlet.geometry.at(vertex_index as usize);
let index = if renderlet.indices.is_null() {
vertex_index as usize
} else {
slab.read(renderlet.indices.at(vertex_index as usize)) as usize
};
let vertex_id = renderlet.vertices.at(index as usize);
let vertex = slab.read_unchecked(vertex_id);
*out_color = vertex.color;
*out_uv0 = vertex.uv0;
Expand Down
14 changes: 9 additions & 5 deletions crates/renderling/src/stage/cpu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,7 @@ impl Stage {

// Ensure we have space to write GPU debugging info to our vertex debug buffer
{
let vertex_debug_data = vec![RenderletVertexLog::default(); renderlet.geometry.len()];
let vertex_debug_data = vec![RenderletVertexLog::default(); renderlet.vertices.len()];
// UNWRAP: if we can't read we want to panic.
let mut debug = self.vertex_debug.write().unwrap();
debug.append_array(&vertex_debug_data);
Expand Down Expand Up @@ -673,7 +673,7 @@ impl Stage {
let draws = self.get_draws();
let len = draws
.into_iter()
.map(|(_, r)| r.geometry.len())
.map(|(_, r)| r.vertices.len())
.sum::<usize>();
let array = Array::<RenderletVertexLog>::new(0, len as u32);
let logs = self.vertex_debug.read().unwrap().as_ref().read_vec(array);
Expand All @@ -689,7 +689,7 @@ impl Stage {
StageDrawStrategy::Direct(units) => {
let len = units
.iter()
.map(|(_, renderlet)| renderlet.geometry.len())
.map(|(_, renderlet)| renderlet.vertices.len())
.sum::<usize>();
len
}
Expand Down Expand Up @@ -801,7 +801,11 @@ pub fn stage_render(
StageDrawStrategy::Direct(units) => {
for (id, rlet) in units {
if rlet.visible {
let vertex_range = 0..rlet.geometry.len() as u32;
let vertex_range = if rlet.indices.is_null() {
0..rlet.vertices.len() as u32
} else {
0..rlet.indices.len() as u32
};
let instance_range = id.inner()..id.inner() + 1;
log::trace!(
"drawing vertices {vertex_range:?} and instances {instance_range:?}"
Expand Down Expand Up @@ -867,7 +871,7 @@ mod test {
let geometry = stage.append_array(&crate::test::right_tri_vertices());
let mut renderlet = Renderlet {
camera,
geometry,
vertices: geometry,
..Default::default()
};
let tri_id = stage.draw_debug(&mut renderlet);
Expand Down
6 changes: 3 additions & 3 deletions crates/renderling/src/tutorial.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ pub fn tutorial_slabbed_renderlet(
#[spirv(position)] clip_pos: &mut Vec4,
) {
let renderlet = slab.read_unchecked(renderlet_id);
let vertex_id = renderlet.geometry.at(vertex_index as usize);
let vertex_id = renderlet.vertices.at(vertex_index as usize);
let vertex = slab.read(vertex_id);
*out_color = vertex.color;

Expand Down Expand Up @@ -647,7 +647,7 @@ mod test {
let renderlet = Renderlet {
camera,
transform,
geometry,
vertices: geometry,
..Default::default()
};
let unit_id = slab.append(&renderlet);
Expand Down Expand Up @@ -736,7 +736,7 @@ mod test {
pipeline,
bindgroup,
unit_id,
unit_vertex_count: renderlet.geometry.len() as u32,
unit_vertex_count: renderlet.vertices.len() as u32,
};
r.graph.add_resource(app);

Expand Down
2 changes: 1 addition & 1 deletion crates/sandbox/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ fn can_read_shader_debug_logs(window: Arc<winit::window::Window>) -> Renderling
]);
let mut renderlet = Renderlet {
camera,
geometry,
vertices: geometry,
..Default::default()
};
let _tri_id = stage.draw_debug(&mut renderlet);
Expand Down

0 comments on commit 5f5f132

Please sign in to comment.