|
|
@ -1,4 +1,3 @@
|
|
|
|
#![feature(inherent_str_constructors)]
|
|
|
|
|
|
|
|
#![allow(unused_variables, unused_mut)]
|
|
|
|
#![allow(unused_variables, unused_mut)]
|
|
|
|
|
|
|
|
|
|
|
|
use ash::Device;
|
|
|
|
use ash::Device;
|
|
|
@ -6,6 +5,7 @@ use ash::Entry;
|
|
|
|
use ash::Instance;
|
|
|
|
use ash::Instance;
|
|
|
|
use ash::khr::{surface, swapchain};
|
|
|
|
use ash::khr::{surface, swapchain};
|
|
|
|
use ash::vk;
|
|
|
|
use ash::vk;
|
|
|
|
|
|
|
|
use ash::vk::ImageCreateFlags;
|
|
|
|
use sdl2::mouse::MouseUtil;
|
|
|
|
use sdl2::mouse::MouseUtil;
|
|
|
|
|
|
|
|
|
|
|
|
use std::cmp;
|
|
|
|
use std::cmp;
|
|
|
@ -26,7 +26,6 @@ use sdl2::video::Window;
|
|
|
|
const APP_NAME: &str = "MineClone";
|
|
|
|
const APP_NAME: &str = "MineClone";
|
|
|
|
|
|
|
|
|
|
|
|
const MOV_STEP: f32 = 0.05;
|
|
|
|
const MOV_STEP: f32 = 0.05;
|
|
|
|
const ROT_STEP: f32 = 0.05;
|
|
|
|
|
|
|
|
const ROT_MOUSE_SCALE: f32 = 0.001;
|
|
|
|
const ROT_MOUSE_SCALE: f32 = 0.001;
|
|
|
|
|
|
|
|
|
|
|
|
const MAX_WIDTH: u32 = 3440;
|
|
|
|
const MAX_WIDTH: u32 = 3440;
|
|
|
@ -34,26 +33,123 @@ const MAX_HEIGHT: u32 = 1440;
|
|
|
|
|
|
|
|
|
|
|
|
const MESH_SIZE: u64 = 36 * 2 * 4 * 4;
|
|
|
|
const MESH_SIZE: u64 = 36 * 2 * 4 * 4;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[rustfmt::skip]
|
|
|
|
const POSITIONS: [f32; 36 * 2 * 4] = [
|
|
|
|
const POSITIONS: [f32; 36 * 2 * 4] = [
|
|
|
|
// BOTTOM
|
|
|
|
// BOTTOM
|
|
|
|
-0.5, 0.5, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.5, 0.5, 2.0, 1.0, 0.0, 1.0, 0.0, 0.0, -0.5, 0.5, 2.0,
|
|
|
|
|
|
|
|
1.0, 0.0, 1.0, 0.0, 0.0, 0.5, 0.5, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.5, 0.5, 2.0, 1.0, 0.0, 1.0,
|
|
|
|
-0.5, 0.5, -0.5, 1.0,
|
|
|
|
0.0, 0.0, -0.5, 0.5, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, // TOP
|
|
|
|
0.0, 1.0, 0.0, 0.0,
|
|
|
|
0.5, -0.5, 2.0, 1.0, 0.0, -1.0, 0.0, 0.0, -0.5, -0.5, 1.0, 1.0, 0.0, -1.0, 0.0, 0.0, -0.5,
|
|
|
|
|
|
|
|
-0.5, 2.0, 1.0, 0.0, -1.0, 0.0, 0.0, 0.5, -0.5, 2.0, 1.0, 0.0, -1.0, 0.0, 0.0, 0.5, -0.5, 1.0,
|
|
|
|
0.5, 0.5, 0.5, 1.0,
|
|
|
|
1.0, 0.0, -1.0, 0.0, 0.0, -0.5, -0.5, 1.0, 1.0, 0.0, -1.0, 0.0, 0.0, // FRONT
|
|
|
|
0.0, 1.0, 0.0, 0.0,
|
|
|
|
-0.5, -0.5, 1.0, 1.0, 0.0, 0.0, -1.0, 0.0, 0.5, 0.5, 1.0, 1.0, 0.0, 0.0, -1.0, 0.0, -0.5, 0.5,
|
|
|
|
|
|
|
|
1.0, 1.0, 0.0, 0.0, -1.0, 0.0, 0.5, -0.5, 1.0, 1.0, 0.0, 0.0, -1.0, 0.0, 0.5, 0.5, 1.0, 1.0,
|
|
|
|
-0.5, 0.5, 0.5, 1.0,
|
|
|
|
0.0, 0.0, -1.0, 0.0, -0.5, -0.5, 1.0, 1.0, 0.0, 0.0, -1.0, 0.0, // BACK
|
|
|
|
0.0, 1.0, 0.0, 0.0,
|
|
|
|
0.5, 0.5, 2.0, 1.0, 0.0, 0.0, 1.0, 0.0, -0.5, -0.5, 2.0, 1.0, 0.0, 0.0, 1.0, 0.0, -0.5, 0.5,
|
|
|
|
|
|
|
|
2.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.5, 0.5, 2.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.5, -0.5, 2.0, 1.0, 0.0,
|
|
|
|
0.5, 0.5, -0.5, 1.0,
|
|
|
|
0.0, 1.0, 0.0, -0.5, -0.5, 2.0, 1.0, 0.0, 0.0, 1.0, 0.0, // LEFT
|
|
|
|
0.0, 1.0, 0.0, 0.0,
|
|
|
|
-0.5, -0.5, 1.0, 1.0, -1.0, 0.0, 0.0, 0.0, -0.5, 0.5, 2.0, 1.0, -1.0, 0.0, 0.0, 0.0, -0.5,
|
|
|
|
|
|
|
|
-0.5, 2.0, 1.0, -1.0, 0.0, 0.0, 0.0, -0.5, 0.5, 1.0, 1.0, -1.0, 0.0, 0.0, 0.0, -0.5, 0.5, 2.0,
|
|
|
|
0.5, 0.5, 0.5, 1.0,
|
|
|
|
1.0, -1.0, 0.0, 0.0, 0.0, -0.5, -0.5, 1.0, 1.0, -1.0, 0.0, 0.0, 0.0, // RIGHT
|
|
|
|
0.0, 1.0, 0.0, 0.0,
|
|
|
|
0.5, 0.5, 2.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.5, -0.5, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.5, -0.5,
|
|
|
|
|
|
|
|
2.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.5, 0.5, 2.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.5, 0.5, 1.0, 1.0, 1.0,
|
|
|
|
-0.5, 0.5, -0.5, 1.0,
|
|
|
|
0.0, 0.0, 0.0, 0.5, -0.5, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0,
|
|
|
|
0.0, 1.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TOP
|
|
|
|
|
|
|
|
0.5, -0.5, 0.5, 1.0,
|
|
|
|
|
|
|
|
0.0, -1.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-0.5, -0.5, -0.5, 1.0,
|
|
|
|
|
|
|
|
0.0, -1.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-0.5, -0.5, 0.5, 1.0,
|
|
|
|
|
|
|
|
0.0, -1.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.5, -0.5, 0.5, 1.0,
|
|
|
|
|
|
|
|
0.0, -1.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.5, -0.5, -0.5, 1.0,
|
|
|
|
|
|
|
|
0.0, -1.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-0.5, -0.5, -0.5, 1.0,
|
|
|
|
|
|
|
|
0.0, -1.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// FRONT
|
|
|
|
|
|
|
|
-0.5, -0.5, -0.5, 1.0,
|
|
|
|
|
|
|
|
0.0, 0.0, -1.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.5, 0.5, -0.5, 1.0,
|
|
|
|
|
|
|
|
0.0, 0.0, -1.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-0.5, 0.5, -0.5, 1.0,
|
|
|
|
|
|
|
|
0.0, 0.0, -1.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.5, -0.5, -0.5, 1.0,
|
|
|
|
|
|
|
|
0.0, 0.0, -1.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.5, 0.5, -0.5, 1.0,
|
|
|
|
|
|
|
|
0.0, 0.0, -1.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-0.5, -0.5, -0.5, 1.0,
|
|
|
|
|
|
|
|
0.0, 0.0, -1.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// BACK
|
|
|
|
|
|
|
|
0.5, 0.5, 0.5, 1.0,
|
|
|
|
|
|
|
|
0.0, 0.0, 1.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-0.5, -0.5, 0.5, 1.0,
|
|
|
|
|
|
|
|
0.0, 0.0, 1.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-0.5, 0.5, 0.5, 1.0,
|
|
|
|
|
|
|
|
0.0, 0.0, 1.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.5, 0.5, 0.5, 1.0,
|
|
|
|
|
|
|
|
0.0, 0.0, 1.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.5, -0.5, 0.5, 1.0,
|
|
|
|
|
|
|
|
0.0, 0.0, 1.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-0.5, -0.5, 0.5, 1.0,
|
|
|
|
|
|
|
|
0.0, 0.0, 1.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// LEFT
|
|
|
|
|
|
|
|
-0.5, -0.5, -0.5, 1.0,
|
|
|
|
|
|
|
|
-1.0, 0.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-0.5, 0.5, 0.5, 1.0,
|
|
|
|
|
|
|
|
-1.0, 0.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-0.5, -0.5, 0.5, 1.0,
|
|
|
|
|
|
|
|
-1.0, 0.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-0.5, 0.5, -0.5, 1.0,
|
|
|
|
|
|
|
|
-1.0, 0.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-0.5, 0.5, 0.5, 1.0,
|
|
|
|
|
|
|
|
-1.0, 0.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-0.5, -0.5, -0.5, 1.0,
|
|
|
|
|
|
|
|
-1.0, 0.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// RIGHT
|
|
|
|
|
|
|
|
0.5, 0.5, 0.5, 1.0,
|
|
|
|
|
|
|
|
1.0, 0.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
0.5, -0.5, -0.5, 1.0,
|
|
|
|
|
|
|
|
1.0, 0.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.5, -0.5, 0.5, 1.0,
|
|
|
|
|
|
|
|
1.0, 0.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.5, 0.5, 0.5, 1.0,
|
|
|
|
|
|
|
|
1.0, 0.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.5, 0.5, -0.5, 1.0,
|
|
|
|
|
|
|
|
1.0, 0.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.5, -0.5, -0.5, 1.0,
|
|
|
|
|
|
|
|
1.0, 0.0, 0.0, 0.0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
];
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
fn create_instance(window: &Window, entry: &Entry) -> Instance {
|
|
|
|
fn create_instance(window: &Window, entry: &Entry) -> Instance {
|
|
|
@ -106,7 +202,7 @@ fn find_pdev_dgpu(instance: &Instance) -> vk::PhysicalDevice {
|
|
|
|
// Fix.
|
|
|
|
// Fix.
|
|
|
|
println!(
|
|
|
|
println!(
|
|
|
|
"Found discrete GPU: {}",
|
|
|
|
"Found discrete GPU: {}",
|
|
|
|
str::from_utf8(std::mem::transmute(props.device_name.as_slice())).unwrap()
|
|
|
|
std::str::from_utf8(std::mem::transmute(props.device_name.as_slice())).unwrap()
|
|
|
|
);
|
|
|
|
);
|
|
|
|
return pdevs.remove(i);
|
|
|
|
return pdevs.remove(i);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -339,7 +435,12 @@ fn setup_desc_layout(dev: &Device) -> vk::DescriptorSetLayout {
|
|
|
|
.descriptor_type(vk::DescriptorType::STORAGE_BUFFER)
|
|
|
|
.descriptor_type(vk::DescriptorType::STORAGE_BUFFER)
|
|
|
|
.descriptor_count(1)
|
|
|
|
.descriptor_count(1)
|
|
|
|
.stage_flags(vk::ShaderStageFlags::VERTEX);
|
|
|
|
.stage_flags(vk::ShaderStageFlags::VERTEX);
|
|
|
|
let layouts = [storage_binding];
|
|
|
|
let image_binding = vk::DescriptorSetLayoutBinding::default()
|
|
|
|
|
|
|
|
.binding(1)
|
|
|
|
|
|
|
|
.descriptor_type(vk::DescriptorType::COMBINED_IMAGE_SAMPLER)
|
|
|
|
|
|
|
|
.descriptor_count(1)
|
|
|
|
|
|
|
|
.stage_flags(vk::ShaderStageFlags::FRAGMENT);
|
|
|
|
|
|
|
|
let layouts = [storage_binding, image_binding];
|
|
|
|
|
|
|
|
|
|
|
|
let layout_info = vk::DescriptorSetLayoutCreateInfo::default().bindings(&layouts);
|
|
|
|
let layout_info = vk::DescriptorSetLayoutCreateInfo::default().bindings(&layouts);
|
|
|
|
let layout = unsafe {
|
|
|
|
let layout = unsafe {
|
|
|
@ -453,11 +554,11 @@ fn setup_shader_stage(
|
|
|
|
let vert_stage = vk::PipelineShaderStageCreateInfo::default()
|
|
|
|
let vert_stage = vk::PipelineShaderStageCreateInfo::default()
|
|
|
|
.stage(vk::ShaderStageFlags::VERTEX)
|
|
|
|
.stage(vk::ShaderStageFlags::VERTEX)
|
|
|
|
.module(vert_shader)
|
|
|
|
.module(vert_shader)
|
|
|
|
.name(CStr::from_bytes_with_nul(b"main\0").unwrap());
|
|
|
|
.name(c"main");
|
|
|
|
let frag_stage = vk::PipelineShaderStageCreateInfo::default()
|
|
|
|
let frag_stage = vk::PipelineShaderStageCreateInfo::default()
|
|
|
|
.stage(vk::ShaderStageFlags::FRAGMENT)
|
|
|
|
.stage(vk::ShaderStageFlags::FRAGMENT)
|
|
|
|
.module(frag_shader)
|
|
|
|
.module(frag_shader)
|
|
|
|
.name(CStr::from_bytes_with_nul(b"main\0").unwrap());
|
|
|
|
.name(c"main");
|
|
|
|
[vert_stage, frag_stage]
|
|
|
|
[vert_stage, frag_stage]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -474,7 +575,7 @@ fn setup_pipeline(
|
|
|
|
.topology(vk::PrimitiveTopology::TRIANGLE_LIST);
|
|
|
|
.topology(vk::PrimitiveTopology::TRIANGLE_LIST);
|
|
|
|
let rasterization = vk::PipelineRasterizationStateCreateInfo::default()
|
|
|
|
let rasterization = vk::PipelineRasterizationStateCreateInfo::default()
|
|
|
|
.polygon_mode(vk::PolygonMode::FILL)
|
|
|
|
.polygon_mode(vk::PolygonMode::FILL)
|
|
|
|
.cull_mode(vk::CullModeFlags::BACK)
|
|
|
|
.cull_mode(vk::CullModeFlags::NONE)
|
|
|
|
.front_face(vk::FrontFace::CLOCKWISE)
|
|
|
|
.front_face(vk::FrontFace::CLOCKWISE)
|
|
|
|
.line_width(1.0);
|
|
|
|
.line_width(1.0);
|
|
|
|
let multisample = vk::PipelineMultisampleStateCreateInfo::default()
|
|
|
|
let multisample = vk::PipelineMultisampleStateCreateInfo::default()
|
|
|
@ -601,10 +702,14 @@ fn setup_swapchain(
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn setup_desc_pool(dev: &Device) -> vk::DescriptorPool {
|
|
|
|
fn setup_desc_pool(dev: &Device) -> vk::DescriptorPool {
|
|
|
|
let pool_size = vk::DescriptorPoolSize::default()
|
|
|
|
let pool_size_storage = vk::DescriptorPoolSize::default()
|
|
|
|
.ty(vk::DescriptorType::STORAGE_BUFFER)
|
|
|
|
.ty(vk::DescriptorType::STORAGE_BUFFER)
|
|
|
|
.descriptor_count(1);
|
|
|
|
.descriptor_count(1);
|
|
|
|
let pool_sizes = [pool_size];
|
|
|
|
let pool_size_image = vk::DescriptorPoolSize::default()
|
|
|
|
|
|
|
|
.ty(vk::DescriptorType::COMBINED_IMAGE_SAMPLER)
|
|
|
|
|
|
|
|
.descriptor_count(1);
|
|
|
|
|
|
|
|
let pool_sizes = [pool_size_storage, pool_size_image];
|
|
|
|
|
|
|
|
|
|
|
|
let pool_info = vk::DescriptorPoolCreateInfo::default()
|
|
|
|
let pool_info = vk::DescriptorPoolCreateInfo::default()
|
|
|
|
.max_sets(1)
|
|
|
|
.max_sets(1)
|
|
|
|
.pool_sizes(&pool_sizes);
|
|
|
|
.pool_sizes(&pool_sizes);
|
|
|
@ -718,7 +823,12 @@ fn make_desc_sets(dev: &Device, desc_pool: &vk::DescriptorPool) -> Vec<vk::Descr
|
|
|
|
sets
|
|
|
|
sets
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn write_desc_sets(dev: &Device, desc_sets: &Vec<vk::DescriptorSet>, mesh_buf: &vk::Buffer) {
|
|
|
|
fn write_desc_sets(
|
|
|
|
|
|
|
|
dev: &Device,
|
|
|
|
|
|
|
|
desc_sets: &Vec<vk::DescriptorSet>,
|
|
|
|
|
|
|
|
mesh_buf: &vk::Buffer,
|
|
|
|
|
|
|
|
image_view: vk::ImageView,
|
|
|
|
|
|
|
|
) {
|
|
|
|
let buf_info = vk::DescriptorBufferInfo::default()
|
|
|
|
let buf_info = vk::DescriptorBufferInfo::default()
|
|
|
|
.buffer(*mesh_buf)
|
|
|
|
.buffer(*mesh_buf)
|
|
|
|
.offset(0)
|
|
|
|
.offset(0)
|
|
|
@ -730,8 +840,20 @@ fn write_desc_sets(dev: &Device, desc_sets: &Vec<vk::DescriptorSet>, mesh_buf: &
|
|
|
|
.dst_array_element(0)
|
|
|
|
.dst_array_element(0)
|
|
|
|
.descriptor_type(vk::DescriptorType::STORAGE_BUFFER)
|
|
|
|
.descriptor_type(vk::DescriptorType::STORAGE_BUFFER)
|
|
|
|
.buffer_info(&buf_infos);
|
|
|
|
.buffer_info(&buf_infos);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let img_info = vk::DescriptorImageInfo::default()
|
|
|
|
|
|
|
|
.image_layout(vk::ImageLayout::UNDEFINED)
|
|
|
|
|
|
|
|
.image_view(image_view);
|
|
|
|
|
|
|
|
let img_infos = &[img_info];
|
|
|
|
|
|
|
|
let img_desc = vk::WriteDescriptorSet::default()
|
|
|
|
|
|
|
|
.dst_set(desc_sets[0])
|
|
|
|
|
|
|
|
.dst_binding(1)
|
|
|
|
|
|
|
|
.dst_array_element(0)
|
|
|
|
|
|
|
|
.descriptor_type(vk::DescriptorType::COMBINED_IMAGE_SAMPLER)
|
|
|
|
|
|
|
|
.image_info(img_infos);
|
|
|
|
|
|
|
|
|
|
|
|
unsafe {
|
|
|
|
unsafe {
|
|
|
|
dev.update_descriptor_sets(&[buf_desc], &[]);
|
|
|
|
dev.update_descriptor_sets(&[buf_desc, img_desc], &[]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -794,6 +916,8 @@ fn record_commands(
|
|
|
|
pipe: &vk::Pipeline,
|
|
|
|
pipe: &vk::Pipeline,
|
|
|
|
desc_sets: &Vec<vk::DescriptorSet>,
|
|
|
|
desc_sets: &Vec<vk::DescriptorSet>,
|
|
|
|
camera: &Camera,
|
|
|
|
camera: &Camera,
|
|
|
|
|
|
|
|
skybox_buffer: &vk::Buffer,
|
|
|
|
|
|
|
|
skybox_image: &vk::Image,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
let clear_vals = [
|
|
|
|
let clear_vals = [
|
|
|
|
vk::ClearValue {
|
|
|
|
vk::ClearValue {
|
|
|
@ -886,6 +1010,32 @@ fn record_commands(
|
|
|
|
48,
|
|
|
|
48,
|
|
|
|
base_color.as_ref(),
|
|
|
|
base_color.as_ref(),
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let regions = (0..6)
|
|
|
|
|
|
|
|
.map(|i| {
|
|
|
|
|
|
|
|
vk::BufferImageCopy::default()
|
|
|
|
|
|
|
|
.buffer_offset(3 * 2048 * 2048 * i)
|
|
|
|
|
|
|
|
.buffer_row_length(0)
|
|
|
|
|
|
|
|
.buffer_image_height(0)
|
|
|
|
|
|
|
|
.image_offset(vk::Offset3D::default())
|
|
|
|
|
|
|
|
.image_extent(vk::Extent3D::default().width(2048).height(2048).depth(1))
|
|
|
|
|
|
|
|
.image_subresource(
|
|
|
|
|
|
|
|
vk::ImageSubresourceLayers::default()
|
|
|
|
|
|
|
|
.aspect_mask(vk::ImageAspectFlags::COLOR)
|
|
|
|
|
|
|
|
.mip_level(0)
|
|
|
|
|
|
|
|
.layer_count(1)
|
|
|
|
|
|
|
|
.base_array_layer(i as u32),
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
.collect::<Vec<_>>();
|
|
|
|
|
|
|
|
dev.cmd_copy_buffer_to_image(
|
|
|
|
|
|
|
|
*cmd_buf,
|
|
|
|
|
|
|
|
*skybox_buffer,
|
|
|
|
|
|
|
|
*skybox_image,
|
|
|
|
|
|
|
|
vk::ImageLayout::GENERAL,
|
|
|
|
|
|
|
|
®ions,
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
dev.cmd_draw(*cmd_buf, 36, 1, 0, 0);
|
|
|
|
dev.cmd_draw(*cmd_buf, 36, 1, 0, 0);
|
|
|
|
dev.cmd_end_render_pass(*cmd_buf);
|
|
|
|
dev.cmd_end_render_pass(*cmd_buf);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -993,6 +1143,10 @@ fn handle_cont_key(keycode: Keycode, camera: &mut Camera, mouse: &MouseUtil) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fn decode_rif(raw: &[u8]) -> &[u8] {
|
|
|
|
|
|
|
|
&raw[18..]
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
fn main() {
|
|
|
|
let sdl_context = sdl2::init().unwrap();
|
|
|
|
let sdl_context = sdl2::init().unwrap();
|
|
|
|
let video_subsystem = sdl_context.video().unwrap();
|
|
|
|
let video_subsystem = sdl_context.video().unwrap();
|
|
|
@ -1069,6 +1223,68 @@ fn main() {
|
|
|
|
std::ptr::copy(POSITIONS.as_ptr(), mesh_mem as *mut f32, POSITIONS.len());
|
|
|
|
std::ptr::copy(POSITIONS.as_ptr(), mesh_mem as *mut f32, POSITIONS.len());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let (skybox_image, skybox_image_view, skybox_sampler) = {
|
|
|
|
|
|
|
|
let qf_idxs = [rcs_queue_inx];
|
|
|
|
|
|
|
|
let create_info = vk::ImageCreateInfo::default()
|
|
|
|
|
|
|
|
.flags(ImageCreateFlags::CUBE_COMPATIBLE)
|
|
|
|
|
|
|
|
.image_type(vk::ImageType::TYPE_2D)
|
|
|
|
|
|
|
|
.format(vk::Format::R8G8B8_UNORM)
|
|
|
|
|
|
|
|
.extent(vk::Extent3D::default().width(2048).height(2048).depth(1))
|
|
|
|
|
|
|
|
.mip_levels(1)
|
|
|
|
|
|
|
|
.array_layers(6)
|
|
|
|
|
|
|
|
.samples(vk::SampleCountFlags::TYPE_1)
|
|
|
|
|
|
|
|
.tiling(vk::ImageTiling::OPTIMAL)
|
|
|
|
|
|
|
|
.usage(vk::ImageUsageFlags::TRANSFER_DST | vk::ImageUsageFlags::SAMPLED)
|
|
|
|
|
|
|
|
.sharing_mode(vk::SharingMode::EXCLUSIVE)
|
|
|
|
|
|
|
|
.initial_layout(vk::ImageLayout::GENERAL)
|
|
|
|
|
|
|
|
.queue_family_indices(&qf_idxs);
|
|
|
|
|
|
|
|
let image =
|
|
|
|
|
|
|
|
unsafe { dev.create_image(&create_info, None) }.expect("Failed to create image");
|
|
|
|
|
|
|
|
let create_info = vk::ImageViewCreateInfo::default()
|
|
|
|
|
|
|
|
.image(image)
|
|
|
|
|
|
|
|
.view_type(vk::ImageViewType::CUBE)
|
|
|
|
|
|
|
|
.format(vk::Format::R8G8B8_UNORM)
|
|
|
|
|
|
|
|
.components(vk::ComponentMapping::default())
|
|
|
|
|
|
|
|
.subresource_range(
|
|
|
|
|
|
|
|
vk::ImageSubresourceRange::default()
|
|
|
|
|
|
|
|
.aspect_mask(vk::ImageAspectFlags::COLOR)
|
|
|
|
|
|
|
|
.base_mip_level(0)
|
|
|
|
|
|
|
|
.level_count(1)
|
|
|
|
|
|
|
|
.base_array_layer(0)
|
|
|
|
|
|
|
|
.layer_count(6),
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
let image_view = unsafe { dev.create_image_view(&create_info, None) }
|
|
|
|
|
|
|
|
.expect("Failed to create image view");
|
|
|
|
|
|
|
|
let create_info = vk::SamplerCreateInfo::default()
|
|
|
|
|
|
|
|
.mag_filter(vk::Filter::LINEAR)
|
|
|
|
|
|
|
|
.min_filter(vk::Filter::LINEAR)
|
|
|
|
|
|
|
|
.mipmap_mode(vk::SamplerMipmapMode::LINEAR)
|
|
|
|
|
|
|
|
.address_mode_u(vk::SamplerAddressMode::CLAMP_TO_EDGE)
|
|
|
|
|
|
|
|
.address_mode_v(vk::SamplerAddressMode::CLAMP_TO_EDGE)
|
|
|
|
|
|
|
|
.address_mode_w(vk::SamplerAddressMode::CLAMP_TO_EDGE)
|
|
|
|
|
|
|
|
.max_anisotropy(1.0)
|
|
|
|
|
|
|
|
.max_lod(1.0)
|
|
|
|
|
|
|
|
.border_color(vk::BorderColor::FLOAT_OPAQUE_WHITE);
|
|
|
|
|
|
|
|
let sampler =
|
|
|
|
|
|
|
|
unsafe { dev.create_sampler(&create_info, None) }.expect("Failed to create sampler");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(image, image_view, sampler)
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let skybox_mem = mem_alloc(&dev, host_visible_inx, 3 * 2048 * 2048 * 6);
|
|
|
|
|
|
|
|
let skybox_buf = alloc_buf(
|
|
|
|
|
|
|
|
&dev,
|
|
|
|
|
|
|
|
&skybox_mem,
|
|
|
|
|
|
|
|
3 * 2048 * 2048 * 6,
|
|
|
|
|
|
|
|
vk::BufferUsageFlags::TRANSFER_SRC,
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
let skybox_ptr = buf_to_ptr(&dev, &skybox_mem, &skybox_buf);
|
|
|
|
|
|
|
|
let img = std::fs::read("resources/skybox.rif").unwrap();
|
|
|
|
|
|
|
|
let data = decode_rif(&img);
|
|
|
|
|
|
|
|
unsafe {
|
|
|
|
|
|
|
|
std::ptr::copy(data.as_ptr(), skybox_ptr as *mut u8, data.len());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let vert_shader_bin = std::fs::read("shaders/vert.spv").unwrap();
|
|
|
|
let vert_shader_bin = std::fs::read("shaders/vert.spv").unwrap();
|
|
|
|
let frag_shader_bin = std::fs::read("shaders/frag.spv").unwrap();
|
|
|
|
let frag_shader_bin = std::fs::read("shaders/frag.spv").unwrap();
|
|
|
|
|
|
|
|
|
|
|
@ -1127,7 +1343,7 @@ fn main() {
|
|
|
|
|
|
|
|
|
|
|
|
let desc_sets = make_desc_sets(&dev, &desc_pool);
|
|
|
|
let desc_sets = make_desc_sets(&dev, &desc_pool);
|
|
|
|
|
|
|
|
|
|
|
|
write_desc_sets(&dev, &desc_sets, &mesh_buf);
|
|
|
|
write_desc_sets(&dev, &desc_sets, &mesh_buf, skybox_image_view);
|
|
|
|
|
|
|
|
|
|
|
|
let sem_avail = make_sem(&dev);
|
|
|
|
let sem_avail = make_sem(&dev);
|
|
|
|
let sem_finish = make_sem(&dev);
|
|
|
|
let sem_finish = make_sem(&dev);
|
|
|
@ -1164,7 +1380,7 @@ fn main() {
|
|
|
|
.expect("Failed to wait for device idle");
|
|
|
|
.expect("Failed to wait for device idle");
|
|
|
|
swapchain_loader.destroy_swapchain(swapchain, None);
|
|
|
|
swapchain_loader.destroy_swapchain(swapchain, None);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
(swapchain, extents) = setup_swapchain(
|
|
|
|
(swapchain, _) = setup_swapchain(
|
|
|
|
&pdev,
|
|
|
|
&pdev,
|
|
|
|
&dev,
|
|
|
|
&dev,
|
|
|
|
&surface,
|
|
|
|
&surface,
|
|
|
@ -1202,10 +1418,9 @@ fn main() {
|
|
|
|
xrel,
|
|
|
|
xrel,
|
|
|
|
yrel,
|
|
|
|
yrel,
|
|
|
|
..
|
|
|
|
..
|
|
|
|
}
|
|
|
|
} if mouse.relative_mouse_mode() => {
|
|
|
|
// We only wanna do movement if the mouse is in relative mode (ie. its pinned to
|
|
|
|
// We only wanna do movement if the mouse is in relative mode (ie. its pinned to
|
|
|
|
// the center of the window and hidden)
|
|
|
|
// the center of the window and hidden)
|
|
|
|
if mouse.relative_mouse_mode() => {
|
|
|
|
|
|
|
|
camera.rotation.y -= xrel as f32 * ROT_MOUSE_SCALE;
|
|
|
|
camera.rotation.y -= xrel as f32 * ROT_MOUSE_SCALE;
|
|
|
|
camera.rotation.x -= yrel as f32 * ROT_MOUSE_SCALE;
|
|
|
|
camera.rotation.x -= yrel as f32 * ROT_MOUSE_SCALE;
|
|
|
|
mouse.warp_mouse_in_window(&window, width as i32 / 2, height as i32 / 2);
|
|
|
|
mouse.warp_mouse_in_window(&window, width as i32 / 2, height as i32 / 2);
|
|
|
@ -1244,6 +1459,8 @@ fn main() {
|
|
|
|
&pipe,
|
|
|
|
&pipe,
|
|
|
|
&desc_sets,
|
|
|
|
&desc_sets,
|
|
|
|
&camera,
|
|
|
|
&camera,
|
|
|
|
|
|
|
|
&skybox_buf,
|
|
|
|
|
|
|
|
&skybox_image,
|
|
|
|
);
|
|
|
|
);
|
|
|
|
end_cmd_buf(&dev, &cmd_buf);
|
|
|
|
end_cmd_buf(&dev, &cmd_buf);
|
|
|
|
|
|
|
|
|
|
|
|