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>2018-12-12 16:58:06 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-12-12 17:19:21 +0300
commitcf9279595359efa53f2570ea3e8a50256a2aaa8d (patch)
tree0e433e3df47810ea82e04bfee981f797d70403a5 /source/blender/draw
parentb60aedc14c3d67955ea7ebb55edf87899339cb53 (diff)
Mesh Batch Cache: Fix crash when using edit mode normal display.
Diffstat (limited to 'source/blender/draw')
-rw-r--r--source/blender/draw/intern/draw_cache_impl_mesh.c57
1 files changed, 35 insertions, 22 deletions
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 9438995ec6f..2079e505c80 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -264,6 +264,8 @@ enum {
MR_DATATYPE_DVERT = 1 << 7,
MR_DATATYPE_LOOPCOL = 1 << 8,
MR_DATATYPE_LOOPUV = 1 << 9,
+ MR_DATATYPE_LOOSE_VERT = 1 << 10,
+ MR_DATATYPE_LOOSE_EDGE = 1 << 11,
};
/**
@@ -543,8 +545,9 @@ static MeshRenderData *mesh_render_data_create_ex(
rdata->tri_len = tottri;
}
- if (types & MR_DATATYPE_OVERLAY) {
- rdata->loose_vert_len = rdata->loose_edge_len = 0;
+ if (types & MR_DATATYPE_LOOSE_VERT) {
+ BLI_assert(types & MR_DATATYPE_VERT);
+ rdata->loose_vert_len = 0;
{
int *lverts = MEM_mallocN(rdata->vert_len * sizeof(int), __func__);
@@ -561,24 +564,9 @@ static MeshRenderData *mesh_render_data_create_ex(
rdata->loose_verts = MEM_reallocN(lverts, rdata->loose_vert_len * sizeof(int));
}
- {
- int *ledges = MEM_mallocN(rdata->edge_len * sizeof(int), __func__);
- BLI_assert((bm->elem_table_dirty & BM_EDGE) == 0);
- for (int i = 0; i < bm->totedge; i++) {
- const BMEdge *eed = BM_edge_at_index(bm, i);
- if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
- /* Loose edge */
- if (eed->l == NULL || !bm_edge_has_visible_face(eed)) {
- ledges[rdata->loose_edge_len++] = i;
- }
- }
- }
- rdata->loose_edges = MEM_reallocN(ledges, rdata->loose_edge_len * sizeof(int));
- }
-
if (rdata->mapped.supported) {
Mesh *me_cage = embm->mesh_eval_cage;
- rdata->mapped.loose_vert_len = rdata->mapped.loose_edge_len = 0;
+ rdata->mapped.loose_vert_len = 0;
if (rdata->loose_vert_len) {
int *lverts = MEM_mallocN(me_cage->totvert * sizeof(int), __func__);
@@ -597,6 +585,31 @@ static MeshRenderData *mesh_render_data_create_ex(
}
rdata->mapped.loose_verts = MEM_reallocN(lverts, rdata->mapped.loose_vert_len * sizeof(int));
}
+ }
+ }
+
+ if (types & MR_DATATYPE_LOOSE_EDGE) {
+ BLI_assert(types & MR_DATATYPE_EDGE);
+ rdata->loose_edge_len = 0;
+
+ {
+ int *ledges = MEM_mallocN(rdata->edge_len * sizeof(int), __func__);
+ BLI_assert((bm->elem_table_dirty & BM_EDGE) == 0);
+ for (int i = 0; i < bm->totedge; i++) {
+ const BMEdge *eed = BM_edge_at_index(bm, i);
+ if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
+ /* Loose edge */
+ if (eed->l == NULL || !bm_edge_has_visible_face(eed)) {
+ ledges[rdata->loose_edge_len++] = i;
+ }
+ }
+ }
+ rdata->loose_edges = MEM_reallocN(ledges, rdata->loose_edge_len * sizeof(int));
+ }
+
+ if (rdata->mapped.supported) {
+ Mesh *me_cage = embm->mesh_eval_cage;
+ rdata->mapped.loose_edge_len = 0;
if (rdata->loose_edge_len) {
int *ledges = MEM_mallocN(me_cage->totedge * sizeof(int), __func__);
@@ -5809,11 +5822,11 @@ void DRW_mesh_batch_cache_create_requested(Object *ob)
DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_flag, cache->tess.wireframe_data, MR_DATATYPE_VERT | MR_DATATYPE_EDGE | MR_DATATYPE_LOOP | MR_DATATYPE_LOOPTRI);
DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_edit_flag, cache->edit.data, MR_DATATYPE_VERT | MR_DATATYPE_EDGE | MR_DATATYPE_LOOP | MR_DATATYPE_LOOPTRI | MR_DATATYPE_OVERLAY);
- DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_edit_flag, cache->edit.data_ledges, MR_DATATYPE_VERT | MR_DATATYPE_EDGE | MR_DATATYPE_LOOP | MR_DATATYPE_OVERLAY);
- DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_edit_flag, cache->edit.data_lverts, MR_DATATYPE_VERT | MR_DATATYPE_LOOP | MR_DATATYPE_OVERLAY);
+ DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_edit_flag, cache->edit.data_ledges, MR_DATATYPE_LOOSE_EDGE | MR_DATATYPE_VERT | MR_DATATYPE_EDGE | MR_DATATYPE_LOOP | MR_DATATYPE_OVERLAY);
+ DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_edit_flag, cache->edit.data_lverts, MR_DATATYPE_LOOSE_VERT | MR_DATATYPE_VERT | MR_DATATYPE_LOOP | MR_DATATYPE_OVERLAY);
DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_edit_flag, cache->edit.pos_nor, MR_DATATYPE_VERT | MR_DATATYPE_EDGE | MR_DATATYPE_LOOP | MR_DATATYPE_LOOPTRI | MR_DATATYPE_OVERLAY);
- DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_edit_flag, cache->edit.pos_nor_ledges, MR_DATATYPE_VERT | MR_DATATYPE_EDGE | MR_DATATYPE_LOOP | MR_DATATYPE_OVERLAY);
- DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_edit_flag, cache->edit.pos_nor_lverts, MR_DATATYPE_VERT | MR_DATATYPE_LOOP | MR_DATATYPE_OVERLAY);
+ DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_edit_flag, cache->edit.pos_nor_ledges, MR_DATATYPE_VERT | MR_DATATYPE_EDGE | MR_DATATYPE_LOOSE_EDGE | MR_DATATYPE_LOOP | MR_DATATYPE_OVERLAY);
+ DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_edit_flag, cache->edit.pos_nor_lverts, MR_DATATYPE_VERT | MR_DATATYPE_LOOSE_VERT | MR_DATATYPE_OVERLAY);
DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_edit_flag, cache->edit.pos_nor_data_facedots, MR_DATATYPE_VERT | MR_DATATYPE_LOOP | MR_DATATYPE_POLY | MR_DATATYPE_OVERLAY);
DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_edit_flag, cache->edit.lnor, MR_DATATYPE_VERT | MR_DATATYPE_LOOP | MR_DATATYPE_LOOPTRI | MR_DATATYPE_OVERLAY);
DRW_ADD_FLAG_FROM_IBO_REQUEST(mr_edit_flag, cache->ibo.edit_verts, MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI);