use gfx_core::handle;
use gfx_core::{Primitive, Resources, VertexCount};
use gfx_core::draw::InstanceOption;
use gfx_core::factory::{Bind, BufferRole, Factory};
#[derive(Clone, Debug, PartialEq)]
pub struct Slice<R: Resources> {
pub start: VertexCount,
pub end: VertexCount,
pub instances: InstanceOption,
pub kind: SliceKind<R>,
}
impl<R: Resources> Slice<R> {
pub fn get_prim_count(&self, prim: Primitive) -> u32 {
use gfx_core::Primitive::*;
let nv = (self.end - self.start) as u32;
match prim {
PointList => nv,
LineList => nv / 2,
LineStrip => (nv-1),
TriangleList => nv / 3,
TriangleStrip => (nv-2) / 3,
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum SliceKind<R: Resources> {
Vertex,
Index8(handle::Buffer<R, u8>, VertexCount),
Index16(handle::Buffer<R, u16>, VertexCount),
Index32(handle::Buffer<R, u32>, VertexCount),
}
pub trait ToIndexSlice<R: Resources> { fn to_slice<F: Factory<R>>(self, factory: &mut F) -> Slice<R>;
}
macro_rules! impl_slice {
($ty:ty, $index:ident) => (
impl<R: Resources> From<handle::Buffer<R, $ty>> for Slice<R> {
fn from(buf: handle::Buffer<R, $ty>) -> Slice<R> {
Slice {
start: 0,
end: buf.len() as VertexCount,
instances: None,
kind: SliceKind::$index(buf, 0)
}
}
}
impl<'a, R: Resources> ToIndexSlice<R> for &'a [$ty] {
fn to_slice<F: Factory<R>>(self, factory: &mut F) -> Slice<R> {
factory.create_buffer_const(self, BufferRole::Index, Bind::empty())
.unwrap().into()
}
}
)
}
impl_slice!(u8, Index8);
impl_slice!(u16, Index16);
impl_slice!(u32, Index32);