[Bf-blender-cvs] [b2d6cd2] texture_nodes_refactor: Bring material nodes back to the render engine

Sergey Sharybin noreply at git.blender.org
Sat Oct 11 15:04:34 CEST 2014


Commit: b2d6cd2e33f23e1c3d4dfb752e8a2bc6642152e8
Author: Sergey Sharybin
Date:   Sat Oct 11 18:55:09 2014 +0600
Branches: texture_nodes_refactor
https://developer.blender.org/rBb2d6cd2e33f23e1c3d4dfb752e8a2bc6642152e8

Bring material nodes back to the render engine

The idea is to make make it so per-tree execution data is owned by
the renderer and being passed to the tree evaluation routines.

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

M	source/blender/blenkernel/BKE_material.h
M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/material.c
M	source/blender/blenkernel/intern/node.c
M	source/blender/editors/render/render_preview.c
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/nodes/intern/node_exec.h
M	source/blender/nodes/shader/node_shader_tree.c
M	source/blender/render/extern/include/RE_pipeline.h
M	source/blender/render/intern/include/render_types.h
M	source/blender/render/intern/source/bake.c
M	source/blender/render/intern/source/convertblender.c
M	source/blender/render/intern/source/occlusion.c
M	source/blender/render/intern/source/pipeline.c
M	source/blender/render/intern/source/rayshade.c
M	source/blender/render/intern/source/shadeinput.c

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

diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h
index 2f20505..1b3db63 100644
--- a/source/blender/blenkernel/BKE_material.h
+++ b/source/blender/blenkernel/BKE_material.h
@@ -36,6 +36,7 @@
 extern "C" {
 #endif
 
+struct bNodeTreeExecPool;
 struct Main;
 struct Material;
 struct ID;
@@ -96,10 +97,16 @@ struct Material *BKE_material_pop_id(struct ID *id, int index, bool update_data)
 void BKE_material_clear_id(struct ID *id, bool update_data);
 /* rendering */
 
-void init_render_material(struct Material *, int, float *);
-void init_render_materials(struct Main *, int, float *);
-void end_render_material(struct Material *);
-void end_render_materials(struct Main *);
+void init_render_material(struct Material *mat,
+                          struct bNodeTreeExecPool *exec_tree_pool,
+                          int render_mode, float *amb);
+void init_render_materials(struct Main *bmain,
+                           struct bNodeTreeExecPool *exec_tree_pool,
+                           int render_mode, float *amb);
+void end_render_material(struct bNodeTreeExecPool *exec_tree_pool,
+                         struct Material *mat);
+void end_render_materials(struct Main *bmain,
+                          struct bNodeTreeExecPool *exec_tree_pool);
 
 bool material_in_material(struct Material *parmat, struct Material *mat);
 
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index cb96538..e0ab69e 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -84,6 +84,7 @@ struct ColorManagedViewSettings;
 struct ColorManagedDisplaySettings;
 struct bNodeInstanceHash;
 
+typedef struct bNodeTreeExecPool bNodeTreeExecPool;
 
 /* ************** NODE TYPE DEFINITIONS ***** */
 
@@ -773,7 +774,7 @@ struct ShadeResult;
 
 struct bNodeTreeExec *ntreeShaderBeginExecTree(struct bNodeTree *ntree);
 void            ntreeShaderEndExecTree(struct bNodeTreeExec *exec);
-bool            ntreeShaderExecTree(struct bNodeTree *ntree, struct ShadeInput *shi, struct ShadeResult *shr);
+bool            ntreeShaderExecTree(bNodeTreeExecPool *exec_tree_pool, struct bNodeTree *ntree, struct ShadeInput *shi, struct ShadeResult *shr);
 void            ntreeShaderGetTexcoMode(struct bNodeTree *ntree, int osa, short *texco, int *mode);
 
 /* switch material render loop */
@@ -1006,6 +1007,16 @@ int ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target,
                      struct Tex *tex, short which_output, int cfra, int preview, struct ShadeInput *shi, struct MTex *mtex);
 
 
