void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob, Transform& tfm, uint layer_flag) { /* light is handled separately */ if(object_is_light(b_ob)) { sync_light(b_parent, b_index, b_ob, tfm); return; } /* only interested in object that we can create meshes from */ if(!object_is_mesh(b_ob)) return; /* test if we need to sync */ ObjectKey key(b_parent, b_index, b_ob); Object *object; bool object_updated = false; if(object_map.sync(&object, b_ob, b_parent, key)) object_updated = true; /* holdout? */ bool holdout = (layer_flag & render_layer.holdout_layer) != 0; /* mesh sync */ object->mesh = sync_mesh(b_ob, holdout, object_updated); /* object sync */ if(object_updated || (object->mesh && object->mesh->need_update)) { object->name = b_ob.name().c_str(); object->pass_id = b_ob.pass_index(); object->tfm = tfm; /* visibility flags for both parent */ object->visibility = object_ray_visibility(b_ob) & PATH_RAY_ALL; if(b_parent.ptr.data != b_ob.ptr.data) object->visibility &= object_ray_visibility(b_parent); /* camera flag is not actually used, instead is tested against render layer flags */ if(object->visibility & PATH_RAY_CAMERA) { object->visibility |= layer_flag << PATH_RAY_LAYER_SHIFT; object->visibility &= ~PATH_RAY_CAMERA; } object->tag_update(scene); } }
void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob, Transform& tfm, uint layer_flag, int motion) { /* light is handled separately */ if(object_is_light(b_ob)) { if(!motion) sync_light(b_parent, b_index, b_ob, tfm); return; } /* only interested in object that we can create meshes from */ if(!object_is_mesh(b_ob)) return; /* key to lookup object */ ObjectKey key(b_parent, b_index, b_ob); Object *object; /* motion vector case */ if(motion) { object = object_map.find(key); if(object) { if(tfm != object->tfm) { if(motion == -1) object->motion.pre = tfm; else object->motion.post = tfm; object->use_motion = true; } sync_mesh_motion(b_ob, object->mesh, motion); } return; } /* test if we need to sync */ bool object_updated = false; if(object_map.sync(&object, b_ob, b_parent, key)) object_updated = true; bool use_holdout = (layer_flag & render_layer.holdout_layer) != 0; /* mesh sync */ object->mesh = sync_mesh(b_ob, object_updated); if(use_holdout != object->use_holdout) { object->use_holdout = use_holdout; scene->object_manager->tag_update(scene); } /* object sync */ if(object_updated || (object->mesh && object->mesh->need_update)) { object->name = b_ob.name().c_str(); object->pass_id = b_ob.pass_index(); object->tfm = tfm; object->motion.pre = tfm; object->motion.post = tfm; object->use_motion = false; /* visibility flags for both parent */ object->visibility = object_ray_visibility(b_ob) & PATH_RAY_ALL; if(b_parent.ptr.data != b_ob.ptr.data) object->visibility &= object_ray_visibility(b_parent); /* camera flag is not actually used, instead is tested against render layer flags */ if(object->visibility & PATH_RAY_CAMERA) { object->visibility |= layer_flag << PATH_RAY_LAYER_SHIFT; object->visibility &= ~PATH_RAY_CAMERA; } object->tag_update(scene); } }