Depsgraph: Fix wrong detection of invisible objects
Was happenign for following cases: - Deep hierarchy of non-restircted collections, which has grand-grand parent restricted. - Collections which are constructed from invisible object.
This commit is contained in:
@@ -143,6 +143,7 @@ DepsgraphNodeBuilder::DepsgraphNodeBuilder(Main *bmain, Depsgraph *graph)
|
|||||||
view_layer_(NULL),
|
view_layer_(NULL),
|
||||||
view_layer_index_(-1),
|
view_layer_index_(-1),
|
||||||
collection_(NULL),
|
collection_(NULL),
|
||||||
|
is_parent_collection_visible_(true),
|
||||||
cow_id_hash_(NULL)
|
cow_id_hash_(NULL)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -459,18 +460,19 @@ void DepsgraphNodeBuilder::build_collection(Collection *collection)
|
|||||||
*/
|
*/
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
/* Backup state. */
|
||||||
Collection *current_state_collection = collection_;
|
Collection *current_state_collection = collection_;
|
||||||
|
const bool is_current_parent_collection_visible =
|
||||||
|
is_parent_collection_visible_;
|
||||||
|
/* Modify state as we've entered new collection/ */
|
||||||
collection_ = collection;
|
collection_ = collection;
|
||||||
const int restrict_flag = (graph_->mode == DAG_EVAL_VIEWPORT)
|
const int restrict_flag = (graph_->mode == DAG_EVAL_VIEWPORT)
|
||||||
? COLLECTION_RESTRICT_VIEW
|
? COLLECTION_RESTRICT_VIEW
|
||||||
: COLLECTION_RESTRICT_RENDER;
|
: COLLECTION_RESTRICT_RENDER;
|
||||||
const bool is_parent_collection_restricted =
|
|
||||||
(current_state_collection == NULL)
|
|
||||||
? false
|
|
||||||
: (current_state_collection->flag & restrict_flag);
|
|
||||||
const bool is_collection_restricted = (collection->flag & restrict_flag);
|
const bool is_collection_restricted = (collection->flag & restrict_flag);
|
||||||
const bool is_collection_visible =
|
const bool is_collection_visible =
|
||||||
!is_collection_restricted && !is_parent_collection_restricted;
|
!is_collection_restricted && is_parent_collection_visible_;
|
||||||
|
is_parent_collection_visible_ = is_collection_visible;
|
||||||
/* Collection itself. */
|
/* Collection itself. */
|
||||||
IDDepsNode *id_node = add_id_node(&collection->id);
|
IDDepsNode *id_node = add_id_node(&collection->id);
|
||||||
id_node->is_visible = is_collection_visible;
|
id_node->is_visible = is_collection_visible;
|
||||||
@@ -483,7 +485,9 @@ void DepsgraphNodeBuilder::build_collection(Collection *collection)
|
|||||||
LISTBASE_FOREACH (CollectionChild *, child, &collection->children) {
|
LISTBASE_FOREACH (CollectionChild *, child, &collection->children) {
|
||||||
build_collection(child->collection);
|
build_collection(child->collection);
|
||||||
}
|
}
|
||||||
|
/* Restore state. */
|
||||||
collection_ = current_state_collection;
|
collection_ = current_state_collection;
|
||||||
|
is_parent_collection_visible_ = is_current_parent_collection_visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DepsgraphNodeBuilder::build_object(int base_index,
|
void DepsgraphNodeBuilder::build_object(int base_index,
|
||||||
@@ -491,6 +495,9 @@ void DepsgraphNodeBuilder::build_object(int base_index,
|
|||||||
eDepsNode_LinkedState_Type linked_state,
|
eDepsNode_LinkedState_Type linked_state,
|
||||||
bool is_visible)
|
bool is_visible)
|
||||||
{
|
{
|
||||||
|
if (string(object->id.name) == "OBGEO-icicles_large_03") {
|
||||||
|
printf(">> %d\n", is_visible);
|
||||||
|
}
|
||||||
const bool has_object = built_map_.checkIsBuiltAndTag(object);
|
const bool has_object = built_map_.checkIsBuiltAndTag(object);
|
||||||
/* Skip rest of components if the ID node was already there. */
|
/* Skip rest of components if the ID node was already there. */
|
||||||
if (has_object) {
|
if (has_object) {
|
||||||
@@ -569,7 +576,11 @@ void DepsgraphNodeBuilder::build_object(int base_index,
|
|||||||
}
|
}
|
||||||
/* Object dupligroup. */
|
/* Object dupligroup. */
|
||||||
if (object->dup_group != NULL) {
|
if (object->dup_group != NULL) {
|
||||||
|
const bool is_current_parent_collection_visible =
|
||||||
|
is_parent_collection_visible_;
|
||||||
|
is_parent_collection_visible_ = is_visible;
|
||||||
build_collection(object->dup_group);
|
build_collection(object->dup_group);
|
||||||
|
is_parent_collection_visible_ = is_current_parent_collection_visible;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -249,6 +249,11 @@ protected:
|
|||||||
* setting the current state.
|
* setting the current state.
|
||||||
*/
|
*/
|
||||||
Collection *collection_;
|
Collection *collection_;
|
||||||
|
/* Accumulated flag over the hierarchy opf currently building collections.
|
||||||
|
* Denotes whether all the hierarchy from parent of collection_ to the
|
||||||
|
* very root is visible (aka not restricted.).
|
||||||
|
*/
|
||||||
|
bool is_parent_collection_visible_;
|
||||||
|
|
||||||
GHash *cow_id_hash_;
|
GHash *cow_id_hash_;
|
||||||
BuilderMap built_map_;
|
BuilderMap built_map_;
|
||||||
|
Reference in New Issue
Block a user