Skip to content

Commit 1932085

Browse files
committed
wip wip adding particles
create a bigger buffer than necessary + store a u32 to know the actual number of particles Not working yet.
1 parent 8a38ae8 commit 1932085

21 files changed

+356
-46
lines changed

examples2d/src/dynamic_add.rs

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
use wgsparkl2d::rapier::prelude::{ColliderBuilder, RigidBodyBuilder};
2+
use wgsparkl_testbed2d::{wgsparkl, Callbacks, RapierData};
3+
4+
use bevy::render::renderer::RenderDevice;
5+
use nalgebra::{vector, Vector2};
6+
use wgsparkl::models::DruckerPrager;
7+
use wgsparkl::{
8+
models::ElasticCoefficients,
9+
pipeline::MpmData,
10+
solver::{Particle, SimulationParams},
11+
};
12+
use wgsparkl2d::solver::ParticleDynamics;
13+
use wgsparkl_testbed2d::{AppState, PhysicsContext};
14+
15+
pub fn dynamic_demo(
16+
device: RenderDevice,
17+
app_state: &mut AppState,
18+
callbacks: &mut Callbacks,
19+
) -> PhysicsContext {
20+
let mut rapier_data = RapierData::default();
21+
let device = device.wgpu_device();
22+
23+
let offset_y = 46.0;
24+
let cell_width = 0.2;
25+
let mut particles = vec![];
26+
let position = vector![0.5, 0.5] * cell_width / 2.0 + Vector2::y() * offset_y;
27+
let density = 1000.0;
28+
let radius = cell_width / 4.0;
29+
particles.push(Particle {
30+
position,
31+
dynamics: ParticleDynamics::with_density(radius, density),
32+
model: ElasticCoefficients::from_young_modulus(10_000_000.0, 0.2),
33+
plasticity: Some(DruckerPrager::new(10_000_000.0, 0.2)),
34+
phase: None,
35+
color: None,
36+
});
37+
38+
if !app_state.restarting {
39+
app_state.num_substeps = 10;
40+
app_state.gravity_factor = 1.0;
41+
};
42+
43+
let params = SimulationParams {
44+
gravity: vector![0.0, -9.81] * app_state.gravity_factor,
45+
dt: (1.0 / 60.0) / (app_state.num_substeps as f32),
46+
padding: 0.0,
47+
};
48+
49+
/*
50+
* Static platforms.
51+
*/
52+
let rb = RigidBodyBuilder::fixed().translation(vector![35.0, -1.0]);
53+
let rb_handle = rapier_data.bodies.insert(rb);
54+
let co = ColliderBuilder::cuboid(42.0, 1.0);
55+
rapier_data
56+
.colliders
57+
.insert_with_parent(co, rb_handle, &mut rapier_data.bodies);
58+
59+
let rb = RigidBodyBuilder::fixed()
60+
.translation(vector![-25.0, 45.0])
61+
.rotation(0.5);
62+
let rb_handle = rapier_data.bodies.insert(rb);
63+
let co = ColliderBuilder::cuboid(1.0, 52.0);
64+
rapier_data
65+
.colliders
66+
.insert_with_parent(co, rb_handle, &mut rapier_data.bodies);
67+
68+
let rb = RigidBodyBuilder::fixed()
69+
.translation(vector![95.0, 45.0])
70+
.rotation(-0.5);
71+
let rb_handle = rapier_data.bodies.insert(rb);
72+
let co = ColliderBuilder::cuboid(1.0, 52.0);
73+
rapier_data
74+
.colliders
75+
.insert_with_parent(co, rb_handle, &mut rapier_data.bodies);
76+
77+
callbacks.0.push(Box::new(
78+
move |_, physics: &mut PhysicsContext, _, _, queue| {
79+
physics.data.particles.push(
80+
queue,
81+
&Particle {
82+
position,
83+
dynamics: ParticleDynamics::with_density(radius, density),
84+
model: ElasticCoefficients::from_young_modulus(2_000_000_000.0, 0.2),
85+
plasticity: Some(DruckerPrager::new(2_000_000_000.0, 0.2)),
86+
phase: None,
87+
color: None,
88+
},
89+
)
90+
},
91+
));
92+
93+
let data = MpmData::new(
94+
device,
95+
params,
96+
&particles,
97+
1_000,
98+
&rapier_data.bodies,
99+
&rapier_data.colliders,
100+
cell_width,
101+
60_000,
102+
);
103+
PhysicsContext {
104+
data,
105+
rapier_data,
106+
particles,
107+
}
108+
}

