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 /source/blender/gpu/intern | |
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.
Diffstat (limited to 'source/blender/gpu/intern')
-rw-r--r-- | source/blender/gpu/intern/gpu_buffers.c | 22 |
1 files changed, 19 insertions, 3 deletions
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)) |