diff options
author | Campbell Barton <ideasman42@gmail.com> | 2017-03-09 22:16:15 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2017-03-09 22:58:29 +0300 |
commit | 55a56a31a03ffba115c326c1061762434a72a690 (patch) | |
tree | f4c3952d5c0f1123047d275adb602d0c902bcb5c /source/blender/editors/space_view3d/view3d_draw_legacy.c | |
parent | 711ac904816cb4d5e19ed9302b6c99b5aa4eaddd (diff) | |
parent | 62cc226101fab61b5ae2f18f8cbe8f1e5ac6ce82 (diff) |
Merge branch 'master' into blender2.8
Manually merged viewport xray changes
Diffstat (limited to 'source/blender/editors/space_view3d/view3d_draw_legacy.c')
-rw-r--r-- | source/blender/editors/space_view3d/view3d_draw_legacy.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/source/blender/editors/space_view3d/view3d_draw_legacy.c b/source/blender/editors/space_view3d/view3d_draw_legacy.c index 51963778ef8..42ecacd4bfc 100644 --- a/source/blender/editors/space_view3d/view3d_draw_legacy.c +++ b/source/blender/editors/space_view3d/view3d_draw_legacy.c @@ -102,6 +102,7 @@ #include "GPU_compositing.h" #include "GPU_extensions.h" #include "GPU_immediate.h" +#include "GPU_select.h" #include "view3d_intern.h" /* own include */ @@ -908,6 +909,35 @@ static void view3d_draw_xraytransp(Scene *scene, SceneLayer *sl, ARegion *ar, Vi glDepthMask(GL_TRUE); } +/* clears zbuffer and draws it over, + * note that in the select version we don't care about transparent flag as with regular drawing */ +static void view3d_draw_xray_select(Scene *scene, SceneLayer *sl, ARegion *ar, View3D *v3d, bool *clear) +{ + /* Not ideal, but we need to read from the previous depths before clearing + * otherwise we could have a function to load the depths after drawing. + * + * Clearing the depth buffer isn't all that common between drawing objects so accept this for now. + */ + if (U.gpu_select_pick_deph) { + GPU_select_load_id(-1); + } + + View3DAfter *v3da; + if (*clear && v3d->zbuf) { + glClear(GL_DEPTH_BUFFER_BIT); + *clear = false; + } + + v3d->xray = true; + while ((v3da = BLI_pophead(&v3d->afterdraw_xray))) { + if (GPU_select_load_id(v3da->base->selcol)) { + draw_object_select(scene, sl, ar, v3d, v3da->base, v3da->dflag); + } + MEM_freeN(v3da); + } + v3d->xray = false; +} + /* *********************** */ /* @@ -1311,6 +1341,57 @@ void ED_view3d_draw_depth(Scene *scene, ARegion *ar, View3D *v3d, bool alphaover U.obcenter_dia = obcenter_dia; } +void ED_view3d_draw_select_loop( + ViewContext *vc, Scene *scene, SceneLayer *sl, View3D *v3d, ARegion *ar, + bool use_obedit_skip, bool use_nearest) +{ + short code = 1; + const short dflag = DRAW_PICKING | DRAW_CONSTCOLOR; + + if (vc->obedit && vc->obedit->type == OB_MBALL) { + draw_object(scene, sl, ar, v3d, BASACT_NEW, dflag); + } + else if ((vc->obedit && vc->obedit->type == OB_ARMATURE)) { + /* if not drawing sketch, draw bones */ + if (!BDR_drawSketchNames(vc)) { + draw_object(scene, sl, ar, v3d, BASACT_NEW, dflag); + } + } + else { + Base *base; + + for (base = sl->object_bases.first; base; base = base->next) { + if ((base->flag & BASE_VISIBLED) != 0) { + if (((base->flag & BASE_SELECTABLED) == 0) || + (use_obedit_skip && (scene->obedit->data == base->object->data))) + { + base->selcol = 0; + } + else { + base->selcol = code; + + if (use_nearest && (base->object->dtx & OB_DRAWXRAY)) { + ED_view3d_after_add(&v3d->afterdraw_xray, base, dflag); + } + else { + if (GPU_select_load_id(code)) { + draw_object(scene, sl, ar, v3d, base, dflag); + } + } + code++; + } + } + } + + if (use_nearest) { + bool xrayclear = true; + if (v3d->afterdraw_xray.first) { + view3d_draw_xray_select(scene, sl, ar, v3d, &xrayclear); + } + } + } +} + typedef struct View3DShadow { struct View3DShadow *next, *prev; GPULamp *lamp; |