pub struct InvTransformBuffer(/* private fields */);Expand description
An inverse transform uniform buffer for selection operations.
This buffer holds the inverse of the combined scale, rotation, and translation transform,
which is used for SelectionBundle::create_sphere_bundle
and SelectionBundle::create_box_bundle, but
can also be used for your custom selection operations.
Implementations§
Source§impl InvTransformBuffer
impl InvTransformBuffer
Sourcepub fn new(device: &Device) -> Self
pub fn new(device: &Device) -> Self
Create a new inverse transform buffer.
Examples found in repository?
examples/filter_selection.rs (line 161)
98async fn main() {
99 env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
100
101 let args = Args::parse();
102 let model_path = &args.model;
103 let pos = Vec3::from_slice(&args.pos);
104 let rot = Quat::from_slice(&args.rot);
105 let scale = Vec3::from_slice(&args.scale);
106 let shape = match args.shape {
107 Shape::Sphere => gs::SelectionBundle::<GaussianPod>::create_sphere_bundle,
108 Shape::Box => gs::SelectionBundle::<GaussianPod>::create_box_bundle,
109 };
110 let repeat = args.repeat;
111 let offset = Vec3::from_slice(&args.offset);
112
113 log::debug!("Creating wgpu instance");
114 let instance =
115 wgpu::Instance::new(wgpu::InstanceDescriptor::new_without_display_handle_from_env());
116
117 log::debug!("Requesting adapter");
118 let adapter = instance
119 .request_adapter(&wgpu::RequestAdapterOptions::default())
120 .await
121 .expect("adapter");
122
123 log::debug!("Requesting device");
124 let (device, queue) = adapter
125 .request_device(&wgpu::DeviceDescriptor {
126 label: Some("Device"),
127 required_limits: adapter.limits(),
128 ..Default::default()
129 })
130 .await
131 .expect("device");
132
133 log::debug!("Creating gaussians");
134 let gaussians = [
135 gs::core::GaussiansSource::Ply,
136 gs::core::GaussiansSource::Spz,
137 ]
138 .into_iter()
139 .find_map(|source| gs::core::Gaussians::read_from_file(model_path, source).ok())
140 .expect("gaussians");
141
142 log::debug!("Creating gaussians buffer");
143 let gaussians_buffer = gs::core::GaussiansBuffer::<GaussianPod>::new(&device, &gaussians);
144
145 log::debug!("Creating model transform buffer");
146 let model_transform = gs::core::ModelTransformBuffer::new(&device);
147
148 log::debug!("Creating Gaussian transform buffer");
149 let gaussian_transform = gs::core::GaussianTransformBuffer::new(&device);
150
151 log::debug!("Creating shape selection compute bundle");
152 let shape_selection = shape(&device);
153
154 log::debug!("Creating selection bundle");
155 let selection_bundle = gs::SelectionBundle::<GaussianPod>::new(&device, vec![shape_selection]);
156
157 log::debug!("Creating shape selection buffers");
158 let shape_selection_buffers = (0..repeat)
159 .map(|i| {
160 let offset_pos = pos + offset * i as f32;
161 let buffer = gs::InvTransformBuffer::new(&device);
162 buffer.update_with_scale_rot_pos(&queue, scale, rot, offset_pos);
163 buffer
164 })
165 .collect::<Vec<_>>();
166
167 log::debug!("Creating shape selection bind groups");
168 let shape_selection_bind_groups = shape_selection_buffers
169 .iter()
170 .map(|buffer| {
171 selection_bundle.bundles[0]
172 .create_bind_group(
173 &device,
174 // index 0 is the Gaussians buffer, so we use 1,
175 // see docs of create_sphere_bundle or create_box_bundle
176 1,
177 [buffer.buffer().as_entire_binding()],
178 )
179 .expect("bind group")
180 })
181 .collect::<Vec<_>>();
182
183 log::debug!("Creating selection expression");
184 let selection_expr = shape_selection_bind_groups.into_iter().fold(
185 gs::SelectionExpr::Identity,
186 |acc, bind_group| {
187 acc.union(gs::SelectionExpr::selection(
188 0, // the 0 here is the bundle index in the selection bundle
189 vec![bind_group],
190 ))
191 },
192 );
193
194 log::debug!("Creating destination buffer");
195 let dest = gs::SelectionBuffer::new(&device, gaussians_buffer.len() as u32);
196
197 log::info!("Starting selection process");
198 let time = std::time::Instant::now();
199
200 log::debug!("Selecting Gaussians");
201 let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
202 label: Some("Selection Encoder"),
203 });
204
205 selection_bundle.evaluate(
206 &device,
207 &mut encoder,
208 &selection_expr,
209 &dest,
210 &model_transform,
211 &gaussian_transform,
212 &gaussians_buffer,
213 );
214
215 queue.submit(Some(encoder.finish()));
216
217 device
218 .poll(wgpu::PollType::wait_indefinitely())
219 .expect("poll");
220
221 log::info!("Editing process completed in {:?}", time.elapsed());
222
223 log::debug!("Filtering Gaussians");
224 let selected_gaussians = dest
225 .download::<u32>(&device, &queue)
226 .await
227 .expect("selected download")
228 .iter()
229 .flat_map(|group| {
230 std::iter::repeat_n(group, 32)
231 .enumerate()
232 .map(|(i, g)| g & (1 << i) != 0)
233 })
234 .zip(gaussians.iter_gaussian())
235 .filter(|(selected, _)| *selected)
236 .map(|(_, g)| g)
237 .collect::<Vec<_>>();
238
239 let selected_gaussians = match &args.output[args.output.len().saturating_sub(4)..] {
240 ".ply" => gs::core::Gaussians::Ply(gs::core::PlyGaussians::from_iter(
241 selected_gaussians.into_iter(),
242 )),
243 ".spz" => {
244 gs::core::Gaussians::Spz(
245 gs::core::SpzGaussians::from_gaussians_with_options(
246 selected_gaussians,
247 &gs::core::SpzGaussiansFromGaussianSliceOptions {
248 version: 2, // Version 2 is more widely supported as of now
249 ..Default::default()
250 },
251 )
252 .expect("SpzGaussians from gaussians"),
253 )
254 }
255 _ => panic!("Unsupported output file extension, expected .ply or .spz"),
256 };
257
258 log::debug!("Writing modified Gaussians to output file");
259 selected_gaussians
260 .write_to_file(&args.output)
261 .expect("write modified Gaussians to output file");
262
263 log::info!("Filtered Gaussians written to {}", args.output);
264}More examples
examples/modify_selection.rs (line 216)
137async fn main() {
138 env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
139
140 let args = Args::parse();
141 let model_path = &args.model;
142 let pos = Vec3::from_slice(&args.pos);
143 let rot = Quat::from_slice(&args.rot);
144 let scale = Vec3::from_slice(&args.scale);
145 let shape = match args.shape {
146 Shape::Sphere => gs::SelectionBundle::<GaussianPod>::create_sphere_bundle,
147 Shape::Box => gs::SelectionBundle::<GaussianPod>::create_box_bundle,
148 };
149 let repeat = args.repeat;
150 let offset = Vec3::from_slice(&args.offset);
151
152 log::debug!("Creating wgpu instance");
153 let instance =
154 wgpu::Instance::new(wgpu::InstanceDescriptor::new_without_display_handle_from_env());
155
156 log::debug!("Requesting adapter");
157 let adapter = instance
158 .request_adapter(&wgpu::RequestAdapterOptions::default())
159 .await
160 .expect("adapter");
161
162 log::debug!("Requesting device");
163 let (device, queue) = adapter
164 .request_device(&wgpu::DeviceDescriptor {
165 label: Some("Device"),
166 required_limits: adapter.limits(),
167 ..Default::default()
168 })
169 .await
170 .expect("device");
171
172 log::debug!("Creating gaussians");
173 let gaussians = [
174 gs::core::GaussiansSource::Ply,
175 gs::core::GaussiansSource::Spz,
176 ]
177 .into_iter()
178 .find_map(|source| gs::core::Gaussians::read_from_file(model_path, source).ok())
179 .expect("gaussians");
180
181 log::debug!("Creating editor");
182 let editor = gs::Editor::<GaussianPod>::new(&device, &gaussians);
183
184 log::debug!("Creating shape selection compute bundle");
185 let shape_selection = shape(&device);
186
187 log::debug!("Creating basic selection modifier");
188 let mut basic_selection_modifier = gs::SelectionModifier::new_with_basic_modifier(
189 &device,
190 &editor.gaussians_buffer,
191 &editor.model_transform_buffer,
192 &editor.gaussian_transform_buffer,
193 vec![shape_selection],
194 );
195
196 log::debug!("Configuring modifiers");
197 basic_selection_modifier
198 .modifier
199 .basic_color_modifiers_buffer
200 .update(
201 &queue,
202 match args.override_rgb {
203 true => gs::BasicColorRgbOverrideOrHsvModifiersPod::new_rgb_override,
204 false => gs::BasicColorRgbOverrideOrHsvModifiersPod::new_hsv_modifiers,
205 }(Vec3::from_slice(&args.rgb_or_hsv)),
206 args.alpha,
207 args.contrast,
208 args.exposure,
209 args.gamma,
210 );
211
212 log::debug!("Creating shape selection buffers");
213 let shape_selection_buffers = (0..repeat)
214 .map(|i| {
215 let offset_pos = pos + offset * i as f32;
216 let buffer = gs::InvTransformBuffer::new(&device);
217 buffer.update_with_scale_rot_pos(&queue, scale, rot, offset_pos);
218 buffer
219 })
220 .collect::<Vec<_>>();
221
222 log::debug!("Creating shape selection bind groups");
223 let shape_selection_bind_groups = shape_selection_buffers
224 .iter()
225 .map(|buffer| {
226 basic_selection_modifier.selection.bundles[0]
227 .create_bind_group(
228 &device,
229 // index 0 is the Gaussians buffer, so we use 1,
230 // see docs of create_sphere_bundle or create_box_bundle
231 1,
232 [buffer.buffer().as_entire_binding()],
233 )
234 .expect("bind group")
235 })
236 .collect::<Vec<_>>();
237
238 log::debug!("Creating selection expression");
239 basic_selection_modifier.selection_expr = shape_selection_bind_groups.into_iter().fold(
240 gs::SelectionExpr::Identity,
241 |acc, bind_group| {
242 acc.union(gs::SelectionExpr::selection(
243 0, // the 0 here is the bundle index in the selection bundle
244 vec![bind_group],
245 ))
246 },
247 );
248
249 log::info!("Starting editing process");
250 let time = std::time::Instant::now();
251
252 log::debug!("Editing Gaussians");
253 let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
254 label: Some("Edit Encoder"),
255 });
256
257 editor.apply(
258 &device,
259 &mut encoder,
260 [&basic_selection_modifier as &dyn gs::Modifier<GaussianPod>],
261 );
262
263 queue.submit(Some(encoder.finish()));
264
265 device
266 .poll(wgpu::PollType::wait_indefinitely())
267 .expect("poll");
268
269 log::info!("Editing process completed in {:?}", time.elapsed());
270
271 log::debug!("Downloading Gaussians");
272 let modified_gaussians = editor
273 .gaussians_buffer
274 .download_gaussians(&device, &queue)
275 .await
276 .map(|gs| {
277 match &args.output[args.output.len().saturating_sub(4)..] {
278 ".ply" => {
279 gs::core::Gaussians::Ply(gs::core::PlyGaussians::from_iter(gs.into_iter()))
280 }
281 ".spz" => {
282 gs::core::Gaussians::Spz(
283 gs::core::SpzGaussians::from_gaussians_with_options(
284 gs,
285 &gs::core::SpzGaussiansFromGaussianSliceOptions {
286 version: 2, // Version 2 is more widely supported as of now
287 ..Default::default()
288 },
289 )
290 .expect("SpzGaussians from gaussians"),
291 )
292 }
293 _ => panic!("Unsupported output file extension, expected .ply or .spz"),
294 }
295 })
296 .expect("gaussians download");
297
298 log::debug!("Writing modified Gaussians to output file");
299 modified_gaussians
300 .write_to_file(&args.output)
301 .expect("write modified Gaussians to output file");
302
303 log::info!("Modified Gaussians written to {}", args.output);
304}Sourcepub fn update_with_scale_rot_pos(
&self,
queue: &Queue,
scale: Vec3,
rot: Quat,
pos: Vec3,
)
pub fn update_with_scale_rot_pos( &self, queue: &Queue, scale: Vec3, rot: Quat, pos: Vec3, )
Update the sphere selection buffer with the scale, rotation, and position.
Examples found in repository?
examples/filter_selection.rs (line 162)
98async fn main() {
99 env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
100
101 let args = Args::parse();
102 let model_path = &args.model;
103 let pos = Vec3::from_slice(&args.pos);
104 let rot = Quat::from_slice(&args.rot);
105 let scale = Vec3::from_slice(&args.scale);
106 let shape = match args.shape {
107 Shape::Sphere => gs::SelectionBundle::<GaussianPod>::create_sphere_bundle,
108 Shape::Box => gs::SelectionBundle::<GaussianPod>::create_box_bundle,
109 };
110 let repeat = args.repeat;
111 let offset = Vec3::from_slice(&args.offset);
112
113 log::debug!("Creating wgpu instance");
114 let instance =
115 wgpu::Instance::new(wgpu::InstanceDescriptor::new_without_display_handle_from_env());
116
117 log::debug!("Requesting adapter");
118 let adapter = instance
119 .request_adapter(&wgpu::RequestAdapterOptions::default())
120 .await
121 .expect("adapter");
122
123 log::debug!("Requesting device");
124 let (device, queue) = adapter
125 .request_device(&wgpu::DeviceDescriptor {
126 label: Some("Device"),
127 required_limits: adapter.limits(),
128 ..Default::default()
129 })
130 .await
131 .expect("device");
132
133 log::debug!("Creating gaussians");
134 let gaussians = [
135 gs::core::GaussiansSource::Ply,
136 gs::core::GaussiansSource::Spz,
137 ]
138 .into_iter()
139 .find_map(|source| gs::core::Gaussians::read_from_file(model_path, source).ok())
140 .expect("gaussians");
141
142 log::debug!("Creating gaussians buffer");
143 let gaussians_buffer = gs::core::GaussiansBuffer::<GaussianPod>::new(&device, &gaussians);
144
145 log::debug!("Creating model transform buffer");
146 let model_transform = gs::core::ModelTransformBuffer::new(&device);
147
148 log::debug!("Creating Gaussian transform buffer");
149 let gaussian_transform = gs::core::GaussianTransformBuffer::new(&device);
150
151 log::debug!("Creating shape selection compute bundle");
152 let shape_selection = shape(&device);
153
154 log::debug!("Creating selection bundle");
155 let selection_bundle = gs::SelectionBundle::<GaussianPod>::new(&device, vec![shape_selection]);
156
157 log::debug!("Creating shape selection buffers");
158 let shape_selection_buffers = (0..repeat)
159 .map(|i| {
160 let offset_pos = pos + offset * i as f32;
161 let buffer = gs::InvTransformBuffer::new(&device);
162 buffer.update_with_scale_rot_pos(&queue, scale, rot, offset_pos);
163 buffer
164 })
165 .collect::<Vec<_>>();
166
167 log::debug!("Creating shape selection bind groups");
168 let shape_selection_bind_groups = shape_selection_buffers
169 .iter()
170 .map(|buffer| {
171 selection_bundle.bundles[0]
172 .create_bind_group(
173 &device,
174 // index 0 is the Gaussians buffer, so we use 1,
175 // see docs of create_sphere_bundle or create_box_bundle
176 1,
177 [buffer.buffer().as_entire_binding()],
178 )
179 .expect("bind group")
180 })
181 .collect::<Vec<_>>();
182
183 log::debug!("Creating selection expression");
184 let selection_expr = shape_selection_bind_groups.into_iter().fold(
185 gs::SelectionExpr::Identity,
186 |acc, bind_group| {
187 acc.union(gs::SelectionExpr::selection(
188 0, // the 0 here is the bundle index in the selection bundle
189 vec![bind_group],
190 ))
191 },
192 );
193
194 log::debug!("Creating destination buffer");
195 let dest = gs::SelectionBuffer::new(&device, gaussians_buffer.len() as u32);
196
197 log::info!("Starting selection process");
198 let time = std::time::Instant::now();
199
200 log::debug!("Selecting Gaussians");
201 let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
202 label: Some("Selection Encoder"),
203 });
204
205 selection_bundle.evaluate(
206 &device,
207 &mut encoder,
208 &selection_expr,
209 &dest,
210 &model_transform,
211 &gaussian_transform,
212 &gaussians_buffer,
213 );
214
215 queue.submit(Some(encoder.finish()));
216
217 device
218 .poll(wgpu::PollType::wait_indefinitely())
219 .expect("poll");
220
221 log::info!("Editing process completed in {:?}", time.elapsed());
222
223 log::debug!("Filtering Gaussians");
224 let selected_gaussians = dest
225 .download::<u32>(&device, &queue)
226 .await
227 .expect("selected download")
228 .iter()
229 .flat_map(|group| {
230 std::iter::repeat_n(group, 32)
231 .enumerate()
232 .map(|(i, g)| g & (1 << i) != 0)
233 })
234 .zip(gaussians.iter_gaussian())
235 .filter(|(selected, _)| *selected)
236 .map(|(_, g)| g)
237 .collect::<Vec<_>>();
238
239 let selected_gaussians = match &args.output[args.output.len().saturating_sub(4)..] {
240 ".ply" => gs::core::Gaussians::Ply(gs::core::PlyGaussians::from_iter(
241 selected_gaussians.into_iter(),
242 )),
243 ".spz" => {
244 gs::core::Gaussians::Spz(
245 gs::core::SpzGaussians::from_gaussians_with_options(
246 selected_gaussians,
247 &gs::core::SpzGaussiansFromGaussianSliceOptions {
248 version: 2, // Version 2 is more widely supported as of now
249 ..Default::default()
250 },
251 )
252 .expect("SpzGaussians from gaussians"),
253 )
254 }
255 _ => panic!("Unsupported output file extension, expected .ply or .spz"),
256 };
257
258 log::debug!("Writing modified Gaussians to output file");
259 selected_gaussians
260 .write_to_file(&args.output)
261 .expect("write modified Gaussians to output file");
262
263 log::info!("Filtered Gaussians written to {}", args.output);
264}More examples
examples/modify_selection.rs (line 217)
137async fn main() {
138 env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
139
140 let args = Args::parse();
141 let model_path = &args.model;
142 let pos = Vec3::from_slice(&args.pos);
143 let rot = Quat::from_slice(&args.rot);
144 let scale = Vec3::from_slice(&args.scale);
145 let shape = match args.shape {
146 Shape::Sphere => gs::SelectionBundle::<GaussianPod>::create_sphere_bundle,
147 Shape::Box => gs::SelectionBundle::<GaussianPod>::create_box_bundle,
148 };
149 let repeat = args.repeat;
150 let offset = Vec3::from_slice(&args.offset);
151
152 log::debug!("Creating wgpu instance");
153 let instance =
154 wgpu::Instance::new(wgpu::InstanceDescriptor::new_without_display_handle_from_env());
155
156 log::debug!("Requesting adapter");
157 let adapter = instance
158 .request_adapter(&wgpu::RequestAdapterOptions::default())
159 .await
160 .expect("adapter");
161
162 log::debug!("Requesting device");
163 let (device, queue) = adapter
164 .request_device(&wgpu::DeviceDescriptor {
165 label: Some("Device"),
166 required_limits: adapter.limits(),
167 ..Default::default()
168 })
169 .await
170 .expect("device");
171
172 log::debug!("Creating gaussians");
173 let gaussians = [
174 gs::core::GaussiansSource::Ply,
175 gs::core::GaussiansSource::Spz,
176 ]
177 .into_iter()
178 .find_map(|source| gs::core::Gaussians::read_from_file(model_path, source).ok())
179 .expect("gaussians");
180
181 log::debug!("Creating editor");
182 let editor = gs::Editor::<GaussianPod>::new(&device, &gaussians);
183
184 log::debug!("Creating shape selection compute bundle");
185 let shape_selection = shape(&device);
186
187 log::debug!("Creating basic selection modifier");
188 let mut basic_selection_modifier = gs::SelectionModifier::new_with_basic_modifier(
189 &device,
190 &editor.gaussians_buffer,
191 &editor.model_transform_buffer,
192 &editor.gaussian_transform_buffer,
193 vec![shape_selection],
194 );
195
196 log::debug!("Configuring modifiers");
197 basic_selection_modifier
198 .modifier
199 .basic_color_modifiers_buffer
200 .update(
201 &queue,
202 match args.override_rgb {
203 true => gs::BasicColorRgbOverrideOrHsvModifiersPod::new_rgb_override,
204 false => gs::BasicColorRgbOverrideOrHsvModifiersPod::new_hsv_modifiers,
205 }(Vec3::from_slice(&args.rgb_or_hsv)),
206 args.alpha,
207 args.contrast,
208 args.exposure,
209 args.gamma,
210 );
211
212 log::debug!("Creating shape selection buffers");
213 let shape_selection_buffers = (0..repeat)
214 .map(|i| {
215 let offset_pos = pos + offset * i as f32;
216 let buffer = gs::InvTransformBuffer::new(&device);
217 buffer.update_with_scale_rot_pos(&queue, scale, rot, offset_pos);
218 buffer
219 })
220 .collect::<Vec<_>>();
221
222 log::debug!("Creating shape selection bind groups");
223 let shape_selection_bind_groups = shape_selection_buffers
224 .iter()
225 .map(|buffer| {
226 basic_selection_modifier.selection.bundles[0]
227 .create_bind_group(
228 &device,
229 // index 0 is the Gaussians buffer, so we use 1,
230 // see docs of create_sphere_bundle or create_box_bundle
231 1,
232 [buffer.buffer().as_entire_binding()],
233 )
234 .expect("bind group")
235 })
236 .collect::<Vec<_>>();
237
238 log::debug!("Creating selection expression");
239 basic_selection_modifier.selection_expr = shape_selection_bind_groups.into_iter().fold(
240 gs::SelectionExpr::Identity,
241 |acc, bind_group| {
242 acc.union(gs::SelectionExpr::selection(
243 0, // the 0 here is the bundle index in the selection bundle
244 vec![bind_group],
245 ))
246 },
247 );
248
249 log::info!("Starting editing process");
250 let time = std::time::Instant::now();
251
252 log::debug!("Editing Gaussians");
253 let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
254 label: Some("Edit Encoder"),
255 });
256
257 editor.apply(
258 &device,
259 &mut encoder,
260 [&basic_selection_modifier as &dyn gs::Modifier<GaussianPod>],
261 );
262
263 queue.submit(Some(encoder.finish()));
264
265 device
266 .poll(wgpu::PollType::wait_indefinitely())
267 .expect("poll");
268
269 log::info!("Editing process completed in {:?}", time.elapsed());
270
271 log::debug!("Downloading Gaussians");
272 let modified_gaussians = editor
273 .gaussians_buffer
274 .download_gaussians(&device, &queue)
275 .await
276 .map(|gs| {
277 match &args.output[args.output.len().saturating_sub(4)..] {
278 ".ply" => {
279 gs::core::Gaussians::Ply(gs::core::PlyGaussians::from_iter(gs.into_iter()))
280 }
281 ".spz" => {
282 gs::core::Gaussians::Spz(
283 gs::core::SpzGaussians::from_gaussians_with_options(
284 gs,
285 &gs::core::SpzGaussiansFromGaussianSliceOptions {
286 version: 2, // Version 2 is more widely supported as of now
287 ..Default::default()
288 },
289 )
290 .expect("SpzGaussians from gaussians"),
291 )
292 }
293 _ => panic!("Unsupported output file extension, expected .ply or .spz"),
294 }
295 })
296 .expect("gaussians download");
297
298 log::debug!("Writing modified Gaussians to output file");
299 modified_gaussians
300 .write_to_file(&args.output)
301 .expect("write modified Gaussians to output file");
302
303 log::info!("Modified Gaussians written to {}", args.output);
304}Trait Implementations§
Source§impl BufferWrapper for InvTransformBuffer
impl BufferWrapper for InvTransformBuffer
Source§const DEFAULT_USAGES: BufferUsages = _
const DEFAULT_USAGES: BufferUsages = _
The default usages.
Source§fn download<'life0, 'life1, 'life2, 'async_trait, T>(
&'life0 self,
device: &'life1 Device,
queue: &'life2 Queue,
) -> Pin<Box<dyn Future<Output = Result<Vec<T>, DownloadBufferError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Self: Send + Sync + 'async_trait,
T: 'async_trait + NoUninit + AnyBitPattern,
fn download<'life0, 'life1, 'life2, 'async_trait, T>(
&'life0 self,
device: &'life1 Device,
queue: &'life2 Queue,
) -> Pin<Box<dyn Future<Output = Result<Vec<T>, DownloadBufferError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Self: Send + Sync + 'async_trait,
T: 'async_trait + NoUninit + AnyBitPattern,
Download the buffer data into a
Vec.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<'life0, 'life1, 'async_trait, T>(
download: &'life0 Buffer,
device: &'life1 Device,
) -> Pin<Box<dyn Future<Output = Result<Vec<T>, DownloadBufferError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
T: 'async_trait + NoUninit + AnyBitPattern,
Self: Send + 'async_trait,
fn map_download<'life0, 'life1, 'async_trait, T>(
download: &'life0 Buffer,
device: &'life1 Device,
) -> Pin<Box<dyn Future<Output = Result<Vec<T>, DownloadBufferError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
T: 'async_trait + NoUninit + AnyBitPattern,
Self: Send + 'async_trait,
Map the download buffer to read the buffer data. Read more
Source§fn map_download_with_poll_type<'life0, 'life1, 'async_trait, T>(
download: &'life0 Buffer,
device: &'life1 Device,
poll_type: PollType<SubmissionIndex>,
) -> Pin<Box<dyn Future<Output = Result<Vec<T>, DownloadBufferError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
T: 'async_trait + NoUninit + AnyBitPattern,
fn map_download_with_poll_type<'life0, 'life1, 'async_trait, T>(
download: &'life0 Buffer,
device: &'life1 Device,
poll_type: PollType<SubmissionIndex>,
) -> Pin<Box<dyn Future<Output = Result<Vec<T>, DownloadBufferError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
T: 'async_trait + NoUninit + AnyBitPattern,
Map the download buffer to read the buffer data with custom
wgpu::PollType. Read moreSource§impl Clone for InvTransformBuffer
impl Clone for InvTransformBuffer
Source§fn clone(&self) -> InvTransformBuffer
fn clone(&self) -> InvTransformBuffer
Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for InvTransformBuffer
impl Debug for InvTransformBuffer
Source§impl FixedSizeBufferWrapper for InvTransformBuffer
impl FixedSizeBufferWrapper for InvTransformBuffer
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§fn download_single(
&self,
device: &Device,
queue: &Queue,
) -> impl Future<Output = Result<Self::Pod, DownloadBufferError>> + Send
fn download_single( &self, device: &Device, queue: &Queue, ) -> impl Future<Output = Result<Self::Pod, DownloadBufferError>> + Send
Download a single
FixedSizeBufferWrapper::Pod.Source§impl From<InvTransformBuffer> for Buffer
impl From<InvTransformBuffer> for Buffer
Source§fn from(wrapper: InvTransformBuffer) -> Self
fn from(wrapper: InvTransformBuffer) -> Self
Converts to this type from the input type.
Auto Trait Implementations§
impl Freeze for InvTransformBuffer
impl !RefUnwindSafe for InvTransformBuffer
impl Send for InvTransformBuffer
impl Sync for InvTransformBuffer
impl Unpin for InvTransformBuffer
impl UnsafeUnpin for InvTransformBuffer
impl !UnwindSafe for InvTransformBuffer
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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