pipeline: Refactor square pipeline + add support of indexes

This commit is contained in:
Florian RICHER 2025-05-28 22:39:56 +02:00
parent 122f577a26
commit 131811a539
Signed by: florian.richer
GPG key ID: C73D37CBED7BFC77
9 changed files with 270 additions and 217 deletions

View file

@ -1,43 +1,19 @@
use crate::core::input::InputManager;
use crate::core::render::pipelines::triangle_pipeline::create_triangle_pipeline;
use crate::core::render::primitives::camera::Camera;
use crate::core::render::primitives::vertex::Vertex2D;
use crate::core::render::render_context::RenderContext;
use crate::core::render::texture::Texture;
use crate::core::scene::Scene;
use crate::core::timer::Timer;
use glam::{Mat4, Vec3};
use std::sync::Arc;
use vulkano::buffer::Subbuffer;
use vulkano::command_buffer::{
AutoCommandBufferBuilder, CommandBufferUsage, PrimaryAutoCommandBuffer,
PrimaryCommandBufferAbstract,
};
use vulkano::descriptor_set::{DescriptorSet, WriteDescriptorSet};
use vulkano::pipeline::{GraphicsPipeline, Pipeline, PipelineBindPoint};
const VERTICES: [Vertex2D; 4] = [
Vertex2D {
position: [0.0, 0.0],
uv: [0.0, 0.0],
},
Vertex2D {
position: [0.0, 5.0],
uv: [0.0, 0.5],
},
Vertex2D {
position: [10.0, 0.0],
uv: [1.0, 0.0],
},
Vertex2D {
position: [10.0, 5.0],
uv: [1.0, 0.5],
},
];
use super::assets::square::Square;
pub struct MainSceneState {
pipeline: Arc<GraphicsPipeline>,
vertex_buffer: Subbuffer<[Vertex2D]>,
square: Square,
camera: Camera,
texture: Texture,
speed: f32,
@ -54,12 +30,12 @@ impl Scene for MainScene {
}
fn load(&mut self, render_context: &RenderContext) {
let pipeline =
create_triangle_pipeline(render_context.device(), render_context.swapchain_format())
.unwrap();
let vertex_buffer =
Vertex2D::create_buffer(Vec::from_iter(VERTICES), render_context.memory_allocator())
.unwrap();
let square = Square::new(
render_context.device(),
render_context.memory_allocator(),
render_context.swapchain_format(),
)
.unwrap();
let camera = Camera::new(
Mat4::look_at_rh(
@ -97,8 +73,7 @@ impl Scene for MainScene {
.unwrap();
self.state = Some(MainSceneState {
pipeline,
vertex_buffer,
square,
camera,
texture,
speed: 50.0,
@ -128,49 +103,20 @@ impl Scene for MainScene {
builder: &mut AutoCommandBufferBuilder<PrimaryAutoCommandBuffer>,
) {
let state = self.state.as_ref().unwrap();
let vertex_count = state.vertex_buffer.len() as u32;
let instance_count = vertex_count / 4;
let layouts = state.pipeline.layout().set_layouts();
let uniform_buffer = state
let camera_uniform = state
.camera
.create_buffer(render_context.memory_allocator())
.unwrap();
let uniform_descriptor_set = DescriptorSet::new(
render_context.descriptor_set_allocator().clone(),
layouts[0].clone(),
[WriteDescriptorSet::buffer(0, uniform_buffer)],
[],
)
.unwrap();
let texture_descriptor_set = DescriptorSet::new(
render_context.descriptor_set_allocator().clone(),
layouts[1].clone(),
[
WriteDescriptorSet::sampler(0, state.texture.get_sampler().clone()),
WriteDescriptorSet::image_view(1, state.texture.get_texture().clone()),
],
[],
)
.unwrap();
unsafe {
builder
.bind_pipeline_graphics(state.pipeline.clone())
.unwrap()
.bind_descriptor_sets(
PipelineBindPoint::Graphics,
state.pipeline.layout().clone(),
0,
vec![uniform_descriptor_set, texture_descriptor_set],
)
.unwrap()
.bind_vertex_buffers(0, state.vertex_buffer.clone())
.unwrap()
.draw(vertex_count, instance_count, 0, 0)
.unwrap();
}
state
.square
.render(
builder,
render_context.descriptor_set_allocator(),
&camera_uniform,
&state.texture,
)
.unwrap();
}
fn unload(&mut self) {}