Update to Bevy 0.8. Not showing the cyberbike for some reason.
Physics is still probably fucked.
This commit is contained in:
parent
1579c3d972
commit
bd96c52f3a
9 changed files with 609 additions and 582 deletions
1050
Cargo.lock
generated
1050
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -5,16 +5,17 @@ edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
bevy_polyline = "0.2"
|
bevy_polyline = "0.3"
|
||||||
noise = { git = "https://github.com/Razaekel/noise-rs" }
|
noise = { git = "https://github.com/Razaekel/noise-rs" }
|
||||||
hexasphere = "7"
|
hexasphere = "7"
|
||||||
wgpu = "0.12"
|
wgpu = "0.13"
|
||||||
|
# wgpu = "0.12"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
debug_render = []
|
debug_render = []
|
||||||
|
|
||||||
[dependencies.bevy]
|
[dependencies.bevy]
|
||||||
version = "0.7"
|
version = "0.8"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = [
|
features = [
|
||||||
"bevy_gilrs",
|
"bevy_gilrs",
|
||||||
|
@ -27,7 +28,7 @@ features = [
|
||||||
|
|
||||||
[dependencies.bevy_rapier3d]
|
[dependencies.bevy_rapier3d]
|
||||||
features = ["simd-nightly"]
|
features = ["simd-nightly"]
|
||||||
version = "0.13"
|
version = "0.16"
|
||||||
|
|
||||||
# Maybe also enable only a small amount of optimization for our code:
|
# Maybe also enable only a small amount of optimization for our code:
|
||||||
[profile.dev]
|
[profile.dev]
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::{
|
||||||
|
App, ParallelSystemDescriptorCoercion, Plugin, Query, Res, ResMut, Transform, Vec3, With,
|
||||||
|
};
|
||||||
use bevy_rapier3d::prelude::{
|
use bevy_rapier3d::prelude::{
|
||||||
ExternalForce, Friction, NoUserData, RapierConfiguration, RapierPhysicsPlugin, Velocity,
|
ExternalForce, Friction, NoUserData, RapierConfiguration, RapierPhysicsPlugin, Velocity,
|
||||||
};
|
};
|
||||||
|
@ -9,9 +11,9 @@ use crate::{
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct MovementSettings {
|
pub struct MovementSettings {
|
||||||
pub sensitivity: f32,
|
|
||||||
pub accel: f32,
|
pub accel: f32,
|
||||||
pub gravity: f32,
|
pub gravity: f32,
|
||||||
|
pub sensitivity: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for MovementSettings {
|
impl Default for MovementSettings {
|
||||||
|
@ -24,13 +26,17 @@ impl Default for MovementSettings {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn zero_gravity(mut config: ResMut<RapierConfiguration>) {
|
||||||
|
config.gravity = Vec3::ZERO;
|
||||||
|
}
|
||||||
|
|
||||||
fn gravity(
|
fn gravity(
|
||||||
xform: Query<&Transform, With<CyberBikeBody>>,
|
mut query: Query<(&Transform, &mut ExternalForce), With<CyberBikeBody>>,
|
||||||
settings: Res<MovementSettings>,
|
settings: Res<MovementSettings>,
|
||||||
mut config: ResMut<RapierConfiguration>,
|
|
||||||
) {
|
) {
|
||||||
let gravity = xform.single().translation.normalize() * -settings.gravity;
|
let (xform, mut forces) = query.single_mut();
|
||||||
config.gravity = gravity;
|
let grav = xform.translation.normalize() * -settings.gravity;
|
||||||
|
forces.force = grav;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn falling_cat_pid(
|
fn falling_cat_pid(
|
||||||
|
@ -70,7 +76,7 @@ fn falling_cat_pid(
|
||||||
|
|
||||||
let angvel = vels.angvel.as_ref();
|
let angvel = vels.angvel.as_ref();
|
||||||
let roll_rate = cam_forward.dot(Vec3::from_slice(angvel)).abs();
|
let roll_rate = cam_forward.dot(Vec3::from_slice(angvel)).abs();
|
||||||
dbg!(roll_rate);
|
//dbg!(roll_rate);
|
||||||
if pitch_cos.abs() < 0.85 && roll_rate < 1.0 {
|
if pitch_cos.abs() < 0.85 && roll_rate < 1.0 {
|
||||||
torque += xform.back() * mag;
|
torque += xform.back() * mag;
|
||||||
}
|
}
|
||||||
|
@ -90,8 +96,6 @@ fn falling_cat_pid(
|
||||||
let integral = (control_vars.pitch_sum * 0.7) + pitch_error;
|
let integral = (control_vars.pitch_sum * 0.7) + pitch_error;
|
||||||
control_vars.pitch_sum = integral;
|
control_vars.pitch_sum = integral;
|
||||||
|
|
||||||
dbg!(integral);
|
|
||||||
|
|
||||||
let proportional = pitch_error;
|
let proportional = pitch_error;
|
||||||
|
|
||||||
let kp = 7.1;
|
let kp = 7.1;
|
||||||
|
@ -101,7 +105,7 @@ fn falling_cat_pid(
|
||||||
|
|
||||||
let angvel = vels.angvel.as_ref();
|
let angvel = vels.angvel.as_ref();
|
||||||
let pitch_rate = cam_right.dot(Vec3::from_slice(angvel)).abs();
|
let pitch_rate = cam_right.dot(Vec3::from_slice(angvel)).abs();
|
||||||
dbg!(pitch_rate);
|
|
||||||
if roll_cos.abs() < 0.85 && pitch_rate < 2.0 {
|
if roll_cos.abs() < 0.85 && pitch_rate < 2.0 {
|
||||||
torque += xform.left() * mag;
|
torque += xform.left() * mag;
|
||||||
}
|
}
|
||||||
|
@ -110,15 +114,6 @@ fn falling_cat_pid(
|
||||||
forces.torque = torque;
|
forces.torque = torque;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn drag(mut query: Query<(&Velocity, &mut ExternalForce), With<CyberBikeBody>>) {
|
|
||||||
let (vels, mut forces) = query.single_mut();
|
|
||||||
|
|
||||||
if let Some(vel) = vels.linvel.try_normalize() {
|
|
||||||
let v2 = vels.linvel.length_squared();
|
|
||||||
forces.force -= vel * v2 * 0.02;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn input_forces(
|
fn input_forces(
|
||||||
settings: Res<MovementSettings>,
|
settings: Res<MovementSettings>,
|
||||||
input: Res<InputState>,
|
input: Res<InputState>,
|
||||||
|
@ -138,6 +133,19 @@ fn input_forces(
|
||||||
// steering
|
// steering
|
||||||
let torque = xform.up() * input.yaw * settings.sensitivity;
|
let torque = xform.up() * input.yaw * settings.sensitivity;
|
||||||
forces.torque += torque;
|
forces.torque += torque;
|
||||||
|
|
||||||
|
//dbg!(&input);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn drag(mut query: Query<(&Velocity, &mut ExternalForce), With<CyberBikeBody>>) {
|
||||||
|
let (vels, mut forces) = query.single_mut();
|
||||||
|
|
||||||
|
if let Some(vel) = vels.linvel.try_normalize() {
|
||||||
|
let v2 = vels.linvel.length_squared();
|
||||||
|
forces.force -= vel * v2 * 0.02;
|
||||||
|
}
|
||||||
|
|
||||||
|
//dbg!(&forces);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct CyberActionPlugin;
|
pub struct CyberActionPlugin;
|
||||||
|
@ -145,9 +153,10 @@ impl Plugin for CyberActionPlugin {
|
||||||
fn build(&self, app: &mut App) {
|
fn build(&self, app: &mut App) {
|
||||||
app.init_resource::<MovementSettings>()
|
app.init_resource::<MovementSettings>()
|
||||||
.add_plugin(RapierPhysicsPlugin::<NoUserData>::default())
|
.add_plugin(RapierPhysicsPlugin::<NoUserData>::default())
|
||||||
.add_system(gravity)
|
.add_startup_system(zero_gravity)
|
||||||
|
.add_system(gravity.before("cat"))
|
||||||
.add_system(falling_cat_pid.label("cat"))
|
.add_system(falling_cat_pid.label("cat"))
|
||||||
.add_system(drag.label("drag").after("iforces"))
|
.add_system(input_forces.label("iforces").after("cat"))
|
||||||
.add_system(input_forces.label("iforces").after("cat"));
|
.add_system(drag.label("drag").after("iforces"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,7 +77,10 @@ fn spawn_cyberbike(mut commands: Commands, asset_server: Res<AssetServer>) {
|
||||||
.insert(ExternalForce::default())
|
.insert(ExternalForce::default())
|
||||||
.insert(CyberBikeCollider)
|
.insert(CyberBikeCollider)
|
||||||
.with_children(|rider| {
|
.with_children(|rider| {
|
||||||
rider.spawn_scene(asset_server.load("cyber-bike_no_y_up.glb#Scene0"));
|
rider.spawn_bundle(SceneBundle {
|
||||||
|
scene: asset_server.load("cyber-bike_no_y_up.glb#Scene0"),
|
||||||
|
..Default::default()
|
||||||
|
});
|
||||||
})
|
})
|
||||||
.insert(CyberBikeModel)
|
.insert(CyberBikeModel)
|
||||||
.insert(CyberBikeBody)
|
.insert(CyberBikeBody)
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
use bevy::{
|
use bevy::prelude::{
|
||||||
prelude::{
|
info, Camera, Camera3dBundle, Commands, Component, Input, KeyCode, ParamSet,
|
||||||
info, Commands, Component, Entity, Input, KeyCode, ParamSet, PerspectiveCameraBundle,
|
PerspectiveProjection, Plugin, Quat, Query, Res, ResMut, State, Transform, With,
|
||||||
PerspectiveProjection, Plugin, Quat, Query, Res, ResMut, State, Transform, With,
|
|
||||||
},
|
|
||||||
render::camera::{ActiveCamera, Camera3d},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{bike::CyberBikeModel, input::InputState};
|
use crate::{bike::CyberBikeModel, input::InputState};
|
||||||
|
@ -32,14 +29,14 @@ fn setup_cybercams(mut commands: Commands) {
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
commands
|
commands
|
||||||
.spawn_bundle(PerspectiveCameraBundle {
|
.spawn_bundle(Camera3dBundle {
|
||||||
perspective_projection: hero_projection,
|
projection: bevy::render::camera::Projection::Perspective(hero_projection),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
})
|
})
|
||||||
.insert(CyberCameras::Hero);
|
.insert(CyberCameras::Hero);
|
||||||
|
|
||||||
commands
|
commands
|
||||||
.spawn_bundle(PerspectiveCameraBundle::default())
|
.spawn_bundle(Camera3dBundle::default())
|
||||||
.insert(CyberCameras::Debug);
|
.insert(CyberCameras::Debug);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,17 +79,17 @@ fn follow_cyberbike(
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_active_camera(
|
fn update_active_camera(
|
||||||
mut active_cams: ResMut<ActiveCamera<Camera3d>>,
|
|
||||||
state: Res<State<CyberCameras>>,
|
state: Res<State<CyberCameras>>,
|
||||||
mut query: Query<(&CyberCameras, Entity)>,
|
mut query: Query<(&mut Camera, &CyberCameras)>,
|
||||||
) {
|
) {
|
||||||
// find the camera with the current state, set it as the ActiveCamera
|
// find the camera with the current state, set it as the ActiveCamera
|
||||||
query
|
query.iter_mut().for_each(|(mut cam, cyber)| {
|
||||||
.iter_mut()
|
if cyber.eq(state.current()) {
|
||||||
.filter(|(cybercam, _)| state.current().eq(cybercam))
|
cam.is_active = true;
|
||||||
.for_each(|(_, entity)| {
|
} else {
|
||||||
active_cams.set(entity);
|
cam.is_active = false;
|
||||||
});
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn cycle_cam_state(mut state: ResMut<State<CyberCameras>>, mut keys: ResMut<Input<KeyCode>>) {
|
fn cycle_cam_state(mut state: ResMut<State<CyberCameras>>, mut keys: ResMut<Input<KeyCode>>) {
|
||||||
|
|
|
@ -51,6 +51,7 @@ fn wireframe_planet(
|
||||||
width: 101.0,
|
width: 101.0,
|
||||||
color: BISEXY_COLOR,
|
color: BISEXY_COLOR,
|
||||||
perspective: true,
|
perspective: true,
|
||||||
|
depth_bias: -0.001,
|
||||||
}),
|
}),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
});
|
});
|
||||||
|
|
38
src/input.rs
38
src/input.rs
|
@ -1,43 +1,42 @@
|
||||||
use bevy::{
|
use bevy::prelude::{
|
||||||
ecs::event::{Events, ManualEventReader},
|
info, App, EventReader, GamepadAxisType, GamepadButtonType, GamepadEvent, GamepadEventType,
|
||||||
prelude::*,
|
Plugin, ResMut,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default, Debug)]
|
||||||
pub(crate) struct InputState {
|
pub(crate) struct InputState {
|
||||||
event_reader: ManualEventReader<GamepadEvent>,
|
|
||||||
pub yaw: f32,
|
pub yaw: f32,
|
||||||
pub throttle: f32,
|
pub throttle: f32,
|
||||||
pub brake: bool,
|
pub brake: bool,
|
||||||
pub pitch: f32,
|
pub pitch: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_input(events: Res<Events<GamepadEvent>>, mut istate: ResMut<InputState>) {
|
fn update_input(mut events: EventReader<GamepadEvent>, mut istate: ResMut<InputState>) {
|
||||||
let mut throttle = 0.0;
|
for GamepadEvent {
|
||||||
let mut brake = false;
|
gamepad: _,
|
||||||
let mut pitch = 0.0;
|
event_type: ev,
|
||||||
let mut yaw = 0.0;
|
} in events.iter()
|
||||||
for GamepadEvent(_, ev) in istate.event_reader.iter(&events) {
|
{
|
||||||
match *ev {
|
match *ev {
|
||||||
GamepadEventType::ButtonChanged(GamepadButtonType::RightTrigger2, val) => {
|
GamepadEventType::ButtonChanged(GamepadButtonType::RightTrigger2, val) => {
|
||||||
throttle += val;
|
istate.throttle = val;
|
||||||
}
|
}
|
||||||
GamepadEventType::ButtonChanged(GamepadButtonType::LeftTrigger2, val) => {
|
GamepadEventType::ButtonChanged(GamepadButtonType::LeftTrigger2, val) => {
|
||||||
throttle -= val;
|
istate.throttle = -val;
|
||||||
}
|
}
|
||||||
GamepadEventType::ButtonChanged(GamepadButtonType::East, val) => {
|
GamepadEventType::ButtonChanged(GamepadButtonType::East, val) => {
|
||||||
if val > 0.5 {
|
if val > 0.5 {
|
||||||
brake = true;
|
istate.brake = true;
|
||||||
} else {
|
} else {
|
||||||
brake = false;
|
istate.brake = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GamepadEventType::AxisChanged(GamepadAxisType::LeftStickX, val) => {
|
GamepadEventType::AxisChanged(GamepadAxisType::LeftStickX, val) => {
|
||||||
yaw -= val;
|
istate.yaw = val;
|
||||||
}
|
}
|
||||||
// ignore spurious vertical movement for now
|
// ignore spurious vertical movement for now
|
||||||
GamepadEventType::AxisChanged(GamepadAxisType::LeftStickY, val) => {
|
GamepadEventType::AxisChanged(GamepadAxisType::LeftStickY, val) => {
|
||||||
pitch += val;
|
istate.pitch = val;
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
info!("unhandled gamepad event: {:?}", ev);
|
info!("unhandled gamepad event: {:?}", ev);
|
||||||
|
@ -45,10 +44,7 @@ fn update_input(events: Res<Events<GamepadEvent>>, mut istate: ResMut<InputState
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
istate.throttle = throttle;
|
dbg!(&istate);
|
||||||
istate.brake = brake;
|
|
||||||
istate.pitch = pitch;
|
|
||||||
istate.yaw = yaw;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct CyberInputPlugin;
|
pub struct CyberInputPlugin;
|
||||||
|
|
|
@ -37,7 +37,7 @@ fn main() {
|
||||||
.add_plugin(CyberUIPlugin)
|
.add_plugin(CyberUIPlugin)
|
||||||
.add_plugin(CyberBikePlugin)
|
.add_plugin(CyberBikePlugin)
|
||||||
.add_startup_system(disable_mouse_trap)
|
.add_startup_system(disable_mouse_trap)
|
||||||
.add_system(bevy::input::system::exit_on_esc_system);
|
.add_system(bevy::window::close_on_esc);
|
||||||
|
|
||||||
app.run();
|
app.run();
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ use crate::bike::CyberBikeBody;
|
||||||
struct UpText;
|
struct UpText;
|
||||||
|
|
||||||
fn setup_ui(mut commands: Commands, asset_server: Res<AssetServer>) {
|
fn setup_ui(mut commands: Commands, asset_server: Res<AssetServer>) {
|
||||||
commands.spawn_bundle(UiCameraBundle::default());
|
//commands.spawn_bundle(UiCameraBundle::default());
|
||||||
|
|
||||||
commands
|
commands
|
||||||
.spawn_bundle(TextBundle {
|
.spawn_bundle(TextBundle {
|
||||||
|
|
Loading…
Reference in a new issue