Make the 2D add-remove demo more intereting.

This commit is contained in:
Sébastien Crozet
2021-09-12 09:58:47 +02:00
committed by Sébastien Crozet
parent 5e133aac92
commit d858ae4c4e
5 changed files with 47 additions and 40 deletions

View File

@@ -13,27 +13,20 @@ pub fn init_world(testbed: &mut Testbed) {
.map(|pos| { .map(|pos| {
let rigid_body = RigidBodyBuilder::new_kinematic_position_based() let rigid_body = RigidBodyBuilder::new_kinematic_position_based()
.translation(pos) .translation(pos)
// .ccd_enabled(true)
.build(); .build();
let handle = bodies.insert(rigid_body); let handle = bodies.insert(rigid_body);
let collider = ColliderBuilder::cuboid(rad * 10.0, rad) let collider = ColliderBuilder::cuboid(rad * 10.0, rad).build();
.active_events(ActiveEvents::CONTACT_EVENTS) colliders.insert_with_parent(collider, handle, &mut bodies);
.build(); handle
let coll_handle = colliders.insert_with_parent(collider, handle, &mut bodies);
(pos, handle, coll_handle)
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let mut rotation = 0.0;
// Callback that will be executed on the main loop to handle proximities. // Callback that will be executed on the main loop to handle proximities.
testbed.add_callback(move |mut graphics, physics, events, state| { testbed.add_callback(move |mut graphics, physics, _, state| {
let rot = state.time * -1.0; let rot = state.time * -1.0;
let pos = state.time.sin() * 5.0; for rb_handle in &platform_handles {
for (p, i, _) in platform_handles.iter() { let rb = physics.bodies.get_mut(*rb_handle).unwrap();
let mut c = physics.bodies.get_mut(*i).unwrap(); rb.set_next_kinematic_rotation(rot);
c.set_next_kinematic_rotation(rot);
//c.set_next_kinematic_translation(vector![pos, 0.0]);
} }
if state.timestep_id % 10 == 0 { if state.timestep_id % 10 == 0 {
@@ -41,7 +34,6 @@ pub fn init_world(testbed: &mut Testbed) {
let y = rand::random::<f32>() * 10.0 + 10.0; let y = rand::random::<f32>() * 10.0 + 10.0;
let rigid_body = RigidBodyBuilder::new_dynamic() let rigid_body = RigidBodyBuilder::new_dynamic()
.translation(vector![x, y]) .translation(vector![x, y])
// .ccd_enabled(true)
.build(); .build();
let handle = physics.bodies.insert(rigid_body); let handle = physics.bodies.insert(rigid_body);
let collider = ColliderBuilder::cuboid(rad, rad).build(); let collider = ColliderBuilder::cuboid(rad, rad).build();
@@ -54,24 +46,24 @@ pub fn init_world(testbed: &mut Testbed) {
} }
} }
// let to_remove: Vec<_> = physics let to_remove: Vec<_> = physics
// .bodies .bodies
// .iter() .iter()
// .filter(|(_, b)| b.position().translation.vector.y < -10.0) .filter(|(_, b)| b.position().translation.vector.y < -10.0)
// .map(|e| e.0) .map(|e| e.0)
// .collect(); .collect();
// for handle in to_remove { for handle in to_remove {
// physics.bodies.remove( physics.bodies.remove(
// handle, handle,
// &mut physics.islands, &mut physics.islands,
// &mut physics.colliders, &mut physics.colliders,
// &mut physics.joints, &mut physics.joints,
// ); );
//
// if let Some(graphics) = &mut graphics { if let Some(graphics) = &mut graphics {
// graphics.remove_body(handle); graphics.remove_body(handle);
// } }
// } }
}); });
/* /*

View File

@@ -3,7 +3,7 @@ use super::{
}; };
use crate::geometry::broad_phase_multi_sap::SAPProxyIndex; use crate::geometry::broad_phase_multi_sap::SAPProxyIndex;
use crate::geometry::{ use crate::geometry::{
ColliderBroadPhaseData, ColliderChanges, ColliderHandle, ColliderPosition, ColliderShape, AABB, ColliderBroadPhaseData, ColliderChanges, ColliderHandle, ColliderPosition, ColliderShape,
}; };
use crate::math::Real; use crate::math::Real;
use crate::utils::IndexMut2; use crate::utils::IndexMut2;

View File

@@ -124,6 +124,7 @@ impl Harness {
self.physics.broad_phase = BroadPhase::new(); self.physics.broad_phase = BroadPhase::new();
self.physics.narrow_phase = NarrowPhase::new(); self.physics.narrow_phase = NarrowPhase::new();
self.state.timestep_id = 0; self.state.timestep_id = 0;
self.state.time = 0.0;
self.physics.ccd_solver = CCDSolver::new(); self.physics.ccd_solver = CCDSolver::new();
self.physics.query_pipeline = QueryPipeline::new(); self.physics.query_pipeline = QueryPipeline::new();
self.physics.pipeline = PhysicsPipeline::new(); self.physics.pipeline = PhysicsPipeline::new();

View File

@@ -1,11 +1,16 @@
use crate::harness::Harness; use crate::harness::Harness;
use crate::physics::PhysicsState; use crate::physics::PhysicsState;
use crate::GraphicsManager; use crate::GraphicsManager;
use bevy::prelude::{Assets, Commands, Mesh, Query, StandardMaterial, Transform}; use bevy::prelude::*;
use bevy::render::pipeline::PipelineDescriptor;
use bevy_egui::EguiContext; use bevy_egui::EguiContext;
use na::Point3;
pub trait TestbedPlugin { pub trait TestbedPlugin {
fn init_plugin(
&mut self,
pipelines: &mut Assets<PipelineDescriptor>,
shaders: &mut Assets<Shader>,
);
fn init_graphics( fn init_graphics(
&mut self, &mut self,
graphics: &mut GraphicsManager, graphics: &mut GraphicsManager,
@@ -14,7 +19,6 @@ pub trait TestbedPlugin {
materials: &mut Assets<StandardMaterial>, materials: &mut Assets<StandardMaterial>,
components: &mut Query<(&mut Transform,)>, components: &mut Query<(&mut Transform,)>,
harness: &mut Harness, harness: &mut Harness,
gen_color: &mut dyn FnMut() -> Point3<f32>,
); );
fn clear_graphics(&mut self, graphics: &mut GraphicsManager, commands: &mut Commands); fn clear_graphics(&mut self, graphics: &mut GraphicsManager, commands: &mut Commands);
fn run_callbacks(&mut self, harness: &mut Harness); fn run_callbacks(&mut self, harness: &mut Harness);

View File

@@ -35,6 +35,7 @@ use bevy_egui::EguiContext;
use crate::camera2d::{OrbitCamera, OrbitCameraPlugin}; use crate::camera2d::{OrbitCamera, OrbitCameraPlugin};
#[cfg(feature = "dim3")] #[cfg(feature = "dim3")]
use crate::camera3d::{OrbitCamera, OrbitCameraPlugin}; use crate::camera3d::{OrbitCamera, OrbitCameraPlugin};
use bevy::render::pipeline::PipelineDescriptor;
const RAPIER_BACKEND: usize = 0; const RAPIER_BACKEND: usize = 0;
#[cfg(feature = "other-backends")] #[cfg(feature = "other-backends")]
@@ -136,6 +137,8 @@ pub struct TestbedGraphics<'a, 'b, 'c, 'd> {
commands: &'a mut Commands<'d>, commands: &'a mut Commands<'d>,
meshes: &'a mut Assets<Mesh>, meshes: &'a mut Assets<Mesh>,
materials: &'a mut Assets<StandardMaterial>, materials: &'a mut Assets<StandardMaterial>,
shaders: &'a mut Assets<Shader>,
pipelines: &'a mut Assets<PipelineDescriptor>,
components: &'a mut Query<'b, (&'c mut Transform,)>, components: &'a mut Query<'b, (&'c mut Transform,)>,
camera: &'a mut OrbitCamera, camera: &'a mut OrbitCamera,
} }
@@ -620,7 +623,10 @@ impl<'a, 'b, 'c, 'd> Testbed<'a, 'b, 'c, 'd> {
self.harness.add_callback(callback); self.harness.add_callback(callback);
} }
pub fn add_plugin(&mut self, plugin: impl TestbedPlugin + 'static) { pub fn add_plugin(&mut self, mut plugin: impl TestbedPlugin + 'static) {
if let Some(gfx) = &mut self.graphics {
plugin.init_plugin(gfx.pipelines, gfx.shaders);
}
self.plugins.0.push(Box::new(plugin)); self.plugins.0.push(Box::new(plugin));
} }
@@ -855,6 +861,8 @@ fn egui_focus(ui_context: Res<EguiContext>, mut cameras: Query<&mut OrbitCamera>
fn update_testbed( fn update_testbed(
mut commands: Commands, mut commands: Commands,
windows: Res<Windows>, windows: Res<Windows>,
mut pipelines: ResMut<Assets<PipelineDescriptor>>,
mut shaders: ResMut<Assets<Shader>>,
mut meshes: ResMut<Assets<Mesh>>, mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>, mut materials: ResMut<Assets<StandardMaterial>>,
builders: NonSendMut<SceneBuilders>, builders: NonSendMut<SceneBuilders>,
@@ -960,6 +968,8 @@ fn update_testbed(
let meshes = &mut *meshes; let meshes = &mut *meshes;
let graphics_context = TestbedGraphics { let graphics_context = TestbedGraphics {
pipelines: &mut *pipelines,
shaders: &mut *shaders,
manager: &mut *manager, manager: &mut *manager,
commands: &mut commands, commands: &mut commands,
meshes: &mut *meshes, meshes: &mut *meshes,
@@ -1047,7 +1057,6 @@ fn update_testbed(
} }
for plugin in &mut plugins.0 { for plugin in &mut plugins.0 {
let next_color = graphics.next_color();
plugin.init_graphics( plugin.init_graphics(
&mut graphics, &mut graphics,
&mut commands, &mut commands,
@@ -1055,7 +1064,6 @@ fn update_testbed(
materials, materials,
&mut gfx_components, &mut gfx_components,
&mut harness, &mut harness,
&mut || next_color,
); );
} }
} }
@@ -1099,6 +1107,8 @@ fn update_testbed(
let graphics = &mut graphics; let graphics = &mut graphics;
let mut testbed_graphics = TestbedGraphics { let mut testbed_graphics = TestbedGraphics {
pipelines: &mut *pipelines,
shaders: &mut *shaders,
manager: &mut *graphics, manager: &mut *graphics,
commands: &mut commands, commands: &mut commands,
meshes: &mut *meshes, meshes: &mut *meshes,