Add turbulence
This commit is contained in:
parent
d5d24cee03
commit
0e72e21f92
@ -9,8 +9,6 @@ pub struct NoiseTexture {
|
|||||||
|
|
||||||
impl Texture for NoiseTexture {
|
impl Texture for NoiseTexture {
|
||||||
fn value(&self, _u: f64, _v: f64, point: &Point3) -> Color {
|
fn value(&self, _u: f64, _v: f64, point: &Point3) -> Color {
|
||||||
Color::new(1.0, 1.0, 1.0)
|
Color::new(1.0, 1.0, 1.0) * self.noise.default_turbulence(&(*point * self.scale))
|
||||||
* 0.5
|
|
||||||
* (1.0 + self.noise.noise(&(*point * self.scale)))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,22 @@ impl Perlin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn default_turbulence(&self, point: &Point3) -> f64 {
|
||||||
|
self.turbulence(point, 7)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn turbulence(&self, point: &Point3, depth: i32) -> f64 {
|
||||||
|
let mut accum = 0.0;
|
||||||
|
let mut temp_p = point.clone();
|
||||||
|
let mut weight = 1.0;
|
||||||
|
for _i in 0..depth {
|
||||||
|
accum += weight * self.noise(&temp_p);
|
||||||
|
weight *= 0.5;
|
||||||
|
temp_p *= 2.0;
|
||||||
|
}
|
||||||
|
accum.abs()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn noise(&self, point: &Point3) -> f64 {
|
pub fn noise(&self, point: &Point3) -> f64 {
|
||||||
let u = point.x() - point.x().floor();
|
let u = point.x() - point.x().floor();
|
||||||
let v = point.y() - point.y().floor();
|
let v = point.y() - point.y().floor();
|
||||||
|
28
src/vec3.rs
28
src/vec3.rs
@ -1,5 +1,5 @@
|
|||||||
use std::fmt::{Display, Formatter};
|
use std::fmt::{Display, Formatter};
|
||||||
use std::ops::{Add, AddAssign, Div, Mul, Neg, Sub, Index};
|
use std::ops::{Add, AddAssign, Div, Mul, Neg, Sub, Index, MulAssign};
|
||||||
use rand::distributions::{Distribution, Uniform};
|
use rand::distributions::{Distribution, Uniform};
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
@ -228,6 +228,32 @@ impl Mul<Vec3> for f64 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mul<f64> for &Vec3 {
|
||||||
|
type Output = Vec3;
|
||||||
|
|
||||||
|
fn mul(self, other: f64) -> Vec3 {
|
||||||
|
Vec3 {
|
||||||
|
x: self.x * other,
|
||||||
|
y: self.y * other,
|
||||||
|
z: self.z * other,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Mul<&Vec3> for f64 {
|
||||||
|
type Output = Vec3;
|
||||||
|
|
||||||
|
fn mul(self, other: &Vec3) -> Vec3 {
|
||||||
|
other * self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MulAssign<f64> for Vec3 {
|
||||||
|
fn mul_assign(&mut self, rhs: f64) {
|
||||||
|
*self = *self * rhs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Div<Vec3> for Vec3 {
|
impl Div<Vec3> for Vec3 {
|
||||||
type Output = Vec3;
|
type Output = Vec3;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user