Skip to content

Commit

Permalink
Update physics-scenes to bevy 0.12
Browse files Browse the repository at this point in the history
  • Loading branch information
Canleskis committed Jan 2, 2024
1 parent da69f74 commit 90bcd5c
Show file tree
Hide file tree
Showing 9 changed files with 228 additions and 291 deletions.
12 changes: 4 additions & 8 deletions examples/physics-scenes/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,11 @@ version.workspace = true
license.workspace = true

[dependencies]
bevy = "0.9.1"
bevy_framepace = "0.9.1"
bevy_rapier2d = { version = "0.19.0" }
bevy-inspector-egui = "0.14.0"
bevy = "0.12.1"
bevy_rapier2d = { version = "0.23.0" }
rand = "0.8.5"
bevy_prototype_debug_lines = "0.9.0"
bevy_pancam = { version = "0.7.0", features = ["bevy_egui"] }
bevy_mouse_tracking_plugin = "0.5.0"
bevy_egui = "0.18.0"
bevy_pancam = { version = "0.10.0", features = ["bevy_egui"] }
bevy_egui = "0.24.0"
particular = { path = "../../particular", features = ["parallel"] }

[package.metadata.particular.rs]
Expand Down
154 changes: 78 additions & 76 deletions examples/physics-scenes/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,56 +6,43 @@ mod trails;

use std::f32::consts::PI;

use bevy_egui::egui;
use nbody::{ParticularPlugin, PointMass};
use rapier_schedule::CustomRapierSchedule;
use simulation_scene::*;
use simulation_scenes::{DoubleOval, Figure8, Orbits, TernaryOrbit};
use trails::{Trail, TrailsPlugin};

use bevy::diagnostic::{Diagnostics, FrameTimeDiagnosticsPlugin};
use bevy::time::FixedTimestep;
use bevy::diagnostic::{DiagnosticsStore, FrameTimeDiagnosticsPlugin};
use bevy::{prelude::*, window::PresentMode};
use bevy_egui::{
egui::{Slider, Window},
EguiContext, EguiPlugin,
};
use bevy_mouse_tracking_plugin::{prelude::*, MainCamera, MousePosWorld};
use bevy_egui::{egui, EguiContexts, EguiPlugin};
use bevy_pancam::{PanCam, PanCamPlugin};
use bevy_prototype_debug_lines::DebugLines;
use bevy_rapier2d::prelude::*;

const G: f32 = 1000.0;
const DT: f32 = 1.0 / 60.0;

