opti(particles): fetch ThreadRng only once in a system

This commit is contained in:
Pascal Engélibert 2022-08-27 09:35:01 +02:00
parent f3f74f668a
commit 9f04ec861e
Signed by: tuxmain
GPG key ID: 3504BC6D362F7DCA
2 changed files with 18 additions and 10 deletions

View file

@ -290,8 +290,7 @@ fn collision_event_system(
.clamp(Vec4::ZERO, Vec4::ONE);
// If color approximately white
if app_state.current() == &AppState::Game
&& new_color.min_element() >= 0.9
if app_state.current() == &AppState::Game && new_color.min_element() >= 0.9
{
app_state.replace(AppState::Win).ok();
}

View file

@ -1,5 +1,5 @@
use bevy::{prelude::*, sprite::Mesh2dHandle};
use rand::Rng;
use rand::{rngs::ThreadRng, Rng};
use rand_distr::{Distribution, UnitCircle};
#[cfg(not(target_arch = "wasm32"))]
@ -68,15 +68,20 @@ pub struct ParticleComponent {
}
impl ParticleComponent {
pub fn new() -> Self {
pub fn new(rng: &mut ThreadRng) -> Self {
let mut particle_component: Self = Self::default();
particle_component.randomize_velocity(MIN_VELOCITY, MAX_VELOCITY);
particle_component.randomize_velocity(rng, MIN_VELOCITY, MAX_VELOCITY);
particle_component
}
pub fn randomize_velocity(&mut self, min_velocity: f32, max_velocity: f32) {
let random_direction: [f32; 2] = UnitCircle.sample(&mut rand::thread_rng());
let random_magnitude: f32 = rand::thread_rng().gen_range(min_velocity..max_velocity);
pub fn randomize_velocity(
&mut self,
rng: &mut ThreadRng,
min_velocity: f32,
max_velocity: f32,
) {
let random_direction: [f32; 2] = UnitCircle.sample(rng);
let random_magnitude: f32 = rng.gen_range(min_velocity..max_velocity);
self.velocity = Vec3::new(random_direction[0], random_direction[1], 0.0) * random_magnitude;
}
}
@ -87,6 +92,8 @@ fn particle_effect_startup(
particle_mesh: Res<ParticleMesh>,
mut materials: ResMut<Assets<ColorMaterial>>,
) {
let mut rng = rand::thread_rng();
for _p in 0..POOL_COUNT {
let color_mesh = ColorMesh2dBundle {
mesh: particle_mesh.square.clone(),
@ -96,7 +103,7 @@ fn particle_effect_startup(
commands
.spawn_bundle(color_mesh)
.insert(ParticleComponent::new());
.insert(ParticleComponent::new(&mut rng));
}
}
@ -110,6 +117,8 @@ fn particle_effect_system(
mut particle_effect: ResMut<ParticleEffectResource>,
time: Res<Time>,
) {
let mut rng = rand::thread_rng();
let delta_seconds: f32 = f32::max(0.001, time.delta_seconds());
let delta_position: Vec3 = particle_effect.translation - particle_effect.prev_translation;
// let overall_velocity: Vec3 = delta_position / delta_seconds;
@ -124,7 +133,7 @@ fn particle_effect_system(
.distance_squared(particle_effect.translation);
if squared_distance > particle_effect.radius_squared {
transform.translation = particle_effect.translation;
particle_component.randomize_velocity(MIN_VELOCITY, MAX_VELOCITY);
particle_component.randomize_velocity(&mut rng, MIN_VELOCITY, MAX_VELOCITY);
}
if let Some(material) = materials.get_mut(color_material) {