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 160)
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 = wgpu::Instance::new(&wgpu::InstanceDescriptor::default());
115
116 log::debug!("Requesting adapter");
117 let adapter = instance
118 .request_adapter(&wgpu::RequestAdapterOptions::default())
119 .await
120 .expect("adapter");
121
122 log::debug!("Requesting device");
123 let (device, queue) = adapter
124 .request_device(&wgpu::DeviceDescriptor {
125 label: Some("Device"),
126 required_limits: adapter.limits(),
127 ..Default::default()
128 })
129 .await
130 .expect("device");
131
132 log::debug!("Creating gaussians");
133 let gaussians = [
134 gs::core::GaussiansSource::Ply,
135 gs::core::GaussiansSource::Spz,
136 ]
137 .into_iter()
138 .find_map(|source| gs::core::Gaussians::read_from_file(model_path, source).ok())
139 .expect("gaussians");
140
141 log::debug!("Creating gaussians buffer");
142 let gaussians_buffer = gs::core::GaussiansBuffer::<GaussianPod>::new(&device, &gaussians);
143
144 log::debug!("Creating model transform buffer");
145 let model_transform = gs::core::ModelTransformBuffer::new(&device);
146
147 log::debug!("Creating Gaussian transform buffer");
148 let gaussian_transform = gs::core::GaussianTransformBuffer::new(&device);
149
150 log::debug!("Creating shape selection compute bundle");
151 let shape_selection = shape(&device);
152
153 log::debug!("Creating selection bundle");
154 let selection_bundle = gs::SelectionBundle::<GaussianPod>::new(&device, vec![shape_selection]);
155
156 log::debug!("Creating shape selection buffers");
157 let shape_selection_buffers = (0..repeat)
158 .map(|i| {
159 let offset_pos = pos + offset * i as f32;
160 let buffer = gs::InvTransformBuffer::new(&device);
161 buffer.update_with_scale_rot_pos(&queue, scale, rot, offset_pos);
162 buffer
163 })
164 .collect::<Vec<_>>();
165
166 log::debug!("Creating shape selection bind groups");
167 let shape_selection_bind_groups = shape_selection_buffers
168 .iter()
169 .map(|buffer| {
170 selection_bundle.bundles[0]
171 .create_bind_group(
172 &device,
173 // index 0 is the Gaussians buffer, so we use 1,
174 // see docs of create_sphere_bundle or create_box_bundle
175 1,
176 [buffer.buffer().as_entire_binding()],
177 )
178 .expect("bind group")
179 })
180 .collect::<Vec<_>>();
181
182 log::debug!("Creating selection expression");
183 let selection_expr = shape_selection_bind_groups.into_iter().fold(
184 gs::SelectionExpr::Identity,
185 |acc, bind_group| {
186 acc.union(gs::SelectionExpr::selection(
187 0, // the 0 here is the bundle index in the selection bundle
188 vec![bind_group],
189 ))
190 },
191 );
192
193 log::debug!("Creating destination buffer");
194 let dest = gs::SelectionBuffer::new(&device, gaussians_buffer.len() as u32);
195
196 log::info!("Starting selection process");
197 let time = std::time::Instant::now();
198
199 log::debug!("Selecting Gaussians");
200 let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
201 label: Some("Selection Encoder"),
202 });
203
204 selection_bundle.evaluate(
205 &device,
206 &mut encoder,
207 &selection_expr,
208 &dest,
209 &model_transform,
210 &gaussian_transform,
211 &gaussians_buffer,
212 );
213
214 queue.submit(Some(encoder.finish()));
215
216 device
217 .poll(wgpu::PollType::wait_indefinitely())
218 .expect("poll");
219
220 log::info!("Editing process completed in {:?}", time.elapsed());
221
222 log::debug!("Filtering Gaussians");
223 let selected_gaussians = dest
224 .download::<u32>(&device, &queue)
225 .await
226 .expect("selected download")
227 .iter()
228 .flat_map(|group| {
229 std::iter::repeat_n(group, 32)
230 .enumerate()
231 .map(|(i, g)| g & (1 << i) != 0)
232 })
233 .zip(gaussians.iter_gaussian())
234 .filter(|(selected, _)| *selected)
235 .map(|(_, g)| g)
236 .collect::<Vec<_>>();
237
238 let selected_gaussians = match &args.output[args.output.len().saturating_sub(4)..] {
239 ".ply" => gs::core::Gaussians::Ply(gs::core::PlyGaussians::from_iter(
240 selected_gaussians.into_iter(),
241 )),
242 ".spz" => {
243 gs::core::Gaussians::Spz(
244 gs::core::SpzGaussians::from_gaussians_with_options(
245 selected_gaussians,
246 &gs::core::SpzGaussiansFromGaussianSliceOptions {
247 version: 2, // Version 2 is more widely supported as of now
248 ..Default::default()
249 },
250 )
251 .expect("SpzGaussians from gaussians"),
252 )
253 }
254 _ => panic!("Unsupported output file extension, expected .ply or .spz"),
255 };
256
257 log::debug!("Writing modified Gaussians to output file");
258 selected_gaussians
259 .write_to_file(&args.output)
260 .expect("write modified Gaussians to output file");
261
262 log::info!("Filtered Gaussians written to {}", args.output);
263}More examples
examples/modify_selection.rs (line 215)
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 = wgpu::Instance::new(&wgpu::InstanceDescriptor::default());
154
155 log::debug!("Requesting adapter");
156 let adapter = instance
157 .request_adapter(&wgpu::RequestAdapterOptions::default())
158 .await
159 .expect("adapter");
160
161 log::debug!("Requesting device");
162 let (device, queue) = adapter
163 .request_device(&wgpu::DeviceDescriptor {
164 label: Some("Device"),
165 required_limits: adapter.limits(),
166 ..Default::default()
167 })
168 .await
169 .expect("device");
170
171 log::debug!("Creating gaussians");
172 let gaussians = [
173 gs::core::GaussiansSource::Ply,
174 gs::core::GaussiansSource::Spz,
175 ]
176 .into_iter()
177 .find_map(|source| gs::core::Gaussians::read_from_file(model_path, source).ok())
178 .expect("gaussians");
179
180 log::debug!("Creating editor");
181 let editor = gs::Editor::<GaussianPod>::new(&device, &gaussians);
182
183 log::debug!("Creating shape selection compute bundle");
184 let shape_selection = shape(&device);
185
186 log::debug!("Creating basic selection modifier");
187 let mut basic_selection_modifier = gs::SelectionModifier::new_with_basic_modifier(
188 &device,
189 &editor.gaussians_buffer,
190 &editor.model_transform_buffer,
191 &editor.gaussian_transform_buffer,
192 vec![shape_selection],
193 );
194
195 log::debug!("Configuring modifiers");
196 basic_selection_modifier
197 .modifier
198 .basic_color_modifiers_buffer
199 .update(
200 &queue,
201 match args.override_rgb {
202 true => gs::BasicColorRgbOverrideOrHsvModifiersPod::new_rgb_override,
203 false => gs::BasicColorRgbOverrideOrHsvModifiersPod::new_hsv_modifiers,
204 }(Vec3::from_slice(&args.rgb_or_hsv)),
205 args.alpha,
206 args.contrast,
207 args.exposure,
208 args.gamma,
209 );
210
211 log::debug!("Creating shape selection buffers");
212 let shape_selection_buffers = (0..repeat)
213 .map(|i| {
214 let offset_pos = pos + offset * i as f32;
215 let buffer = gs::InvTransformBuffer::new(&device);
216 buffer.update_with_scale_rot_pos(&queue, scale, rot, offset_pos);
217 buffer
218 })
219 .collect::<Vec<_>>();
220
221 log::debug!("Creating shape selection bind groups");
222 let shape_selection_bind_groups = shape_selection_buffers
223 .iter()
224 .map(|buffer| {
225 basic_selection_modifier.selection.bundles[0]
226 .create_bind_group(
227 &device,
228 // index 0 is the Gaussians buffer, so we use 1,
229 // see docs of create_sphere_bundle or create_box_bundle
230 1,
231 [buffer.buffer().as_entire_binding()],
232 )
233 .expect("bind group")
234 })
235 .collect::<Vec<_>>();
236
237 log::debug!("Creating selection expression");
238 basic_selection_modifier.selection_expr = shape_selection_bind_groups.into_iter().fold(
239 gs::SelectionExpr::Identity,
240 |acc, bind_group| {
241 acc.union(gs::SelectionExpr::selection(
242 0, // the 0 here is the bundle index in the selection bundle
243 vec![bind_group],
244 ))
245 },
246 );
247
248 log::info!("Starting editing process");
249 let time = std::time::Instant::now();
250
251 log::debug!("Editing Gaussians");
252 let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
253 label: Some("Edit Encoder"),
254 });
255
256 editor.apply(
257 &device,
258 &mut encoder,
259 [&basic_selection_modifier as &dyn gs::Modifier<GaussianPod>],
260 );
261
262 queue.submit(Some(encoder.finish()));
263
264 device
265 .poll(wgpu::PollType::wait_indefinitely())
266 .expect("poll");
267
268 log::info!("Editing process completed in {:?}", time.elapsed());
269
270 log::debug!("Downloading Gaussians");
271 let modified_gaussians = editor
272 .gaussians_buffer
273 .download_gaussians(&device, &queue)
274 .await
275 .map(|gs| {
276 match &args.output[args.output.len().saturating_sub(4)..] {
277 ".ply" => {
278 gs::core::Gaussians::Ply(gs::core::PlyGaussians::from_iter(gs.into_iter()))
279 }
280 ".spz" => {
281 gs::core::Gaussians::Spz(
282 gs::core::SpzGaussians::from_gaussians_with_options(
283 gs,
284 &gs::core::SpzGaussiansFromGaussianSliceOptions {
285 version: 2, // Version 2 is more widely supported as of now
286 ..Default::default()
287 },
288 )
289 .expect("SpzGaussians from gaussians"),
290 )
291 }
292 _ => panic!("Unsupported output file extension, expected .ply or .spz"),
293 }
294 })
295 .expect("gaussians download");
296
297 log::debug!("Writing modified Gaussians to output file");
298 modified_gaussians
299 .write_to_file(&args.output)
300 .expect("write modified Gaussians to output file");
301
302 log::info!("Modified Gaussians written to {}", args.output);
303}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 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 = wgpu::Instance::new(&wgpu::InstanceDescriptor::default());
115
116 log::debug!("Requesting adapter");
117 let adapter = instance
118 .request_adapter(&wgpu::RequestAdapterOptions::default())
119 .await
120 .expect("adapter");
121
122 log::debug!("Requesting device");
123 let (device, queue) = adapter
124 .request_device(&wgpu::DeviceDescriptor {
125 label: Some("Device"),
126 required_limits: adapter.limits(),
127 ..Default::default()
128 })
129 .await
130 .expect("device");
131
132 log::debug!("Creating gaussians");
133 let gaussians = [
134 gs::core::GaussiansSource::Ply,
135 gs::core::GaussiansSource::Spz,
136 ]
137 .into_iter()
138 .find_map(|source| gs::core::Gaussians::read_from_file(model_path, source).ok())
139 .expect("gaussians");
140
141 log::debug!("Creating gaussians buffer");
142 let gaussians_buffer = gs::core::GaussiansBuffer::<GaussianPod>::new(&device, &gaussians);
143
144 log::debug!("Creating model transform buffer");
145 let model_transform = gs::core::ModelTransformBuffer::new(&device);
146
147 log::debug!("Creating Gaussian transform buffer");
148 let gaussian_transform = gs::core::GaussianTransformBuffer::new(&device);
149
150 log::debug!("Creating shape selection compute bundle");
151 let shape_selection = shape(&device);
152
153 log::debug!("Creating selection bundle");
154 let selection_bundle = gs::SelectionBundle::<GaussianPod>::new(&device, vec![shape_selection]);
155
156 log::debug!("Creating shape selection buffers");
157 let shape_selection_buffers = (0..repeat)
158 .map(|i| {
159 let offset_pos = pos + offset * i as f32;
160 let buffer = gs::InvTransformBuffer::new(&device);
161 buffer.update_with_scale_rot_pos(&queue, scale, rot, offset_pos);
162 buffer
163 })
164 .collect::<Vec<_>>();
165
166 log::debug!("Creating shape selection bind groups");
167 let shape_selection_bind_groups = shape_selection_buffers
168 .iter()
169 .map(|buffer| {
170 selection_bundle.bundles[0]
171 .create_bind_group(
172 &device,
173 // index 0 is the Gaussians buffer, so we use 1,
174 // see docs of create_sphere_bundle or create_box_bundle
175 1,
176 [buffer.buffer().as_entire_binding()],
177 )
178 .expect("bind group")
179 })
180 .collect::<Vec<_>>();
181
182 log::debug!("Creating selection expression");
183 let selection_expr = shape_selection_bind_groups.into_iter().fold(
184 gs::SelectionExpr::Identity,
185 |acc, bind_group| {
186 acc.union(gs::SelectionExpr::selection(
187 0, // the 0 here is the bundle index in the selection bundle
188 vec![bind_group],
189 ))
190 },
191 );
192
193 log::debug!("Creating destination buffer");
194 let dest = gs::SelectionBuffer::new(&device, gaussians_buffer.len() as u32);
195
196 log::info!("Starting selection process");
197 let time = std::time::Instant::now();
198
199 log::debug!("Selecting Gaussians");
200 let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
201 label: Some("Selection Encoder"),
202 });
203
204 selection_bundle.evaluate(
205 &device,
206 &mut encoder,
207 &selection_expr,
208 &dest,
209 &model_transform,
210 &gaussian_transform,
211 &gaussians_buffer,
212 );
213
214 queue.submit(Some(encoder.finish()));
215
216 device
217 .poll(wgpu::PollType::wait_indefinitely())
218 .expect("poll");
219
220 log::info!("Editing process completed in {:?}", time.elapsed());
221
222 log::debug!("Filtering Gaussians");
223 let selected_gaussians = dest
224 .download::<u32>(&device, &queue)
225 .await
226 .expect("selected download")
227 .iter()
228 .flat_map(|group| {
229 std::iter::repeat_n(group, 32)
230 .enumerate()
231 .map(|(i, g)| g & (1 << i) != 0)
232 })
233 .zip(gaussians.iter_gaussian())
234 .filter(|(selected, _)| *selected)
235 .map(|(_, g)| g)
236 .collect::<Vec<_>>();
237
238 let selected_gaussians = match &args.output[args.output.len().saturating_sub(4)..] {
239 ".ply" => gs::core::Gaussians::Ply(gs::core::PlyGaussians::from_iter(
240 selected_gaussians.into_iter(),
241 )),
242 ".spz" => {
243 gs::core::Gaussians::Spz(
244 gs::core::SpzGaussians::from_gaussians_with_options(
245 selected_gaussians,
246 &gs::core::SpzGaussiansFromGaussianSliceOptions {
247 version: 2, // Version 2 is more widely supported as of now
248 ..Default::default()
249 },
250 )
251 .expect("SpzGaussians from gaussians"),
252 )
253 }
254 _ => panic!("Unsupported output file extension, expected .ply or .spz"),
255 };
256
257 log::debug!("Writing modified Gaussians to output file");
258 selected_gaussians
259 .write_to_file(&args.output)
260 .expect("write modified Gaussians to output file");
261
262 log::info!("Filtered Gaussians written to {}", args.output);
263}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 = wgpu::Instance::new(&wgpu::InstanceDescriptor::default());
154
155 log::debug!("Requesting adapter");
156 let adapter = instance
157 .request_adapter(&wgpu::RequestAdapterOptions::default())
158 .await
159 .expect("adapter");
160
161 log::debug!("Requesting device");
162 let (device, queue) = adapter
163 .request_device(&wgpu::DeviceDescriptor {
164 label: Some("Device"),
165 required_limits: adapter.limits(),
166 ..Default::default()
167 })
168 .await
169 .expect("device");
170
171 log::debug!("Creating gaussians");
172 let gaussians = [
173 gs::core::GaussiansSource::Ply,
174 gs::core::GaussiansSource::Spz,
175 ]
176 .into_iter()
177 .find_map(|source| gs::core::Gaussians::read_from_file(model_path, source).ok())
178 .expect("gaussians");
179
180 log::debug!("Creating editor");
181 let editor = gs::Editor::<GaussianPod>::new(&device, &gaussians);
182
183 log::debug!("Creating shape selection compute bundle");
184 let shape_selection = shape(&device);
185
186 log::debug!("Creating basic selection modifier");
187 let mut basic_selection_modifier = gs::SelectionModifier::new_with_basic_modifier(
188 &device,
189 &editor.gaussians_buffer,
190 &editor.model_transform_buffer,
191 &editor.gaussian_transform_buffer,
192 vec![shape_selection],
193 );
194
195 log::debug!("Configuring modifiers");
196 basic_selection_modifier
197 .modifier
198 .basic_color_modifiers_buffer
199 .update(
200 &queue,
201 match args.override_rgb {
202 true => gs::BasicColorRgbOverrideOrHsvModifiersPod::new_rgb_override,
203 false => gs::BasicColorRgbOverrideOrHsvModifiersPod::new_hsv_modifiers,
204 }(Vec3::from_slice(&args.rgb_or_hsv)),
205 args.alpha,
206 args.contrast,
207 args.exposure,
208 args.gamma,
209 );
210
211 log::debug!("Creating shape selection buffers");
212 let shape_selection_buffers = (0..repeat)
213 .map(|i| {
214 let offset_pos = pos + offset * i as f32;
215 let buffer = gs::InvTransformBuffer::new(&device);
216 buffer.update_with_scale_rot_pos(&queue, scale, rot, offset_pos);
217 buffer
218 })
219 .collect::<Vec<_>>();
220
221 log::debug!("Creating shape selection bind groups");
222 let shape_selection_bind_groups = shape_selection_buffers
223 .iter()
224 .map(|buffer| {
225 basic_selection_modifier.selection.bundles[0]
226 .create_bind_group(
227 &device,
228 // index 0 is the Gaussians buffer, so we use 1,
229 // see docs of create_sphere_bundle or create_box_bundle
230 1,
231 [buffer.buffer().as_entire_binding()],
232 )
233 .expect("bind group")
234 })
235 .collect::<Vec<_>>();
236
237 log::debug!("Creating selection expression");
238 basic_selection_modifier.selection_expr = shape_selection_bind_groups.into_iter().fold(
239 gs::SelectionExpr::Identity,
240 |acc, bind_group| {
241 acc.union(gs::SelectionExpr::selection(
242 0, // the 0 here is the bundle index in the selection bundle
243 vec![bind_group],
244 ))
245 },
246 );
247
248 log::info!("Starting editing process");
249 let time = std::time::Instant::now();
250
251 log::debug!("Editing Gaussians");
252 let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
253 label: Some("Edit Encoder"),
254 });
255
256 editor.apply(
257 &device,
258 &mut encoder,
259 [&basic_selection_modifier as &dyn gs::Modifier<GaussianPod>],
260 );
261
262 queue.submit(Some(encoder.finish()));
263
264 device
265 .poll(wgpu::PollType::wait_indefinitely())
266 .expect("poll");
267
268 log::info!("Editing process completed in {:?}", time.elapsed());
269
270 log::debug!("Downloading Gaussians");
271 let modified_gaussians = editor
272 .gaussians_buffer
273 .download_gaussians(&device, &queue)
274 .await
275 .map(|gs| {
276 match &args.output[args.output.len().saturating_sub(4)..] {
277 ".ply" => {
278 gs::core::Gaussians::Ply(gs::core::PlyGaussians::from_iter(gs.into_iter()))
279 }
280 ".spz" => {
281 gs::core::Gaussians::Spz(
282 gs::core::SpzGaussians::from_gaussians_with_options(
283 gs,
284 &gs::core::SpzGaussiansFromGaussianSliceOptions {
285 version: 2, // Version 2 is more widely supported as of now
286 ..Default::default()
287 },
288 )
289 .expect("SpzGaussians from gaussians"),
290 )
291 }
292 _ => panic!("Unsupported output file extension, expected .ply or .spz"),
293 }
294 })
295 .expect("gaussians download");
296
297 log::debug!("Writing modified Gaussians to output file");
298 modified_gaussians
299 .write_to_file(&args.output)
300 .expect("write modified Gaussians to output file");
301
302 log::info!("Modified Gaussians written to {}", args.output);
303}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 · 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 !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