diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-04-11 13:39:36 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-04-12 12:05:18 +0300 |
commit | fac1892e110956c7ed285ef2d7b097d632bcc25e (patch) | |
tree | 85c9d33dcdbe1e167e08c452e36064e1dfe6eec8 /source/blender/blenkernel | |
parent | 9c406b786faea9fee6489f0a1a21cab42a3d5cf3 (diff) |
Depsgraph: Bind base by it's index
For the performance we convert object bases list to an array
during view layer evaluation. This makes it possible to have
very cheap index-based base lookup.
The goal of this change is to get rid of base used for function
binding, and avoid scene datablock expansion at the depsgraph
construction time.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_object.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/layer.c | 14 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object_update.c | 11 |
3 files changed, 23 insertions, 4 deletions
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index c5eefedcfad..ff05ffc8df7 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -247,7 +247,7 @@ void BKE_object_data_select_update( void BKE_object_eval_flush_base_flags( const struct EvaluationContext *eval_ctx, - struct Object *object, struct Base *base, + struct Object *object, int base_index, const bool is_from_set); void BKE_object_handle_data_update( diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c index 4d3b4e43043..50c7dc0c02f 100644 --- a/source/blender/blenkernel/intern/layer.c +++ b/source/blender/blenkernel/intern/layer.c @@ -216,6 +216,8 @@ void BKE_view_layer_free_ex(ViewLayer *view_layer, const bool do_id_user) MEM_freeN(view_layer->id_properties); } + MEM_SAFE_FREE(view_layer->object_bases_array); + MEM_freeN(view_layer); } @@ -503,6 +505,8 @@ void BKE_view_layer_copy_data( view_layer_dst->basact = base_dst; } } + + view_layer_dst->object_bases_array = NULL; } /** @@ -2358,11 +2362,19 @@ static void layer_eval_layer_collection(const EvaluationContext *eval_ctx, static void layer_eval_layer_collection_post(ViewLayer *view_layer) { DEG_debug_print_eval(__func__, view_layer->name, view_layer); - /* if base is not selectabled, clear select */ + /* Create array of bases, for fast index-based lookup. */ + const int num_object_bases = BLI_listbase_count(&view_layer->object_bases); + MEM_SAFE_FREE(view_layer->object_bases_array); + view_layer->object_bases_array = MEM_malloc_arrayN( + num_object_bases, sizeof(Base *), "view_layer->object_bases_array"); + int base_index = 0; for (Base *base = view_layer->object_bases.first; base; base = base->next) { + /* if base is not selectabled, clear select. */ if ((base->flag & BASE_SELECTABLED) == 0) { base->flag &= ~BASE_SELECTED; } + /* Store base in the array. */ + view_layer->object_bases_array[base_index++] = base; } } diff --git a/source/blender/blenkernel/intern/object_update.c b/source/blender/blenkernel/intern/object_update.c index de2002624c0..7904e479933 100644 --- a/source/blender/blenkernel/intern/object_update.c +++ b/source/blender/blenkernel/intern/object_update.c @@ -433,9 +433,16 @@ void BKE_object_data_select_update(const EvaluationContext *UNUSED(eval_ctx), } } -void BKE_object_eval_flush_base_flags(const EvaluationContext *UNUSED(eval_ctx), - Object *object, Base *base, bool is_from_set) +void BKE_object_eval_flush_base_flags(const EvaluationContext *eval_ctx, + Object *object, int base_index, bool is_from_set) { + ViewLayer *view_layer = eval_ctx->view_layer; + BLI_assert(view_layer->object_bases_array != NULL); + BLI_assert(base_index >= 0); + BLI_assert(base_index < MEM_allocN_len(view_layer->object_bases_array) / sizeof(Base *)); + Base *base = view_layer->object_bases_array[base_index]; + BLI_assert(base->object == object); + DEG_debug_print_eval(__func__, object->id.name, object); /* Make sure we have the base collection settings is already populated. |