Improve vertex usage

This commit is contained in:
hodasemi 2024-05-13 15:03:54 +02:00
parent d7a19d3ac1
commit ef6e259313
10 changed files with 83 additions and 64 deletions

View file

@ -598,12 +598,12 @@ impl Button {
let top = self.framable.top() as f32; let top = self.framable.top() as f32;
let bottom = self.framable.bottom() as f32; let bottom = self.framable.bottom() as f32;
frame[0].position = ortho * vec4(left - offset, bottom + offset, 0.0, 1.0); frame[0].position = (ortho * vec4(left - offset, bottom + offset, 0.0, 1.0)).xy();
frame[1].position = ortho * vec4(right + offset, bottom + offset, 0.0, 1.0); frame[1].position = (ortho * vec4(right + offset, bottom + offset, 0.0, 1.0)).xy();
frame[2].position = ortho * vec4(right + offset, top - offset, 0.0, 1.0); frame[2].position = (ortho * vec4(right + offset, top - offset, 0.0, 1.0)).xy();
frame[3].position = ortho * vec4(right + offset, top - offset, 0.0, 1.0); frame[3].position = (ortho * vec4(right + offset, top - offset, 0.0, 1.0)).xy();
frame[4].position = ortho * vec4(left - offset, top - offset, 0.0, 1.0); frame[4].position = (ortho * vec4(left - offset, top - offset, 0.0, 1.0)).xy();
frame[5].position = ortho * vec4(left - offset, bottom + offset, 0.0, 1.0); frame[5].position = (ortho * vec4(left - offset, bottom + offset, 0.0, 1.0)).xy();
frame[0].texture_coordinates = vec2(0.0, 1.0); frame[0].texture_coordinates = vec2(0.0, 1.0);
frame[1].texture_coordinates = vec2(1.0, 1.0); frame[1].texture_coordinates = vec2(1.0, 1.0);
@ -622,12 +622,12 @@ impl Button {
let top = self.framable.top() as f32; let top = self.framable.top() as f32;
let bottom = self.framable.bottom() as f32; let bottom = self.framable.bottom() as f32;
frame[0].position = ortho * vec4(left - offset, bottom + offset, 0.0, 1.0); frame[0].position = (ortho * vec4(left - offset, bottom + offset, 0.0, 1.0)).xy();
frame[1].position = ortho * vec4(right + offset, bottom + offset, 0.0, 1.0); frame[1].position = (ortho * vec4(right + offset, bottom + offset, 0.0, 1.0)).xy();
frame[2].position = ortho * vec4(right + offset, top - offset, 0.0, 1.0); frame[2].position = (ortho * vec4(right + offset, top - offset, 0.0, 1.0)).xy();
frame[3].position = ortho * vec4(right + offset, top - offset, 0.0, 1.0); frame[3].position = (ortho * vec4(right + offset, top - offset, 0.0, 1.0)).xy();
frame[4].position = ortho * vec4(left - offset, top - offset, 0.0, 1.0); frame[4].position = (ortho * vec4(left - offset, top - offset, 0.0, 1.0)).xy();
frame[5].position = ortho * vec4(left - offset, bottom + offset, 0.0, 1.0); frame[5].position = (ortho * vec4(left - offset, bottom + offset, 0.0, 1.0)).xy();
} }
} }

View file