fn main() {
App::new()
.add_plugins(DefaultPlugins.set(WindowPlugin {
window: WindowDescriptor {
title: "Particular demo".to_string(),
#[cfg(not(target_arch = "wasm32"))]
width: 1500.0,
#[cfg(not(target_arch = "wasm32"))]
height: 900.0,
present_mode: PresentMode::AutoNoVsync,
fit_canvas_to_parent: true,
canvas: Some("#app".to_owned()),
.add_plugins((
DefaultPlugins.set(WindowPlugin {
primary_window: Some(Window {
present_mode: PresentMode::AutoNoVsync,
fit_canvas_to_parent: true,
canvas: Some("#app".to_owned()),
..default()
}),
..default()
},
..default()
}))
.add_plugin(FrameTimeDiagnosticsPlugin)
.add_plugin(EguiPlugin)
.add_plugin(PanCamPlugin)
.add_plugin(MousePosPlugin)
.add_plugin(TrailsPlugin)
.add_plugin(
}),
RapierPhysicsPlugin::<NoUserData>::pixels_per_meter(1.0)
.with_default_system_setup(false),
)
.add_plugin(CustomRapierSchedule)
.add_plugin(ParticularPlugin)
.add_plugin(SimulationScenePlugin)
CustomRapierSchedule,
FrameTimeDiagnosticsPlugin,
EguiPlugin,
PanCamPlugin,
TrailsPlugin,
ParticularPlugin,
SimulationScenePlugin,
))
.insert_resource(ClearColor(Color::BLACK))
.insert_resource(
SceneCollection::new()
Expand All @@ -67,27 +54,24 @@ fn main() {
)
.insert_resource(LoadedScene::new(Orbits::default()))
.init_resource::<BodyInfo>()
.add_state(SimulationState::Running)
.add_startup_system(spawn_camera)
.add_startup_system(setup_ui_fps)
.add_system(update_ui_fps.with_run_criteria(FixedTimestep::step(0.25)))
.add_system(place_body)
.add_system(body_info_window)
.add_system_set(SystemSet::on_enter(SimulationState::Paused).with_system(pause_physics))
.add_system_set(SystemSet::on_exit(SimulationState::Paused).with_system(resume_physics))
.add_system(pause_resume)
.add_state::<SimulationState>()
.add_systems(Startup, (spawn_camera, setup_ui_fps))
.insert_resource(Time::<Fixed>::from_hz(10.0))
.add_systems(FixedUpdate, update_ui_fps)
.add_systems(Update, (place_body, body_info_window, pause_resume))
.add_systems(OnEnter(SimulationState::Paused), pause_physics)
.add_systems(OnExit(SimulationState::Paused), resume_physics)
.run();
}

fn spawn_camera(mut commands: Commands) {
commands
.spawn(Camera2dBundle::default())
.add_world_tracking()
.insert(MainCamera)
.insert(PanCam {
commands.spawn((
Camera2dBundle::default(),
PanCam {
grab_buttons: vec![MouseButton::Right, MouseButton::Middle],
..default()
});
},
));
}

#[derive(Component)]
Expand All @@ -113,18 +97,18 @@ fn setup_ui_fps(mut commands: Commands, asset_server: Res<AssetServer>) {
])
.with_style(Style {
position_type: PositionType::Absolute,
position: UiRect {
top: Val::Px(5.0),
right: Val::Px(10.0),
..default()
},
top: Val::Px(5.0),
right: Val::Px(10.0),
..default()
}),
)
.insert(FpsText);
}

