[Bf-blender-cvs] [8599cfd] GPU_data_request: draw derived mesh with GPUx API
Mike Erwin
noreply at git.blender.org
Tue Apr 7 08:09:13 CEST 2015
Commit: 8599cfde8e705f2389aa92f3ab4e41c6b3feaa2e
Author: Mike Erwin
Date: Tue Apr 7 02:07:33 2015 -0400
Branches: GPU_data_request
https://developer.blender.org/rB8599cfde8e705f2389aa92f3ab4e41c6b3feaa2e
draw derived mesh with GPUx API
===================================================================
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 3c8c2f8..d5c0165 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -4447,33 +4447,46 @@ static bool draw_mesh_object_new_new(Scene *scene, ARegion *ar, View3D *v3d, Reg
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);
+ DerivedMesh *dm = mesh_get_derived_final(scene, ob, scene->customdata_mask);
+ 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);
ElementList *elem = NULL;
#if MCE_TRACE
- printf("%d verts, %d edges, %d faces\n", me->totvert, me->totedge, me->totface);
+ 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, me->mvert, sizeof(MVert));
+ GPUx_fill_attrib_stride(verts, 0, dm->getVertArray(dm), 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;
+ if (true) {
+ int i, t, tri_ct = 0;
+ MFace *faces = dm->getTessFaceDataArray(dm, CD_MFACE);
PolygonDrawState polygon_state = default_state.polygon;
polygon_state.draw_front = true;
polygon_state.draw_back = true;
+ /* 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, me->totface, me->totvert - 1);
+ elem = GPUx_element_list_create(GL_TRIANGLES, tri_ct, vert_ct - 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);
+ for (i = 0, t = 0; i < face_ct; ++i) {
+ const MFace *face = faces + i;
+ GPUx_set_triangle_vertices(elem, t++, face->v1, face->v2, face->v3);
+ if (face->v4)
+ GPUx_set_triangle_vertices(elem, t++, face->v4, face->v1, face->v3);
+ }
glEnable(GL_BLEND);
glColor4f(0.0f, 0.3f, 0.9f, 0.5f);
@@ -4484,17 +4497,20 @@ static bool draw_mesh_object_new_new(Scene *scene, ARegion *ar, View3D *v3d, Reg
}
/* draw wireframe (as a test) */
- if (true) {
+ else if (false) {
int i;
+ MEdge *edges = dm->getEdgeArray(dm);
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);
+ elem = GPUx_element_list_create(GL_LINES, edge_ct, vert_ct - 1);
- for (i = 0; i < me->totedge; ++i)
- GPUx_set_line_vertices(elem, i, me->medge[i].v1, me->medge[i].v2);
+ for (i = 0; i < edge_ct; ++i) {
+ const MEdge *edge = edges + i;
+ GPUx_set_line_vertices(elem, i, edge->v1, edge->v2);
+ }
glEnable(GL_BLEND);
@@ -4504,10 +4520,10 @@ static bool draw_mesh_object_new_new(Scene *scene, ARegion *ar, View3D *v3d, Reg
}
/* draw points (as a test) */
- if (false) {
+ 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);
}
More information about the Bf-blender-cvs
mailing list