actually, the interface for writing isn't too bad. It just sucks when you want to write data from a system

master
mitchellhansen 4 years ago
parent 54e89a28ba
commit 14b0948b9c

@ -140,7 +140,8 @@ fn main() {
let mut render_schedule = Schedule::builder() let mut render_schedule = Schedule::builder()
.add_system(render::system::render_imgui_system()) .add_system(render::system::render_imgui_system())
.add_system(render::system::render_test_system(ImguiPerformanceProfilerLine::new("Render system".to_string()))) .add_system(render::system::render_test_system())
.add_system(render::system::render_performance_flag_system())
.build(); .build();
let mut update_schedule = Schedule::builder() let mut update_schedule = Schedule::builder()

@ -1,4 +1,6 @@
use std::cell::RefCell; use std::cell::RefCell;
use std::iter::Chain;
use std::slice::Iter;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::thread::current; use std::thread::current;
use std::time::Duration; use std::time::Duration;
@ -18,22 +20,25 @@ use legion::world::SubWorld;
use legion::*; use legion::*;
use rapier3d::parry::motion::RigidMotionComposition; use rapier3d::parry::motion::RigidMotionComposition;
use wgpu::util::DeviceExt; use wgpu::util::DeviceExt;
use wgpu::{BackendBit, BindGroup, BindGroupLayout, Buffer, BufferBindingType, Device, FragmentState, Instance, Queue, Surface, SwapChain, SwapChainDescriptor, SwapChainFrame, TextureView, VertexState, CommandEncoder}; use wgpu::{
BackendBit, BindGroup, BindGroupLayout, Buffer, BufferBindingType, CommandEncoder, Device,
FragmentState, Instance, Queue, Surface, SwapChain, SwapChainDescriptor, SwapChainFrame,
TextureView, VertexState,
};
use winit_24::dpi::PhysicalSize; use winit_24::dpi::PhysicalSize;
use winit_24::platform::unix::x11::ffi::Time; use winit_24::platform::unix::x11::ffi::Time;
use winit_24::window::Window; use winit_24::window::Window;
use crate::camera::{Camera, CameraController}; use crate::camera::{Camera, CameraController};
use crate::components::{Mesh, Position, RangeCopy, LoopState, ImguiWindow}; use crate::components::{ImguiWindow, LoopState, Mesh, Position, RangeCopy};
use crate::current_ui; use crate::current_ui;
use crate::geometry::{load_obj, Vertex}; use crate::geometry::{load_obj, Vertex};
use crate::imgui_supp::imgui_support::{ImguiContext, ImguiPlatform}; use crate::imgui_supp::imgui_support::{ImguiContext, ImguiPlatform};
use crate::light::{DirectionalLight, LightRaw}; use crate::light::{DirectionalLight, LightRaw};
use crate::render::state::{RenderState}; use crate::render::state::RenderState;
use crate::render::{push_debug_group_checked, insert_debug_marker_checked, pop_debug_group_checked, EntityUniforms}; use crate::render::{
use std::iter::Chain; insert_debug_marker_checked, pop_debug_group_checked, push_debug_group_checked, EntityUniforms,
use std::slice::Iter; };
#[system] #[system]
#[write_component(Camera)] #[write_component(Camera)]
@ -55,9 +60,7 @@ pub fn imgui_prepare(
unsafe { crate::CURRENT_UI = Some(std::mem::transmute(imgui_context.frame())) } unsafe { crate::CURRENT_UI = Some(std::mem::transmute(imgui_context.frame())) }
} }
fn run_imgui_render_step<G: 'static + Sized + Send + Sync>(world: &mut SubWorld, ui: &Ui) { fn run_imgui_render_step<G: 'static + Sized + Send + Sync>(world: &mut SubWorld, ui: &Ui) {
let mut component_query = <(&G)>::query(); let mut component_query = <(&G)>::query();
let mut window_query = <(&ImguiWindow<G>)>::query(); let mut window_query = <(&ImguiWindow<G>)>::query();
@ -73,7 +76,9 @@ fn run_imgui_render_step<G: 'static + Sized + Send + Sync>(world: &mut SubWorld,
for (component_state) in component_query.iter(world) { for (component_state) in component_query.iter(world) {
v.push(component_state) v.push(component_state)
} }
window_data.unwrap().build(&ui, || { (window_func.unwrap())(ui, v) }); window_data
.unwrap()
.build(&ui, || (window_func.unwrap())(ui, v));
} }
} }
/// Go through each "global" window-data component and render it's data /// Go through each "global" window-data component and render it's data
@ -83,7 +88,6 @@ fn run_imgui_render_step<G: 'static + Sized + Send + Sync>(world: &mut SubWorld,
#[write_component(ImguiWindow<ImguiGenericOutputLine>)] #[write_component(ImguiWindow<ImguiGenericOutputLine>)]
#[write_component(ImguiGenericOutputLine)] #[write_component(ImguiGenericOutputLine)]
pub fn render_imgui(world: &mut SubWorld, #[resource] loop_state: &mut LoopState) { pub fn render_imgui(world: &mut SubWorld, #[resource] loop_state: &mut LoopState) {
let ui = unsafe { crate::current_ui().unwrap() }; let ui = unsafe { crate::current_ui().unwrap() };
// Pull out the window associated with this type, and render each of the components in the sytem // Pull out the window associated with this type, and render each of the components in the sytem
@ -91,7 +95,6 @@ pub fn render_imgui(world: &mut SubWorld, #[resource] loop_state: &mut LoopState
run_imgui_render_step::<ImguiPerformanceProfilerLine>(world, &ui); run_imgui_render_step::<ImguiPerformanceProfilerLine>(world, &ui);
} }
// This would be the shared state for all imgui generic output things // This would be the shared state for all imgui generic output things
pub struct ImguiGenericOutputLine { pub struct ImguiGenericOutputLine {
pub label: String, pub label: String,
@ -99,9 +102,7 @@ pub struct ImguiGenericOutputLine {
impl ImguiGenericOutputLine { impl ImguiGenericOutputLine {
pub fn new(label: String) -> ImguiGenericOutputLine { pub fn new(label: String) -> ImguiGenericOutputLine {
ImguiGenericOutputLine { ImguiGenericOutputLine { label }
label
}
} }
} }
@ -116,11 +117,10 @@ pub struct ImguiPerformanceProfilerLine {
impl ImguiPerformanceProfilerLine { impl ImguiPerformanceProfilerLine {
fn add_sample(&mut self, sample: f32) { fn add_sample(&mut self, sample: f32) {
self.list_of_fps[self.index] = sample; self.list_of_fps[self.index] = sample;
if self.index >= 399 { if self.index >= 399 {
self.scale_max = self.list_of_fps.iter().cloned().fold(0./0., f32::max); self.scale_max = self.list_of_fps.iter().cloned().fold(0. / 0., f32::max);
self.index = 0; self.index = 0;
} else { } else {
self.index += 1; self.index += 1;
@ -138,7 +138,16 @@ impl ImguiPerformanceProfilerLine {
pub fn current_average_label(&self) -> (f32, String) { pub fn current_average_label(&self) -> (f32, String) {
let (left, right) = self.list_of_fps.split_at(self.index); let (left, right) = self.list_of_fps.split_at(self.index);
((left.iter().rev().chain(right.iter().rev()).take(50).sum::<f32>() / 50.0), "FPS".to_string()) (
(left
.iter()
.rev()
.chain(right.iter().rev())
.take(50)
.sum::<f32>()
/ 50.0),
"FPS".to_string(),
)
} }
pub fn new(label: String) -> ImguiPerformanceProfilerLine { pub fn new(label: String) -> ImguiPerformanceProfilerLine {
@ -147,11 +156,22 @@ impl ImguiPerformanceProfilerLine {
list_of_fps: [0.0; 400], list_of_fps: [0.0; 400],
index: 0, index: 0,
scale_min: 0.0, scale_min: 0.0,
scale_max: 0.0 scale_max: 0.0,
} }
} }
} }
#[system]
#[write_component(ImguiPerformanceProfilerLine)]
pub fn render_performance_flag(world: &mut SubWorld, #[resource] loop_state: &mut LoopState) {
let delta_time = loop_state.delta_time.as_secs_f32();
let mut query = <(&mut ImguiPerformanceProfilerLine)>::query();
for (mut profiler) in query.iter_mut(world) {
profiler.add_sample(delta_time);
}
}
#[system] #[system]
#[write_component(Camera)] #[write_component(Camera)]
#[write_component(Position)] #[write_component(Position)]
@ -161,17 +181,12 @@ impl ImguiPerformanceProfilerLine {
#[write_component(DirectionalLight)] #[write_component(DirectionalLight)]
pub fn render_test( pub fn render_test(
world: &mut SubWorld, world: &mut SubWorld,
#[state] performance_profiler_line: &mut ImguiPerformanceProfilerLine,
#[resource] loop_state: &mut LoopState, #[resource] loop_state: &mut LoopState,
#[resource] renderer: &mut RenderState, #[resource] renderer: &mut RenderState,
#[resource] winit_window: &mut Window, #[resource] winit_window: &mut Window,
#[resource] imgui_context: &mut Arc<Mutex<ImguiContext>>, #[resource] imgui_context: &mut Arc<Mutex<ImguiContext>>,
#[resource] imgui_platform: &mut Arc<Mutex<ImguiPlatform>>, #[resource] imgui_platform: &mut Arc<Mutex<ImguiPlatform>>,
) { ) {
let delta_time = loop_state.delta_time.as_secs_f32();
performance_profiler_line.add_sample(delta_time);
let mut encoder = renderer let mut encoder = renderer
.device .device
.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });
@ -237,8 +252,10 @@ pub fn render_test(
let mut query = <(&mut DirectionalLight, &mut Position)>::query(); let mut query = <(&mut DirectionalLight, &mut Position)>::query();
for (i, (light, pos)) in query.iter_mut(world).enumerate() { for (i, (light, pos)) in query.iter_mut(world).enumerate() {
insert_debug_marker_checked(&format!("shadow pass {} (light at position {:?})", i, pos), &mut encoder); insert_debug_marker_checked(
&format!("shadow pass {} (light at position {:?})", i, pos),
&mut encoder,
);
// The light uniform buffer already has the projection, // The light uniform buffer already has the projection,
// let's just copy it over to the shadow uniform buffer. // let's just copy it over to the shadow uniform buffer.
@ -252,7 +269,6 @@ pub fn render_test(
insert_debug_marker_checked("render entities", &mut encoder); insert_debug_marker_checked("render entities", &mut encoder);
let mut pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { let mut pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
label: Some("render pass"), label: Some("render pass"),
color_attachments: &[], color_attachments: &[],
@ -328,7 +344,6 @@ pub fn render_test(
let ui = unsafe { crate::current_ui().unwrap() }; let ui = unsafe { crate::current_ui().unwrap() };
// ui.show_demo_window(&mut true); // ui.show_demo_window(&mut true);
imgui_platform.prepare_render(&ui, &winit_window); imgui_platform.prepare_render(&ui, &winit_window);

Loading…
Cancel
Save