add illumination and debug mode
parent
0474c8c036
commit
c9ecaffd6b
|
@ -484,6 +484,15 @@ dependencies = [
|
||||||
"bevy_window",
|
"bevy_window",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bevy_prototype_debug_lines"
|
||||||
|
version = "0.3.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "70e5d04fa850cbfdc7b2525bb0d41ed3b19b0da7c013a09ce9ce85949f5b3102"
|
||||||
|
dependencies = [
|
||||||
|
"bevy",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bevy_reflect"
|
name = "bevy_reflect"
|
||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
|
@ -2134,6 +2143,7 @@ version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bevy",
|
"bevy",
|
||||||
"bevy_mod_raycast",
|
"bevy_mod_raycast",
|
||||||
|
"bevy_prototype_debug_lines",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -8,3 +8,4 @@ edition = "2018"
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bevy = "0.5.0"
|
bevy = "0.5.0"
|
||||||
bevy_mod_raycast = "0.2.2"
|
bevy_mod_raycast = "0.2.2"
|
||||||
|
bevy_prototype_debug_lines = "0.3.3"
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
use std::f32::consts::TAU;
|
||||||
|
|
||||||
|
use bevy::{ecs::schedule::ShouldRun, prelude::*};
|
||||||
|
use bevy_prototype_debug_lines::*;
|
||||||
|
|
||||||
|
use crate::illumination::Illumination;
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
pub struct Debug {
|
||||||
|
on: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn debug_run_criteria(debug: Res<Debug>) -> ShouldRun {
|
||||||
|
if debug.on {
|
||||||
|
ShouldRun::Yes
|
||||||
|
} else {
|
||||||
|
ShouldRun::No
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn debug_draw_illumination(
|
||||||
|
query: Query<(&GlobalTransform, &Illumination)>,
|
||||||
|
mut lines: ResMut<DebugLines>,
|
||||||
|
) {
|
||||||
|
for (trans, illumination) in query.iter() {
|
||||||
|
draw_sphere(&mut lines, trans.translation, illumination.radius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw_sphere(lines: &mut DebugLines, c: Vec3, r: f32) {
|
||||||
|
const THICKNESS: f32 = 0.1;
|
||||||
|
const MAX_LINES: usize = 10;
|
||||||
|
|
||||||
|
for i in 0..MAX_LINES {
|
||||||
|
let angle1 = (i as f32 / MAX_LINES as f32) * TAU;
|
||||||
|
let angle2 = ((i + 1) as f32 / MAX_LINES as f32) * TAU;
|
||||||
|
|
||||||
|
let start = Vec3::new(r * f32::cos(angle1), 1.0, r * f32::sin(angle1)) + c;
|
||||||
|
let end = Vec3::new(r * f32::cos(angle2), 1.0, r * f32::sin(angle2)) + c;
|
||||||
|
|
||||||
|
lines.line(start, end, THICKNESS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn toggle_debug(mut debug: ResMut<Debug>, input: Res<Input<KeyCode>>) {
|
||||||
|
if input.pressed(KeyCode::J) && input.pressed(KeyCode::K) && input.just_pressed(KeyCode::L) {
|
||||||
|
debug.on = !debug.on;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
pub struct Illumination {
|
||||||
|
pub radius: f32,
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
use crate::player::Player;
|
use crate::{illumination::Illumination, player::Player};
|
||||||
|
|
||||||
const RANGE: f32 = 25.0;
|
const RANGE: f32 = 25.0;
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ pub fn light_up_ball_when_close_to_player(
|
||||||
&LightBall,
|
&LightBall,
|
||||||
&mut Handle<StandardMaterial>,
|
&mut Handle<StandardMaterial>,
|
||||||
Option<&mut Light>,
|
Option<&mut Light>,
|
||||||
|
Option<&mut Illumination>,
|
||||||
)>,
|
)>,
|
||||||
materials: Res<LightBallMaterials>,
|
materials: Res<LightBallMaterials>,
|
||||||
) {
|
) {
|
||||||
|
@ -23,7 +24,7 @@ pub fn light_up_ball_when_close_to_player(
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
for (entity, trans, _, mut material, light) in thingies.iter_mut() {
|
for (entity, trans, _, mut material, light, illumination) in thingies.iter_mut() {
|
||||||
let dis = trans.translation.distance(player_pos);
|
let dis = trans.translation.distance(player_pos);
|
||||||
if dis < RANGE {
|
if dis < RANGE {
|
||||||
*material = materials.lit.clone();
|
*material = materials.lit.clone();
|
||||||
|
@ -39,6 +40,15 @@ pub fn light_up_ball_when_close_to_player(
|
||||||
..Default::default()
|
..Default::default()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// same with illumination
|
||||||
|
if let Some(mut l) = illumination {
|
||||||
|
l.radius = 15.0 * ((RANGE - dis) / RANGE).sqrt();
|
||||||
|
} else {
|
||||||
|
commands.entity(entity).insert(Illumination {
|
||||||
|
radius: 15.0 * ((RANGE - dis) / RANGE).sqrt().sqrt(),
|
||||||
|
});
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
*material = materials.unlit.clone();
|
*material = materials.unlit.clone();
|
||||||
|
|
||||||
|
@ -46,6 +56,9 @@ pub fn light_up_ball_when_close_to_player(
|
||||||
if light.is_some() {
|
if light.is_some() {
|
||||||
commands.entity(entity).remove::<Light>();
|
commands.entity(entity).remove::<Light>();
|
||||||
}
|
}
|
||||||
|
if illumination.is_some() {
|
||||||
|
commands.entity(entity).remove::<Illumination>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
14
src/main.rs
14
src/main.rs
|
@ -1,14 +1,18 @@
|
||||||
use bevy::{input::system::exit_on_esc_system, pbr::AmbientLight, prelude::*};
|
use bevy::{input::system::exit_on_esc_system, pbr::AmbientLight, prelude::*};
|
||||||
use bevy_mod_raycast::{build_rays, update_raycast, PluginState, RayCastMesh, RaycastSystem};
|
use bevy_mod_raycast::{build_rays, update_raycast, PluginState, RayCastMesh, RaycastSystem};
|
||||||
|
use bevy_prototype_debug_lines::*;
|
||||||
|
|
||||||
mod camera;
|
mod camera;
|
||||||
mod columns;
|
mod columns;
|
||||||
|
mod debug;
|
||||||
|
mod illumination;
|
||||||
mod light_balls;
|
mod light_balls;
|
||||||
mod loading;
|
mod loading;
|
||||||
mod player;
|
mod player;
|
||||||
mod rendering;
|
mod rendering;
|
||||||
|
|
||||||
use camera::*;
|
use camera::*;
|
||||||
|
use debug::*;
|
||||||
use light_balls::*;
|
use light_balls::*;
|
||||||
use player::*;
|
use player::*;
|
||||||
|
|
||||||
|
@ -23,6 +27,8 @@ fn main() {
|
||||||
.insert_resource(Msaa { samples: 4 })
|
.insert_resource(Msaa { samples: 4 })
|
||||||
.insert_resource(ClearColor(Color::rgb(0.0, 0.0, 0.0)))
|
.insert_resource(ClearColor(Color::rgb(0.0, 0.0, 0.0)))
|
||||||
.add_plugins(rendering::CustomPlugins)
|
.add_plugins(rendering::CustomPlugins)
|
||||||
|
.add_plugin(DebugLinesPlugin)
|
||||||
|
.init_resource::<Debug>()
|
||||||
.init_resource::<LightBallMaterials>()
|
.init_resource::<LightBallMaterials>()
|
||||||
.init_resource::<MouseCoords>()
|
.init_resource::<MouseCoords>()
|
||||||
.init_resource::<FloatingOrbsInterpolationState>()
|
.init_resource::<FloatingOrbsInterpolationState>()
|
||||||
|
@ -64,7 +70,13 @@ fn main() {
|
||||||
.with_system(update_floating_orbs_interpolation.system())
|
.with_system(update_floating_orbs_interpolation.system())
|
||||||
.with_system(move_player.system())
|
.with_system(move_player.system())
|
||||||
.with_system(camera_follow_player.system())
|
.with_system(camera_follow_player.system())
|
||||||
.with_system(light_up_ball_when_close_to_player.system()),
|
.with_system(light_up_ball_when_close_to_player.system())
|
||||||
|
.with_system(toggle_debug.system()),
|
||||||
|
)
|
||||||
|
.add_system_set(
|
||||||
|
SystemSet::on_update(AppState::Game)
|
||||||
|
.with_run_criteria(debug_run_criteria.system())
|
||||||
|
.with_system(debug_draw_illumination.system()),
|
||||||
)
|
)
|
||||||
.run();
|
.run();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
use crate::camera::MouseCoords;
|
use crate::{camera::MouseCoords, illumination::Illumination};
|
||||||
|
|
||||||
pub struct Player;
|
pub struct Player;
|
||||||
pub struct PlayerLight {
|
pub struct PlayerLight {
|
||||||
|
@ -59,7 +59,8 @@ pub fn spawn_player(
|
||||||
},
|
},
|
||||||
..Default::default()
|
..Default::default()
|
||||||
})
|
})
|
||||||
.insert(PlayerLight { i: i as u8 + 1 });
|
.insert(PlayerLight { i: i as u8 + 1 })
|
||||||
|
.insert(Illumination { radius: 13.0 });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue