Having trouble creating a new cycles node

Hello
Im currently trying to create a new node for Cycles.
I followed this guide the best I could but the node didn’t show up in the editor. So I followed this guide but still nothig.

My osl code is not debugged properly since I can’t test the node (it worked imported with the script node).

I wondered if someone out ther could help me out.
Thanks in advance.

Here is my diff file:

diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index 03ed88e..96bb5c3 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -856,6 +856,11 @@ static ShaderNode *add_node(Scene *scene,
     nmap->attribute = b_normal_map_node.uv_map();
     node = nmap;
   }
+  else if (b_node.is_a(&RNA_ShaderNodeInsideTest)) {
+    BL::ShaderNodeInsideTest b_normal_map_node(b_node);
+    InsideTestNode *nmap = graph->create_node<InsideTestNode>();
+    node = nmap;
+  }
   else if (b_node.is_a(&RNA_ShaderNodeTangent)) {
     BL::ShaderNodeTangent b_tangent_node(b_node);
     TangentNode *tangent = graph->create_node<TangentNode>();
diff --git a/intern/cycles/kernel/shaders/CMakeLists.txt b/intern/cycles/kernel/shaders/CMakeLists.txt
index 02be781..6a72916 100644
--- a/intern/cycles/kernel/shaders/CMakeLists.txt
+++ b/intern/cycles/kernel/shaders/CMakeLists.txt
@@ -69,6 +69,7 @@ set(SRC_OSL
   node_noise_texture.osl
   node_normal.osl
   node_normal_map.osl
+  node_inside_test.osl
   node_object_info.osl
   node_output_displacement.osl
   node_output_surface.osl
diff --git a/intern/cycles/kernel/shaders/node_inside_test.osl b/intern/cycles/kernel/shaders/node_inside_test.osl
new file mode 100644
index 0000000..1764579
--- /dev/null
+++ b/intern/cycles/kernel/shaders/node_inside_test.osl
@@ -0,0 +1,58 @@
+#include "stdosl.h"
+
+shader node_inside_test(string object="none",
+                        point position=P,
+                        int samples = 1,
+                        output float result=0){
+
+    int i = 0;
+    vector rand;
+
+    string hit_name;
+    vector hit_normal;
+
+    int hits = 0;
+    vector O;
+    getattribute(object,"object:location", O);
+    
+    rand = (P-O);
+    
+    while(i < samples){
+        rand = noise("cell", P*(2000+i));
+        rand -= 0.5;
+        
+        if(trace(position, rand)){
+            getmessage("trace", "geom:name", hit_name);
+            if(object==hit_name){
+                point  triVerts[3];
+                getmessage("trace","geom:trianglevertices",triVerts);
+                vector triNormal = cross(triVerts[1]-triVerts[0],triVerts[2]-triVerts[0]); 
+                if(dot(triNormal, rand) >= 0){
+                    hits += 1;
+                }
+            }
+            else{
+                break;
+
+            }
+        }
+        else{
+
+            break;
+
+        }
+        i += 1;
+
+    }
+    if(hits == samples){
+        result = 1;
+
+    }
+
+    else{
+
+        result = 0;
+
+    }
+
+}
\ No newline at end of file
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index f1ebb37..8eb9432 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -134,6 +134,7 @@ typedef enum ShaderNodeType {
   NODE_VECTOR_CURVES,
   NODE_TANGENT,
   NODE_NORMAL_MAP,
+  NODE_INSIDE_TEST,
   NODE_INVERT,
   NODE_MIX,
   NODE_SEPARATE_VECTOR,
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index fc525e0..d369f16 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -6784,6 +6784,55 @@ void NormalMapNode::compile(OSLCompiler &compiler)
   compiler.add(this, "node_normal_map");
 }
 
+
+/* Inside Test */
+
+NODE_DEFINE(InsideTestNode)
+{
+  NodeType *type = NodeType::add("inside_test", create, NodeType::SHADER);
+
+  SOCKET_IN_STRING(object, "Object", ustring());
+  SOCKET_IN_INT(samples, "Samples", 1);
+  SOCKET_IN_VECTOR(position, "Position", make_float3(0.0f, 0.0f, 0.0f));
+
+  SOCKET_OUT_FLOAT(result_osl, "result");
+
+  return type;
+}
+
+InsideTestNode::InsideTestNode() : ShaderNode(node_type)
+{
+}
+void InsideTestNode::compile(OSLCompiler &compiler)
+{
+    compiler.add(this, "node_inside_test");
+}
+
+void InsideTestNode::compile(SVMCompiler &compiler)
+{
+    ShaderInput *object_in = input("Object");
+    ShaderInput *samples_in = input("Samples");
+    ShaderInput *position_in = input("Position");
+    ShaderOutput *result_out = output("Result");
+
+    if (object_in->link)
+        compiler.stack_assign(object_in);
+    if (samples_in->link)
+      compiler.stack_assign(samples_in);
+    if (position_in->link)
+      compiler.stack_assign(position_in);
+
+    
+    compiler.stack_assign(result_out);
+    compiler.add_node(NODE_INSIDE_TEST,
+                      compiler.encode_uchar4(compiler.stack_assign(object_in),
+                                             compiler.stack_assign(samples_in),
+                                             compiler.stack_assign(position_in),
+                                             compiler.stack_assign(result_out))
+                    );
+    
+  }
+
 /* Tangent */
 
 NODE_DEFINE(TangentNode)
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
index 62dd9d8..7e8011b 100644
--- a/intern/cycles/render/nodes.h
+++ b/intern/cycles/render/nodes.h
@@ -1556,6 +1556,16 @@ class NormalMapNode : public ShaderNode {
   float3 normal_osl;
 };
 
+class InsideTestNode : public ShaderNode {
+ public:
+  SHADER_NODE_CLASS(InsideTestNode);
+  float3 position;
+  int samples;
+  ustring object;
+  float result;
+
+  // Inputs and properties declarations.
+};
 class TangentNode : public ShaderNode {
  public:
   SHADER_NODE_CLASS(TangentNode)
diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 027f406..60de605 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -237,7 +237,8 @@ shader_node_categories = [
         NodeItem("ShaderNodeVolumeScatter", poll=eevee_cycles_shader_nodes_poll),
         NodeItem("ShaderNodeVolumePrincipled"),
         NodeItem("ShaderNodeEeveeSpecular", poll=object_eevee_shader_nodes_poll),
-        NodeItem("ShaderNodeBsdfHairPrincipled", poll=object_cycles_shader_nodes_poll)
+        NodeItem("ShaderNodeBsdfHairPrincipled", poll=object_cycles_shader_nodes_poll),
+        NodeItem("ShaderNodeInsideTest"),
     ]),
     ShaderNodeCategory("SH_NEW_TEXTURE", "Texture", items=[
         NodeItem("ShaderNodeTexImage"),
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 5200a1b..034f4f6 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1039,6 +1039,7 @@ void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree,
 #define SH_NODE_VERTEX_COLOR 706
 #define SH_NODE_OUTPUT_AOV 707
 #define SH_NODE_VECTOR_ROTATE 708
+#define SH_NODE_INSIDE_TEST 2048
 
 /* custom defines options for Material node */
 // #define SH_NODE_MAT_DIFF 1
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 8e168d0..f073286 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -4675,6 +4675,7 @@ static void registerTextureNodes(void)
   register_node_type_sh_script();
   register_node_type_sh_tangent();
   register_node_type_sh_normal_map();
+  register_node_type_sh_inside_test();
   register_node_type_sh_hair_info();
   register_node_type_sh_volume_info();
 
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 9373c43..250a29f 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -1032,6 +1032,12 @@ static void node_shader_buts_normal_map(uiLayout *layout, bContext *C, PointerRN
   }
 }
 
+static void node_shader_buts_inside_test(uiLayout *layout, bContext *C, PointerRNA *ptr)
+{
+  uiItemR(layout, ptr, "idk", DEFAULT_FLAGS, NULL, 0);
+
+}
+
 static void node_shader_buts_displacement(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
 {
   uiItemR(layout, ptr, "space", DEFAULT_FLAGS, "", 0);
@@ -1285,6 +1291,9 @@ static void node_shader_set_butfunc(bNodeType *ntype)
     case SH_NODE_NORMAL_MAP:
       ntype->draw_buttons = node_shader_buts_normal_map;
       break;
+    case SH_NODE_INSIDE_TEST:
+      ntype->draw_buttons = node_shader_buts_inside_test;
+      break;
     case SH_NODE_DISPLACEMENT:
     case SH_NODE_VECTOR_DISPLACEMENT:
       ntype->draw_buttons = node_shader_buts_displacement;
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 1d76ebd..0ef3f25 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1018,6 +1018,10 @@ typedef struct NodeShaderNormalMap {
   char uv_map[64];
 } NodeShaderNormalMap;
 
+typedef struct NodeShaderInsideTest {
+  int idk;
+} NodeShaderInsideTest;
+
 typedef struct NodeShaderUVMap {
   char uv_map[64];
 } NodeShaderUVMap;
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 8c99a4c..44f90b4 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -5341,6 +5341,15 @@ static void def_sh_normal_map(StructRNA *srna)
   RNA_def_struct_sdna_from(srna, "bNode", NULL);
 }
 
+
+static void def_sh_inside_test(StructRNA *srna)
+{
+  PropertyRNA *prop;
+
+  RNA_def_struct_sdna_from(srna, "NodeShaderInsideTest", "storage");
+}
+
+
 static void def_sh_displacement(StructRNA *srna)
 {
   static const EnumPropertyItem prop_space_items[] = {
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index 4172dc06..86bdf5f 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -182,6 +182,7 @@ set(SRC
   shader/nodes/node_shader_mix_shader.c
   shader/nodes/node_shader_normal.c
   shader/nodes/node_shader_normal_map.c
+  shader/nodes/node_shader_inside_test.c
   shader/nodes/node_shader_object_info.c
   shader/nodes/node_shader_output_aov.c
   shader/nodes/node_shader_output_light.c
diff --git a/source/blender/nodes/NOD_shader.h b/source/blender/nodes/NOD_shader.h
index 2911e0f..ee35acc 100644
--- a/source/blender/nodes/NOD_shader.h
+++ b/source/blender/nodes/NOD_shader.h
@@ -87,6 +87,7 @@ void register_node_type_sh_hair_info(void);
 void register_node_type_sh_volume_info(void);
 void register_node_type_sh_script(void);
 void register_node_type_sh_normal_map(void);
+void register_node_type_sh_inside_test(void);
 void register_node_type_sh_tangent(void);
 void register_node_type_sh_vector_rotate(void);
 void register_node_type_sh_vect_transform(void);
diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h
index 7922a73..2be7669 100644
--- a/source/blender/nodes/NOD_static_types.h
+++ b/source/blender/nodes/NOD_static_types.h
@@ -102,6 +102,7 @@ DefNode(ShaderNode,     SH_NODE_WAVELENGTH,         0,                      "WAV
 DefNode(ShaderNode,     SH_NODE_BLACKBODY,          0,                      "BLACKBODY",          Blackbody,        "Blackbody",         ""       )
 DefNode(ShaderNode,     SH_NODE_BUMP,               def_sh_bump,            "BUMP",               Bump,             "Bump",              ""       )
 DefNode(ShaderNode,     SH_NODE_NORMAL_MAP,         def_sh_normal_map,      "NORMAL_MAP",         NormalMap,        "Normal Map",        ""       )
+DefNode(ShaderNode,     SH_NODE_INSIDE_TEST,        def_sh_inside_test,     "INSIDE_TEST",        InsideTest,       "Inside Test",       ""       )
 DefNode(ShaderNode,     SH_NODE_TANGENT,            def_sh_tangent,         "TANGENT",            Tangent,          "Tangent",           ""       )
 DefNode(ShaderNode,     SH_NODE_SCRIPT,             def_sh_script,          "SCRIPT",             Script,           "Script",            ""       )
 DefNode(ShaderNode,     SH_NODE_TEX_IMAGE,          def_sh_tex_image,       "TEX_IMAGE",          TexImage,         "Image Texture",     ""       )
diff --git a/source/blender/nodes/shader/nodes/node_shader_inside_test.c b/source/blender/nodes/shader/nodes/node_shader_inside_test.c
new file mode 100644
index 0000000..99784c4
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_inside_test.c
@@ -0,0 +1,30 @@
+#include "../node_shader_util.h"
+
+static bNodeSocketTemplate sh_node_inside_test_in[] = {
+    {SOCK_STRING, N_("Object"),   1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 10.0f},
+    {SOCK_INT,    N_("Samples"),  1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 10.0f},
+    {SOCK_VECTOR, N_("Position"), 0.5f, 0.5f, 1.0f, 1.0f, 0.0f, 1.0f},
+    {-1, ""},
+};
+
+static bNodeSocketTemplate sh_node_inside_test_out[] = {
+    {SOCK_FLOAT, N_("Result"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+    {-1, ""},
+};
+
+static void node_shader_init_inside_test(bNodeTree *UNUSED(ntree), bNode *node)
+{
+  NodeShaderInsideTest *attr = MEM_callocN(sizeof(NodeShaderInsideTest), "NodeShaderInsideTest");
+  node->storage = attr;
+}
+
+void register_node_type_sh_inside_test(void)
+{
+  static bNodeType ntype;
+
+  sh_node_type_base(&ntype, SH_NODE_INSIDE_TEST, "Inside Test", NODE_CLASS_SHADER, 0);
+  node_type_socket_templates(&ntype, sh_node_inside_test_in, sh_node_inside_test_out);
+  node_type_init(&ntype, node_shader_init_inside_test);
+  node_type_storage(&ntype, "NodeShaderInsideTest", node_free_standard_storage, node_copy_standard_storage);
+  nodeRegisterType(&ntype);
+}

I’m not sure what you mean by not showing up in the editor? When I apply this patch, I can create the node using Add > Shader > Inside Test.

1 Like

Can confirm, seems ok here

be sure to rebuild INSTALL (or make install for linux based) any time you make python changes to copy the files to the right runtime location

1 Like

Thanks guys, you helped me a lot. It was the python thing.
I had to build INSTALL.

I literally stared at the code for hours to find out whats wrong and it was so easy…