[Bf-blender-cvs] [bb16167fd87] blender2.8: Depsgraph: completely move customdata_mask to the ID node.

Alexander Gavrilov noreply at git.blender.org
Mon Dec 3 16:29:14 CET 2018


Commit: bb16167fd8727a330a97f591398ac0981c76a562
Author: Alexander Gavrilov
Date:   Mon Dec 3 18:09:45 2018 +0300
Branches: blender2.8
https://developer.blender.org/rBbb16167fd8727a330a97f591398ac0981c76a562

Depsgraph: completely move customdata_mask to the ID node.

Move all mask-related fields from Object and OperationDepsNode
to Object_Runtime and IDDepsNode. Auto-apply DEG_TAG_GEOMETRY
if the mask changes after DEG rebuild. Update DEG API and all
code that uses it.

This fixes "source mesh data is not ready" errors from Data
Transfer modifier when parameters are changed in the UI after
the recent mesh_get_eval_final fix.

Reviewers: sergey

Differential Revision: https://developer.blender.org/D4025

===================================================================

M	source/blender/blenkernel/intern/DerivedMesh.c
M	source/blender/blenkernel/intern/data_transfer.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/depsgraph/DEG_depsgraph_build.h
M	source/blender/depsgraph/DEG_depsgraph_query.h
M	source/blender/depsgraph/intern/builder/deg_builder.cc
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.h
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.h
M	source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc
M	source/blender/depsgraph/intern/depsgraph_build.cc
M	source/blender/depsgraph/intern/depsgraph_query.cc
M	source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
M	source/blender/depsgraph/intern/nodes/deg_node_id.cc
M	source/blender/depsgraph/intern/nodes/deg_node_id.h
M	source/blender/depsgraph/intern/nodes/deg_node_operation.cc
M	source/blender/depsgraph/intern/nodes/deg_node_operation.h
M	source/blender/makesdna/DNA_object_types.h
M	source/blender/modifiers/intern/MOD_datatransfer.c
M	source/blender/modifiers/intern/MOD_shrinkwrap.c

===================================================================

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_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list