[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51837] trunk/blender: Render API: shader script node for custom shaders.

Brecht Van Lommel brechtvanlommel at pandora.be
Sat Nov 3 15:32:27 CET 2012


Revision: 51837
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51837
Author:   blendix
Date:     2012-11-03 14:32:26 +0000 (Sat, 03 Nov 2012)
Log Message:
-----------
Render API: shader script node for custom shaders.

* Shader script node added, which stores either a link to a text datablock or
  file on disk, and has functions to add and remove sockets.
* Callback RenderEngine.update_script_node(self, node) added for render engines
  to compile the shader and update the node with new sockets.

Thanks to Thomas, Lukas and Dalai for the implementation.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/space_text.py
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/blenkernel/intern/text.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/editors/space_node/drawnode.c
    trunk/blender/source/blender/editors/space_node/node_edit.c
    trunk/blender/source/blender/editors/space_node/node_intern.h
    trunk/blender/source/blender/editors/space_node/node_ops.c
    trunk/blender/source/blender/editors/space_node/node_templates.c
    trunk/blender/source/blender/makesdna/DNA_node_types.h
    trunk/blender/source/blender/makesrna/RNA_access.h
    trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
    trunk/blender/source/blender/makesrna/intern/rna_nodetree_types.h
    trunk/blender/source/blender/makesrna/intern/rna_render.c
    trunk/blender/source/blender/nodes/CMakeLists.txt
    trunk/blender/source/blender/nodes/NOD_shader.h
    trunk/blender/source/blender/nodes/shader/node_shader_tree.c
    trunk/blender/source/blender/render/extern/include/RE_engine.h
    trunk/blender/source/blender/render/intern/source/external_engine.c

Added Paths:
-----------
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_script.c

Modified: trunk/blender/release/scripts/startup/bl_ui/space_text.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/space_text.py	2012-11-03 14:32:13 UTC (rev 51836)
+++ trunk/blender/release/scripts/startup/bl_ui/space_text.py	2012-11-03 14:32:26 UTC (rev 51837)
@@ -56,13 +56,18 @@
         row.prop(st, "show_syntax_highlight", text="")
 
         if text:
-            row = layout.row()
-            row.operator("text.run_script")
+            osl = text.name.endswith(".osl") or text.name.endswith(".oso")
 
-            row = layout.row()
-            row.active = text.name.endswith(".py")
-            row.prop(text, "use_module")
+            if osl:
+                row = layout.row()
+                row.operator("node.shader_script_update")
+            else:
+                row = layout.row()
+                row.operator("text.run_script")
 
+                row = layout.row()
+                row.prop(text, "use_module")
+
             row = layout.row()
             if text.filepath:
                 if text.is_dirty:

Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h	2012-11-03 14:32:13 UTC (rev 51836)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2012-11-03 14:32:26 UTC (rev 51837)
@@ -245,6 +245,7 @@
 #define NODE_CLASS_PARTICLES		25
 #define NODE_CLASS_TRANSFORM		30
 #define NODE_CLASS_COMBINE			31
+#define NODE_CLASS_SCRIPT			32
 #define NODE_CLASS_SHADER 			40
 #define NODE_CLASS_LAYOUT			100
 
@@ -551,6 +552,7 @@
 #define SH_NODE_PARTICLE_INFO           168
 #define SH_NODE_TEX_BRICK				169
 #define SH_NODE_BUMP					170
+#define SH_NODE_SCRIPT					171
 
 /* custom defines options for Material node */
 #define SH_NODE_MAT_DIFF   1

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2012-11-03 14:32:13 UTC (rev 51836)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2012-11-03 14:32:26 UTC (rev 51837)
@@ -2288,6 +2288,7 @@
 	register_node_type_sh_tex_coord(ttype);
 	register_node_type_sh_particle_info(ttype);
 	register_node_type_sh_bump(ttype);
+	register_node_type_sh_script(ttype);
 
 	register_node_type_sh_background(ttype);
 	register_node_type_sh_bsdf_anisotropic(ttype);

Modified: trunk/blender/source/blender/blenkernel/intern/text.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/text.c	2012-11-03 14:32:13 UTC (rev 51836)
+++ trunk/blender/source/blender/blenkernel/intern/text.c	2012-11-03 14:32:26 UTC (rev 51837)
@@ -55,12 +55,15 @@
 #include "DNA_text_types.h"
 #include "DNA_userdef_types.h"
 #include "DNA_object_types.h"
