Commit: 90e7be47101fedea8ca1b35e0118cdfdda1291a1
Author: Campbell Barton
Date:   Mon Dec 9 20:59:29 2013 +1100
http://developer.blender.org/rB90e7be47101fedea8ca1b35e0118cdfdda1291a1

Fix T37727: z-offset problems with camera view

===================================================================

M       source/blender/editors/include/ED_view3d.h
M       source/blender/editors/screen/glutil.c
M       source/blender/editors/space_view3d/drawarmature.c
M       source/blender/editors/space_view3d/drawmesh.c
M       source/blender/editors/space_view3d/drawobject.c
M       source/blender/editors/space_view3d/view3d_view.c

===================================================================

diff --git a/source/blender/editors/include/ED_view3d.h 
b/source/blender/editors/include/ED_view3d.h
index ae8aeab..f155247 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -218,6 +218,9 @@ bool ED_view3d_clip_range_get(struct View3D *v3d, struct 
RegionView3D *rv3d,
                               float *r_clipsta, float *r_clipend, const bool 
use_ortho_factor);
 bool ED_view3d_viewplane_get(struct View3D *v3d, struct RegionView3D *rv3d, 
int winxi, int winyi,
                              struct rctf *r_viewplane, float *r_clipsta, float 
*r_clipend, float *r_pixsize);
+
+void ED_view3d_polygon_offset(const struct RegionView3D *rv3d, const float 
dist);
+
 void ED_view3d_calc_camera_border(struct Scene *scene, struct ARegion *ar,
                                   struct View3D *v3d, struct RegionView3D 
*rv3d,
                                   struct rctf *r_viewborder, const bool 
no_shift);
diff --git a/source/blender/editors/screen/glutil.c 
b/source/blender/editors/screen/glutil.c
index f02cb4a..57d9717 100644
--- a/source/blender/editors/screen/glutil.c
+++ b/source/blender/editors/screen/glutil.c
@@ -981,7 +981,9 @@ void bgl_get_mats(bglMats *mats)
 
 /* *************** glPolygonOffset hack ************* */
 
-/* dist is only for ortho now... */
+/**
+ * \note \a viewdist is only for ortho at the moment.
+ */
 void bglPolygonOffset(float viewdist, float dist) 
 {
        static float winmat[16], offset = 0.0;
diff --git a/source/blender/editors/space_view3d/drawarmature.c 
b/source/blender/editors/space_view3d/drawarmature.c
index de6fafb..8aced48 100644
--- a/source/blender/editors/space_view3d/drawarmature.c
+++ b/source/blender/editors/space_view3d/drawarmature.c
@@ -1878,7 +1878,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, 
ARegion *ar, Base *base,
                }
                /* if solid && posemode, we draw again with polygonoffset */
                else if ((dt > OB_WIRE) && (arm->flag & ARM_POSEMODE)) {
-                       bglPolygonOffset(rv3d->dist, 1.0);
+                       ED_view3d_polygon_offset(rv3d, 1.0);
                }
                else {
                        /* and we use selection indices if not done yet */
@@ -1986,7 +1986,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, 
ARegion *ar, Base *base,
                }
                /* restore things */
                if (!ELEM(arm->drawtype, ARM_WIRE, ARM_LINE) && (dt > OB_WIRE) 
&& (arm->flag & ARM_POSEMODE))
-                       bglPolygonOffset(rv3d->dist, 0.0);
+                       ED_view3d_polygon_offset(rv3d, 0.0);
        }
        
        /* restore */
@@ -2154,7 +2154,7 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object 
*ob, const short dt)
                        index = 0;
        }
        else if (dt > OB_WIRE) 
-               bglPolygonOffset(rv3d->dist, 1.0f);
+               ED_view3d_polygon_offset(rv3d, 1.0);
        else if (arm->flag & ARM_EDITMODE) 
                index = 0;  /* do selection codes */
        
@@ -2221,7 +2221,7 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object 
*ob, const short dt)
                /* pass */
        }
        else if (dt > OB_WIRE) {
-               bglPolygonOffset(rv3d->dist, 0.0f);
+               ED_view3d_polygon_offset(rv3d, 0.0);
        }
        
        /* finally names and axes */
diff --git a/source/blender/editors/space_view3d/drawmesh.c 
b/source/blender/editors/space_view3d/drawmesh.c
index a08a6cc..52897aa 100644
--- a/source/blender/editors/space_view3d/drawmesh.c
+++ b/source/blender/editors/space_view3d/drawmesh.c
@@ -170,7 +170,7 @@ void draw_mesh_face_select(RegionView3D *rv3d, Mesh *me, 
DerivedMesh *dm)
 
        glEnable(GL_DEPTH_TEST);
        glDisable(GL_LIGHTING);
