summary refs log tree commit diff
path: root/src/graphics/scene.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/graphics/scene.rs')
-rw-r--r--src/graphics/scene.rs62
1 files changed, 61 insertions, 1 deletions
diff --git a/src/graphics/scene.rs b/src/graphics/scene.rs
index 9631dba..b27b68b 100644
--- a/src/graphics/scene.rs
+++ b/src/graphics/scene.rs
@@ -1,6 +1,10 @@
 #![deny(unsafe_code)]
 use crate::error::*;
 use crate::graphics::Render;
+use crate::linear_algebra::{ Vec3, Vec4, Transformation };
+use crate::shader_data::{ Vertex, VertexPushBlock };
+
+use std::f32::consts::{ TAU };
 
 use vulkanalia::Device;
 use vulkanalia::vk::{ self, HasBuilder, DeviceV1_0 };
@@ -78,7 +82,24 @@ pub fn generate_scene_commands<'a>(image_index: usize, time: f32,
   }
 
   if let Some(model) = &render.model {
-    model.render(time, device, render, command_buffer);
+    model.make_active(device, render, command_buffer);
+
+    let (scale, mut transformation) = demo_spin_transformation(time);
+    apply_model_transformation(device, render, command_buffer,
+                               &scale, &transformation);
+    model.render(device, render, command_buffer);
+
+    transformation.translation = transformation.translation.add(
+        &Vec3::new(0.0, 4.0, 0.0));
+    apply_model_transformation(device, render, command_buffer,
+                               &scale, &transformation);
+    model.render(device, render, command_buffer);
+
+    transformation.translation = transformation.translation.add(
+        &Vec3::new(0.0, -8.0, 0.0));
+    apply_model_transformation(device, render, command_buffer,
+                               &scale, &transformation);
+    model.render(device, render, command_buffer);
   }
 
   unsafe { device.cmd_end_render_pass(*command_buffer) };
@@ -88,3 +109,42 @@ pub fn generate_scene_commands<'a>(image_index: usize, time: f32,
   Ok(command_buffer)
 }
 
+
+fn demo_spin_transformation(time: f32) -> (Vec3<f32>, Transformation<f32>) {
+  let scale = Vec3::new(1.0, 1.0, 1.0);
+
+  let transformation = Transformation {
+    rotation: Vec4::rotation_quaternion(&Vec3::new(0.0, 1.0, 0.0),
+                                        time % TAU),
+    translation: Vec3::new(0.0, 0.0, 0.0),
+  };
+
+  (scale, transformation)
+}
+
+
+#[allow(unsafe_code)]
+fn apply_model_transformation(device: &Device, render: &Render,
+                              command_buffer: &vk::CommandBuffer,
+                              scale: &Vec3<f32>,
+                              transformation: &Transformation<f32>)
+{
+  let push_block = VertexPushBlock::<f32> {
+    scale: scale.clone(),
+    model: transformation.clone(),
+  };
+  let size = size_of::<VertexPushBlock::<f32>>();
+  let push_block_bytes = unsafe {
+    std::slice::from_raw_parts(&push_block as *const VertexPushBlock<f32>
+                                           as *const u8,
+                               size)
+  };
+
+  unsafe {
+    device.cmd_push_constants(*command_buffer, render.pipeline_layout,
+                              vk::ShaderStageFlags::VERTEX,
+                              0,
+                              push_block_bytes)
+  };
+}
+