[Bf-blender-cvs] [23564583a49] master: Shading: Extend Noise node to other dimenstions.

OmarSquircleArt noreply at git.blender.org
Wed Sep 4 18:00:09 CEST 2019


Commit: 23564583a4988778b4c43496fd21818b286f6ba1
Author: OmarSquircleArt
Date:   Wed Sep 4 17:54:32 2019 +0200
Branches: master
https://developer.blender.org/rB23564583a4988778b4c43496fd21818b286f6ba1

Shading: Extend Noise node to other dimenstions.

This patch extends perlin noise to operate in 1D, 2D, 3D, and 4D
space. The noise code has also been refactored to be more readable.

The Color output and distortion patterns changed, so this patch
breaks backward compatibility. This is due to the fact that we
now use random offsets as noise seeds, as opposed to swizzling
and constants offsets.

Reviewers: brecht, JacquesLucke

Differential Revision: https://developer.blender.org/D5560

===================================================================

M	intern/cycles/blender/blender_shader.cpp
M	intern/cycles/kernel/CMakeLists.txt
M	intern/cycles/kernel/shaders/CMakeLists.txt
M	intern/cycles/kernel/shaders/node_brick_texture.osl
M	intern/cycles/kernel/shaders/node_checker_texture.osl
M	intern/cycles/kernel/shaders/node_gradient_texture.osl
M	intern/cycles/kernel/shaders/node_ies_light.osl
M	intern/cycles/kernel/shaders/node_magic_texture.osl
M	intern/cycles/kernel/shaders/node_musgrave_texture.osl
A	intern/cycles/kernel/shaders/node_noise.h
M	intern/cycles/kernel/shaders/node_noise_texture.osl
D	intern/cycles/kernel/shaders/node_texture.h
M	intern/cycles/kernel/shaders/node_voronoi_texture.osl
M	intern/cycles/kernel/shaders/node_wave_texture.osl
A	intern/cycles/kernel/shaders/vector2.h
A	intern/cycles/kernel/shaders/vector4.h
M	intern/cycles/kernel/svm/svm.h
A	intern/cycles/kernel/svm/svm_fractal_noise.h
M	intern/cycles/kernel/svm/svm_musgrave.h
M	intern/cycles/kernel/svm/svm_noise.h
M	intern/cycles/kernel/svm/svm_noisetex.h
D	intern/cycles/kernel/svm/svm_texture.h
M	intern/cycles/kernel/svm/svm_wave.h
M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/nodes.h
M	intern/cycles/util/util_hash.h
M	intern/cycles/util/util_math.h
M	intern/cycles/util/util_ssef.h
M	intern/cycles/util/util_ssei.h
M	source/blender/blenloader/intern/versioning_cycles.c
M	source/blender/editors/space_node/drawnode.c
M	source/blender/gpu/shaders/material/gpu_shader_material_fractal_noise.glsl
M	source/blender/gpu/shaders/material/gpu_shader_material_noise.glsl
M	source/blender/gpu/shaders/material/gpu_shader_material_tex_noise.glsl
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/nodes/shader/nodes/node_shader_tex_noise.c

===================================================================

diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index ca51482c98e..e81336cd692 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -798,6 +798,7 @@ static ShaderNode *add_node(Scene *scene,
   else if (b_node.is_a(&RNA_ShaderNodeTexNoise)) {
     BL::ShaderNodeTexNoise b_noise_node(b_node);
     NoiseTextureNode *noise = new NoiseTextureNode();
+    noise->dimensions = b_noise_node.dimensions();
     BL::TexMapping b_texture_mapping(b_noise_node.texture_mapping());
     get_tex_mapping(&noise->tex_mapping, b_texture_mapping);
     node = noise;
diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt
index 48439a8b68f..89ecdc6b7ac 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -214,7 +214,7 @@ set(SRC_SVM_HEADERS
   svm/svm_sepcomb_vector.h
   svm/svm_sky.h
   svm/svm_tex_coord.h
-  svm/svm_texture.h
+  svm/svm_fractal_noise.h
   svm/svm_types.h
   svm/svm_value.h
   svm/svm_vector_transform.h
diff --git a/intern/cycles/kernel/shaders/CMakeLists.txt b/intern/cycles/kernel/shaders/CMakeLists.txt
index c50bffe27b2..a45c43e01ed 100644
--- a/intern/cycles/kernel/shaders/CMakeLists.txt
+++ b/intern/cycles/kernel/shaders/CMakeLists.txt
@@ -97,10 +97,12 @@ set(SRC_OSL
 set(SRC_OSL_HEADERS
   node_color.h
   node_fresnel.h
+  node_noise.h
   node_ramp_util.h
-  node_texture.h
   stdosl.h
   oslutil.h
+  vector2.h
+  vector4.h
 )
 
 set(SRC_OSO
diff --git a/intern/cycles/kernel/shaders/node_brick_texture.osl b/intern/cycles/kernel/shaders/node_brick_texture.osl
index 0abc3574c48..30644ef2ff3 100644
--- a/intern/cycles/kernel/shaders/node_brick_texture.osl
+++ b/intern/cycles/kernel/shaders/node_brick_texture.osl
@@ -15,7 +15,6 @@
  */
 
 #include "stdosl.h"
-#include "node_texture.h"
 
 /* Brick */
 
diff --git a/intern/cycles/kernel/shaders/node_checker_texture.osl b/intern/cycles/kernel/shaders/node_checker_texture.osl
index e068f7952ed..e05cf20099f 100644
--- a/intern/cycles/kernel/shaders/node_checker_texture.osl
+++ b/intern/cycles/kernel/shaders/node_checker_texture.osl
@@ -15,7 +15,6 @@
  */
 
 #include "stdosl.h"
-#include "node_texture.h"
 
 /* Checker */
 
diff --git a/intern/cycles/kernel/shaders/node_gradient_texture.osl b/intern/cycles/kernel/shaders/node_gradient_texture.osl
index 52bf466673d..5cc81d367f2 100644
--- a/intern/cycles/kernel/shaders/node_gradient_texture.osl
+++ b/intern/cycles/kernel/shaders/node_gradient_texture.osl
@@ -15,7 +15,6 @@
  */
 
 #include "stdosl.h"
-#include "node_texture.h"
 
 /* Gradient */
 
diff --git a/intern/cycles/kernel/shaders/node_ies_light.osl b/intern/cycles/kernel/shaders/node_ies_light.osl
index ce0173451da..6e9181cde40 100644
--- a/intern/cycles/kernel/shaders/node_ies_light.osl
+++ b/intern/cycles/kernel/shaders/node_ies_light.osl
@@ -15,7 +15,6 @@
  */
 
 #include "stdosl.h"
-#include "node_texture.h"
 
 /* IES Light */
 
diff --git a/intern/cycles/kernel/shaders/node_magic_texture.osl b/intern/cycles/kernel/shaders/node_magic_texture.osl
index aa700e575ef..26e7d57278b 100644
--- a/intern/cycles/kernel/shaders/node_magic_texture.osl
+++ b/intern/cycles/kernel/shaders/node_magic_texture.osl
@@ -15,7 +15,6 @@
  */
 
 #include "stdosl.h"
-#include "node_texture.h"
 
 /* Magic */
 
diff --git a/intern/cycles/kernel/shaders/node_musgrave_texture.osl b/intern/cycles/kernel/shaders/node_musgrave_texture.osl
index a7877c43d46..0bf462e2103 100644
--- a/intern/cycles/kernel/shaders/node_musgrave_texture.osl
+++ b/intern/cycles/kernel/shaders/node_musgrave_texture.osl
@@ -15,7 +15,7 @@
  */
 
 #include "stdosl.h"
-#include "node_texture.h"
+#include "node_noise.h"
 
 /* Musgrave fBm
  *
@@ -36,14 +36,14 @@ float noise_musgrave_fBm(point ip, float H, float lacunarity, float octaves)
   point p = ip;
 
   for (i = 0; i < (int)octaves; i++) {
-    value += safe_noise(p, "signed") * pwr;
+    value += safe_noise(p) * pwr;
     pwr *= pwHL;
     p *= lacunarity;
   }
 
   rmd = octaves - floor(octaves);
   if (rmd != 0.0)
-    value += rmd * safe_noise(p, "signed") * pwr;
+    value += rmd * safe_noise(p) * pwr;
 
   return value;
 }
@@ -65,14 +65,14 @@ float noise_musgrave_multi_fractal(point ip, float H, float lacunarity, float oc
   point p = ip;
 
   for (i = 0; i < (int)octaves; i++) {
-    value *= (pwr * safe_noise(p, "signed") + 1.0);
+    value *= (pwr * safe_noise(p) + 1.0);
     pwr *= pwHL;
     p *= lacunarity;
   }
 
   rmd = octaves - floor(octaves);
   if (rmd != 0.0)
-    value *= (rmd * pwr * safe_noise(p, "signed") + 1.0); /* correct? */
+    value *= (rmd * pwr * safe_noise(p) + 1.0); /* correct? */
 
   return value;
 }
@@ -95,11 +95,11 @@ float noise_musgrave_hetero_terrain(
   point p = ip;
 
   /* first unscaled octave of function; later octaves are scaled */
-  value = offset + safe_noise(p, "signed");
+  value = offset + safe_noise(p);
   p *= lacunarity;
 
   for (i = 1; i < (int)octaves; i++) {
-    increment = (safe_noise(p, "signed") + offset) * pwr * value;
+    increment = (safe_noise(p) + offset) * pwr * value;
     value += increment;
     pwr *= pwHL;
     p *= lacunarity;
@@ -107,7 +107,7 @@ float noise_musgrave_hetero_terrain(
 
   rmd = octaves - floor(octaves);
   if (rmd != 0.0) {
-    increment = (safe_noise(p, "signed") + offset) * pwr * value;
+    increment = (safe_noise(p) + offset) * pwr * value;
     value += rmd * increment;
   }
 
@@ -131,7 +131,7 @@ float noise_musgrave_hybrid_multi_fractal(
   int i;
   point p = ip;
 
-  result = safe_noise(p, "signed") + offset;
+  result = safe_noise(p) + offset;
   weight = gain * result;
   p *= lacunarity;
 
@@ -139,7 +139,7 @@ float noise_musgrave_hybrid_multi_fractal(
     if (weight > 1.0)
       weight = 1.0;
 
-    signal = (safe_noise(p, "signed") + offset) * pwr;
+    signal = (safe_noise(p) + offset) * pwr;
     pwr *= pwHL;
     result += weight * signal;
     weight *= gain * signal;
@@ -148,7 +148,7 @@ float noise_musgrave_hybrid_multi_fractal(
 
   rmd = octaves - floor(octaves);
   if (rmd != 0.0)
-    result += rmd * ((safe_noise(p, "signed") + offset) * pwr);
+    result += rmd * ((safe_noise(p) + offset) * pwr);
 
   return result;
 }
@@ -170,7 +170,7 @@ float noise_musgrave_ridged_multi_fractal(
   int i;
   point p = ip;
 
-  signal = offset - fabs(safe_noise(p, "signed"));
+  signal = offset - fabs(safe_noise(p));
   signal *= signal;
   result = signal;
   weight = 1.0;
@@ -178,7 +178,7 @@ float noise_musgrave_ridged_multi_fractal(
   for (i = 1; i < (int)octaves; i++) {
     p *= lacunarity;
     weight = clamp(signal * gain, 0.0, 1.0);
-    signal = offset - fabs(safe_noise(p, "signed"));
+    signal = offset - fabs(safe_noise(p));
     signal *= signal;
     signal *= weight;
     result += signal * pwr;
diff --git a/intern/cycles/kernel/shaders/node_noise.h b/intern/cycles/kernel/shaders/node_noise.h
new file mode 100644
index 00000000000..23d1987a00e
--- /dev/null
+++ b/intern/cycles/kernel/shaders/node_noise.h
@@ -0,0 +1,198 @@
+/*
+ * Copyright 2011-2013 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "vector2.h"
+#include "vector4.h"
+
+#define vector3 point
+
+float safe_noise(float p)
+{
+  float f = noise("noise", p);
+  if (isinf(f))
+    return 0.5;
+  return f;
+}
+
+float safe_noise(vector2 p)
+{
+  float f = noise("noise", p.x, p.y);
+  if (isinf(f))
+    return 0.5;
+  return f;
+}
+
+float safe_noise(vector3 p)
+{
+  float f = noise("noise", p);
+  if (isinf(f))
+    return 0.5;
+  return f;
+}
+
+float safe_noise(vector4 p)
+{
+  float f = noise("noise", vector3(p.x, p.y, p.z), p.w);
+  if (isinf(f))
+    return 0.5;
+  return f;
+}
+
+float safe_snoise(float p)
+{
+  float f = noise("snoise", p);
+  if (isinf(f))
+    return 0.0;
+  return f;
+}
+
+float safe_snoise(vector2 p)
+{
+  float f = noise("snoise", p.x, p.y);
+  if (isinf(f))
+    return 0.0;
+  return f;
+}
+
+float safe_snoise(vector3 p)
+{
+  float f = noise("snoise", p);
+  if (isinf(f))
+    return 0.0;
+  return f;
+}
+
+float safe_snoise(vector4 p)
+{
+  float f = noise("snoise", vector3(p.x, p.y, p.z), p.w);
+  if (isinf(f))
+    return 0.0;
+  return f;
+}
+
+/* The fractal_noise functions are all exactly the same except for the input type. */
+float fractal_noise(float p, float details)
+{
+  float fscale = 1.0;
+  float amp = 1.0;
+  float sum = 0.0;
+  float octaves = clamp(details, 0.0, 16.0);
+  int n = (int)octaves;
+  for (int i = 0; i <= n; i++) {
+    float t = safe_noise(fscale * p);
+    sum += t * amp;
+    amp *= 0.5;
+    fscale *= 2.0;
+  }
+  float rmd = octaves - floor(octaves);
+  if (rmd != 0.0) {
+    float t = safe_noise(fscale * p);
+    float sum2 = sum + t * amp;
+    sum *= ((float)(1 << n) / (float)((1 << (n + 1)) - 1));
+    sum2 *= ((float)(1 << (n + 1)) / (float)((1 << (n + 2)) - 1));
+    return (1.0 - rmd) * sum + rmd * sum2;
+  }
+  else {
+    sum *= ((float)(1 << n) / (float)((1 << (n + 1)) - 1));
+    return sum;
+  }
+}
+
+/* The fractal_noise functions are all exactly the same except for the input type. */
+float fractal_noise(vector2 p, float details)
+{
+  float fscale = 1.0;
+  float amp = 1.0;
+  float sum = 0.0;
+  float octaves = clamp(details, 0.0, 16.0);
+  int n = (int)octaves;
+  for (int i = 0; i <= n; i++) {
+    float t = safe_noise(fscale * p);
+    sum += t * amp;
+    amp *= 0.5;
+    fscale *= 2.0;
+  }
+  float rmd = octaves - floor(octaves);
+  if (rmd != 0.0) {
+    float t = safe_noise(fscale * p);
+    float sum2 = sum + t * amp;
+    sum *= ((float)(1 << n) / (float)((1 << (n + 1)) - 1));
+    sum2 *= ((float)(1 << (n + 1)) / (float)((1

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list