[Bf-blender-cvs] [9d216ef72b8] temp-geometry-nodes-delete-geometry-image-texture: Geometry Nodes: Add Image texture node (WIP)

Charlie Jolly noreply at git.blender.org
Wed Oct 6 18:04:48 CEST 2021


Commit: 9d216ef72b84e96ced1afac4f2991f1d5a918f5a
Author: Charlie Jolly
Date:   Wed Oct 6 10:55:26 2021 +0200
Branches: temp-geometry-nodes-delete-geometry-image-texture
https://developer.blender.org/rB9d216ef72b84e96ced1afac4f2991f1d5a918f5a

Geometry Nodes: Add Image texture node (WIP)

Port shader image texture node

**Core devs: Please take over if you want to.**

{F10797876}

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

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

M	release/datafiles/locale
M	release/scripts/addons
M	release/scripts/addons_contrib
M	release/scripts/startup/nodeitems_builtins.py
M	source/blender/modifiers/intern/MOD_nodes_evaluator.cc
M	source/blender/nodes/CMakeLists.txt
R050	source/blender/nodes/shader/nodes/node_shader_tex_image.c	source/blender/nodes/shader/nodes/node_shader_tex_image.cc
M	source/tools

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

diff --git a/release/datafiles/locale b/release/datafiles/locale
index 4833954c0ac..3d01b77226f 160000
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@ -1 +1 @@
-Subproject commit 4833954c0ac85cc407e1d5a153aa11b1d1823ec0
+Subproject commit 3d01b77226fcd99024ffaa0c12a6c14f22914d9f
diff --git a/release/scripts/addons b/release/scripts/addons
index f86f25e6221..1f38515d87f 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit f86f25e62217264495d05f116ccb09d575fe9841
+Subproject commit 1f38515d87fb78443f2ead17b4e95411f43dc1b2
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
index 5a82baad9f9..42da56aa737 160000
--- a/release/scripts/addons_contrib
+++ b/release/scripts/addons_contrib
@@ -1 +1 @@
-Subproject commit 5a82baad9f986722104280e8354a4427d8e9eab1
+Subproject commit 42da56aa73726710107031787af5eea186797984
diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 923ea22e1e3..fab57a85823 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -633,6 +633,7 @@ geometry_node_categories = [
     ]),
     GeometryNodeCategory("GEO_TEXTURE", "Texture", items=[
         NodeItem("ShaderNodeTexNoise"),
+        NodeItem("ShaderNodeTexImage"),
     ]),
     GeometryNodeCategory("GEO_VECTOR", "Vector", items=[
         NodeItem("ShaderNodeVectorCurve"),
diff --git a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
index c5213dc304b..c69096759ab 100644
--- a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
+++ b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
@@ -331,6 +331,7 @@ static void get_socket_value(const SocketRef &socket, void *r_value)
     if (bsocket.type == SOCK_VECTOR) {
       if (ELEM(bnode.type,
                GEO_NODE_SET_POSITION,
+               SH_NODE_TEX_IMAGE,
                SH_NODE_TEX_NOISE,
                GEO_NODE_MESH_TO_POINTS,
                GEO_NODE_PROXIMITY)) {
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index dab7579d946..7e355310b62 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -324,7 +324,7 @@ set(SRC
   shader/nodes/node_shader_tex_coord.c
   shader/nodes/node_shader_tex_environment.c
   shader/nodes/node_shader_tex_gradient.cc
-  shader/nodes/node_shader_tex_image.c
+  shader/nodes/node_shader_tex_image.cc
   shader/nodes/node_shader_tex_magic.c
   shader/nodes/node_shader_tex_musgrave.cc
   shader/nodes/node_shader_tex_noise.cc
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_image.c b/source/blender/nodes/shader/nodes/node_shader_tex_image.cc
similarity index 50%
rename from source/blender/nodes/shader/nodes/node_shader_tex_image.c
rename to source/blender/nodes/shader/nodes/node_shader_tex_image.cc
index 09d06c35a5f..5a0dc59317d 100644
--- a/source/blender/nodes/shader/nodes/node_shader_tex_image.c
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_image.cc
@@ -19,31 +19,26 @@
 
 #include "../node_shader_util.h"
 
-/* **************** OUTPUT ******************** */
+#include "BKE_image.h"
+#include "BLI_noise.hh"
+#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
 
-static bNodeSocketTemplate sh_node_tex_image_in[] = {
-    {SOCK_VECTOR, N_("Vector"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
-    {-1, ""},
-};
+namespace blender::nodes {
 
-static bNodeSocketTemplate sh_node_tex_image_out[] = {
-    {SOCK_RGBA, N_("Color"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_NO_INTERNAL_LINK},
-    {SOCK_FLOAT,
-     N_("Alpha"),
-     0.0f,
-     0.0f,
-     0.0f,
-     0.0f,
-     0.0f,
-     1.0f,
-     PROP_NONE,
-     SOCK_NO_INTERNAL_LINK},
-    {-1, ""},
+static void sh_node_tex_image_declare(NodeDeclarationBuilder &b)
+{
+  b.is_function_node();
+  b.add_input<decl::Vector>("Vector").implicit_field();
+  b.add_output<decl::Color>("Color").no_muted_links();
+  b.add_output<decl::Float>("Alpha").no_muted_links();
 };
 
+};  // namespace blender::nodes
+
 static void node_shader_init_tex_image(bNodeTree *UNUSED(ntree), bNode *node)
 {
-  NodeTexImage *tex = MEM_callocN(sizeof(NodeTexImage), "NodeTexImage");
+  NodeTexImage *tex = (NodeTexImage *)MEM_callocN(sizeof(NodeTexImage), "NodeTexImage");
   BKE_texture_mapping_default(&tex->base.tex_mapping, TEXMAP_TYPE_POINT);
   BKE_texture_colormapping_default(&tex->base.color_mapping);
   BKE_imageuser_default(&tex->iuser);
@@ -58,12 +53,12 @@ static int node_shader_gpu_tex_image(GPUMaterial *mat,
                                      GPUNodeStack *out)
 {
   Image *ima = (Image *)node->id;
-  NodeTexImage *tex = node->storage;
+  NodeTexImage *tex = (NodeTexImage *)node->storage;
 
   /* We get the image user from the original node, since GPU image keeps
    * a pointer to it and the dependency refreshes the original. */
   bNode *node_original = node->original ? node->original : node;
-  NodeTexImage *tex_original = node_original->storage;
+  NodeTexImage *tex_original = (NodeTexImage *)node_original->storage;
   ImageUser *iuser = &tex_original->iuser;
 
   if (!ima) {
@@ -78,7 +73,7 @@ static int node_shader_gpu_tex_image(GPUMaterial *mat,
 
   node_shader_gpu_tex_mapping(mat, node, in, out);
 
-  eGPUSamplerState sampler_state = 0;
+  eGPUSamplerState sampler_state = GPU_SAMPLER_DEFAULT;
 
   switch (tex->extension) {
     case SHD_IMAGE_EXTENSION_REPEAT:
@@ -94,7 +89,7 @@ static int node_shader_gpu_tex_image(GPUMaterial *mat,
   if (tex->interpolation != SHD_INTERP_CLOSEST) {
     sampler_state |= GPU_SAMPLER_ANISO | GPU_SAMPLER_FILTER;
     /* TODO(fclem): For now assume mipmap is always enabled. */
-    sampler_state |= true ? GPU_SAMPLER_MIPMAP : 0;
+    sampler_state |= GPU_SAMPLER_MIPMAP;
   }
   const bool use_cubic = ELEM(tex->interpolation, SHD_INTERP_CUBIC, SHD_INTERP_SMART);
 
@@ -183,19 +178,234 @@ static int node_shader_gpu_tex_image(GPUMaterial *mat,
   return true;
 }
 
+namespace blender::nodes {
+
+class ImageFunction : public fn::MultiFunction {
+ private:
+  int interpolation_;
+  int projection_;
+  float projection_blend_;
+  int extension_;
+  ImBuf *ibuf_;
+
+ public:
+  ImageFunction(
+      int interpolation, int projection, float projection_blend, int extension, ImBuf *ibuf)
+      : interpolation_(interpolation),
+        projection_(projection),
+        projection_blend_(projection_blend),
+        extension_(extension),
+        ibuf_(ibuf)
+  {
+    static fn::MFSignature signature = create_signature();
+    this->set_signature(&signature);
+  }
+
+  static fn::MFSignature create_signature()
+  {
+    fn::MFSignatureBuilder signature{"ImageFunction"};
+    signature.single_input<float3>("Vector");
+    signature.single_output<ColorGeometry4f>("Color");
+    signature.single_output<float>("Alpha");
+    return signature.build();
+  }
+
+  /* Remap coordinate from 0..1 box to -1..-1 */
+  static float3 texco_remap_square(float3 co)
+  {
+    return (co - float3(0.5f, 0.5f, 0.5f)) * 2.0f;
+  }
+
+  /* projections */
+  static float2 map_to_tube(const float3 co)
+  {
+    float len, u, v;
+    len = sqrtf(co.x * co.x + co.y * co.y);
+    if (len > 0.0f) {
+      u = (1.0f - (atan2f(co.x / len, co.y / len) / M_PI)) * 0.5f;
+      v = (co.z + 1.0f) * 0.5f;
+    }
+    else {
+      u = v = 0.0f;
+    }
+    return float2(u, v);
+  }
+
+  static float2 map_to_sphere(const float3 co)
+  {
+    float l = len_v3(co);
+    float u, v;
+    if (l > 0.0f) {
+      if (UNLIKELY(co.x == 0.0f && co.y == 0.0f)) {
+        u = 0.0f; /* Otherwise domain error. */
+      }
+      else {
+        u = (1.0f - atan2f(co.x, co.y) / M_PI) / 2.0f;
+      }
+      v = 1.0f - safe_acosf(co.z / l) / M_PI;
+    }
+    else {
+      u = v = 0.0f;
+    }
+    return float2(u, v);
+  }
+
+  static float2 map_to_box(const float3 co)
+  {
+    float x1, y1, z1, nor[3];
+    int ret;
+    float u, v;
+
+    copy_v3_v3(nor, co);
+
+    x1 = fabsf(nor[0]);
+    y1 = fabsf(nor[1]);
+    z1 = fabsf(nor[2]);
+
+    if (z1 >= x1 && z1 >= y1) {
+      u = (co.x + 1.0f) / 2.0f;
+      v = (co.y + 1.0f) / 2.0f;
+      ret = 0;
+    }
+    else if (y1 >= x1 && y1 >= z1) {
+      u = (co.x + 1.0f) / 2.0f;
+      v = (co.z + 1.0f) / 2.0f;
+    }
+    else {
+      u = (co.y + 1.0f) / 2.0f;
+      v = (co.z + 1.0f) / 2.0f;
+    }
+    return float2(u, v);
+  }
+
+  void call(IndexMask mask, fn::MFParams params, fn::MFContext UNUSED(context)) const override
+  {
+    const VArray<float3> &vector = params.readonly_single_input<float3>(0, "Vector");
+    MutableSpan<ColorGeometry4f> r_color =
+        params.uninitialized_single_output_if_required<ColorGeometry4f>(1, "Color");
+    MutableSpan<float> r_alpha = params.uninitialized_single_output_if_required<float>(2, "Alpha");
+
+    const bool compute_color = !r_color.is_empty();
+    const bool compute_alpha = !r_alpha.is_empty();
+
+    if (ibuf_) {
+
+      /* Hacked together from old Tex nodes and texture.c and cycles!
+       * texture_procedural.c
+       * BKE_texture_get_value
+       * multitex_nodes_intern
+       */
+
+      float xsize = ibuf_->x / 2;
+      float ysize = ibuf_->y / 2;
+
+      if ((!xsize) || (!ysize)) {
+        return;
+      }
+
+      if (!ibuf_->rect_float) {
+        BLI_thread_lock(LOCK_IMAGE);
+        if (!ibuf_->rect_float) {
+          IMB_float_from_rect(ibuf_);
+        }
+        BLI_thread_unlock(LOCK_IMAGE);
+      }
+
+      float xoff, yoff;
+      int px, py;
+
+      for (int64_t i : mask) {
+        const float *result;
+        float2 co;
+
+        /* Remap */
+        float3 p = texco_remap_square(vector[i]);
+
+        /* Projection - are these needed for GN - most use cases would be things like height maps.
+         */
+        if (projection_ == SHD_PROJ_TUBE) {
+          co = map_to_tube(p);
+        }
+        else if (projection_ == SHD_PROJ_SPHERE) {
+          co = map_to_sphere(p);
+        }
+        else if (projection_ == SHD_PROJ_BOX) {
+          co = map_to_box(p);  // no blending or normal data
+        }
+        else {  // SHD_PROJ_FLAT
+       

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list