diff options
| author | rezural <rezural@protonmail.com> | 2021-01-02 16:45:55 +1100 |
|---|---|---|
| committer | rezural <rezural@protonmail.com> | 2021-01-02 16:46:52 +1100 |
| commit | 34e79e9afc21ff0202d8a0338d0e8e038402a159 (patch) | |
| tree | 8d1486aa5de2488caa265f658dcb3ab10d7c7b11 /src_testbed | |
| parent | ed76291fbfdc93290754cb0be500775fb9c5f48c (diff) | |
| download | rapier-34e79e9afc21ff0202d8a0338d0e8e038402a159.tar.gz rapier-34e79e9afc21ff0202d8a0338d0e8e038402a159.tar.bz2 rapier-34e79e9afc21ff0202d8a0338d0e8e038402a159.zip | |
unify callbacks with & without graphics & window
Diffstat (limited to 'src_testbed')
| -rw-r--r-- | src_testbed/harness/mod.rs | 58 | ||||
| -rw-r--r-- | src_testbed/testbed.rs | 23 |
2 files changed, 73 insertions, 8 deletions
diff --git a/src_testbed/harness/mod.rs b/src_testbed/harness/mod.rs index 86cee09..51bf315 100644 --- a/src_testbed/harness/mod.rs +++ b/src_testbed/harness/mod.rs @@ -1,4 +1,8 @@ -use crate::physics::{PhysicsEvents, PhysicsState}; +use crate::{ + physics::{PhysicsEvents, PhysicsState}, + GraphicsManager, +}; +use kiss3d::window::Window; use plugin::HarnessPlugin; use rapier::dynamics::{IntegrationParameters, JointSet, RigidBodySet}; use rapier::geometry::{BroadPhase, ColliderSet, NarrowPhase}; @@ -48,7 +52,17 @@ pub struct Harness { pub state: RunState, } -type Callbacks = Vec<Box<dyn FnMut(&mut PhysicsState, &PhysicsEvents, &RunState)>>; +type Callbacks = Vec< + Box< + dyn FnMut( + Option<&mut Window>, + Option<&mut GraphicsManager>, + &mut PhysicsState, + &PhysicsEvents, + &RunState, + ), + >, +>; #[allow(dead_code)] impl Harness { @@ -130,7 +144,15 @@ impl Harness { self.plugins.push(Box::new(plugin)); } - pub fn add_callback<F: FnMut(&mut PhysicsState, &PhysicsEvents, &RunState) + 'static>( + pub fn add_callback< + F: FnMut( + Option<&mut Window>, + Option<&mut GraphicsManager>, + &mut PhysicsState, + &PhysicsEvents, + &RunState, + ) + 'static, + >( &mut self, callback: F, ) { @@ -138,6 +160,14 @@ impl Harness { } pub fn step(&mut self) { + self.step_with_graphics(None, None); + } + + pub fn step_with_graphics( + &mut self, + window: Option<&mut Window>, + graphics: Option<&mut GraphicsManager>, + ) { #[cfg(feature = "parallel")] { let physics = &mut self.physics; @@ -180,8 +210,26 @@ impl Harness { plugin.step(&mut self.physics, &self.state) } - for f in &mut self.callbacks { - f(&mut self.physics, &self.events, &self.state) + // FIXME: This assumes either window & graphics are Some, or they are all None + // this is required as we cannot pass Option<&mut Window> & Option<&mut GraphicsManager directly in a loop + // there must be a better way of doing this? + match (window, graphics) { + (Some(window), Some(graphics)) => { + for f in &mut self.callbacks { + f( + Some(window), + Some(graphics), + &mut self.physics, + &self.events, + &self.state, + ); + } + } + _ => { + for f in &mut self.callbacks { + f(None, None, &mut self.physics, &self.events, &self.state); + } + } } for plugin in &mut self.plugins { diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index bb3d8ee..fd6b9a0 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -3,10 +3,10 @@ use std::mem; use std::path::Path; use std::rc::Rc; -use crate::engine::GraphicsManager; -use crate::physics::{PhysicsSnapshot, PhysicsState}; +use crate::physics::{PhysicsEvents, PhysicsSnapshot, PhysicsState}; use crate::plugin::TestbedPlugin; use crate::ui::TestbedUi; +use crate::{engine::GraphicsManager, harness::RunState}; use kiss3d::camera::Camera; use kiss3d::event::Event; @@ -392,6 +392,21 @@ impl Testbed { self.plugins.clear(); } + pub fn add_callback< + F: FnMut( + Option<&mut Window>, + Option<&mut GraphicsManager>, + &mut PhysicsState, + &PhysicsEvents, + &RunState, + ) + 'static, + >( + &mut self, + callback: F, + ) { + self.harness.add_callback(callback); + } + pub fn add_plugin(&mut self, plugin: impl TestbedPlugin + 'static) { self.plugins.push(Box::new(plugin)); } @@ -1221,7 +1236,9 @@ impl State for Testbed { if self.state.running != RunMode::Stop { for _ in 0..self.nsteps { if self.state.selected_backend == RAPIER_BACKEND { - self.harness.step(); + let graphics = &mut self.graphics; + self.harness + .step_with_graphics(Some(window), Some(graphics)); for plugin in &mut self.plugins { plugin.step(&mut self.harness.physics) |
