Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2018-06-19 17:41:18 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-06-19 17:43:01 +0300
commit750a78be9cfa71713bac5b73f9a61c40deeb994c (patch)
treeaefaf46f8869e949f5a8098b9c0625baed0082c5 /source/blender/draw
parent0116c95d4c9114bc9eae03401c0471fba265cd46 (diff)
3D View: improve selection locking
Locked selection would still occlude with objects which could not be selected.
Diffstat (limited to 'source/blender/draw')
-rw-r--r--source/blender/draw/DRW_engine.h5
-rw-r--r--source/blender/draw/intern/draw_manager.c17
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);