[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