BasicColorModifiersBuffer

Struct BasicColorModifiersBuffer 

Source
pub struct BasicColorModifiersBuffer(/* private fields */);
Expand description

The basic color modifiers buffer for the BasicModifierBundle.

This buffer holds the data for basic color modifications, including RGB override or HSV modifications, alpha, contrast, exposure, and gamma adjustments.

Implementations§

Source§

impl BasicColorModifiersBuffer

Source

pub fn new(device: &Device) -> Self

Create a new basic color modifiers buffer.

Source

pub fn update_with_override_rgb( &self, queue: &Queue, rgb: Vec3, alpha: f32, contrast: f32, exposure: f32, gamma: f32, )

Update the basic color modifiers with override RGB color.

Examples found in repository?
examples/modify.rs (lines 115-122)
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}
More examples
Hide additional examples
examples/modify_selection.rs (lines 186-193)
125async fn main() {
126    env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
127
128    let args = Args::parse();
129    let model_path = &args.model;
130    let pos = Vec3::from_slice(&args.pos);
131    let rot = Quat::from_slice(&args.rot);
132    let scale = Vec3::from_slice(&args.scale);
133    let shape = match args.shape {
134        Shape::Sphere => gs::SelectionBundle::<GaussianPod>::create_sphere_bundle,
135        Shape::Box => gs::SelectionBundle::<GaussianPod>::create_box_bundle,
136    };
137    let repeat = args.repeat;
138    let offset = Vec3::from_slice(&args.offset);
139
140    log::debug!("Creating wgpu instance");
141    let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default());
142
143    log::debug!("Requesting adapter");
144    let adapter = instance
145        .request_adapter(&wgpu::RequestAdapterOptions::default())
146        .await
147        .expect("adapter");
148
149    log::debug!("Requesting device");
150    let (device, queue) = adapter
151        .request_device(&wgpu::DeviceDescriptor {
152            label: Some("Device"),
153            required_features: wgpu::Features::empty(),
154            required_limits: adapter.limits(),
155            memory_hints: wgpu::MemoryHints::default(),
156            trace: wgpu::Trace::Off,
157        })
158        .await
159        .expect("device");
160
161    log::debug!("Creating gaussians");
162    let f = std::fs::File::open(model_path).expect("ply file");
163    let mut reader = std::io::BufReader::new(f);
164    let gaussians = gs::core::Gaussians::read_ply(&mut reader).expect("gaussians");
165
166    log::debug!("Creating editor");
167    let editor = gs::Editor::<GaussianPod>::new(&device, &gaussians);
168
169    log::debug!("Creating shape selection compute bundle");
170    let shape_selection = shape(&device);
171
172    log::debug!("Creating basic selection modifier");
173    let mut basic_selection_modifier = gs::SelectionModifier::new_with_basic_modifier(
174        &device,
175        &editor.gaussians_buffer,
176        &editor.model_transform_buffer,
177        &editor.gaussian_transform_buffer,
178        vec![shape_selection],
179    );
180
181    log::debug!("Configuring modifiers");
182    match args.override_rgb {
183        true => basic_selection_modifier
184            .modifier
185            .basic_color_modifiers_buffer
186            .update_with_override_rgb(
187                &queue,
188                Vec3::from_slice(&args.rgb_or_hsv),
189                args.alpha,
190                args.contrast,
191                args.exposure,
192                args.gamma,
193            ),
194        false => basic_selection_modifier
195            .modifier
196            .basic_color_modifiers_buffer
197            .update_with_hsv_modifiers(
198                &queue,
199                Vec3::from_slice(&args.rgb_or_hsv),
200                args.alpha,
201                args.contrast,
202                args.exposure,
203                args.gamma,
204            ),
205    }
206
207    log::debug!("Creating shape selection buffers");
208    let shape_selection_buffers = (0..repeat)
209        .map(|i| {
210            let offset_pos = pos + offset * i as f32;
211            let buffer = gs::InvTransformBuffer::new(&device);
212            buffer.update_with_scale_rot_pos(&queue, scale, rot, offset_pos);
213            buffer
214        })
215        .collect::<Vec<_>>();
216
217    log::debug!("Creating shape selection bind groups");
218    let shape_selection_bind_groups = shape_selection_buffers
219        .iter()
220        .map(|buffer| {
221            basic_selection_modifier.selection.bundles[0]
222                .create_bind_group(
223                    &device,
224                    // index 0 is the Gaussians buffer, so we use 1,
225                    // see docs of create_sphere_bundle or create_box_bundle
226                    1,
227                    [buffer.buffer().as_entire_binding()],
228                )
229                .expect("bind group")
230        })
231        .collect::<Vec<_>>();
232
233    log::debug!("Creating selection expression");
234    basic_selection_modifier.selection_expr = shape_selection_bind_groups.into_iter().fold(
235        gs::SelectionExpr::Identity,
236        |acc, bind_group| {
237            acc.union(gs::SelectionExpr::selection(
238                0, // the 0 here is the bundle index in the selection bundle
239                vec![bind_group],
240            ))
241        },
242    );
243
244    log::info!("Starting editing process");
245    let time = std::time::Instant::now();
246
247    log::debug!("Editing Gaussians");
248    let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
249        label: Some("Edit Encoder"),
250    });
251
252    editor.apply(
253        &device,
254        &mut encoder,
255        [&basic_selection_modifier as &dyn gs::Modifier<GaussianPod>],
256    );
257
258    queue.submit(Some(encoder.finish()));
259
260    #[allow(unused_must_use)]
261    device.poll(wgpu::PollType::Wait);
262
263    log::info!("Editing process completed in {:?}", time.elapsed());
264
265    log::debug!("Downloading Gaussians");
266    let modified_gaussians = gs::core::Gaussians {
267        gaussians: editor
268            .gaussians_buffer
269            .download_gaussians(&device, &queue)
270            .await
271            .expect("gaussians download"),
272    };
273
274    log::debug!("Writing modified Gaussians to output file");
275    let output_file = std::fs::File::create(&args.output).expect("output file");
276    let mut writer = std::io::BufWriter::new(output_file);
277    modified_gaussians
278        .write_ply(&mut writer)
279        .expect("write modified Gaussians to output file");
280
281    log::info!("Modified Gaussians written to {}", args.output);
282}
Source