+bNodeTreeExecPool *BKE_node_tree_exec_pool_new(void);
+void BKE_node_tree_exec_pool_free(bNodeTreeExecPool *pool);
+void BKE_node_tree_exec_pool_put(bNodeTreeExecPool *pool,
+                                 struct ID *id,
+                                 void *data);
+void *BKE_node_tree_exec_pool_get(bNodeTreeExecPool *pool,
+                                  struct ID *id);
+void *BKE_node_tree_exec_pool_pop(bNodeTreeExecPool *pool,
+                                  struct ID *id);
+
 /*************************************************/
 
 void init_nodesystem(void);
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index fec17e6..29f700c 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -1058,12 +1058,15 @@ static void init_render_nodetree(bNodeTree *ntree, Material *basemat, int r_mode
 	}
 }
 
-void init_render_material(Material *mat, int r_mode, float *amb)
+void init_render_material(Material *mat,
+                          bNodeTreeExecPool *exec_tree_pool,
+                          int r_mode, float *amb)
 {
 	
 	do_init_render_material(mat, r_mode, amb);
-	
+
 	if (mat->nodetree && mat->use_nodes) {
+		struct bNodeTreeExec *exec_data;
 		/* mode_l will take the pipeline options from the main material, and the or-ed
 		 * result of non-pipeline options from the nodes. shadeless is an exception,
 		 * mode_l will have it set when all node materials are shadeless. */
@@ -1075,11 +1078,14 @@ void init_render_material(Material *mat, int r_mode, float *amb)
 
 		init_render_nodetree(mat->nodetree, mat, r_mode, amb);
 
-		/*
-		if (!mat->nodetree->execdata)
-			mat->nodetree->execdata = ntreeShaderBeginExecTree(mat->nodetree);
-		*/
-		BLI_assert(!"Need to port this thing");
+		exec_data = BKE_node_tree_exec_pool_get(exec_tree_pool,
+		                                        &mat->nodetree->id);
+		if (exec_data == NULL) {
+			exec_data = ntreeShaderBeginExecTree(mat->nodetree);
+			BKE_node_tree_exec_pool_put(exec_tree_pool,
+			                            &mat->nodetree->id,
+			                            exec_data);
+		}
 	}
 	else {
 		mat->mode_l = mat->mode;
@@ -1090,7 +1096,9 @@ void init_render_material(Material *mat, int r_mode, float *amb)
 	}
 }
 
-void init_render_materials(Main *bmain, int r_mode, float *amb)
+void init_render_materials(Main *bmain,
+                           bNodeTreeExecPool *exec_tree_pool,
+                           int r_mode, float *amb)
 {
 	Material *ma;
 	
@@ -1109,27 +1117,32 @@ void init_render_materials(Main *bmain, int r_mode, float *amb)
 		/* is_used flag comes back in convertblender.c */
 		ma->flag &= ~MA_IS_USED;
 		if (ma->id.us) 
-			init_render_material(ma, r_mode, amb);
+			init_render_material(ma, exec_tree_pool, r_mode, amb);
 	}
 	
-	init_render_material(&defmaterial, r_mode, amb);
+	init_render_material(&defmaterial, exec_tree_pool, r_mode, amb);
 }
 
 /* only needed for nodes now */
-void end_render_material(Material *mat)
+void end_render_material(bNodeTreeExecPool *exec_tree_pool,
+                         Material *mat)
 {
 	if (mat && mat->nodetree && mat->use_nodes) {
-		/* ntreeShaderEndExecTree(mat->nodetree->execdata); */
-		BLI_assert(!"Port to the copper!");
+		struct bNodeTreeExec *exec_data;
+		exec_data = BKE_node_tree_exec_pool_pop(exec_tree_pool,
+		                                        &mat->nodetree->id);
+		if (exec_data != NULL) {
+			ntreeShaderEndExecTree(exec_data);
+		}
 	}
 }
 
