From 3bcbbe6c71eb95054b32b4e0634d562d5d63f4f2 Mon Sep 17 00:00:00 2001 From: Sergiusz Bazanski Date: Mon, 16 Mar 2020 00:24:28 +0100 Subject: [PATCH] h y p e r c u b e s --- engine/src/main.rs | 77 +++++++++++++++++++++++++-------- engine/src/render/mod.rs | 33 +++++--------- engine/src/render/vulkan/mod.rs | 14 +++--- 3 files changed, 76 insertions(+), 48 deletions(-) diff --git a/engine/src/main.rs b/engine/src/main.rs index f96dc4a..3dc6900 100644 --- a/engine/src/main.rs +++ b/engine/src/main.rs @@ -1,6 +1,7 @@ use log; use env_logger; use std::sync::Arc; +use std::time; use cgmath as cgm; @@ -8,7 +9,7 @@ mod render; mod util; use render::vulkan::data; -use render::renderable::Renderable; +use render::renderable::{Object, Renderable}; fn main() { env_logger::init(); @@ -16,28 +17,70 @@ fn main() { let mesh_cube = { let vertices = Arc::new(vec![ - data::Vertex::new([-0.5, -0.5, 0.0], [1.0, 0.0, 0.0]), - data::Vertex::new([0.5, -0.5, 0.0], [0.0, 1.0, 0.0]), - data::Vertex::new([0.5, 0.5, 0.0], [0.0, 0.0, 1.0]), - data::Vertex::new([-0.5, 0.5, 0.0], [1.0, 1.0, 1.0]) + data::Vertex::new([-0.5, -0.5, -0.5], [1.0, 0.0, 0.0]), + data::Vertex::new([0.5, -0.5, -0.5], [0.0, 1.0, 0.0]), + data::Vertex::new([0.5, 0.5, -0.5], [0.0, 0.0, 1.0]), + data::Vertex::new([-0.5, 0.5, -0.5], [1.0, 1.0, 1.0]), + data::Vertex::new([-0.5, -0.5, 0.5], [1.0, 1.0, 1.0]), + data::Vertex::new([0.5, -0.5, 0.5], [1.0, 1.0, 0.0]), + data::Vertex::new([0.5, 0.5, 0.5], [0.0, 1.0, 1.0]), + data::Vertex::new([-0.5, 0.5, 0.5], [1.0, 0.0, 1.0]), ]); let indices = Arc::new(vec![ - 0, 1, 2, 2, 3, 0, + // bottom + 2, 1, 0, 0, 3, 2, + // top + 4, 5, 6, 6, 7, 4, + + // left + 4, 7, 0, 0, 7, 3, + // right + 5, 1, 6, 6, 1, 2, + // front + 7, 6, 3, 3, 6, 2, + // back + 5, 4, 1, 1, 4, 0, ]); Arc::new(render::renderable::Mesh::new(vertices, indices)) }; - let mut renderables: Vec> = Vec::new(); - for i in 1..100000 { - let transform = cgm::Matrix4::from_translation(cgm::Vector3::new(0.0, 0.0, (i as f32)/1000.0)); - let cube = render::renderable::Object { - mesh: mesh_cube.clone(), - transform - }; - renderables.push(Arc::new(cube)); + let mut renderer = render::Renderer::initialize(); + + let mut cubes: Vec> = Vec::new(); + for x in -10..10 { + for y in -10..10 { + for z in -10..10 { + let transform = cgm::Matrix4::from_translation(cgm::Vector3::new((x as f32)*4.0, (y as f32)*2.0, (z as f32)*4.0)); + let cube = render::renderable::Object { + mesh: mesh_cube.clone(), + transform + }; + cubes.push(Arc::new(cube)); + } + } } - let mut renderer = render::Renderer::initialize(); - renderer.set_renderables(renderables); - renderer.main_loop(); + let mut renderables: Vec> = Vec::with_capacity(2000); + for c in cubes.iter() { + renderables.push(c.clone()); + } + + let start = time::Instant::now(); + loop { + let instant_ns = time::Instant::now().duration_since(start).as_nanos() as u64; + let instant = ((instant_ns/1000) as f32) / 1_000_000.0; + + let position = (instant / 10.0) * 3.14 * 2.0; + + let view = cgm::Matrix4::look_at( + cgm::Point3::new(position.cos() * 5.0, position.sin() * 5.0, 2.0), + cgm::Point3::new(0.0, 0.0, 0.0), + cgm::Vector3::new(0.0, 0.0, 1.0) + ); + + renderer.draw_frame(&view, &renderables); + if renderer.poll_close() { + return; + } + } } diff --git a/engine/src/render/mod.rs b/engine/src/render/mod.rs index 0524b88..9ba72f1 100644 --- a/engine/src/render/mod.rs +++ b/engine/src/render/mod.rs @@ -1,5 +1,7 @@ use std::sync::Arc; +use cgmath as cgm; + use winit::{ dpi::LogicalSize, Window, @@ -21,8 +23,6 @@ const HEIGHT: u32 = 600; pub struct Renderer { instance: vulkan::Instance, events_loop: EventsLoop, - - renderables: Vec>, } impl Renderer { @@ -34,14 +34,9 @@ impl Renderer { Self { instance, events_loop, - renderables: vec![], } } - pub fn set_renderables(&mut self, renderables: Vec>) { - self.renderables = renderables; - } - fn init_window(instance: Arc) -> (EventsLoop, Arc>) { let events_loop = EventsLoop::new(); let surface = WindowBuilder::new() @@ -52,23 +47,17 @@ impl Renderer { (events_loop, surface) } - fn draw_frame(&mut self) { - self.instance.flip(self.renderables.clone()); + pub fn draw_frame(&mut self, view: &cgm::Matrix4, renderables: &Vec>) { + self.instance.flip(view, renderables); } - pub fn main_loop(&mut self) { - loop { - self.draw_frame(); - - let mut done = false; - self.events_loop.poll_events(|ev| { - if let Event::WindowEvent { event: WindowEvent::CloseRequested, .. } = ev { - done = true - } - }); - if done { - return; + pub fn poll_close(&mut self) -> bool { + let mut close = false; + self.events_loop.poll_events(|ev| { + if let Event::WindowEvent { event: WindowEvent::CloseRequested, .. } = ev { + close = true; } - } + }); + return close; } } diff --git a/engine/src/render/vulkan/mod.rs b/engine/src/render/vulkan/mod.rs index a943871..a74b1be 100644 --- a/engine/src/render/vulkan/mod.rs +++ b/engine/src/render/vulkan/mod.rs @@ -143,16 +143,11 @@ impl Instance { fn make_graphics_commands( &mut self, + view: &cgm::Matrix4, renderables: &Vec>, ) -> Vec> { let dimensions = self.dimensions(); - - let view = cgm::Matrix4::look_at( - cgm::Point3::new(2.0, 2.0, 2.0), - cgm::Point3::new(0.0, 0.0, 0.0), - cgm::Vector3::new(0.0, 0.0, 1.0) - ); let proj = cgm::perspective( cgm::Rad::from(cgm::Deg(45.0)), dimensions[0] / dimensions[1], @@ -228,10 +223,11 @@ impl Instance { // (╯°□°)╯︵ ┻━┻ pub fn flip( &mut self, - renderables: Vec>, + view: &cgm::Matrix4, + renderables: &Vec>, ) { // Build batch command buffer as early as possible. - let mut batches = self.make_graphics_commands(&renderables); + let mut batches = self.make_graphics_commands(view, renderables); match &self.previous_frame_end { None => (), @@ -241,7 +237,7 @@ impl Instance { if !self.armed { self.arm(); // Rearming means the batch is invalid - rebuild it. - batches = self.make_graphics_commands(&renderables); + batches = self.make_graphics_commands(view, renderables); } let chain = self.swapchain_binding().chain.clone();