Commit: 55a56a31a03ffba115c326c1061762434a72a690 Author: Campbell Barton Date: Fri Mar 10 06:16:15 2017 +1100 Branches: blender2.8 https://developer.blender.org/rB55a56a31a03ffba115c326c1061762434a72a690
Merge branch 'master' into blender2.8 Manually merged viewport xray changes =================================================================== =================================================================== diff --cc source/blender/editors/space_view3d/drawobject.c index bd90f5c79a4,898f155cc92..6852e171f56 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@@ -9131,6 -8174,50 +9131,48 @@@ afterdraw ED_view3d_clear_mats_rv3d(rv3d); } + + /** + * Drawing for selection picking, + * caller must have called 'GPU_select_load_id(base->selcode)' first. + */ -void draw_object_select(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short dflag) ++void draw_object_select(Scene *scene, SceneLayer *sl, ARegion *ar, View3D *v3d, Base *base, const short dflag) + { + BLI_assert(dflag & DRAW_PICKING && dflag & DRAW_CONSTCOLOR); - draw_object(scene, ar, v3d, base, dflag); ++ draw_object(scene, sl, ar, v3d, base, dflag); + + /* we draw duplicators for selection too */ + if ((base->object->transflag & OB_DUPLI)) { + ListBase *lb; + DupliObject *dob; + Base tbase; + - tbase.flag = OB_FROMDUPLI; ++ tbase.flag_legacy = OB_FROMDUPLI; + lb = object_duplilist(G.main->eval_ctx, scene, base->object); + + for (dob = lb->first; dob; dob = dob->next) { + float omat[4][4]; - char dt; - short dtx; + + tbase.object = dob->ob; + copy_m4_m4(omat, dob->ob->obmat); + copy_m4_m4(dob->ob->obmat, dob->mat); + + /* extra service: draw the duplicator in drawtype of parent */ + /* MIN2 for the drawtype to allow bounding box objects in groups for lods */ - dt = tbase.object->dt; tbase.object->dt = MIN2(tbase.object->dt, base->object->dt); - dtx = tbase.object->dtx; tbase.object->dtx = base->object->dtx; ++ char dt = tbase.object->dt; tbase.object->dt = MIN2(tbase.object->dt, base->object->dt); ++ short dtx = tbase.object->dtx; tbase.object->dtx = base->object->dtx; + - draw_object(scene, ar, v3d, &tbase, dflag); ++ draw_object(scene, sl, ar, v3d, &tbase, dflag); + + tbase.object->dt = dt; + tbase.object->dtx = dtx; + + copy_m4_m4(dob->ob->obmat, omat); + } + free_object_duplilist(lb); + } + } + /* ***************** BACKBUF SEL (BBS) ********* */ static void bbs_obmode_mesh_verts__mapFunc(void *userData, int index, const float co[3], diff --cc source/blender/editors/space_view3d/view3d_draw_legacy.c index 51963778ef8,3fb2761d40e..42ecacd4bfc --- a/source/blender/editors/space_view3d/view3d_draw_legacy.c +++ b/source/blender/editors/space_view3d/view3d_draw_legacy.c @@@ -101,7 -100,7 +101,8 @@@ #include "GPU_material.h" #include "GPU_compositing.h" #include "GPU_extensions.h" +#include "GPU_immediate.h" + #include "GPU_select.h" #include "view3d_intern.h" /* own include */ @@@ -908,6 -2024,35 +909,35 @@@ static void view3d_draw_xraytransp(Scen 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, ARegion *ar, View3D *v3d, bool *clear) ++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, ar, v3d, v3da->base, v3da->dflag); ++ draw_object_select(scene, sl, ar, v3d, v3da->base, v3da->dflag); + } + MEM_freeN(v3da); + } + v3d->xray = false; + } + /* *********************** */ /* @@@ -1311,6 -2517,58 +1341,57 @@@ void ED_view3d_draw_depth(Scene *scene U.obcenter_dia = obcenter_dia; } + void ED_view3d_draw_select_loop( - ViewContext *vc, Scene *scene, View3D *v3d, ARegion *ar, ++ 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, ar, v3d, BASACT, dflag); ++ 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, ar, v3d, BASACT, dflag); ++ draw_object(scene, sl, ar, v3d, BASACT_NEW, dflag); + } + } + else { + Base *base; + - for (base = scene->base.first; base; base = base->next) { - if (base->lay & v3d->lay) { - - if ((base->object->restrictflag & OB_RESTRICT_SELECT) || ++ 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_select(scene, ar, v3d, base, dflag); ++ 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, ar, v3d, &xrayclear); ++ view3d_draw_xray_select(scene, sl, ar, v3d, &xrayclear); + } + } + } + } + typedef struct View3DShadow { struct View3DShadow *next, *prev; GPULamp *lamp; diff --cc source/blender/editors/space_view3d/view3d_intern.h index eb961c786af,c2b8d1f8bda..0354b16c10f --- a/source/blender/editors/space_view3d/view3d_intern.h +++ b/source/blender/editors/space_view3d/view3d_intern.h @@@ -144,23 -142,13 +144,25 @@@ void draw_motion_paths_cleanup(View3D * /* drawobject.c */ -void draw_object(Scene *scene, struct ARegion *ar, View3D *v3d, Base *base, const short dflag); -void draw_object_select(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short dflag); +void draw_object(Scene *scene, struct SceneLayer *sl, struct ARegion *ar, View3D *v3d, BaseLegacy *base, const short dflag); ++void draw_object_select(Scene *scene, struct SceneLayer *sl, struct ARegion *ar, View3D *v3d, Base *base, const short dflag); + -bool draw_glsl_material(Scene *scene, struct Object *ob, View3D *v3d, const char dt); -void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, struct Object *ob, const char dt, int outline); +void draw_mesh_object_outline(View3D *v3d, Object *ob, struct DerivedMesh *dm); + +bool draw_glsl_material(Scene *scene, struct SceneLayer *sl, struct Object *ob, View3D *v3d, const char dt); +void draw_object_instance(Scene *scene, struct SceneLayer *sl, View3D *v3d, RegionView3D *rv3d, struct Object *ob, const char dt, int outline, float wire_col[4]); void draw_object_backbufsel(Scene *scene, View3D *v3d, RegionView3D *rv3d, struct Object *ob); -void drawaxes(const float viewmat_local[4][4], float size, char drawtype); + +void draw_object_wire_color(Scene *scene, struct SceneLayer *, Base *base, unsigned char r_ob_wire_col[4]); +void drawaxes(const float viewmat_local[4][4], float size, char drawtype, const unsigned char color[4]); +void drawlamp(View3D *v3d, RegionView3D *rv3d, Base *base, + const char dt, const short dflag, const unsigned char ob_wire_col[4], + const bool is_obact); +void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, + const short dflag, const unsigned char ob_wire_col[4]); +void drawspeaker(const unsigned char ob_wire_col[3]); +void draw_bounding_volume(struct Object *ob, char type, const unsigned char ob_wire_col[4]); +void draw_rigidbody_shape(struct Object *ob, const unsigned char ob_wire_col[4]); void view3d_cached_text_draw_begin(void); void view3d_cached_text_draw_add(const float co[3], @@@ -207,14 -195,15 +209,18 @@@ void draw_sim_debug_data(Scene *scene, /* view3d_draw.c */ void view3d_main_region_draw(const struct bContext *C, struct ARegion *ar); +void view3d_draw_region_info(const struct bContext *C, struct ARegion *ar); + +/* view3d_draw_legacy.c */ +void view3d_main_region_draw_legacy(const struct bContext *C, struct ARegion *ar); void ED_view3d_draw_depth(Scene *scene, struct ARegion *ar, View3D *v3d, bool alphaoverride); void ED_view3d_draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d); + void ED_view3d_draw_select_loop( - ViewContext *vc, Scene *scene, View3D *v3d, ARegion *ar, ++ ViewContext *vc, Scene *scene, struct SceneLayer *sl, View3D *v3d, ARegion *ar, + bool use_obedit_skip, bool use_nearest); + -void ED_view3d_after_add(ListBase *lb, Base *base, const short dflag);\ +void ED_view3d_after_add(ListBase *lb, BaseLegacy *base, const short dflag); -void circf(float x, float y, float rad); void circ(float x, float y, float rad); void view3d_update_depths_rect(struct ARegion *ar, struct ViewDepths *d, struct rcti *rect); float view3d_depth_near(struct ViewDepths *d); diff --cc source/blender/editors/space_view3d/view3d_view.c index bd2071165db,8230a0de6b9..f2d25ddcbd6 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@@ -1251,7 -1185,7 +1181,7 @@@ int view3d_opengl_select GPU_select_begin(buffer, bufsize, &rect, gpu_select_mode, 0); - view3d_select_loop(vc, scene, sl, v3d, ar, use_obedit_skip); - ED_view3d_draw_select_loop(vc, scene, v3d, ar, use_obedit_skip, use_nearest); ++ ED_view3d_draw_select_loop(vc, scene, sl, v3d, ar, use_obedit_skip, use_nearest); hits = GPU_select_end(); @@@ -1259,7 -1193,7 +1189,7 @@@ if (do_passes) { GPU_select_begin(b @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs