use fastrand for better asteroid distribution
This commit is contained in:
parent
0e18067024
commit
3ea2f3bc3a
5
Cargo.lock
generated
5
Cargo.lock
generated
|
@ -1704,9 +1704,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fastrand"
|
name = "fastrand"
|
||||||
version = "2.0.1"
|
version = "2.0.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
|
checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fdeflate"
|
name = "fdeflate"
|
||||||
|
@ -2753,6 +2753,7 @@ dependencies = [
|
||||||
"bevy",
|
"bevy",
|
||||||
"bevy_embedded_assets",
|
"bevy_embedded_assets",
|
||||||
"bevy_xpbd_3d",
|
"bevy_xpbd_3d",
|
||||||
|
"fastrand",
|
||||||
"regex",
|
"regex",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ regex = "1"
|
||||||
bevy = { version = "0.13.1", default-features = false, features = ["jpeg", "bevy_asset", "bevy_audio", "bevy_scene", "bevy_winit", "bevy_core_pipeline", "bevy_pbr", "bevy_gltf", "bevy_render", "bevy_text", "bevy_ui", "file_watcher", "multi-threaded", "png", "vorbis", "x11", "tonemapping_luts"]}
|
bevy = { version = "0.13.1", default-features = false, features = ["jpeg", "bevy_asset", "bevy_audio", "bevy_scene", "bevy_winit", "bevy_core_pipeline", "bevy_pbr", "bevy_gltf", "bevy_render", "bevy_text", "bevy_ui", "file_watcher", "multi-threaded", "png", "vorbis", "x11", "tonemapping_luts"]}
|
||||||
bevy_xpbd_3d = { version = "0.4.2", default-features = false, features = ["3d", "f64", "parry-f64", "parallel", "async-collider"] }
|
bevy_xpbd_3d = { version = "0.4.2", default-features = false, features = ["3d", "f64", "parry-f64", "parallel", "async-collider"] }
|
||||||
bevy_embedded_assets = "0.10.2"
|
bevy_embedded_assets = "0.10.2"
|
||||||
|
fastrand = "2.0.2"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
dev = ["bevy/dynamic_linking"]
|
dev = ["bevy/dynamic_linking"]
|
||||||
|
|
32
src/world.rs
32
src/world.rs
|
@ -6,9 +6,10 @@ use bevy_xpbd_3d::prelude::*;
|
||||||
use bevy_xpbd_3d::plugins::sync::SyncConfig;
|
use bevy_xpbd_3d::plugins::sync::SyncConfig;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::f32::consts::PI;
|
use std::f32::consts::PI;
|
||||||
|
use fastrand;
|
||||||
|
|
||||||
const ASTEROID_UPDATE_INTERVAL: f32 = 1.0; // seconds
|
const ASTEROID_UPDATE_INTERVAL: f32 = 1.0; // seconds
|
||||||
const ASTEROID_SIZE_FACTOR: f32 = 5.0;
|
const ASTEROID_SIZE_FACTOR: f32 = 3.0;
|
||||||
const STARS_MAX_MAGNITUDE: f32 = 5.5;
|
const STARS_MAX_MAGNITUDE: f32 = 5.5;
|
||||||
|
|
||||||
const CENTER_WORLD_ON_PLAYER: bool = true;
|
const CENTER_WORLD_ON_PLAYER: bool = true;
|
||||||
|
@ -232,6 +233,7 @@ fn spawn_despawn_asteroids(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut rng = fastrand::Rng::new();
|
||||||
for x in -stepmax..=stepmax {
|
for x in -stepmax..=stepmax {
|
||||||
for y in -stepmax..=stepmax {
|
for y in -stepmax..=stepmax {
|
||||||
for z in -stepmax..=stepmax {
|
for z in -stepmax..=stepmax {
|
||||||
|
@ -245,9 +247,15 @@ fn spawn_despawn_asteroids(
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// generate some deterministic pseudorandom numbers seeded with the origin coordinates
|
// Get a seed based on all of the origin axes
|
||||||
let rand_s = (4.0*((origin.x+origin.y+origin.z) as f64).sin()
|
// Probably there's a faster way
|
||||||
+ 3.0*((origin.x+origin.y+origin.z) as f64).cos()).abs() % 1.0;
|
rng.seed(origin.x as u64);
|
||||||
|
let seed = rng.u64(0..u64::MAX).wrapping_add(origin.y as u64);
|
||||||
|
rng.seed(seed);
|
||||||
|
let seed = rng.u64(0..u64::MAX).wrapping_add(origin.z as u64);
|
||||||
|
rng.seed(seed);
|
||||||
|
|
||||||
|
let rand_s = rng.f32();
|
||||||
let size: f32 = (rand_s + 1e-6).powf(-0.5) as f32; // -> between ~1 and 1000
|
let size: f32 = (rand_s + 1e-6).powf(-0.5) as f32; // -> between ~1 and 1000
|
||||||
|
|
||||||
if rand_s > 0.7 {
|
if rand_s > 0.7 {
|
||||||
|
@ -258,18 +266,14 @@ fn spawn_despawn_asteroids(
|
||||||
spawned_near += 1;
|
spawned_near += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
let rand_x = (4.0*((origin.x+origin.y) as f64).sin()
|
let rand_x = rng.f64();
|
||||||
+ 3.0*((origin.y+origin.z) as f64).cos()) % 1.0;
|
let rand_y = rng.f64();
|
||||||
let rand_y = (4.0*((origin.y+origin.z) as f64).sin()
|
let rand_z = rng.f64();
|
||||||
+ 3.0*((origin.z+origin.x) as f64).cos()) % 1.0;
|
let rand_c = rng.bool();
|
||||||
let rand_z = (40.0*((origin.z+origin.x) as f64).sin()
|
let class = if rand_c { 0 } else { 1 };
|
||||||
+ 30.0*((origin.x+origin.y) as f64).cos()) % 1.0;
|
|
||||||
let rand_c = (8.0*((origin.x+origin.z) as f64).sin()
|
|
||||||
+ 4.0*((origin.x+origin.z) as f64).cos()).abs() % 1.0;
|
|
||||||
let class = if rand_c < 0.5 { 0 } else { 1 };
|
|
||||||
|
|
||||||
//let max_viewdist = ASTEROID_VIEW_RADIUS / ASTEROID_SPAWN_STEP;
|
//let max_viewdist = ASTEROID_VIEW_RADIUS / ASTEROID_SPAWN_STEP;
|
||||||
let wobble = ASTEROID_SPAWN_STEP * 0.3;
|
let wobble = ASTEROID_SPAWN_STEP * 0.5;
|
||||||
let pos = DVec3::new(
|
let 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,
|
||||||
|
|
Loading…
Reference in a new issue