h y p e r c u b e s
parent
91018922cb
commit
3bcbbe6c71
|
@ -1,6 +1,7 @@
|
||||||
use log;
|
use log;
|
||||||
use env_logger;
|
use env_logger;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::time;
|
||||||
|
|
||||||
use cgmath as cgm;
|
use cgmath as cgm;
|
||||||
|
|
||||||
|
@ -8,7 +9,7 @@ mod render;
|
||||||
mod util;
|
mod util;
|
||||||
|
|
||||||
use render::vulkan::data;
|
use render::vulkan::data;
|
||||||
use render::renderable::Renderable;
|
use render::renderable::{Object, Renderable};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
env_logger::init();
|
env_logger::init();
|
||||||
|
@ -16,28 +17,70 @@ fn main() {
|
||||||
|
|
||||||
let mesh_cube = {
|
let mesh_cube = {
|
||||||
let vertices = Arc::new(vec![
|
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.5], [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.5], [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.5], [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, 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![
|
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))
|
Arc::new(render::renderable::Mesh::new(vertices, indices))
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut renderables: Vec<Arc<dyn Renderable>> = Vec::new();
|
let mut renderer = render::Renderer::initialize();
|
||||||
for i in 1..100000 {
|
|
||||||
let transform = cgm::Matrix4::from_translation(cgm::Vector3::new(0.0, 0.0, (i as f32)/1000.0));
|
let mut cubes: Vec<Arc<Object>> = Vec::new();
|
||||||
let cube = render::renderable::Object {
|
for x in -10..10 {
|
||||||
mesh: mesh_cube.clone(),
|
for y in -10..10 {
|
||||||
transform
|
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));
|
||||||
renderables.push(Arc::new(cube));
|
let cube = render::renderable::Object {
|
||||||
|
mesh: mesh_cube.clone(),
|
||||||
|
transform
|
||||||
|
};
|
||||||
|
cubes.push(Arc::new(cube));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut renderer = render::Renderer::initialize();
|
let mut renderables: Vec<Arc<dyn Renderable>> = Vec::with_capacity(2000);
|
||||||
renderer.set_renderables(renderables);
|
for c in cubes.iter() {
|
||||||
renderer.main_loop();
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use cgmath as cgm;
|
||||||
|
|
||||||
use winit::{
|
use winit::{
|
||||||
dpi::LogicalSize,
|
dpi::LogicalSize,
|
||||||
Window,
|
Window,
|
||||||
|
@ -21,8 +23,6 @@ const HEIGHT: u32 = 600;
|
||||||
pub struct Renderer {
|
pub struct Renderer {
|
||||||
instance: vulkan::Instance<winit::Window>,
|
instance: vulkan::Instance<winit::Window>,
|
||||||
events_loop: EventsLoop,
|
events_loop: EventsLoop,
|
||||||
|
|
||||||
renderables: Vec<Arc<dyn renderable::Renderable>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Renderer {
|
impl Renderer {
|
||||||
|
@ -34,14 +34,9 @@ impl Renderer {
|
||||||
Self {
|
Self {
|
||||||
instance,
|
instance,
|
||||||
events_loop,
|
events_loop,
|
||||||
renderables: vec![],
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_renderables(&mut self, renderables: Vec<Arc<dyn renderable::Renderable>>) {
|
|
||||||
self.renderables = renderables;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn init_window(instance: Arc<vi::Instance>) -> (EventsLoop, Arc<vs::Surface<Window>>) {
|
fn init_window(instance: Arc<vi::Instance>) -> (EventsLoop, Arc<vs::Surface<Window>>) {
|
||||||
let events_loop = EventsLoop::new();
|
let events_loop = EventsLoop::new();
|
||||||
let surface = WindowBuilder::new()
|
let surface = WindowBuilder::new()
|
||||||
|
@ -52,23 +47,17 @@ impl Renderer {
|
||||||
(events_loop, surface)
|
(events_loop, surface)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn draw_frame(&mut self) {
|
pub fn draw_frame(&mut self, view: &cgm::Matrix4<f32>, renderables: &Vec<Arc<dyn renderable::Renderable>>) {
|
||||||
self.instance.flip(self.renderables.clone());
|
self.instance.flip(view, renderables);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main_loop(&mut self) {
|
pub fn poll_close(&mut self) -> bool {
|
||||||
loop {
|
let mut close = false;
|
||||||
self.draw_frame();
|
self.events_loop.poll_events(|ev| {
|
||||||
|
if let Event::WindowEvent { event: WindowEvent::CloseRequested, .. } = ev {
|
||||||
let mut done = false;
|
close = true;
|
||||||
self.events_loop.poll_events(|ev| {
|
|
||||||
if let Event::WindowEvent { event: WindowEvent::CloseRequested, .. } = ev {
|
|
||||||
done = true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if done {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
return close;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,16 +143,11 @@ impl<WT: 'static + Send + Sync> Instance<WT> {
|
||||||
|
|
||||||
fn make_graphics_commands(
|
fn make_graphics_commands(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
view: &cgm::Matrix4<f32>,
|
||||||
renderables: &Vec<Arc<dyn renderable::Renderable>>,
|
renderables: &Vec<Arc<dyn renderable::Renderable>>,
|
||||||
) -> Vec<Box<vc::AutoCommandBuffer>> {
|
) -> Vec<Box<vc::AutoCommandBuffer>> {
|
||||||
|
|
||||||
let dimensions = self.dimensions();
|
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(
|
let proj = cgm::perspective(
|
||||||
cgm::Rad::from(cgm::Deg(45.0)),
|
cgm::Rad::from(cgm::Deg(45.0)),
|
||||||
dimensions[0] / dimensions[1],
|
dimensions[0] / dimensions[1],
|
||||||
|
@ -228,10 +223,11 @@ impl<WT: 'static + Send + Sync> Instance<WT> {
|
||||||
// (╯°□°)╯︵ ┻━┻
|
// (╯°□°)╯︵ ┻━┻
|
||||||
pub fn flip(
|
pub fn flip(
|
||||||
&mut self,
|
&mut self,
|
||||||
renderables: Vec<Arc<dyn renderable::Renderable>>,
|
view: &cgm::Matrix4<f32>,
|
||||||
|
renderables: &Vec<Arc<dyn renderable::Renderable>>,
|
||||||
) {
|
) {
|
||||||
// Build batch command buffer as early as possible.
|
// 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 {
|
match &self.previous_frame_end {
|
||||||
None => (),
|
None => (),
|
||||||
|
@ -241,7 +237,7 @@ impl<WT: 'static + Send + Sync> Instance<WT> {
|
||||||
if !self.armed {
|
if !self.armed {
|
||||||
self.arm();
|
self.arm();
|
||||||
// Rearming means the batch is invalid - rebuild it.
|
// 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();
|
let chain = self.swapchain_binding().chain.clone();
|
||||||
|
|
Loading…
Reference in New Issue