From 75b1ed94f6e6548ae015853515e5e446166593d3 Mon Sep 17 00:00:00 2001 From: Weizhen Huang Date: Wed, 7 Jun 2023 10:34:05 +0200 Subject: [PATCH] Cycles: make light UV available for Texture Coordinate node The input socket of Image Texture node is connected with the UV output of Texture Coordinate node by default, the later reads the geometry UV, which is not available for lights because they have no real geometry. The current implementation simply retrieves UV from shader data. --- intern/cycles/kernel/osl/shaders/node_texture_coordinate.osl | 4 +++- intern/cycles/kernel/svm/attribute.h | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/intern/cycles/kernel/osl/shaders/node_texture_coordinate.osl b/intern/cycles/kernel/osl/shaders/node_texture_coordinate.osl index cd2fdae3cb3..4ab46d3dc55 100644 --- a/intern/cycles/kernel/osl/shaders/node_texture_coordinate.osl +++ b/intern/cycles/kernel/osl/shaders/node_texture_coordinate.osl @@ -47,7 +47,9 @@ shader node_texture_coordinate( if (!getattribute("geom:generated", Generated)) { Generated = transform("object", P); } - getattribute("geom:uv", UV); + if (!getattribute("geom:uv", UV)) { + UV = point(1.0 - u - v, u, 0.0); + } } if (use_transform) { diff --git a/intern/cycles/kernel/svm/attribute.h b/intern/cycles/kernel/svm/attribute.h index 5f0d1609f08..a50e7d17dd0 100644 --- a/intern/cycles/kernel/svm/attribute.h +++ b/intern/cycles/kernel/svm/attribute.h @@ -71,6 +71,11 @@ ccl_device_noinline void svm_node_attr(KernelGlobals kg, } #endif + if (sd->type == PRIMITIVE_LAMP && node.y == ATTR_STD_UV) { + stack_store_float3(stack, out_offset, make_float3(1.0f - sd->u - sd->v, sd->u, 0.0f)); + return; + } + if (node.y == ATTR_STD_GENERATED && desc.element == ATTR_ELEMENT_NONE) { /* No generated attribute, fall back to object coordinates. */ float3 f = sd->P; -- 2.30.2