veloren_voxygen/render/
instances.rs1use super::buffer::DynamicBuffer;
2use bytemuck::Pod;
3use std::ops::Range;
4
5pub struct SubInstances<'a, T: Copy + Pod> {
7 pub inst_range: Range<u32>,
8 buf: &'a wgpu::Buffer,
9 phantom_data: std::marker::PhantomData<T>,
10}
11
12impl<'a, T: Copy + Pod> SubInstances<'a, T> {
13 pub(super) fn buf(&self) -> wgpu::BufferSlice<'a> {
14 let start = self.inst_range.start as wgpu::BufferAddress
15 * std::mem::size_of::<T>() as wgpu::BufferAddress;
16 let end = self.inst_range.end as wgpu::BufferAddress
17 * std::mem::size_of::<T>() as wgpu::BufferAddress;
18 self.buf.slice(start..end)
19 }
20
21 pub fn count(&self) -> u32 { self.inst_range.end - self.inst_range.start }
22}
23
24pub struct Instances<T: Copy + Pod> {
26 buf: DynamicBuffer<T>,
27}
28
29impl<T: Copy + Pod> Instances<T> {
30 pub fn new(device: &wgpu::Device, len: usize) -> Self {
31 Self {
32 buf: DynamicBuffer::new(device, len, wgpu::BufferUsages::VERTEX),
35 }
36 }
37
38 pub fn subinstances(&self, inst_range: Range<u32>) -> SubInstances<T> {
41 SubInstances {
42 inst_range,
43 buf: self.buf(),
44 phantom_data: std::marker::PhantomData,
45 }
46 }
47
48 pub fn count(&self) -> usize { self.buf.len() }
50
51 pub fn update(&mut self, queue: &wgpu::Queue, vals: &[T], offset: usize) {
52 self.buf.update(queue, vals, offset)
53 }
54
55 pub fn buf(&self) -> &wgpu::Buffer { &self.buf.buf }
56}