fix [#28037] Missing orange selection lines (trivial)
authorCampbell Barton <ideasman42@gmail.com>
Thu, 21 Jul 2011 01:30:26 +0000 (01:30 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 21 Jul 2011 01:30:26 +0000 (01:30 +0000)
From what I can tell there is no good fix for this bug, calculating the 2d/3d viewborder and then attempting to align them to be pixel perfect fails because of float imprecision.

Added a workaround, so the camera border is always drawn in 2d space,
since this workaround may cause problems later on its kept under the define VIEW3D_CAMERA_BORDER_HACK so we can get old behavior back easily.

source/blender/editors/space_view3d/drawobject.c
source/blender/editors/space_view3d/view3d_draw.c
source/blender/editors/space_view3d/view3d_intern.h

index e314d249e6d44040be888af3594974275420638d..e6889f4563f27c05138545871f4d1eceea7e0c30 100644 (file)
@@ -1335,6 +1335,11 @@ static void draw_focus_cross(float dist, float size)
        glEnd();
 }
 
+#ifdef VIEW3D_CAMERA_BORDER_HACK
+float view3d_camera_border_hack_col[4];
+short view3d_camera_border_hack_test= FALSE;
+#endif
+
 /* flag similar to draw_object() */
 static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, int flag)
 {
@@ -1348,7 +1353,15 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
        const float scax= 1.0f / len_v3(ob->obmat[0]);
        const float scay= 1.0f / len_v3(ob->obmat[1]);
        const float scaz= 1.0f / len_v3(ob->obmat[2]);
-       
+
+#ifdef VIEW3D_CAMERA_BORDER_HACK
+       if(is_view && !(G.f & G_PICKSEL)) {
+               glGetFloatv(GL_CURRENT_COLOR, view3d_camera_border_hack_col);
+               view3d_camera_border_hack_test= TRUE;
+               return;
+       }
+#endif
+
        cam= ob->data;
        aspx= (float) scene->r.xsch*scene->r.xasp;
        aspy= (float) scene->r.ysch*scene->r.yasp;
index 0ed62f3953f8dc2c060bb4763a77a6ccae8da25c..d2ff6eef09798234ffd8366455385d1f69b9a5bc 100644 (file)
@@ -1007,6 +1007,8 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
        /* note: quite un-scientific but without this bit extra
         * 0.0001 on the lower left the 2D border sometimes
         * obscures the 3D camera border */
+       /* note: with VIEW3D_CAMERA_BORDER_HACK defined this error isn't noticable
+        * but keep it here incase we need to remove the workaround */
        x1i= (int)(x1 - 1.0001f);
        y1i= (int)(y1 - 1.0001f);
        x2i= (int)(x2 + (1.0f-0.0001f));
@@ -1039,7 +1041,17 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
        setlinestyle(0);
        UI_ThemeColor(TH_BACK);
        glRectf(x1i, y1i, x2i, y2i);
-       
+
+#ifdef VIEW3D_CAMERA_BORDER_HACK
+       {
+               if(view3d_camera_border_hack_test == TRUE) {
+                       glColor4fv(view3d_camera_border_hack_col);
+                       glRectf(x1i+1, y1i+1, x2i-1, y2i-1);
+                       view3d_camera_border_hack_test= FALSE;
+               }
+       }
+#endif
+
        setlinestyle(3);
        UI_ThemeColor(TH_WIRE);
        glRectf(x1i, y1i, x2i, y2i);
index aa92f0d0a590dc0aac6da7929cdbd85757d0afa0..d3886d48873278e6c2879705a35796ebe7a94cc1 100644 (file)
@@ -194,6 +194,16 @@ extern const char *view3d_context_dir[]; /* doc access */
 /* draw_volume.c */
 void draw_volume(struct ARegion *ar, struct GPUTexture *tex, float *min, float *max, int res[3], float dx, struct GPUTexture *tex_shadow);
 
+/* workaround for trivial but noticable camera bug caused by imprecision
+ * between view border calculation in 2D/3D space, workaround for bug [#28037].
+ * without this deifne we get the old behavior which is to try and align them
+ * both which _mostly_ works fine, but when the camera moves beyond ~1000 in
+ * any direction it starts to fail */
+#define VIEW3D_CAMERA_BORDER_HACK
+#ifdef VIEW3D_CAMERA_BORDER_HACK
+extern float view3d_camera_border_hack_col[4];
+extern short view3d_camera_border_hack_test;
+#endif
 
 #endif /* ED_VIEW3D_INTERN_H */