pub fn update_with_hsv_modifiers( &self, queue: &Queue, hsv: Vec3, alpha: f32, contrast: f32, exposure: f32, gamma: f32, )

Update the basic color modifiers buffer with HSV modifications.

Examples found in repository?
examples/modify.rs (lines 125-132)
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}
More examples
Hide additional examples
examples/modify_selection.rs (lines 197-204)
125async fn main() {
126    env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
127
128    let args = Args::parse();
129    let model_path = &args.model;
130    let pos = Vec3::from_slice(&args.pos);
131    let rot = Quat::from_slice(&args.rot);
132    let scale = Vec3::from_slice(&args.scale);
133    let shape = match args.shape {
134        Shape::Sphere => gs::SelectionBundle::<GaussianPod>::create_sphere_bundle,
135        Shape::Box => gs::SelectionBundle::<GaussianPod>::create_box_bundle,
136    };
137    let repeat = args.repeat;
138    let offset = Vec3::from_slice(&args.offset);
139
140    log::debug!("Creating wgpu instance");
141    let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default());
142
143    log::debug!("Requesting adapter");
144    let adapter = instance
145        .request_adapter(&wgpu::RequestAdapterOptions::default())
146        .await
147        .expect("adapter");
148
149    log::debug!("Requesting device");
150    let (device, queue) = adapter
151        .request_device(&wgpu::DeviceDescriptor {
152            label: Some("Device"),
153            required_features: wgpu::Features::empty(),
154            required_limits: adapter.limits(),
155            memory_hints: wgpu::MemoryHints::default(),
156            trace: wgpu::Trace::Off,
157        })
158        .await
159        .expect("device");
160
161    log::debug!("Creating gaussians");
162    let f = std::fs::File::open(model_path).expect("ply file");
163    let mut reader = std::io::BufReader::new(f);
164    let gaussians = gs::core::Gaussians::read_ply(&mut reader).expect("gaussians");
165
166    log::debug!("Creating editor");
167    let editor = gs::Editor::<GaussianPod>::new(&device, &gaussians);
168
169    log::debug!("Creating shape selection compute bundle");
170    let shape_selection = shape(&device);
171
172    log::debug!("Creating basic selection modifier");
173    let mut basic_selection_modifier = gs::SelectionModifier::new_with_basic_modifier(
174        &device,
175        &editor.gaussians_buffer,
176        &editor.model_transform_buffer,
177        &editor.gaussian_transform_buffer,
178        vec![shape_selection],
179    );
180
181    log::debug!("Configuring modifiers");
182    match args.override_rgb {
183        true => basic_selection_modifier
184            .modifier
185            .basic_color_modifiers_buffer
186            .update_with_override_rgb(
187                &queue,
188                Vec3::from_slice(&args.rgb_or_hsv),
189                args.alpha,
190                args.contrast,
191                args.exposure,
192                args.gamma,
193            ),
194        false => basic_selection_modifier
195            .modifier
196            .basic_color_modifiers_buffer
197            .update_with_hsv_modifiers(
198                &queue,
199                Vec3::from_slice(&args.rgb_or_hsv),
200                args.alpha,
201                args.contrast,
202                args.exposure,
203                args.gamma,
204            ),
205    }
206
207    log::debug!("Creating shape selection buffers");
208    let shape_selection_buffers = (0..repeat)
209        .map(|i| {
210            let offset_pos = pos + offset * i as f32;
211            let buffer = gs::InvTransformBuffer::new(&device);
212            buffer.update_with_scale_rot_pos(&queue, scale, rot, offset_pos);
213            buffer
214        })
215        .collect::<Vec<_>>();
216
217    log::debug!("Creating shape selection bind groups");
218    let shape_selection_bind_groups = shape_selection_buffers
219        .iter()
220        .map(|buffer| {
221            basic_selection_modifier.selection.bundles[0]
222                .create_bind_group(
223                    &device,
224                    // index 0 is the Gaussians buffer, so we use 1,
225                    // see docs of create_sphere_bundle or create_box_bundle
226                    1,
227                    [buffer.buffer().as_entire_binding()],
228                )
229                .expect("bind group")
230        })
231        .collect::<Vec<_>>();
232
233    log::debug!("Creating selection expression");
234    basic_selection_modifier.selection_expr = shape_selection_bind_groups.into_iter().fold(
235        gs::SelectionExpr::Identity,
236        |acc, bind_group| {
237            acc.union(gs::SelectionExpr::selection(
238                0, // the 0 here is the bundle index in the selection bundle
239                vec![bind_group],
240            ))
241        },
242    );
243
244    log::info!("Starting editing process");
245    let time = std::time::Instant::now();
246
247    log::debug!("Editing Gaussians");
248    let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
249        label: Some("Edit Encoder"),
250    });
251
252    editor.apply(
253        &device,
254        &mut encoder,
255        [&basic_selection_modifier as &dyn gs::Modifier<GaussianPod>],
256    );
257
258    queue.submit(Some(encoder.finish()));
259
260    #[allow(unused_must_use)]
261    device.poll(wgpu::PollType::Wait);
262
263    log::info!("Editing process completed in {:?}", time.elapsed());
264
265    log::debug!("Downloading Gaussians");
266    let modified_gaussians = gs::core::Gaussians {
267        gaussians: editor
268            .gaussians_buffer
269            .download_gaussians(&device, &queue)
270            .await
271            .expect("gaussians download"),
272    };
273
274    log::debug!("Writing modified Gaussians to output file");
275    let output_file = std::fs::File::create(&args.output).expect("output file");
276    let mut writer = std::io::BufWriter::new(output_file);
277    modified_gaussians
278        .write_ply(&mut writer)
279        .expect("write modified Gaussians to output file");
280
281    log::info!("Modified Gaussians written to {}", args.output);
282}
Source

