diff options
author | Ton Roosendaal <ton@blender.org> | 2013-01-24 20:11:07 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2013-01-24 20:11:07 +0400 |
commit | b12a0199480f5d452828450fa257020635f7ad6d (patch) | |
tree | e2b4537fd96bc0d89264615ec42831c1aaa5aa8b /source | |
parent | 1da7d7d1a0a4297cf6b09758c01f98f50543993f (diff) |
Usability
- Cycles materials now render in Blender Internal too, skipping the nodes.
Not very useful, but at least things then show up on renders and in
previews.
- Node editor: if wrong shader nodes are in a tree, they draw with thene
color RED ALERT headers now. (Switching render engine will show it).
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_node.h | 2 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_draw.c | 16 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_edit.c | 6 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_space_types.h | 1 | ||||
-rw-r--r-- | source/blender/nodes/intern/node_exec.c | 9 | ||||
-rw-r--r-- | source/blender/nodes/intern/node_exec.h | 2 | ||||
-rw-r--r-- | source/blender/nodes/shader/node_shader_tree.c | 10 | ||||
-rw-r--r-- | source/blender/render/intern/source/shadeinput.c | 10 |
8 files changed, 47 insertions, 9 deletions
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 16d7ba8b090..d3fb7eeffc1 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -577,7 +577,7 @@ struct ShadeResult; struct bNodeTreeExec *ntreeShaderBeginExecTree(struct bNodeTree *ntree, int use_tree_data); void ntreeShaderEndExecTree(struct bNodeTreeExec *exec, int use_tree_data); -void ntreeShaderExecTree(struct bNodeTree *ntree, struct ShadeInput *shi, struct ShadeResult *shr); +int ntreeShaderExecTree(struct bNodeTree *ntree, struct ShadeInput *shi, struct ShadeResult *shr); void ntreeShaderGetTexcoMode(struct bNodeTree *ntree, int osa, short *texco, int *mode); void nodeShaderSynchronizeID(struct bNode *node, int copyto); diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index 5efb43be29c..6477d39e19b 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -701,6 +701,20 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN if (node->flag & NODE_MUTED) UI_ThemeColorBlend(color_id, TH_REDALERT, 0.5f); + + /* debug info: using wrong shaders in wrong context */ + if (ntree->type == NTREE_SHADER) { + if (snode->flag & SNODE_NEW_SHADERS) { + if (node->typeinfo->compatibility == NODE_OLD_SHADING) + UI_ThemeColor(TH_REDALERT); + } + else { + if (node->typeinfo->compatibility == NODE_NEW_SHADING) + UI_ThemeColor(TH_REDALERT); + } + } + + #ifdef WITH_COMPOSITOR if (ntree->type == NTREE_COMPOSIT && (snode->flag & SNODE_SHOW_HIGHLIGHT)) { @@ -795,6 +809,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN /* outline active and selected emphasis */ if (node->flag & SELECT) { + glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH); @@ -802,6 +817,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN UI_ThemeColorShadeAlpha(TH_ACTIVE, 0, -40); else UI_ThemeColorShadeAlpha(TH_SELECT, 0, -40); + uiSetRoundBox(UI_CNR_ALL); uiDrawBox(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, BASIS_RAD); diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index ae95d9ae074..2fae92d674c 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -550,6 +550,12 @@ void snode_set_context(SpaceNode *snode, Scene *scene) snode->id = snode->from = NULL; if (snode->treetype == NTREE_SHADER) { + /* we use this to signal warnings, when node shaders are drawn in wrong render engine */ + if (BKE_scene_use_new_shading_nodes(scene)) + snode->flag |= SNODE_NEW_SHADERS; + else + snode->flag &= ~SNODE_NEW_SHADERS; + /* need active object, or we allow pinning... */ if (snode->shaderfrom == SNODE_SHADER_OBJECT) { if (ob) { diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index da9fdc776b5..1dfcff4a3c4 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -917,6 +917,7 @@ typedef enum eSpaceNode_Flag { SNODE_AUTO_RENDER = (1 << 5), SNODE_SHOW_HIGHLIGHT = (1 << 6), SNODE_USE_HIDDEN_PREVIEW = (1 << 10), + SNODE_NEW_SHADERS = (1 << 11), } eSpaceNode_Flag; /* snode->texfrom */ diff --git a/source/blender/nodes/intern/node_exec.c b/source/blender/nodes/intern/node_exec.c index 1889fd9a38e..061ec71d1e2 100644 --- a/source/blender/nodes/intern/node_exec.c +++ b/source/blender/nodes/intern/node_exec.c @@ -287,7 +287,7 @@ void ntreeReleaseThreadStack(bNodeThreadStack *nts) nts->used = 0; } -void ntreeExecThreadNodes(bNodeTreeExec *exec, bNodeThreadStack *nts, void *callerdata, int thread) +int ntreeExecThreadNodes(bNodeTreeExec *exec, bNodeThreadStack *nts, void *callerdata, int thread) { bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ @@ -305,10 +305,17 @@ void ntreeExecThreadNodes(bNodeTreeExec *exec, bNodeThreadStack *nts, void *call * If the mute func is not set, assume the node should never be muted, * and hence execute it! */ + if (node->typeinfo->compatibility != NODE_OLD_SHADING) + break; if (node->typeinfo->execfunc) node->typeinfo->execfunc(callerdata, node, nsin, nsout); else if (node->typeinfo->newexecfunc) node->typeinfo->newexecfunc(callerdata, thread, node, nodeexec->data, nsin, nsout); } } + + /* signal to switch back to no-node render */ + if (node) + return 0; + return 1; } diff --git a/source/blender/nodes/intern/node_exec.h b/source/blender/nodes/intern/node_exec.h index 92ab0813bb1..679439ef12e 100644 --- a/source/blender/nodes/intern/node_exec.h +++ b/source/blender/nodes/intern/node_exec.h @@ -79,6 +79,6 @@ void ntree_exec_end(struct bNodeTreeExec *exec); struct bNodeThreadStack *ntreeGetThreadStack(struct bNodeTreeExec *exec, int thread); void ntreeReleaseThreadStack(struct bNodeThreadStack *nts); -void ntreeExecThreadNodes(struct bNodeTreeExec *exec, struct bNodeThreadStack *nts, void *callerdata, int thread); +int ntreeExecThreadNodes(struct bNodeTreeExec *exec, struct bNodeThreadStack *nts, void *callerdata, int thread); #endif diff --git a/source/blender/nodes/shader/node_shader_tree.c b/source/blender/nodes/shader/node_shader_tree.c index b7dc83d7d79..74a64f186cb 100644 --- a/source/blender/nodes/shader/node_shader_tree.c +++ b/source/blender/nodes/shader/node_shader_tree.c @@ -248,7 +248,8 @@ void ntreeShaderEndExecTree(bNodeTreeExec *exec, int use_tree_data) } } -void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr) +/* only for Blender internal */ +int ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr) { ShaderCallData scd; /** @@ -258,6 +259,7 @@ void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr) Material *mat = shi->mat; bNodeThreadStack *nts = NULL; bNodeTreeExec *exec = ntree->execdata; + int compat; /* convert caller data to struct */ scd.shi = shi; @@ -277,13 +279,17 @@ void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr) } nts = ntreeGetThreadStack(exec, shi->thread); - ntreeExecThreadNodes(exec, nts, &scd, shi->thread); + compat = ntreeExecThreadNodes(exec, nts, &scd, shi->thread); ntreeReleaseThreadStack(nts); // \note: set material back to preserved material shi->mat = mat; + /* better not allow negative for now */ if (shr->combined[0] < 0.0f) shr->combined[0] = 0.0f; if (shr->combined[1] < 0.0f) shr->combined[1] = 0.0f; if (shr->combined[2] < 0.0f) shr->combined[2] = 0.0f; + + /* if compat is zero, it has been using non-compatible nodes */ + return compat; } diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c index db93a21de2d..c59c3685d7d 100644 --- a/source/blender/render/intern/source/shadeinput.c +++ b/source/blender/render/intern/source/shadeinput.c @@ -151,6 +151,7 @@ void shade_material_loop(ShadeInput *shi, ShadeResult *shr) /* do a shade, finish up some passes, apply mist */ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr) { + int compat = 0; float alpha; /* ------ main shading loop -------- */ @@ -158,10 +159,11 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr) memset(&shi->raycounter, 0, sizeof(shi->raycounter)); #endif - if (shi->mat->nodetree && shi->mat->use_nodes) { - ntreeShaderExecTree(shi->mat->nodetree, shi, shr); - } - else { + if (shi->mat->nodetree && shi->mat->use_nodes) + compat = ntreeShaderExecTree(shi->mat->nodetree, shi, shr); + + /* also run this when node shaders fail, due to incompatible shader nodes */ + if (compat == 0) { /* copy all relevant material vars, note, keep this synced with render_types.h */ shade_input_init_material(shi); |