aboutsummaryrefslogtreecommitdiff
path: root/src_testbed
diff options
context:
space:
mode:
authorrezural <rezural@protonmail.com>2021-01-02 16:45:55 +1100
committerrezural <rezural@protonmail.com>2021-01-02 16:46:52 +1100
commit34e79e9afc21ff0202d8a0338d0e8e038402a159 (patch)
tree8d1486aa5de2488caa265f658dcb3ab10d7c7b11 /src_testbed
parented76291fbfdc93290754cb0be500775fb9c5f48c (diff)
downloadrapier-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.rs58
-rw-r--r--src_testbed/testbed.rs23
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)