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);
+}