@ -5,7 +5,7 @@ use anyhow::Result;
use utilities::{impl_reprc, prelude::*}; use utilities::{impl_reprc, prelude::*};
use vulkan_rs::prelude::*; use vulkan_rs::prelude::*;
use cgmath::{vec4, Vector4}; use cgmath::vec4;
use std::sync::atomic::{AtomicI32, Ordering::SeqCst}; use std::sync::atomic::{AtomicI32, Ordering::SeqCst};
use std::sync::{Arc, RwLock}; use std::sync::{Arc, RwLock};
@ -177,12 +177,12 @@ impl Colorable {
let top = y_start + height * *self.top_factor.read().unwrap(); let top = y_start + height * *self.top_factor.read().unwrap();
let bottom = y_start + height * *self.bottom_factor.read().unwrap(); let bottom = y_start + height * *self.bottom_factor.read().unwrap();
frame[0].position = self.framable.ortho() * vec4(left, bottom, 0.0, 1.0); frame[0].position = (self.framable.ortho() * vec4(left, bottom, 0.0, 1.0)).xy();
frame[1].position = self.framable.ortho() * vec4(right, bottom, 0.0, 1.0); frame[1].position = (self.framable.ortho() * vec4(right, bottom, 0.0, 1.0)).xy();
frame[2].position = self.framable.ortho() * vec4(right, top, 0.0, 1.0); frame[2].position = (self.framable.ortho() * vec4(right, top, 0.0, 1.0)).xy();
frame[3].position = self.framable.ortho() * vec4(right, top, 0.0, 1.0); frame[3].position = (self.framable.ortho() * vec4(right, top, 0.0, 1.0)).xy();
frame[4].position = self.framable.ortho() * vec4(left, top, 0.0, 1.0); frame[4].position = (self.framable.ortho() * vec4(left, top, 0.0, 1.0)).xy();
frame[5].position = self.framable.ortho() * vec4(left, bottom, 0.0, 1.0); frame[5].position = (self.framable.ortho() * vec4(left, bottom, 0.0, 1.0)).xy();
Ok(()) Ok(())
} }
@ -192,7 +192,10 @@ impl_reprc!(
#[derive(Debug)] #[derive(Debug)]
pub struct ColorableVertex { pub struct ColorableVertex {
#[assume_reprc] #[assume_reprc]
position: Vector4<f32>, pub position: cgmath::Vector2<f32>,
#[assume_reprc]
filler: [f32; 2],
} }
); );
@ -200,7 +203,7 @@ impl VertexInputDescription for ColorableVertex {
fn bindings() -> Vec<VkVertexInputBindingDescription> { fn bindings() -> Vec<VkVertexInputBindingDescription> {
vec![VkVertexInputBindingDescription { vec![VkVertexInputBindingDescription {
binding: 0, binding: 0,
stride: std::mem::size_of::<Vector4<f32>>() as u32, stride: std::mem::size_of::<Self>() as u32,
inputRate: VK_VERTEX_INPUT_RATE_VERTEX, inputRate: VK_VERTEX_INPUT_RATE_VERTEX,
}] }]
} }
@ -209,7 +212,7 @@ impl VertexInputDescription for ColorableVertex {
vec![VkVertexInputAttributeDescription { vec![VkVertexInputAttributeDescription {
location: 0, location: 0,
binding: 0, binding: 0,
format: VK_FORMAT_R32G32B32A32_SFLOAT, format: VK_FORMAT_R32G32_SFLOAT,
offset: 0, offset: 0,
}] }]
} }

View file

