diff options
-rw-r--r-- | intern/cycles/blender/addon/ui.py | 12 | ||||
-rw-r--r-- | intern/cycles/blender/blender_object.cpp | 8 | ||||
-rw-r--r-- | intern/cycles/blender/blender_util.h | 26 |
3 files changed, 36 insertions, 10 deletions
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index e643bd4ee5e..f6ff86ac30e 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -647,7 +647,13 @@ class CyclesObject_PT_motion_blur(CyclesButtonsPanel, Panel): @classmethod def poll(cls, context): ob = context.object - return CyclesButtonsPanel.poll(context) and ob and ob.type in {'MESH', 'CURVE', 'CURVE', 'SURFACE', 'FONT', 'META'} + if CyclesButtonsPanel.poll(context) and ob: + if ob.type in {'MESH', 'CURVE', 'CURVE', 'SURFACE', 'FONT', 'META'}: + return True + if ob.dupli_type == 'GROUP' and ob.dupli_group: + return True + # TODO(sergey): More duplicator types here? + return False def draw_header(self, context): layout = self.layout @@ -690,8 +696,8 @@ class CyclesObject_PT_ray_visibility(CyclesButtonsPanel, Panel): def poll(cls, context): ob = context.object return (CyclesButtonsPanel.poll(context) and - ob and ob.type in {'MESH', 'CURVE', 'SURFACE', 'FONT', 'META', 'LAMP'} or - ob and ob.dupli_type == 'GROUP' and ob.dupli_group) + ob and ((ob.type in {'MESH', 'CURVE', 'SURFACE', 'FONT', 'META', 'LAMP'}) or + (ob.dupli_type == 'GROUP' and ob.dupli_group))) def draw(self, context): layout = self.layout diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp index bcc366732df..1e17d306fd0 100644 --- a/intern/cycles/blender/blender_object.cpp +++ b/intern/cycles/blender/blender_object.cpp @@ -261,7 +261,9 @@ Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_P if(motion) { object = object_map.find(key); - if(object && (scene->need_motion() == Scene::MOTION_PASS || object_use_motion(b_ob))) { + if(object && (scene->need_motion() == Scene::MOTION_PASS || + object_use_motion(b_parent, b_ob))) + { /* object transformation */ if(tfm != object->tfm) { VLOG(1) << "Object " << b_ob.name() << " motion detected."; @@ -342,8 +344,8 @@ Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_P mesh->use_motion_blur = false; - if(object_use_motion(b_ob)) { - if(object_use_deform_motion(b_ob)) { + if(object_use_motion(b_parent, b_ob)) { + if(object_use_deform_motion(b_parent, b_ob)) { mesh->motion_steps = object_motion_steps(b_ob); mesh->use_motion_blur = true; } diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h index cb50680160c..78a0adbef00 100644 --- a/intern/cycles/blender/blender_util.h +++ b/intern/cycles/blender/blender_util.h @@ -354,11 +354,20 @@ static inline void mesh_texture_space(BL::Mesh b_mesh, float3& loc, float3& size } /* object used for motion blur */ -static inline bool object_use_motion(BL::Object b_ob) +static inline bool object_use_motion(BL::Object b_parent, BL::Object b_ob) { PointerRNA cobject = RNA_pointer_get(&b_ob.ptr, "cycles"); bool use_motion = get_boolean(cobject, "use_motion_blur"); - + /* If motion blur is enabled for the object we also check + * whether it's enabled for the parent object as well. + * + * This way we can control motion blur from the dupligroup + * duplicator much easier. + */ + if(use_motion && b_parent.ptr.data != b_ob.ptr.data) { + PointerRNA parent_cobject = RNA_pointer_get(&b_parent.ptr, "cycles"); + use_motion &= get_boolean(parent_cobject, "use_motion_blur"); + } return use_motion; } @@ -375,11 +384,20 @@ static inline uint object_motion_steps(BL::Object b_ob) } /* object uses deformation motion blur */ -static inline bool object_use_deform_motion(BL::Object b_ob) +static inline bool object_use_deform_motion(BL::Object b_parent, BL::Object b_ob) { PointerRNA cobject = RNA_pointer_get(&b_ob.ptr, "cycles"); bool use_deform_motion = get_boolean(cobject, "use_deform_motion"); - + /* If motion blur is enabled for the object we also check + * whether it's enabled for the parent object as well. + * + * This way we can control motion blur from the dupligroup + * duplicator much easier. + */ + if(use_deform_motion && b_parent.ptr.data != b_ob.ptr.data) { + PointerRNA parent_cobject = RNA_pointer_get(&b_parent.ptr, "cycles"); + use_deform_motion &= get_boolean(parent_cobject, "use_deform_motion"); + } return use_deform_motion; } |