use crate::Colour;
use glium::{
index::{
PrimitiveType,
IndicesSource,
IndexType,
},
vertex::{
VerticesSource,
VertexFormat,
},
buffer::{
Buffer,
Content,
},
};
pub trait DependentObject<V:Copy,I:Copy>
where
[V]:Content,
[I]:Content,
{
type Vertices:AsRef<[V]>;
type Indices:AsRef<[I]>;
fn colour(&self)->Colour;
fn vertices(&self)->Self::Vertices;
fn indices(&self)->Option<Self::Indices>;
fn primitive_type(&self)->PrimitiveType;
fn write_indices<'a>(
&self,
index_buffer:&'a Buffer<[I]>
)->Option<IndicesSource<'a>>{
Some(
if let Some(indicesb)=self.indices(){
let indices=indicesb.as_ref();
let slice=match index_buffer.slice(0..indices.len()){
Some(slice)=>slice,
None=>return None,
};
slice.write(&indices);
IndicesSource::IndexBuffer{
buffer:slice.as_slice_any(),
data_type:IndexType::U8,
primitives:self.primitive_type(),
}
}
else{
IndicesSource::NoIndices{
primitives:self.primitive_type(),
}
}
)
}
fn write_vertices<'a>(
&self,
vertex_buffer:&'a Buffer<[V]>,
vertex_format:&'a VertexFormat,
)->Option<VerticesSource<'a>>{
let verticesb=self.vertices();
let vertices:&[V]=verticesb.as_ref();
let slice=match vertex_buffer.slice(0..vertices.len()){
Some(slice)=>slice,
None=>return None,
};
slice.write(&vertices);
Some(
VerticesSource::VertexBuffer(
slice.as_slice_any(),
vertex_format,
false
)
)
}
}