Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c20
-rw-r--r--source/blender/blenkernel/intern/data_transfer.c2
-rw-r--r--source/blender/blenloader/intern/readfile.c1
-rw-r--r--source/blender/depsgraph/DEG_depsgraph_build.h6
-rw-r--r--source/blender/depsgraph/DEG_depsgraph_query.h4
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder.cc4
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc5
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.h2
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.cc21
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.h2
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc8
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc9
-rw-r--r--source/blender/depsgraph/intern/depsgraph_build.cc25
-rw-r--r--source/blender/depsgraph/intern/depsgraph_query.cc22
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc3
-rw-r--r--source/blender/depsgraph/intern/nodes/deg_node_id.cc2
-rw-r--r--source/blender/depsgraph/intern/nodes/deg_node_id.h4
-rw-r--r--source/blender/depsgraph/intern/nodes/deg_node_operation.cc3
-rw-r--r--source/blender/depsgraph/intern/nodes/deg_node_operation.h3
-rw-r--r--source/blender/makesdna/DNA_object_types.h12
-rw-r--r--source/blender/modifiers/intern/MOD_datatransfer.c3
-rw-r--r--source/blender/modifiers/intern/MOD_shrinkwrap.c6
22 files changed, 92 insertions, 75 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 98d2e77c62f..de2cd5603a6 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -2035,8 +2035,8 @@ static void mesh_build_data(
ob->derivedFinal->needsFree = 0;
ob->derivedDeform->needsFree = 0;
#endif
- ob->lastDataMask = dataMask;
- ob->lastNeedMapping = need_mapping;
+ ob->runtime.last_data_mask = dataMask;
+ ob->runtime.last_need_mapping = need_mapping;
if ((ob->mode & OB_MODE_ALL_SCULPT) && ob->sculpt) {
/* create PBVH immediately (would be created on the fly too,
@@ -2080,7 +2080,7 @@ static CustomDataMask object_get_datamask(const Depsgraph *depsgraph, Object *ob
{
ViewLayer *view_layer = DEG_get_evaluated_view_layer(depsgraph);
Object *actob = view_layer->basact ? DEG_get_original_object(view_layer->basact->object) : NULL;
- CustomDataMask mask = ob->customdata_mask;
+ CustomDataMask mask = DEG_get_customdata_mask_for_object(depsgraph, ob);
if (r_need_mapping) {
*r_need_mapping = false;
@@ -2171,10 +2171,11 @@ Mesh *mesh_get_eval_final(
dataMask |= object_get_datamask(depsgraph, ob, &need_mapping);
if (!ob->runtime.mesh_eval ||
- ((dataMask & ob->lastDataMask) != dataMask) ||
- (need_mapping && !ob->lastNeedMapping))
+ ((dataMask & ob->runtime.last_data_mask) != dataMask) ||
+ (need_mapping && !ob->runtime.last_need_mapping))
{
- mesh_build_data(depsgraph, scene, ob, dataMask | ob->lastDataMask, false, need_mapping || ob->lastNeedMapping);
+ mesh_build_data(depsgraph, scene, ob, dataMask | ob->runtime.last_data_mask,
+ false, need_mapping || ob->runtime.last_need_mapping);
}
if (ob->runtime.mesh_eval) { BLI_assert(!(ob->runtime.mesh_eval->runtime.cd_dirty_vert & CD_MASK_NORMAL)); }
@@ -2219,10 +2220,11 @@ Mesh *mesh_get_eval_deform(struct Depsgraph *depsgraph, Scene *scene, Object *ob
dataMask |= object_get_datamask(depsgraph, ob, &need_mapping);
if (!ob->runtime.mesh_deform_eval ||
- ((dataMask & ob->lastDataMask) != dataMask) ||
- (need_mapping && !ob->lastNeedMapping))
+ ((dataMask & ob->runtime.last_data_mask) != dataMask) ||
+ (need_mapping && !ob->runtime.last_need_mapping))
{
- mesh_build_data(depsgraph, scene, ob, dataMask | ob->lastDataMask, false, need_mapping || ob->lastNeedMapping);
+ mesh_build_data(depsgraph, scene, ob, dataMask | ob->runtime.last_data_mask,
+ false, need_mapping || ob->runtime.last_need_mapping);
}
return ob->runtime.mesh_deform_eval;
diff --git a/source/blender/blenkernel/intern/data_transfer.c b/source/blender/blenkernel/intern/data_transfer.c
index 7ac9d2d985c..9ee27a29c8b 100644
--- a/source/blender/blenkernel/intern/data_transfer.c
+++ b/source/blender/blenkernel/intern/data_transfer.c
@@ -1118,7 +1118,7 @@ bool BKE_object_data_transfer_ex(
if (is_modifier) {
me_src = ob_src->runtime.mesh_eval;
- if (me_src == NULL || (me_src_mask & ~ob_src->lastDataMask) != 0) {
+ if (me_src == NULL || (me_src_mask & ~ob_src->runtime.last_data_mask) != 0) {
printf("Data Transfer: source mesh data is not ready - dependency cycle?\n");
return changed;
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 076370c8877..75abdf15bc0 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5692,7 +5692,6 @@ static void direct_link_object(FileData *fd, Object *ob)
BKE_object_empty_draw_type_set(ob, ob->empty_drawtype);
}
- ob->customdata_mask = 0;
ob->bb = NULL;
ob->derivedDeform = NULL;
ob->derivedFinal = NULL;
diff --git a/source/blender/depsgraph/DEG_depsgraph_build.h b/source/blender/depsgraph/DEG_depsgraph_build.h
index 93e9b5be2cc..14468b33822 100644
--- a/source/blender/depsgraph/DEG_depsgraph_build.h
+++ b/source/blender/depsgraph/DEG_depsgraph_build.h
@@ -139,11 +139,6 @@ void DEG_add_object_relation(struct DepsNodeHandle *node_handle,
struct Object *object,
eDepsObjectComponentType component,
const char *description);
-void DEG_add_object_relation_with_customdata(struct DepsNodeHandle *node_handle,
- struct Object *object,
- eDepsObjectComponentType component,
- uint64_t customdata_mask,
- const char *description);
void DEG_add_bone_relation(struct DepsNodeHandle *handle,
struct Object *object,
const char *bone_name,
@@ -163,6 +158,7 @@ void DEG_add_object_pointcache_relation(struct DepsNodeHandle *node_handle,
const char *description);
void DEG_add_special_eval_flag(struct DepsNodeHandle *handle, struct ID *id, uint32_t flag);
+void DEG_add_customdata_mask(struct DepsNodeHandle *handle, struct Object *object, uint64_t mask);
struct ID *DEG_get_id_from_handle(struct DepsNodeHandle *node_handle);
struct Depsgraph *DEG_get_graph_from_handle(struct DepsNodeHandle *node_handle);
diff --git a/source/blender/depsgraph/DEG_depsgraph_query.h b/source/blender/depsgraph/DEG_depsgraph_query.h
index e3fa30cf688..c9fa6b0a035 100644
--- a/source/blender/depsgraph/DEG_depsgraph_query.h
+++ b/source/blender/depsgraph/DEG_depsgraph_query.h
@@ -73,6 +73,10 @@ bool DEG_id_type_any_updated(const struct Depsgraph *depsgraph);
/* Get additional evaluation flags for the given ID. */
uint32_t DEG_get_eval_flags_for_id(const struct Depsgraph *graph, struct ID *id);
+/* Get additional mesh CustomDataMask flags for the given object. */
+uint64_t DEG_get_customdata_mask_for_object(const struct Depsgraph *graph,
+ struct Object *object);
+
/* Get scene the despgraph is created for. */
struct Scene *DEG_get_evaluated_scene(const struct Depsgraph *graph);
diff --git a/source/blender/depsgraph/intern/builder/deg_builder.cc b/source/blender/depsgraph/intern/builder/deg_builder.cc
index f7b2b482b1f..3fc54fed623 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder.cc
@@ -142,6 +142,10 @@ void deg_graph_build_finalize(Main *bmain, Depsgraph *graph)
if (id_node->eval_flags != id_node->previous_eval_flags) {
flag |= DEG_TAG_TRANSFORM | DEG_TAG_GEOMETRY;
}
+ /* Tag rebuild if the custom data mask changed. */
+ if (id_node->customdata_mask != id_node->previous_customdata_mask) {
+ flag |= DEG_TAG_GEOMETRY;
+ }
if (!deg_copy_on_write_is_expanded(id_node->id_cow)) {
flag |= DEG_TAG_COPY_ON_WRITE;
/* This means ID is being added to the dependency graph first
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 55de6110b3b..8726f51012e 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -163,12 +163,14 @@ IDDepsNode *DepsgraphNodeBuilder::add_id_node(ID *id)
ID *id_cow = NULL;
IDComponentsMask previously_visible_components_mask = 0;
uint32_t previous_eval_flags = 0;
+ uint64_t previous_customdata_mask = 0;
IDInfo *id_info = (IDInfo *)BLI_ghash_lookup(id_info_hash_, id);
if (id_info != NULL) {
id_cow = id_info->id_cow;
previously_visible_components_mask =
id_info->previously_visible_components_mask;
previous_eval_flags = id_info->previous_eval_flags;
+ previous_customdata_mask = id_info->previous_customdata_mask;
/* Tag ID info to not free the CoW ID pointer. */
id_info->id_cow = NULL;
}
@@ -176,6 +178,7 @@ IDDepsNode *DepsgraphNodeBuilder::add_id_node(ID *id)
id_node->previously_visible_components_mask =
previously_visible_components_mask;
id_node->previous_eval_flags = previous_eval_flags;
+ id_node->previous_customdata_mask = previous_customdata_mask;
/* Currently all ID nodes are supposed to have copy-on-write logic.
*
* NOTE: Zero number of components indicates that ID node was just created.
@@ -358,6 +361,7 @@ void DepsgraphNodeBuilder::begin_build()
id_info->previously_visible_components_mask =
id_node->visible_components_mask;
id_info->previous_eval_flags = id_node->eval_flags;
+ id_info->previous_customdata_mask = id_node->customdata_mask;
BLI_ghash_insert(id_info_hash_, id_node->id_orig, id_info);
id_node->id_cow = NULL;
}
@@ -582,7 +586,6 @@ void DepsgraphNodeBuilder::build_object(int base_index,
else {
id_node->is_directly_visible = is_visible;
}
- object->customdata_mask = 0;
/* Various flags, flushing from bases/collections. */
build_object_flags(base_index, object, linked_state);
/* Transform. */
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index 3b795bf9d58..cdf1f6ed03d 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -235,6 +235,8 @@ struct DepsgraphNodeBuilder {
IDComponentsMask previously_visible_components_mask;
/* Special evaluation flag mask from the previous depsgraph. */
uint32_t previous_eval_flags;
+ /* Mesh CustomData mask from the previous depsgraph. */
+ uint64_t previous_customdata_mask;
};
protected:
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index b45d25d4b70..649bc1a4275 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -289,13 +289,16 @@ bool DepsgraphRelationBuilder::has_node(const OperationKey &key) const
return find_node(key) != NULL;
}
-void DepsgraphRelationBuilder::add_customdata_mask(const ComponentKey &key, uint64_t mask)
+void DepsgraphRelationBuilder::add_customdata_mask(Object *object, uint64_t mask)
{
- if (mask != 0) {
- OperationDepsNode *node = find_operation_node(key);
+ if (mask != 0 && object != NULL && object->type == OB_MESH) {
+ DEG::IDDepsNode *id_node = graph_->find_id_node(&object->id);
- if (node != NULL) {
- node->customdata_mask |= mask;
+ if (id_node == NULL) {
+ BLI_assert(!"ID should always be valid");
+ }
+ else {
+ id_node->customdata_mask |= mask;
}
}
}
@@ -828,7 +831,7 @@ void DepsgraphRelationBuilder::build_object_parent(Object *object)
add_relation(parent_key, ob_key, "Vertex Parent");
/* XXX not sure what this is for or how you could be done properly - lukas */
- add_customdata_mask(parent_key, CD_MASK_ORIGINDEX);
+ add_customdata_mask(object->parent, CD_MASK_ORIGINDEX);
ComponentKey transform_key(&object->parent->id, DEG_NODE_TYPE_TRANSFORM);
add_relation(transform_key, ob_key, "Vertex Parent TFM");
@@ -1056,9 +1059,7 @@ void DepsgraphRelationBuilder::build_constraints(ID *id,
*/
ComponentKey target_key(&ct->tar->id, DEG_NODE_TYPE_GEOMETRY);
add_relation(target_key, constraint_op_key, cti->name);
- if (ct->tar->type == OB_MESH) {
- add_customdata_mask(target_key, CD_MASK_MDEFORMVERT);
- }
+ add_customdata_mask(ct->tar, CD_MASK_MDEFORMVERT);
}
else if (con->type == CONSTRAINT_TYPE_SHRINKWRAP) {
bShrinkwrapConstraint *scon = (bShrinkwrapConstraint *) con->data;
@@ -1071,7 +1072,7 @@ void DepsgraphRelationBuilder::build_constraints(ID *id,
if (ct->tar->type == OB_MESH && scon->shrinkType != MOD_SHRINKWRAP_NEAREST_VERTEX) {
bool track = (scon->flag & CON_SHRINKWRAP_TRACK_NORMAL) != 0;
if (track || BKE_shrinkwrap_needs_normals(scon->shrinkType, scon->shrinkMode)) {
- add_customdata_mask(target_key, CD_MASK_NORMAL | CD_MASK_CUSTOMLOOPNORMAL);
+ add_customdata_mask(ct->tar, CD_MASK_NORMAL | CD_MASK_CUSTOMLOOPNORMAL);
}
if (scon->shrinkType == MOD_SHRINKWRAP_TARGET_PROJECT) {
add_special_eval_flag(&ct->tar->id, DAG_EVAL_NEED_SHRINKWRAP_BOUNDARY);
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
index c6db975c6c2..face2a1d43f 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
@@ -210,7 +210,7 @@ struct DepsgraphRelationBuilder
bool check_unique = false,
int flags = 0);
- void add_customdata_mask(const ComponentKey &key, uint64_t mask);
+ void add_customdata_mask(Object *object, uint64_t mask);
void add_special_eval_flag(ID *object, uint32_t flag);
void build_id(ID *id);
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc
index ff8b13b4442..8de4a1cca07 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc
@@ -140,9 +140,7 @@ void DepsgraphRelationBuilder::build_ik_pose(Object *object,
* separately. */
ComponentKey target_key(&data->tar->id, DEG_NODE_TYPE_GEOMETRY);
add_relation(target_key, solver_key, con->name);
- if (data->tar->type == OB_MESH) {
- add_customdata_mask(target_key, CD_MASK_MDEFORMVERT);
- }
+ add_customdata_mask(data->tar, CD_MASK_MDEFORMVERT);
}
else {
/* Standard Object Target. */
@@ -172,9 +170,7 @@ void DepsgraphRelationBuilder::build_ik_pose(Object *object,
* separately. */
ComponentKey target_key(&data->poletar->id, DEG_NODE_TYPE_GEOMETRY);
add_relation(target_key, solver_key, con->name);
- if (data->poletar->type == OB_MESH) {
- add_customdata_mask(target_key, CD_MASK_MDEFORMVERT);
- }
+ add_customdata_mask(data->poletar, CD_MASK_MDEFORMVERT);
}
else {
ComponentKey target_key(&data->poletar->id, DEG_NODE_TYPE_TRANSFORM);
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc
index 999508cffed..866b5e63031 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc
@@ -132,15 +132,6 @@ void DepsgraphRelationBuilder::build_view_layer(Scene *scene, ViewLayer *view_la
LISTBASE_FOREACH (MovieClip *, clip, &bmain_->movieclip) {
build_movieclip(clip);
}
- /* TODO(sergey): Do this flush on CoW object? */
- foreach (OperationDepsNode *node, graph_->operations) {
- IDDepsNode *id_node = node->owner->owner;
- ID *id = id_node->id_orig;
- if (GS(id->name) == ID_OB) {
- Object *object = (Object *)id;
- object->customdata_mask |= node->customdata_mask;
- }
- }
/* Build all set scenes. */
if (scene->set != NULL) {
ViewLayer *set_view_layer = BKE_view_layer_default_render(scene->set);
diff --git a/source/blender/depsgraph/intern/depsgraph_build.cc b/source/blender/depsgraph/intern/depsgraph_build.cc
index d56c47a0d2a..408c6abb0c9 100644
--- a/source/blender/depsgraph/intern/depsgraph_build.cc
+++ b/source/blender/depsgraph/intern/depsgraph_build.cc
@@ -130,23 +130,6 @@ void DEG_add_object_relation(DepsNodeHandle *node_handle,
description);
}
-void DEG_add_object_relation_with_customdata(DepsNodeHandle *node_handle,
- Object *object,
- eDepsObjectComponentType component,
- uint64_t customdata_mask,
- const char *description)
-{
- DEG::eDepsNode_Type type = deg_build_object_component_type(component);
- DEG::ComponentKey comp_key(&object->id, type);
- DEG::DepsNodeHandle *deg_node_handle = get_node_handle(node_handle);
- deg_node_handle->builder->add_node_handle_relation(comp_key,
- deg_node_handle,
- description);
- if (object->type == OB_MESH) {
- deg_node_handle->builder->add_customdata_mask(comp_key, customdata_mask);
- }
-}
-
void DEG_add_object_cache_relation(DepsNodeHandle *node_handle,
CacheFile *cache_file,
eDepsObjectComponentType component,
@@ -210,6 +193,14 @@ void DEG_add_special_eval_flag(struct DepsNodeHandle *node_handle,
deg_node_handle->builder->add_special_eval_flag(id, flag);
}
+void DEG_add_customdata_mask(struct DepsNodeHandle *node_handle,
+ struct Object *object,
+ uint64_t mask)
+{
+ DEG::DepsNodeHandle *deg_node_handle = get_node_handle(node_handle);
+ deg_node_handle->builder->add_customdata_mask(object, mask);
+}
+
struct ID *DEG_get_id_from_handle(struct DepsNodeHandle *node_handle)
{
DEG::DepsNodeHandle *deg_handle = get_node_handle(node_handle);
diff --git a/source/blender/depsgraph/intern/depsgraph_query.cc b/source/blender/depsgraph/intern/depsgraph_query.cc
index 946917afb26..c6ade6ac4c3 100644
--- a/source/blender/depsgraph/intern/depsgraph_query.cc
+++ b/source/blender/depsgraph/intern/depsgraph_query.cc
@@ -122,6 +122,28 @@ uint32_t DEG_get_eval_flags_for_id(const Depsgraph *graph, ID *id)
return id_node->eval_flags;
}
+uint64_t DEG_get_customdata_mask_for_object(const Depsgraph *graph, Object *ob)
+{
+ if (graph == NULL) {
+ /* Happens when converting objects to mesh from a python script
+ * after modifying scene graph.
+ *
+ * Currently harmless because it's only called for temporary
+ * objects which are out of the DAG anyway.
+ */
+ return 0;
+ }
+
+ const DEG::Depsgraph *deg_graph = reinterpret_cast<const DEG::Depsgraph *>(graph);
+ const DEG::IDDepsNode *id_node = deg_graph->find_id_node(DEG_get_original_id(&ob->id));
+ if (id_node == NULL) {
+ /* TODO(sergey): Does it mean we need to check set scene? */
+ return 0;
+ }
+
+ return id_node->customdata_mask;
+}
+
Scene *DEG_get_evaluated_scene(const Depsgraph *graph)
{
const DEG::Depsgraph *deg_graph =
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
index 89d3740c43e..21ca1636880 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
@@ -812,7 +812,6 @@ static void deg_update_copy_on_write_animation(const Depsgraph *depsgraph,
typedef struct ObjectRuntimeBackup {
Object_Runtime runtime;
short base_flag;
- CustomDataMask lastDataMask;
} ObjectRuntimeBackup;
/* Make a backup of object's evaluation runtime data, additionally
@@ -836,7 +835,6 @@ static void deg_backup_object_runtime(
}
/* Make a backup of base flags. */
object_runtime_backup->base_flag = object->base_flag;
- object_runtime_backup->lastDataMask = object->lastDataMask;
}
static void deg_restore_object_runtime(
@@ -871,7 +869,6 @@ static void deg_restore_object_runtime(
}
}
object->base_flag = object_runtime_backup->base_flag;
- object->lastDataMask = object_runtime_backup->lastDataMask;
}
ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_id.cc b/source/blender/depsgraph/intern/nodes/deg_node_id.cc
index b194e304e99..d431e68f904 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node_id.cc
+++ b/source/blender/depsgraph/intern/nodes/deg_node_id.cc
@@ -104,6 +104,8 @@ void IDDepsNode::init(const ID *id, const char *UNUSED(subdata))
id_orig = (ID *)id;
eval_flags = 0;
previous_eval_flags = 0;
+ customdata_mask = 0;
+ previous_customdata_mask = 0;
linked_state = DEG_ID_LINKED_INDIRECTLY;
is_directly_visible = true;
is_collection_fully_expanded = false;
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_id.h b/source/blender/depsgraph/intern/nodes/deg_node_id.h
index f8d05eddffd..a968794e3b2 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node_id.h
+++ b/source/blender/depsgraph/intern/nodes/deg_node_id.h
@@ -81,6 +81,10 @@ struct IDDepsNode : public DepsNode {
uint32_t eval_flags;
uint32_t previous_eval_flags;
+ /* Extra customdata mask which needs to be evaluated for the mesh object. */
+ uint64_t customdata_mask;
+ uint64_t previous_customdata_mask;
+
eDepsNode_LinkedState_Type linked_state;
/* Indicates the datablock is visible in the evaluated scene. */
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_operation.cc b/source/blender/depsgraph/intern/nodes/deg_node_operation.cc
index ef1882dd715..f6fee6acf23 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node_operation.cc
+++ b/source/blender/depsgraph/intern/nodes/deg_node_operation.cc
@@ -46,8 +46,7 @@ namespace DEG {
OperationDepsNode::OperationDepsNode() :
name_tag(-1),
- flag(0),
- customdata_mask(0)
+ flag(0)
{
}
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_operation.h b/source/blender/depsgraph/intern/nodes/deg_node_operation.h
index 71c03945d48..9ba3a0b4864 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node_operation.h
+++ b/source/blender/depsgraph/intern/nodes/deg_node_operation.h
@@ -93,9 +93,6 @@ struct OperationDepsNode : public DepsNode {
/* (eDepsOperation_Flag) extra settings affecting evaluation. */
int flag;
- /* Extra customdata mask which needs to be evaluated for the object. */
- uint64_t customdata_mask;
-
DEG_DEPSNODE_DECLARE;
};
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index 631bb26feec..9df511fab2e 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -156,6 +156,13 @@ typedef struct Object_Runtime {
struct GpencilBatchCache *gpencil_cache;
struct ObjectBBoneDeform *cached_bbone_deformation;
+
+ /* The custom data layer mask that was last used to calculate mesh_eval and mesh_deform_eval. */
+ uint64_t last_data_mask;
+
+ /* Did last modifier stack generation need mapping support? */
+ char last_need_mapping;
+ char pad[7];
} Object_Runtime;
typedef struct Object {
@@ -236,8 +243,7 @@ typedef struct Object {
short nlaflag; /* used for DopeSheet filtering settings (expanded/collapsed) */
short pad[2];
- /* did last modifier stack generation need mapping support? */
- char lastNeedMapping; /* bool */
+ char pad12;
char duplicator_visibility_flag;
/* dupli-frame settings */
@@ -293,8 +299,6 @@ typedef struct Object {
struct DerivedMesh *derivedDeform, *derivedFinal;
void *pad7;
- uint64_t lastDataMask; /* the custom data layer mask that was last used to calculate derivedDeform and derivedFinal */
- uint64_t customdata_mask; /* (extra) custom data layer mask to use for creating derivedmesh, set by depsgraph */
ListBase pc_ids;
diff --git a/source/blender/modifiers/intern/MOD_datatransfer.c b/source/blender/modifiers/intern/MOD_datatransfer.c
index b2cb82d6be3..71e2c7c3e09 100644
--- a/source/blender/modifiers/intern/MOD_datatransfer.c
+++ b/source/blender/modifiers/intern/MOD_datatransfer.c
@@ -131,7 +131,8 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
if (dtmd->ob_source != NULL) {
CustomDataMask mask = BKE_object_data_transfer_dttypes_to_cdmask(dtmd->data_types);
- DEG_add_object_relation_with_customdata(ctx->node, dtmd->ob_source, DEG_OB_COMP_GEOMETRY, mask, "DataTransfer Modifier");
+ DEG_add_object_relation(ctx->node, dtmd->ob_source, DEG_OB_COMP_GEOMETRY, "DataTransfer Modifier");
+ DEG_add_customdata_mask(ctx->node, dtmd->ob_source, mask);
if (dtmd->flags & MOD_DATATRANSFER_OBSRC_TRANSFORM) {
DEG_add_object_relation(ctx->node, dtmd->ob_source, DEG_OB_COMP_TRANSFORM, "DataTransfer Modifier");
diff --git a/source/blender/modifiers/intern/MOD_shrinkwrap.c b/source/blender/modifiers/intern/MOD_shrinkwrap.c
index dd4530b066f..cff5853b66e 100644
--- a/source/blender/modifiers/intern/MOD_shrinkwrap.c
+++ b/source/blender/modifiers/intern/MOD_shrinkwrap.c
@@ -156,14 +156,16 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
if (smd->target != NULL) {
DEG_add_object_relation(ctx->node, smd->target, DEG_OB_COMP_TRANSFORM, "Shrinkwrap Modifier");
- DEG_add_object_relation_with_customdata(ctx->node, smd->target, DEG_OB_COMP_GEOMETRY, mask, "Shrinkwrap Modifier");
+ DEG_add_object_relation(ctx->node, smd->target, DEG_OB_COMP_GEOMETRY, "Shrinkwrap Modifier");
+ DEG_add_customdata_mask(ctx->node, smd->target, mask);
if (smd->shrinkType == MOD_SHRINKWRAP_TARGET_PROJECT) {
DEG_add_special_eval_flag(ctx->node, &smd->target->id, DAG_EVAL_NEED_SHRINKWRAP_BOUNDARY);
}
}
if (smd->auxTarget != NULL) {
DEG_add_object_relation(ctx->node, smd->auxTarget, DEG_OB_COMP_TRANSFORM, "Shrinkwrap Modifier");
- DEG_add_object_relation_with_customdata(ctx->node, smd->auxTarget, DEG_OB_COMP_GEOMETRY, mask, "Shrinkwrap Modifier");
+ DEG_add_object_relation(ctx->node, smd->auxTarget, DEG_OB_COMP_GEOMETRY, "Shrinkwrap Modifier");
+ DEG_add_customdata_mask(ctx->node, smd->auxTarget, mask);
if (smd->shrinkType == MOD_SHRINKWRAP_TARGET_PROJECT) {
DEG_add_special_eval_flag(ctx->node, &smd->auxTarget->id, DAG_EVAL_NEED_SHRINKWRAP_BOUNDARY);
}