[Bf-blender-cvs] [0b2abe1] GPU_data_request: WIP new node type for workflow shaders

Antony Riakiotakis noreply at git.blender.org
Fri Apr 10 19:03:04 CEST 2015


Commit: 0b2abe145aba2ab0ca6f304f1e7eb4e84c4bf9f9
Author: Antony Riakiotakis
Date:   Fri Apr 10 17:50:14 2015 +0200
Branches: GPU_data_request
https://developer.blender.org/rB0b2abe145aba2ab0ca6f304f1e7eb4e84c4bf9f9

WIP new node type for workflow shaders

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

M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/bpath.c
M	source/blender/blenkernel/intern/node.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/editors/space_node/node_draw.c
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/nodes/NOD_shader.h
M	source/blender/nodes/shader/node_shader_tree.c

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

diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 89e7ad7..4059861 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -258,8 +258,9 @@ typedef struct bNodeType {
 #define NODE_CLASS_LAYOUT			100
 
 /* nodetype->compatibility */
-#define NODE_OLD_SHADING	1
-#define NODE_NEW_SHADING	2
+#define NODE_OLD_SHADING		1
+#define NODE_NEW_SHADING		2
+#define NODE_WORKFLOW_SHADING	3
 
 /* node resize directions */
 #define NODE_RESIZE_TOP		1
diff --git a/source/blender/blenkernel/intern/bpath.c b/source/blender/blenkernel/intern/bpath.c
index f5b2af3..658f9cf 100644
--- a/source/blender/blenkernel/intern/bpath.c
+++ b/source/blender/blenkernel/intern/bpath.c
@@ -557,7 +557,7 @@ void BKE_bpath_traverse_id(Main *bmain, ID *id, BPathVisitor visit_cb, const int
 			bNodeTree *ntree = (bNodeTree *)id;
 			bNode *node;
 
-			if (ntree->type == NTREE_SHADER) {
+			if (ELEM(ntree->type, NTREE_SHADER, NTREE_WORKFLOW)) {
 				/* same as lines above */
 				for (node = ntree->nodes.first; node; node = node->next) {
 					if (node->type == SH_NODE_SCRIPT) {
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index b426325..3ff570b1 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -1718,6 +1718,7 @@ void ntreeFreeTree_ex(bNodeTree *ntree, const bool do_id_user)
 	if (ntree->execdata) {
 		switch (ntree->type) {
 			case NTREE_SHADER:
+			case NTREE_WORKFLOW:
 				ntreeShaderEndExecTree(ntree->execdata);
 				break;
 			case NTREE_TEXTURE:
@@ -3632,6 +3633,7 @@ void init_nodesystem(void)
 
 	register_node_tree_type_cmp();
 	register_node_tree_type_sh();
+	register_node_tree_type_workflow();
 	register_node_tree_type_tex();
 
 	register_node_type_frame();
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 646d7a1..673961b 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -2798,7 +2798,7 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
 		
 		if (node->storage) {
 			/* could be handlerized at some point */
-			if (ntree->type==NTREE_SHADER) {
+			if (ELEM(ntree->type, NTREE_SHADER, NTREE_WORKFLOW)) {
 				if (node->type==SH_NODE_CURVE_VEC || node->type==SH_NODE_CURVE_RGB) {
 					direct_link_curvemapping(fd, node->storage);
 				}
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index e301ccc..f8c97af 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -869,7 +869,7 @@ static void write_nodetree(WriteData *wd, bNodeTree *ntree)
 			writestruct(wd, DATA, "bNodeLink", 1, link);
 		if (node->storage) {
 			/* 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))
+			if (ELEM(ntree->type, NTREE_SHADER, NTREE_WORKFLOW) && (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;
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index 87a64e9..7faa464 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -134,6 +134,9 @@ void ED_node_tag_update_id(ID *id)
 		else if (GS(id->name) == ID_WO)
 			WM_main_add_notifier(NC_WORLD | ND_WORLD, id);
 	}
+	else if (ntree->type == NTREE_WORKFLOW) {
+		WM_main_add_notifier(NC_SCENE | ND_NODES, id);
+	}
 	else if (ntree->type == NTREE_COMPOSIT) {
 		WM_main_add_notifier(NC_SCENE | ND_NODES, id);
 	}
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index f6524be..27875e5 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -394,6 +394,7 @@ typedef struct bNodeTree {
 #define NTREE_SHADER		0
 #define NTREE_COMPOSIT		1
 #define NTREE_TEXTURE		2
+#define NTREE_WORKFLOW		3
 
 /* ntree->init, flag */
 #define NTREE_TYPE_INIT		1
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index 6cbc58d..340229e 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -257,6 +257,7 @@ extern StructRNA RNA_GPencilFrame;
 extern StructRNA RNA_GPencilLayer;
 extern StructRNA RNA_GPencilStroke;
 extern StructRNA RNA_GPencilStrokePoint;
+extern StructRNA RNA_GPUWorkflowShader;
 extern StructRNA RNA_GameBooleanProperty;
 extern StructRNA RNA_GameFloatProperty;
 extern StructRNA RNA_GameIntProperty;
@@ -673,7 +674,7 @@ extern StructRNA RNA_WindowManager;
 extern StructRNA RNA_WipeSequence;
 extern StructRNA RNA_WireframeModifier;
 extern StructRNA RNA_WoodTexture;
-extern StructRNA RNA_GPUWorkflowShader;
+extern StructRNA RNA_WorkflowNodeTree;
 extern StructRNA RNA_World;
 extern StructRNA RNA_WorldAmbientOcclusion;
 extern StructRNA RNA_WorldLighting;
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 3ca14e0..ce96f94 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -7669,6 +7669,7 @@ static void rna_def_nodetree(BlenderRNA *brna)
 
 	static EnumPropertyItem static_type_items[] = {
 		{NTREE_SHADER,      "SHADER",       ICON_MATERIAL,      "Shader",       "Shader nodes"},
+	    {NTREE_WORKFLOW,    "WORKFLOW",     ICON_SMOOTH,    "Workflow",     "Workflow nodes"},
 		{NTREE_TEXTURE,     "TEXTURE",      ICON_TEXTURE,       "Texture",      "Texture nodes"},
 		{NTREE_COMPOSIT,    "COMPOSITING",  ICON_RENDERLAYERS,  "Compositing",  "Compositing nodes"},
 		{0, NULL, 0, NULL, NULL}
@@ -7852,6 +7853,18 @@ static void rna_def_shader_nodetree(BlenderRNA *brna)
 	RNA_def_struct_ui_icon(srna, ICON_MATERIAL);
 }
 
+
+static void rna_def_workflow_nodetree(BlenderRNA *brna)
+{
+	StructRNA *srna;
+
+	srna = RNA_def_struct(brna, "WorkflowNodeTree", "NodeTree");
+	RNA_def_struct_ui_text(srna, "Workflow Node Tree",
+	                       "Node tree consisting of linked nodes used for shader workflows");
+	RNA_def_struct_sdna(srna, "bNodeTree");
+	RNA_def_struct_ui_icon(srna, ICON_SMOOTH);
+}
+
 static void rna_def_texture_nodetree(BlenderRNA *brna)
 {
 	StructRNA *srna;
@@ -7948,6 +7961,7 @@ void RNA_def_nodetree(BlenderRNA *brna)
 	
 	rna_def_composite_nodetree(brna);
 	rna_def_shader_nodetree(brna);
+	rna_def_workflow_nodetree(brna);
 	rna_def_texture_nodetree(brna);
 	
 #define DefNode(Category, ID, DefFunc, EnumName, StructName, UIName, UIDesc) \
diff --git a/source/blender/nodes/NOD_shader.h b/source/blender/nodes/NOD_shader.h
index 59639e4..cc8e17e 100644
--- a/source/blender/nodes/NOD_shader.h
+++ b/source/blender/nodes/NOD_shader.h
@@ -42,6 +42,8 @@ extern struct bNodeTreeType *ntreeType_Shader;
 
 void register_node_tree_type_sh(void);
 
+void register_node_tree_type_workflow(void);
+
 void register_node_type_sh_group(void);
 
 void register_node_type_sh_output(void);
diff --git a/source/blender/nodes/shader/node_shader_tree.c b/source/blender/nodes/shader/node_shader_tree.c
index f18ee1d..500434e 100644
--- a/source/blender/nodes/shader/node_shader_tree.c
+++ b/source/blender/nodes/shader/node_shader_tree.c
@@ -36,7 +36,9 @@
 #include "DNA_material_types.h"
 #include "DNA_node_types.h"
 #include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
 #include "DNA_space_types.h"
+#include "DNA_view3d_types.h"
 #include "DNA_world_types.h"
 #include "DNA_linestyle_types.h"
 
@@ -50,6 +52,7 @@
 #include "BKE_linestyle.h"
 #include "BKE_node.h"
 #include "BKE_scene.h"
+#include "BKE_screen.h"
 
 #include "RNA_access.h"
 
@@ -196,6 +199,70 @@ void register_node_tree_type_sh(void)
 	ntreeTypeAdd(tt);
 }
 
+static void workflow_get_from_context(const bContext *C, bNodeTreeType *UNUSED(treetype), bNodeTree **r_ntree, ID **r_id, ID **r_from)
+{
+	Main *bmain = CTX_data_main(C);
+	ScrArea *sa = NULL;
+	ARegion *ar = NULL;
+	View3D *v3d = NULL;
+	bScreen *screen = CTX_wm_screen(C);
+
+	*r_from = NULL;
+
+	if (screen) {
+		sa = BKE_screen_find_big_area(screen, SPACE_VIEW3D, 0);
+		ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
+		if (ar) {
+			v3d = sa->spacedata.first;
+		}
+	}
+
+	if (v3d && v3d->activeworkflow) {
+		*r_id = &v3d->activeworkflow->id;
+		*r_ntree = v3d->activeworkflow->ntree;
+	}
+	else if (bmain->gpuworkflows.first) {
+		GPUWorkflowShader *wfshader = bmain->gpuworkflows.first;
+		*r_id = &wfshader->id;
+		*r_ntree = wfshader->ntree;
+	}
+	else {
+		*r_id = NULL;
+		*r_ntree = NULL;
+	}
+}
+
+
+static int workflow_tree_poll(const bContext *UNUSED(C), bNodeTreeType *UNUSED(treetype))
+{
+	return (U.gameflags & USER_VIEWPORT_2) != 0;
+}
+
+
+void register_node_tree_type_workflow(void)
+{
+	bNodeTreeType *tt = ntreeType_Shader = MEM_callocN(sizeof(bNodeTreeType), "shader node tree type");
+
+	tt->type = NTREE_SHADER;
+	strcpy(tt->idname, "WorkflowNodeTree");
+	strcpy(tt->ui_name, "Workflow Shader");
+	tt->ui_icon = 0;    /* defined in drawnode.c */
+	strcpy(tt->ui_description, "Workflow nodes");
+
+	tt->foreach_nodeclass = foreach_nodeclass;
+	tt->localize = localize;
+	tt->local_sync = local_sync;
+	tt->local_merge = local_merge;
+	tt->update = update;
+	tt->poll = workflow_tree_poll;
+	tt->get_from_context = workflow_get_from_context;
+
+	tt->ext.srna = &RNA_WorkflowNodeTree;
+
+	ntreeTypeAdd(tt);
+}
+
+
 /* GPU material from shader nodes */
 
 void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat, short compatibility)




More information about the Bf-blender-cvs mailing list