mirror of
https://gitlab.com/veloren/veloren.git
synced 2025-07-25 12:52:26 +00:00
82 lines
2.1 KiB
Rust
82 lines
2.1 KiB
Rust
use super::{
|
|
buffer::{Buffer, DynamicBuffer},
|
|
mesh::Mesh,
|
|
Vertex,
|
|
};
|
|
use std::ops::Range;
|
|
|
|
/// Represents a mesh that has been sent to the GPU.
|
|
pub struct SubModel<'a, V: Vertex> {
|
|
pub vertex_range: Range<u32>,
|
|
buf: &'a wgpu::Buffer,
|
|
phantom_data: std::marker::PhantomData<V>,
|
|
}
|
|
|
|
impl<'a, V: Vertex> SubModel<'a, V> {
|
|
pub fn buf(&self) -> &wgpu::Buffer { self.buf }
|
|
}
|
|
|
|
/// Represents a mesh that has been sent to the GPU.
|
|
pub struct Model<V: Vertex> {
|
|
vbuf: Buffer<V>,
|
|
}
|
|
|
|
impl<V: Vertex> Model<V> {
|
|
pub fn new(device: &wgpu::Device, mesh: &Mesh<V>) -> Self {
|
|
Self {
|
|
vbuf: Buffer::new(device, wgpu::BufferUsage::VERTEX, mesh.vertices()),
|
|
}
|
|
}
|
|
|
|
/// Create a model with a slice of a portion of this model to send to the
|
|
/// renderer.
|
|
pub fn submodel(&self, vertex_range: Range<u32>) -> SubModel<V> {
|
|
SubModel {
|
|
vertex_range,
|
|
buf: self.buf(),
|
|
phantom_data: std::marker::PhantomData,
|
|
}
|
|
}
|
|
|
|
pub fn buf(&self) -> &wgpu::Buffer { &self.vbuf.buf }
|
|
|
|
pub fn len(&self) -> usize { self.vbuf.len() }
|
|
}
|
|
|
|
/// Represents a mesh that has been sent to the GPU.
|
|
pub struct DynamicModel<V: Vertex> {
|
|
vbuf: DynamicBuffer<V>,
|
|
}
|
|
|
|
impl<V: Vertex> DynamicModel<V> {
|
|
pub fn new(device: &wgpu::Device, size: usize) -> Self {
|
|
Self {
|
|
vbuf: DynamicBuffer::new(device, size, wgpu::BufferUsage::VERTEX),
|
|
}
|
|
}
|
|
|
|
pub fn update(
|
|
&self,
|
|
device: &wgpu::Device,
|
|
queue: &wgpu::Queue,
|
|
mesh: &Mesh<V>,
|
|
offset: usize,
|
|
) {
|
|
self.vbuf.update(device, queue, mesh.vertices(), offset)
|
|
}
|
|
|
|
/// Create a model with a slice of a portion of this model to send to the
|
|
/// renderer.
|
|
pub fn submodel(&self, vertex_range: Range<u32>) -> SubModel<V> {
|
|
SubModel {
|
|
vertex_range,
|
|
buf: self.buf(),
|
|
phantom_data: std::marker::PhantomData,
|
|
}
|
|
}
|
|
|
|
pub fn buf(&self) -> &wgpu::Buffer { &self.vbuf.buf }
|
|
|
|
pub fn len(&self) -> usize { self.vbuf.len() }
|
|
}
|