diff --git a/levels/test.lvl b/levels/test.lvl index 3d65a6c..32f0456 100644 --- a/levels/test.lvl +++ b/levels/test.lvl @@ -50,15 +50,15 @@ "player": { "mesh_index": null, "position": [ - 3.735453, - -0.27469593, - -7.2023296 + 8.637261, + 1.304583, + -7.3298244 ], "rotation": [ - 0.106049195, - 0.0023422977, - -0.99411577, - -0.021956932 + 0.22436175, + -0.6880533, + -0.21394368, + 0.6561041 ], "scale": [ 1.0, diff --git a/src/game/mod.rs b/src/game/mod.rs index 7258f84..b179ad9 100644 --- a/src/game/mod.rs +++ b/src/game/mod.rs @@ -1,6 +1,6 @@ use std::time::SystemTime; use cgmath::{Deg, Euler, Quaternion, vec3}; -use glyph_brush::{BrushAction, BrushError, GlyphBrush, GlyphBrushBuilder, GlyphVertex, Section, Text}; +use glyph_brush::{BrushAction, BrushError, GlyphBrush, GlyphBrushBuilder, GlyphVertex, Rectangle, Section, Text}; use glyph_brush::ab_glyph::FontArc; use vulkano::format::Format; use vulkano::sampler::{Filter, SamplerAddressMode}; @@ -124,7 +124,7 @@ impl TestGame { load_level("levels/test.lvl", self, renderer).unwrap(); println!("Game loaded!"); - let text_obj = self.create_text_object(renderer, "Nice font", 24.); + let text_obj = self.create_text_object(renderer, "Nice font", 128.); self.text_objects.push(text_obj); } @@ -191,8 +191,7 @@ impl TestGame { } pub fn create_text_object(&mut self, renderer: &mut VulkanRenderer, text: &str, size: f32) -> TextObject { - let mut tex_min_size = None; - let mut tex_max_size = None; + let mut texture_size = None; let mut uploaded_texture = None; let mut uploaded_game_object = None; @@ -203,19 +202,17 @@ impl TestGame { .with_bounds((renderer.game_data.dimensions[0] as f32, renderer.game_data.dimensions[1] as f32)) ); match glyph_brush.process_queued(|rect, text_data| { - let tex = renderer.upload_texture(text_data, rect.width(), rect.height(), Format::R8Unorm, Filter::Nearest, SamplerAddressMode::ClampToEdge, renderer.device.clone()); - renderer.game_data.textures.push(tex.clone()); - uploaded_texture = Some(tex); + let (t, s) = update_text_texture(None, renderer, rect, text_data); + uploaded_texture = Some(t); + texture_size = Some(s); self.texture_index_counter += 1; - tex_max_size = Some(u32::max(rect.width(), rect.height())); - tex_min_size = Some(u32::min(rect.width(), rect.height())); }, Self::convert_vertices) { Ok(BrushAction::Draw(quads)) => { let mut final_vertices = vec![]; let mut final_indices: Vec = vec![]; let mut index_offset = 0; for quad in quads { - final_vertices.append(&mut quad.iter().map(|v| CPUVertex::VertexText(TextVertex { position: v.position, uv: [v.uv[0], v.uv[1] * (tex_max_size.unwrap() as f32) / (tex_min_size.unwrap() as f32) ] })).collect()); + final_vertices.append(&mut quad.iter().map(|v| CPUVertex::VertexText(TextVertex { position: v.position, uv: [v.uv[0], v.uv[1]] })).collect()); final_indices.append(&mut [0, 2, 3, 0, 3, 1].iter().map(|x| *x + index_offset).collect()); index_offset += quad.len() as u32; } @@ -243,7 +240,8 @@ impl TestGame { TextObject { brush: glyph_brush, texture: uploaded_texture.unwrap(), - game_object: uploaded_game_object.unwrap() + game_object: uploaded_game_object.unwrap(), + current_texture_size: texture_size.unwrap(), } } @@ -259,10 +257,27 @@ pub fn print_quat_as_euler(quat: Quaternion) { print!("({:?},{:?},{:?})", Deg::from(euler.x), Deg::from(euler.y), Deg::from(euler.z)); } +pub fn update_text_texture(text_obj: Option<&mut TextObject>, renderer: &mut VulkanRenderer, rect: Rectangle, text_data: &[u8]) -> (Texture, u32) { + if let Some(text) = text_obj { + println!("Init size: {:?}", rect); + let size = u32::max(rect.width(), rect.height()); + let tex = renderer.upload_texture(text_data, size, size, Format::R8Unorm, Filter::Nearest, SamplerAddressMode::ClampToEdge, renderer.device.clone()); + renderer.game_data.textures.push(tex.clone()); + (tex, size) + } else { + println!("Init size: {:?}", rect); + let size = u32::max(rect.width(), rect.height()); + let tex = renderer.upload_texture(text_data, size, size, Format::R8Unorm, Filter::Nearest, SamplerAddressMode::ClampToEdge, renderer.device.clone()); + renderer.game_data.textures.push(tex.clone()); + (tex, size) + } +} + pub struct TextObject { pub brush: GlyphBrush>, pub texture: Texture, - pub game_object: GameObjectHandle + pub game_object: GameObjectHandle, + pub current_texture_size: u32, } impl TextObject { @@ -272,11 +287,15 @@ impl TextObject { let mut old_texture = self.texture.clone(); let mut new_texture = None; match self.brush.process_queued(|rect, text_data| { - let tex = renderer.blit_and_update_texture(&mut old_texture, text_data, [rect.width(), rect.height(), 1], renderer.device.clone()); - renderer.game_data.textures.push(tex.clone()); - new_texture = Some(tex); - go_handle.get_game_object_mut(renderer).unwrap().textures.texture_index = renderer.game_data.textures.len() - 1; - renderer.update_descriptor_set(&mut go_handle); + println!("rect: {:?}", rect); + let tex_option = renderer.update_texture(&mut old_texture, text_data, [rect.width(), rect.height(), 1], [rect.min[0], rect.min[1], 0], renderer.device.clone()); + if let Some(tex) = tex_option.clone() { + println!("Updating texture"); + renderer.game_data.textures.push(tex.clone()); + go_handle.get_game_object_mut(renderer).unwrap().textures.texture_index = renderer.game_data.textures.len() - 1; + renderer.update_descriptor_set(&mut go_handle); + } + new_texture = tex_option; }, TestGame::convert_vertices) { Ok(_) => {}, Err(e) => println!("Error! {:?}", e), diff --git a/src/vulkan/mod.rs b/src/vulkan/mod.rs index 577ea95..2e0fce4 100644 --- a/src/vulkan/mod.rs +++ b/src/vulkan/mod.rs @@ -536,7 +536,9 @@ impl VulkanRenderer { offset += mip_byte_size; } } else { - upload_bytes(bytes, 0, dimensions.to_image_dimensions().width_height_depth()); + let mut texture_bytes: Vec = bytes.to_vec(); + texture_bytes.resize((width * height) as usize, 0u8); + upload_bytes(&texture_bytes, 0, dimensions.to_image_dimensions().width_height_depth()); } let cb = cbb.build().unwrap(); @@ -555,7 +557,7 @@ impl VulkanRenderer { Texture { image: image_view, sampler } } - pub fn blit_and_update_texture(&mut self, texture: &Texture, new_data: &[u8], new_data_dimensions: [u32; 3], device: Arc) -> Texture { + pub fn update_texture(&mut self, texture: &mut Texture, new_data: &[u8], new_data_dimensions: [u32; 3], new_data_offset: [u32; 3], device: Arc) -> Option { let new_image_usage = ImageUsage { transfer_destination: true, transfer_source: true, @@ -563,29 +565,38 @@ impl VulkanRenderer { ..ImageUsage::none() }; - let (new_image_view, new_image_initializer) = ImmutableImage::uninitialized( - device.clone(), - Dimensions::Dim2d { width: texture.image.dimensions().width(), height: texture.image.dimensions().height() }, - texture.image.format(), - texture.image.mipmap_levels(), - new_image_usage, - ImageLayout::ShaderReadOnlyOptimal, - device.active_queue_families(), - ).unwrap(); + // let (new_image_view, new_image_initializer) = ImmutableImage::uninitialized( + // device.clone(), + // Dimensions::Dim2d { width: texture.image.dimensions().width(), height: texture.image.dimensions().height() }, + // texture.image.format(), + // texture.image.mipmap_levels(), + // new_image_usage, + // ImageLayout::ShaderReadOnlyOptimal, + // device.active_queue_families(), + // ).unwrap(); - let new_sub_image = SubImage::new( - Arc::new(new_image_initializer), + let old_sub_image = SubImage::new( + texture.image.clone(), 0, - new_image_view.mipmap_levels(), + 1, 0, 1, ImageLayout::ShaderReadOnlyOptimal, ); + // let new_sub_image = SubImage::new( + // Arc::new(new_image_initializer), + // 0, + // new_image_view.mipmap_levels(), + // 0, + // 1, + // ImageLayout::ShaderReadOnlyOptimal, + // ); + let mut cbb = AutoCommandBufferBuilder::new(device.clone(), self.queue.family()).unwrap(); // cbb.copy_image( - // texture.image.clone(), + // old_sub_image.clone(), // [0, 0, 0], // 0, // 0, @@ -593,7 +604,7 @@ impl VulkanRenderer { // [0, 0, 0], // 0, // 0, - // texture.image.dimensions().width_height_depth(), + // old_sub_image.dimensions().width_height_depth(), // 1 // ).unwrap(); @@ -606,8 +617,8 @@ impl VulkanRenderer { cbb.copy_buffer_to_image_dimensions( upload_source.clone(), - new_sub_image.clone(), - [0, 0, 0], + old_sub_image.clone(), + new_data_offset, new_data_dimensions, 0, 1, @@ -620,7 +631,8 @@ impl VulkanRenderer { future.flush().unwrap(); - Texture { image: new_image_view, sampler: texture.sampler.clone() } + // Texture { image: texture.image.clone(), sampler: texture.sampler.clone() } + None } pub fn add_game_object(self: &mut Self, mut game_object: GameObject) -> GameObjectHandle {