engine/render: move Vertex out of vulkan

master
q3k 2021-07-11 01:44:23 +00:00
parent e90ebae6f6
commit 88cb4cff6e
4 changed files with 55 additions and 60 deletions

View File

@ -24,9 +24,24 @@ use vulkano::sync::GpuFuture;
use crate::vulkan::data;
#[derive(Default, Copy, Clone, Debug)]
pub struct Vertex {
pub pos: [f32; 3],
pub normal: [f32; 3],
pub tex: [f32; 2],
}
impl Vertex {
pub fn new(pos: [f32; 3], normal: [f32; 3], tex: [f32; 2]) -> Self {
Self {
pos, normal, tex,
}
}
}
#[derive(Debug)]
pub struct Mesh {
vertices: Arc<Vec<data::Vertex>>,
vertices: Arc<Vec<Vertex>>,
indices: Arc<Vec<u16>>,
// vulkan buffers cache
vulkan: Mutex<Option<data::VertexData>>,
@ -34,7 +49,7 @@ pub struct Mesh {
impl Mesh {
pub fn new(
vertices: Arc<Vec<data::Vertex>>,
vertices: Arc<Vec<Vertex>>,
indices: Arc<Vec<u16>>,
) -> Self {
Self {
@ -47,7 +62,7 @@ impl Mesh {
&self,
graphics_queue: Arc<vd::Queue>,
) -> (
Arc<vb::ImmutableBuffer<[data::Vertex]>>,
Arc<vb::ImmutableBuffer<[Vertex]>>,
Arc<vb::ImmutableBuffer<[u16]>>,
) {
let mut cache = self.vulkan.lock().unwrap();

View File

@ -16,26 +16,7 @@
use std::sync::Arc;
use vulkano::buffer as vb;
use vulkano::image as vm;
use vulkano::format::Format;
use cgmath as cgm;
#[derive(Default, Copy, Clone, Debug)]
pub struct Vertex {
pos: [f32; 3],
normal: [f32; 3],
tex: [f32; 2],
}
impl Vertex {
pub fn new(pos: [f32; 3], normal: [f32; 3], tex: [f32; 2]) -> Self {
Self {
pos, normal, tex,
}
}
}
use crate::mesh::Vertex;
vulkano::impl_vertex!(Vertex, pos, normal, tex);
#[derive(Default, Copy, Clone)]
@ -44,7 +25,7 @@ pub struct Instance {
}
impl Instance {
pub fn new(model: &cgm::Matrix4<f32>) -> Self {
pub fn new(model: &cgmath::Matrix4<f32>) -> Self {
let slice: &[f32; 16] = model.as_ref();
Self {
model: slice.clone(),
@ -61,26 +42,26 @@ pub struct OmniLight {
#[derive(Copy, Clone, Debug)]
pub struct PushConstantObject {
pub view: cgm::Matrix4<f32>,
pub view: cgmath::Matrix4<f32>,
}
#[derive(Copy, Clone, Debug)]
pub struct FragmentUniformBufferObject {
pub camera_pos: cgm::Vector4<f32>,
pub camera_pos: cgmath::Vector4<f32>,
pub omni_lights: [OmniLight; 4],
}
#[derive(Clone, Debug)]
pub struct Textures {
// diffuse: RGB
pub diffuse: Arc<vm::ImmutableImage<Format>>,
pub diffuse: Arc<vulkano::image::ImmutableImage<vulkano::format::Format>>,
// roughness: R
pub roughness: Arc<vm::ImmutableImage<Format>>,
pub roughness: Arc<vulkano::image::ImmutableImage<vulkano::format::Format>>,
}
pub struct VertexData {
pub vbuffer: Arc<vb::ImmutableBuffer<[Vertex]>>,
pub ibuffer: Arc<vb::ImmutableBuffer<[u16]>>,
pub vbuffer: Arc<vulkano::buffer::ImmutableBuffer<[Vertex]>>,
pub ibuffer: Arc<vulkano::buffer::ImmutableBuffer<[u16]>>,
}
impl std::fmt::Debug for VertexData {

View File

@ -30,6 +30,7 @@ use vulkano::pipeline::shader as vps;
use vulkano::pipeline::vertex as vpv;
use vulkano::sampler as vs;
use crate::mesh::Vertex;
use crate::vulkan::data;
use crate::vulkan::shaders;
use crate::vulkan::pipeline;
@ -180,7 +181,7 @@ impl Forward {
// against most existing software and practices. This might bite us in the ass at some
// point in the future.
let pipeline = Arc::new(vp::GraphicsPipeline::start()
.vertex_input(vpv::OneVertexOneInstanceDefinition::<data::Vertex, data::Instance>::new())
.vertex_input(vpv::OneVertexOneInstanceDefinition::<Vertex, data::Instance>::new())
.vertex_shader(vertex_shader.entry_point(), ())
.triangle_list()
.primitive_restart(false)

View File

@ -5,8 +5,6 @@ use ecs_macros::Access;
use engine::{
globals, input, physics, render, scripting, util,
};
use engine::render::material;
use engine::render::vulkan::data;
struct Main {
light1: ecs::EntityID,
@ -21,35 +19,35 @@ impl Main {
let mut rm = render::resource::Manager::new();
let mesh = {
let vertices = Arc::new(vec![
data::Vertex::new([-0.5, -0.5, 0.5], [ 0.0, 0.0, 1.0], [1.0, 0.0]),
data::Vertex::new([ 0.5, -0.5, 0.5], [ 0.0, 0.0, 1.0], [0.0, 0.0]),
data::Vertex::new([ 0.5, 0.5, 0.5], [ 0.0, 0.0, 1.0], [0.0, 1.0]),
data::Vertex::new([-0.5, 0.5, 0.5], [ 0.0, 0.0, 1.0], [1.0, 1.0]),
render::mesh::Vertex::new([-0.5, -0.5, 0.5], [ 0.0, 0.0, 1.0], [1.0, 0.0]),
render::mesh::Vertex::new([ 0.5, -0.5, 0.5], [ 0.0, 0.0, 1.0], [0.0, 0.0]),
render::mesh::Vertex::new([ 0.5, 0.5, 0.5], [ 0.0, 0.0, 1.0], [0.0, 1.0]),
render::mesh::Vertex::new([-0.5, 0.5, 0.5], [ 0.0, 0.0, 1.0], [1.0, 1.0]),
data::Vertex::new([ 0.5, -0.5, -0.5], [ 1.0, 0.0, 0.0], [0.0, 1.0]),
data::Vertex::new([ 0.5, 0.5, -0.5], [ 1.0, 0.0, 0.0], [1.0, 1.0]),
data::Vertex::new([ 0.5, 0.5, 0.5], [ 1.0, 0.0, 0.0], [1.0, 0.0]),
data::Vertex::new([ 0.5, -0.5, 0.5], [ 1.0, 0.0, 0.0], [0.0, 0.0]),
render::mesh::Vertex::new([ 0.5, -0.5, -0.5], [ 1.0, 0.0, 0.0], [0.0, 1.0]),
render::mesh::Vertex::new([ 0.5, 0.5, -0.5], [ 1.0, 0.0, 0.0], [1.0, 1.0]),
render::mesh::Vertex::new([ 0.5, 0.5, 0.5], [ 1.0, 0.0, 0.0], [1.0, 0.0]),
render::mesh::Vertex::new([ 0.5, -0.5, 0.5], [ 1.0, 0.0, 0.0], [0.0, 0.0]),
data::Vertex::new([-0.5, -0.5, -0.5], [-1.0, 0.0, 0.0], [1.0, 1.0]),
data::Vertex::new([-0.5, 0.5, -0.5], [-1.0, 0.0, 0.0], [0.0, 1.0]),
data::Vertex::new([-0.5, 0.5, 0.5], [-1.0, 0.0, 0.0], [0.0, 0.0]),
data::Vertex::new([-0.5, -0.5, 0.5], [-1.0, 0.0, 0.0], [1.0, 0.0]),
render::mesh::Vertex::new([-0.5, -0.5, -0.5], [-1.0, 0.0, 0.0], [1.0, 1.0]),
render::mesh::Vertex::new([-0.5, 0.5, -0.5], [-1.0, 0.0, 0.0], [0.0, 1.0]),
render::mesh::Vertex::new([-0.5, 0.5, 0.5], [-1.0, 0.0, 0.0], [0.0, 0.0]),
render::mesh::Vertex::new([-0.5, -0.5, 0.5], [-1.0, 0.0, 0.0], [1.0, 0.0]),
data::Vertex::new([-0.5, -0.5, -0.5], [ 0.0, -1.0, 0.0], [0.0, 1.0]),
data::Vertex::new([ 0.5, -0.5, -0.5], [ 0.0, -1.0, 0.0], [1.0, 1.0]),
data::Vertex::new([ 0.5, -0.5, 0.5], [ 0.0, -1.0, 0.0], [1.0, 0.0]),
data::Vertex::new([-0.5, -0.5, 0.5], [ 0.0, -1.0, 0.0], [0.0, 0.0]),
render::mesh::Vertex::new([-0.5, -0.5, -0.5], [ 0.0, -1.0, 0.0], [0.0, 1.0]),
render::mesh::Vertex::new([ 0.5, -0.5, -0.5], [ 0.0, -1.0, 0.0], [1.0, 1.0]),
render::mesh::Vertex::new([ 0.5, -0.5, 0.5], [ 0.0, -1.0, 0.0], [1.0, 0.0]),
render::mesh::Vertex::new([-0.5, -0.5, 0.5], [ 0.0, -1.0, 0.0], [0.0, 0.0]),
data::Vertex::new([-0.5, 0.5, -0.5], [ 0.0, 1.0, 0.0], [1.0, 1.0]),
data::Vertex::new([ 0.5, 0.5, -0.5], [ 0.0, 1.0, 0.0], [0.0, 1.0]),
data::Vertex::new([ 0.5, 0.5, 0.5], [ 0.0, 1.0, 0.0], [0.0, 0.0]),
data::Vertex::new([-0.5, 0.5, 0.5], [ 0.0, 1.0, 0.0], [1.0, 0.0]),
render::mesh::Vertex::new([-0.5, 0.5, -0.5], [ 0.0, 1.0, 0.0], [1.0, 1.0]),
render::mesh::Vertex::new([ 0.5, 0.5, -0.5], [ 0.0, 1.0, 0.0], [0.0, 1.0]),
render::mesh::Vertex::new([ 0.5, 0.5, 0.5], [ 0.0, 1.0, 0.0], [0.0, 0.0]),
render::mesh::Vertex::new([-0.5, 0.5, 0.5], [ 0.0, 1.0, 0.0], [1.0, 0.0]),
data::Vertex::new([-0.5, -0.5, -0.5], [ 0.0, 0.0, -1.0], [0.0, 0.0]),
data::Vertex::new([ 0.5, -0.5, -0.5], [ 0.0, 0.0, -1.0], [1.0, 0.0]),
data::Vertex::new([ 0.5, 0.5, -0.5], [ 0.0, 0.0, -1.0], [1.0, 1.0]),
data::Vertex::new([-0.5, 0.5, -0.5], [ 0.0, 0.0, -1.0], [0.0, 1.0]),
render::mesh::Vertex::new([-0.5, -0.5, -0.5], [ 0.0, 0.0, -1.0], [0.0, 0.0]),
render::mesh::Vertex::new([ 0.5, -0.5, -0.5], [ 0.0, 0.0, -1.0], [1.0, 0.0]),
render::mesh::Vertex::new([ 0.5, 0.5, -0.5], [ 0.0, 0.0, -1.0], [1.0, 1.0]),
render::mesh::Vertex::new([-0.5, 0.5, -0.5], [ 0.0, 0.0, -1.0], [0.0, 1.0]),
]);
let indices = Arc::new(vec![
0, 1, 2, 2, 3, 0,
@ -66,9 +64,9 @@ impl Main {
rm.add(render::Mesh::new(vertices, indices), Some("cube"))
};
let material = rm.add(material::PBRMaterialBuilder {
diffuse: material::Texture::from_image(String::from("//assets/test-128px.png")),
roughness: material::Texture::from_image(String::from("//assets/test-128px-roughness.png")),
let material = rm.add(render::material::PBRMaterialBuilder {
diffuse: render::material::Texture::from_image(String::from("//assets/test-128px.png")),
roughness: render::material::Texture::from_image(String::from("//assets/test-128px-roughness.png")),
}.build(), Some("test-128px"));
let light = rm.add(render::Light::omni_test(), Some("omni"));