From 212a8d9e5ae78a30ed4c35161d91eeca35eaa41f Mon Sep 17 00:00:00 2001 From: Lukas Stockner Date: Sun, 5 Nov 2017 21:59:17 +0100 Subject: Cycles: Make per-object random value output also work for Lamps --- intern/cycles/kernel/geom/geom_object.h | 11 +++++++++++ intern/cycles/kernel/kernel_shader.h | 6 ++++++ intern/cycles/kernel/kernel_types.h | 2 ++ intern/cycles/kernel/svm/svm_geometry.h | 10 +++++++++- 4 files changed, 28 insertions(+), 1 deletion(-) (limited to 'intern/cycles/kernel') diff --git a/intern/cycles/kernel/geom/geom_object.h b/intern/cycles/kernel/geom/geom_object.h index 1ffc143be34..a276096a745 100644 --- a/intern/cycles/kernel/geom/geom_object.h +++ b/intern/cycles/kernel/geom/geom_object.h @@ -244,6 +244,17 @@ ccl_device_inline float object_pass_id(KernelGlobals *kg, int object) return f.y; } +/* Per lamp random number for shader variation */ + +ccl_device_inline float lamp_random_number(KernelGlobals *kg, int lamp) +{ + if(lamp == LAMP_NONE) + return 0.0f; + + float4 f = kernel_tex_fetch(__light_data, lamp*LIGHT_SIZE + 4); + return f.y; +} + /* Per object random number for shader variation */ ccl_device_inline float object_random_number(KernelGlobals *kg, int object) diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h index 239c6b12bdf..26d3fcf15b2 100644 --- a/intern/cycles/kernel/kernel_shader.h +++ b/intern/cycles/kernel/kernel_shader.h @@ -57,6 +57,7 @@ ccl_device_noinline void shader_setup_from_ray(KernelGlobals *kg, #ifdef __INSTANCING__ sd->object = (isect->object == PRIM_NONE)? kernel_tex_fetch(__prim_object, isect->prim): isect->object; #endif + sd->lamp = LAMP_NONE; sd->type = isect->type; sd->flag = 0; @@ -265,6 +266,7 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals *kg, #ifdef __INSTANCING__ sd->object = object; #endif + sd->lamp = LAMP_NONE; /* currently no access to bvh prim index for strand sd->prim*/ sd->prim = prim; #ifdef __UV__ @@ -286,6 +288,7 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals *kg, else if(lamp != LAMP_NONE) { sd->ob_tfm = lamp_fetch_transform(kg, lamp, false); sd->ob_itfm = lamp_fetch_transform(kg, lamp, true); + sd->lamp = lamp; #endif } @@ -391,6 +394,7 @@ ccl_device_inline void shader_setup_from_background(KernelGlobals *kg, ShaderDat #ifdef __INSTANCING__ sd->object = PRIM_NONE; #endif + sd->lamp = LAMP_NONE; sd->prim = PRIM_NONE; #ifdef __UV__ sd->u = 0.0f; @@ -431,6 +435,7 @@ ccl_device_inline void shader_setup_from_volume(KernelGlobals *kg, ShaderData *s # ifdef __INSTANCING__ sd->object = PRIM_NONE; /* todo: fill this for texture coordinates */ # endif + sd->lamp = LAMP_NONE; sd->prim = PRIM_NONE; sd->type = PRIMITIVE_NONE; @@ -1143,6 +1148,7 @@ ccl_device_inline void shader_eval_volume(KernelGlobals *kg, /* setup shaderdata from stack. it's mostly setup already in * shader_setup_from_volume, this switching should be quick */ sd->object = stack[i].object; + sd->lamp = LAMP_NONE; sd->shader = stack[i].shader; sd->flag &= ~SD_SHADER_FLAGS; diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 919dafbc780..5b8b760c48c 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -957,6 +957,8 @@ typedef ccl_addr_space struct ShaderData { float v; /* object id if there is one, ~0 otherwise */ int object; + /* lamp id if there is one, ~0 otherwise */ + int lamp; /* motion blur sample time */ float time; diff --git a/intern/cycles/kernel/svm/svm_geometry.h b/intern/cycles/kernel/svm/svm_geometry.h index cce4e89e715..9af4a0182d9 100644 --- a/intern/cycles/kernel/svm/svm_geometry.h +++ b/intern/cycles/kernel/svm/svm_geometry.h @@ -90,7 +90,15 @@ ccl_device void svm_node_object_info(KernelGlobals *kg, ShaderData *sd, float *s } case NODE_INFO_OB_INDEX: data = object_pass_id(kg, sd->object); break; case NODE_INFO_MAT_INDEX: data = shader_pass_id(kg, sd); break; - case NODE_INFO_OB_RANDOM: data = object_random_number(kg, sd->object); break; + case NODE_INFO_OB_RANDOM: { + if(sd->lamp != LAMP_NONE) { + data = lamp_random_number(kg, sd->lamp); + } + else { + data = object_random_number(kg, sd->object); + } + break; + } default: data = 0.0f; break; } -- cgit v1.2.3