diff --git a/src/density_grid.rs b/src/density_grid.rs index 1804aa3..d6ff771 100644 --- a/src/density_grid.rs +++ b/src/density_grid.rs @@ -1,13 +1,16 @@ +use std::f32::consts::TAU; + use crate::globals::MAX_MAP_WIDTH; use crate::physics_body::PhysicsBody; use bevy::prelude::*; +use rand::Rng; -const CELL_SIZE: usize = 32; +const CELL_SIZE: usize = 8; const MAX_MAP_SIZE: usize = MAX_MAP_WIDTH * 2; const ARRAY_WIDTH: usize = MAX_MAP_SIZE / CELL_SIZE; const GRID_ARRAY_SIZE: usize = ARRAY_WIDTH * ARRAY_WIDTH; -const DENSITY_FORCE_SCALE: f32 = 100.0; +const DENSITY_FORCE_SCALE: f32 = 6000.0; #[derive(Resource)] pub struct DensityGrid { @@ -34,12 +37,16 @@ fn get_index_from_uvec2(grid_cell: UVec2) -> usize { } #[derive(Component, Default)] -pub struct DensityObject {} +pub struct DensityObject { + random_offset: Vec2, +} -pub fn init_density_object(mut density_grid: ResMut, mut query: Query<&Transform>) { - for transform in &mut query { +pub fn init_density_object(mut density_grid: ResMut, mut query: Query<(&Transform, &mut DensityObject)>) { + let mut rng = rand::rng(); + for (transform, mut density_obj) in &mut query { let grid_cell = pos_to_grid_cell(transform.translation.xy()); // println!("grid cell {:?}", grid_cell); + density_obj.random_offset = Vec2::from_angle(rng.random_range(0.0..TAU)) * 0.2; let index = get_index_from_uvec2(grid_cell); density_grid.grid[index] += 1; } @@ -57,9 +64,9 @@ pub fn density_grid_update(mut density_grid: ResMut, query: Query<& pub fn density_grid_force( density_grid: Res, - mut query: Query<(&mut PhysicsBody, &Transform), With>, + mut query: Query<(&mut PhysicsBody, &Transform, &DensityObject)>, ) { - for (mut physics_body, transform) in &mut query { + for (mut physics_body, transform, density_obj) in &mut query { let grid_cell = pos_to_grid_cell(transform.translation.xy()); let mut density_gradient = Vec2::ZERO; @@ -75,6 +82,7 @@ pub fn density_grid_force( } } // println!("density : {:?}", density_gradient); + density_gradient += density_obj.random_offset; // To not have a "grid" thingy physics_body.force -= density_gradient * DENSITY_FORCE_SCALE; } } diff --git a/src/lana.rs b/src/lana.rs index 66e6ef0..c71fa83 100644 --- a/src/lana.rs +++ b/src/lana.rs @@ -5,6 +5,7 @@ use crate::sphere_collider::SphereCollider; use bevy::prelude::*; use rand::Rng; use std::f32::consts::TAU; +use std::fmt::Debug; #[derive(Component)] #[require(Sprite, PhysicsBody, SphereCollider, DensityObject)] @@ -16,14 +17,14 @@ pub fn lana_spawn(mut commands: Commands, asset_server: Res) { let texture: Handle = asset_server.load("sprites/lana.png"); let mut rng = rand::rng(); - for _ in 0..1_000 { + for _ in 0..1000 { let angle = rng.random_range(0.0..TAU); let pos = Vec2::from_angle(angle) * 500.0; commands.spawn(( Lana { move_force: 3000.0 }, Sprite { image: texture.clone(), ..default() }, - Transform::from_translation(pos.extend(0.0)).with_scale(Vec3::splat(0.02)), + Transform::from_translation(pos.extend(0.0)).with_scale(Vec3::splat(0.01)), PhysicsBody { mass: 10.0, force: Vec2::ZERO, velocity: Vec2::ZERO, drag: 0.05 }, )); }