diff --git a/src/game/components.rs b/src/game/entities.rs similarity index 59% rename from src/game/components.rs rename to src/game/entities.rs index 784d6ab..177b8eb 100644 --- a/src/game/components.rs +++ b/src/game/entities.rs @@ -1,4 +1,6 @@ -use crate::{input::InputState, text::{create_text_object, update_text}, vulkan::{PERF_COUNTER_SIZE, VulkanRenderer, gameobject::{GameObject, GameObjectHandle, Updatable}}}; +use cgmath::{Vector4, vec4}; + +use crate::{input::InputState, text::{create_text_object, update_text}, vulkan::{MeshHandle, PERF_COUNTER_SIZE, VulkanRenderer, gameobject::{GameObject, GameObjectHandle, Updatable}, mesh::{CPUMesh, CPUVertexList}}}; use super::{GameState, TestGame}; @@ -27,4 +29,31 @@ impl Updatable for FpsCounter { let text = format!("Update: {:.0}ms\nRender: {:.0}ms\nTotal: {:.0}ms (±{:.1})\nDelta: {:.0}ms", update_duration as f64 / 1000., render_duration as f64 / 1000., other_duration as f64 / 1000., f64::sqrt(other_variance as f64) / 1000., _delta_time * 1000.); update_text(self.game_object, &text, 30., renderer, &mut game_state.brush, game_objects); } +} + +pub struct UiQuad { + pub game_object: GameObjectHandle, + pub background_color: Vector4, +} + +impl UiQuad { + pub fn new(game: &mut TestGame, renderer: &mut VulkanRenderer) -> UiQuad { + let quad_verts = vec![]; + let cpu_mesh = CPUMesh { vertices: CPUVertexList::Vertex3D(quad_verts), indices: vec![0, 1, 2, 1, 3, 2], local_texture_index: None, local_normal_map_index: None, name: None }; + let mesh_index = renderer.upload_mesh(cpu_mesh, None); + let mesh_handle = MeshHandle { + index: mesh_index, + textures: vec![], + original_path: None, + pipeline_index: 1 + }; + let go = game.add_game_object(renderer, mesh_handle); + UiQuad { game_object: go, background_color: vec4(0., 0., 255., 0.) } + } +} + +impl Updatable for UiQuad { + fn update(&mut self, delta_time: f32, input: &InputState, game_state: &mut GameState, game_objects: &mut Vec, renderer: &mut VulkanRenderer) { + todo!() + } } \ No newline at end of file diff --git a/src/game/mod.rs b/src/game/mod.rs index dc9d706..06e38c7 100644 --- a/src/game/mod.rs +++ b/src/game/mod.rs @@ -6,7 +6,7 @@ use winit::event::Event; use level::{load_level, save_level}; use player::Player; -use crate::game::components::FpsCounter; +use crate::game::entities::FpsCounter; use crate::text::create_brush; use crate::{config::LogConfig, vulkan}; use crate::input::InputState; @@ -17,7 +17,7 @@ use crate::vulkan::pipelines::vs::ty::ObjectUniformData; pub mod player; mod level; -mod components; +mod entities; pub struct GameState { pub paused: bool, @@ -176,8 +176,7 @@ impl TestGame { let mesh_id = renderer.upload_mesh(cpu_mesh, Some(gltf_path.to_string())); let mesh_handle = MeshHandle { index: mesh_id, - diffuse_handle: diffuse_id, - normal_handle: Some(normal_id), + textures: vec![diffuse_id, normal_id], original_path: Some(gltf_path.to_string()), pipeline_index: 0 }; diff --git a/src/text.rs b/src/text.rs index 58223d2..e2a9abb 100644 --- a/src/text.rs +++ b/src/text.rs @@ -12,7 +12,8 @@ pub fn update_text(game_object_handle: GameObjectHandle, new_text: &str, new_siz let mesh_index = go.mesh_index; match brush.process_queued(|rect, text_data| { - update_text_texture(Some(go.textures.texture_index), renderer, rect, text_data); + debug_assert!(go.textures.len() == 1); + update_text_texture(Some(go.textures[0]), renderer, rect, text_data); }, convert_vertices) { Ok(BrushAction::Draw(quads)) => { update_text_quads(quads, 420, Some(mesh_index), renderer); @@ -20,7 +21,8 @@ pub fn update_text(game_object_handle: GameObjectHandle, new_text: &str, new_siz Ok(BrushAction::ReDraw) => {}, Err(BrushError::TextureTooSmall { suggested }) => { let size = Dimensions::Dim2d { width: suggested.0, height: suggested.1 }; - renderer.resize_texture(go, go.textures.texture_index, size); + debug_assert!(go.textures.len() == 1); + renderer.resize_texture(go, go.textures[0], size); brush.resize_texture(suggested.0, suggested.1); update_text(game_object_handle, new_text, new_size, renderer, brush, game_objects); }, @@ -100,8 +102,7 @@ pub fn update_text_quads(quads: Vec>, texture_index: usize, mesh let mesh_index = renderer.upload_mesh(mesh, None); Some(MeshHandle { index: mesh_index, - diffuse_handle: texture_index, - normal_handle: None, + textures: vec![texture_index], original_path: None, pipeline_index: 1 }) diff --git a/src/vulkan/gameobject.rs b/src/vulkan/gameobject.rs index 5f637ad..dd001ea 100644 --- a/src/vulkan/gameobject.rs +++ b/src/vulkan/gameobject.rs @@ -12,7 +12,7 @@ use super::pipelines::vs; #[derive(Clone)] pub struct GameObject { pub mesh_index: usize, - pub textures: TextureData, + pub textures: Vec, pub position: Vector3, pub rotation: Quaternion, pub scale: Vector3, @@ -23,20 +23,9 @@ pub struct GameObject { pub visible: bool, } -#[derive(Clone)] -pub struct TextureData { - pub texture_index: TextureHandle, - pub normal_map_index: TextureHandle, -} - impl GameObject { pub fn new(mesh: MeshHandle) -> GameObject { - let textures = TextureData { - texture_index: mesh.diffuse_handle, - normal_map_index: mesh.normal_handle.unwrap_or(0), - }; - - GameObject { mesh_index: mesh.index, textures, position: Vector3::new(0.0, 0.0, 0.0), + GameObject { mesh_index: mesh.index, textures: mesh.textures, position: Vector3::new(0.0, 0.0, 0.0), rotation: Quaternion::new(1.0, 0.0, 0.0, 0.0), scale: Vector3::new(1.0, 1.0, 1.0), children: vec![], descriptor_sets: vec![], is_selected: false, pipeline_index: mesh.pipeline_index, visible: true } } diff --git a/src/vulkan/mod.rs b/src/vulkan/mod.rs index b4a48ca..6496b8d 100644 --- a/src/vulkan/mod.rs +++ b/src/vulkan/mod.rs @@ -92,8 +92,7 @@ pub struct Mesh { #[derive(Debug, Clone)] pub struct MeshHandle { pub index: usize, - pub diffuse_handle: TextureHandle, - pub normal_handle: Option, + pub textures: Vec, pub original_path: Option, pub pipeline_index: usize } diff --git a/src/vulkan/pipelines.rs b/src/vulkan/pipelines.rs index 8709d47..f7b8148 100644 --- a/src/vulkan/pipelines.rs +++ b/src/vulkan/pipelines.rs @@ -14,7 +14,7 @@ use crate::vulkan::{LinePoint, Vertex}; use crate::vulkan::GameData; use crate::VulkanRenderer; -use super::gameobject::TextureData; +use super::TextureHandle; type RP = Arc; type GP = Arc; @@ -22,7 +22,7 @@ type DS = Arc; pub trait Drawcall { fn draw(self: &Self, builder: &mut AutoCommandBufferBuilder, fb_index: usize, game_objects: Vec<&GameObject>, game_data: &GameData, dynamic_state: &DynamicState); - fn create_descriptor_set(self: &Self, textures: &TextureData, renderer: &VulkanRenderer) -> Vec; + fn create_descriptor_set(self: &Self, textures: &Vec, renderer: &VulkanRenderer) -> Vec; fn recreate_pipeline(self: &mut Self, device: Arc, render_pass: RP); fn get_pipeline(self: &Self) -> &GP; } @@ -155,17 +155,16 @@ impl Drawcall for DefaultShader { } } - fn create_descriptor_set(self: &Self, textures: &TextureData, renderer: &VulkanRenderer) -> Vec { + fn create_descriptor_set(self: &Self, textures: &Vec, renderer: &VulkanRenderer) -> Vec { let descriptor_set_layout = self.get_pipeline().descriptor_set_layout(0).unwrap().clone(); - println!("Diff: {:?}, Norm: {:?}", textures.texture_index, textures.normal_map_index); - renderer.uniform_buffers.iter().map(|uniform_buffer| { let descriptor_set: Arc<(dyn vulkano::descriptor::DescriptorSet + std::marker::Send + std::marker::Sync + 'static)>; let builder = PersistentDescriptorSet::start(descriptor_set_layout.clone()); - - let diffuse = &renderer.game_data.textures[textures.texture_index]; - let normal_map = &renderer.game_data.textures[textures.normal_map_index]; + + debug_assert!(textures.len() == 2, "Expected diffuse and normal map for object shader!"); + let diffuse = &renderer.game_data.textures[textures[0]]; + let normal_map = &renderer.game_data.textures[textures[1]]; descriptor_set = Arc::new(builder .add_buffer(uniform_buffer.clone()).unwrap() @@ -241,7 +240,7 @@ impl Drawcall for LineShader { game_data.line_push_constants.clone()).unwrap(); } - fn create_descriptor_set(self: &Self, _textures: &TextureData, _renderer: &VulkanRenderer) -> Vec { + fn create_descriptor_set(self: &Self, _textures: &Vec, _renderer: &VulkanRenderer) -> Vec { vec![] } @@ -341,14 +340,15 @@ impl Drawcall for TextShader { } } - fn create_descriptor_set(self: &Self, textures: &TextureData, renderer: &VulkanRenderer) -> Vec { + fn create_descriptor_set(self: &Self, textures: &Vec, renderer: &VulkanRenderer) -> Vec { let descriptor_set_layout = self.get_pipeline().descriptor_set_layout(0).unwrap().clone(); renderer.uniform_buffers.iter().map(|uniform_buffer| { let descriptor_set: Arc<(dyn vulkano::descriptor::DescriptorSet + std::marker::Send + std::marker::Sync + 'static)>; let builder = PersistentDescriptorSet::start(descriptor_set_layout.clone()); - let diffuse = &renderer.game_data.textures[textures.texture_index]; + debug_assert!(textures.len() == 1, "Expected only diffuse map for text shader!"); + let diffuse = &renderer.game_data.textures[textures[0]]; println!("Using diffuse image with size {:?}", diffuse.image.dimensions()); descriptor_set = Arc::new(builder