[Bf-blender-cvs] [3eaf30d] GPU_data_request: draw base mesh with GPUx API

Mike Erwin noreply at git.blender.org
Mon Apr 6 22:05:23 CEST 2015


Commit: 3eaf30d216d3ea24ed441d5d462ea5e93a3df8c5
Author: Mike Erwin
Date:   Mon Apr 6 16:04:16 2015 -0400
Branches: GPU_data_request
https://developer.blender.org/rB3eaf30d216d3ea24ed441d5d462ea5e93a3df8c5

draw base mesh with GPUx API

Vertex and Edge work great, Face not so much yet — totface = 0 so
nothing is drawn. Will work on derived mesh next.

draw_mesh_object_new_new is simplified to draw mesh geometry and
nothing else. Use draw_mesh_object or draw_mesh_object_new for full
functionality.

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

M	source/blender/editors/space_view3d/drawobject.c

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

diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 1e1453b..3c8c2f8 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -4421,6 +4421,108 @@ static bool draw_mesh_object_new(Scene *scene, ARegion *ar, View3D *v3d, RegionV
 	return retval;
 }
 
+static bool draw_mesh_object_new_new(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D *rv3d, Base *base,
+                                     const char dt, const unsigned char ob_wire_col[4], const short dflag)
+{
+#if MCE_TRACE
+	printf("> %s dt=%d dflag=%d\n", __FUNCTION__, (int)dt, (int)dflag);
+#endif /* MCE_TRACE */
+
+	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 */
+
+	/* same mesh data as edit object? if so draw editmesh here */
+	if (obedit && ob->data == obedit->data) {
+		if (BKE_key_from_object(ob) || BKE_key_from_object(obedit)) {}
+		else if (ob->modifiers.first || obedit->modifiers.first) {}
+		else drawlinked = true;
+	}
+
+	if (drawlinked) {
+		/* fall back to previous function */
+		retval = draw_mesh_object_new(scene, ar, v3d, rv3d, base, dt, ob_wire_col, dflag);
+	}
+	else {
+		VertexBuffer *verts = GPUx_vertex_buffer_create(1, me->totvert);
+		ElementList *elem = NULL;
+
+#if MCE_TRACE
+		printf("%d verts, %d edges, %d faces\n", me->totvert, me->totedge, me->totface);
+#endif /* MCE_TRACE */
+
+		GPUx_specify_attrib(verts, 0, GL_VERTEX_ARRAY, GL_FLOAT, 3, KEEP_FLOAT);
+		GPUx_fill_attrib_stride(verts, 0, me->mvert, sizeof(MVert));
+
+		GPUx_vertex_buffer_prime(verts);
+
+		/* draw smooth surface (as a test) */
+		if (false) {
+//			int /* totvert,*/ totedge, totface;
+//			DerivedMesh *dm = mesh_get_derived_final(scene, ob, scene->customdata_mask);
+			int i;
+			PolygonDrawState polygon_state = default_state.polygon;
+			polygon_state.draw_front = true;
+			polygon_state.draw_back = true;
+
+			if (elem)
+				GPUx_element_list_discard(elem);
+			elem = GPUx_element_list_create(GL_TRIANGLES, me->totface, me->totvert - 1);
+
+			for (i = 0; i < me->totface; ++i)
+				GPUx_set_triangle_vertices(elem, i, me->mface[i].v1, me->mface[i].v2, me->mface[i].v3);
+
+			glEnable(GL_BLEND);
+			glColor4f(0.0f, 0.3f, 0.9f, 0.5f);
+
+			GPUx_draw_triangles(&default_state.common, &polygon_state, verts, elem);
+
+			glDisable(GL_BLEND);
+		}
+
+		/* draw wireframe (as a test) */
+		if (true) {
+			int i;
+			LineDrawState line_state = default_state.line;
+			line_state.smooth = true;
+
+			if (elem)
+				GPUx_element_list_discard(elem);
+			elem = GPUx_element_list_create(GL_LINES, me->totedge, me->totvert - 1);
+
+			for (i = 0; i < me->totedge; ++i)
+				GPUx_set_line_vertices(elem, i, me->medge[i].v1, me->medge[i].v2);
+
+			glEnable(GL_BLEND);
+
+			GPUx_draw_lines(&default_state.common, &line_state, verts, elem);
+
+			glDisable(GL_BLEND);
+		}
+
+		/* draw points (as a test) */
+		if (false) {
+			PointDrawState point_state = default_state.point;
+			point_state.size = 3.0f;
+
+			GPUx_draw_points(&default_state.common, &point_state, verts, NULL);
+		}
+
+		if (elem)
+			GPUx_element_list_discard(elem);
+		GPUx_vertex_buffer_discard(verts);
+	}
+
+#if MCE_TRACE
+	printf("< %s\n", __FUNCTION__);
+#endif /* MCE_TRACE */
+
+	return retval;
+}
+
 /* ************** DRAW DISPLIST ****************** */
 
 
@@ -7794,7 +7896,7 @@ static void draw_object_intern(Scene *scene, ARegion *ar, View3D *v3d, Base *bas
 		switch (ob->type) {
 			case OB_MESH:
 				if (new_style_drawing)
-					empty_object = draw_mesh_object_new(scene, ar, v3d, rv3d, base, dt, ob_wire_col, dflag);
+					empty_object = draw_mesh_object_new_new(scene, ar, v3d, rv3d, base, dt, ob_wire_col, dflag);
 				else
 					empty_object = draw_mesh_object(scene, ar, v3d, rv3d, base, dt, ob_wire_col, dflag);




More information about the Bf-blender-cvs mailing list