diff --git a/intern/cycles/kernel/shaders/node_uv_map.osl b/intern/cycles/kernel/shaders/node_uv_map.osl index fd039beaee8..01c984aff4c 100644 --- a/intern/cycles/kernel/shaders/node_uv_map.osl +++ b/intern/cycles/kernel/shaders/node_uv_map.osl @@ -17,18 +17,29 @@ #include "stdosl.h" shader node_uv_map( - string name = "", int from_dupli = 0, + string name = "", + string bump_offset = "center", output point UV = point(0.0, 0.0, 0.0)) - { if (from_dupli) { getattribute("geom:dupli_uv", UV); } else { - if (name == "") - getattribute("geom:uv", UV); - else - getattribute(name, UV); + if (name == "") + getattribute("geom:uv", UV); + else + getattribute(name, UV); + } + + if (bump_offset == "dx") { + if (!from_dupli) { + UV += Dx(UV); + } + } + else if (bump_offset == "dy") { + if (!from_dupli) { + UV += Dy(UV); + } } } diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 908acb3e6aa..576dcecc18a 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -2360,6 +2360,15 @@ void UVMapNode::compile(SVMCompiler& compiler) NodeType attr_node = NODE_ATTR; int attr; + if(bump == SHADER_BUMP_DX) { + texco_node = NODE_TEX_COORD_BUMP_DX; + attr_node = NODE_ATTR_BUMP_DX; + } + else if(bump == SHADER_BUMP_DY) { + texco_node = NODE_TEX_COORD_BUMP_DY; + attr_node = NODE_ATTR_BUMP_DY; + } + if(!out->links.empty()) { if(from_dupli) { compiler.stack_assign(out); @@ -2379,6 +2388,13 @@ void UVMapNode::compile(SVMCompiler& compiler) void UVMapNode::compile(OSLCompiler& compiler) { + if(bump == SHADER_BUMP_DX) + compiler.parameter("bump_offset", "dx"); + else if(bump == SHADER_BUMP_DY) + compiler.parameter("bump_offset", "dy"); + else + compiler.parameter("bump_offset", "center"); + compiler.parameter("from_dupli", from_dupli); compiler.parameter("name", attribute.c_str()); compiler.add(this, "node_uv_map");