fix asteroids spawing inside the sun rather than around jupiter
This commit is contained in:
parent
5c29681ee3
commit
ed1ef1bb1f
20
src/world.rs
20
src/world.rs
|
@ -208,16 +208,24 @@ fn spawn_despawn_asteroids(
|
||||||
asteroid2_handle: Res<AsteroidModel2>,
|
asteroid2_handle: Res<AsteroidModel2>,
|
||||||
mut q_asteroid: Query<(Entity, &SceneInstance), With<Asteroid>>,
|
mut q_asteroid: Query<(Entity, &SceneInstance), With<Asteroid>>,
|
||||||
mut last_player_cell: Local<I64Vec3>,
|
mut last_player_cell: Local<I64Vec3>,
|
||||||
|
id2pos: Res<actor::Id2Pos>,
|
||||||
) {
|
) {
|
||||||
if !timer.0.tick(time.delta()).just_finished() || q_player.is_empty() {
|
if !timer.0.tick(time.delta()).just_finished() || q_player.is_empty() {
|
||||||
//if q_player.is_empty() {
|
//if q_player.is_empty() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
let jupiter_pos = if let Some(jupiter_pos) = id2pos.0.get(&"jupiter".to_string()) {
|
||||||
|
*jupiter_pos
|
||||||
|
} else {
|
||||||
|
error!("Can't spawn asteroids because Jupiter's position can not be determined");
|
||||||
|
return;
|
||||||
|
};
|
||||||
let player = q_player.get_single().unwrap();
|
let player = q_player.get_single().unwrap();
|
||||||
|
let fromjupiter = player.0 - jupiter_pos;
|
||||||
let player_cell = I64Vec3::new(
|
let player_cell = I64Vec3::new(
|
||||||
(player.x / ASTEROID_SPAWN_STEP).round() as i64,
|
(fromjupiter.x / ASTEROID_SPAWN_STEP).round() as i64,
|
||||||
(player.y / ASTEROID_SPAWN_STEP).round() as i64,
|
(fromjupiter.y / ASTEROID_SPAWN_STEP).round() as i64,
|
||||||
(player.z / ASTEROID_SPAWN_STEP).round() as i64,
|
(fromjupiter.z / ASTEROID_SPAWN_STEP).round() as i64,
|
||||||
);
|
);
|
||||||
if *last_player_cell == player_cell {
|
if *last_player_cell == player_cell {
|
||||||
return;
|
return;
|
||||||
|
@ -261,13 +269,13 @@ fn spawn_despawn_asteroids(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Density based on the radius alone
|
// Density based on the radius alone
|
||||||
let radius_plane = (player.x * player.x + player.z * player.z).sqrt();
|
let radius_plane = (fromjupiter.x * fromjupiter.x + fromjupiter.z * fromjupiter.z).sqrt();
|
||||||
let density_r = nature::ring_density((radius_plane / 1e6) as f32);
|
let density_r = nature::ring_density((radius_plane / 1e6) as f32);
|
||||||
if density_r < 0.001 {
|
if density_r < 0.001 {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Density based on radius and the vertical distance to the ring
|
// Density based on radius and the vertical distance to the ring
|
||||||
let normalized_distance = player.y / (RING_THICKNESS / 2.0);
|
let normalized_distance = fromjupiter.y / (RING_THICKNESS / 2.0);
|
||||||
let density = density_r * (-4.0 * normalized_distance.powf(2.0)).exp() as f32;
|
let density = density_r * (-4.0 * normalized_distance.powf(2.0)).exp() as f32;
|
||||||
if density < 0.001 {
|
if density < 0.001 {
|
||||||
return;
|
return;
|
||||||
|
@ -318,7 +326,7 @@ fn spawn_despawn_asteroids(
|
||||||
|
|
||||||
//let max_viewdist = ASTEROID_VIEW_RADIUS / ASTEROID_SPAWN_STEP;
|
//let max_viewdist = ASTEROID_VIEW_RADIUS / ASTEROID_SPAWN_STEP;
|
||||||
let wobble = ASTEROID_SPAWN_STEP * 0.5;
|
let wobble = ASTEROID_SPAWN_STEP * 0.5;
|
||||||
let pos = DVec3::new(
|
let pos = jupiter_pos + DVec3::new(
|
||||||
origin.x as f64 * ASTEROID_SPAWN_STEP + wobble * rand_x * 2.0 - 1.0,
|
origin.x as f64 * ASTEROID_SPAWN_STEP + wobble * rand_x * 2.0 - 1.0,
|
||||||
origin.y as f64 * ASTEROID_SPAWN_STEP + wobble * rand_y * 2.0 - 1.0,
|
origin.y as f64 * ASTEROID_SPAWN_STEP + wobble * rand_y * 2.0 - 1.0,
|
||||||
origin.z as f64 * ASTEROID_SPAWN_STEP + wobble * rand_z * 2.0 - 1.0,
|
origin.z as f64 * ASTEROID_SPAWN_STEP + wobble * rand_z * 2.0 - 1.0,
|
||||||
|
|
Loading…
Reference in a new issue