Add latest and earliest methods to events and begin camera system port
This commit is contained in:
parent
dcd71d1b72
commit
2eda84a0b8
@ -112,7 +112,8 @@ where
|
||||
self.event_count += 1;
|
||||
}
|
||||
|
||||
/// Iterates over the events the `event_reader` has not seen yet.
|
||||
/// Iterates over the events the `event_reader` has not seen yet. This updates the `event_reader`'s event counter,
|
||||
/// which means subsequent event reads will not include events that happened before now.
|
||||
pub fn iter(&self, event_reader: &mut EventReader<T>) -> impl DoubleEndedIterator<Item = &T> {
|
||||
// if the reader has seen some of the events in a buffer, find the proper index offset.
|
||||
// otherwise read all events in the buffer
|
||||
@ -157,6 +158,30 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
/// Retrieves the latest event. This updates the `event_reader`'s event counter,
|
||||
/// which means subsequent event reads will not include events that happened before now.
|
||||
pub fn latest(&self, event_reader: &mut EventReader<T>) -> Option<&T> {
|
||||
self.iter(event_reader)
|
||||
.rev()
|
||||
.next()
|
||||
}
|
||||
|
||||
/// Retrieves the latest event that matches the given `predicate`. This updates the `event_reader`'s event counter,
|
||||
/// which means subsequent event reads will not include events that happened before now.
|
||||
pub fn find_latest(&self, event_reader: &mut EventReader<T>, predicate: impl FnMut(&&T) -> bool) -> Option<&T> {
|
||||
self.iter(event_reader)
|
||||
.rev()
|
||||
.filter(predicate)
|
||||
.next()
|
||||
}
|
||||
|
||||
/// Retrieves the earliest event. This updates the `event_reader`'s event counter,
|
||||
/// which means subsequent event reads will not include events that happened before now.
|
||||
pub fn earliest(&self, event_reader: &mut EventReader<T>) -> Option<&T> {
|
||||
self.iter(event_reader)
|
||||
.next()
|
||||
}
|
||||
|
||||
/// Gets a new [EventReader]. This will include all events already in the event buffers.
|
||||
pub fn get_reader(&self) -> EventReader<T> {
|
||||
EventReader {
|
||||
|
||||
@ -126,12 +126,8 @@ pub fn camera_update_system(resources: &mut Resources) -> Box<dyn Schedulable> {
|
||||
.read_resource::<Events<WindowResized>>()
|
||||
.with_query(<Write<Camera>>::query())
|
||||
.build(move |_, world, window_resized_events, query| {
|
||||
// TODO: refactor this to "window_resized_events.latest()"
|
||||
let primary_window_resized_event = window_resized_events
|
||||
.iter(&mut window_resized_event_reader)
|
||||
.rev()
|
||||
.filter(|event| event.is_primary)
|
||||
.next();
|
||||
.find_latest(&mut window_resized_event_reader, |event| event.is_primary);
|
||||
if let Some(primary_window_resized_event) = primary_window_resized_event {
|
||||
for mut camera in query.iter_mut(world) {
|
||||
camera.update(
|
||||
|
||||
@ -56,10 +56,7 @@ impl ResourceProvider for Camera2dResourceProvider {
|
||||
) {
|
||||
let window_resized_events = resources.get::<Events<WindowResized>>().unwrap();
|
||||
let primary_window_resized_event = window_resized_events
|
||||
.iter(&mut self.window_resized_event_reader)
|
||||
.rev()
|
||||
.filter(|event| event.is_primary)
|
||||
.next();
|
||||
.find_latest(&mut self.window_resized_event_reader, |event| event.is_primary);
|
||||
|
||||
if let Some(_) = primary_window_resized_event {
|
||||
let matrix_size = std::mem::size_of::<[[f32; 4]; 4]>();
|
||||
|
||||
@ -5,15 +5,81 @@ use crate::{
|
||||
resource_name, BufferInfo, BufferUsage, RenderResource, RenderResourceAssignments,
|
||||
ResourceProvider,
|
||||
},
|
||||
renderer_2::RenderContext,
|
||||
renderer_2::{GlobalRenderResourceContext, RenderContext},
|
||||
ActiveCamera, Camera,
|
||||
};
|
||||
|
||||
use bevy_app::{EventReader, Events};
|
||||
use bevy_app::{EventReader, Events, GetEventReader};
|
||||
use bevy_transform::prelude::*;
|
||||
use legion::prelude::*;
|
||||
use zerocopy::AsBytes;
|
||||
|
||||
pub fn camera_resource_provider_system(resources: &mut Resources) -> Box<dyn Schedulable> {
|
||||
let mut camera_buffer = None;
|
||||
let mut tmp_buffer = None;
|
||||
let mut window_resized_event_reader = resources.get_event_reader::<WindowResized>();
|
||||
SystemBuilder::new("mesh_resource_provider")
|
||||
.read_resource::<GlobalRenderResourceContext>()
|
||||
// TODO: this write on RenderResourceAssignments will prevent this system from running in parallel with other systems that do the same
|
||||
.write_resource::<RenderResourceAssignments>()
|
||||
.read_resource::<Events<WindowResized>>()
|
||||
.with_query(<(Read<Camera>, Read<LocalToWorld>, Read<ActiveCamera>)>::query())
|
||||
.build(
|
||||
move |_,
|
||||
world,
|
||||
(
|
||||
render_resource_context,
|
||||
ref mut render_resource_assignments,
|
||||
window_resized_events,
|
||||
),
|
||||
query| {
|
||||
let render_resources = &render_resource_context.context;
|
||||
if camera_buffer.is_none() {
|
||||
let buffer = render_resources.create_buffer(BufferInfo {
|
||||
size: std::mem::size_of::<[[f32; 4]; 4]>(),
|
||||
buffer_usage: BufferUsage::COPY_DST | BufferUsage::UNIFORM,
|
||||
..Default::default()
|
||||
});
|
||||
render_resource_assignments.set(resource_name::uniform::CAMERA, buffer);
|
||||
camera_buffer = Some(buffer);
|
||||
}
|
||||
|
||||
let primary_window_resized_event = window_resized_events
|
||||
.find_latest(&mut window_resized_event_reader, |event| event.is_primary);
|
||||
if let Some(_) = primary_window_resized_event {
|
||||
let matrix_size = std::mem::size_of::<[[f32; 4]; 4]>();
|
||||
for (camera, local_to_world, _) in query.iter(world) {
|
||||
let camera_matrix: [[f32; 4]; 4] =
|
||||
(camera.view_matrix * local_to_world.0).to_cols_array_2d();
|
||||
|
||||
if let Some(old_tmp_buffer) = tmp_buffer {
|
||||
render_resources.remove_buffer(old_tmp_buffer);
|
||||
}
|
||||
|
||||
tmp_buffer = Some(render_resources.create_buffer_mapped(
|
||||
BufferInfo {
|
||||
size: matrix_size,
|
||||
buffer_usage: BufferUsage::COPY_SRC,
|
||||
..Default::default()
|
||||
},
|
||||
&mut |data, _renderer| {
|
||||
data[0..matrix_size].copy_from_slice(camera_matrix.as_bytes());
|
||||
},
|
||||
));
|
||||
|
||||
// render_resources.copy_buffer_to_buffer(
|
||||
// tmp_buffer.unwrap(),
|
||||
// 0,
|
||||
// camera_buffer.unwrap(),
|
||||
// 0,
|
||||
// matrix_size as u64,
|
||||
// );
|
||||
}
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
pub struct CameraResourceProvider {
|
||||
pub camera_buffer: Option<RenderResource>,
|
||||
pub tmp_buffer: Option<RenderResource>,
|
||||
@ -57,10 +123,9 @@ impl ResourceProvider for CameraResourceProvider {
|
||||
) {
|
||||
let window_resized_events = resources.get::<Events<WindowResized>>().unwrap();
|
||||
let primary_window_resized_event = window_resized_events
|
||||
.iter(&mut self.window_resized_event_reader)
|
||||
.rev()
|
||||
.filter(|event| event.is_primary)
|
||||
.next();
|
||||
.find_latest(&mut self.window_resized_event_reader, |event| {
|
||||
event.is_primary
|
||||
});
|
||||
if let Some(_) = primary_window_resized_event {
|
||||
let matrix_size = std::mem::size_of::<[[f32; 4]; 4]>();
|
||||
for (camera, local_to_world, _) in
|
||||
|
||||
@ -35,6 +35,7 @@ pub fn mesh_resource_provider_system(resources: &mut Resources) -> Box<dyn Sched
|
||||
)
|
||||
} else {
|
||||
let mesh_asset = meshes.get(&handle).unwrap();
|
||||
// TODO: use a staging buffer here
|
||||
let vertex_buffer = render_resources.create_buffer_with_data(
|
||||
BufferInfo {
|
||||
buffer_usage: BufferUsage::VERTEX,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user