Different textures per object
This commit is contained in:
@@ -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);
|
||||
},
|
||||
_ => {}
|
||||
|
||||
Reference in New Issue
Block a user