[Bf-blender-cvs] [90b79176870] blender2.8: Depsgraph: Make DEG_OBJECT_ITER more granular

Dalai Felinto noreply at git.blender.org
Fri Dec 15 11:59:22 CET 2017


Commit: 90b79176870e56b55f5c72a8943a502bfe78c7b0
Author: Dalai Felinto
Date:   Fri Dec 15 07:51:16 2017 -0200
Branches: blender2.8
https://developer.blender.org/rB90b79176870e56b55f5c72a8943a502bfe78c7b0

Depsgraph: Make DEG_OBJECT_ITER more granular

It is not nice to assume we always want visible or directly linked objects.
So we make it as granular as we can.

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

M	source/blender/depsgraph/DEG_depsgraph_query.h
M	source/blender/depsgraph/intern/depsgraph_query_iter.cc
M	source/blender/draw/intern/draw_manager.c
M	source/blender/makesrna/intern/rna_depsgraph.c
M	source/blender/makesrna/intern/rna_layer.c

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

diff --git a/source/blender/depsgraph/DEG_depsgraph_query.h b/source/blender/depsgraph/DEG_depsgraph_query.h
index bd604289534..c0269d2ba26 100644
--- a/source/blender/depsgraph/DEG_depsgraph_query.h
+++ b/source/blender/depsgraph/DEG_depsgraph_query.h
@@ -70,10 +70,11 @@ struct ID *DEG_get_evaluated_id(struct Depsgraph *depsgraph, struct ID *id);
 /* ************************ DEG iterators ********************* */
 
 enum {
-	DEG_ITER_OBJECT_FLAG_SET = (1 << 0),
-	DEG_ITER_OBJECT_FLAG_DUPLI = (1 << 1),
-
-	DEG_ITER_OBJECT_FLAG_ALL = (DEG_ITER_OBJECT_FLAG_SET | DEG_ITER_OBJECT_FLAG_DUPLI),
+	DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY   = (1 << 0),
+	DEG_ITER_OBJECT_FLAG_LINKED_INDIRECTLY = (1 << 1),
+	DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET    = (1 << 2),
+	DEG_ITER_OBJECT_FLAG_VISIBLE           = (1 << 3),
+	DEG_ITER_OBJECT_FLAG_DUPLI             = (1 << 4),
 };
 
 typedef struct DEGOIterObjectData {
@@ -109,6 +110,11 @@ void DEG_iterator_objects_begin(struct BLI_Iterator *iter, DEGOIterObjectData *d
 void DEG_iterator_objects_next(struct BLI_Iterator *iter);
 void DEG_iterator_objects_end(struct BLI_Iterator *iter);
 
+/**
+ * Note: Be careful with DEG_ITER_OBJECT_FLAG_LINKED_INDIRECTLY objects.
+ * Although they are available they have no overrides (collection_properties)
+ * and will crash if you try to access it.
+ */
 #define DEG_OBJECT_ITER(graph_, instance_, flag_)                                 \
 	{                                                                             \
 		DEGOIterObjectData data_ = {                                              \
@@ -119,16 +125,25 @@ void DEG_iterator_objects_end(struct BLI_Iterator *iter);
 		ITER_BEGIN(DEG_iterator_objects_begin,                                    \
 		           DEG_iterator_objects_next,                                     \
 		           DEG_iterator_objects_end,                                      \
-		           &data_, Object *, instance_)                                   \
-                                                                                  \
-			if (BKE_object_is_visible(instance_) == false) {                      \
-				continue;                                                         \
-			}
+		           &data_, Object *, instance_)
 
 #define DEG_OBJECT_ITER_END                                                       \
 		ITER_END                                                                  \
 	}
 
+/**
+  * Depsgraph objects iterator for draw manager and final render
+  */
+#define DEG_OBJECT_ITER_FOR_RENDER_ENGINE(graph_, instance_) \
+	DEG_OBJECT_ITER(graph_, instance_,                       \
+	        DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY  |          \
+	        DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET |            \
+	        DEG_ITER_OBJECT_FLAG_VISIBLE |                   \
+	        DEG_ITER_OBJECT_FLAG_DUPLI)
+
+#define DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END                \
+	DEG_OBJECT_ITER_END
+
 /* ************************ DEG traversal ********************* */
 
 typedef void (*DEGForeachIDCallback)(ID *id, void *user_data);
diff --git a/source/blender/depsgraph/intern/depsgraph_query_iter.cc b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
index 083dd17217a..9973018cc6e 100644
--- a/source/blender/depsgraph/intern/depsgraph_query_iter.cc
+++ b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
@@ -38,6 +38,7 @@ extern "C" {
 #include "BKE_anim.h"
 #include "BKE_idprop.h"
 #include "BKE_layer.h"
+#include "BKE_object.h"
 } /* extern "C" */
 
 #include "DNA_object_types.h"
@@ -105,35 +106,43 @@ static bool deg_objects_dupli_iterator_next(BLI_Iterator *iter)
 
 static void DEG_iterator_objects_step(BLI_Iterator *iter, DEG::IDDepsNode *id_node)
 {
-	/* Reset the skip in case we are running from within a loop. */
-	iter->skip = false;
+	/* Set it early in case we need to exit and we are running from within a loop. */
+	iter->skip = true;
 
 	DEGOIterObjectData *data = (DEGOIterObjectData *)iter->data;
 	const ID_Type id_type = GS(id_node->id_orig->name);
 
 	if (id_type != ID_OB) {
-		iter->skip = true;
 		return;
 	}
 
 	switch (id_node->linked_state) {
 		case DEG::DEG_ID_LINKED_DIRECTLY:
+			if ((data->flag & DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY) == 0) {
+				return;
+			}
 			break;
 		case DEG::DEG_ID_LINKED_VIA_SET:
-			if (data->flag & DEG_ITER_OBJECT_FLAG_SET) {
-				break;
-			}
-			else {
-				ATTR_FALLTHROUGH;
+			if ((data->flag & DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET) == 0) {
+				return;
 			}
+			break;
 		case DEG::DEG_ID_LINKED_INDIRECTLY:
-			iter->skip = true;
-			return;
+			if ((data->flag & DEG_ITER_OBJECT_FLAG_LINKED_INDIRECTLY) == 0) {
+				return;
+			}
+			break;
 	}
 
 	Object *object = (Object *)id_node->id_cow;
 	BLI_assert(DEG::deg_validate_copy_on_write_datablock(&object->id));
 
+	if ((BKE_object_is_visible(object) == false) &&
+	    ((data->flag & DEG_ITER_OBJECT_FLAG_VISIBLE) != 0))
+	{
+		return;
+	}
+
 	if ((data->flag & DEG_ITER_OBJECT_FLAG_DUPLI) && (object->transflag & OB_DUPLI)) {
 		data->dupli_parent = object;
 		data->dupli_list = object_duplilist(&data->eval_ctx, data->scene, object);
@@ -141,6 +150,7 @@ static void DEG_iterator_objects_step(BLI_Iterator *iter, DEG::IDDepsNode *id_no
 	}
 
 	iter->current = object;
+	iter->skip = false;
 }
 
 void DEG_iterator_objects_begin(BLI_Iterator *iter, DEGOIterObjectData *data)
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 2ab5b9dd758..cb5d4a4414e 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -3402,11 +3402,11 @@ void DRW_draw_render_loop_ex(
 		PROFILE_START(stime);
 		drw_engines_cache_init();
 
-		DEG_OBJECT_ITER(graph, ob, DEG_ITER_OBJECT_FLAG_ALL);
+		DEG_OBJECT_ITER_FOR_RENDER_ENGINE(graph, ob)
 		{
 			drw_engines_cache_populate(ob);
 		}
-		DEG_OBJECT_ITER_END
+		DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END
 
 		drw_engines_cache_finish();
 		PROFILE_END_ACCUM(DST.cache_time, stime);
@@ -3611,7 +3611,10 @@ void DRW_draw_select_loop(
 			drw_engines_cache_populate(scene->obedit);
 		}
 		else {
-			DEG_OBJECT_ITER(graph, ob, DEG_ITER_OBJECT_FLAG_DUPLI)
+			DEG_OBJECT_ITER(graph, ob,
+			                DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY |
+			                DEG_ITER_OBJECT_FLAG_VISIBLE |
+			                DEG_ITER_OBJECT_FLAG_DUPLI)
 			{
 				if ((ob->base_flag & BASE_SELECTABLED) != 0) {
 					DRW_select_load_id(ob->select_color);
@@ -3703,11 +3706,11 @@ void DRW_draw_depth_loop(
 	if (cache_is_dirty) {
 		drw_engines_cache_init();
 
-		DEG_OBJECT_ITER(graph, ob, DEG_ITER_OBJECT_FLAG_ALL)
+		DEG_OBJECT_ITER_FOR_RENDER_ENGINE(graph, ob)
 		{
 			drw_engines_cache_populate(ob);
 		}
-		DEG_OBJECT_ITER_END
+		DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END
 
 		drw_engines_cache_finish();
 	}
diff --git a/source/blender/makesrna/intern/rna_depsgraph.c b/source/blender/makesrna/intern/rna_depsgraph.c
index 7d520ec6abd..eb32a85afa7 100644
--- a/source/blender/makesrna/intern/rna_depsgraph.c
+++ b/source/blender/makesrna/intern/rna_depsgraph.c
@@ -152,7 +152,9 @@ static void rna_Depsgraph_objects_begin(CollectionPropertyIterator *iter, Pointe
 	DEGOIterObjectData *data = MEM_callocN(sizeof(DEGOIterObjectData), __func__);
 
 	data->graph = (Depsgraph *)ptr->data;
-	data->flag = DEG_ITER_OBJECT_FLAG_SET;
+	data->flag = DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY |
+	             DEG_ITER_OBJECT_FLAG_VISIBLE |
+	             DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET;
 
 	((BLI_Iterator *)iter->internal.custom)->valid = true;
 	DEG_iterator_objects_begin(iter->internal.custom, data);
@@ -189,7 +191,10 @@ static void rna_Depsgraph_duplis_begin(CollectionPropertyIterator *iter, Pointer
 	DEGOIterObjectData *data = MEM_callocN(sizeof(DEGOIterObjectData), __func__);
 
 	data->graph = (Depsgraph *)ptr->data;
-	data->flag = DEG_ITER_OBJECT_FLAG_ALL;
+	data->flag = DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY |
+	             DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET |
+	             DEG_ITER_OBJECT_FLAG_VISIBLE |
+	             DEG_ITER_OBJECT_FLAG_DUPLI;
 
 	((BLI_Iterator *)iter->internal.custom)->valid = true;
 	DEG_iterator_objects_begin(iter->internal.custom, data);
diff --git a/source/blender/makesrna/intern/rna_layer.c b/source/blender/makesrna/intern/rna_layer.c
index 11e35bed9ee..00b08957fdd 100644
--- a/source/blender/makesrna/intern/rna_layer.c
+++ b/source/blender/makesrna/intern/rna_layer.c
@@ -70,7 +70,6 @@ const EnumPropertyItem rna_enum_collection_type_items[] = {
 #include "BKE_idprop.h"
 #include "BKE_layer.h"
 #include "BKE_node.h"
-#include "BKE_object.h"
 #include "BKE_scene.h"
 #include "BKE_mesh.h"
 
@@ -871,7 +870,12 @@ static void rna_LayerObjects_selected_begin(CollectionPropertyIterator *iter, Po
 static void rna_ViewLayer_update_tagged(ViewLayer *UNUSED(view_layer), bContext *C)
 {
 	Depsgraph *graph = CTX_data_depsgraph(C);
-	DEG_OBJECT_ITER(graph, ob, DEG_ITER_OBJECT_FLAG_ALL)
+	DEG_OBJECT_ITER(graph, ob,
+	                DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY |
+	                DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET |
+	                DEG_ITER_OBJECT_FLAG_LINKED_INDIRECTLY |
+	                DEG_ITER_OBJECT_FLAG_VISIBLE |
+	                DEG_ITER_OBJECT_FLAG_DUPLI)
 	{
 		/* Don't do anything, we just need to run the iterator to flush
 		 * the base info to the objects. */



More information about the Bf-blender-cvs mailing list