Skip to content

Commit

Permalink
More work on rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
mattkleiny committed Jan 30, 2024
1 parent e04d92e commit 0a2f56c
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 31 deletions.
34 changes: 34 additions & 0 deletions modules/graphics/src/materials.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,40 @@ impl Material {
&self.shader
}

/// Gets the flags of the material.
pub fn flags(&self) -> MaterialFlags {
let mut flags = MaterialFlags::empty();

let shader = &self.shader;
let metadata = shader.flags();

if self.blend_state() != BlendState::Disabled {
flags.insert(MaterialFlags::ALPHA_BLENDING);
}

if self.culling_mode() != CullingMode::Disabled {
flags.insert(MaterialFlags::BACKFACE_CULLING);
}

if self.scissor_mode() != ScissorMode::Disabled {
flags.insert(MaterialFlags::SCISSOR_TESTING);
}

if metadata.contains(ShaderFlags::ALPHA_TESTING) {
flags.insert(MaterialFlags::ALPHA_TESTING);
}

if metadata.contains(ShaderFlags::DEPTH_TESTING) {
flags.insert(MaterialFlags::DEPTH_TESTING);
}

if metadata.contains(ShaderFlags::DEPTH_WRITING) {
flags.insert(MaterialFlags::DEPTH_WRITING);
}

flags
}

/// Gets the underlying [`ShaderUniformSet`] of the material.
pub fn uniforms(&self) -> &ShaderUniformSet {
&self.uniforms
Expand Down
40 changes: 11 additions & 29 deletions modules/graphics/src/rendering/culling.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,10 @@ bitflags! {

impl<'a> VisibleObjectSet<'a> {
/// Groups the objects by material sorting key.
pub fn group_by_material(&self) -> impl Iterator<Item = (&'a Material, &[VisibleObject<'a>])> {
pub fn group_by_material(
&self,
required_flags: MaterialFlags,
) -> impl Iterator<Item = (&'a Material, &[VisibleObject<'a>])> {
self
.objects
.chunk_by(|a, b| {
Expand All @@ -63,7 +66,12 @@ impl<'a> VisibleObjectSet<'a> {

a == b
})
.map(|chunk| (chunk[0].material, chunk))
.filter(move |it| {
let flags = it[0].material.flags();

flags.contains(required_flags)
})
.map(|it| (it[0].material, it))
}
}

Expand All @@ -75,34 +83,8 @@ impl MaterialSortingKey {
/// pipeline, and the last 32 bits represent the ID of the shader that should
/// be used to render the material.
pub fn for_material(material: &Material) -> Self {
let mut flags = MaterialFlags::empty();

let shader = material.shader();
let metadata = shader.flags();

if material.blend_state() != BlendState::Disabled {
flags.insert(MaterialFlags::ALPHA_BLENDING);
}

if material.culling_mode() != CullingMode::Disabled {
flags.insert(MaterialFlags::BACKFACE_CULLING);
}

if material.scissor_mode() != ScissorMode::Disabled {
flags.insert(MaterialFlags::SCISSOR_TESTING);
}

if metadata.contains(ShaderFlags::ALPHA_TESTING) {
flags.insert(MaterialFlags::ALPHA_TESTING);
}

if metadata.contains(ShaderFlags::DEPTH_TESTING) {
flags.insert(MaterialFlags::DEPTH_TESTING);
}

if metadata.contains(ShaderFlags::DEPTH_WRITING) {
flags.insert(MaterialFlags::DEPTH_WRITING);
}
let flags = material.flags();

let flags = u64::from(flags.bits());
let shader = u64::from(shader.id());
Expand Down
6 changes: 4 additions & 2 deletions modules/graphics/src/rendering/pipelines.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@ pub struct RenderFrame<'a> {
impl<'a> RenderFrame<'a> {
/// Draws the object visible to the given camera.
pub fn draw_camera(&mut self, scene: &dyn RenderScene, camera: &dyn Camera) {
let visible_object_set = scene.cull_visible_objects(camera);
// find all objects visible to the camera
let visible_objects = scene.cull_visible_objects(camera);

for (material, group) in visible_object_set.group_by_material() {
// render each object, minimizing state changes by material
for (material, group) in visible_objects.group_by_material(MaterialFlags::all()) {
self.queue.set_material(material);

for entry in group {
Expand Down

0 comments on commit 0a2f56c

Please sign in to comment.