-       bglPolygonOffset(rv3d->dist, 1.0);
+       ED_view3d_polygon_offset(rv3d, 1.0);
 
        /* Draw (Hidden) Edges */
        setlinestyle(1);
@@ -188,7 +188,7 @@ void draw_mesh_face_select(RegionView3D *rv3d, Mesh *me, 
DerivedMesh *dm)
                glDisable(GL_BLEND);
        }
        
-       bglPolygonOffset(rv3d->dist, 1.0);
+       ED_view3d_polygon_offset(rv3d, 1.0);
 
        /* Draw Stippled Outline for selected faces */
        glColor3ub(255, 255, 255);
@@ -196,7 +196,7 @@ void draw_mesh_face_select(RegionView3D *rv3d, Mesh *me, 
DerivedMesh *dm)
        dm->drawMappedEdges(dm, draw_mesh_face_select__setSelectOpts, &data);
        setlinestyle(0);
 
-       bglPolygonOffset(rv3d->dist, 0.0);  /* resets correctly now, even after 
calling accumulated offsets */
+       ED_view3d_polygon_offset(rv3d, 0.0);  /* resets correctly now, even 
after calling accumulated offsets */
 
        MEM_freeN(data.edge_flags);
 }
@@ -1055,7 +1055,7 @@ void draw_mesh_paint_weight_edges(RegionView3D *rv3d, 
DerivedMesh *dm, const boo
         * rather than the shading, this is also forced in wire view */
 
        if (use_depth) {
-               bglPolygonOffset(rv3d->dist, 1.0);
+               ED_view3d_polygon_offset(rv3d, 1.0);
                glDepthMask(0);  /* disable write in zbuffer, selected edge 
wires show better */
        }
        else {
@@ -1070,7 +1070,7 @@ void draw_mesh_paint_weight_edges(RegionView3D *rv3d, 
DerivedMesh *dm, const boo
        dm->drawMappedEdges(dm, (DMSetDrawOptions)edgemask_cb, user_data);
 
        if (use_depth) {
-               bglPolygonOffset(rv3d->dist, 0.0);
+               ED_view3d_polygon_offset(rv3d, 0.0);
                glDepthMask(1);
        }
        else {
diff --git a/source/blender/editors/space_view3d/drawobject.c 
b/source/blender/editors/space_view3d/drawobject.c
index b4b8bd2..225c582 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -3123,7 +3123,7 @@ static void draw_em_fancy(Scene *scene, ARegion *ar, 
View3D *v3d,
                if (dt > OB_WIRE) {
                        draw_mesh_paint_weight_faces(finalDM, true, 
draw_em_fancy__setFaceOpts, me->edit_btmesh);
 
-                       bglPolygonOffset(rv3d->dist, 1.0);
+                       ED_view3d_polygon_offset(rv3d, 1.0);
                        glDepthMask(0);
                }
                else {
@@ -3173,7 +3173,7 @@ static void draw_em_fancy(Scene *scene, ARegion *ar, 
View3D *v3d,
                 * write to show selected edge wires better */
                UI_ThemeColor(TH_WIRE_EDIT);
 
-               bglPolygonOffset(rv3d->dist, 1.0);
+               ED_view3d_polygon_offset(rv3d, 1.0);
                glDepthMask(0);
        }
        else {
@@ -3319,12 +3319,12 @@ static void draw_em_fancy(Scene *scene, ARegion *ar, 
View3D *v3d,
 
        if (dt > OB_WIRE) {
                glDepthMask(1);
-               bglPolygonOffset(rv3d->dist, 0.0);
+               ED_view3d_polygon_offset(rv3d, 0.0);
                GPU_disable_material();
        }
 #if 0  /* currently not needed */
        else if (use_occlude_wire) {
-               bglPolygonOffset(rv3d->dist, 0.0);
+               ED_view3d_polygon_offset(rv3d, 0.0);
        }
 #endif
 }
@@ -3565,7 +3565,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, 
View3D *v3d, RegionView3D
                 * otherwise this wire is to overlay solid mode faces so do 
some depth buffer tricks.
                 */
                if (dt != OB_WIRE && (draw_wire == OBDRAW_WIRE_ON_DEPTH)) {
-                       bglPolygonOffset(rv3d->dist, 1.0);
+                       ED_view3d_polygon_offset(rv3d, 1.0);
                        glDepthMask(0);  /* disable write in zbuffer, selected 
edge wires show better */
                }
                
@@ -3573,7 +3573,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, 
View3D *v3d, RegionView3D
 
                if (dt != OB_WIRE && (draw_wire == OBDRAW_WIRE_ON_DEPTH)) {
                        glDepthMask(1);
-                       bglPolygonOffset(rv3d->dist, 0.0);
+                       ED_view3d_polygon_offset(rv3d, 0.0);
                }
        }
        
@@ -3583,10 +3583,10 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, 
View3D *v3d, RegionView3D
                glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE));
 
                if (!use_depth) glDisable(GL_DEPTH_TEST);
-               else            bglPolygonOffset(rv3d->dist, 1.0);
+               else            ED_view3d_polygon_offset(rv3d, 1.0);
                drawSelectedVertices(dm, ob->data);
                if (!use_depth) glEnable(GL_DEPTH_TEST);
-               else            bglPolygonOffset(rv3d->dist, 0.0);
+               else            ED_view3d_polygon_offset(rv3d, 0.0);
                
                glPointSize(1.0f);
        }
@@ -5756,7 +5756,7 @@ static void draw_empty_cone(float size)
 static void draw_textcurs(RegionView3D *rv3d, float textcurs[4][2])
 {
        cpack(0);
-       bglPolygonOffset(rv3d->dist, -1.0);
+       ED_view3d_polygon_offset(rv3d, -1.0);
        set_inverted_drawing(1);
        glBegin(GL_QUADS);
        glVertex2fv(textcurs[0]);
@@ -5765,7 +5765,7 @@ static void draw_textcurs(RegionView3D *rv3d, float 
textcurs[4][2])
        glVertex2fv(textcurs[3]);
        glEnd();
        set_inverted_drawing(0);
-       bglPolygonOffset(rv3d->dist, 0.0);
+       ED_view3d_polygon_offset(rv3d, 0.0);
 }
 
 static void drawspiral(const float cent[3], float rad, float tmat[4][4], int 
start)
@@ -6377,7 +6377,7 @@ static void draw_wire_extra(Scene *scene, RegionView3D 
*rv3d, Object *ob, unsign
                        glColor3ubv(ob_wire_col);
                }
 
-               bglPolygonOffset(rv3d->dist, 1.0);
+               ED_view3d_polygon_offset(rv3d, 1.0);
                glDepthMask(0);  /* disable write in zbuffer, selected edge 
wires show better */
 
                if (ELEM3(ob->type, OB_FONT, OB_CURVE, OB_SURF)) {
@@ -6403,7 +6403,7 @@ static void draw_wire_extra(Scene *scene, RegionView3D 
*rv3d, Object *ob, unsign
                }
 
                glDepthMask(1);
-               bglPolygonOffset(rv3d->dist, 0.0);
+               ED_view3d_polygon_offset(rv3d, 0.0);
        }
 }
 
@@ -7556,7 +7556,7 @@ void draw_object_backbufsel(Scene *scene, View3D *v3d, 
RegionView3D *rv3d, Objec
                                else
                                        bm_solidoffs = 1;
 
-                               bglPolygonOffset(rv3d->dist, 1.0);
+                               ED_view3d_polygon_offset(rv3d, 1.0);
 
                                /* we draw edges always, for loop (select) 
tools */
                                bbs_mesh_wire(em, dm, bm_solidoffs);
@@ -7571,7 +7571,7 @@ void draw_object_backbufsel(Scene *scene, View3D *v3d, 
RegionView3D *rv3d, Objec
                                        bm_vertoffs = bm_wireoffs;
                                }
 
-                               bglPolygonOffset(rv3d->dist, 0.0);
+                               ED_view3d_polygon_offset(rv3d, 0.0);
 
                                dm->release(dm);
                        }
diff --git a/source/blender/editors/space_view3d/view3d_view.c 
b/source/blender/editors/space_view3d/view3d_view.c
index 475f466..d81ab03 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -721,6 +721,25 @@ bool ED_view3d_viewplane_get(View3D *v3d, RegionView3D 
*rv3d, int winx, int winy
        return params.is_ortho;
 }
 
+/**
+ * Use instead of: ``bglPolygonOffset(rv3d->dist, ...)`` see bug [#37727]
+ */
+void ED_view3d_polygon_offset(const RegionView3D *rv3d, float dist)
+{
+       float viewdist = rv3d->dist;
+
+       /* special exception for ortho camera (viewdist isnt used for 
perspective cameras) */
+       if (dist != 0.0f) {
+               if (rv3d->persp == RV3D_CAMOB) {
+                       if (rv3d->is_persp == false) {
+                               viewdist = 1.0f / 
max_ff(fabsf(rv3d->winmat[0][0]), fabsf(rv3d->winmat[1][1]));
+                       }
+               }
+       }
+
+       bglPolygonOffset(viewdist, dist);
+}
+
 /*!
  * \param rect for picking, NULL not to use.
  */

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to