Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDalai Felinto <dfelinto@gmail.com>2017-11-15 12:11:01 +0300
committerDalai Felinto <dfelinto@gmail.com>2017-11-15 12:40:27 +0300
commit44517c5f2177d1f260ba691fb59fbacfef576915 (patch)
tree94d8cefa0a86c2a3de8eae236979d292ddb9d175
parent258292abc0252360e19654db454c7ef8bd2b63fe (diff)
parent212a8d9e5ae78a30ed4c35161d91eeca35eaa41f (diff)
Merge commit '212a8d9e5ae7' into blender2.8
Considerable non-trivial merge conflict fixes.
-rw-r--r--intern/cycles/blender/blender_object.cpp9
-rw-r--r--intern/cycles/blender/blender_sync.h1
-rw-r--r--intern/cycles/kernel/geom/geom_object.h11
-rw-r--r--intern/cycles/kernel/kernel_shader.h6
-rw-r--r--intern/cycles/kernel/kernel_types.h2
-rw-r--r--intern/cycles/kernel/svm/svm_geometry.h10
-rw-r--r--intern/cycles/render/light.cpp4
-rw-r--r--intern/cycles/render/light.h1
-rw-r--r--source/blender/makesrna/intern/makesrna.c3
9 files changed, 45 insertions, 2 deletions
diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index a25ae278058..ee153b8602d 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -113,6 +113,7 @@ void BlenderSync::sync_light(BL::Object& b_parent,
int persistent_id[OBJECT_PERSISTENT_ID_SIZE],
BL::Object& b_ob,
BL::Object& b_ob_instance,
+ int random_id,
Transform& tfm,
bool *use_portal)
{
@@ -194,6 +195,13 @@ void BlenderSync::sync_light(BL::Object& b_parent,
light->max_bounces = get_int(clamp, "max_bounces");
+ if(b_ob != b_ob_instance) {
+ light->random_id = random_id;
+ }
+ else {
+ light->random_id = hash_int_2d(hash_string(b_ob.name().c_str()), 0);
+ }
+
if(light->type == LIGHT_AREA)
light->is_portal = get_boolean(clamp, "is_portal");
else
@@ -287,6 +295,7 @@ Object *BlenderSync::sync_object(BL::Depsgraph::duplis_iterator& b_dupli_iter,
persistent_id,
b_ob,
b_ob_instance,
+ b_dupli_iter->random_id(),
tfm,
use_portal);
}
diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h
index 544836f0979..88f7ea7975c 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -134,6 +134,7 @@ private:
int persistent_id[OBJECT_PERSISTENT_ID_SIZE],
BL::Object& b_ob,
BL::Object& b_ob_instance,
+ int random_id,
Transform& tfm,
bool *use_portal);
void sync_background_light(bool use_portal);
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;
}
diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp
index b37a0768b53..b62453cf5fc 100644
--- a/intern/cycles/render/light.cpp
+++ b/intern/cycles/render/light.cpp
@@ -134,6 +134,7 @@ NODE_DEFINE(Light)
SOCKET_INT(samples, "Samples", 1);
SOCKET_INT(max_bounces, "Max Bounces", 1024);
+ SOCKET_UINT(random_id, "Random ID", 0);
SOCKET_BOOLEAN(is_portal, "Is Portal", false);
SOCKET_BOOLEAN(is_enabled, "Is Enabled", true);
@@ -638,6 +639,7 @@ void LightManager::device_update_points(Device *,
int shader_id = scene->shader_manager->get_shader_id(shader);
float samples = __int_as_float(light->samples);
float max_bounces = __int_as_float(light->max_bounces);
+ float random = (float)light->random_id * (1.0f/(float)0xFFFFFFFF);
if(!light->cast_shadow)
shader_id &= ~SHADER_CAST_SHADOW;
@@ -758,7 +760,7 @@ void LightManager::device_update_points(Device *,
light_data[light_index*LIGHT_SIZE + 3] = make_float4(samples, 0.0f, 0.0f, 0.0f);
}
- light_data[light_index*LIGHT_SIZE + 4] = make_float4(max_bounces, 0.0f, 0.0f, 0.0f);
+ light_data[light_index*LIGHT_SIZE + 4] = make_float4(max_bounces, random, 0.0f, 0.0f);
Transform tfm = light->tfm;
Transform itfm = transform_inverse(tfm);
diff --git a/intern/cycles/render/light.h b/intern/cycles/render/light.h
index 7e9014eb823..97b7b971c73 100644
--- a/intern/cycles/render/light.h
+++ b/intern/cycles/render/light.h
@@ -70,6 +70,7 @@ public:
Shader *shader;
int samples;
int max_bounces;
+ uint random_id;
void tag_update(Scene *scene);
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index 720f7324bdb..6c6407789a0 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -3704,6 +3704,9 @@ static const char *cpp_classes = ""
" operator void*() { return ptr.data; }\n"
" operator bool() { return ptr.data != NULL; }\n"
"\n"
+" bool operator==(const Pointer &other) { return ptr.data == other.ptr.data; }\n"
+" bool operator!=(const Pointer &other) { return ptr.data != other.ptr.data; }\n"
+"\n"
" PointerRNA ptr;\n"
"};\n"
"\n"