Cycles: Respect duplicator's object motion blur settings

The idea is to make it possible to control linked duplicated objects motion
blur from the scene file without need to do overrides on the linked object
settings. Currently only supported for dupligroup duplication and all now
if duplicator object has motion blur disabled then it'll be inherited into
all the duplicated objects.

There should be no regressions/changes in look of existing files because
objects do have motion blur enabled by default.
This commit is contained in:
Sergey Sharybin
2015-06-12 13:54:17 +02:00
parent b5b8599342
commit 3044e9fd31
3 changed files with 36 additions and 10 deletions

View File

@@ -647,7 +647,13 @@ class CyclesObject_PT_motion_blur(CyclesButtonsPanel, Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
ob = context.object 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): def draw_header(self, context):
layout = self.layout layout = self.layout
@@ -690,8 +696,8 @@ class CyclesObject_PT_ray_visibility(CyclesButtonsPanel, Panel):
def poll(cls, context): def poll(cls, context):
ob = context.object ob = context.object
return (CyclesButtonsPanel.poll(context) and return (CyclesButtonsPanel.poll(context) and
ob and ob.type in {'MESH', 'CURVE', 'SURFACE', 'FONT', 'META', 'LAMP'} or ob and ((ob.type in {'MESH', 'CURVE', 'SURFACE', 'FONT', 'META', 'LAMP'}) or
ob and ob.dupli_type == 'GROUP' and ob.dupli_group) (ob.dupli_type == 'GROUP' and ob.dupli_group)))
def draw(self, context): def draw(self, context):
layout = self.layout layout = self.layout

View File

@@ -261,7 +261,9 @@ Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_P
if(motion) { if(motion) {
object = object_map.find(key); 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 */ /* object transformation */
if(tfm != object->tfm) { if(tfm != object->tfm) {
VLOG(1) << "Object " << b_ob.name() << " motion detected."; 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; mesh->use_motion_blur = false;
if(object_use_motion(b_ob)) { if(object_use_motion(b_parent, b_ob)) {
if(object_use_deform_motion(b_ob)) { if(object_use_deform_motion(b_parent, b_ob)) {
mesh->motion_steps = object_motion_steps(b_ob); mesh->motion_steps = object_motion_steps(b_ob);
mesh->use_motion_blur = true; mesh->use_motion_blur = true;
} }

View File

@@ -354,11 +354,20 @@ static inline void mesh_texture_space(BL::Mesh b_mesh, float3& loc, float3& size
} }
/* object used for motion blur */ /* 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"); PointerRNA cobject = RNA_pointer_get(&b_ob.ptr, "cycles");
bool use_motion = get_boolean(cobject, "use_motion_blur"); 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; return use_motion;
} }
@@ -375,11 +384,20 @@ static inline uint object_motion_steps(BL::Object b_ob)
} }
/* object uses deformation motion blur */ /* 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"); PointerRNA cobject = RNA_pointer_get(&b_ob.ptr, "cycles");
bool use_deform_motion = get_boolean(cobject, "use_deform_motion"); 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; return use_deform_motion;
} }