Fix #106943: driver on inactive view layer doesn't work #107031
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue