diff options
author | Antony Riakiotakis <kalast@gmail.com> | 2015-06-16 21:55:37 +0300 |
---|---|---|
committer | Antony Riakiotakis <kalast@gmail.com> | 2015-06-16 21:55:37 +0300 |
commit | fbff0e68a4cb43d24f0e034b084307930114908b (patch) | |
tree | 78e49e9ecd25db46b7eea6b21a1ec6515f9b61cd | |
parent | 5ca3f3d81169911836820d2ecd857fbc66be7c84 (diff) |
Drawing speedup:
We really don't need to iterate all edges of the mesh every frame to
search for loose edges, this calculation can be cached when filling the
edge index buffer.
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 27 | ||||
-rw-r--r-- | source/blender/gpu/GPU_buffers.h | 3 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_buffers.c | 22 |
3 files changed, 23 insertions, 29 deletions
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 3feea12f017..4ad7156efdb 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -432,33 +432,8 @@ static void cdDM_drawEdges(DerivedMesh *dm, bool drawLooseEdges, bool drawAllEdg static void cdDM_drawLooseEdges(DerivedMesh *dm) { - CDDerivedMesh *cddm = (CDDerivedMesh *) dm; - MEdge *medge = cddm->medge; - int i; - - int prevstart = 0; - int prevdraw = 1; - int draw = 1; - GPU_edge_setup(dm); - for (i = 0; i < dm->numEdgeData; i++, medge++) { - if (medge->flag & ME_LOOSEEDGE) { - draw = 1; - } - else { - draw = 0; - } - if (prevdraw != draw) { - if (prevdraw > 0 && (i - prevstart) > 0) { - GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, prevstart * 2, (i - prevstart) * 2); - } - prevstart = i; - } - prevdraw = draw; - } - if (prevdraw > 0 && (i - prevstart) > 0) { - GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, prevstart * 2, (i - prevstart) * 2); - } + GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, dm->drawObject->loose_edge_offset * 2, dm->drawObject->tot_loose_edge * 2); GPU_buffer_unbind(); } diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h index 8b65666265d..842553a5fb9 100644 --- a/source/blender/gpu/GPU_buffers.h +++ b/source/blender/gpu/GPU_buffers.h @@ -113,6 +113,9 @@ typedef struct GPUDrawObject { /* caches of the original DerivedMesh values */ int totvert; int totedge; + + int loose_edge_offset; + int tot_loose_edge; } GPUDrawObject; /* used for GLSL materials */ diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c index 4b7dc7f5c9d..c863e3e8db7 100644 --- a/source/blender/gpu/intern/gpu_buffers.c +++ b/source/blender/gpu/intern/gpu_buffers.c @@ -942,15 +942,31 @@ static void GPU_buffer_copy_edge(DerivedMesh *dm, float *varray_, int *UNUSED(in { MEdge *medge; unsigned int *varray = (unsigned int *)varray_; - int i, totedge; + int i, totedge, iloose, inorm; medge = dm->getEdgeArray(dm); totedge = dm->getNumEdges(dm); + inorm = 0; + iloose = totedge - 1; + for (i = 0; i < totedge; i++, medge++) { - varray[i * 2] = dm->drawObject->vert_points[medge->v1].point_index; - varray[i * 2 + 1] = dm->drawObject->vert_points[medge->v2].point_index; + if (medge->flag & ME_LOOSEEDGE) { + varray[iloose * 2] = dm->drawObject->vert_points[medge->v1].point_index; + varray[iloose * 2 + 1] = dm->drawObject->vert_points[medge->v2].point_index; + iloose--; + } + else { + varray[inorm * 2] = dm->drawObject->vert_points[medge->v1].point_index; + varray[inorm * 2 + 1] = dm->drawObject->vert_points[medge->v2].point_index; + inorm++; + } } + + iloose++; + dm->drawObject->tot_loose_edge = totedge - iloose; + dm->drawObject->loose_edge_offset = iloose; + } static void GPU_buffer_copy_uvedge(DerivedMesh *dm, float *varray, int *UNUSED(index), int *UNUSED(mat_orig_to_new), void *UNUSED(user)) |