small density adjusts
This commit is contained in:
parent
91c082def3
commit
ad6eaa7d79
2 changed files with 18 additions and 9 deletions
|
|
@ -1,13 +1,16 @@
|
||||||
|
use std::f32::consts::TAU;
|
||||||
|
|
||||||
use crate::globals::MAX_MAP_WIDTH;
|
use crate::globals::MAX_MAP_WIDTH;
|
||||||
use crate::physics_body::PhysicsBody;
|
use crate::physics_body::PhysicsBody;
|
||||||
use bevy::prelude::*;
|
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 MAX_MAP_SIZE: usize = MAX_MAP_WIDTH * 2;
|
||||||
const ARRAY_WIDTH: usize = MAX_MAP_SIZE / CELL_SIZE;
|
const ARRAY_WIDTH: usize = MAX_MAP_SIZE / CELL_SIZE;
|
||||||
const GRID_ARRAY_SIZE: usize = ARRAY_WIDTH * ARRAY_WIDTH;
|
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)]
|
#[derive(Resource)]
|
||||||
pub struct DensityGrid {
|
pub struct DensityGrid {
|
||||||
|
|
@ -34,12 +37,16 @@ fn get_index_from_uvec2(grid_cell: UVec2) -> usize {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Component, Default)]
|
#[derive(Component, Default)]
|
||||||
pub struct DensityObject {}
|
pub struct DensityObject {
|
||||||
|
random_offset: Vec2,
|
||||||
|
}
|
||||||
|
|
||||||
pub fn init_density_object(mut density_grid: ResMut<DensityGrid>, mut query: Query<&Transform>) {
|
pub fn init_density_object(mut density_grid: ResMut<DensityGrid>, mut query: Query<(&Transform, &mut DensityObject)>) {
|
||||||
for transform in &mut query {
|
let mut rng = rand::rng();
|
||||||
|
for (transform, mut density_obj) in &mut query {
|
||||||
let grid_cell = pos_to_grid_cell(transform.translation.xy());
|
let grid_cell = pos_to_grid_cell(transform.translation.xy());
|
||||||
// println!("grid cell {:?}", grid_cell);
|
// 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);
|
let index = get_index_from_uvec2(grid_cell);
|
||||||
density_grid.grid[index] += 1;
|
density_grid.grid[index] += 1;
|
||||||
}
|
}
|
||||||
|
|
@ -57,9 +64,9 @@ pub fn density_grid_update(mut density_grid: ResMut<DensityGrid>, query: Query<&
|
||||||
|
|
||||||
pub fn density_grid_force(
|
pub fn density_grid_force(
|
||||||
density_grid: Res<DensityGrid>,
|
density_grid: Res<DensityGrid>,
|
||||||
mut query: Query<(&mut PhysicsBody, &Transform), With<DensityObject>>,
|
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 grid_cell = pos_to_grid_cell(transform.translation.xy());
|
||||||
let mut density_gradient = Vec2::ZERO;
|
let mut density_gradient = Vec2::ZERO;
|
||||||
|
|
||||||
|
|
@ -75,6 +82,7 @@ pub fn density_grid_force(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// println!("density : {:?}", density_gradient);
|
// println!("density : {:?}", density_gradient);
|
||||||
|
density_gradient += density_obj.random_offset; // To not have a "grid" thingy
|
||||||
physics_body.force -= density_gradient * DENSITY_FORCE_SCALE;
|
physics_body.force -= density_gradient * DENSITY_FORCE_SCALE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ use crate::sphere_collider::SphereCollider;
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
use std::f32::consts::TAU;
|
use std::f32::consts::TAU;
|
||||||
|
use std::fmt::Debug;
|
||||||
|
|
||||||
#[derive(Component)]
|
#[derive(Component)]
|
||||||
#[require(Sprite, PhysicsBody, SphereCollider, DensityObject)]
|
#[require(Sprite, PhysicsBody, SphereCollider, DensityObject)]
|
||||||
|
|
@ -16,14 +17,14 @@ pub fn lana_spawn(mut commands: Commands, asset_server: Res<AssetServer>) {
|
||||||
let texture: Handle<Image> = asset_server.load("sprites/lana.png");
|
let texture: Handle<Image> = asset_server.load("sprites/lana.png");
|
||||||
let mut rng = rand::rng();
|
let mut rng = rand::rng();
|
||||||
|
|
||||||
for _ in 0..1_000 {
|
for _ in 0..1000 {
|
||||||
let angle = rng.random_range(0.0..TAU);
|
let angle = rng.random_range(0.0..TAU);
|
||||||
let pos = Vec2::from_angle(angle) * 500.0;
|
let pos = Vec2::from_angle(angle) * 500.0;
|
||||||
|
|
||||||
commands.spawn((
|
commands.spawn((
|
||||||
Lana { move_force: 3000.0 },
|
Lana { move_force: 3000.0 },
|
||||||
Sprite { image: texture.clone(), ..default() },
|
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 },
|
PhysicsBody { mass: 10.0, force: Vec2::ZERO, velocity: Vec2::ZERO, drag: 0.05 },
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue