[Bf-blender-cvs] [4fc03dd96b8] temp-geometry-nodes-expandable-geometry-socket-prototype: add noise node

Jacques Lucke noreply at git.blender.org
Wed Aug 4 17:24:26 CEST 2021


Commit: 4fc03dd96b8ec930f8c9d602d0e169eda16bc873
Author: Jacques Lucke
Date:   Wed Aug 4 17:22:49 2021 +0200
Branches: temp-geometry-nodes-expandable-geometry-socket-prototype
https://developer.blender.org/rB4fc03dd96b8ec930f8c9d602d0e169eda16bc873

add noise node

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

M	release/scripts/startup/nodeitems_builtins.py
M	source/blender/nodes/CMakeLists.txt
R056	source/blender/nodes/shader/nodes/node_shader_tex_noise.c	source/blender/nodes/shader/nodes/node_shader_tex_noise.cc

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

diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 05db6e42396..773590bd777 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -582,6 +582,7 @@ geometry_node_categories = [
         NodeItem("FunctionNodeFloatCompare"),
         NodeItem("FunctionNodeFloatToInt"),
         NodeItem("GeometryNodeSwitch"),
+        NodeItem("ShaderNodeTexNoise"),
     ]),
     GeometryNodeCategory("GEO_VECTOR", "Vector", items=[
         NodeItem("ShaderNodeVectorCurve"),
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index 7d5b7872d31..da89c1ec6e8 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -289,7 +289,7 @@ set(SRC
   shader/nodes/node_shader_tex_image.c
   shader/nodes/node_shader_tex_magic.c
   shader/nodes/node_shader_tex_musgrave.c
-  shader/nodes/node_shader_tex_noise.c
+  shader/nodes/node_shader_tex_noise.cc
   shader/nodes/node_shader_tex_pointdensity.c
   shader/nodes/node_shader_tex_sky.c
   shader/nodes/node_shader_tex_voronoi.c
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_noise.c b/source/blender/nodes/shader/nodes/node_shader_tex_noise.cc
similarity index 56%
rename from source/blender/nodes/shader/nodes/node_shader_tex_noise.c
rename to source/blender/nodes/shader/nodes/node_shader_tex_noise.cc
index 7b67c2d1f2e..a4048066dbf 100644
--- a/source/blender/nodes/shader/nodes/node_shader_tex_noise.c
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_noise.cc
@@ -17,6 +17,8 @@
  * All rights reserved.
  */
 
+#include "BLI_noise.h"
+
 #include "../node_shader_util.h"
 
 /* **************** NOISE ******************** */
@@ -48,7 +50,7 @@ static bNodeSocketTemplate sh_node_tex_noise_out[] = {
 
 static void node_shader_init_tex_noise(bNodeTree *UNUSED(ntree), bNode *node)
 {
-  NodeTexNoise *tex = MEM_callocN(sizeof(NodeTexNoise), "NodeTexNoise");
+  NodeTexNoise *tex = (NodeTexNoise *)MEM_callocN(sizeof(NodeTexNoise), "NodeTexNoise");
   BKE_texture_mapping_default(&tex->base.tex_mapping, TEXMAP_TYPE_POINT);
   BKE_texture_colormapping_default(&tex->base.color_mapping);
   tex->dimensions = 3;
@@ -86,18 +88,82 @@ static void node_shader_update_tex_noise(bNodeTree *UNUSED(ntree), bNode *node)
   nodeSetSocketAvailability(sockW, tex->dimensions == 1 || tex->dimensions == 4);
 }
 
+class NoiseTextureFunction : public blender::fn::MultiFunction {
+ public:
+  NoiseTextureFunction()
+  {
+    static blender::fn::MFSignature signature = create_signature();
+    this->set_signature(&signature);
+  }
+
+  static blender::fn::MFSignature create_signature()
+  {
+    blender::fn::MFSignatureBuilder signature{"Noise Texture"};
+    signature.single_input<blender::float3>("Vector");
+    signature.single_input<float>("Scale");
+    signature.single_input<float>("Detail");
+    signature.single_input<float>("Roughness");
+    signature.single_input<float>("Distortion");
+    signature.single_output<float>("Fac");
+    signature.single_output<blender::ColorGeometry4f>("Color");
+    return signature.build();
+  }
+
+  void call(blender::IndexMask mask,
+            blender::fn::MFParams params,
+            blender::fn::MFContext UNUSED(context)) const override
+  {
+    const blender::VArray<blender::float3> &vectors =
+        params.readonly_single_input<blender::float3>(0, "Vector");
+    const blender::VArray<float> &scales = params.readonly_single_input<float>(1, "Scale");
+    const blender::VArray<float> &details = params.readonly_single_input<float>(2, "Detail");
+
+    blender::MutableSpan<float> r_values = params.uninitialized_single_output<float>(5, "Fac");
+    blender::MutableSpan<blender::ColorGeometry4f> r_colors =
+        params.uninitialized_single_output<blender::ColorGeometry4f>(6, "Color");
+
+    for (int i : mask) {
+      const blender::float3 vector = vectors[i];
+      const float scale = scales[i];
+      const float noise_size = safe_divide(1.0f, scale);
+      const float detail = details[i];
+      const float noise1 = BLI_noise_generic_turbulence(
+          noise_size, vector.x, vector.y, vector.z, detail, false, 1);
+      const float noise2 = BLI_noise_generic_turbulence(
+          noise_size, vector.y, vector.x + 100.0f, vector.z, detail, false, 1);
+      const float noise3 = BLI_noise_generic_turbulence(
+          noise_size, vector.z + 100.0f, vector.y, vector.x, detail, false, 1);
+      r_values[i] = noise1;
+      r_colors[i] = {noise1, noise2, noise3, 1.0f};
+    }
+  }
+};
+
+static void sh_node_tex_noise_expand_in_mf_network(blender::nodes::NodeMFNetworkBuilder &builder)
+{
+  /* TODO: Not only support 3D. */
+  NodeTexNoise *tex = builder.dnode()->storage<NodeTexNoise>();
+  if (tex->dimensions != 3) {
+    builder.set_not_implemented();
+    return;
+  }
+  static NoiseTextureFunction fn;
+  builder.set_matching_fn(fn);
+}
+
 /* node type definition */
 void register_node_type_sh_tex_noise(void)
 {
   static bNodeType ntype;
 
-  sh_node_type_base(&ntype, SH_NODE_TEX_NOISE, "Noise Texture", NODE_CLASS_TEXTURE, 0);
+  sh_fn_node_type_base(&ntype, SH_NODE_TEX_NOISE, "Noise Texture", NODE_CLASS_TEXTURE, 0);
   node_type_socket_templates(&ntype, sh_node_tex_noise_in, sh_node_tex_noise_out);
   node_type_init(&ntype, node_shader_init_tex_noise);
   node_type_storage(
       &ntype, "NodeTexNoise", node_free_standard_storage, node_copy_standard_storage);
   node_type_gpu(&ntype, node_shader_gpu_tex_noise);
   node_type_update(&ntype, node_shader_update_tex_noise);
+  ntype.expand_in_mf_network = sh_node_tex_noise_expand_in_mf_network;
 
   nodeRegisterType(&ntype);
 }



More information about the Bf-blender-cvs mailing list