diff options
Diffstat (limited to 'source/blender/blenkernel/intern/scene.c')
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 290 |
1 files changed, 154 insertions, 136 deletions
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 141737b46ee..01fcfc597aa 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -127,7 +127,7 @@ static void scene_init_data(ID *id) mblur_shutter_curve = &scene->r.mblur_shutter_curve; BKE_curvemapping_set_defaults(mblur_shutter_curve, 1, 0.0f, 0.0f, 1.0f, 1.0f); - BKE_curvemapping_initialize(mblur_shutter_curve); + BKE_curvemapping_init(mblur_shutter_curve); BKE_curvemap_reset(mblur_shutter_curve->cm, &mblur_shutter_curve->clipr, CURVE_PRESET_MAX, @@ -140,13 +140,13 @@ static void scene_init_data(ID *id) /* grease pencil multiframe falloff curve */ scene->toolsettings->gp_sculpt.cur_falloff = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f); CurveMapping *gp_falloff_curve = scene->toolsettings->gp_sculpt.cur_falloff; - BKE_curvemapping_initialize(gp_falloff_curve); + BKE_curvemapping_init(gp_falloff_curve); BKE_curvemap_reset( gp_falloff_curve->cm, &gp_falloff_curve->clipr, CURVE_PRESET_GAUSS, CURVEMAP_SLOPE_POSITIVE); scene->toolsettings->gp_sculpt.cur_primitive = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f); CurveMapping *gp_primitive_curve = scene->toolsettings->gp_sculpt.cur_primitive; - BKE_curvemapping_initialize(gp_primitive_curve); + BKE_curvemapping_init(gp_primitive_curve); BKE_curvemap_reset(gp_primitive_curve->cm, &gp_primitive_curve->clipr, CURVE_PRESET_BELL, @@ -839,83 +839,78 @@ Scene *BKE_scene_duplicate(Main *bmain, Scene *sce, eSceneCopyMethod type) return sce_copy; } - else { - eDupli_ID_Flags duplicate_flags = U.dupflag | USER_DUP_OBJECT; - BKE_id_copy(bmain, (ID *)sce, (ID **)&sce_copy); - id_us_min(&sce_copy->id); - id_us_ensure_real(&sce_copy->id); + eDupli_ID_Flags duplicate_flags = U.dupflag | USER_DUP_OBJECT; - BKE_animdata_duplicate_id_action(bmain, &sce_copy->id, duplicate_flags); + BKE_id_copy(bmain, (ID *)sce, (ID **)&sce_copy); + id_us_min(&sce_copy->id); + id_us_ensure_real(&sce_copy->id); - /* Extra actions, most notably SCE_FULL_COPY also duplicates several 'children' datablocks. */ + BKE_animdata_duplicate_id_action(bmain, &sce_copy->id, duplicate_flags); - if (type == SCE_COPY_FULL) { - /* Scene duplication is always root of duplication currently. */ - const bool is_subprocess = false; + /* Extra actions, most notably SCE_FULL_COPY also duplicates several 'children' datablocks. */ - if (!is_subprocess) { - BKE_main_id_tag_all(bmain, LIB_TAG_NEW, false); - BKE_main_id_clear_newpoins(bmain); - /* In case root duplicated ID is linked, assume we want to get a local copy of it and - * duplicate all expected linked data. */ - if (ID_IS_LINKED(sce)) { - duplicate_flags |= USER_DUP_LINKED_ID; - } + if (type == SCE_COPY_FULL) { + /* Scene duplication is always root of duplication currently. */ + const bool is_subprocess = false; + + if (!is_subprocess) { + BKE_main_id_tag_all(bmain, LIB_TAG_NEW, false); + BKE_main_id_clear_newpoins(bmain); + /* In case root duplicated ID is linked, assume we want to get a local copy of it and + * duplicate all expected linked data. */ + if (ID_IS_LINKED(sce)) { + duplicate_flags |= USER_DUP_LINKED_ID; } + } - /* Copy Freestyle LineStyle datablocks. */ - LISTBASE_FOREACH (ViewLayer *, view_layer_dst, &sce_copy->view_layers) { - LISTBASE_FOREACH ( - FreestyleLineSet *, lineset, &view_layer_dst->freestyle_config.linesets) { - BKE_id_copy_for_duplicate(bmain, (ID *)lineset->linestyle, duplicate_flags); - } + /* Copy Freestyle LineStyle datablocks. */ + LISTBASE_FOREACH (ViewLayer *, view_layer_dst, &sce_copy->view_layers) { + LISTBASE_FOREACH (FreestyleLineSet *, lineset, &view_layer_dst->freestyle_config.linesets) { + BKE_id_copy_for_duplicate(bmain, (ID *)lineset->linestyle, duplicate_flags); } + } - /* Full copy of world (included animations) */ - BKE_id_copy_for_duplicate(bmain, (ID *)sce->world, duplicate_flags); + /* Full copy of world (included animations) */ + BKE_id_copy_for_duplicate(bmain, (ID *)sce->world, duplicate_flags); - /* Full copy of GreasePencil. */ - BKE_id_copy_for_duplicate(bmain, (ID *)sce->gpd, duplicate_flags); + /* Full copy of GreasePencil. */ + BKE_id_copy_for_duplicate(bmain, (ID *)sce->gpd, duplicate_flags); - /* Deep-duplicate collections and objects (using preferences' settings for which sub-data to - * duplicate along the object itself). */ - BKE_collection_duplicate(bmain, - NULL, - sce_copy->master_collection, - duplicate_flags, - LIB_ID_DUPLICATE_IS_SUBPROCESS); + /* Deep-duplicate collections and objects (using preferences' settings for which sub-data to + * duplicate along the object itself). */ + BKE_collection_duplicate( + bmain, NULL, sce_copy->master_collection, duplicate_flags, LIB_ID_DUPLICATE_IS_SUBPROCESS); - if (!is_subprocess) { - /* This code will follow into all ID links using an ID tagged with LIB_TAG_NEW.*/ - BKE_libblock_relink_to_newid(&sce_copy->id); + if (!is_subprocess) { + /* This code will follow into all ID links using an ID tagged with LIB_TAG_NEW.*/ + BKE_libblock_relink_to_newid(&sce_copy->id); #ifndef NDEBUG - /* Call to `BKE_libblock_relink_to_newid` above is supposed to have cleared all those - * flags. */ - ID *id_iter; - FOREACH_MAIN_ID_BEGIN (bmain, id_iter) { - BLI_assert((id_iter->tag & LIB_TAG_NEW) == 0); - } - FOREACH_MAIN_ID_END; + /* Call to `BKE_libblock_relink_to_newid` above is supposed to have cleared all those + * flags. */ + ID *id_iter; + FOREACH_MAIN_ID_BEGIN (bmain, id_iter) { + BLI_assert((id_iter->tag & LIB_TAG_NEW) == 0); + } + FOREACH_MAIN_ID_END; #endif - /* Cleanup. */ - BKE_main_id_tag_all(bmain, LIB_TAG_NEW, false); - BKE_main_id_clear_newpoins(bmain); + /* Cleanup. */ + BKE_main_id_tag_all(bmain, LIB_TAG_NEW, false); + BKE_main_id_clear_newpoins(bmain); - BKE_main_collection_sync(bmain); - } - } - else { - /* Remove sequencer if not full copy */ - /* XXX Why in Hell? :/ */ - remove_sequencer_fcurves(sce_copy); - BKE_sequencer_editing_free(sce_copy, true); + BKE_main_collection_sync(bmain); } - - return sce_copy; } + else { + /* Remove sequencer if not full copy */ + /* XXX Why in Hell? :/ */ + remove_sequencer_fcurves(sce_copy); + BKE_sequencer_editing_free(sce_copy, true); + } + + return sce_copy; } void BKE_scene_groups_relink(Scene *sce) @@ -1007,7 +1002,7 @@ Scene *BKE_scene_set_name(Main *bmain, const char *name) return NULL; } -/* Used by metaballs, return *all* objects (including duplis) +/* Used by meta-balls, return *all* objects (including duplis) * existing in the scene (including scene's sets). */ int BKE_scene_base_iter_next( Depsgraph *depsgraph, SceneBaseIter *iter, Scene **scene, int val, Base **base, Object **ob) @@ -1078,7 +1073,7 @@ int BKE_scene_base_iter_next( else { if (iter->phase != F_DUPLI) { if (depsgraph && (*base)->object->transflag & OB_DUPLI) { - /* collections cannot be duplicated for metaballs yet, + /* Collections cannot be duplicated for meta-balls yet, * this enters eternal loop because of * makeDispListMBall getting called inside of collection_duplilist */ if ((*base)->object->instance_collection == NULL) { @@ -1134,6 +1129,11 @@ int BKE_scene_base_iter_next( return iter->phase; } +bool BKE_scene_has_view_layer(const Scene *scene, const ViewLayer *layer) +{ + return BLI_findindex(&scene->view_layers, layer) != -1; +} + Scene *BKE_scene_find_from_collection(const Main *bmain, const Collection *collection) { for (Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) { @@ -1490,7 +1490,7 @@ static void scene_graph_update_tagged(Depsgraph *depsgraph, Main *bmain, bool on for (int pass = 0; pass < 2; pass++) { /* (Re-)build dependency graph if needed. */ - DEG_graph_relations_update(depsgraph, bmain, scene, view_layer); + DEG_graph_relations_update(depsgraph); /* Uncomment this to check if graph was properly tagged for update. */ // DEG_debug_graph_relations_validate(depsgraph, bmain, scene); /* Flush editing data if needed. */ @@ -1498,7 +1498,7 @@ static void scene_graph_update_tagged(Depsgraph *depsgraph, Main *bmain, bool on /* Update all objects: drivers, matrices, displists, etc. flags set * by depgraph or manual, no layer check here, gets correct flushed. */ - DEG_evaluate_on_refresh(bmain, depsgraph); + DEG_evaluate_on_refresh(depsgraph); /* Update sound system. */ BKE_scene_update_sound(depsgraph, bmain); /* Notify python about depsgraph update. */ @@ -1517,7 +1517,7 @@ static void scene_graph_update_tagged(Depsgraph *depsgraph, Main *bmain, bool on * be tagged for an update anyway. * * If there are no relations changed by the callback this call will do nothing. */ - DEG_graph_relations_update(depsgraph, bmain, scene, view_layer); + DEG_graph_relations_update(depsgraph); } /* Inform editors about possible changes. */ DEG_ids_check_recalc(bmain, depsgraph, scene, view_layer, false); @@ -1546,10 +1546,11 @@ void BKE_scene_graph_evaluated_ensure(Depsgraph *depsgraph, Main *bmain) } /* applies changes right away, does all sets too */ -void BKE_scene_graph_update_for_newframe(Depsgraph *depsgraph, Main *bmain) +void BKE_scene_graph_update_for_newframe(Depsgraph *depsgraph) { Scene *scene = DEG_get_input_scene(depsgraph); ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph); + Main *bmain = DEG_get_bmain(depsgraph); /* Keep this first. */ BKE_callback_exec_id(bmain, &scene->id, BKE_CB_EVT_FRAME_CHANGE_PRE); @@ -1560,7 +1561,7 @@ void BKE_scene_graph_update_for_newframe(Depsgraph *depsgraph, Main *bmain) */ BKE_image_editors_update_frame(bmain, scene->r.cfra); BKE_sound_set_cfra(scene->r.cfra); - DEG_graph_relations_update(depsgraph, bmain, scene, view_layer); + DEG_graph_relations_update(depsgraph); /* Update all objects: drivers, matrices, displists, etc. flags set * by depgraph or manual, no layer check here, gets correct flushed. * @@ -1569,10 +1570,10 @@ void BKE_scene_graph_update_for_newframe(Depsgraph *depsgraph, Main *bmain) * loose any possible unkeyed changes made by the handler. */ if (pass == 0) { const float ctime = BKE_scene_frame_get(scene); - DEG_evaluate_on_framechange(bmain, depsgraph, ctime); + DEG_evaluate_on_framechange(depsgraph, ctime); } else { - DEG_evaluate_on_refresh(bmain, depsgraph); + DEG_evaluate_on_refresh(depsgraph); } /* Update sound system animation. */ BKE_scene_update_sound(depsgraph, bmain); @@ -1583,7 +1584,7 @@ void BKE_scene_graph_update_for_newframe(Depsgraph *depsgraph, Main *bmain) /* NOTE: Similar to this case in scene_graph_update_tagged(). Need to ensure that * DEG_ids_clear_recalc() doesn't access freed memory of possibly removed ID. */ - DEG_graph_relations_update(depsgraph, bmain, scene, view_layer); + DEG_graph_relations_update(depsgraph); } /* Inform editors about possible changes. */ @@ -1608,7 +1609,7 @@ void BKE_scene_graph_update_for_newframe(Depsgraph *depsgraph, Main *bmain) */ void BKE_scene_view_layer_graph_evaluated_ensure(Main *bmain, Scene *scene, ViewLayer *view_layer) { - Depsgraph *depsgraph = BKE_scene_get_depsgraph(bmain, scene, view_layer, true); + Depsgraph *depsgraph = BKE_scene_ensure_depsgraph(bmain, scene, view_layer); DEG_make_active(depsgraph); BKE_scene_graph_update_tagged(depsgraph, bmain); } @@ -1642,7 +1643,7 @@ bool BKE_scene_remove_render_view(Scene *scene, SceneRenderView *srv) if (act == -1) { return false; } - else if (scene->r.views.first == scene->r.views.last) { + if (scene->r.views.first == scene->r.views.last) { /* ensure 1 view is kept */ return false; } @@ -1663,13 +1664,11 @@ int get_render_subsurf_level(const RenderData *r, int lvl, bool for_render) if (for_render) { return min_ii(r->simplify_subsurf_render, lvl); } - else { - return min_ii(r->simplify_subsurf, lvl); - } - } - else { - return lvl; + + return min_ii(r->simplify_subsurf, lvl); } + + return lvl; } int get_render_child_particle_number(const RenderData *r, int num, bool for_render) @@ -1678,13 +1677,11 @@ int get_render_child_particle_number(const RenderData *r, int num, bool for_rend if (for_render) { return (int)(r->simplify_particles_render * num); } - else { - return (int)(r->simplify_particles * num); - } - } - else { - return num; + + return (int)(r->simplify_particles * num); } + + return num; } /** @@ -1699,7 +1696,7 @@ Base *_setlooper_base_step(Scene **sce_iter, ViewLayer *view_layer, Base *base) /* Common case, step to the next. */ return base->next; } - else if ((base == NULL) && (view_layer != NULL)) { + if ((base == NULL) && (view_layer != NULL)) { /* First time looping, return the scenes first base. */ /* For the first loop we should get the layer from workspace when available. */ if (view_layer->object_bases.first) { @@ -2018,9 +2015,8 @@ const char *BKE_scene_multiview_render_view_name_get(const RenderData *rd, const if (srv) { return srv->name; } - else { - return ""; - } + + return ""; } int BKE_scene_multiview_view_id_get(const RenderData *rd, const char *viewname) @@ -2041,9 +2037,8 @@ int BKE_scene_multiview_view_id_get(const RenderData *rd, const char *viewname) if (STREQ(viewname, srv->name)) { return nr; } - else { - nr += 1; - } + + nr += 1; } } @@ -2094,9 +2089,8 @@ const char *BKE_scene_multiview_view_suffix_get(const RenderData *rd, const char if (srv) { return srv->suffix; } - else { - return viewname; - } + + return viewname; } const char *BKE_scene_multiview_view_id_suffix_get(const RenderData *rd, const int view_id) @@ -2104,10 +2098,9 @@ const char *BKE_scene_multiview_view_id_suffix_get(const RenderData *rd, const i if ((rd->scemode & R_MULTIVIEW) == 0) { return ""; } - else { - const char *viewname = BKE_scene_multiview_render_view_name_get(rd, view_id); - return BKE_scene_multiview_view_suffix_get(rd, viewname); - } + + const char *viewname = BKE_scene_multiview_render_view_name_get(rd, view_id); + return BKE_scene_multiview_view_suffix_get(rd, viewname); } void BKE_scene_multiview_view_prefix_get(Scene *scene, @@ -2175,10 +2168,9 @@ int BKE_scene_multiview_num_videos_get(const RenderData *rd) if (rd->im_format.views_format == R_IMF_VIEWS_STEREO_3D) { return 1; } - else { - /* R_IMF_VIEWS_INDIVIDUAL */ - return BKE_scene_multiview_num_views_get(rd); - } + + /* R_IMF_VIEWS_INDIVIDUAL */ + return BKE_scene_multiview_num_views_get(rd); } /* Manipulation of depsgraph storage. */ @@ -2251,14 +2243,15 @@ void BKE_scene_free_view_layer_depsgraph(Scene *scene, ViewLayer *view_layer) /* Query depsgraph for a specific contexts. */ -static Depsgraph **scene_get_depsgraph_p(Main *bmain, - Scene *scene, +static Depsgraph **scene_get_depsgraph_p(Scene *scene, ViewLayer *view_layer, - const bool allocate_ghash_entry, - const bool allocate_depsgraph) + const bool allocate_ghash_entry) { + /* bmain may be NULL here! */ BLI_assert(scene != NULL); BLI_assert(view_layer != NULL); + BLI_assert(BKE_scene_has_view_layer(scene, view_layer)); + /* Make sure hash itself exists. */ if (allocate_ghash_entry) { BKE_scene_ensure_depsgraph_hash(scene); @@ -2266,42 +2259,68 @@ static Depsgraph **scene_get_depsgraph_p(Main *bmain, if (scene->depsgraph_hash == NULL) { return NULL; } - /* Either ensure item is in the hash or simply return NULL if it's not, - * depending on whether caller wants us to create depsgraph or not. - */ + DepsgraphKey key; key.view_layer = view_layer; + Depsgraph **depsgraph_ptr; - if (allocate_ghash_entry) { - DepsgraphKey **key_ptr; - if (!BLI_ghash_ensure_p_ex( - scene->depsgraph_hash, &key, (void ***)&key_ptr, (void ***)&depsgraph_ptr)) { - *key_ptr = MEM_mallocN(sizeof(DepsgraphKey), __func__); - **key_ptr = key; - if (allocate_depsgraph) { - *depsgraph_ptr = DEG_graph_new(bmain, scene, view_layer, DAG_EVAL_VIEWPORT); - /* TODO(sergey): Would be cool to avoid string format print, - * but is a bit tricky because we can't know in advance whether - * we will ever enable debug messages for this depsgraph. - */ - char name[1024]; - BLI_snprintf(name, sizeof(name), "%s :: %s", scene->id.name, view_layer->name); - DEG_debug_name_set(*depsgraph_ptr, name); - } - else { - *depsgraph_ptr = NULL; - } - } - } - else { + if (!allocate_ghash_entry) { depsgraph_ptr = (Depsgraph **)BLI_ghash_lookup_p(scene->depsgraph_hash, &key); + return depsgraph_ptr; } + + DepsgraphKey **key_ptr; + if (BLI_ghash_ensure_p_ex( + scene->depsgraph_hash, &key, (void ***)&key_ptr, (void ***)&depsgraph_ptr)) { + return depsgraph_ptr; + } + + /* Depsgraph was not found in the ghash, but the key still needs allocating. */ + *key_ptr = MEM_mallocN(sizeof(DepsgraphKey), __func__); + **key_ptr = key; + + *depsgraph_ptr = NULL; return depsgraph_ptr; } -Depsgraph *BKE_scene_get_depsgraph(Main *bmain, Scene *scene, ViewLayer *view_layer, bool allocate) +static Depsgraph **scene_ensure_depsgraph_p(Main *bmain, Scene *scene, ViewLayer *view_layer) +{ + BLI_assert(bmain != NULL); + + Depsgraph **depsgraph_ptr = scene_get_depsgraph_p(scene, view_layer, true); + if (depsgraph_ptr == NULL) { + /* The scene has no depsgraph hash. */ + return NULL; + } + if (*depsgraph_ptr != NULL) { + /* The depsgraph was found, no need to allocate. */ + return depsgraph_ptr; + } + + /* Allocate a new depsgraph. scene_get_depsgraph_p() already ensured that the pointer is stored + * in the scene's depsgraph hash. */ + *depsgraph_ptr = DEG_graph_new(bmain, scene, view_layer, DAG_EVAL_VIEWPORT); + + /* TODO(sergey): Would be cool to avoid string format print, + * but is a bit tricky because we can't know in advance whether + * we will ever enable debug messages for this depsgraph. + */ + char name[1024]; + BLI_snprintf(name, sizeof(name), "%s :: %s", scene->id.name, view_layer->name); + DEG_debug_name_set(*depsgraph_ptr, name); + + return depsgraph_ptr; +} + +Depsgraph *BKE_scene_get_depsgraph(Scene *scene, ViewLayer *view_layer) +{ + Depsgraph **depsgraph_ptr = scene_get_depsgraph_p(scene, view_layer, false); + return (depsgraph_ptr != NULL) ? *depsgraph_ptr : NULL; +} + +Depsgraph *BKE_scene_ensure_depsgraph(Main *bmain, Scene *scene, ViewLayer *view_layer) { - Depsgraph **depsgraph_ptr = scene_get_depsgraph_p(bmain, scene, view_layer, allocate, allocate); + Depsgraph **depsgraph_ptr = scene_ensure_depsgraph_p(bmain, scene, view_layer); return (depsgraph_ptr != NULL) ? *depsgraph_ptr : NULL; } @@ -2367,8 +2386,7 @@ void BKE_scene_undo_depsgraphs_restore(Main *bmain, GHash *depsgraph_extract) } BLI_assert(*depsgraph_extract_ptr != NULL); - Depsgraph **depsgraph_scene_ptr = scene_get_depsgraph_p( - bmain, scene, view_layer, true, false); + Depsgraph **depsgraph_scene_ptr = scene_get_depsgraph_p(scene, view_layer, true); BLI_assert(depsgraph_scene_ptr != NULL); BLI_assert(*depsgraph_scene_ptr == NULL); |