//! # Vertex Module //! //! Defines `Vertex`, the CPU-side data layout that is sent to the GPU as vertex attribute buffers. //! The struct's field order and offsets must exactly match the shader input attributes defined in //! PipelineCache::build_pipeline() — any mismatch will corrupt GPU rendering output. //! //! ## Technical Points //! - `#[repr(C)]` ensures fields are laid out contiguously without Rust padding reordering, matching C ABI. //! - `bytemuck::Pod + bytemuck::Zeroable` enables safe `cast_slice()` conversion for GPU buffer uploads. /// Per-vertex attribute tuple: position (3D), normal (3D), texture coordinate (2D), color (RGBA). /// Must match the vertex buffer layout in PipelineCache::build_pipeline() byte-for-byte. #[repr(C)] #[derive(Copy, Clone, Debug, bytemuck::Pod, bytemuck::Zeroable)] pub struct Vertex { /// XYZ coordinates of this vertex in world space. Offset: 0 bytes. pub position: [f32; 3], /// XYZ coordinates of the vertex normal. Offset: 12 bytes. pub normal: [f32; 3], /// UV texture coordinates. Offset: 24 bytes pub uv: [f32; 2], /// RGBA color values. Offset: 32 bytes. pub color: [f32; 4], } impl Default for Vertex { // Default values for stability fn default() -> Self { Self { // Default position at center (0, 0) position: [0.0, 0.0, 0.0], // Normal pointing upward (standard for lighting calculations) normal: [0.0, 1.0, 0.0], // UV coordinates at the origin of the texture uv: [0.0, 0.0], // Opaque white color by default color: [1.0, 1.0, 1.0, 1.0], } } }