|
|
|
|
@@ -25,13 +25,13 @@ use winit::window::{Window, WindowBuilder};
|
|
|
|
|
|
|
|
|
|
use mesh::CPUMesh;
|
|
|
|
|
use pipelines::{Drawcall, LineShader};
|
|
|
|
|
use pipelines::{line_vs::ty::LinePushConstants};
|
|
|
|
|
use pipelines::line_vs::ty::LinePushConstants;
|
|
|
|
|
use pipelines::DefaultShader;
|
|
|
|
|
use pipelines::vs;
|
|
|
|
|
use pipelines::vs::ty::PushConstants;
|
|
|
|
|
|
|
|
|
|
use crate::config::RenderConfig;
|
|
|
|
|
use crate::vulkan::{gameobject::{GameObject, GameObjectHandle}};
|
|
|
|
|
use crate::vulkan::gameobject::{GameObject, GameObjectHandle};
|
|
|
|
|
|
|
|
|
|
pub mod pipelines;
|
|
|
|
|
pub mod gameobject;
|
|
|
|
|
@@ -83,6 +83,10 @@ pub struct MeshHandle {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub(crate) type TextureHandle = usize;
|
|
|
|
|
pub struct Texture {
|
|
|
|
|
pub image: Arc<ImmutableImage<Format>>,
|
|
|
|
|
pub sampler: Arc<Sampler>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub struct GameData {
|
|
|
|
|
pub start_time: SystemTime,
|
|
|
|
|
@@ -94,7 +98,7 @@ pub struct GameData {
|
|
|
|
|
pub shutdown: bool,
|
|
|
|
|
pub game_objects: Vec<GameObject>,
|
|
|
|
|
pub meshes: Vec<Mesh>,
|
|
|
|
|
pub textures: Vec<Arc<ImmutableImage<Format>>>,
|
|
|
|
|
pub textures: Vec<Texture>,
|
|
|
|
|
pub use_line_pipeline: bool,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -104,7 +108,6 @@ pub struct VulkanRenderer {
|
|
|
|
|
pub game_data: GameData,
|
|
|
|
|
pub device: Arc<Device>,
|
|
|
|
|
pub framebuffers: Vec<Arc<dyn FramebufferAbstract + Send + Sync>>,
|
|
|
|
|
pub sampler: Arc<Sampler>,
|
|
|
|
|
pub dynamic_state: DynamicState,
|
|
|
|
|
pub pipelines: Vec<Box<dyn Drawcall>>,
|
|
|
|
|
pub surface: Arc<Surface<Window>>,
|
|
|
|
|
@@ -243,10 +246,6 @@ impl VulkanRenderer {
|
|
|
|
|
// Render pass
|
|
|
|
|
let render_pass = renderpass::create_render_pass(device.clone(), &render_config, swapchain.format());
|
|
|
|
|
|
|
|
|
|
let sampler = Sampler::new(device.clone(), Filter::Linear, Filter::Linear,
|
|
|
|
|
MipmapMode::Nearest, SamplerAddressMode::Repeat, SamplerAddressMode::Repeat,
|
|
|
|
|
SamplerAddressMode::Repeat, 0.0, 1.0, 0.0, 0.0).unwrap();
|
|
|
|
|
|
|
|
|
|
let line_vertex_buffer = CpuAccessibleBuffer::from_iter(device.clone(), BufferUsage::vertex_buffer(), false, data.line_vertices.iter().cloned()).unwrap();
|
|
|
|
|
|
|
|
|
|
let pipelines: Vec<Box<dyn Drawcall>> = vec![
|
|
|
|
|
@@ -292,7 +291,7 @@ impl VulkanRenderer {
|
|
|
|
|
// that, we store the submission of the previous frame here.
|
|
|
|
|
let previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>);
|
|
|
|
|
|
|
|
|
|
(VulkanRenderer { game_data: data, device, framebuffers, sampler,
|
|
|
|
|
(VulkanRenderer { game_data: data, device, framebuffers,
|
|
|
|
|
dynamic_state, pipelines, uniform_buffers,
|
|
|
|
|
surface, swapchain, render_pass, queue,
|
|
|
|
|
recreate_swapchain: false, debug_callback, previous_frame_end,
|
|
|
|
|
@@ -348,7 +347,7 @@ impl VulkanRenderer {
|
|
|
|
|
|
|
|
|
|
self.pipelines = vec![
|
|
|
|
|
Box::new(DefaultShader::new(self.device.clone(), self.render_pass.clone())),
|
|
|
|
|
Box::new(LineShader::new(self.device.clone(), self.render_pass.clone(), self.line_vertex_buffer.clone())),
|
|
|
|
|
// Box::new(LineShader::new(self.device.clone(), self.render_pass.clone(), self.line_vertex_buffer.clone())),
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
self.swapchain = new_swapchain;
|
|
|
|
|
@@ -432,7 +431,7 @@ impl VulkanRenderer {
|
|
|
|
|
self.game_data.meshes.len() - 1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn upload_texture(self: &mut Self, texture_data: &gltf::image::Data) {
|
|
|
|
|
pub fn upload_texture(self: &mut Self, texture_data: &gltf::image::Data, device: Arc<Device>) {
|
|
|
|
|
// Format buffer on cpu for upload
|
|
|
|
|
let buffer: ImageBuffer<Rgb<u8>, Vec<u8>> = image::ImageBuffer::from_raw(texture_data.width, texture_data.height, texture_data.pixels.clone()).unwrap();
|
|
|
|
|
let new_buffer: ImageBuffer<Rgba<u8>, Vec<u8>> = buffer.convert();
|
|
|
|
|
@@ -448,7 +447,11 @@ impl VulkanRenderer {
|
|
|
|
|
let (image_view, future) = ImmutableImage::from_buffer(source.clone(), dimensions, MipmapsCount::Log2, Format::R8G8B8A8Unorm, self.queue.clone()).unwrap();
|
|
|
|
|
future.flush().unwrap();
|
|
|
|
|
|
|
|
|
|
self.game_data.textures.push(image_view);
|
|
|
|
|
let sampler = Sampler::new(device.clone(), Filter::Linear, Filter::Linear,
|
|
|
|
|
MipmapMode::Linear, SamplerAddressMode::Repeat, SamplerAddressMode::Repeat,
|
|
|
|
|
SamplerAddressMode::Repeat, 0.0, 1.0, 0.0, image_view.mipmap_levels() as f32).unwrap();
|
|
|
|
|
|
|
|
|
|
self.game_data.textures.push(Texture { image: image_view, sampler });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn add_game_object(self: &mut Self, mut game_object: GameObject, pipeline_index: usize) -> GameObjectHandle {
|
|
|
|
|
|