Merge commit '212a8d9e5ae7' into blender2.8
Considerable non-trivial merge conflict fixes.
This commit is contained in:
commit
44517c5f21
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -70,6 +70,7 @@ public:
|
|||
Shader *shader;
|
||||
int samples;
|
||||
int max_bounces;
|
||||
uint random_id;
|
||||
|
||||
void tag_update(Scene *scene);
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue