diff options
-rw-r--r-- | source/blender/depsgraph/DEG_depsgraph_query.h | 33 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/depsgraph_query_iter.cc | 30 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 13 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_depsgraph.c | 9 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_layer.c | 8 |
5 files changed, 65 insertions, 28 deletions
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. */ |