Fix #106943: driver on inactive view layer doesn't work #107031

Manually merged
Sybren A. Stüvel merged 3 commits from dr.sybren/blender:anim/106943-bg-view-layer-driver into main 2023-04-17 13:02:55 +02:00
3 changed files with 26 additions and 27 deletions
Showing only changes of commit e5a5259371 - Show all commits

View File

@ -75,6 +75,12 @@ void BKE_view_layer_free(struct ViewLayer *view_layer);
*/
void BKE_view_layer_free_ex(struct ViewLayer *view_layer, bool do_id_user);
/**
* Free the bases of this #ViewLayer, and what they reference.
* This includes baseact, object_bases, object_bases_hash, and layer_collections.
*/
void BKE_view_layer_free_object_content(struct ViewLayer *view_layer);
/**
* Tag all the selected objects of a render-layer.
*/

View File

@ -246,19 +246,7 @@ void BKE_view_layer_free(ViewLayer *view_layer)
void BKE_view_layer_free_ex(ViewLayer *view_layer, const bool do_id_user)
{
view_layer->basact = nullptr;
BLI_freelistN(&view_layer->object_bases);
if (view_layer->object_bases_hash) {
BLI_ghash_free(view_layer->object_bases_hash, nullptr, nullptr);
}
LISTBASE_FOREACH_MUTABLE (LayerCollection *, lc, &view_layer->layer_collections) {
layer_collection_free(view_layer, lc);
MEM_freeN(lc);
}
BLI_listbase_clear(&view_layer->layer_collections);
BKE_view_layer_free_object_content(view_layer);
LISTBASE_FOREACH (ViewLayerEngineData *, sled, &view_layer->drawdata) {
if (sled->storage) {
@ -287,6 +275,23 @@ void BKE_view_layer_free_ex(ViewLayer *view_layer, const bool do_id_user)
MEM_freeN(view_layer);
}
void BKE_view_layer_free_object_content(ViewLayer *view_layer)
{
view_layer->basact = nullptr;
BLI_freelistN(&view_layer->object_bases);
if (view_layer->object_bases_hash) {
BLI_ghash_free(view_layer->object_bases_hash, nullptr, nullptr);
}
LISTBASE_FOREACH_MUTABLE (LayerCollection *, lc, &view_layer->layer_collections) {
layer_collection_free(view_layer, lc);
MEM_freeN(lc);
}
BLI_listbase_clear(&view_layer->layer_collections);
}
void BKE_view_layer_selected_objects_tag(const Scene *scene, ViewLayer *view_layer, const int tag)
{
BKE_view_layer_synced_ensure(scene, view_layer);

View File

@ -353,18 +353,6 @@ ViewLayer *get_original_view_layer(const Depsgraph *depsgraph, const IDNode *id_
return nullptr;
}
/**
* Clear all bases from the view layer.
*
* This is used when the view layer needs to stick around, for example when it's
* used in the compositor or when it has drivers, but the objects in that view
* layer are irrelevant.
*/
static void view_layer_unassign_bases(ViewLayer *view_layer)
{
view_layer->basact = nullptr;
}
/* Remove all bases from all view layers except the input one. */
void scene_minimize_unused_view_layers(const Depsgraph *depsgraph,
const IDNode *id_node,
@ -381,7 +369,7 @@ void scene_minimize_unused_view_layers(const Depsgraph *depsgraph,
* NOTE: Need to keep view layers for all scenes, even indirect ones. This is because of
* render layer node possibly pointing to another scene. */
LISTBASE_FOREACH (ViewLayer *, view_layer, &scene_cow->view_layers) {
view_layer_unassign_bases(view_layer);
BKE_view_layer_free_object_content(view_layer);
}
return;
}
@ -399,7 +387,7 @@ void scene_minimize_unused_view_layers(const Depsgraph *depsgraph,
view_layer_eval = view_layer_cow;
}
else {
view_layer_unassign_bases(view_layer_cow);
BKE_view_layer_free_object_content(view_layer_cow);
}
}