[Bf-blender-cvs] [0aebd1b] GPU_data_request: smooth lit meshes

Mike Erwin noreply at git.blender.org
Tue Apr 7 10:57:43 CEST 2015


Commit: 0aebd1b039e9d2f088f8a2c53b3cda9263fd7f81
Author: Mike Erwin
Date:   Tue Apr 7 04:56:18 2015 -0400
Branches: GPU_data_request
https://developer.blender.org/rB0aebd1b039e9d2f088f8a2c53b3cda9263fd7f81

smooth lit meshes

WIP… still having some depth buffer issues

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

M	source/blender/editors/space_view3d/drawobject.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 d5c0165..c3b41d4 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -4430,7 +4430,6 @@ static bool draw_mesh_object_new_new(Scene *scene, ARegion *ar, View3D *v3d, Reg
 
 	Object *ob = base->object;
 	Object *obedit = scene->obedit;
-	Mesh *me = ob->data;
 	bool drawlinked = false, retval = false;
 
 	BLI_assert(ob != obedit); /* should be caught by draw_object_new() before here */
@@ -4451,34 +4450,41 @@ static bool draw_mesh_object_new_new(Scene *scene, ARegion *ar, View3D *v3d, Reg
 		const int vert_ct = dm->getNumVerts(dm);
 		const int edge_ct = dm->getNumEdges(dm);
 		const int face_ct = dm->getNumTessFaces(dm);
-
-		VertexBuffer *verts = GPUx_vertex_buffer_create(1, vert_ct);
+		const int attrib_ct = (dt > OB_WIRE) ? 2 : 1;
+	
+		VertexBuffer *verts = GPUx_vertex_buffer_create(attrib_ct, vert_ct);
 		ElementList *elem = NULL;
+		MVert *mverts = dm->getVertArray(dm);
 
 #if MCE_TRACE
 		printf("%d verts, %d edges, %d faces\n", vert_ct, edge_ct, face_ct);
 #endif /* MCE_TRACE */
 
 		GPUx_specify_attrib(verts, 0, GL_VERTEX_ARRAY, GL_FLOAT, 3, KEEP_FLOAT);
-		GPUx_fill_attrib_stride(verts, 0, dm->getVertArray(dm), sizeof(MVert));
-
-		GPUx_vertex_buffer_prime(verts);
+		GPUx_fill_attrib_stride(verts, 0, mverts, sizeof(MVert));
 
-		/* draw smooth surface (as a test) */
-		if (true) {
+		if (dt > OB_WIRE) {
+			/* draw smooth surface */
+			/* TODO: handle flat faces */
+			/* TODO: handle loop normals */
 			int i, t, tri_ct = 0;
 			MFace *faces = dm->getTessFaceDataArray(dm, CD_MFACE);
+			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;
 
+			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));
+
 			/* some tess faces are quads, some triangles
 			 * we draw just triangles, so count quads twice */
 			for (i = 0; i < face_ct; ++i)
 				tri_ct += faces[i].v4 ? 2 : 1;
 
-			if (elem)
-				GPUx_element_list_discard(elem);
 			elem = GPUx_element_list_create(GL_TRIANGLES, tri_ct, vert_ct - 1);
 
 			for (i = 0, t = 0; i < face_ct; ++i) {
@@ -4488,23 +4494,23 @@ static bool draw_mesh_object_new_new(Scene *scene, ARegion *ar, View3D *v3d, Reg
 					GPUx_set_triangle_vertices(elem, t++, face->v4, face->v1, face->v3);
 			}
 
-			glEnable(GL_BLEND);
-			glColor4f(0.0f, 0.3f, 0.9f, 0.5f);
+			/* TODO: update state tracking to handle all these */
+			glShadeModel(GL_SMOOTH);
+//			glEnable(GL_DEPTH_TEST);
 
-			GPUx_draw_triangles(&default_state.common, &polygon_state, verts, elem);
+			GPUx_vertex_buffer_prime(verts);
+			GPUx_draw_triangles(&common_state, &polygon_state, verts, elem);
 
-			glDisable(GL_BLEND);
+//			glDisable(GL_DEPTH_TEST);
+			glShadeModel(GL_FLAT); /* restore default */
 		}
-
-		/* draw wireframe (as a test) */
-		else if (false) {
+		else if (dt == OB_WIRE) {
+			/* draw wireframe */
 			int i;
 			MEdge *edges = dm->getEdgeArray(dm);
 			LineDrawState line_state = default_state.line;
-			line_state.smooth = true;
+//			line_state.smooth = true;
 
-			if (elem)
-				GPUx_element_list_discard(elem);
 			elem = GPUx_element_list_create(GL_LINES, edge_ct, vert_ct - 1);
 
 			for (i = 0; i < edge_ct; ++i) {
@@ -4512,19 +4518,8 @@ static bool draw_mesh_object_new_new(Scene *scene, ARegion *ar, View3D *v3d, Reg
 				GPUx_set_line_vertices(elem, i, edge->v1, edge->v2);
 			}
 
-			glEnable(GL_BLEND);
-
+			GPUx_vertex_buffer_prime(verts);
 			GPUx_draw_lines(&default_state.common, &line_state, verts, elem);
-
-			glDisable(GL_BLEND);
-		}
-
-		/* draw points (as a test) */
-		else if (false) {
-			PointDrawState point_state = default_state.point;
-			point_state.size = 3.0f;
-			glColor3f(1,0.5,0);
-			GPUx_draw_points(&default_state.common, &point_state, verts, NULL);
 		}
 
 		if (elem)
diff --git a/source/blender/gpu/intern/gpux_state.c b/source/blender/gpu/intern/gpux_state.c
index f68908e..83e918e 100644
--- a/source/blender/gpu/intern/gpux_state.c
+++ b/source/blender/gpu/intern/gpux_state.c
@@ -9,7 +9,7 @@
 #endif /* TRUST_NO_ONE */
 
 const DrawState default_state = {
-	.common = { false, true, true, false },
+	.common = { false, false, false, false },
 	.point = { false, 1.0f },
 	.line = { false, 1.0f, 0 },
 	.polygon = { true, false, MATERIAL_NONE, 0 }
@@ -24,7 +24,7 @@ void GPUx_reset_draw_state()
 {
 	current = default_state;
 #if 0 /* TODO: make default state play nice with UI drawing code */
-	force_state_update();
+	GPUx_force_state_update();
 #endif
 }




More information about the Bf-blender-cvs mailing list