Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntony Riakiotakis <kalast@gmail.com>2015-06-16 21:55:37 +0300
committerAntony Riakiotakis <kalast@gmail.com>2015-06-16 21:55:37 +0300
commitfbff0e68a4cb43d24f0e034b084307930114908b (patch)
tree78e49e9ecd25db46b7eea6b21a1ec6515f9b61cd /source/blender/gpu
parent5ca3f3d81169911836820d2ecd857fbc66be7c84 (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.h3
-rw-r--r--source/blender/gpu/intern/gpu_buffers.c22
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))