pub fn update_with_pod(&self, queue: &Queue, pod: &BasicColorModifiersPod)

Update the basic color modifiers buffer with BasicColorModifiersPod.

Trait Implementations§

Source§

impl BufferWrapper for BasicColorModifiersBuffer

Source§

fn buffer(&self) -> &Buffer

Returns a reference to the buffer data.
Source§

const DEFAULT_USAGES: BufferUsages = _

The default usages.
Source§

impl Debug for BasicColorModifiersBuffer

Source§

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

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

impl FixedSizeBufferWrapper for BasicColorModifiersBuffer

Source§

type Pod = BasicColorModifiersPod

The POD element type that defines the layout/size.
Source§

fn pod_size() -> u64

Returns the size in bytes of the POD element.
Source§

fn verify_buffer_size( buffer: &Buffer, ) -> Result<(), FixedSizeBufferWrapperError>

Check if the given buffer matches the expected size. Read more
Source§

impl From<BasicColorModifiersBuffer> for Buffer

Source§

fn from(wrapper: BasicColorModifiersBuffer) -> Self

Converts to this type from the input type.
Source§

impl TryFrom<Buffer> for BasicColorModifiersBuffer

Source§

type Error = FixedSizeBufferWrapperError

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

fn try_from(buffer: Buffer) -> Result<Self, Self::Error>

Performs the conversion.

Auto Trait Implementations§

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> DownloadableBufferWrapper for T
where T: BufferWrapper + Send + Sync,

Source§

fn download<T>( &self, device: &Device, queue: &Queue, ) -> impl Future<Output = Result<Vec<T>, DownloadBufferError>> + Send

Download the buffer data.
Source§

fn prepare_download( &self, device: &Device, encoder: &mut CommandEncoder, ) -> Buffer

Prepare for downloading the buffer data. Read more
Source§

fn map_download<T>( download: &Buffer, device: &Device, ) -> impl Future<Output = Result<Vec<T>, DownloadBufferError>> + Send

Map the download buffer to read the buffer data. Read more
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,