From c1548fa43e6de4166fcb8762e5ba4e081f725f54 Mon Sep 17 00:00:00 2001 From: Christopher Biscardi Date: Fri, 1 Sep 2023 10:16:35 -0700 Subject: [PATCH] perlin noise! --- Cargo.lock | 95 ++++++++++++++++++++++++++++++++++++---- Cargo.toml | 1 + examples/perlin-noise.rs | 49 +++++++++++++++++++++ src/textures.rs | 18 +++++++- 4 files changed, 154 insertions(+), 9 deletions(-) create mode 100644 examples/perlin-noise.rs diff --git a/Cargo.lock b/Cargo.lock index 9eec83d..a756c6b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -199,6 +199,17 @@ version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + [[package]] name = "getrandom" version = "0.2.10" @@ -208,7 +219,7 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] @@ -228,7 +239,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42218cb640844e3872cc3c153dc975229e080a6c4733b34709ef445610550226" dependencies = [ - "rand", + "rand 0.8.5", ] [[package]] @@ -374,7 +385,18 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" dependencies = [ - "getrandom", + "getrandom 0.2.10", +] + +[[package]] +name = "noise" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ba869e17168793186c10ca82c7079a4ffdeac4f1a7d9e755b9491c028180e40" +dependencies = [ + "num-traits", + "rand 0.7.3", + "rand_xorshift", ] [[package]] @@ -501,6 +523,19 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + [[package]] name = "rand" version = "0.8.5" @@ -508,8 +543,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", ] [[package]] @@ -519,7 +564,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", ] [[package]] @@ -528,7 +582,25 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.10", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_xorshift" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77d416b86801d23dde1aa643023b775c3a462efc0ed96443add11546cdf1dca8" +dependencies = [ + "rand_core 0.5.1", ] [[package]] @@ -561,7 +633,8 @@ dependencies = [ "image", "indicatif", "itertools", - "rand", + "noise", + "rand 0.8.5", "rayon", ] @@ -626,6 +699,12 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/Cargo.toml b/Cargo.toml index b53925d..99ceeb3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,5 +12,6 @@ glam = { version = "0.24.1", features = ["rand"] } image = "0.24.7" indicatif = { version = "0.17.6", features = ["rayon"] } itertools = "0.11.0" +noise = "0.8.2" rand = "0.8.5" rayon = "1.7.0" diff --git a/examples/perlin-noise.rs b/examples/perlin-noise.rs new file mode 100644 index 0000000..3092f6b --- /dev/null +++ b/examples/perlin-noise.rs @@ -0,0 +1,49 @@ +use glam::DVec3; +use noise::{NoiseFn, Perlin, Seedable}; +use raytracer::{ + camera::Camera, material::Material, + shapes::sphere::Sphere, textures::Texture, +}; +use std::io; + +fn main() -> io::Result<()> { + let mut world = vec![]; + + // let perlin = Perlin::new(1); + // let noise_texture = Texture::PerlinNoise(perlin, 10.); + + let perlin = Perlin::new(1); + let noise_texture = Texture::Turbulence(perlin); + + world.push(Sphere::new( + DVec3::new(0., -1000., 0.), + 1000., + Material::Lambertian { + albedo: noise_texture.clone(), + }, + )); + world.push(Sphere::new( + DVec3::new(0., 2., 0.), + 2., + Material::Lambertian { + albedo: noise_texture, + }, + )); + + let camera = Camera::init() + .image_width(800) + .aspect_ratio(16.0 / 9.0) + .look_from(DVec3::new(12., 2., 3.)) + .look_at(DVec3::ZERO) + .vup(DVec3::Y) + .focus_dist(10.0) + .defocus_angle(0.0) + .samples_per_pixel(100) + .max_depth(50) + .vfov(20.) + .build(); + + camera.render_to_disk("perlin-noise", world)?; + + Ok(()) +} diff --git a/src/textures.rs b/src/textures.rs index df36a6f..267eb1f 100644 --- a/src/textures.rs +++ b/src/textures.rs @@ -1,13 +1,16 @@ use std::{io, path::Path}; -use glam::DVec3; +use glam::{DVec3, Vec3Swizzles}; use image::{DynamicImage, GenericImageView}; +use noise::{NoiseFn, Perlin, Turbulence}; #[derive(Clone)] pub enum Texture { SolidColor(DVec3), Checkered { even: DVec3, odd: DVec3, scale: f64 }, Image(DynamicImage), + PerlinNoise(Perlin, f64), + Turbulence(Perlin), } impl Texture { pub fn load_image

(path: P) -> io::Result @@ -73,6 +76,19 @@ impl Texture { color_scale * pixel[2] as f64, ); } + Texture::PerlinNoise(noise, freq) => { + DVec3::ONE + * noise.get( + (point * *freq).xyz().to_array(), + ) + } + Texture::Turbulence(perlin) => { + let noise = + Turbulence::<_, Perlin>::new(perlin); + DVec3::ONE + * noise.get((point).xyz().to_array()) + + 1.0 / 2.0 + } } } }