veloren/voxygen/src/render/mesh.rs

95 lines
2.5 KiB
Rust
Raw Normal View History

2019-01-07 21:10:31 +00:00
use super::Pipeline;
/// A `Vec`-based mesh structure used to store mesh data on the CPU.
#[derive(Clone)]
2019-01-07 21:10:31 +00:00
pub struct Mesh<P: Pipeline> {
verts: Vec<P::Vertex>,
}
impl<P: Pipeline> Mesh<P> {
/// Create a new `Mesh`.
2019-01-11 20:14:37 +00:00
pub fn new() -> Self {
2019-01-07 21:10:31 +00:00
Self { verts: vec![] }
}
/// Clear vertices, allows reusing allocated memory of the underlying Vec.
pub fn clear(&mut self) {
self.verts.clear();
}
/// Get a slice referencing the vertices of this mesh.
2019-01-11 20:14:37 +00:00
pub fn vertices(&self) -> &[P::Vertex] {
2019-01-07 21:10:31 +00:00
&self.verts
}
/// Push a new vertex onto the end of this mesh.
2019-01-07 21:10:31 +00:00
pub fn push(&mut self, vert: P::Vertex) {
self.verts.push(vert);
}
2019-01-11 20:14:37 +00:00
/// Push a new polygon onto the end of this mesh.
pub fn push_tri(&mut self, tri: Tri<P>) {
self.verts.push(tri.a);
self.verts.push(tri.b);
self.verts.push(tri.c);
}
/// Push a new quad onto the end of this mesh.
2019-01-11 20:14:37 +00:00
pub fn push_quad(&mut self, quad: Quad<P>) {
// A quad is composed of two triangles. The code below converts the former to the latter.
2019-01-11 20:14:37 +00:00
// Tri 1
self.verts.push(quad.a.clone());
self.verts.push(quad.b);
self.verts.push(quad.c.clone());
// Tri 2
self.verts.push(quad.c);
self.verts.push(quad.d);
self.verts.push(quad.a);
}
/// Push the vertices of another mesh onto the end of this mesh.
pub fn push_mesh(&mut self, other: &Mesh<P>) {
self.verts.extend_from_slice(other.vertices());
}
/// Map and push the vertices of another mesh onto the end of this mesh.
pub fn push_mesh_map<F: FnMut(P::Vertex) -> P::Vertex>(&mut self, other: &Mesh<P>, mut f: F) {
// Reserve enough space in our Vec. This isn't necessary, but it tends to reduce the number
// of required (re)allocations.
self.verts.reserve(other.vertices().len());
for vert in other.vertices() {
self.verts.push(f(vert.clone()));
}
}
2019-01-11 20:14:37 +00:00
}
/// Represents a triangle stored on the CPU.
pub struct Tri<P: Pipeline> {
a: P::Vertex,
b: P::Vertex,
c: P::Vertex,
}
impl<P: Pipeline> Tri<P> {
pub fn new(a: P::Vertex, b: P::Vertex, c: P::Vertex) -> Self {
Self { a, b, c }
}
}
/// Represents a quad stored on the CPU.
2019-01-11 20:14:37 +00:00
pub struct Quad<P: Pipeline> {
a: P::Vertex,
b: P::Vertex,
c: P::Vertex,
d: P::Vertex,
}
impl<P: Pipeline> Quad<P> {
pub fn new(a: P::Vertex, b: P::Vertex, c: P::Vertex, d: P::Vertex) -> Self {
2019-01-11 20:14:37 +00:00
Self { a, b, c, d }
}
2019-01-07 21:10:31 +00:00
}