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:
authorClément Foucault <foucault.clem@gmail.com>2019-02-07 22:36:29 +0300
committerClément Foucault <foucault.clem@gmail.com>2019-02-07 22:36:29 +0300
commita04dd15193e6cef261d604b2fb05746e71c6a7e3 (patch)
tree85443aa13271a1859ff052f548c1e455d7f47e86 /source/blender/draw/intern
parentea30767997e98ffa508fd5d5ef0c79719d01ccee (diff)
Edit Mesh: Only draw vertices once
Only add each vertices to point ibo once. That requires tagging each mvert in the case of modifier preview.
Diffstat (limited to 'source/blender/draw/intern')
-rw-r--r--source/blender/draw/intern/draw_cache_impl_mesh.c48
1 files changed, 29 insertions, 19 deletions
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 80d753a58d7..89829cc4c5b 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -3801,11 +3801,10 @@ static void mesh_create_loops_tris(
* It writes to MEdge->flag with ME_EDGE_TMP_TAG. */
static void mesh_create_edit_loops_points_lines(MeshRenderData *rdata, GPUIndexBuf *ibo_verts, GPUIndexBuf *ibo_edges)
{
- BMIter iter_efa, iter_loop;
- BMFace *efa;
- BMLoop *loop;
+ BMIter iter;
int i;
+ const int vert_len = mesh_render_data_verts_len_get_maybe_mapped(rdata);
const int edge_len = mesh_render_data_edges_len_get_maybe_mapped(rdata);
const int loop_len = mesh_render_data_loops_len_get_maybe_mapped(rdata);
const int poly_len = mesh_render_data_polys_len_get_maybe_mapped(rdata);
@@ -3824,28 +3823,31 @@ static void mesh_create_edit_loops_points_lines(MeshRenderData *rdata, GPUIndexB
int loop_idx = 0;
if (rdata->edit_bmesh && (rdata->mapped.use == false)) {
BMesh *bm = rdata->edit_bmesh->bm;
- BMEdge *eed;
/* Edges not loose. */
- BM_ITER_MESH (eed, &iter_efa, bm, BM_EDGES_OF_MESH) {
- if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
- if (ibo_edges && eed->l != NULL) {
- int v1 = BM_elem_index_get(eed->l);
- int v2 = BM_elem_index_get(eed->l->next);
- GPU_indexbuf_add_line_verts(&elb_edge, v1, v2);
+ if (ibo_edges) {
+ BMEdge *eed;
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
+ if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
+ if (eed->l != NULL) {
+ int v1 = BM_elem_index_get(eed->l);
+ int v2 = BM_elem_index_get(eed->l->next);
+ GPU_indexbuf_add_line_verts(&elb_edge, v1, v2);
+ }
}
}
}
/* Face Loops */
- BM_ITER_MESH (efa, &iter_efa, bm, BM_FACES_OF_MESH) {
- if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
- BM_ITER_ELEM_INDEX (loop, &iter_loop, efa, BM_LOOPS_OF_FACE, i) {
- if (ibo_verts) {
- GPU_indexbuf_add_generic_vert(&elb_vert, loop_idx + i);
- }
+ if (ibo_verts) {
+ BMVert *eve;
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
+ if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
+ BMLoop *l = BM_vert_find_first_loop(eve);
+ int v = BM_elem_index_get(l);
+ GPU_indexbuf_add_generic_vert(&elb_vert, v);
}
}
- loop_idx += efa->len;
}
+ loop_idx = loop_len;
/* Loose edges */
for (i = 0; i < ledge_len; ++i) {
if (ibo_verts) {
@@ -3867,6 +3869,7 @@ static void mesh_create_edit_loops_points_lines(MeshRenderData *rdata, GPUIndexB
}
else if (rdata->mapped.use) {
const MPoly *mpoly = rdata->mapped.me_cage->mpoly;
+ MVert *mvert = rdata->mapped.me_cage->mvert;
MEdge *medge = rdata->mapped.me_cage->medge;
BMesh *bm = rdata->edit_bmesh->bm;
@@ -3879,16 +3882,23 @@ static void mesh_create_edit_loops_points_lines(MeshRenderData *rdata, GPUIndexB
/* NOTE: not thread safe. */
medge[edge].flag &= ~ME_EDGE_TMP_TAG;
}
+ for (int vert = 0; vert < vert_len; ++vert) {
+ /* NOTE: not thread safe. */
+ mvert[vert].flag &= ~ME_VERT_TMP_TAG;
+ }
/* Face Loops */
for (int poly = 0; poly < poly_len; poly++, mpoly++) {
int fidx = p_origindex[poly];
if (fidx != ORIGINDEX_NONE) {
- efa = BM_face_at_index(bm, fidx);
+ BMFace *efa = BM_face_at_index(bm, fidx);
if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
const MLoop *mloop = &rdata->mapped.me_cage->mloop[mpoly->loopstart];
for (i = 0; i < mpoly->totloop; ++i, ++mloop) {
- if (ibo_verts && (v_origindex[mloop->v] != ORIGINDEX_NONE)) {
+ if (ibo_verts && (v_origindex[mloop->v] != ORIGINDEX_NONE) &&
+ (mvert[mloop->v].flag & ME_VERT_TMP_TAG) == 0)
+ {
+ mvert[mloop->v].flag |= ME_VERT_TMP_TAG;
GPU_indexbuf_add_generic_vert(&elb_vert, loop_idx + i);
}
if (ibo_edges && (e_origindex[mloop->e] != ORIGINDEX_NONE) &&