diff options
Diffstat (limited to 'intern/cycles/blender/object.cpp')
-rw-r--r-- | intern/cycles/blender/object.cpp | 89 |
1 files changed, 20 insertions, 69 deletions
diff --git a/intern/cycles/blender/object.cpp b/intern/cycles/blender/object.cpp index ca1aa6329d9..5af1e18a597 100644 --- a/intern/cycles/blender/object.cpp +++ b/intern/cycles/blender/object.cpp @@ -23,6 +23,8 @@ #include "util/log.h" #include "util/task.h" +#include "BKE_duplilist.h" + CCL_NAMESPACE_BEGIN /* Utilities */ @@ -66,12 +68,6 @@ bool BlenderSync::object_is_geometry(BObjectInfo &b_ob_info) return true; } - /* Other object types that are not meshes but evaluate to meshes are presented to render engines - * as separate instance objects. Metaballs have not been affected by that change yet. */ - if (type == BL::Object::type_META) { - return true; - } - return b_ob_data.is_a(&RNA_Mesh); } @@ -100,6 +96,13 @@ bool BlenderSync::object_is_light(BL::Object &b_ob) return (b_ob_data && b_ob_data.is_a(&RNA_Light)); } +bool BlenderSync::object_is_camera(BL::Object &b_ob) +{ + BL::ID b_ob_data = b_ob.data(); + + return (b_ob_data && b_ob_data.is_a(&RNA_Camera)); +} + void BlenderSync::sync_object_motion_init(BL::Object &b_parent, BL::Object &b_ob, Object *object) { /* Initialize motion blur for object, detecting if it's enabled and creating motion @@ -359,79 +362,26 @@ Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph, return object; } -/* This function mirrors drw_uniform_property_lookup in draw_instance_data.cpp */ -static bool lookup_property(BL::ID b_id, const string &name, float4 *r_value) -{ - PointerRNA ptr; - PropertyRNA *prop; +extern "C" DupliObject *rna_hack_DepsgraphObjectInstance_dupli_object_get(PointerRNA *ptr); - if (!RNA_path_resolve(&b_id.ptr, name.c_str(), &ptr, &prop)) { - return false; - } - - if (prop == NULL) { - return false; - } - - PropertyType type = RNA_property_type(prop); - int arraylen = RNA_property_array_length(&ptr, prop); - - if (arraylen == 0) { - float value; - - if (type == PROP_FLOAT) - value = RNA_property_float_get(&ptr, prop); - else if (type == PROP_INT) - value = static_cast<float>(RNA_property_int_get(&ptr, prop)); - else - return false; - - *r_value = make_float4(value, value, value, 1.0f); - return true; - } - else if (type == PROP_FLOAT && arraylen <= 4) { - *r_value = make_float4(0.0f, 0.0f, 0.0f, 1.0f); - RNA_property_float_get_array(&ptr, prop, &r_value->x); - return true; - } - - return false; -} - -/* This function mirrors drw_uniform_attribute_lookup in draw_instance_data.cpp */ static float4 lookup_instance_property(BL::DepsgraphObjectInstance &b_instance, const string &name, bool use_instancer) { - string idprop_name = string_printf("[\"%s\"]", name.c_str()); - float4 value; + ::Object *ob = (::Object *)b_instance.object().ptr.data; + ::DupliObject *dupli = nullptr; + ::Object *dupli_parent = nullptr; /* If requesting instance data, check the parent particle system and object. */ if (use_instancer && b_instance.is_instance()) { - BL::ParticleSystem b_psys = b_instance.particle_system(); - - if (b_psys) { - if (lookup_property(b_psys.settings(), idprop_name, &value) || - lookup_property(b_psys.settings(), name, &value)) { - return value; - } - } - if (lookup_property(b_instance.parent(), idprop_name, &value) || - lookup_property(b_instance.parent(), name, &value)) { - return value; - } + dupli = rna_hack_DepsgraphObjectInstance_dupli_object_get(&b_instance.ptr); + dupli_parent = (::Object *)b_instance.parent().ptr.data; } - /* Check the object and mesh. */ - BL::Object b_ob = b_instance.object(); - BL::ID b_data = b_ob.data(); - - if (lookup_property(b_ob, idprop_name, &value) || lookup_property(b_ob, name, &value) || - lookup_property(b_data, idprop_name, &value) || lookup_property(b_data, name, &value)) { - return value; - } + float4 value; + BKE_object_dupli_find_rgba_attribute(ob, dupli, dupli_parent, name.c_str(), &value.x); - return zero_float4(); + return value; } bool BlenderSync::sync_object_attributes(BL::DepsgraphObjectInstance &b_instance, Object *object) @@ -457,7 +407,8 @@ bool BlenderSync::sync_object_attributes(BL::DepsgraphObjectInstance &b_instance std::string real_name; BlenderAttributeType type = blender_attribute_name_split_type(name, &real_name); - if (type != BL::ShaderNodeAttribute::attribute_type_GEOMETRY) { + if (type == BL::ShaderNodeAttribute::attribute_type_OBJECT || + type == BL::ShaderNodeAttribute::attribute_type_INSTANCER) { bool use_instancer = (type == BL::ShaderNodeAttribute::attribute_type_INSTANCER); float4 value = lookup_instance_property(b_instance, real_name, use_instancer); |