mirror of
https://github.com/lisk77/comet.git
synced 2025-12-12 17:18:50 +00:00
125 lines
3.4 KiB
Rust
125 lines
3.4 KiB
Rust
use crate::render_context::RenderContext;
|
|
|
|
pub struct RenderPass {
|
|
pub label: String,
|
|
pub execute: Box<
|
|
dyn Fn(String, &mut RenderContext, &mut wgpu::CommandEncoder, &wgpu::TextureView)
|
|
+ Send
|
|
+ Sync,
|
|
>,
|
|
}
|
|
|
|
impl RenderPass {
|
|
pub fn new(
|
|
label: String,
|
|
execute: Box<
|
|
dyn Fn(String, &mut RenderContext, &mut wgpu::CommandEncoder, &wgpu::TextureView)
|
|
+ Send
|
|
+ Sync,
|
|
>,
|
|
) -> Self {
|
|
Self { label, execute }
|
|
}
|
|
}
|
|
|
|
pub fn universal_clear_execute(
|
|
label: String,
|
|
ctx: &mut RenderContext,
|
|
encoder: &mut wgpu::CommandEncoder,
|
|
view: &wgpu::TextureView,
|
|
) {
|
|
let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
|
|
label: Some(format!("{} Render Pass", label.clone()).as_str()),
|
|
color_attachments: &[Some(wgpu::RenderPassColorAttachment {
|
|
view: &view,
|
|
resolve_target: None,
|
|
ops: wgpu::Operations {
|
|
load: wgpu::LoadOp::Clear(ctx.clear_color()),
|
|
store: wgpu::StoreOp::Store,
|
|
},
|
|
})],
|
|
depth_stencil_attachment: None,
|
|
occlusion_query_set: None,
|
|
timestamp_writes: None,
|
|
});
|
|
|
|
render_pass.set_pipeline(&ctx.get_pipeline(label.clone()).unwrap());
|
|
|
|
let groups = ctx.resources().get_bind_groups(&label).unwrap();
|
|
for i in 0..groups.len() {
|
|
render_pass.set_bind_group(i as u32, groups.get(i).unwrap(), &[]);
|
|
}
|
|
|
|
render_pass.set_vertex_buffer(
|
|
0,
|
|
ctx.get_batch(label.clone())
|
|
.unwrap()
|
|
.vertex_buffer()
|
|
.slice(..),
|
|
);
|
|
|
|
render_pass.set_index_buffer(
|
|
ctx.get_batch(label.clone())
|
|
.unwrap()
|
|
.index_buffer()
|
|
.slice(..),
|
|
wgpu::IndexFormat::Uint16,
|
|
);
|
|
|
|
render_pass.draw_indexed(
|
|
0..ctx.get_batch(label.clone()).unwrap().num_indices(),
|
|
0,
|
|
0..1,
|
|
);
|
|
}
|
|
|
|
pub fn universal_load_execute(
|
|
label: String,
|
|
ctx: &mut RenderContext,
|
|
encoder: &mut wgpu::CommandEncoder,
|
|
view: &wgpu::TextureView,
|
|
) {
|
|
let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
|
|
label: Some(format!("{} Render Pass", label.clone()).as_str()),
|
|
color_attachments: &[Some(wgpu::RenderPassColorAttachment {
|
|
view: &view,
|
|
resolve_target: None,
|
|
ops: wgpu::Operations {
|
|
load: wgpu::LoadOp::Load,
|
|
store: wgpu::StoreOp::Store,
|
|
},
|
|
})],
|
|
depth_stencil_attachment: None,
|
|
occlusion_query_set: None,
|
|
timestamp_writes: None,
|
|
});
|
|
|
|
render_pass.set_pipeline(&ctx.get_pipeline(label.clone()).unwrap());
|
|
|
|
let groups = ctx.resources().get_bind_groups(&label).unwrap();
|
|
for i in 0..groups.len() {
|
|
render_pass.set_bind_group(i as u32, groups.get(i).unwrap(), &[]);
|
|
}
|
|
|
|
render_pass.set_vertex_buffer(
|
|
0,
|
|
ctx.get_batch(label.clone())
|
|
.unwrap()
|
|
.vertex_buffer()
|
|
.slice(..),
|
|
);
|
|
|
|
render_pass.set_index_buffer(
|
|
ctx.get_batch(label.clone())
|
|
.unwrap()
|
|
.index_buffer()
|
|
.slice(..),
|
|
wgpu::IndexFormat::Uint16,
|
|
);
|
|
|
|
render_pass.draw_indexed(
|
|
0..ctx.get_batch(label.clone()).unwrap().num_indices(),
|
|
0,
|
|
0..1,
|
|
);
|
|
}
|