remove game object handles
This commit is contained in:
@@ -39,6 +39,10 @@ impl GameObject {
|
||||
descriptor_sets: vec![], is_selected: false, pipeline_index: mesh.pipeline_index }
|
||||
}
|
||||
|
||||
pub fn init_descriptor_sets(&mut self, renderer: &mut VulkanRenderer) {
|
||||
self.descriptor_sets = renderer.pipelines[self.pipeline_index].create_descriptor_set(&self.textures, renderer);
|
||||
}
|
||||
|
||||
pub fn _set_position(&mut self, x: f32, y: f32, z: f32) {
|
||||
self.position.x = x;
|
||||
self.position.y = y;
|
||||
@@ -80,21 +84,8 @@ impl GameObject {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub struct GameObjectHandle {
|
||||
pub object_index: usize
|
||||
}
|
||||
|
||||
impl GameObjectHandle {
|
||||
pub fn get_game_object<'a>(&self, renderer: &'a VulkanRenderer) -> Option<&'a GameObject> {
|
||||
renderer.game_data.game_objects.get(self.object_index)
|
||||
}
|
||||
|
||||
pub fn get_game_object_mut<'a>(&mut self, renderer: &'a mut VulkanRenderer) -> Option<&'a mut GameObject> {
|
||||
renderer.game_data.game_objects.get_mut(self.object_index)
|
||||
}
|
||||
}
|
||||
pub type GameObjectHandle = usize;
|
||||
|
||||
pub trait Updatable {
|
||||
fn update(&mut self, delta_time: f32, input: &InputState, renderer: &mut VulkanRenderer);
|
||||
fn update(&mut self, delta_time: f32, input: &InputState, renderer: &mut VulkanRenderer, game_objects: &mut Vec<GameObject>);
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ use pipelines::{DefaultShader, TextShader};
|
||||
use pipelines::vs;
|
||||
|
||||
use crate::config::RenderConfig;
|
||||
use crate::vulkan::gameobject::{GameObject, GameObjectHandle};
|
||||
use crate::vulkan::gameobject::GameObject;
|
||||
|
||||
use self::mesh::CPUVertex;
|
||||
|
||||
@@ -77,6 +77,8 @@ pub trait Game {
|
||||
fn on_window_event(self: &mut Self, event: &Event<()>);
|
||||
|
||||
fn update(self: &mut Self, renderer: &mut VulkanRenderer) -> vs::ty::ObjectUniformData;
|
||||
|
||||
fn get_game_objects(&self) -> &Vec<GameObject>;
|
||||
}
|
||||
|
||||
pub struct Mesh<V> {
|
||||
@@ -108,7 +110,6 @@ pub struct GameData {
|
||||
pub recreate_pipeline: bool,
|
||||
pub dimensions: [u32; 2],
|
||||
pub shutdown: bool,
|
||||
pub game_objects: Vec<GameObject>,
|
||||
pub meshes: Vec<Mesh<Vertex>>,
|
||||
pub meshes_text: Vec<Mesh<TextVertex>>,
|
||||
pub textures: Vec<Texture>,
|
||||
@@ -149,7 +150,6 @@ impl VulkanRenderer {
|
||||
dimensions: [0, 0],
|
||||
meshes: vec![],
|
||||
meshes_text: vec![],
|
||||
game_objects: vec![],
|
||||
textures: vec![],
|
||||
};
|
||||
|
||||
@@ -310,7 +310,7 @@ impl VulkanRenderer {
|
||||
}, events_loop)
|
||||
}
|
||||
|
||||
fn create_command_buffer(self: &mut Self, fb_index: usize, uniform_buffer_data: vs::ty::ObjectUniformData) -> Arc<AutoCommandBuffer> {
|
||||
fn create_command_buffer(self: &mut Self, fb_index: usize, uniform_buffer_data: vs::ty::ObjectUniformData, game_objects: &Vec<GameObject>) -> Arc<AutoCommandBuffer> {
|
||||
// General setup
|
||||
let mut builder = AutoCommandBufferBuilder::primary_simultaneous_use(self.device.clone(), self.queue.family()).unwrap();
|
||||
builder.update_buffer(self.uniform_buffers[fb_index].clone(), uniform_buffer_data).unwrap();
|
||||
@@ -323,7 +323,7 @@ impl VulkanRenderer {
|
||||
// Draw meshes etc.
|
||||
let mut index = 0;
|
||||
for pipeline in &self.pipelines {
|
||||
pipeline.draw(&mut builder, fb_index, self.game_data.game_objects.iter().filter(|go| go.pipeline_index == index).collect(), &self.game_data, &self.dynamic_state);
|
||||
pipeline.draw(&mut builder, fb_index, game_objects.iter().filter(|go| go.pipeline_index == index).collect(), &self.game_data, &self.dynamic_state);
|
||||
index += 1;
|
||||
}
|
||||
|
||||
@@ -332,13 +332,7 @@ impl VulkanRenderer {
|
||||
Arc::new(builder.build().unwrap())
|
||||
}
|
||||
|
||||
pub fn update_descriptor_set(&mut self, game_object_handle: &mut GameObjectHandle) {
|
||||
let pipeline_index = game_object_handle.get_game_object_mut(self).unwrap().pipeline_index;
|
||||
let textures = game_object_handle.get_game_object_mut(self).unwrap().textures.clone();
|
||||
self.pipelines[pipeline_index].create_descriptor_set(&textures, self);
|
||||
}
|
||||
|
||||
pub fn render_loop(self: &mut Self, new_ubo: vs::ty::ObjectUniformData) {
|
||||
pub fn render_loop(self: &mut Self, new_ubo: vs::ty::ObjectUniformData, game_objects: &Vec<GameObject>) {
|
||||
// cleanup previous frame
|
||||
self.previous_frame_end.as_mut().unwrap().cleanup_finished();
|
||||
|
||||
@@ -398,7 +392,7 @@ impl VulkanRenderer {
|
||||
Err(err) => panic!("{:?}", err)
|
||||
};
|
||||
|
||||
let command_buffer = self.create_command_buffer(fb_index, new_ubo).clone();
|
||||
let command_buffer = self.create_command_buffer(fb_index, new_ubo, game_objects).clone();
|
||||
|
||||
let future = self.previous_frame_end.take().unwrap()
|
||||
.join(acquire_future)
|
||||
@@ -574,24 +568,7 @@ impl VulkanRenderer {
|
||||
Texture { image: image_view, sampler }
|
||||
}
|
||||
|
||||
pub fn update_texture(&mut self, texture: &mut Texture, new_data: &[u8], new_data_dimensions: [u32; 3], new_data_offset: [u32; 3], device: Arc<Device>) -> Option<Texture> {
|
||||
let new_image_usage = ImageUsage {
|
||||
transfer_destination: true,
|
||||
transfer_source: true,
|
||||
sampled: true,
|
||||
..ImageUsage::none()
|
||||
};
|
||||
|
||||
// let (new_image_view, new_image_initializer) = ImmutableImage::uninitialized(
|
||||
// device.clone(),
|
||||
// Dimensions::Dim2d { width: texture.image.dimensions().width(), height: texture.image.dimensions().height() },
|
||||
// texture.image.format(),
|
||||
// texture.image.mipmap_levels(),
|
||||
// new_image_usage,
|
||||
// ImageLayout::ShaderReadOnlyOptimal,
|
||||
// device.active_queue_families(),
|
||||
// ).unwrap();
|
||||
|
||||
pub fn update_texture(&mut self, texture: &mut Texture, new_data: &[u8], new_data_dimensions: [u32; 3], new_data_offset: [u32; 3], device: Arc<Device>) {
|
||||
let old_sub_image = SubImage::new(
|
||||
texture.image.clone(),
|
||||
0,
|
||||
@@ -601,30 +578,8 @@ impl VulkanRenderer {
|
||||
ImageLayout::ShaderReadOnlyOptimal,
|
||||
);
|
||||
|
||||
// let new_sub_image = SubImage::new(
|
||||
// Arc::new(new_image_initializer),
|
||||
// 0,
|
||||
// new_image_view.mipmap_levels(),
|
||||
// 0,
|
||||
// 1,
|
||||
// ImageLayout::ShaderReadOnlyOptimal,
|
||||
// );
|
||||
|
||||
let mut cbb = AutoCommandBufferBuilder::new(device.clone(), self.queue.family()).unwrap();
|
||||
|
||||
// cbb.copy_image(
|
||||
// old_sub_image.clone(),
|
||||
// [0, 0, 0],
|
||||
// 0,
|
||||
// 0,
|
||||
// new_sub_image.clone(),
|
||||
// [0, 0, 0],
|
||||
// 0,
|
||||
// 0,
|
||||
// old_sub_image.dimensions().width_height_depth(),
|
||||
// 1
|
||||
// ).unwrap();
|
||||
|
||||
let upload_source = CpuAccessibleBuffer::from_iter(
|
||||
device.clone(),
|
||||
BufferUsage::transfer_source(),
|
||||
@@ -647,22 +602,68 @@ impl VulkanRenderer {
|
||||
let future = cb.execute(self.queue.clone()).unwrap();
|
||||
|
||||
future.flush().unwrap();
|
||||
|
||||
// Texture { image: texture.image.clone(), sampler: texture.sampler.clone() }
|
||||
None
|
||||
}
|
||||
|
||||
pub fn add_game_object(self: &mut Self, mut game_object: GameObject) -> GameObjectHandle {
|
||||
game_object.descriptor_sets = self.pipelines[game_object.pipeline_index].create_descriptor_set(&game_object.textures, self);
|
||||
self.game_data.game_objects.push(game_object);
|
||||
pub fn resize_texture(&mut self, game_object: &mut GameObject, old_texture: &mut Texture, new_size: Dimensions, device: Arc<Device>) {
|
||||
let new_image_usage = ImageUsage {
|
||||
transfer_destination: true,
|
||||
transfer_source: true,
|
||||
sampled: true,
|
||||
..ImageUsage::none()
|
||||
};
|
||||
|
||||
let (new_image_view, new_image_initializer) = ImmutableImage::uninitialized(
|
||||
device.clone(),
|
||||
new_size,
|
||||
old_texture.image.format(),
|
||||
old_texture.image.mipmap_levels(),
|
||||
new_image_usage,
|
||||
ImageLayout::ShaderReadOnlyOptimal,
|
||||
device.active_queue_families(),
|
||||
).unwrap();
|
||||
|
||||
GameObjectHandle {
|
||||
object_index: self.game_data.game_objects.len() - 1
|
||||
}
|
||||
let old_sub_image = SubImage::new(
|
||||
old_texture.image.clone(),
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
ImageLayout::ShaderReadOnlyOptimal,
|
||||
);
|
||||
|
||||
let new_sub_image = SubImage::new(
|
||||
Arc::new(new_image_initializer),
|
||||
0,
|
||||
new_image_view.mipmap_levels(),
|
||||
0,
|
||||
1,
|
||||
ImageLayout::ShaderReadOnlyOptimal,
|
||||
);
|
||||
|
||||
let mut cbb = AutoCommandBufferBuilder::new(device.clone(), self.queue.family()).unwrap();
|
||||
|
||||
cbb.copy_image(
|
||||
old_sub_image.clone(),
|
||||
[0, 0, 0],
|
||||
0,
|
||||
0,
|
||||
new_sub_image.clone(),
|
||||
[0, 0, 0],
|
||||
0,
|
||||
0,
|
||||
old_sub_image.dimensions().width_height_depth(),
|
||||
1
|
||||
).unwrap();
|
||||
|
||||
let cb = cbb.build().unwrap();
|
||||
let future = cb.execute(self.queue.clone()).unwrap();
|
||||
future.flush().unwrap();
|
||||
|
||||
old_texture.image = new_image_view;
|
||||
game_object.init_descriptor_sets(self);
|
||||
}
|
||||
|
||||
pub fn clear_all(&mut self) {
|
||||
self.game_data.game_objects.clear();
|
||||
self.game_data.meshes.clear();
|
||||
self.game_data.textures.clear();
|
||||
}
|
||||
@@ -682,7 +683,7 @@ pub fn start_event_loop(mut renderer: VulkanRenderer, mut game: Box<dyn Game>, e
|
||||
},
|
||||
Event::RedrawEventsCleared => {
|
||||
let ubo = game.update(&mut renderer);
|
||||
renderer.render_loop(ubo);
|
||||
renderer.render_loop(ubo, &game.get_game_objects());
|
||||
},
|
||||
_ => {}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user