Fix: Setting cursor to semitransparent objects will fail because of clip
authorAntony Riakiotakis <kalast@gmail.com>
Sun, 17 Mar 2013 20:24:47 +0000 (20:24 +0000)
committerAntony Riakiotakis <kalast@gmail.com>
Sun, 17 Mar 2013 20:24:47 +0000 (20:24 +0000)
alpha, added option when drawing depth to disable alpha clip override.
We use that in texture paint cursor now. Not too common but may be
useful for people dealing with cloning plugins.

Reported by kgeogeo on irc, thanks.

source/blender/editors/include/ED_view3d.h
source/blender/editors/sculpt_paint/paint_image_proj.c
source/blender/editors/space_view3d/view3d_draw.c
source/blender/editors/space_view3d/view3d_edit.c
source/blender/editors/space_view3d/view3d_intern.h

index f47374c3169c2928bd616c29909ded958103f30b..12afeb2d3438e21246a0c9d71f6f34da2fd21ac9 100644 (file)
@@ -244,7 +244,7 @@ unsigned int view3d_sample_backbuf_rect(struct ViewContext *vc, const int mval[2
 unsigned int view3d_sample_backbuf(struct ViewContext *vc, int x, int y);
 
 /* draws and does a 4x4 sample */
-int ED_view3d_autodist(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, const int mval[2], float mouse_worldloc[3]);
+int ED_view3d_autodist(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, const int mval[2], float mouse_worldloc[3], bool alphaoverride);
 
 /* only draw so ED_view3d_autodist_simple can be called many times after */
 int ED_view3d_autodist_init(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, int mode);
index 96916236279d22638104bcb0493740b68ad1eec1..a90e9150345a2633052583879bd0b7b986578832 100644 (file)
@@ -4118,7 +4118,7 @@ int paint_proj_stroke(bContext *C, void *pps, const int prevmval_i[2], const int
 
                view3d_operator_needs_opengl(C);
 
-               if (!ED_view3d_autodist(scene, ps->ar, v3d, mval_i, cursor))
+               if (!ED_view3d_autodist(scene, ps->ar, v3d, mval_i, cursor, false))
                        return 0;
 
                ED_region_tag_redraw(ps->ar);
index a4d09fbb7942aeae4e3a9a36d63e423df4aaa4c9..51f2659fccdf9b6aed0865e4538b20ccf52614b8 100644 (file)
@@ -2235,7 +2235,7 @@ void draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d)
 
 }
 
-void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (*func)(void *))
+void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (*func)(void *), bool alphaoverride)
 {
        RegionView3D *rv3d = ar->regiondata;
        Base *base;
@@ -2247,7 +2247,7 @@ void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (*func)(void *))
        
        /* Setting these temporarily is not nice */
        v3d->flag &= ~V3D_SELECT_OUTLINE;
-       U.glalphaclip = 0.5; /* not that nice but means we wont zoom into billboards */
+       U.glalphaclip = alphaoverride ? 0.5 : glalphaclip; /* not that nice but means we wont zoom into billboards */
        U.obcenter_dia = 0;
        
        setwinmatrixview3d(ar, v3d, NULL);
index 8c8332075a20e19c35d67c4cf2c5dcb98c380841..a8e9c8b6cba90cf1ec66c1ffcf74e37019a42424 100644 (file)
@@ -457,7 +457,7 @@ static void viewops_data_create(bContext *C, wmOperator *op, const wmEvent *even
 
                view3d_operator_needs_opengl(C); /* needed for zbuf drawing */
 
-               if ((vod->use_dyn_ofs = ED_view3d_autodist(CTX_data_scene(C), vod->ar, vod->v3d, event->mval, vod->dyn_ofs))) {
+               if ((vod->use_dyn_ofs = ED_view3d_autodist(CTX_data_scene(C), vod->ar, vod->v3d, event->mval, vod->dyn_ofs, true))) {
                        if (rv3d->is_persp) {
                                float my_origin[3]; /* original G.vd->ofs */
                                float my_pivot[3]; /* view */
@@ -2896,7 +2896,7 @@ static int view3d_zoom_border_exec(bContext *C, wmOperator *op)
 
        /* Get Z Depths, needed for perspective, nice for ortho */
        bgl_get_mats(&mats);
-       draw_depth(scene, ar, v3d, NULL);
+       draw_depth(scene, ar, v3d, NULL, true);
        
        {
                /* avoid allocating the whole depth buffer */
@@ -3745,7 +3745,7 @@ void ED_view3d_cursor3d_position(bContext *C, float fp[3], const int mval[2])
 
                if (U.uiflag & USER_ZBUF_CURSOR) {  /* maybe this should be accessed some other way */
                        view3d_operator_needs_opengl(C);
-                       if (ED_view3d_autodist(scene, ar, v3d, mval, fp))
+                       if (ED_view3d_autodist(scene, ar, v3d, mval, fp, true))
                                depth_used = TRUE;
                }
 
@@ -3917,7 +3917,7 @@ static float view_autodist_depth_margin(ARegion *ar, const int mval[2], int marg
 }
 
 /* XXX todo Zooms in on a border drawn by the user */
-int ED_view3d_autodist(Scene *scene, ARegion *ar, View3D *v3d, const int mval[2], float mouse_worldloc[3])
+int ED_view3d_autodist(Scene *scene, ARegion *ar, View3D *v3d, const int mval[2], float mouse_worldloc[3], bool alphaoverride)
 {
        bglMats mats; /* ZBuffer depth vars */
        float depth_close = FLT_MAX;
@@ -3925,7 +3925,7 @@ int ED_view3d_autodist(Scene *scene, ARegion *ar, View3D *v3d, const int mval[2]
 
        /* Get Z Depths, needed for perspective, nice for ortho */
        bgl_get_mats(&mats);
-       draw_depth(scene, ar, v3d, NULL);
+       draw_depth(scene, ar, v3d, NULL, alphaoverride);
 
        depth_close = view_autodist_depth_margin(ar, mval, 4);
 
@@ -3952,7 +3952,7 @@ int ED_view3d_autodist_init(Scene *scene, ARegion *ar, View3D *v3d, int mode)
        /* Get Z Depths, needed for perspective, nice for ortho */
        switch (mode) {
                case 0:
-                       draw_depth(scene, ar, v3d, NULL);
+                       draw_depth(scene, ar, v3d, NULL, true);
                        break;
                case 1:
                        draw_depth_gpencil(scene, ar, v3d);
index 26ed8e1885c4ce22f090263020614b23fe9aa563..8bce8cd3e01c3adb9ef7ca57a4d9dc64061ae5ab 100644 (file)
@@ -152,7 +152,7 @@ void draw_mesh_paint(View3D *v3d, RegionView3D *rv3d,
 
 /* view3d_draw.c */
 void view3d_main_area_draw(const struct bContext *C, struct ARegion *ar);
-void draw_depth(Scene *scene, struct ARegion *ar, View3D *v3d, int (*func)(void *));
+void draw_depth(Scene *scene, struct ARegion *ar, View3D *v3d, int (*func)(void *), bool alphaoverride);
 void draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d);
 void ED_view3d_after_add(ListBase *lb, Base *base, const short dflag);