+#include "DNA_node_types.h"
+#include "DNA_material_types.h"
 
 #include "BKE_depsgraph.h"
 #include "BKE_global.h"
 #include "BKE_library.h"
 #include "BKE_main.h"
 #include "BKE_text.h"
+#include "BKE_node.h"
 
 
 #ifdef WITH_PYTHON
@@ -531,6 +534,9 @@
 	bController *cont;
 	bActuator *act;
 	bConstraint *con;
+	bNodeTree *ntree;
+	bNode *node;
+	Material *mat;
 	short update;
 
 	for (ob = bmain->object.first; ob; ob = ob->id.next) {
@@ -582,6 +588,26 @@
 			DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
 	}
 	
+	/* nodes */
+	for (mat = bmain->mat.first; mat; mat = mat->id.next) {
+		ntree = mat->nodetree;
+		for (node = ntree->nodes.first; node; node = node->next) {
+			if (node->type == SH_NODE_SCRIPT) {
+				Text *ntext = (Text *)node->id;
+				if (ntext == text) node->id = NULL;
+			}
+		}
+	}
+	
+	for (ntree = bmain->nodetree.first; ntree; ntree = ntree->id.next) {
+		for (node = ntree->nodes.first; node; node = node->next) {
+			if (node->type == SH_NODE_SCRIPT) {
+				Text *ntext = (Text *)node->id;
+				if (ntext == text) node->id = NULL;
+			}
+		}
+	}
+	
 	/* text space */
 	for (scr = bmain->screen.first; scr; scr = scr->id.next) {
 		for (area = scr->areabase.first; area; area = area->next) {

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2012-11-03 14:32:13 UTC (rev 51836)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2012-11-03 14:32:26 UTC (rev 51837)
@@ -2429,8 +2429,18 @@
 		
 		if (node->storage) {
 			/* could be handlerized at some point */
-			if (ntree->type==NTREE_SHADER && (node->type==SH_NODE_CURVE_VEC || node->type==SH_NODE_CURVE_RGB))
-				direct_link_curvemapping(fd, node->storage);
+			if (ntree->type==NTREE_SHADER) {
+				if (node->type==SH_NODE_CURVE_VEC || node->type==SH_NODE_CURVE_RGB) {
+					direct_link_curvemapping(fd, node->storage);
+				}
+				else if (node->type==SH_NODE_SCRIPT) {
+					NodeShaderScript *nss = (NodeShaderScript *) node->storage;
+					nss->bytecode = newdataadr(fd, nss->bytecode);
+					nss->prop = newdataadr(fd, nss->prop);
+					if (nss->prop)
+						IDP_DirectLinkProperty(nss->prop, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd);
+				}
+			}
 			else if (ntree->type==NTREE_COMPOSIT) {
 				if (ELEM4(node->type, CMP_NODE_TIME, CMP_NODE_CURVE_VEC, CMP_NODE_CURVE_RGB, CMP_NODE_HUECORRECT))
 					direct_link_curvemapping(fd, node->storage);

Modified: trunk/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/writefile.c	2012-11-03 14:32:13 UTC (rev 51836)
+++ trunk/blender/source/blender/blenloader/intern/writefile.c	2012-11-03 14:32:26 UTC (rev 51837)
@@ -728,6 +728,16 @@
 			/* could be handlerized at some point, now only 1 exception still */
 			if (ntree->type==NTREE_SHADER && (node->type==SH_NODE_CURVE_VEC || node->type==SH_NODE_CURVE_RGB))
 				write_curvemapping(wd, node->storage);
+			else if (ntree->type==NTREE_SHADER && node->type==SH_NODE_SCRIPT) {
+				NodeShaderScript *nss = (NodeShaderScript *)node->storage;
+				if (nss->bytecode)
+					writedata(wd, DATA, strlen(nss->bytecode)+1, nss->bytecode);
+				/* Write ID Properties -- and copy this comment EXACTLY for easy finding
+				 * of library blocks that implement this.*/
+				if (nss->prop)
+					IDP_WriteProperty(nss->prop, wd);
+				writestruct(wd, DATA, node->typeinfo->storagename, 1, node->storage);
+			}
 			else if (ntree->type==NTREE_COMPOSIT && ELEM4(node->type, CMP_NODE_TIME, CMP_NODE_CURVE_VEC, CMP_NODE_CURVE_RGB, CMP_NODE_HUECORRECT))
 				write_curvemapping(wd, node->storage);
 			else if (ntree->type==NTREE_TEXTURE && (node->type==TEX_NODE_CURVE_RGB || node->type==TEX_NODE_CURVE_TIME) )

Modified: trunk/blender/source/blender/editors/space_node/drawnode.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/drawnode.c	2012-11-03 14:32:13 UTC (rev 51836)
+++ trunk/blender/source/blender/editors/space_node/drawnode.c	2012-11-03 14:32:26 UTC (rev 51837)
@@ -1384,6 +1384,34 @@
 	uiItemR(layout, ptr, "distribution", 0, "", ICON_NONE);
 }
 
+static void node_shader_buts_script(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+	uiLayout *row;
+
+	row = uiLayoutRow(layout, FALSE);
+	uiItemR(row, ptr, "mode", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+
+	row = uiLayoutRow(layout, TRUE);
+
+	if(RNA_enum_get(ptr, "mode") == NODE_SCRIPT_INTERNAL)
+		uiItemR(row, ptr, "script", 0, "", ICON_NONE);
+	else
+		uiItemR(row, ptr, "filepath", 0,"", ICON_NONE);
+
+	uiItemO(row, "", ICON_FILE_REFRESH, "node.shader_script_update");
+}
+
+static void node_shader_buts_script_details(uiLayout *layout, bContext *C, PointerRNA *ptr)
+{
+	uiItemS(layout);
+
+	node_shader_buts_script(layout, C, ptr);
+
+	/* not implemented yet
+	if(RNA_enum_get(ptr, "mode") == NODE_SCRIPT_EXTERNAL)
+		uiItemR(layout, ptr, "use_auto_update", 0, NULL, ICON_NONE);*/
+}
+
 /* only once called */
 static void node_shader_set_butfunc(bNodeType *ntype)
 {
@@ -1467,6 +1495,10 @@
 		case SH_NODE_BSDF_GLASS:
 			ntype->uifunc = node_shader_buts_glossy;
 			break;
+		case SH_NODE_SCRIPT:
+			ntype->uifunc = node_shader_buts_script;
+			ntype->uifuncbut = node_shader_buts_script_details;
+			break;
 	}
 }
 

Modified: trunk/blender/source/blender/editors/space_node/node_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_edit.c	2012-11-03 14:32:13 UTC (rev 51836)
+++ trunk/blender/source/blender/editors/space_node/node_edit.c	2012-11-03 14:32:26 UTC (rev 51837)
@@ -35,6 +35,7 @@
 #include "DNA_material_types.h"
 #include "DNA_node_types.h"
 #include "DNA_object_types.h"
+#include "DNA_text_types.h"
 #include "DNA_world_types.h"
 
 #include "BLI_math.h"
@@ -54,6 +55,7 @@
 #include "BKE_scene.h"
 #include "BKE_texture.h"
 
+#include "RE_engine.h"
 #include "RE_pipeline.h"
 
 
@@ -2137,3 +2139,119 @@
 	/* flags */
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
+
+/* ********************** Shader Script Update ******************/
+
+typedef struct ScriptUpdateData {
+	RenderEngine *engine;
+	RenderEngineType *type;
+
+	Text *text;
+	int found;
+} ScriptUpdateData;
+
+static int node_shader_script_update_poll(bContext *C)
+{
+	Scene *scene = CTX_data_scene(C);
+	RenderEngineType *type = RE_engines_find(scene->r.engine);
+	bNode *node;
+	Text *text;
+
+	/* test if we have a render engine that supports shaders scripts */
+	if(!(type && type->update_script_node))
+		return 0;
+
+	/* see if we have a shader script node in context */
+	node = CTX_data_pointer_get_type(C, "node", &RNA_ShaderNodeScript).data;
+	if(node && node->type == SH_NODE_SCRIPT) {
+		NodeShaderScript *nss = node->storage;
+
+		if(node->id || nss->filepath[0])
+			return 1;
+	}
+
+	/* see if we have a text datablock in context */
+	text = CTX_data_pointer_get_type(C, "edit_text", &RNA_Text).data;
+	if(text)
+		return 1;
+
+	/* we don't check if text datablock is actually in use, too slow for poll */
+
+	return 0;
+}
+
+static void node_shader_script_update_text(void *data_, ID *UNUSED(id), bNodeTree *ntree)
+{
+	ScriptUpdateData *data = (ScriptUpdateData *)data_;
+	bNode *node;
+
+	/* update each script that is using this text datablock */
+	for (node=ntree->nodes.first; node; node=node->next) {
+		if (node->type == NODE_GROUP){
+			node_shader_script_update_text(data_, NULL, (bNodeTree *)node->id);
+		}

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list