@ -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,13 @@ 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 ,
skybox_sampler : vk ::Sampler
) {
let buf_info = vk ::DescriptorBufferInfo ::default ( )
let buf_info = vk ::DescriptorBufferInfo ::default ( )
. buffer ( * mesh_buf )
. buffer ( * mesh_buf )
. offset ( 0 )
. offset ( 0 )
@ -730,8 +841,21 @@ 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 ::GENERAL )
. image_view ( image_view )
. sampler ( skybox_sampler ) ;
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 +918,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 {
@ -820,6 +946,30 @@ fn record_commands(
. clear_values ( & clear_vals ) ;
. clear_values ( & clear_vals ) ;
unsafe {
unsafe {
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 ,
& regions ,
) ;
dev . cmd_begin_render_pass ( * cmd_buf , & render_pass_info , vk ::SubpassContents ::INLINE ) ;
dev . cmd_begin_render_pass ( * cmd_buf , & render_pass_info , vk ::SubpassContents ::INLINE ) ;
dev . cmd_bind_pipeline ( * cmd_buf , vk ::PipelineBindPoint ::GRAPHICS , * pipe ) ;
dev . cmd_bind_pipeline ( * cmd_buf , vk ::PipelineBindPoint ::GRAPHICS , * pipe ) ;
dev . cmd_bind_descriptor_sets (
dev . cmd_bind_descriptor_sets (
@ -886,6 +1036,9 @@ fn record_commands(
48 ,
48 ,
base_color . as_ref ( ) ,
base_color . as_ref ( ) ,
) ;
) ;
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 +1146,10 @@ fn handle_cont_key(keycode: Keycode, camera: &mut Camera, mouse: &MouseUtil) {
}
}
}
}
fn decode_rif ( raw : & [ u8 ] ) -> & [ u8 ] {
& raw [ 17 .. ]
}
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 ( ) ;
@ -1068,6 +1225,75 @@ fn main() {
unsafe {
unsafe {
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 ::UNDEFINED )
. queue_family_indices ( & qf_idxs ) ;
let image =
unsafe { dev . create_image ( & create_info , None ) } . expect ( "Failed to create image" ) ;
let skybox_mem_size : vk ::MemoryRequirements = unsafe { dev . get_image_memory_requirements ( image ) } ;
let skybox_dev_mem = mem_alloc ( & dev , host_invisible_inx , skybox_mem_size . size ) ;
unsafe {
dev . bind_image_memory ( image , skybox_dev_mem , 0 ) . expect ( "Failed to bind image memory" ) ;
}
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 +1353,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 , skybox_sampler );
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 +1390,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 +1428,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 +1469,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 ) ;