BasicModifier

Struct BasicModifier 

Source
pub struct BasicModifier<G: GaussianPod, S = NoSelection> {
    pub transform_flags_buffer: TransformFlagsBuffer,
    pub basic_color_modifiers_buffer: BasicColorModifiersBuffer,
    pub rot_scale_buffer: RotScaleBuffer,
    pub modifier: BasicModifierBundle<G, S>,
}
Expand description

A struct to handle basic modifier.

This modifier holds a BasicModifierBundle along with necessary buffers, and applies the basic modifier.

Fields§

§transform_flags_buffer: TransformFlagsBuffer§basic_color_modifiers_buffer: BasicColorModifiersBuffer§rot_scale_buffer: RotScaleBuffer§modifier: BasicModifierBundle<G, S>

Implementations§

Source§

impl<G: GaussianPod> BasicModifier<G>

Source

pub fn new( device: &Device, gaussians_buffer: &GaussiansBuffer<G>, model_transform_buffer: &ModelTransformBuffer, gaussian_transform_buffer: &GaussianTransformBuffer, ) -> Self

Create a new basic modifier.

Examples found in repository?
examples/modify.rs (lines 104-109)
68async fn main() {
69    env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
70
71    let args = Args::parse();
72    let model_path = &args.model;
73
74    log::debug!("Creating wgpu instance");
75    let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default());
76
77    log::debug!("Requesting adapter");
78    let adapter = instance
79        .request_adapter(&wgpu::RequestAdapterOptions::default())
80        .await
81        .expect("adapter");
82
83    log::debug!("Requesting device");
84    let (device, queue) = adapter
85        .request_device(&wgpu::DeviceDescriptor {
86            label: Some("Device"),
87            required_features: wgpu::Features::empty(),
88            required_limits: adapter.limits(),
89            memory_hints: wgpu::MemoryHints::default(),
90            trace: wgpu::Trace::Off,
91        })
92        .await
93        .expect("device");
94
95    log::debug!("Creating gaussians");
96    let f = std::fs::File::open(model_path).expect("ply file");
97    let mut reader = std::io::BufReader::new(f);
98    let gaussians = gs::core::Gaussians::read_ply(&mut reader).expect("gaussians");
99
100    log::debug!("Creating editor");
101    let editor = gs::Editor::<GaussianPod>::new(&device, &gaussians);
102
103    log::debug!("Creating basic modifier");
104    let basic_modifier = gs::BasicModifier::<GaussianPod>::new(
105        &device,
106        &editor.gaussians_buffer,
107        &editor.model_transform_buffer,
108        &editor.gaussian_transform_buffer,
109    );
110
111    log::debug!("Configuring modifiers");
112    match args.override_rgb {
113        true => basic_modifier
114            .basic_color_modifiers_buffer
115            .update_with_override_rgb(
116                &queue,
117                Vec3::from_slice(&args.rgb_or_hsv),
118                args.alpha,
119                args.contrast,
120                args.exposure,
121                args.gamma,
122            ),
123        false => basic_modifier
124            .basic_color_modifiers_buffer
125            .update_with_hsv_modifiers(
126                &queue,
127                Vec3::from_slice(&args.rgb_or_hsv),
128                args.alpha,
129                args.contrast,
130                args.exposure,
131                args.gamma,
132            ),
133    }
134
135    log::info!("Starting editing process");
136    let time = std::time::Instant::now();
137
138    log::debug!("Editing Gaussians");
139    let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
140        label: Some("Edit Encoder"),
141    });
142
143    editor.apply(
144        &device,
145        &mut encoder,
146        [&basic_modifier as &dyn gs::Modifier<GaussianPod>],
147    );
148
149    queue.submit(Some(encoder.finish()));
150
151    #[allow(unused_must_use)]
152    device.poll(wgpu::PollType::Wait);
153
154    log::info!("Editing process completed in {:?}", time.elapsed());
155
156    log::debug!("Downloading Gaussians");
157    let modified_gaussians = gs::core::Gaussians {
158        gaussians: editor
159            .gaussians_buffer
160            .download_gaussians(&device, &queue)
161            .await
162            .expect("gaussians download"),
163    };
164
165    log::debug!("Writing modified Gaussians to output file");
166    let output_file = std::fs::File::create(&args.output).expect("output file");
167    let mut writer = std::io::BufWriter::new(output_file);
168    modified_gaussians
169        .write_ply(&mut writer)
170        .expect("write modified Gaussians to output file");
171
172    log::info!("Modified Gaussians written to {}", args.output);
173}
Source§

impl<G: GaussianPod> BasicModifier<G, WithSelection>

Source

pub fn new_with_selection( device: &Device, gaussians_buffer: &GaussiansBuffer<G>, model_transform_buffer: &ModelTransformBuffer, gaussian_transform_buffer: &GaussianTransformBuffer, selection_buffer: &SelectionBuffer, ) -> Self

Create a new basic modifier with selection.

Trait Implementations§

Source§

impl<G: Debug + GaussianPod, S: Debug> Debug for BasicModifier<G, S>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<G: GaussianPod, S> Modifier<G> for BasicModifier<G, S>

Source§

fn apply( &self, _device: &Device, encoder: &mut CommandEncoder, gaussians: &GaussiansBuffer<G>, _model_transform: &ModelTransformBuffer, _gaussian_transform: &GaussianTransformBuffer, )

Apply the modifier to the Gaussians.

Auto Trait Implementations§

§

impl<G, S> Freeze for BasicModifier<G, S>

§

impl<G, S = NoSelection> !RefUnwindSafe for BasicModifier<G, S>

§

impl<G, S> Send for BasicModifier<G, S>
where S: Send,

§

impl<G, S> Sync for BasicModifier<G, S>
where S: Sync,

§

impl<G, S> Unpin for BasicModifier<G, S>
where G: Unpin, S: Unpin,

§

impl<G, S = NoSelection> !UnwindSafe for BasicModifier<G, S>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> Upcast<T> for T

Source§

fn upcast(&self) -> Option<&T>

Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,