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 | |
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')
-rw-r--r-- | source/blender/gpu/GPU_buffers.h | 3 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_buffers.c | 22 |
2 files changed, 22 insertions, 3 deletions
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)) |