void BlenderSync::sync_objects(BL::Depsgraph &b_depsgraph, float motion_time) { /* layer data */ bool motion = motion_time != 0.0f; if (!motion) { /* prepare for sync */ light_map.pre_sync(); mesh_map.pre_sync(); object_map.pre_sync(); particle_system_map.pre_sync(); motion_times.clear(); } else { mesh_motion_synced.clear(); } /* initialize culling */ BlenderObjectCulling culling(scene, b_scene); /* object loop */ bool cancel = false; bool use_portal = false; BL::ViewLayer b_view_layer = b_depsgraph.view_layer_eval(); BL::Depsgraph::object_instances_iterator b_instance_iter; for (b_depsgraph.object_instances.begin(b_instance_iter); b_instance_iter != b_depsgraph.object_instances.end() && !cancel; ++b_instance_iter) { BL::DepsgraphObjectInstance b_instance = *b_instance_iter; BL::Object b_ob = b_instance.object(); /* load per-object culling data */ culling.init_object(scene, b_ob); /* test if object needs to be hidden */ const bool show_self = b_instance.show_self(); const bool show_particles = b_instance.show_particles(); if (show_self || show_particles) { /* object itself */ sync_object(b_depsgraph, b_view_layer, b_instance, motion_time, show_self, show_particles, culling, &use_portal); } cancel = progress.get_cancel(); } progress.set_sync_status(""); if (!cancel && !motion) { sync_background_light(use_portal); /* handle removed data and modified pointers */ if (light_map.post_sync()) scene->light_manager->tag_update(scene); if (mesh_map.post_sync()) scene->mesh_manager->tag_update(scene); if (object_map.post_sync()) scene->object_manager->tag_update(scene); if (particle_system_map.post_sync()) scene->particle_system_manager->tag_update(scene); } if (motion) mesh_motion_synced.clear(); }
void BlenderSync::sync_objects(BL::SpaceView3D b_v3d, int motion) { /* layer data */ uint scene_layer = render_layer.scene_layer; if(!motion) { /* prepare for sync */ light_map.pre_sync(); mesh_map.pre_sync(); object_map.pre_sync(); mesh_synced.clear(); } /* object loop */ BL::Scene::objects_iterator b_ob; for(b_scene.objects.begin(b_ob); b_ob != b_scene.objects.end(); ++b_ob) { bool hide = (render_layer.use_viewport_visibility)? b_ob->hide(): b_ob->hide_render(); uint ob_layer = get_layer(b_ob->layers()); if(!hide && (ob_layer & scene_layer)) { if(b_ob->is_duplicator()) { /* dupli objects */ object_create_duplilist(*b_ob, b_scene); BL::Object::dupli_list_iterator b_dup; int b_index = 0; for(b_ob->dupli_list.begin(b_dup); b_dup != b_ob->dupli_list.end(); ++b_dup) { Transform tfm = get_transform(b_dup->matrix()); BL::Object b_dup_ob = b_dup->object(); bool dup_hide = (b_v3d)? b_dup_ob.hide(): b_dup_ob.hide_render(); if(!(b_dup->hide() || dup_hide)) sync_object(*b_ob, b_index, b_dup_ob, tfm, ob_layer, motion); b_index++; } object_free_duplilist(*b_ob); hide = true; } /* check if we should render or hide particle emitter */ BL::Object::particle_systems_iterator b_psys; bool render_emitter = false; for(b_ob->particle_systems.begin(b_psys); b_psys != b_ob->particle_systems.end(); ++b_psys) { if(b_psys->settings().use_render_emitter()) { hide = false; render_emitter = true; } else if(!render_emitter) hide = true; } if(!hide) { /* object itself */ Transform tfm = get_transform(b_ob->matrix_world()); sync_object(*b_ob, 0, *b_ob, tfm, ob_layer, motion); } } } if(!motion) { sync_background_light(); /* handle removed data and modified pointers */ if(light_map.post_sync()) scene->light_manager->tag_update(scene); if(mesh_map.post_sync()) scene->mesh_manager->tag_update(scene); if(object_map.post_sync()) scene->object_manager->tag_update(scene); mesh_synced.clear(); } }
void BlenderSync::sync_objects(BL::SpaceView3D b_v3d, int motion) { /* layer data */ uint scene_layer = render_layer.scene_layer; if(!motion) { /* prepare for sync */ light_map.pre_sync(); mesh_map.pre_sync(); object_map.pre_sync(); mesh_synced.clear(); particle_system_map.pre_sync(); } else { mesh_motion_synced.clear(); } /* object loop */ BL::Scene::objects_iterator b_ob; BL::Scene b_sce = b_scene; /* modifier result type (not exposed as enum in C++ API) * 1 : eModifierMode_Realtime * 2 : eModifierMode_Render */ int dupli_settings = preview ? 1 : 2; bool cancel = false; for(; b_sce && !cancel; b_sce = b_sce.background_set()) { for(b_sce.objects.begin(b_ob); b_ob != b_sce.objects.end() && !cancel; ++b_ob) { bool hide = (render_layer.use_viewport_visibility)? b_ob->hide(): b_ob->hide_render(); uint ob_layer = get_layer(b_ob->layers(), b_ob->layers_local_view(), render_layer.use_localview, object_is_light(*b_ob)); hide = hide || !(ob_layer & scene_layer); if(!hide) { progress.set_sync_status("Synchronizing object", (*b_ob).name()); if(b_ob->is_duplicator() && !object_render_hide_duplis(*b_ob)) { /* dupli objects */ b_ob->dupli_list_create(b_scene, dupli_settings); BL::Object::dupli_list_iterator b_dup; for(b_ob->dupli_list.begin(b_dup); b_dup != b_ob->dupli_list.end(); ++b_dup) { Transform tfm = get_transform(b_dup->matrix()); BL::Object b_dup_ob = b_dup->object(); bool dup_hide = (b_v3d)? b_dup_ob.hide(): b_dup_ob.hide_render(); bool in_dupli_group = (b_dup->type() == BL::DupliObject::type_GROUP); bool hide_tris; if(!(b_dup->hide() || dup_hide || object_render_hide(b_dup_ob, false, in_dupli_group, hide_tris))) { /* the persistent_id allows us to match dupli objects * between frames and updates */ BL::Array<int, OBJECT_PERSISTENT_ID_SIZE> persistent_id = b_dup->persistent_id(); /* sync object and mesh or light data */ Object *object = sync_object(*b_ob, persistent_id.data, *b_dup, tfm, ob_layer, motion, hide_tris); /* sync possible particle data, note particle_id * starts counting at 1, first is dummy particle */ if(!motion && object) { sync_dupli_particle(*b_ob, *b_dup, object); } } } b_ob->dupli_list_clear(); } /* test if object needs to be hidden */ bool hide_tris; if(!object_render_hide(*b_ob, true, true, hide_tris)) { /* object itself */ Transform tfm = get_transform(b_ob->matrix_world()); sync_object(*b_ob, NULL, PointerRNA_NULL, tfm, ob_layer, motion, hide_tris); } } cancel = progress.get_cancel(); } } progress.set_sync_status(""); if(!cancel && !motion) { sync_background_light(); /* handle removed data and modified pointers */ if(light_map.post_sync()) scene->light_manager->tag_update(scene); if(mesh_map.post_sync()) scene->mesh_manager->tag_update(scene); if(object_map.post_sync()) scene->object_manager->tag_update(scene); if(particle_system_map.post_sync()) scene->particle_system_manager->tag_update(scene); mesh_synced.clear(); } if(motion) mesh_motion_synced.clear(); }