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:
Diffstat (limited to 'source/blender/draw/intern')
-rw-r--r--source/blender/draw/intern/draw_cache_impl_mesh.c36
1 files changed, 27 insertions, 9 deletions
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index b51c684a0fd..80d753a58d7 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -3797,6 +3797,8 @@ static void mesh_create_loops_tris(
}
}
+/* Warning! this function is not thread safe!
+ * 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;
@@ -3804,6 +3806,7 @@ static void mesh_create_edit_loops_points_lines(MeshRenderData *rdata, GPUIndexB
BMLoop *loop;
int i;
+ 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);
const int lvert_len = mesh_render_data_loose_verts_len_get_maybe_mapped(rdata);
@@ -3812,7 +3815,7 @@ static void mesh_create_edit_loops_points_lines(MeshRenderData *rdata, GPUIndexB
GPUIndexBufBuilder elb_vert, elb_edge;
if (DRW_TEST_ASSIGN_IBO(ibo_edges)) {
- GPU_indexbuf_init(&elb_edge, GPU_PRIM_LINES, loop_len + ledge_len, tot_loop_len);
+ GPU_indexbuf_init(&elb_edge, GPU_PRIM_LINES, edge_len, tot_loop_len);
}
if (DRW_TEST_ASSIGN_IBO(ibo_verts)) {
GPU_indexbuf_init(&elb_vert, GPU_PRIM_POINTS, tot_loop_len, tot_loop_len);
@@ -3821,6 +3824,17 @@ 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);
+ }
+ }
+ }
/* Face Loops */
BM_ITER_MESH (efa, &iter_efa, bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
@@ -3828,11 +3842,6 @@ static void mesh_create_edit_loops_points_lines(MeshRenderData *rdata, GPUIndexB
if (ibo_verts) {
GPU_indexbuf_add_generic_vert(&elb_vert, loop_idx + i);
}
- if (ibo_edges) {
- int v1 = loop_idx + i;
- int v2 = loop_idx + ((i + 1) % efa->len);
- GPU_indexbuf_add_line_verts(&elb_edge, v1, v2);
- }
}
}
loop_idx += efa->len;
@@ -3858,13 +3867,19 @@ static void mesh_create_edit_loops_points_lines(MeshRenderData *rdata, GPUIndexB
}
else if (rdata->mapped.use) {
const MPoly *mpoly = rdata->mapped.me_cage->mpoly;
- const MEdge *medge = rdata->mapped.me_cage->medge;
+ MEdge *medge = rdata->mapped.me_cage->medge;
BMesh *bm = rdata->edit_bmesh->bm;
const int *v_origindex = rdata->mapped.v_origindex;
const int *e_origindex = rdata->mapped.e_origindex;
const int *p_origindex = rdata->mapped.p_origindex;
+ /* Reset flag */
+ for (int edge = 0; edge < edge_len; ++edge) {
+ /* NOTE: not thread safe. */
+ medge[edge].flag &= ~ME_EDGE_TMP_TAG;
+ }
+
/* Face Loops */
for (int poly = 0; poly < poly_len; poly++, mpoly++) {
int fidx = p_origindex[poly];
@@ -3876,7 +3891,10 @@ static void mesh_create_edit_loops_points_lines(MeshRenderData *rdata, GPUIndexB
if (ibo_verts && (v_origindex[mloop->v] != ORIGINDEX_NONE)) {
GPU_indexbuf_add_generic_vert(&elb_vert, loop_idx + i);
}
- if (ibo_edges && (e_origindex[mloop->e] != ORIGINDEX_NONE)) {
+ if (ibo_edges && (e_origindex[mloop->e] != ORIGINDEX_NONE) &&
+ ((medge[mloop->e].flag & ME_EDGE_TMP_TAG) == 0))
+ {
+ medge[mloop->e].flag |= ME_EDGE_TMP_TAG;
int v1 = loop_idx + i;
int v2 = loop_idx + ((i + 1) % mpoly->totloop);
GPU_indexbuf_add_line_verts(&elb_edge, v1, v2);
@@ -4781,7 +4799,7 @@ void DRW_mesh_batch_cache_create_requested(
DRW_vbo_request(cache->batch.edit_edges, &cache->edit.loop_data);
}
if (DRW_batch_requested(cache->batch.edit_lnor, GPU_PRIM_POINTS)) {
- DRW_ibo_request(cache->batch.edit_lnor, &cache->ibo.edit_loops_lines);
+ DRW_ibo_request(cache->batch.edit_lnor, &cache->ibo.edit_loops_tris);
DRW_vbo_request(cache->batch.edit_lnor, &cache->edit.loop_pos_nor);
DRW_vbo_request(cache->batch.edit_lnor, &cache->edit.loop_lnor);
}