diff options
Diffstat (limited to 'source/blender/draw')
-rw-r--r-- | source/blender/draw/DRW_engine.h | 5 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 17 |
2 files changed, 20 insertions, 2 deletions
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h index 524a94e5886..d126dcb71aa 100644 --- a/source/blender/draw/DRW_engine.h +++ b/source/blender/draw/DRW_engine.h @@ -94,6 +94,8 @@ void DRW_notify_view_update(const DRWUpdateContext *update_ctx); typedef enum eDRWSelectStage { DRW_SELECT_PASS_PRE = 1, DRW_SELECT_PASS_POST, } eDRWSelectStage; typedef bool (*DRW_SelectPassFn)( eDRWSelectStage stage, void *user_data); +typedef bool (*DRW_ObjectFilterFn)( + struct Object *ob, void *user_data); void DRW_draw_view(const struct bContext *C); @@ -118,7 +120,8 @@ void DRW_draw_select_loop( struct Depsgraph *depsgraph, struct ARegion *ar, struct View3D *v3d, bool use_obedit_skip, bool use_nearest, const struct rcti *rect, - DRW_SelectPassFn select_pass_fn, void *select_pass_user_data); + DRW_SelectPassFn select_pass_fn, void *select_pass_user_data, + DRW_ObjectFilterFn object_filter_fn, void *object_filter_user_data); void DRW_draw_depth_loop( struct Depsgraph *depsgraph, struct ARegion *ar, struct View3D *v3d); diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index ef42b88fd72..fcdc4a3a016 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -1634,7 +1634,8 @@ void DRW_draw_select_loop( struct Depsgraph *depsgraph, ARegion *ar, View3D *v3d, bool UNUSED(use_obedit_skip), bool UNUSED(use_nearest), const rcti *rect, - DRW_SelectPassFn select_pass_fn, void *select_pass_user_data) + DRW_SelectPassFn select_pass_fn, void *select_pass_user_data, + DRW_ObjectFilterFn object_filter_fn, void *object_filter_user_data) { Scene *scene = DEG_get_evaluated_scene(depsgraph); RenderEngineType *engine_type = ED_view3d_engine_type(scene, v3d->drawtype); @@ -1721,6 +1722,7 @@ void DRW_draw_select_loop( #endif } else { + bool filter_exclude = false; DEG_OBJECT_ITER_BEGIN( depsgraph, ob, DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY | @@ -1728,6 +1730,19 @@ void DRW_draw_select_loop( DEG_ITER_OBJECT_FLAG_DUPLI) { if ((ob->base_flag & BASE_SELECTABLED) != 0) { + + if (object_filter_fn != NULL) { + if (ob->base_flag & BASE_FROMDUPLI) { + /* pass (use previous filter_exclude value) */ + } + else { + filter_exclude = (object_filter_fn(ob, object_filter_user_data) == false); + } + if (filter_exclude) { + continue; + } + } + /* This relies on dupli instances being after their instancing object. */ if ((ob->base_flag & BASE_FROMDUPLI) == 0) { Object *ob_orig = DEG_get_original_object(ob); |