more async
This commit is contained in:
parent
f7591439fb
commit
21244bd086
|
@ -43,7 +43,8 @@ pub fn generate(image: ImageBuffer<Rgb<u8>, Vec<u8>>) -> Vec<u8> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn generate_async(image: ImageBuffer<Rgb<u8>, Vec<u8>>) -> Vec<u8> {
|
pub async fn generate_async(image: ImageBuffer<Rgb<u8>, Vec<u8>>) -> Vec<u8> {
|
||||||
let (mut sim, it) = sim::Simulation::simulate_image(500.0, 500.0, 8.0, image);
|
let (mut sim, it) =
|
||||||
|
sim::Simulation::simulate_image_async(500.0, 500.0, 8.0, image).await;
|
||||||
|
|
||||||
let mut buffer = Vec::<u8>::new();
|
let mut buffer = Vec::<u8>::new();
|
||||||
let mut encoder = gif::Encoder::new(&mut buffer, 500, 500, &[]).unwrap();
|
let mut encoder = gif::Encoder::new(&mut buffer, 500, 500, &[]).unwrap();
|
||||||
|
|
44
src/sim.rs
44
src/sim.rs
|
@ -91,6 +91,32 @@ impl Simulation {
|
||||||
(sim, total_iterations)
|
(sim, total_iterations)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub async fn simulate_image_async(
|
||||||
|
width: f32,
|
||||||
|
height: f32,
|
||||||
|
circle_radius: f32,
|
||||||
|
img: ImageBuffer<Rgb<u8>, Vec<u8>>,
|
||||||
|
) -> (Self, usize) {
|
||||||
|
let image_hash = ({
|
||||||
|
let mut s = std::hash::DefaultHasher::new();
|
||||||
|
img.hash(&mut s);
|
||||||
|
s.finish()
|
||||||
|
} % 1204) as usize;
|
||||||
|
let mut sim = Simulation::new(width, height, circle_radius, image_hash);
|
||||||
|
while sim.circles() < sim.max_circles {
|
||||||
|
sim.step_async().await;
|
||||||
|
}
|
||||||
|
for _ in 0..120 {
|
||||||
|
sim.step_async().await
|
||||||
|
}
|
||||||
|
let total_iterations = sim.clock;
|
||||||
|
sim.assign_colors_from_image(img);
|
||||||
|
sim.circles.clear();
|
||||||
|
sim.clock = sim.rand_seed;
|
||||||
|
(sim, total_iterations)
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn add_circle(&mut self, position: Vector2, velocity: Vector2) {
|
pub fn add_circle(&mut self, position: Vector2, velocity: Vector2) {
|
||||||
self.circles.push(Circle {
|
self.circles.push(Circle {
|
||||||
|
@ -220,6 +246,24 @@ impl Simulation {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub async fn step_async(&mut self) {
|
||||||
|
if self.circles.len() < self.max_circles {
|
||||||
|
self.launch();
|
||||||
|
}
|
||||||
|
if self.circles.len() < self.max_circles {
|
||||||
|
self.launch2();
|
||||||
|
}
|
||||||
|
|
||||||
|
(0..self.substeps).for_each(|_| {
|
||||||
|
self.constrain_rect();
|
||||||
|
self.sort();
|
||||||
|
self.collide();
|
||||||
|
self.integrate();
|
||||||
|
self.clock += 1;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// #[inline]
|
// #[inline]
|
||||||
// pub fn draw(&self, d: &mut RaylibDrawHandle) {
|
// pub fn draw(&self, d: &mut RaylibDrawHandle) {
|
||||||
// self
|
// self
|
||||||
|
|
Loading…
Reference in a new issue