Different textures per object

This commit is contained in:
2020-10-25 04:01:47 +01:00
parent d6f2b5d385
commit c055ea19ed
6 changed files with 63 additions and 54 deletions

View File

@@ -66,6 +66,7 @@ pub struct Mesh {
}
pub(crate) type MeshHandle = usize;
pub(crate) type TextureHandle = usize;
pub struct GameData {
pub start_time: SystemTime,
@@ -81,7 +82,7 @@ pub struct GameData {
pub use_line_pipeline: bool,
}
type RendererDescriptorSets = dyn DescriptorSet + Send + Sync;
pub(crate) type RendererDescriptorSets = dyn DescriptorSet + Send + Sync;
pub struct VulkanRenderer {
pub game_data: GameData,
@@ -100,7 +101,6 @@ pub struct VulkanRenderer {
pub debug_callback: Option<DebugCallback>,
pub previous_frame_end: Option<Box<dyn GpuFuture>>,
pub uniform_buffers: Vec<Arc<CpuAccessibleBuffer<vs::ty::ObjectUniformData>>>,
pub descriptor_sets: Vec<Arc<RendererDescriptorSets>>,
}
impl VulkanRenderer {
@@ -299,16 +299,7 @@ impl VulkanRenderer {
).unwrap());
}
let descriptor_set_layout = pipeline.descriptor_set_layout(0).unwrap().clone();
let descriptor_sets = uniform_buffers.iter().map(|uniform_buffer| {
let builder = PersistentDescriptorSet::start(descriptor_set_layout.clone());
let result: Arc<RendererDescriptorSets> = Arc::new(builder
.add_buffer(uniform_buffer.clone()).unwrap()
.add_sampled_image(default_tex.clone(), sampler.clone()).unwrap()
.build().unwrap());
result
}).collect();
data.textures.push(default_tex);
@@ -321,7 +312,7 @@ impl VulkanRenderer {
let previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>);
(VulkanRenderer { game_data: data, device, framebuffers, sampler,
dynamic_state, pipeline, line_pipeline, uniform_buffers, descriptor_sets,
dynamic_state, pipeline, line_pipeline, uniform_buffers,
surface, swapchain, render_pass, queue, line_vertex_buffer,
recreate_swapchain: false, debug_callback, previous_frame_end }, events_loop)
}
@@ -343,7 +334,7 @@ impl VulkanRenderer {
&self.dynamic_state,
vec![mesh.vertex_buffer.clone()],
mesh.index_buffer.clone(),
self.descriptor_sets[fb_index].clone(),
game_object.descriptor_sets[fb_index].clone(),
self.game_data.push_constants.clone()).unwrap();
}
@@ -469,8 +460,21 @@ impl VulkanRenderer {
self.game_data.textures.push(image_view);
}
pub fn add_game_object(self: &mut Self, game_object: GameObject) -> GameObjectHandle {
pub fn add_game_object(self: &mut Self, mut game_object: GameObject) -> GameObjectHandle {
let descriptor_set_layout = self.pipeline.descriptor_set_layout(0).unwrap().clone();
let descriptor_sets = self.uniform_buffers.iter().map(|uniform_buffer| {
let builder = PersistentDescriptorSet::start(descriptor_set_layout.clone());
let result: Arc<RendererDescriptorSets> = Arc::new(builder
.add_buffer(uniform_buffer.clone()).unwrap()
.add_sampled_image(self.game_data.textures[game_object.texture_index].clone(), self.sampler.clone()).unwrap()
.build().unwrap());
result
}).collect();
game_object.descriptor_sets = descriptor_sets;
self.game_data.game_objects.push(game_object);
GameObjectHandle {
object_index: self.game_data.game_objects.len() - 1
}
@@ -478,20 +482,14 @@ impl VulkanRenderer {
}
pub fn start_event_loop(mut renderer: VulkanRenderer, mut game: Box<dyn Game>, event_loop: EventLoop<()>) {
let mut recreate_swapchain = false;
let mut ubo = game.update(&mut renderer);
event_loop.run(move |event, _, control_flow| {
game.on_window_event(&event);
match event {
Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => {
*control_flow = ControlFlow::Exit;
},
Event::WindowEvent { event: WindowEvent::Resized(_), .. } => {
recreate_swapchain = true;
},
Event::RedrawEventsCleared => {
ubo = game.update(&mut renderer);
let ubo = game.update(&mut renderer);
renderer.render_loop(ubo);
},
_ => {}