Add noise-studies-02

This commit is contained in:
heyarne 2022-10-02 13:55:05 +02:00
commit 135daf211f
2 changed files with 94 additions and 0 deletions

View file

@ -9,6 +9,10 @@ edition = "2021"
name = "noise-studies-01" name = "noise-studies-01"
path = "src/noise-studies-01.rs" path = "src/noise-studies-01.rs"
[[bin]]
name = "noise-studies-02"
path = "src/noise-studies-02.rs"
[dependencies] [dependencies]
nannou = "0.18" nannou = "0.18"
rand = "0.8.5" rand = "0.8.5"

90
src/noise-studies-02.rs Normal file
View file

@ -0,0 +1,90 @@
use nannou::{
color::Alpha,
noise::{Billow, Cylinders, Fbm, HybridMulti, NoiseFn, Worley},
prelude::*,
};
const WIDTH: f32 = 512.0;
// #[derive(Debug)]
struct Model {
noise: Billow,
}
fn main() {
nannou::app(model).run();
}
fn model(app: &App) -> Model {
// app.set_loop_mode(LoopMode::Rate {
// update_interval: Duration::from_millis(1000 / 60),
// });
let _window = app
.new_window()
.size(WIDTH as u32, WIDTH as u32)
.view(view)
.key_pressed(key_pressed)
.build()
.unwrap();
Model {
noise: Billow::new(),
}
}
fn view(app: &App, model: &Model, frame: Frame) {
let draw = app
.draw()
.scale_y(-1.0)
.translate(vec3(WIDTH / -2.0, WIDTH / -2.0, 0.0));
draw.background().color(ORCHID);
let block_size: usize = 32;
let x_step = 0.01;
let y_step = 0.002;
let t_step = app.elapsed_frames() as f64 / 100.0;
let line_color = Alpha {
color: WHITE,
alpha: 0.7,
};
for x in (block_size..(frame.rect().w() as usize - block_size)).step_by(block_size / 8) {
for y in (block_size..(frame.rect().h() as usize - block_size)).step_by(block_size / 8) {
let half = (block_size / 2) as f32;
let v1 = vec2(x as f32, y as f32);
let noise: f32 =
model
.noise
.get([(v1.x * x_step) as f64, (v1.y * y_step) as f64, t_step])
as f32;
let v2 = v1 + vec2(0.0, half / 4.0).rotate(map_range(noise, -1.0, 1.0, 0.0, 0.5) * TAU);
draw.line().weight(1.0).points(v1, v2).color(line_color);
}
}
draw.to_frame(app, &frame).unwrap();
}
fn captured_frame_path(app: &App) -> std::path::PathBuf {
// Create a path that we want to save this frame to.
app.project_path()
.expect("failed to locate `project_path`")
// Capture all frames to a directory called `/<path_to_project>/screenshots/<name_of_bin>`.
.join("screenshots")
.join(app.exe_name().unwrap())
// Name each file after the number of the frame.
.join(format!("{:03}", app.elapsed_frames()))
// The extension will be PNG. We also support tiff, bmp, gif, jpeg, webp and some others.
.with_extension("png")
}
fn key_pressed(app: &App, _model: &mut Model, key: Key) {
if key == Key::S {
let file_path = captured_frame_path(app);
println!("Saving to {:?}", file_path);
app.main_window().capture_frame(file_path);
}
}