wgpu_3dgs_editor/
lib.rs

1#![doc = include_str!("../README.md")]
2
3mod buffer;
4mod error;
5mod modifier;
6mod non_destructive_modifier;
7mod selection;
8mod selection_modifier;
9pub mod shader;
10
11pub use buffer::*;
12pub use error::*;
13pub use modifier::*;
14pub use non_destructive_modifier::*;
15pub use selection::*;
16pub use selection_modifier::*;
17
18pub use wgpu_3dgs_core as core;
19
20use wgpu_3dgs_core::{
21    BufferWrapper, GaussianPod, GaussianTransformBuffer, GaussiansBuffer, IterGaussian,
22    ModelTransformBuffer,
23};
24
25/// An editor for Gaussians.
26///
27/// This enables the application of a sequence of [`Modifier`]s to the Gaussians by storing
28/// the necessary buffers, including:
29/// - [`ModelTransformBuffer`]
30/// - [`GaussianTransformBuffer`]
31/// - [`GaussiansBuffer`]
32///
33/// If you wish to manage these buffers yourself, you do not need to use this struct.
34///
35/// Note that some [`GaussianPod`] configurations may not be able to be downloaded after
36/// modification, see documentations of [`core::GaussianShConfig`] and [`core::GaussianCov3dConfig`]
37/// for details.
38pub struct Editor<G: GaussianPod> {
39    pub model_transform_buffer: ModelTransformBuffer,
40    pub gaussian_transform_buffer: GaussianTransformBuffer,
41    pub gaussians_buffer: GaussiansBuffer<G>,
42}
43
44impl<G: GaussianPod> Editor<G> {
45    /// Create a new editor.
46    pub fn new(device: &wgpu::Device, gaussians: &impl IterGaussian) -> Self {
47        log::debug!("Creating model transform buffer");
48        let model_transform_buffer = ModelTransformBuffer::new(device);
49
50        log::debug!("Creating gaussian transform buffer");
51        let gaussian_transform_buffer = GaussianTransformBuffer::new(device);
52
53        log::debug!("Creating gaussians buffer");
54        let gaussians_buffer = GaussiansBuffer::new_with_usage(
55            device,
56            gaussians,
57            GaussiansBuffer::<G>::DEFAULT_USAGES | wgpu::BufferUsages::COPY_SRC,
58        );
59
60        log::debug!("Basic editor created");
61
62        Self {
63            model_transform_buffer,
64            gaussian_transform_buffer,
65            gaussians_buffer,
66        }
67    }
68
69    /// Apply the modifiers to the Gaussians.
70    pub fn apply<'a>(
71        &self,
72        device: &wgpu::Device,
73        encoder: &mut wgpu::CommandEncoder,
74        modifiers: impl IntoIterator<Item = &'a dyn Modifier<G>>,
75    ) {
76        for modifier in modifiers.into_iter() {
77            modifier.apply(
78                device,
79                encoder,
80                &self.gaussians_buffer,
81                &self.model_transform_buffer,
82                &self.gaussian_transform_buffer,
83            );
84        }
85    }
86}