Fix T38633: glsl not working well with mixed cycles/blender material nodes.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Fri, 14 Feb 2014 14:11:19 +0000 (15:11 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Fri, 14 Feb 2014 14:11:58 +0000 (15:11 +0100)
source/blender/blenkernel/BKE_node.h
source/blender/gpu/intern/gpu_material.c
source/blender/nodes/shader/node_shader_tree.c
source/blender/nodes/shader/node_shader_util.c
source/blender/nodes/shader/node_shader_util.h
source/blender/nodes/shader/nodes/node_shader_common.c

index d219c1c6e8dd36612074165f7f636701deb2cc6f..59ea921e11e8b34df8fe6b30462453a51de23e99 100644 (file)
@@ -770,7 +770,7 @@ void            ntreeShaderGetTexcoMode(struct bNodeTree *ntree, int osa, short
 extern void (*node_shader_lamp_loop)(struct ShadeInput *, struct ShadeResult *);
 void            set_node_shader_lamp_loop(void (*lamp_loop_func)(struct ShadeInput *, struct ShadeResult *));
 
-void            ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat);
+void            ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat, short compatibility);
 
 
 /* ************** COMPOSITE NODES *************** */
index 2781437225b7daf237f4d15b88e5ab8a36899701..608c498bd1e88880052eecdfe775f50b999bb76e 100644 (file)
@@ -1592,7 +1592,10 @@ GPUMaterial *GPU_material_from_blender(Scene *scene, Material *ma)
 
        if (!(scene->gm.flag & GAME_GLSL_NO_NODES) && ma->nodetree && ma->use_nodes) {
                /* create nodes */
-               ntreeGPUMaterialNodes(ma->nodetree, mat);
+               if (BKE_scene_use_new_shading_nodes(scene))
+                       ntreeGPUMaterialNodes(ma->nodetree, mat, NODE_NEW_SHADING);
+               else
+                       ntreeGPUMaterialNodes(ma->nodetree, mat, NODE_OLD_SHADING);
        }
        else {
                if (BKE_scene_use_new_shading_nodes(scene)) {
index 1e828ea321ca495417f86b8adeb312582d01c2fc..2186eb7c226bdeb08bb10ddc8b4086dad2817276 100644 (file)
@@ -187,14 +187,14 @@ void register_node_tree_type_sh(void)
 
 /* GPU material from shader nodes */
 
-void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat)
+void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat, short compatibility)
 {
        /* localize tree to create links for reroute and mute */
        bNodeTree *localtree = ntreeLocalize(ntree);
        bNodeTreeExec *exec;
 
        exec = ntreeShaderBeginExecTree(localtree);
-       ntreeExecGPUNodes(exec, mat, 1);
+       ntreeExecGPUNodes(exec, mat, 1, compatibility);
        ntreeShaderEndExecTree(exec);
 
        ntreeFreeTree_ex(localtree, false);
index 86e59cd779a5e73cbaa91df095f5191b8278f3b1..8e83140733a54ffef1fb8fa699e37082bc17f466 100644 (file)
@@ -219,7 +219,7 @@ bNode *nodeGetActiveTexture(bNodeTree *ntree)
        return inactivenode;
 }
 
-void ntreeExecGPUNodes(bNodeTreeExec *exec, GPUMaterial *mat, int do_outputs)
+void ntreeExecGPUNodes(bNodeTreeExec *exec, GPUMaterial *mat, int do_outputs, short compatibility)
 {
        bNodeExec *nodeexec;
        bNode *node;
@@ -238,8 +238,9 @@ void ntreeExecGPUNodes(bNodeTreeExec *exec, GPUMaterial *mat, int do_outputs)
                do_it = FALSE;
                /* for groups, only execute outputs for edited group */
                if (node->typeinfo->nclass == NODE_CLASS_OUTPUT) {
-                       if (do_outputs && (node->flag & NODE_DO_OUTPUT))
-                               do_it = TRUE;
+                       if (node->typeinfo->compatibility & compatibility)
+                               if (do_outputs && (node->flag & NODE_DO_OUTPUT))
+                                       do_it = TRUE;
                }
                else
                        do_it = TRUE;
index cfd97ab0d9e8f9aabb53bb2d5091e273da320aaa..8a79603fab420f63bd34304d6e89d1548cf75c5e 100644 (file)
@@ -98,6 +98,6 @@ void node_gpu_stack_from_data(struct GPUNodeStack *gs, int type, struct bNodeSta
 void node_data_from_gpu_stack(struct bNodeStack *ns, struct GPUNodeStack *gs);
 void node_shader_gpu_tex_mapping(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out);
 
-void ntreeExecGPUNodes(struct bNodeTreeExec *exec, struct GPUMaterial *mat, int do_outputs);
+void ntreeExecGPUNodes(struct bNodeTreeExec *exec, struct GPUMaterial *mat, int do_outputs, short compatibility);
 
 #endif
index 0ea4f949597fc28603f5e8e54d2bc90ce858d179..3f03bb45d8f29dc4111b28ac6b78a7650b58ff12 100644 (file)
@@ -218,7 +218,7 @@ static int gpu_group_execute(GPUMaterial *mat, bNode *node, bNodeExecData *execd
 #if 0   /* XXX NODE_GROUP_EDIT is deprecated, depends on node space */
        ntreeExecGPUNodes(exec, mat, (node->flag & NODE_GROUP_EDIT));
 #else
-       ntreeExecGPUNodes(exec, mat, 0);
+       ntreeExecGPUNodes(exec, mat, 0, NODE_NEW_SHADING|NODE_OLD_SHADING);
 #endif
        group_gpu_move_outputs(node, out, exec->stack);