use vulkanalia::prelude::v1_0::*; use std::hash::{Hash, Hasher}; use std::mem::size_of; use cgmath; type Vec2 = cgmath::Vector2<f32>; type Vec3 = cgmath::Vector3<f32>; #[repr(C)] #[derive(Copy, Clone, Debug)] pub struct Vertex { pub pos: Vec3, pub color: Vec3, pub tex_coord: Vec2, } impl Vertex { pub const fn new(pos: Vec3, color: Vec3, tex_coord: Vec2) -> Self { Self { pos, color, tex_coord } } pub fn binding_description() -> vk::VertexInputBindingDescription { vk::VertexInputBindingDescription::builder() .binding(0) .stride(size_of::<Vertex>() as u32) .input_rate(vk::VertexInputRate::VERTEX) .build() } pub fn attribute_descriptions() -> [vk::VertexInputAttributeDescription; 3] { let pos = vk::VertexInputAttributeDescription::builder() .binding(0) .location(0) .format(vk::Format::R32G32B32_SFLOAT) .offset(0) .build(); let color = vk::VertexInputAttributeDescription::builder() .binding(0) .location(1) .format(vk::Format::R32G32B32_SFLOAT) .offset(size_of::<Vec2>() as u32) .build(); let tex_coord = vk::VertexInputAttributeDescription::builder() .binding(0) .location(2) .format(vk::Format::R32G32_SFLOAT) .offset((size_of::<Vec2>() + size_of::<Vec3>()) as u32) .build(); [pos, color, tex_coord] } } impl PartialEq for Vertex { fn eq(&self, other: &Self) -> bool { self.pos == other.pos && self.color == other.color && self.tex_coord == other.tex_coord } } impl Eq for Vertex {} impl Hash for Vertex { fn hash<H: Hasher>(&self, state: &mut H) { self.pos[0].to_bits().hash(state); self.pos[1].to_bits().hash(state); self.pos[2].to_bits().hash(state); self.color[0].to_bits().hash(state); self.color[1].to_bits().hash(state); self.color[2].to_bits().hash(state); self.tex_coord[0].to_bits().hash(state); self.tex_coord[1].to_bits().hash(state); } }