Skip to content

Commit

Permalink
Fmt
Browse files Browse the repository at this point in the history
  • Loading branch information
Masterchef365 committed Mar 5, 2024
1 parent ead9f0e commit 517304d
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 55 deletions.
44 changes: 27 additions & 17 deletions src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use egui::SidePanel;
use egui::{CentralPanel, Frame, Rect, Sense};
use glam::Vec2;
use vorpal_widgets::node_editor::NodeGraphWidget;
use vorpal_widgets::vorpal_core::ParameterList;


use crate::sim::*;

Expand All @@ -20,7 +20,6 @@ pub struct TemplateApp {
particle_mode: ParticleBehaviourMode,

// Settings

tweak: SimTweak,
width: usize,
height: usize,
Expand Down Expand Up @@ -59,8 +58,6 @@ impl TemplateApp {
let life = LifeConfig::random(n_colors, random_std_dev);
let sim = Sim::new(width, height, n_particles, particle_radius, life);

let params = ParameterList::default();

let nodes = NodeGraphWidget::new(nodegraph_fn_inputs());
let node_cfg = NodeInteractionCfg::default();

Expand Down Expand Up @@ -154,14 +151,12 @@ impl TemplateApp {
}
}

let node = vorpal_widgets::vorpal_core::highlevel::convert_node(self.nodes.extract_output_node());

self.sim.step(
&self.tweak,
&self.node_cfg,
&node,
let node = vorpal_widgets::vorpal_core::highlevel::convert_node(
self.nodes.extract_output_node(),
);

self.sim.step(&self.tweak, &self.node_cfg, &node);

self.single_step = false;
}
}
Expand All @@ -172,7 +167,13 @@ impl TemplateApp {
let coords = CoordinateMapping::new(&self.sim.grid, rect);

// Move particles
move_particles_from_egui(&mut self.sim.particles, 4., &coords, self.tweak.dt, response);
move_particles_from_egui(
&mut self.sim.particles,
4.,
&coords,
self.tweak.dt,
response,
);

// Step particles
if !self.pause || self.single_step {
Expand Down Expand Up @@ -308,7 +309,10 @@ impl TemplateApp {
.clamp_range(1e-2..=5.0),
);
if self.advanced {
ui.checkbox(&mut self.tweak.enable_particle_collisions, "Hard collisions");
ui.checkbox(
&mut self.tweak.enable_particle_collisions,
"Hard collisions",
);
ui.horizontal(|ui| {
ui.add(
DragValue::new(&mut self.sim.rest_density)
Expand Down Expand Up @@ -340,7 +344,11 @@ impl TemplateApp {
.clamp_range(0.0..=1.95),
);
ui.horizontal(|ui| {
ui.selectable_value(&mut self.tweak.solver, IncompressibilitySolver::Jacobi, "Jacobi");
ui.selectable_value(
&mut self.tweak.solver,
IncompressibilitySolver::Jacobi,
"Jacobi",
);
ui.selectable_value(
&mut self.tweak.solver,
IncompressibilitySolver::GaussSeidel,
Expand Down Expand Up @@ -392,10 +400,12 @@ impl TemplateApp {
});

if self.particle_mode == ParticleBehaviourMode::NodeGraph {
ui.add(DragValue::new(&mut self.node_cfg.neighbor_radius)
.clamp_range(1e-2..=20.0)
.speed(1e-2)
.prefix("Neighbor_radius: "));
ui.add(
DragValue::new(&mut self.node_cfg.neighbor_radius)
.clamp_range(1e-2..=20.0)
.speed(1e-2)
.prefix("Neighbor_radius: "),
);
}

if self.particle_mode == ParticleBehaviourMode::ParticleLife {
Expand Down
10 changes: 5 additions & 5 deletions src/query_accel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ impl QueryAccelerator {
.flatten()
}

// Approximate neighbors; neighbors considered may be outside of the radius!
// Approximate neighbors; neighbors considered may be outside of the radius!
pub fn query_neighbors_fast<'s, 'p: 's>(
&'s self,
query_idx: usize,
Expand All @@ -78,15 +78,15 @@ impl QueryAccelerator {
.filter_map(move |diff| {
let key = add(origin, *diff);
self.cells.get(&key).map(|cell_indices| {
cell_indices.iter().copied().filter(move |&idx| {
idx != query_idx
})
cell_indices
.iter()
.copied()
.filter(move |&idx| idx != query_idx)
})
})
.flatten()
}


pub fn replace_point(&mut self, idx: usize, prev: Vec2, current: Vec2) {
// TODO: Keep points in sorted order and use binary search! Or use hashsets for O(n)?
// Find this point in our cells and remove it
Expand Down
100 changes: 67 additions & 33 deletions src/sim.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ use crate::query_accel::QueryAccelerator;

use glam::Vec2;
use rand::prelude::*;
use vorpal_widgets::vorpal_core::{ExternParameters, ExternInputId, Value, ParameterList, DataType};
use vorpal_widgets::vorpal_core::{Node, native_backend::evaluate_node};
use vorpal_widgets::vorpal_core::{native_backend::evaluate_node, Node};
use vorpal_widgets::vorpal_core::{
DataType, ExternInputId, ExternParameters, ParameterList, Value,
};

pub struct SimTweak {
pub dt: f32,
Expand Down Expand Up @@ -175,18 +177,17 @@ impl Sim {
}
}

pub fn step(
&mut self,
tweak: &SimTweak,
node_cfg: &NodeInteractionCfg,
nodes: &Rc<Node>,
) {
pub fn step(&mut self, tweak: &SimTweak, node_cfg: &NodeInteractionCfg, nodes: &Rc<Node>) {
//puffin::profile_scope!("Complete Step");
// Step particles
apply_global_force(&mut self.particles, Vec2::new(0., -tweak.gravity), tweak.dt);
match tweak.particle_mode {
ParticleBehaviourMode::ParticleLife => particle_life_interactions(&mut self.particles, &mut self.life, tweak.dt),
ParticleBehaviourMode::NodeGraph => node_interactions(&mut self.particles, nodes, node_cfg, tweak.dt),
ParticleBehaviourMode::ParticleLife => {
particle_life_interactions(&mut self.particles, &mut self.life, tweak.dt)
}
ParticleBehaviourMode::NodeGraph => {
node_interactions(&mut self.particles, nodes, node_cfg, tweak.dt)
}
ParticleBehaviourMode::Off => (),
}

Expand Down Expand Up @@ -356,7 +357,9 @@ fn solve_incompressibility_jacobi(
let mut tmp = grid.clone();

let mut grid = grid.clone();
grid.data_mut().iter_mut().for_each(|cell| cell.vel *= f32::from(cell.pressure > 0.));
grid.data_mut()
.iter_mut()
.for_each(|cell| cell.vel *= f32::from(cell.pressure > 0.));
let grid = &mut grid;

for step in 0..iterations {
Expand Down Expand Up @@ -456,13 +459,13 @@ fn grid_to_particles(particles: &mut [Particle], grid: &Array2D<GridCell>) {
}

/*
let v = Vec2::new(0.25, 0.15);
dbg!(gradient((0, 0), v));
dbg!(gradient((1, 0), v));
dbg!(gradient((0, 1), v));
dbg!(gradient((1, 1), v));
todo!();
*/
let v = Vec2::new(0.25, 0.15);
dbg!(gradient((0, 0), v));
dbg!(gradient((1, 0), v));
dbg!(gradient((0, 1), v));
dbg!(gradient((1, 1), v));
todo!();
*/

// Interpolate grid vectors
part.deriv[0] = gather_vector(u_pos, |p| grid[p].vel.x * gradient(p, u_pos));
Expand Down Expand Up @@ -547,7 +550,7 @@ fn enforce_particle_radius(particles: &mut [Particle], radius: f32) {
.iter_mut()
.zip(&points)
.for_each(|(part, point)| part.pos = *point);
}
}

fn particle_life_interactions(particles: &mut [Particle], cfg: &LifeConfig, dt: f32) {
puffin::profile_scope!("Particle interactions");
Expand Down Expand Up @@ -685,11 +688,18 @@ fn hsv_to_rgb(h: f32, s: f32, v: f32) -> [f32; 3] {

impl Default for NodeInteractionCfg {
fn default() -> Self {
Self { neighbor_radius: 0.5 }
Self {
neighbor_radius: 0.5,
}
}
}

fn node_interactions(particles: &mut [Particle], node: &Rc<Node>, cfg: &NodeInteractionCfg, dt: f32) {
fn node_interactions(
particles: &mut [Particle],
node: &Rc<Node>,
cfg: &NodeInteractionCfg,
dt: f32,
) {
//evaluate_node(node, ctx)
puffin::profile_scope!("Particle interactions");
let points: Vec<Vec2> = particles.iter().map(|p| p.pos).collect();
Expand All @@ -702,33 +712,57 @@ fn node_interactions(particles: &mut [Particle], node: &Rc<Node>, cfg: &NodeInte
let diff = points[neighbor] - points[i];

let inputs = [
(ExternInputId::new("neigh-radius".into()), Value::Scalar(cfg.neighbor_radius)),
(ExternInputId::new("pos-diff".into()), Value::Vec2(diff.to_array())),
(ExternInputId::new("neigh-type".into()), Value::Scalar(particles[neighbor].color as f32)),
(ExternInputId::new("our-type".into()), Value::Scalar(particles[i].color as f32)),
(ExternInputId::new("position".into()), Value::Vec2(particles[i].pos.to_array())),
(ExternInputId::new("velocity".into()), Value::Vec2(particles[i].vel.to_array())),
(
ExternInputId::new("neigh-radius".into()),
Value::Scalar(cfg.neighbor_radius),
),
(
ExternInputId::new("pos-diff".into()),
Value::Vec2(diff.to_array()),
),
(
ExternInputId::new("neigh-type".into()),
Value::Scalar(particles[neighbor].color as f32),
),
(
ExternInputId::new("our-type".into()),
Value::Scalar(particles[i].color as f32),
),
(
ExternInputId::new("position".into()),
Value::Vec2(particles[i].pos.to_array()),
),
(
ExternInputId::new("velocity".into()),
Value::Vec2(particles[i].vel.to_array()),
),
];
let params = ExternParameters { inputs: inputs.into_iter().collect() };
let params = ExternParameters {
inputs: inputs.into_iter().collect(),
};

let Value::Vec4([fx, fy, _, _]) = evaluate_node(&node, &params).unwrap() else { panic!() };
let Value::Vec4([fx, fy, _, _]) = evaluate_node(&node, &params).unwrap() else {
panic!()
};
particles[i].vel += dt * Vec2::new(fx, fy);
}
}

}

pub fn nodegraph_fn_inputs() -> ParameterList {
let params = [
(ExternInputId::new("neigh-radius".to_string()), DataType::Scalar),
(
ExternInputId::new("neigh-radius".to_string()),
DataType::Scalar,
),
(ExternInputId::new("pos-diff".to_string()), DataType::Vec2),
(ExternInputId::new("neigh-type".into()), DataType::Scalar),
(ExternInputId::new("our-type".into()), DataType::Scalar),
(ExternInputId::new("position".into()), DataType::Vec2),
(ExternInputId::new("velocity".into()), DataType::Vec2),
]
.into_iter()
.collect();
.into_iter()
.collect();

ParameterList(params)
}
Expand Down

0 comments on commit 517304d

Please sign in to comment.