This commit is contained in:
2021-10-14 02:15:37 +02:00
parent db9a455311
commit 78917d96d1
3 changed files with 74 additions and 43 deletions

View File

@@ -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<u32> = 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<f32>) {
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<u32>, 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<Vec<TextVertex>>,
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),