Commit: 699d7fd7322dcbb96a131a94f1656845cfe41178
Author: Mike Erwin
Date:   Thu Apr 9 02:35:11 2015 -0400
Branches: GPU_data_request
https://developer.blender.org/rB699d7fd7322dcbb96a131a94f1656845cfe41178

tweak GL state tracking

New defaults to match common 3D view usage:
- draw both sides (backface culling off)
- depth buffer test & write enabled

Also made default state more readable.
Fixed copy-paste error, GL_POLYGON_STIPPLE.

Mesh objects now draw fine in wireframe and (smooth) solid modes. Now
compatible with UI widgets drawn later!

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

M       source/blender/editors/space_view3d/drawobject.c
M       source/blender/editors/space_view3d/view3d_draw.c
M       source/blender/gpu/intern/gpux_state.c

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

diff --git a/source/blender/editors/space_view3d/drawobject.c 
b/source/blender/editors/space_view3d/drawobject.c
index c3b41d4..8e513f5 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -2104,14 +2104,10 @@ static void drawcamera_new_new(Scene *scene, View3D 
*v3d, RegionView3D *rv3d, Ba
                 * for active cameras. We actually draw both outline+filled
                 * for active cameras so the wire can be seen side-on */
                if (ob == v3d->camera) {
-                       PolygonDrawState polygon_state = default_state.polygon;
-                       polygon_state.draw_front = true;
-                       polygon_state.draw_back = true;
-
                        elem = GPUx_element_list_create(GL_TRIANGLES, 1, 7);
                        GPUx_set_triangle_vertices(elem, 0,  5,6,7);
 
-                       GPUx_draw_triangles(&default_state.common, 
&polygon_state, verts, elem);
+                       GPUx_draw_triangles(&default_state.common, 
&default_state.polygon, verts, elem);
 
                        GPUx_element_list_discard(elem);
                }
@@ -4468,14 +4464,11 @@ static bool draw_mesh_object_new_new(Scene *scene, 
ARegion *ar, View3D *v3d, Reg
                        /* TODO: handle flat faces */
                        /* TODO: handle loop normals */
                        int i, t, tri_ct = 0;
-                       MFace *faces = dm->getTessFaceDataArray(dm, CD_MFACE);
+                       MFace *faces = dm->getTessFaceArray(dm);
                        CommonDrawState common_state = default_state.common;
                        PolygonDrawState polygon_state = default_state.polygon;
                        common_state.lighting = true;
-                       common_state.depth_test = true;
-                       common_state.depth_write = true;
-                       polygon_state.draw_front = true;
-                       polygon_state.draw_back = true;
+                       polygon_state.draw_back = false;
 
                        GPUx_specify_attrib(verts, 1, GL_NORMAL_ARRAY, 
GL_SHORT, 3, NORMALIZE_INT_TO_FLOAT);
                        GPUx_fill_attrib_stride(verts, 1, &mverts[0].no, 
sizeof(MVert));
@@ -4496,20 +4489,16 @@ static bool draw_mesh_object_new_new(Scene *scene, 
ARegion *ar, View3D *v3d, Reg
 
                        /* TODO: update state tracking to handle all these */
                        glShadeModel(GL_SMOOTH);
-//                     glEnable(GL_DEPTH_TEST);
 
                        GPUx_vertex_buffer_prime(verts);
                        GPUx_draw_triangles(&common_state, &polygon_state, 
verts, elem);
 
-//                     glDisable(GL_DEPTH_TEST);
                        glShadeModel(GL_FLAT); /* restore default */
                }
                else if (dt == OB_WIRE) {
                        /* draw wireframe */
                        int i;
                        MEdge *edges = dm->getEdgeArray(dm);
-                       LineDrawState line_state = default_state.line;
-//                     line_state.smooth = true;
 
                        elem = GPUx_element_list_create(GL_LINES, edge_ct, 
vert_ct - 1);
 
@@ -4519,7 +4508,7 @@ static bool draw_mesh_object_new_new(Scene *scene, 
ARegion *ar, View3D *v3d, Reg
                        }
 
                        GPUx_vertex_buffer_prime(verts);
-                       GPUx_draw_lines(&default_state.common, &line_state, 
verts, elem);
+                       GPUx_draw_lines(&default_state.common, 
&default_state.line, verts, elem);
                }
 
                if (elem)
diff --git a/source/blender/editors/space_view3d/view3d_draw.c 
b/source/blender/editors/space_view3d/view3d_draw.c
index 65dec7d..dfa2b41 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -3587,6 +3587,8 @@ static void view3d_main_area_draw_viewport_new(const 
bContext *UNUSED(C), Scene
 
        drawfloor(scene, v3d, grid_unit);
 
+       GPUx_reset_draw_state(); /* for code below which uses GPUx_state */
+
        /* yanked verbatim from view3d_draw_objects
         * not perfect but it does let us see objects positioned in space
         * TODO: draw objects prettier/better/faster/stronger
@@ -3601,7 +3603,7 @@ static void view3d_main_area_draw_viewport_new(const 
bContext *UNUSED(C), Scene
         * Hand-crafted logic here is tricky; will simplify later.
         */
 
-       GPUx_reset_draw_state(); /* for code below which uses GPUx_state */
+       v3d->zbuf = true;
 
        /* draw meshes (and cameras) not being edited (selected or not) */
        for (base = scene->base.first; base; base = base->next) {
@@ -3654,6 +3656,9 @@ static void view3d_main_area_draw_viewport_new(const 
bContext *UNUSED(C), Scene
                draw_object(scene, ar, v3d, base_edit, 0);
        }
 
+       /* play nice with UI drawing code outside view3d */
+       glDisable(GL_DEPTH_TEST);
+
 #if MCE_TRACE
        printf("< %s\n\n", __FUNCTION__);
 #endif /* MCE_TRACE */
diff --git a/source/blender/gpu/intern/gpux_state.c 
b/source/blender/gpu/intern/gpux_state.c
index 83e918e..a447a1d 100644
--- a/source/blender/gpu/intern/gpux_state.c
+++ b/source/blender/gpu/intern/gpux_state.c
@@ -9,10 +9,27 @@
 #endif /* TRUST_NO_ONE */
 
 const DrawState default_state = {
-       .common = { false, false, false, false },
-       .point = { false, 1.0f },
-       .line = { false, 1.0f, 0 },
-       .polygon = { true, false, MATERIAL_NONE, 0 }
+       .common = {
+               .blend = false,
+               .depth_test = true,
+               .depth_write = true,
+               .lighting = false
+       },
+       .point = {
+               .smooth = false,
+               .size = 1.0f
+       },
+       .line = {
+               .smooth = false,
+               .width = 1.0f,
+               .stipple = 0
+       },
+       .polygon = {
+               .draw_front = true,
+               .draw_back = true,
+               .material_id = MATERIAL_NONE,
+               .stipple = 0
+       }
 };
 
 static DrawState current;
@@ -23,9 +40,7 @@ static bool polygon_stipple_pattern_set = false;
 void GPUx_reset_draw_state()
 {
        current = default_state;
-#if 0 /* TODO: make default state play nice with UI drawing code */
        GPUx_force_state_update();
-#endif
 }
 
 void GPUx_set_common_state(const CommonDrawState *state)
@@ -96,7 +111,7 @@ void GPUx_set_line_state(const LineDrawState *state)
 
        if (state->stipple != current.line.stipple) {
                if (state->stipple) {
-                       const GLushort pattern = 0x4E72; /* or 0xAAAA */
+                       const GLushort pattern = 0xAAAA;
                        glEnable(GL_LINE_STIPPLE);
                        /* line stipple is 16-bit pattern */
                        glLineStipple(state->stipple, pattern);
@@ -154,7 +169,7 @@ void GPUx_set_polygon_state(const PolygonDrawState *state)
                        }
                }
                else
-                       glDisable(GL_LINE_STIPPLE);
+                       glDisable(GL_POLYGON_STIPPLE);
                current.polygon.stipple = state->stipple;
        }
 }
@@ -202,7 +217,7 @@ void GPUx_force_state_update()
        glLineWidth(current.line.width);
 
        if (current.line.stipple) {
-               const GLushort pattern = 0x4E72; /* or 0xAAAA */
+               const GLushort pattern = 0xAAAA;
                glEnable(GL_LINE_STIPPLE);
                /* line stipple is 16-bit pattern */
                glLineStipple(current.line.stipple, pattern);
@@ -229,5 +244,5 @@ void GPUx_force_state_update()
                polygon_stipple_pattern_set = true;
        }
        else
-               glDisable(GL_LINE_STIPPLE);
+               glDisable(GL_POLYGON_STIPPLE);
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to