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
impl BasicColorModifiersBuffer
Sourcepub fn update_with_override_rgb(
&self,
queue: &Queue,
rgb: Vec3,
alpha: f32,
contrast: f32,
exposure: f32,
gamma: f32,
)
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
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}Sourcepub fn update_with_hsv_modifiers(
&self,
queue: &Queue,
hsv: Vec3,
alpha: f32,
contrast: f32,
exposure: f32,
gamma: f32,
)
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
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}Sourcepub fn update_with_pod(&self, queue: &Queue, pod: &BasicColorModifiersPod)
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
impl BufferWrapper for BasicColorModifiersBuffer
Source§const DEFAULT_USAGES: BufferUsages = _
const DEFAULT_USAGES: BufferUsages = _
The default usages.
Source§impl Debug for BasicColorModifiersBuffer
impl Debug for BasicColorModifiersBuffer
Source§impl FixedSizeBufferWrapper for BasicColorModifiersBuffer
impl FixedSizeBufferWrapper for BasicColorModifiersBuffer
Source§type Pod = BasicColorModifiersPod
type Pod = BasicColorModifiersPod
The POD element type that defines the layout/size.
Source§fn verify_buffer_size(
buffer: &Buffer,
) -> Result<(), FixedSizeBufferWrapperError>
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
impl From<BasicColorModifiersBuffer> for Buffer
Source§fn from(wrapper: BasicColorModifiersBuffer) -> Self
fn from(wrapper: BasicColorModifiersBuffer) -> Self
Converts to this type from the input type.
Auto Trait Implementations§
impl Freeze for BasicColorModifiersBuffer
impl !RefUnwindSafe for BasicColorModifiersBuffer
impl Send for BasicColorModifiersBuffer
impl Sync for BasicColorModifiersBuffer
impl Unpin for BasicColorModifiersBuffer
impl !UnwindSafe for BasicColorModifiersBuffer
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> DownloadableBufferWrapper for T
impl<T> DownloadableBufferWrapper for T
Source§fn download<T>(
&self,
device: &Device,
queue: &Queue,
) -> impl Future<Output = Result<Vec<T>, DownloadBufferError>> + Sendwhere
T: NoUninit + AnyBitPattern,
fn download<T>(
&self,
device: &Device,
queue: &Queue,
) -> impl Future<Output = Result<Vec<T>, DownloadBufferError>> + Sendwhere
T: NoUninit + AnyBitPattern,
Download the buffer data.
Source§fn prepare_download(
&self,
device: &Device,
encoder: &mut CommandEncoder,
) -> Buffer
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>> + Sendwhere
T: NoUninit + AnyBitPattern,
fn map_download<T>(
download: &Buffer,
device: &Device,
) -> impl Future<Output = Result<Vec<T>, DownloadBufferError>> + Sendwhere
T: NoUninit + AnyBitPattern,
Map the download buffer to read the buffer data. Read more
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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