summary refs log tree commit diff
path: root/src/shader_data.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_data.rs')
-rw-r--r--src/shader_data.rs82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/shader_data.rs b/src/shader_data.rs
new file mode 100644
index 0000000..404d5fb
--- /dev/null
+++ b/src/shader_data.rs
@@ -0,0 +1,82 @@
+#![forbid(unsafe_code)]
+use crate::linear_algebra::{ Vec2, Vec3, Mat4, Transformation };
+
+use std::mem::size_of;
+use vulkanalia::vk::{ self, HasBuilder };
+
+
+pub static VERTICES: [Vertex<f32>; 4] = [
+  Vertex::new(Vec2::new(-0.5, -0.5), Vec3::new(1.0, 0.0, 0.0),
+              Vec2::new(1.0, 0.0)),
+  Vertex::new(Vec2::new( 0.5, -0.5), Vec3::new(0.0, 1.0, 0.0),
+              Vec2::new(0.0, 0.0)),
+  Vertex::new(Vec2::new( 0.5,  0.5), Vec3::new(0.0, 0.0, 1.0),
+              Vec2::new(0.0, 1.0)),
+  Vertex::new(Vec2::new(-0.5,  0.5), Vec3::new(1.0, 1.0, 1.0),
+              Vec2::new(1.0, 1.0)),
+];
+
+pub const INDICES: &[u16] = &[0, 1, 2, 2, 3, 0];
+
+
+#[repr(C)]
+#[derive(Clone, Debug)]
+pub struct Vertex<T: Copy> {
+  pub position: Vec2<T>,
+  pub color: Vec3<T>,
+  pub texture_coordinates: Vec2<T>,
+}
+
+#[repr(C)]
+#[derive(Clone, Debug)]
+pub struct UniformBlock<T: Copy> {
+  pub scale: Vec3<T>,
+  pub model: Transformation<T>,
+  pub view: Transformation<T>,
+  pub projection: Mat4<T>,
+}
+
+impl<T: Copy> Vertex<T> {
+  const fn new(position: Vec2<T>, color: Vec3<T>,
+               texture_coordinates: Vec2<T>)
+      -> Self
+  {
+    Self { position, color, texture_coordinates }
+  }
+
+  pub fn binding_description() -> vk::VertexInputBindingDescription {
+    vk::VertexInputBindingDescription::builder()
+        .binding(0)
+        .stride(size_of::<Vertex<f32>>() as u32)
+        .input_rate(vk::VertexInputRate::VERTEX)
+        .build()
+  }
+
+  pub fn attribute_descriptions()
+      -> [vk::VertexInputAttributeDescription; 3]
+  {
+    let position = vk::VertexInputAttributeDescription::builder()
+            .binding(0)
+            .location(0)
+            .format(vk::Format::R32G32_SFLOAT)
+            .offset(0)
+            .build();
+
+    let color = vk::VertexInputAttributeDescription::builder()
+            .binding(0)
+            .location(1)
+            .format(vk::Format::R32G32B32_SFLOAT)
+            .offset(size_of::<Vec2<f32>>() as u32)
+            .build();
+
+    let texture_coordinates = vk::VertexInputAttributeDescription::builder()
+            .binding(0)
+            .location(2)
+            .format(vk::Format::R32G32_SFLOAT)
+            .offset((size_of::<Vec2<f32>>() + size_of::<Vec3<f32>>()) as u32)
+            .build();
+
+    [position, color, texture_coordinates]
+  }
+}
+