use crate::{
core::{self, ComputeBundle, ComputeBundleBuilder, GaussianPod},
editor::SelectionBundle,
shader,
};
pub const VIEWPORT_BIND_GROUP_LAYOUT_DESCRIPTOR: wgpu::BindGroupLayoutDescriptor<'static> =
wgpu::BindGroupLayoutDescriptor {
label: Some("Viewport Selection Bind Group Layout"),
entries: &[
wgpu::BindGroupLayoutEntry {
binding: 0,
visibility: wgpu::ShaderStages::COMPUTE,
ty: wgpu::BindingType::Buffer {
ty: wgpu::BufferBindingType::Uniform,
has_dynamic_offset: false,
min_binding_size: None,
},
count: None,
},
wgpu::BindGroupLayoutEntry {
binding: 1,
visibility: wgpu::ShaderStages::COMPUTE,
ty: wgpu::BindingType::Texture {
sample_type: wgpu::TextureSampleType::Float { filterable: false },
view_dimension: wgpu::TextureViewDimension::D2,
multisampled: false,
},
count: None,
},
],
};
pub fn create_viewport_bundle<G: GaussianPod>(device: &wgpu::Device) -> ComputeBundle<()> {
let mut resolver = wesl::PkgResolver::new();
resolver.add_package(&core::shader::PACKAGE);
resolver.add_package(&shader::PACKAGE);
ComputeBundleBuilder::new()
.label("Viewport Selection")
.bind_group_layouts([
&SelectionBundle::<G>::GAUSSIANS_BIND_GROUP_LAYOUT_DESCRIPTOR,
&VIEWPORT_BIND_GROUP_LAYOUT_DESCRIPTOR,
])
.main_shader(
"wgpu_3dgs_viewer::selection::viewport"
.parse()
.expect("selection::viewport module path"),
)
.entry_point("main")
.wesl_compile_options(wesl::CompileOptions {
features: G::wesl_features(),
..Default::default()
})
.resolver(resolver)
.build_without_bind_groups(device)
.expect("viewport selection compute bundle")
}