examples2d/src/elastic_cut2.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ pub fn elastic_cut_demo(
103103
device,
104104
params,
105105
&particles,
106+
particles.len(),
106107
&rapier_data.bodies,
107108
&rapier_data.colliders,
108109
cell_width,

examples2d/src/elasticity2.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ pub fn elastic_demo(
8585
device,
8686
params,
8787
&particles,
88+
particles.len(),
8889
&rapier_data.bodies,
8990
&rapier_data.colliders,
9091
cell_width,

examples2d/src/main.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use bevy::prelude::*;
22
use wgsparkl_testbed2d::{init_testbed, SceneInitFn, SceneInits};
33

4+
mod dynamic_add;
45
mod elastic_cut2;
56
mod elasticity2;
67
mod sand2;
@@ -20,6 +21,10 @@ pub fn main() {
2021
fn register_scenes(world: &mut World) {
2122
let scenes: Vec<(String, SceneInitFn)> = vec![
2223
("sand".to_string(), Box::new(sand2::sand_demo)),
24+
(
25+
"dynamic add".to_string(),
26+
Box::new(dynamic_add::dynamic_demo),
27+
),
2328
("elastic".to_string(), Box::new(elasticity2::elastic_demo)),
2429
(
2530
"elastic cut".to_string(),

examples2d/src/sand2.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ pub fn sand_demo(
163163
device,
164164
params,
165165
&particles,
166+
particles.len(),
166167
&rapier_data.bodies,
167168
&rapier_data.colliders,
168169
cell_width,

examples3d/src/dynamic_add.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
use wgsparkl_testbed3d::{wgsparkl, Callbacks, RapierData};
2+
3+
use bevy::render::renderer::RenderDevice;
4+
use nalgebra::vector;
5+
use rapier3d::prelude::{ColliderBuilder, RigidBodyBuilder};
6+
use wgsparkl::models::DruckerPrager;
7+
use wgsparkl::{
8+
models::ElasticCoefficients,
9+
pipeline::MpmData,
10+
solver::{Particle, ParticleDynamics, SimulationParams},
11+
};
12+
use wgsparkl_testbed3d::{AppState, PhysicsContext};
13+
14+
use crate::utils::default_scene;
15+
16+
pub fn dynamic_demo(
17+
device: RenderDevice,
18+
app_state: &mut AppState,
19+
_callbacks: &mut Callbacks,
20+
) -> PhysicsContext {
21+
let mut rapier_data = RapierData::default();
22+
let device = device.wgpu_device();
23+
24+
if !app_state.restarting {
25+
app_state.num_substeps = 20;
26+
app_state.gravity_factor = 1.0;
27+
};
28+
29+
let params = SimulationParams {
30+
gravity: vector![0.0, -9.81, 0.0] * app_state.gravity_factor,
31+
dt: (1.0 / 60.0) / (app_state.num_substeps as f32),
32+
};
33+
34+
default_scene::spawn_ground_and_walls(&mut rapier_data);
35+
36+
callbacks.0.push(Box::new(
37+
move |_, physics: &mut PhysicsContext, _, _, queue| {
38+
physics.data.particles.push(
39+
queue,
40+
&Particle {
41+
position,
42+
dynamics: ParticleDynamics::with_density(radius, density),
43+
model: ElasticCoefficients::from_young_modulus(2_000_000_000.0, 0.2),
44+
plasticity: Some(DruckerPrager::new(2_000_000_000.0, 0.2)),
45+
phase: None,
46+
color: None,
47+
},
48+
)
49+
},
50+
));
51+
52+
let particles = vec![];
53+
let cell_width = 1.0;
54+
let data = MpmData::new(
55+
device,
56+
params,
57+
&particles,
58+
&rapier_data.bodies,
59+
&rapier_data.colliders,
60+
cell_width,
61+
60_000,
62+
);
63+
PhysicsContext {
64+
data,
65+
rapier_data,
66+
particles,
67+
}
68+
}

examples3d/src/main.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use wgsparkl_testbed3d::{init_testbed, SceneInitFn, SceneInits};
44
pub mod utils;
55

66
mod banana3;
7+
mod dynamic_add;
78
mod elastic_cut3;
89
mod glb_to_point_cloud_color;
910
mod heightfield3;
@@ -24,6 +25,10 @@ pub fn main() {
2425
fn register_scenes(world: &mut World) {
2526
let scenes: Vec<(String, SceneInitFn)> = vec![
2627
("sand".to_string(), Box::new(sand3::sand_demo)),
28+
(
29+
"dynamic addition".to_string(),
30+
Box::new(dynamic_add::dynamic_demo),
31+
),
2732
(
2833
"heightfield".to_string(),
2934
Box::new(heightfield3::heightfield_demo),

examples3d/src/sand3.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::ptr::dangling;
2+
13
use wgsparkl_testbed3d::{wgsparkl, Callbacks, RapierData};
24

35
use bevy::render::renderer::RenderDevice;
@@ -88,6 +90,7 @@ pub fn sand_demo(
8890
device,
8991
params,
9092
&particles,
93+
particles.len(),
9194
&rapier_data.bodies,
9295
&rapier_data.colliders,
9396
cell_width,

src/grid/sort.wgsl

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,20 @@
55

66

77
@group(1) @binding(0)
8-
var<storage, read_write> particles_pos: array<Particle::Position>;
8+
var<uniform, read> num_particles u32;
99
@group(1) @binding(1)
10-
var<storage, read_write> scan_values: array<atomic<u32>>; // This has to be atomic for finalize_particles_sort. Should it be a different buffer?
10+
var<storage, read_write> particles_pos: array<Particle::Position>;
1111
@group(1) @binding(2)
12-
var<storage, read_write> sorted_particle_ids: array<u32>;
12+
var<storage, read_write> scan_values: array<atomic<u32>>; // This has to be atomic for finalize_particles_sort. Should it be a different buffer?
1313
@group(1) @binding(3)
14-
var<storage, read_write> particle_node_linked_lists: array<u32>;
14+
var<storage, read_write> sorted_particle_ids: array<u32>;
1515
@group(1) @binding(4)
16-
var<storage, read> rigid_particles_pos: array<Particle::Position>;
16+
var<storage, read_write> particle_node_linked_lists: array<u32>;
1717
@group(1) @binding(5)
18-
var<storage, read_write> rigid_particle_node_linked_lists: array<u32>;
18+
var<storage, read> rigid_particles_pos: array<Particle::Position>;
1919
@group(1) @binding(6)
20+
var<storage, read_write> rigid_particle_node_linked_lists: array<u32>;
21+
@group(1) @binding(7)
2022
var<storage, read_write> rigid_particle_needs_block: array<atomic<u32>>;
2123

2224
// Disable this kernel on macos because of the underlying compareExchangeMap which is

src/models/mod.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,18 @@ pub struct GpuModels {
1717
}
1818

1919
impl GpuModels {
20-
pub fn from_particles(device: &Device, particles: &[Particle]) -> Self {
20+
pub fn from_particles(device: &Device, particles: &[Particle], maximum_size: usize) -> Self {
21+
let additional_unused_particles = maximum_size - particles.len();
2122
let models: Vec<_> = particles.iter().map(|p| p.model).collect();
2223
let plasticity: Vec<_> = particles
2324
.iter()
2425
.map(|p| p.plasticity.unwrap_or(DruckerPrager::new(-1.0, -1.0)))
26+
.chain(vec![DruckerPrager::new(-1.0, -1.0); additional_unused_particles])
2527
.collect();
2628
let plastic_states: Vec<_> = particles
2729
.iter()
2830
.map(|_| DruckerPragerPlasticState::default())
31+
.chain(vec![DruckerPragerPlasticState::default(); additional_unused_particles])
2932
.collect();
3033
let phases: Vec<_> = particles
3134
.iter()
@@ -35,6 +38,10 @@ impl GpuModels {
3538
max_stretch: -1.0,
3639
})
3740
})
41+
.chain(vec![ParticlePhase {
42+
phase: 0.0,
43+
max_stretch: -1.0,
44+
}; additional_unused_particles])
3845
.collect();
3946
Self {
4047
linear_elasticity: GpuVector::init(device, &models, BufferUsages::STORAGE),
@@ -47,6 +54,10 @@ impl GpuModels {
4754
phases: GpuVector::init(device, &phases, BufferUsages::STORAGE),
4855
}
4956
}
57+
58+
pub fn push() {
59+
60+
}
5061
}
5162

5263
fn lame_lambda_mu(young_modulus: f32, poisson_ratio: f32) -> (f32, f32) {

0 commit comments

Comments
 (0)