From a6b218af2e62f5f0b37c05458072c7a4fb8ebf3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20H=C3=B6lzemer?= Date: Mon, 23 May 2016 16:12:52 +0300 Subject: Enable correct GLSL output for cycles normalmap node See T48453 for details and test scenes Reviewers: a.romanov, sergey Reviewed By: a.romanov, sergey Projects: #opengl_gfx, #nodes Differential Revision: https://developer.blender.org/D2011 --- .../nodes/shader/nodes/node_shader_normal_map.c | 61 +++++++++++++++++----- 1 file changed, 47 insertions(+), 14 deletions(-) (limited to 'source/blender/nodes') diff --git a/source/blender/nodes/shader/nodes/node_shader_normal_map.c b/source/blender/nodes/shader/nodes/node_shader_normal_map.c index 642e5b296be..d2695609a88 100644 --- a/source/blender/nodes/shader/nodes/node_shader_normal_map.c +++ b/source/blender/nodes/shader/nodes/node_shader_normal_map.c @@ -121,35 +121,69 @@ static int gpu_shader_normal_map(GPUMaterial *mat, bNode *node, bNodeExecData *U else strength = GPU_uniform(in[0].vec); - if (in[1].link) { - GPU_link(mat, "color_to_normal", in[1].link, &realnorm); - GPU_link(mat, "mtex_negate_texnormal", realnorm, &realnorm); - } + if (in[1].link) + realnorm = in[1].link; + else + realnorm = GPU_uniform(in[1].vec); + negnorm = GPU_builtin(GPU_VIEW_NORMAL); GPU_link(mat, "math_max", strength, GPU_uniform(d), &strength); - GPU_link(mat, "vec_math_negate", GPU_builtin(GPU_VIEW_NORMAL), &negnorm); - if (in[1].link) { + if (GPU_material_use_new_shading_nodes(mat)) { + + /* **************** CYCLES ******************** */ + + GPU_link(mat, "direction_transform_m4v3", negnorm, GPU_builtin(GPU_INVERSE_VIEW_MATRIX), &negnorm); + switch (nm->space) { case SHD_NORMAL_MAP_TANGENT: - GPU_link(mat, "node_normal_map", GPU_attribute(CD_TANGENT, nm->uv_map), negnorm, realnorm, &out[0].link); + GPU_link(mat, "color_to_normal_new_shading", realnorm, &realnorm); + GPU_link(mat, "node_normal_map", GPU_attribute(CD_TANGENT, nm->uv_map), negnorm, realnorm, &realnorm); break; case SHD_NORMAL_MAP_OBJECT: + GPU_link(mat, "color_to_normal_new_shading", realnorm, &realnorm); + GPU_link(mat, "direction_transform_m4v3", realnorm, GPU_builtin(GPU_OBJECT_MATRIX), &realnorm); + break; case SHD_NORMAL_MAP_BLENDER_OBJECT: - GPU_link(mat, "direction_transform_m4v3", realnorm, GPU_builtin(GPU_LOC_TO_VIEW_MATRIX), &out[0].link); + GPU_link(mat, "color_to_blender_normal_new_shading", realnorm, &realnorm); + GPU_link(mat, "direction_transform_m4v3", realnorm, GPU_builtin(GPU_OBJECT_MATRIX), &realnorm); break; case SHD_NORMAL_MAP_WORLD: + GPU_link(mat, "color_to_normal_new_shading", realnorm, &realnorm); + break; case SHD_NORMAL_MAP_BLENDER_WORLD: - GPU_link(mat, "direction_transform_m4v3", realnorm, GPU_builtin(GPU_VIEW_MATRIX), &out[0].link); + GPU_link(mat, "color_to_blender_normal_new_shading", realnorm, &realnorm); break; + + GPU_link(mat, "vect_normalize", realnorm, &realnorm); } - } - if (out[0].link) { - GPU_link(mat, "vec_math_mix", strength, out[0].link, negnorm, &out[0].link); - GPU_link(mat, "vect_normalize", out[0].link, &out[0].link); + } else { + + /* *********** BLENDER INTERNAL *************** */ + + GPU_link(mat, "color_to_normal", realnorm, &realnorm); + GPU_link(mat, "mtex_negate_texnormal", realnorm, &realnorm); + GPU_link(mat, "vec_math_negate", negnorm, &negnorm); + + switch (nm->space) { + case SHD_NORMAL_MAP_TANGENT: + GPU_link(mat, "node_normal_map", GPU_attribute(CD_TANGENT, nm->uv_map), negnorm, realnorm, &realnorm); + break; + case SHD_NORMAL_MAP_OBJECT: + case SHD_NORMAL_MAP_BLENDER_OBJECT: + GPU_link(mat, "direction_transform_m4v3", realnorm, GPU_builtin(GPU_LOC_TO_VIEW_MATRIX), &realnorm); + break; + case SHD_NORMAL_MAP_WORLD: + case SHD_NORMAL_MAP_BLENDER_WORLD: + GPU_link(mat, "direction_transform_m4v3", realnorm, GPU_builtin(GPU_VIEW_MATRIX), &realnorm); + break; + } } + GPU_link(mat, "vec_math_mix", strength, realnorm, negnorm, &out[0].link); + GPU_link(mat, "vect_normalize", out[0].link, &out[0].link); + return true; } @@ -169,4 +203,3 @@ void register_node_type_sh_normal_map(void) nodeRegisterType(&ntype); } - -- cgit v1.2.3