update ResourceProvider::update to actually use read-only world

This commit is contained in:
Carter Anderson 2020-04-11 20:32:25 -07:00
parent b9f4c0a53b
commit 77a6619bf4
7 changed files with 88 additions and 114 deletions

View File

@ -10,8 +10,7 @@ pub trait ResourceProvider {
) { ) {
} }
// TODO: make this read-only fn update(&mut self, _render_context: &mut dyn RenderContext, _world: &World, _resources: &Resources) {
fn update(&mut self, _render_context: &mut dyn RenderContext, _world: &mut World, _resources: &Resources) {
} }
// TODO: remove this // TODO: remove this

View File

@ -27,8 +27,28 @@ impl Camera2dResourceProvider {
window_resized_event_reader, window_resized_event_reader,
} }
} }
}
fn update_read_only( impl ResourceProvider for Camera2dResourceProvider {
fn initialize(
&mut self,
render_context: &mut dyn RenderContext,
_world: &mut World,
resources: &Resources,
) {
let buffer = render_context.resources_mut().create_buffer(BufferInfo {
size: std::mem::size_of::<[[f32; 4]; 4]>(),
buffer_usage: BufferUsage::COPY_DST | BufferUsage::UNIFORM,
..Default::default()
});
let mut render_resource_assignments =
resources.get_mut::<RenderResourceAssignments>().unwrap();
render_resource_assignments.set(resource_name::uniform::CAMERA2D, buffer);
self.camera_buffer = Some(buffer);
}
fn update(
&mut self, &mut self,
render_context: &mut dyn RenderContext, render_context: &mut dyn RenderContext,
world: &World, world: &World,
@ -43,8 +63,7 @@ impl Camera2dResourceProvider {
if let Some(_) = primary_window_resized_event { if let Some(_) = primary_window_resized_event {
let matrix_size = std::mem::size_of::<[[f32; 4]; 4]>(); let matrix_size = std::mem::size_of::<[[f32; 4]; 4]>();
for (camera, _) in <(Read<Camera>, Read<ActiveCamera2d>)>::query().iter(world) for (camera, _) in <(Read<Camera>, Read<ActiveCamera2d>)>::query().iter(world) {
{
let camera_matrix: [[f32; 4]; 4] = camera.view_matrix.to_cols_array_2d(); let camera_matrix: [[f32; 4]; 4] = camera.view_matrix.to_cols_array_2d();
if let Some(old_tmp_buffer) = self.tmp_buffer { if let Some(old_tmp_buffer) = self.tmp_buffer {
@ -73,32 +92,3 @@ impl Camera2dResourceProvider {
} }
} }
} }
impl ResourceProvider for Camera2dResourceProvider {
fn initialize(
&mut self,
render_context: &mut dyn RenderContext,
_world: &mut World,
resources: &Resources,
) {
let buffer = render_context.resources_mut().create_buffer(BufferInfo {
size: std::mem::size_of::<[[f32; 4]; 4]>(),
buffer_usage: BufferUsage::COPY_DST | BufferUsage::UNIFORM,
..Default::default()
});
let mut render_resource_assignments =
resources.get_mut::<RenderResourceAssignments>().unwrap();
render_resource_assignments.set(resource_name::uniform::CAMERA2D, buffer);
self.camera_buffer = Some(buffer);
}
fn update(
&mut self,
render_context: &mut dyn RenderContext,
world: &mut World,
resources: &Resources,
) {
self.update_read_only(render_context, world, resources);
}
}

View File

@ -28,8 +28,33 @@ impl CameraResourceProvider {
window_resized_event_reader, window_resized_event_reader,
} }
} }
}
pub fn update_read_only(&mut self, world: &World, resources: &Resources, render_context: &mut dyn RenderContext) { impl ResourceProvider for CameraResourceProvider {
fn initialize(
&mut self,
render_context: &mut dyn RenderContext,
_world: &mut World,
resources: &Resources,
) {
let buffer = render_context.resources_mut().create_buffer(BufferInfo {
size: std::mem::size_of::<[[f32; 4]; 4]>(),
buffer_usage: BufferUsage::COPY_DST | BufferUsage::UNIFORM,
..Default::default()
});
let mut render_resource_assignments =
resources.get_mut::<RenderResourceAssignments>().unwrap();
render_resource_assignments.set(resource_name::uniform::CAMERA, buffer);
self.camera_buffer = Some(buffer);
}
fn update(
&mut self,
render_context: &mut dyn RenderContext,
world: &World,
resources: &Resources,
) {
let window_resized_events = resources.get::<Events<WindowResized>>().unwrap(); let window_resized_events = resources.get::<Events<WindowResized>>().unwrap();
let primary_window_resized_event = window_resized_events let primary_window_resized_event = window_resized_events
.iter(&mut self.window_resized_event_reader) .iter(&mut self.window_resized_event_reader)
@ -70,32 +95,3 @@ impl CameraResourceProvider {
} }
} }
} }
impl ResourceProvider for CameraResourceProvider {
fn initialize(
&mut self,
render_context: &mut dyn RenderContext,
_world: &mut World,
resources: &Resources,
) {
let buffer = render_context.resources_mut().create_buffer(BufferInfo {
size: std::mem::size_of::<[[f32; 4]; 4]>(),
buffer_usage: BufferUsage::COPY_DST | BufferUsage::UNIFORM,
..Default::default()
});
let mut render_resource_assignments =
resources.get_mut::<RenderResourceAssignments>().unwrap();
render_resource_assignments.set(resource_name::uniform::CAMERA, buffer);
self.camera_buffer = Some(buffer);
}
fn update(
&mut self,
render_context: &mut dyn RenderContext,
world: &mut World,
resources: &Resources,
) {
self.update_read_only(world, resources, render_context);
}
}