fn update_ui_fps(mut query_text: Query<&mut Text, With<FpsText>>, diagnostic: Res<Diagnostics>) {
fn update_ui_fps(
mut query_text: Query<&mut Text, With<FpsText>>,
diagnostic: Res<DiagnosticsStore>,
) {
let fps = diagnostic
.get(FrameTimeDiagnosticsPlugin::FPS)
.and_then(|fps| fps.average());
Expand All @@ -135,20 +119,25 @@ fn update_ui_fps(mut query_text: Query<&mut Text, With<FpsText>>, diagnostic: Re
}
}

#[derive(Debug, Clone, Eq, PartialEq, Hash)]
#[derive(States, Default, Debug, Clone, Eq, PartialEq, Hash)]
enum SimulationState {
#[default]
Running,
Paused,
}

fn pause_resume(keys: Res<Input<KeyCode>>, mut state: ResMut<State<SimulationState>>) {
fn pause_resume(
keys: Res<Input<KeyCode>>,
state: Res<State<SimulationState>>,
mut next_state: ResMut<NextState<SimulationState>>,
) {
if keys.just_pressed(KeyCode::Space) {
match state.current() {
match state.get() {
SimulationState::Running => {
state.set(SimulationState::Paused).ok();
next_state.set(SimulationState::Paused);
}
SimulationState::Paused => {
state.set(SimulationState::Running).ok();
next_state.set(SimulationState::Running);
}
}
}
Expand All @@ -164,7 +153,6 @@ fn resume_physics(mut physics: ResMut<RapierConfiguration>) {

#[derive(Resource)]
struct BodyInfo {
position: Option<Vec2>,
mass: f32,
with_mass: bool,
with_trail: bool,
Expand All @@ -173,7 +161,6 @@ struct BodyInfo {
impl Default for BodyInfo {
fn default() -> Self {
Self {
position: None,
mass: 20.0,
with_mass: true,
with_trail: false,
Expand All @@ -182,16 +169,16 @@ impl Default for BodyInfo {
}

fn body_info_window(
mut egui_ctx: ResMut<EguiContext>,
mut egui_ctx: EguiContexts,
mut body_info: ResMut<BodyInfo>,
scene: Res<LoadedScene>,
) {
Window::new("Body spawner").show(egui_ctx.ctx_mut(), |ui| {
egui::Window::new("Body spawner").show(egui_ctx.ctx_mut(), |ui| {
ui.with_layout(egui::Layout::left_to_right(egui::Align::Min), |ui| {
if let Some((min_mass, max_mass)) = scene.spawnable().mass_range() {
ui.add_enabled(
body_info.with_mass,
Slider::new(&mut body_info.mass, min_mass..=max_mass),
egui::Slider::new(&mut body_info.mass, min_mass..=max_mass),
);

ui.toggle_value(&mut body_info.with_mass, "Mass");
Expand All @@ -200,29 +187,45 @@ fn body_info_window(

ui.checkbox(&mut body_info.with_trail, "Draw trail");
});

if egui_ctx.ctx_mut().wants_pointer_input() {
body_info.position = None;
}
}

#[allow(clippy::too_many_arguments)]
fn place_body(
mut commands: Commands,
mut lines: ResMut<DebugLines>,
mut body_info: ResMut<BodyInfo>,
mut gizmos: Gizmos,
mut egui_ctx: EguiContexts,
body_info: Res<BodyInfo>,
buttons: Res<Input<MouseButton>>,
asset_server: Res<AssetServer>,
mouse_pos: Res<MousePosWorld>,
scene: Res<LoadedScene>,
query_window: Query<&Window>,
query_camera: Query<(&GlobalTransform, &Camera)>,
mut last_click: Local<Option<Vec2>>,
) {
let mouse_pos = mouse_pos.truncate();
if egui_ctx.ctx_mut().is_pointer_over_area() {
return;
}

let Ok(window) = query_window.get_single() else {
return;
};
let Ok((camera_transform, camera)) = query_camera.get_single() else {
return;
};

let Some(mouse_pos) = window
.cursor_position()
.and_then(|position| camera.viewport_to_world_2d(camera_transform, position))
else {
return;
};

if buttons.just_pressed(MouseButton::Left) {
body_info.position = Some(mouse_pos);
*last_click = Some(mouse_pos);
}

if buttons.just_released(MouseButton::Left) {
if let Some(place_pos) = body_info.position.take() {
if let Some(place_pos) = last_click.take() {
let spawnable = scene.spawnable();
let point_mass = if spawnable.is_massive() && body_info.with_mass {
PointMass::HasGravity {
Expand Down Expand Up @@ -251,12 +254,11 @@ fn place_body(
}
}

if let Some(place_pos) = body_info.position {
if let Some(place_pos) = *last_click {
let scale = (mouse_pos.distance_squared(place_pos).powf(0.04) - 1.0).clamp(0.0, 1.0);
lines.line_colored(
gizmos.line(
place_pos.extend(0.0),
mouse_pos.extend(0.0),
0.0,
Color::rgb(scale, 1.0 - scale, 0.0),
)
}
Expand Down
9 changes: 2 additions & 7 deletions examples/physics-scenes/src/nbody.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::{rapier_schedule::physics_step, DT, G};
use crate::{rapier_schedule::PreRapierSchedule, DT, G};

use bevy::prelude::*;
use bevy_rapier2d::prelude::Velocity;
Expand All @@ -13,12 +13,7 @@ pub struct ParticularPlugin;

impl Plugin for ParticularPlugin {
fn build(&self, app: &mut bevy::prelude::App) {
app.add_system_set_to_stage(
CoreStage::PreUpdate,
SystemSet::new()
.with_run_criteria(physics_step)
.with_system(accelerate_rigidbodies),
);
app.add_systems(PreRapierSchedule, accelerate_rigidbodies);
}
}

Expand Down
Loading

0 comments on commit 90bcd5c

Please sign in to comment.