Files
test/intern/cycles/kernel/osl/shaders/node_wave_texture.osl
Hoshinova 0702c24a36 Nodes: Add Lacunarity and Normalize inputs to Noise node
This PR adds the Lacunarity and Normalize inputs to the Noise node
similar to the Voronoi node.

The Lacunarity input controls the scale factor by which each
successive Perlin noise octave is scaled. Which was previously hard
coded to a factor of 2.

The Noise node normalizes its output to the [0, 1] range by default.
The Normalize option makes it possible for the user to disable that.
To keep the behavior consistent with past versions it is enabled by
default.

To make the aforementioned normalization control easer to implement,
the fractal noise code now accumulates signed noise and remaps the
final sum, as opposed to accumulating positive [0, 1] noise.

Pull Request: https://projects.blender.org/blender/blender/pulls/110839
2023-08-15 17:38:45 +02:00

108 lines
2.7 KiB
Plaintext

/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
*
* SPDX-License-Identifier: Apache-2.0 */
#include "node_noise.h"
#include "stdcycles.h"
/* Wave */
float wave(point p_input,
string type,
string bands_direction,
string rings_direction,
string profile,
float distortion,
float detail,
float dscale,
float droughness,
float phase)
{
/* Prevent precision issues on unit coordinates. */
point p = (p_input + 0.000001) * 0.999999;
float n = 0.0;
if (type == "bands") {
if (bands_direction == "x") {
n = p[0] * 20.0;
}
else if (bands_direction == "y") {
n = p[1] * 20.0;
}
else if (bands_direction == "z") {
n = p[2] * 20.0;
}
else { /* diagonal */
n = (p[0] + p[1] + p[2]) * 10.0;
}
}
else if (type == "rings") {
point rp = p;
if (rings_direction == "x") {
rp *= point(0.0, 1.0, 1.0);
}
else if (rings_direction == "y") {
rp *= point(1.0, 0.0, 1.0);
}
else if (rings_direction == "z") {
rp *= point(1.0, 1.0, 0.0);
}
/* else: "spherical" */
n = length(rp) * 20.0;
}
n += phase;
if (distortion != 0.0) {
n = n + (distortion * (fractal_noise(p * dscale, detail, droughness, 2.0, 1) * 2.0 - 1.0));
}
if (profile == "sine") {
return 0.5 + 0.5 * sin(n - M_PI_2);
}
else if (profile == "saw") {
n /= M_2PI;
return n - floor(n);
}
else { /* profile tri */
n /= M_2PI;
return abs(n - floor(n + 0.5)) * 2.0;
}
}
shader node_wave_texture(int use_mapping = 0,
matrix mapping = matrix(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
string wave_type = "bands",
string bands_direction = "x",
string rings_direction = "x",
string profile = "sine",
float Scale = 5.0,
float Distortion = 0.0,
float Detail = 2.0,
float DetailScale = 1.0,
float DetailRoughness = 0.5,
float PhaseOffset = 0.0,
point Vector = P,
output float Fac = 0.0,
output color Color = 0.0)
{
point p = Vector;
if (use_mapping)
p = transform(mapping, p);
Fac = wave(p * Scale,
wave_type,
bands_direction,
rings_direction,
profile,
Distortion,
Detail,
DetailScale,
DetailRoughness,
PhaseOffset);
Color = Fac;
}