forked from LeenkxTeam/LNXSDK
Group Nodes, Shaders, Textures, Displacement
This commit is contained in:
@ -1966,107 +1966,110 @@ float snoise(vec4 p) {
|
||||
p = compatible_mod(p, 100000.0) + precision_correction;
|
||||
return 0.8344 * noise_perlin(p);
|
||||
}
|
||||
"""
|
||||
|
||||
#define DEFINE_NOISE_FRACTAL(T) \\\
|
||||
float noise_fbm(T co, float detail, float roughness, float lacunarity, float offset, float gain, bool normalize) { \\\
|
||||
T p = co; \\\
|
||||
float fscale = 1.0; \\\
|
||||
float amp = 1.0; \\\
|
||||
float maxamp = 0.0; \\\
|
||||
float sum = 0.0; \\\
|
||||
for (int i = 0; i <= int(detail); i++) { \\\
|
||||
float t = snoise(fscale * p); \\\
|
||||
sum += t * amp; \\\
|
||||
maxamp += amp; \\\
|
||||
amp *= roughness; \\\
|
||||
fscale *= lacunarity; \\\
|
||||
} \\\
|
||||
float rmd = detail - floor(detail); \\\
|
||||
if (rmd != 0.0) { \\\
|
||||
float t = snoise(fscale * p); \\\
|
||||
float sum2 = sum + t * amp; \\\
|
||||
return normalize ? mix(0.5 * sum / maxamp + 0.5, 0.5 * sum2 / (maxamp + amp) + 0.5, rmd) : mix(sum, sum2, rmd); \\\
|
||||
} else { \\\
|
||||
return normalize ? 0.5 * sum / maxamp + 0.5 : sum; \\\
|
||||
} \\\
|
||||
} \\\
|
||||
float noise_multi_fractal(T co, float detail, float roughness, float lacunarity, float offset, float gain, bool normalize) { \\\
|
||||
T p = co; \\\
|
||||
float value = 1.0; \\\
|
||||
float pwr = 1.0; \\\
|
||||
for (int i = 0; i <= int(detail); i++) { \\\
|
||||
value *= (pwr * snoise(p) + 1.0); \\\
|
||||
pwr *= roughness; \\\
|
||||
p *= lacunarity; \\\
|
||||
} \\\
|
||||
float rmd = detail - floor(detail); \\\
|
||||
if (rmd != 0.0) { \\\
|
||||
value *= (rmd * pwr * snoise(p) + 1.0); \\\
|
||||
} \\\
|
||||
return value; \\\
|
||||
} \\\
|
||||
float noise_hetero_terrain(T co, float detail, float roughness, float lacunarity, float offset, float gain, bool normalize) { \\\
|
||||
T p = co; \\\
|
||||
float pwr = roughness; \\\
|
||||
float value = offset + snoise(p); \\\
|
||||
p *= lacunarity; \\\
|
||||
for (int i = 1; i <= int(detail); i++) { \\\
|
||||
float increment = (snoise(p) + offset) * pwr * value; \\\
|
||||
value += increment; \\\
|
||||
pwr *= roughness; \\\
|
||||
p *= lacunarity; \\\
|
||||
} \\\
|
||||
float rmd = detail - floor(detail); \\\
|
||||
if (rmd != 0.0) { \\\
|
||||
float increment = (snoise(p) + offset) * pwr * value; \\\
|
||||
value += rmd * increment; \\\
|
||||
} \\\
|
||||
return value; \\\
|
||||
} \\\
|
||||
float noise_hybrid_multi_fractal(T co, float detail, float roughness, float lacunarity, float offset, float gain, bool normalize) { \\\
|
||||
T p = co; \\\
|
||||
float pwr = 1.0; \\\
|
||||
float value = 0.0; \\\
|
||||
float weight = 1.0; \\\
|
||||
for (int i = 0; (weight > 0.001) && (i <= int(detail)); i++) { \\\
|
||||
if (weight > 1.0) weight = 1.0; \\\
|
||||
float signal = (snoise(p) + offset) * pwr; \\\
|
||||
pwr *= roughness; \\\
|
||||
value += weight * signal; \\\
|
||||
weight *= gain * signal; \\\
|
||||
p *= lacunarity; \\\
|
||||
} \\\
|
||||
float rmd = detail - floor(detail); \\\
|
||||
if ((rmd != 0.0) && (weight > 0.001)) { \\\
|
||||
if (weight > 1.0) weight = 1.0; \\\
|
||||
float signal = (snoise(p) + offset) * pwr; \\\
|
||||
value += rmd * weight * signal; \\\
|
||||
} \\\
|
||||
return value; \\\
|
||||
} \\\
|
||||
float noise_ridged_multi_fractal(T co, float detail, float roughness, float lacunarity, float offset, float gain, bool normalize) { \\\
|
||||
T p = co; \\\
|
||||
float pwr = roughness; \\\
|
||||
float signal = offset - abs(snoise(p)); \\\
|
||||
signal *= signal; \\\
|
||||
float value = signal; \\\
|
||||
float weight = 1.0; \\\
|
||||
for (int i = 1; i <= int(detail); i++) { \\\
|
||||
p *= lacunarity; \\\
|
||||
weight = clamp(signal * gain, 0.0, 1.0); \\\
|
||||
signal = offset - abs(snoise(p)); \\\
|
||||
signal *= signal; \\\
|
||||
signal *= weight; \\\
|
||||
value += signal * pwr; \\\
|
||||
pwr *= roughness; \\\
|
||||
} \\\
|
||||
return value; \\\
|
||||
}
|
||||
# Fractal noise variants, emitted on demand per coordinate type.
|
||||
# @T@ is replaced by the coordinate type (float/vec2/vec3/vec4).
|
||||
str_tex_noise_fbm = """float noise_fbm(@T@ co, float detail, float roughness, float lacunarity, float offset, float gain, bool normalize) {
|
||||
@T@ p = co;
|
||||
float fscale = 1.0;
|
||||
float amp = 1.0;
|
||||
float maxamp = 0.0;
|
||||
float sum = 0.0;
|
||||
for (int i = 0; i <= int(detail); i++) {
|
||||
float t = snoise(fscale * p);
|
||||
sum += t * amp;
|
||||
maxamp += amp;
|
||||
amp *= roughness;
|
||||
fscale *= lacunarity;
|
||||
}
|
||||
float rmd = detail - floor(detail);
|
||||
if (rmd != 0.0) {
|
||||
float t = snoise(fscale * p);
|
||||
float sum2 = sum + t * amp;
|
||||
return normalize ? mix(0.5 * sum / maxamp + 0.5, 0.5 * sum2 / (maxamp + amp) + 0.5, rmd) : mix(sum, sum2, rmd);
|
||||
} else {
|
||||
return normalize ? 0.5 * sum / maxamp + 0.5 : sum;
|
||||
}
|
||||
}"""
|
||||
|
||||
DEFINE_NOISE_FRACTAL(float)
|
||||
DEFINE_NOISE_FRACTAL(vec2)
|
||||
DEFINE_NOISE_FRACTAL(vec3)
|
||||
DEFINE_NOISE_FRACTAL(vec4)
|
||||
str_tex_noise_multi_fractal = """float noise_multi_fractal(@T@ co, float detail, float roughness, float lacunarity, float offset, float gain, bool normalize) {
|
||||
@T@ p = co;
|
||||
float value = 1.0;
|
||||
float pwr = 1.0;
|
||||
for (int i = 0; i <= int(detail); i++) {
|
||||
value *= (pwr * snoise(p) + 1.0);
|
||||
pwr *= roughness;
|
||||
p *= lacunarity;
|
||||
}
|
||||
float rmd = detail - floor(detail);
|
||||
if (rmd != 0.0) {
|
||||
value *= (rmd * pwr * snoise(p) + 1.0);
|
||||
}
|
||||
return value;
|
||||
}"""
|
||||
|
||||
str_tex_noise_hetero_terrain = """float noise_hetero_terrain(@T@ co, float detail, float roughness, float lacunarity, float offset, float gain, bool normalize) {
|
||||
@T@ p = co;
|
||||
float pwr = roughness;
|
||||
float value = offset + snoise(p);
|
||||
p *= lacunarity;
|
||||
for (int i = 1; i <= int(detail); i++) {
|
||||
float increment = (snoise(p) + offset) * pwr * value;
|
||||
value += increment;
|
||||
pwr *= roughness;
|
||||
p *= lacunarity;
|
||||
}
|
||||
float rmd = detail - floor(detail);
|
||||
if (rmd != 0.0) {
|
||||
float increment = (snoise(p) + offset) * pwr * value;
|
||||
value += rmd * increment;
|
||||
}
|
||||
return value;
|
||||
}"""
|
||||
|
||||
str_tex_noise_hybrid_multi_fractal = """float noise_hybrid_multi_fractal(@T@ co, float detail, float roughness, float lacunarity, float offset, float gain, bool normalize) {
|
||||
@T@ p = co;
|
||||
float pwr = 1.0;
|
||||
float value = 0.0;
|
||||
float weight = 1.0;
|
||||
for (int i = 0; (weight > 0.001) && (i <= int(detail)); i++) {
|
||||
if (weight > 1.0) weight = 1.0;
|
||||
float signal = (snoise(p) + offset) * pwr;
|
||||
pwr *= roughness;
|
||||
value += weight * signal;
|
||||
weight *= gain * signal;
|
||||
p *= lacunarity;
|
||||
}
|
||||
float rmd = detail - floor(detail);
|
||||
if ((rmd != 0.0) && (weight > 0.001)) {
|
||||
if (weight > 1.0) weight = 1.0;
|
||||
float signal = (snoise(p) + offset) * pwr;
|
||||
value += rmd * weight * signal;
|
||||
}
|
||||
return value;
|
||||
}"""
|
||||
|
||||
str_tex_noise_ridged_multi_fractal = """float noise_ridged_multi_fractal(@T@ co, float detail, float roughness, float lacunarity, float offset, float gain, bool normalize) {
|
||||
@T@ p = co;
|
||||
float pwr = roughness;
|
||||
float signal = offset - abs(snoise(p));
|
||||
signal *= signal;
|
||||
float value = signal;
|
||||
float weight = 1.0;
|
||||
for (int i = 1; i <= int(detail); i++) {
|
||||
p *= lacunarity;
|
||||
weight = clamp(signal * gain, 0.0, 1.0);
|
||||
signal = offset - abs(snoise(p));
|
||||
signal *= signal;
|
||||
signal *= weight;
|
||||
value += signal * pwr;
|
||||
pwr *= roughness;
|
||||
}
|
||||
return value;
|
||||
}"""
|
||||
|
||||
str_tex_noise += """
|
||||
|
||||
float random_float_offset(float seed) { return 100.0 + hash_float_to_float(seed) * 100.0; }
|
||||
vec2 random_vec2_offset(float seed) { return vec2(100.0 + hash_vec2_to_float(vec2(seed, 0.0)) * 100.0, 100.0 + hash_vec2_to_float(vec2(seed, 1.0)) * 100.0); }
|
||||
@ -2193,6 +2196,43 @@ vec3 hue_sat(const vec3 col, const vec4 shift) {
|
||||
}
|
||||
"""
|
||||
|
||||
str_mix_hsv = """
|
||||
vec3 mix_hue(const float fac, const vec3 col1, const vec3 col2) {
|
||||
vec3 hsv2 = rgb_to_hsv(col2);
|
||||
if (hsv2.y != 0.0) {
|
||||
vec3 hsv = rgb_to_hsv(col1);
|
||||
hsv.x = hsv2.x;
|
||||
return mix(col1, hsv_to_rgb(hsv), fac);
|
||||
}
|
||||
return col1;
|
||||
}
|
||||
vec3 mix_sat(const float fac, const vec3 col1, const vec3 col2) {
|
||||
vec3 hsv = rgb_to_hsv(col1);
|
||||
if (hsv.y != 0.0) {
|
||||
vec3 hsv2 = rgb_to_hsv(col2);
|
||||
hsv.y = mix(hsv.y, hsv2.y, fac);
|
||||
return hsv_to_rgb(hsv);
|
||||
}
|
||||
return col1;
|
||||
}
|
||||
vec3 mix_val(const float fac, const vec3 col1, const vec3 col2) {
|
||||
vec3 hsv = rgb_to_hsv(col1);
|
||||
vec3 hsv2 = rgb_to_hsv(col2);
|
||||
hsv.z = mix(hsv.z, hsv2.z, fac);
|
||||
return hsv_to_rgb(hsv);
|
||||
}
|
||||
vec3 mix_color(const float fac, const vec3 col1, const vec3 col2) {
|
||||
vec3 hsv2 = rgb_to_hsv(col2);
|
||||
if (hsv2.y != 0.0) {
|
||||
vec3 hsv = rgb_to_hsv(col1);
|
||||
hsv.x = hsv2.x;
|
||||
hsv.y = hsv2.y;
|
||||
return mix(col1, hsv_to_rgb(hsv), fac);
|
||||
}
|
||||
return col1;
|
||||
}
|
||||
"""
|
||||
|
||||
# https://twitter.com/Donzanoid/status/903424376707657730
|
||||
str_wavelength_to_rgb = """
|
||||
vec3 wavelength_to_rgb(const float t) {
|
||||
|
||||
Reference in New Issue
Block a user