@ -286,12 +286,12 @@ impl Displayable {
let top = y_start + height * *self.top_factor.read().unwrap(); let top = y_start + height * *self.top_factor.read().unwrap();
let bottom = y_start + height * *self.bottom_factor.read().unwrap(); let bottom = y_start + height * *self.bottom_factor.read().unwrap();
frame[0].position = self.framable.ortho() * vec4(left, bottom, 0.0, 1.0); frame[0].position = (self.framable.ortho() * vec4(left, bottom, 0.0, 1.0)).xy();
frame[1].position = self.framable.ortho() * vec4(right, bottom, 0.0, 1.0); frame[1].position = (self.framable.ortho() * vec4(right, bottom, 0.0, 1.0)).xy();
frame[2].position = self.framable.ortho() * vec4(right, top, 0.0, 1.0); frame[2].position = (self.framable.ortho() * vec4(right, top, 0.0, 1.0)).xy();
frame[3].position = self.framable.ortho() * vec4(right, top, 0.0, 1.0); frame[3].position = (self.framable.ortho() * vec4(right, top, 0.0, 1.0)).xy();
frame[4].position = self.framable.ortho() * vec4(left, top, 0.0, 1.0); frame[4].position = (self.framable.ortho() * vec4(left, top, 0.0, 1.0)).xy();
frame[5].position = self.framable.ortho() * vec4(left, bottom, 0.0, 1.0); frame[5].position = (self.framable.ortho() * vec4(left, bottom, 0.0, 1.0)).xy();
frame[0].texture_coordinates = vec2( frame[0].texture_coordinates = vec2(
*self.left_uv_factor.read().unwrap(), *self.left_uv_factor.read().unwrap(),

View file

@ -248,12 +248,12 @@ impl Iconizable {
let abs_top = top + margin as f32; let abs_top = top + margin as f32;
let abs_bottom = bottom - margin as f32; let abs_bottom = bottom - margin as f32;
frame[0].position = ortho * cgmath::Vector4::new(abs_left, abs_bottom, 0.0, 1.0); frame[0].position = (ortho * cgmath::Vector4::new(abs_left, abs_bottom, 0.0, 1.0)).xy();
frame[1].position = ortho * cgmath::Vector4::new(abs_right, abs_bottom, 0.0, 1.0); frame[1].position = (ortho * cgmath::Vector4::new(abs_right, abs_bottom, 0.0, 1.0)).xy();
frame[2].position = ortho * cgmath::Vector4::new(abs_right, abs_top, 0.0, 1.0); frame[2].position = (ortho * cgmath::Vector4::new(abs_right, abs_top, 0.0, 1.0)).xy();
frame[3].position = ortho * cgmath::Vector4::new(abs_right, abs_top, 0.0, 1.0); frame[3].position = (ortho * cgmath::Vector4::new(abs_right, abs_top, 0.0, 1.0)).xy();
frame[4].position = ortho * cgmath::Vector4::new(abs_left, abs_top, 0.0, 1.0); frame[4].position = (ortho * cgmath::Vector4::new(abs_left, abs_top, 0.0, 1.0)).xy();
frame[5].position = ortho * cgmath::Vector4::new(abs_left, abs_bottom, 0.0, 1.0); frame[5].position = (ortho * cgmath::Vector4::new(abs_left, abs_bottom, 0.0, 1.0)).xy();
frame[0].texture_coordinates = cgmath::Vector2::new(0.0, 1.0); frame[0].texture_coordinates = cgmath::Vector2::new(0.0, 1.0);
frame[1].texture_coordinates = cgmath::Vector2::new(1.0, 1.0); frame[1].texture_coordinates = cgmath::Vector2::new(1.0, 1.0);

View file

@ -380,13 +380,14 @@ impl Textable {
let x = (mod_number - (y as u32 * letters_in_row)) as f32; let x = (mod_number - (y as u32 * letters_in_row)) as f32;
buffer_mapping[i] = TexturedVertex { buffer_mapping[i] = TexturedVertex {
position: ortho position: (ortho
* cgmath::Vector4::new( * cgmath::Vector4::new(
win_x + offset, win_x + offset,
win_y + letter_height, win_y + letter_height,
priority, priority,
1.0, 1.0,
), ))
.xy(),
texture_coordinates: cgmath::Vector2::new( texture_coordinates: cgmath::Vector2::new(
inverse_row * x, inverse_row * x,
inverse_col + inverse_col * y, inverse_col + inverse_col * y,
@ -396,13 +397,14 @@ impl Textable {
i += 1; i += 1;
buffer_mapping[i] = TexturedVertex { buffer_mapping[i] = TexturedVertex {
position: ortho position: (ortho
* cgmath::Vector4::new( * cgmath::Vector4::new(
win_x + offset + letter_width, win_x + offset + letter_width,
win_y + letter_height, win_y + letter_height,
priority, priority,
1.0, 1.0,
), ))
.xy(),
texture_coordinates: cgmath::Vector2::new( texture_coordinates: cgmath::Vector2::new(
inverse_row + inverse_row * x, inverse_row + inverse_row * x,
inverse_col + inverse_col * y, inverse_col + inverse_col * y,
@ -412,13 +414,14 @@ impl Textable {
i += 1; i += 1;
buffer_mapping[i] = TexturedVertex { buffer_mapping[i] = TexturedVertex {
position: ortho position: (ortho
* cgmath::Vector4::new( * cgmath::Vector4::new(
win_x + offset + letter_width, win_x + offset + letter_width,
win_y, win_y,
priority, priority,
1.0, 1.0,
), ))
.xy(),
texture_coordinates: cgmath::Vector2::new( texture_coordinates: cgmath::Vector2::new(
inverse_row + inverse_row * x, inverse_row + inverse_row * x,
inverse_col * y, inverse_col * y,
@ -428,13 +431,14 @@ impl Textable {
i += 1; i += 1;
buffer_mapping[i] = TexturedVertex { buffer_mapping[i] = TexturedVertex {
position: ortho position: (ortho
* cgmath::Vector4::new( * cgmath::Vector4::new(
win_x + offset + letter_width, win_x + offset + letter_width,
win_y, win_y,
priority, priority,
1.0, 1.0,
), ))
.xy(),
texture_coordinates: cgmath::Vector2::new( texture_coordinates: cgmath::Vector2::new(
inverse_row + inverse_row * x, inverse_row + inverse_row * x,
inverse_col * y, inverse_col * y,
@ -444,8 +448,9 @@ impl Textable {
i += 1; i += 1;
buffer_mapping[i] = TexturedVertex { buffer_mapping[i] = TexturedVertex {
position: ortho position: (ortho
* cgmath::Vector4::new(win_x + offset, win_y, priority, 1.0), * cgmath::Vector4::new(win_x + offset, win_y, priority, 1.0))
.xy(),
texture_coordinates: cgmath::Vector2::new( texture_coordinates: cgmath::Vector2::new(
inverse_row * x, inverse_row * x,
inverse_col * y, inverse_col * y,
@ -455,13 +460,14 @@ impl Textable {
i += 1; i += 1;
buffer_mapping[i] = TexturedVertex { buffer_mapping[i] = TexturedVertex {
position: ortho position: (ortho
* cgmath::Vector4::new( * cgmath::Vector4::new(
win_x + offset, win_x + offset,
win_y + letter_height, win_y + letter_height,
priority, priority,
1.0, 1.0,
), ))
.xy(),
texture_coordinates: cgmath::Vector2::new( texture_coordinates: cgmath::Vector2::new(
inverse_row * x, inverse_row * x,
inverse_col + inverse_col * y, inverse_col + inverse_col * y,

View file

@ -6,12 +6,22 @@ use std::mem;
impl_reprc!( impl_reprc!(
pub struct TexturedVertex { pub struct TexturedVertex {
#[assume_reprc] #[assume_reprc]
position: cgmath::Vector4<f32>, pub position: cgmath::Vector2<f32>,
#[assume_reprc] #[assume_reprc]
texture_coordinates: cgmath::Vector2<f32>, pub texture_coordinates: cgmath::Vector2<f32>,
} }
); );
impl TexturedVertex {
pub fn new(position: cgmath::Vector2<f32>, texture_coordinates: cgmath::Vector2<f32>) -> Self {
Self {
position,
texture_coordinates,
}
}
}
impl VertexInputDescription for TexturedVertex { impl VertexInputDescription for TexturedVertex {
fn bindings() -> Vec<VkVertexInputBindingDescription> { fn bindings() -> Vec<VkVertexInputBindingDescription> {
vec![VkVertexInputBindingDescription { vec![VkVertexInputBindingDescription {
@ -26,14 +36,14 @@ impl VertexInputDescription for TexturedVertex {
VkVertexInputAttributeDescription { VkVertexInputAttributeDescription {
location: 0, location: 0,
binding: 0, binding: 0,
format: VK_FORMAT_R32G32B32A32_SFLOAT, format: VK_FORMAT_R32G32_SFLOAT,
offset: 0, offset: 0,
}, },
VkVertexInputAttributeDescription { VkVertexInputAttributeDescription {
location: 1, location: 1,
binding: 0, binding: 0,
format: VK_FORMAT_R32G32_SFLOAT, format: VK_FORMAT_R32G32_SFLOAT,
offset: 16, // mem::size_of::<cgmath::Vector4<f32>>() as u32 offset: 8, // mem::size_of::<cgmath::Vector2<f32>>() as u32
}, },
] ]
} }
@ -42,7 +52,7 @@ impl VertexInputDescription for TexturedVertex {
impl Default for TexturedVertex { impl Default for TexturedVertex {
fn default() -> TexturedVertex { fn default() -> TexturedVertex {
TexturedVertex { TexturedVertex {
position: cgmath::Vector4::zero(), position: cgmath::Vector2::zero(),
texture_coordinates: cgmath::Vector2::zero(), texture_coordinates: cgmath::Vector2::zero(),
} }
} }

View file

@ -12,7 +12,7 @@ use super::{
}, },
}; };
use cgmath::{ortho, vec2, vec4}; use cgmath::{ortho, vec2};
use std::sync::Weak; use std::sync::Weak;
use std::sync::{ use std::sync::{
@ -129,27 +129,27 @@ impl TextToScreen {
let edges = [ let edges = [
TexturedVertex { TexturedVertex {
position: vec4(-1.0, -1.0, 0.0, 1.0), position: vec2(-1.0, -1.0),
texture_coordinates: vec2(0.0, 0.0), texture_coordinates: vec2(0.0, 0.0),
}, },
TexturedVertex { TexturedVertex {
position: vec4(-1.0, 1.0, 0.0, 1.0), position: vec2(-1.0, 1.0),
texture_coordinates: vec2(0.0, 1.0), texture_coordinates: vec2(0.0, 1.0),
}, },
TexturedVertex { TexturedVertex {
position: vec4(1.0, 1.0, 0.0, 1.0), position: vec2(1.0, 1.0),
texture_coordinates: vec2(1.0, 1.0), texture_coordinates: vec2(1.0, 1.0),
}, },
TexturedVertex { TexturedVertex {
position: vec4(1.0, 1.0, 0.0, 1.0), position: vec2(1.0, 1.0),
texture_coordinates: vec2(1.0, 1.0), texture_coordinates: vec2(1.0, 1.0),
}, },
TexturedVertex { TexturedVertex {
position: vec4(1.0, -1.0, 0.0, 1.0), position: vec2(1.0, -1.0),
texture_coordinates: vec2(1.0, 0.0), texture_coordinates: vec2(1.0, 0.0),
}, },
TexturedVertex { TexturedVertex {
position: vec4(-1.0, -1.0, 0.0, 1.0), position: vec2(-1.0, -1.0),
texture_coordinates: vec2(0.0, 0.0), texture_coordinates: vec2(0.0, 0.0),
}, },
]; ];

View file

@ -1,6 +1,6 @@
#version 450 #version 450
layout (location = 0) in vec4 position; layout (location = 0) in vec2 position;
layout (location = 1) in vec2 texcoord; layout (location = 1) in vec2 texcoord;
layout (location = 0) out vec2 uv; layout (location = 0) out vec2 uv;
@ -8,5 +8,5 @@ layout (location = 0) out vec2 uv;
void main() void main()
{ {
uv = texcoord; uv = texcoord;
gl_Position = position; gl_Position = vec4(position, 0.0, 1.0);
} }

View file

@ -1,8 +1,8 @@
#version 450 #version 450
layout (location = 0) in vec4 position; layout (location = 0) in vec2 position;
void main() void main()
{ {
gl_Position = position; gl_Position = vec4(position, 0.0, 1.0);
} }

View file

@ -1,6 +1,6 @@
#version 450 #version 450
layout (location = 0) in vec4 position; layout (location = 0) in vec2 position;
layout (location = 1) in vec2 texcoord; layout (location = 1) in vec2 texcoord;
layout (location = 0) out vec2 uv; layout (location = 0) out vec2 uv;
@ -8,5 +8,5 @@ layout (location = 0) out vec2 uv;
void main() void main()
{ {
uv = texcoord; uv = texcoord;
gl_Position = position; gl_Position = vec4(position, 0.0, 1.0);
} }