add resource providers to render_graph

This commit is contained in:
Carter Anderson 2020-01-23 01:06:37 -08:00
parent 2226292ce0
commit 7b89531268
2 changed files with 16 additions and 8 deletions

View File

@ -1,10 +1,11 @@
use crate::render::render_graph_2::{PassDescriptor, PipelineDescriptor}; use crate::render::render_graph_2::{PassDescriptor, PipelineDescriptor, ResourceProvider};
use std::collections::HashMap; use std::collections::HashMap;
pub struct RenderGraph { pub struct RenderGraph {
pub pipeline_descriptors: HashMap<String, PipelineDescriptor>, pub pipeline_descriptors: HashMap<String, PipelineDescriptor>,
pub pass_descriptors: HashMap<String, PassDescriptor>, pub pass_descriptors: HashMap<String, PassDescriptor>,
pub pass_pipelines: HashMap<String, Vec<String>>, pub pass_pipelines: HashMap<String, Vec<String>>,
pub resource_providers: Vec<Box<dyn ResourceProvider>>,
} }
impl Default for RenderGraph { impl Default for RenderGraph {
@ -13,6 +14,7 @@ impl Default for RenderGraph {
pipeline_descriptors: HashMap::new(), pipeline_descriptors: HashMap::new(),
pass_descriptors: HashMap::new(), pass_descriptors: HashMap::new(),
pass_pipelines: HashMap::new(), pass_pipelines: HashMap::new(),
resource_providers: Vec::new(),
} }
} }
} }
@ -55,6 +57,11 @@ impl RenderGraphBuilder {
self self
} }
pub fn add_resource_provider(mut self, resource_provider: Box<dyn ResourceProvider>) -> Self {
self.render_graph.resource_providers.push(resource_provider);
self
}
pub fn build(self) -> RenderGraph { pub fn build(self) -> RenderGraph {
self.render_graph self.render_graph
} }

View File

@ -1,19 +1,19 @@
use crate::render::{render_graph_2::Renderer, ActiveCamera, Camera}; use crate::render::{render_graph_2::Renderer, ActiveCamera, Camera};
use bevy_transform::prelude::LocalToWorld; use bevy_transform::prelude::LocalToWorld;
use legion::prelude::*; use legion::prelude::*;
use zerocopy::AsBytes;
use std::mem; use std::mem;
use zerocopy::AsBytes;
trait ResourceProvider { pub trait ResourceProvider {
fn update(renderer: &mut dyn Renderer, world: &mut World); fn update(&self, renderer: &mut dyn Renderer, world: &mut World);
fn resize(renderer: &mut dyn Renderer, world: &mut World, width: u32, height: u32); fn resize(&self, renderer: &mut dyn Renderer, world: &mut World, width: u32, height: u32);
} }
pub struct CameraResourceProvider; pub struct CameraResourceProvider;
impl ResourceProvider for CameraResourceProvider { impl ResourceProvider for CameraResourceProvider {
fn update(renderer: &mut dyn Renderer, world: &mut World) {} fn update(&self, renderer: &mut dyn Renderer, world: &mut World) {}
fn resize(renderer: &mut dyn Renderer, world: &mut World, width: u32, height: u32) { fn resize(&self, renderer: &mut dyn Renderer, world: &mut World, width: u32, height: u32) {
for (mut camera, local_to_world, _) in for (mut camera, local_to_world, _) in
<(Write<Camera>, Read<LocalToWorld>, Read<ActiveCamera>)>::query().iter_mut(world) <(Write<Camera>, Read<LocalToWorld>, Read<ActiveCamera>)>::query().iter_mut(world)
{ {
@ -22,7 +22,8 @@ impl ResourceProvider for CameraResourceProvider {
(camera.view_matrix * local_to_world.0).to_cols_array_2d(); (camera.view_matrix * local_to_world.0).to_cols_array_2d();
let matrix_size = mem::size_of::<[[f32; 4]; 4]>() as u64; let matrix_size = mem::size_of::<[[f32; 4]; 4]>() as u64;
// TODO: use staging buffer? // TODO: use staging buffer?
let buffer = renderer.create_buffer_with_data(camera_matrix.as_bytes(), wgpu::BufferUsage::UNIFORM); let buffer = renderer
.create_buffer_with_data(camera_matrix.as_bytes(), wgpu::BufferUsage::UNIFORM);
// let temp_camera_buffer = render_graph // let temp_camera_buffer = render_graph
// .device // .device
// .create_buffer_with_data(camera_matrix.as_bytes(), wgpu::BufferUsage::COPY_SRC); // .create_buffer_with_data(camera_matrix.as_bytes(), wgpu::BufferUsage::COPY_SRC);