Depsgraph: use full operation key to preserve update tags on rebuild.
The key used by find_operation consists of the operation code, node name, and an index for array property drivers. All three elements are required to unambiguously look up a node.
This commit is contained in:
@@ -374,6 +374,7 @@ void DepsgraphNodeBuilder::begin_build()
|
||||
entry_tag.component_type = comp_node->type;
|
||||
entry_tag.opcode = op_node->opcode;
|
||||
entry_tag.name = op_node->name;
|
||||
entry_tag.name_tag = op_node->name_tag;
|
||||
saved_entry_tags_.push_back(entry_tag);
|
||||
};
|
||||
GSET_FOREACH_END();
|
||||
@@ -396,7 +397,7 @@ void DepsgraphNodeBuilder::end_build()
|
||||
if (comp_node == NULL) {
|
||||
continue;
|
||||
}
|
||||
OperationDepsNode *op_node = comp_node->find_operation(entry_tag.opcode, entry_tag.name, -1);
|
||||
OperationDepsNode *op_node = comp_node->find_operation(entry_tag.opcode, entry_tag.name, entry_tag.name_tag);
|
||||
if (op_node == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -245,6 +245,7 @@ protected:
|
||||
eDepsNode_Type component_type;
|
||||
eDepsOperation_Code opcode;
|
||||
const char *name;
|
||||
int name_tag;
|
||||
};
|
||||
vector<SavedEntryTag> saved_entry_tags_;
|
||||
|
||||
|
||||
@@ -172,9 +172,9 @@ OperationDepsNode *ComponentDepsNode::find_operation(OperationIDKey key) const
|
||||
node = (OperationDepsNode *)BLI_ghash_lookup(operations_map, &key);
|
||||
}
|
||||
else {
|
||||
BLI_assert(key.name_tag == -1);
|
||||
foreach (OperationDepsNode *op_node, operations) {
|
||||
if (op_node->opcode == key.opcode &&
|
||||
op_node->name_tag == key.name_tag &&
|
||||
STREQ(op_node->name, key.name))
|
||||
{
|
||||
node = op_node;
|
||||
@@ -253,6 +253,7 @@ OperationDepsNode *ComponentDepsNode::add_operation(const DepsEvalOperationCb& o
|
||||
op_node->evaluate = op;
|
||||
op_node->opcode = opcode;
|
||||
op_node->name = name;
|
||||
op_node->name_tag = name_tag;
|
||||
|
||||
return op_node;
|
||||
}
|
||||
|
||||
@@ -45,6 +45,7 @@ namespace DEG {
|
||||
/* Inner Nodes */
|
||||
|
||||
OperationDepsNode::OperationDepsNode() :
|
||||
name_tag(-1),
|
||||
flag(0),
|
||||
customdata_mask(0)
|
||||
{
|
||||
|
||||
@@ -80,6 +80,7 @@ struct OperationDepsNode : public DepsNode {
|
||||
|
||||
/* Identifier for the operation being performed. */
|
||||
eDepsOperation_Code opcode;
|
||||
int name_tag;
|
||||
|
||||
/* (eDepsOperation_Flag) extra settings affecting evaluation. */
|
||||
int flag;
|
||||
|
||||
Reference in New Issue
Block a user