wip
This commit is contained in:
@@ -50,15 +50,15 @@
|
|||||||
"player": {
|
"player": {
|
||||||
"mesh_index": null,
|
"mesh_index": null,
|
||||||
"position": [
|
"position": [
|
||||||
3.735453,
|
8.637261,
|
||||||
-0.27469593,
|
1.304583,
|
||||||
-7.2023296
|
-7.3298244
|
||||||
],
|
],
|
||||||
"rotation": [
|
"rotation": [
|
||||||
0.106049195,
|
0.22436175,
|
||||||
0.0023422977,
|
-0.6880533,
|
||||||
-0.99411577,
|
-0.21394368,
|
||||||
-0.021956932
|
0.6561041
|
||||||
],
|
],
|
||||||
"scale": [
|
"scale": [
|
||||||
1.0,
|
1.0,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use std::time::SystemTime;
|
use std::time::SystemTime;
|
||||||
use cgmath::{Deg, Euler, Quaternion, vec3};
|
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 glyph_brush::ab_glyph::FontArc;
|
||||||
use vulkano::format::Format;
|
use vulkano::format::Format;
|
||||||
use vulkano::sampler::{Filter, SamplerAddressMode};
|
use vulkano::sampler::{Filter, SamplerAddressMode};
|
||||||
@@ -124,7 +124,7 @@ impl TestGame {
|
|||||||
load_level("levels/test.lvl", self, renderer).unwrap();
|
load_level("levels/test.lvl", self, renderer).unwrap();
|
||||||
println!("Game loaded!");
|
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);
|
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 {
|
pub fn create_text_object(&mut self, renderer: &mut VulkanRenderer, text: &str, size: f32) -> TextObject {
|
||||||
let mut tex_min_size = None;
|
let mut texture_size = None;
|
||||||
let mut tex_max_size = None;
|
|
||||||
let mut uploaded_texture = None;
|
let mut uploaded_texture = None;
|
||||||
let mut uploaded_game_object = 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))
|
.with_bounds((renderer.game_data.dimensions[0] as f32, renderer.game_data.dimensions[1] as f32))
|
||||||
);
|
);
|
||||||
match glyph_brush.process_queued(|rect, text_data| {
|
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());
|
let (t, s) = update_text_texture(None, renderer, rect, text_data);
|
||||||
renderer.game_data.textures.push(tex.clone());
|
uploaded_texture = Some(t);
|
||||||
uploaded_texture = Some(tex);
|
texture_size = Some(s);
|
||||||
self.texture_index_counter += 1;
|
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) {
|
}, Self::convert_vertices) {
|
||||||
Ok(BrushAction::Draw(quads)) => {
|
Ok(BrushAction::Draw(quads)) => {
|
||||||
let mut final_vertices = vec![];
|
let mut final_vertices = vec![];
|
||||||
let mut final_indices: Vec<u32> = vec![];
|
let mut final_indices: Vec<u32> = vec![];
|
||||||
let mut index_offset = 0;
|
let mut index_offset = 0;
|
||||||
for quad in quads {
|
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());
|
final_indices.append(&mut [0, 2, 3, 0, 3, 1].iter().map(|x| *x + index_offset).collect());
|
||||||
index_offset += quad.len() as u32;
|
index_offset += quad.len() as u32;
|
||||||
}
|
}
|
||||||
@@ -243,7 +240,8 @@ impl TestGame {
|
|||||||
TextObject {
|
TextObject {
|
||||||
brush: glyph_brush,
|
brush: glyph_brush,
|
||||||
texture: uploaded_texture.unwrap(),
|
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));
|
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 struct TextObject {
|
||||||
pub brush: GlyphBrush<Vec<TextVertex>>,
|
pub brush: GlyphBrush<Vec<TextVertex>>,
|
||||||
pub texture: Texture,
|
pub texture: Texture,
|
||||||
pub game_object: GameObjectHandle
|
pub game_object: GameObjectHandle,
|
||||||
|
pub current_texture_size: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TextObject {
|
impl TextObject {
|
||||||
@@ -272,11 +287,15 @@ impl TextObject {
|
|||||||
let mut old_texture = self.texture.clone();
|
let mut old_texture = self.texture.clone();
|
||||||
let mut new_texture = None;
|
let mut new_texture = None;
|
||||||
match self.brush.process_queued(|rect, text_data| {
|
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());
|
println!("rect: {:?}", rect);
|
||||||
renderer.game_data.textures.push(tex.clone());
|
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());
|
||||||
new_texture = Some(tex);
|
if let Some(tex) = tex_option.clone() {
|
||||||
go_handle.get_game_object_mut(renderer).unwrap().textures.texture_index = renderer.game_data.textures.len() - 1;
|
println!("Updating texture");
|
||||||
renderer.update_descriptor_set(&mut go_handle);
|
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) {
|
}, TestGame::convert_vertices) {
|
||||||
Ok(_) => {},
|
Ok(_) => {},
|
||||||
Err(e) => println!("Error! {:?}", e),
|
Err(e) => println!("Error! {:?}", e),
|
||||||
|
|||||||
@@ -536,7 +536,9 @@ impl VulkanRenderer {
|
|||||||
offset += mip_byte_size;
|
offset += mip_byte_size;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
upload_bytes(bytes, 0, dimensions.to_image_dimensions().width_height_depth());
|
let mut texture_bytes: Vec<u8> = 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();
|
let cb = cbb.build().unwrap();
|
||||||
@@ -555,7 +557,7 @@ impl VulkanRenderer {
|
|||||||
Texture { image: image_view, sampler }
|
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<Device>) -> 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<Device>) -> Option<Texture> {
|
||||||
let new_image_usage = ImageUsage {
|
let new_image_usage = ImageUsage {
|
||||||
transfer_destination: true,
|
transfer_destination: true,
|
||||||
transfer_source: true,
|
transfer_source: true,
|
||||||
@@ -563,29 +565,38 @@ impl VulkanRenderer {
|
|||||||
..ImageUsage::none()
|
..ImageUsage::none()
|
||||||
};
|
};
|
||||||
|
|
||||||
let (new_image_view, new_image_initializer) = ImmutableImage::uninitialized(
|
// let (new_image_view, new_image_initializer) = ImmutableImage::uninitialized(
|
||||||
device.clone(),
|
// device.clone(),
|
||||||
Dimensions::Dim2d { width: texture.image.dimensions().width(), height: texture.image.dimensions().height() },
|
// Dimensions::Dim2d { width: texture.image.dimensions().width(), height: texture.image.dimensions().height() },
|
||||||
texture.image.format(),
|
// texture.image.format(),
|
||||||
texture.image.mipmap_levels(),
|
// texture.image.mipmap_levels(),
|
||||||
new_image_usage,
|
// new_image_usage,
|
||||||
ImageLayout::ShaderReadOnlyOptimal,
|
// ImageLayout::ShaderReadOnlyOptimal,
|
||||||
device.active_queue_families(),
|
// device.active_queue_families(),
|
||||||
).unwrap();
|
// ).unwrap();
|
||||||
|
|
||||||
let new_sub_image = SubImage::new(
|
let old_sub_image = SubImage::new(
|
||||||
Arc::new(new_image_initializer),
|
texture.image.clone(),
|
||||||
0,
|
0,
|
||||||
new_image_view.mipmap_levels(),
|
1,
|
||||||
0,
|
0,
|
||||||
1,
|
1,
|
||||||
ImageLayout::ShaderReadOnlyOptimal,
|
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();
|
let mut cbb = AutoCommandBufferBuilder::new(device.clone(), self.queue.family()).unwrap();
|
||||||
|
|
||||||
// cbb.copy_image(
|
// cbb.copy_image(
|
||||||
// texture.image.clone(),
|
// old_sub_image.clone(),
|
||||||
// [0, 0, 0],
|
// [0, 0, 0],
|
||||||
// 0,
|
// 0,
|
||||||
// 0,
|
// 0,
|
||||||
@@ -593,7 +604,7 @@ impl VulkanRenderer {
|
|||||||
// [0, 0, 0],
|
// [0, 0, 0],
|
||||||
// 0,
|
// 0,
|
||||||
// 0,
|
// 0,
|
||||||
// texture.image.dimensions().width_height_depth(),
|
// old_sub_image.dimensions().width_height_depth(),
|
||||||
// 1
|
// 1
|
||||||
// ).unwrap();
|
// ).unwrap();
|
||||||
|
|
||||||
@@ -606,8 +617,8 @@ impl VulkanRenderer {
|
|||||||
|
|
||||||
cbb.copy_buffer_to_image_dimensions(
|
cbb.copy_buffer_to_image_dimensions(
|
||||||
upload_source.clone(),
|
upload_source.clone(),
|
||||||
new_sub_image.clone(),
|
old_sub_image.clone(),
|
||||||
[0, 0, 0],
|
new_data_offset,
|
||||||
new_data_dimensions,
|
new_data_dimensions,
|
||||||
0,
|
0,
|
||||||
1,
|
1,
|
||||||
@@ -620,7 +631,8 @@ impl VulkanRenderer {
|
|||||||
|
|
||||||
future.flush().unwrap();
|
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 {
|
pub fn add_game_object(self: &mut Self, mut game_object: GameObject) -> GameObjectHandle {
|
||||||
|
|||||||
Reference in New Issue
Block a user