use bytemuck::{Pod,Zeroable};
use strafesnet_common::model::{IndexedVertex,PolygonGroup,RenderConfigId};
#[derive(Clone,Copy,Pod,Zeroable)]
#[repr(C)]
pub struct GraphicsVertex{
	pub pos:[f32;3],
	pub tex:[f32;2],
	pub normal:[f32;3],
	pub color:[f32;4],
}
#[derive(Clone,Copy,id::Id)]
pub struct IndexedGraphicsMeshOwnedRenderConfigId(u32);
pub struct IndexedGraphicsMeshOwnedRenderConfig{
	pub unique_pos:Vec<[f32;3]>,
	pub unique_tex:Vec<[f32;2]>,
	pub unique_normal:Vec<[f32;3]>,
	pub unique_color:Vec<[f32;4]>,
	pub unique_vertices:Vec<IndexedVertex>,
	pub render_config:RenderConfigId,
	pub polys:PolygonGroup,
	pub instances:Vec<GraphicsModelOwned>,
}
pub enum Indices{
	U32(Vec<u32>),
	U16(Vec<u16>),
}
pub struct GraphicsMeshOwnedRenderConfig{
	pub vertices:Vec<GraphicsVertex>,
	pub indices:Indices,
	pub render_config:RenderConfigId,
	pub instances:Vec<GraphicsModelOwned>,
}
#[derive(Clone,Copy,PartialEq,id::Id)]
pub struct GraphicsModelColor4(glam::Vec4);
impl std::hash::Hash for GraphicsModelColor4{
	fn hash<H:std::hash::Hasher>(&self,state:&mut H) {
		for &f in self.0.as_ref(){
			bytemuck::cast::<f32,u32>(f).hash(state);
		}
	}
}
impl Eq for GraphicsModelColor4{}
#[derive(Clone)]
pub struct GraphicsModelOwned{
	pub transform:glam::Mat4,
	pub normal_transform:glam::Mat3,
	pub color:GraphicsModelColor4,
}