View File

@ -21,8 +21,10 @@ impl FrameTextureResourceProvider {
height: 0, height: 0,
} }
} }
}
pub fn update(&mut self, render_context: &mut dyn RenderContext, resources: &Resources) { impl ResourceProvider for FrameTextureResourceProvider {
fn update(&mut self, render_context: &mut dyn RenderContext, _world: &World, resources: &Resources) {
let windows = resources.get::<Windows>().unwrap(); let windows = resources.get::<Windows>().unwrap();
let window = windows.get_primary().unwrap(); let window = windows.get_primary().unwrap();
@ -44,9 +46,3 @@ impl FrameTextureResourceProvider {
} }
} }
} }
impl ResourceProvider for FrameTextureResourceProvider {
fn update(&mut self, render_context: &mut dyn RenderContext, _world: &mut World, resources: &Resources) {
self.update(render_context, resources)
}
}

View File

@ -3,7 +3,8 @@ use crate::{
resource_name, BufferInfo, BufferUsage, RenderResource, RenderResourceAssignments, resource_name, BufferInfo, BufferUsage, RenderResource, RenderResourceAssignments,
ResourceProvider, ResourceProvider,
}, },
Light, LightRaw, renderer_2::RenderContext, renderer_2::RenderContext,
Light, LightRaw,
}; };
use bevy_transform::prelude::{LocalToWorld, Translation}; use bevy_transform::prelude::{LocalToWorld, Translation};
use legion::prelude::*; use legion::prelude::*;
@ -33,7 +34,35 @@ impl LightResourceProvider {
tmp_count_buffer: None, tmp_count_buffer: None,
} }
} }
fn update_read_only(&mut self, render_context: &mut dyn RenderContext, world: &World) { }
impl ResourceProvider for LightResourceProvider {
fn initialize(
&mut self,
render_context: &mut dyn RenderContext,
_world: &mut World,
resources: &Resources,
) {
let light_uniform_size =
std::mem::size_of::<LightCount>() + self.max_lights * std::mem::size_of::<LightRaw>();
let buffer = render_context.resources_mut().create_buffer(BufferInfo {
size: light_uniform_size,
buffer_usage: BufferUsage::UNIFORM | BufferUsage::COPY_SRC | BufferUsage::COPY_DST,
..Default::default()
});
let mut render_resource_assignments =
resources.get_mut::<RenderResourceAssignments>().unwrap();
render_resource_assignments.set(resource_name::uniform::LIGHTS, buffer);
self.light_buffer = Some(buffer);
}
fn update(
&mut self,
render_context: &mut dyn RenderContext,
world: &World,
_resources: &Resources,
) {
if self.lights_are_dirty { if self.lights_are_dirty {
let light_query = <(Read<Light>, Read<LocalToWorld>, Read<Translation>)>::query(); let light_query = <(Read<Light>, Read<LocalToWorld>, Read<Translation>)>::query();
let light_count = light_query.iter(world).count(); let light_count = light_query.iter(world).count();
@ -101,29 +130,3 @@ impl LightResourceProvider {
} }
} }
} }
impl ResourceProvider for LightResourceProvider {
fn initialize(
&mut self,
render_context: &mut dyn RenderContext,
_world: &mut World,
resources: &Resources,
) {
let light_uniform_size =
std::mem::size_of::<LightCount>() + self.max_lights * std::mem::size_of::<LightRaw>();
let buffer = render_context.resources_mut().create_buffer(BufferInfo {
size: light_uniform_size,
buffer_usage: BufferUsage::UNIFORM | BufferUsage::COPY_SRC | BufferUsage::COPY_DST,
..Default::default()
});
let mut render_resource_assignments =
resources.get_mut::<RenderResourceAssignments>().unwrap();
render_resource_assignments.set(resource_name::uniform::LIGHTS, buffer);
self.light_buffer = Some(buffer);
}
fn update(&mut self, render_context: &mut dyn RenderContext, world: &mut World, _resources: &Resources) {
self.update_read_only(render_context, world);
}
}

View File

@ -91,7 +91,7 @@ impl ResourceProvider for MeshResourceProvider {
vertex_buffer_descriptors.set(Vertex::get_vertex_buffer_descriptor().cloned().unwrap()); vertex_buffer_descriptors.set(Vertex::get_vertex_buffer_descriptor().cloned().unwrap());
} }
fn update(&mut self, _render_context: &mut dyn RenderContext, _world: &mut World, _resources: &Resources) { fn update(&mut self, _render_context: &mut dyn RenderContext, _world: &World, _resources: &Resources) {
} }
fn finish_update( fn finish_update(

View File

@ -128,18 +128,6 @@ where
} }
} }
fn update_readonly(
&mut self,
_render_context: &mut dyn RenderContext,
world: &World,
resources: &Resources,
) {
self.reset_buffer_array_status_counts();
self.update_uniforms_info(world);
self.update_uniform_handles_info(world, resources);
}
fn reset_buffer_array_status_counts(&mut self) { fn reset_buffer_array_status_counts(&mut self) {
for buffer_status in self.uniform_buffer_status.iter_mut() { for buffer_status in self.uniform_buffer_status.iter_mut() {
if let Some((_name, buffer_status)) = buffer_status { if let Some((_name, buffer_status)) = buffer_status {
@ -734,10 +722,12 @@ where
fn update( fn update(
&mut self, &mut self,
_render_context: &mut dyn RenderContext, _render_context: &mut dyn RenderContext,
world: &mut World, world: &World,
resources: &Resources, resources: &Resources,
) { ) {
self.update_readonly(_render_context, world, resources); self.reset_buffer_array_status_counts();
self.update_uniforms_info(world);
self.update_uniform_handles_info(world, resources);
} }
fn finish_update( fn finish_update(