-void end_render_materials(Main *bmain)
+void end_render_materials(Main *bmain, bNodeTreeExecPool *exec_tree_pool)
 {
 	Material *ma;
 	for (ma = bmain->mat.first; ma; ma = ma->id.next)
 		if (ma->id.us) 
-			end_render_material(ma);
+			end_render_material(exec_tree_pool, ma);
 }
 
 static bool material_in_nodetree(bNodeTree *ntree, Material *mat)
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index b71035d..7ab1479 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -46,11 +46,12 @@
 #include "DNA_world_types.h"
 #include "DNA_linestyle_types.h"
 
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
 #include "BLI_string.h"
 #include "BLI_math.h"
 #include "BLI_listbase.h"
 #include "BLI_path_util.h"
-#include "BLI_utildefines.h"
 
 #include "BLF_translation.h"
 
@@ -3690,3 +3691,47 @@ bool BKE_node_tree_iter_step(struct NodeTreeIterStore *ntreeiter,
 
 	return true;
 }
+
+/* Node execution. */
+
+typedef struct bNodeTreeExecPool {
+	GHash *hash;
+} bNodeTreeExecPool;
+
+struct bNodeTreeExecPool *BKE_node_tree_exec_pool_new(void)
+{
+	bNodeTreeExecPool *pool;
+	pool =  MEM_callocN(sizeof(bNodeTreeExecPool), __func__);
+	pool->hash = BLI_ghash_ptr_new(__func__);
+	return pool;
+}
+
+void BKE_node_tree_exec_pool_free(bNodeTreeExecPool *pool)
+{
+	/* Only destroys pool, all exec data is expected to be freed already. */
+	BLI_assert(pool != NULL);
+	BLI_ghash_free(pool->hash, NULL, NULL);
+	MEM_freeN(pool);
+}
+
+void BKE_node_tree_exec_pool_put(bNodeTreeExecPool *pool,
+                                 struct ID *id,
+                                 void *data)
+{
+	BLI_assert(pool != NULL);
+	BLI_ghash_insert(pool->hash, id, data);
+}
+
+void *BKE_node_tree_exec_pool_get(bNodeTreeExecPool *pool,
+                                  struct ID *id)
+{
+	BLI_assert(pool != NULL);
+	return BLI_ghash_lookup(pool->hash, id);
+}
+
+void *BKE_node_tree_exec_pool_pop(bNodeTreeExecPool *pool,
+                                  struct ID *id)
+{
+	BLI_assert(pool != NULL);
+	return BLI_ghash_popkey(pool->hash, id, NULL);
+}
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index 450a3b1..1678202 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -265,7 +265,11 @@ static Scene *preview_get_scene(Main *pr_main)
 
 /* call this with a pointer to initialize preview scene */
 /* call this with NULL to restore assigned ID pointers in preview scene */
-static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPreview *sp)
+static Scene *preview_prepare_scene(Render *re,
+                                    Scene *scene,
+                                    ID *id,
+                                    int id_type,
+                                    ShaderPreview *sp)
 {
 	Scene *sce;
 	Base *base;
@@ -327,8 +331,11 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
 				BLI_addtail(&pr_main->mat, mat);
 				
 				if (!BKE_scene_use_new_shading_nodes(scene)) {
-					init_render_material(mat, 0, NULL);     /* call that retrieves mode_l */
-					end_render_material(mat);
+					bNodeTreeExecPool *tree_exec_pool;
+					tree_exec_pool = RE_tree_exec_pool_get(re);
+					init_render_material(mat, tree_exec_pool, 0, NULL);     /* call that retrieves mode_l */
+					/* TODO(sergey): Wait, that's kind of stupid.  */
+					end_render_material(tree_exec_pool, mat);
 					
 					/* un-useful option */
 					if (sp->pr_method == PR_ICON_RENDER)
@@ -703,19 +710,19 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
 		sce->r.ysch = sp->sizey;
 		sce->r.size = 100;
 	}
-	
-	/* get the stuff from the builtin preview dbase */
-	sce = preview_prepare_scene(sp->scene, id, idtype, sp);
-	if (sce == NULL) return;
-	
+
 	if (!split || first) sprintf(name, "Preview %p", sp->owner);
 	else sprintf(name, "SecondPreview %p", sp->owner);
 	r

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list