void PerlinNoise_Impl::create_noise3d(PerlinNoise_PixelWriter &writer, float start_x, float end_x, float start_y, float end_y, float z_position) { float size_x = end_x - start_x; float size_y = end_y - start_y; float fheight = (float) height; float fwidth = (float) width; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { float result = 0.0f; float current_amplitude = amplitude; float value_x = start_x + (((float) x) * size_x) / fwidth; float value_y = start_y + (((float) y) * size_y) / fheight; float value_z = z_position; for( int i=0; i<octaves; i++ ) { result += current_amplitude * noise_3d(value_x, value_y, value_z); value_x *= 2.0f; value_y *= 2.0f; value_z *= 2.0f; current_amplitude *= 0.5f; } writer.write_pixel(result); } writer.line_end(); } }
void wrinkles::apply( Vector& p, surface_data& t ) { Vector result (0.0); Vector value; double scale = 1.0; int i; if( amount == 0.0 ) return; for( i = 0; i < 10; scale *= 2.0, i++ ) { value = noise_3d( p * scale ); result.x += fabs(value.x / scale); result.y += fabs(value.y / scale); result.z += fabs(value.z / scale); } t.n += result * amount; t.n = normalize( t.n ); }
static double smooth_noise(double x, double y, double z) { t_perlin p; s_n_integer(&p, x, y, z); p.fract.x = x - p.integer.x; p.fract.y = y - p.integer.y; p.fract.z = z - p.integer.z; p.a.y = noise_3d(p.integer.x, p.integer.y, p.integer.z); p.a.z = noise_3d(p.integer.x + 1, p.integer.y, p.integer.z); p.b.y = noise_3d(p.integer.x, p.integer.y + 1, p.integer.z); p.b.z = noise_3d(p.integer.x + 1, p.integer.y + 1, p.integer.z); p.c.y = noise_3d(p.integer.x, p.integer.y, p.integer.z + 1); p.c.z = noise_3d(p.integer.x + 1, p.integer.y, p.integer.z + 1); p.d.y = noise_3d(p.integer.x, p.integer.y + 1, p.integer.z + 1); p.d.z = noise_3d(p.integer.x + 1, p.integer.y + 1, p.integer.z + 1); p.a.x = cos_interpolate(p.a.y, p.a.z, p.fract.x); p.b.x = cos_interpolate(p.b.y, p.b.z, p.fract.x); p.c.x = cos_interpolate(p.c.y, p.c.z, p.fract.x); p.d.x = cos_interpolate(p.d.y, p.d.z, p.fract.x); p.v = cos_interpolate(p.a.x, p.b.x, p.fract.y); p.w = cos_interpolate(p.c.x, p.d.x, p.fract.y); return (cos_interpolate(p.v, p.w, p.fract.z)); }