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:
authorKévin Dietrich <kevin.dietrich@mailoo.org>2022-01-16 10:40:38 +0300
committerKévin Dietrich <kevin.dietrich@mailoo.org>2022-01-16 10:40:38 +0300
commitbc66cd9868746ce92dd6de004a8b8e6a0188defe (patch)
tree709174bdf08407a7c06d9fd4c10b3523ab3487b0
parent3574f2730d2a42cda2881d26209b8dc53b1d2047 (diff)
Fix T94865: GPU subdiv crash switching to texpaint area
The crash is due to the fact that GPU subdivision extraction routines for edit data (including UVs) only worked for BMesh. However, a Mesh based version is still needed for texture painting. This adds the missing components. This also ensures all data are properly initialized (at least the ones revealed by the bug).
-rw-r--r--source/blender/draw/intern/draw_cache_extract_mesh.cc23
-rw-r--r--source/blender/draw/intern/draw_cache_impl_subdivision.cc8
-rw-r--r--source/blender/draw/intern/mesh_extractors/extract_mesh.h17
-rw-r--r--source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc131
-rw-r--r--source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc21
-rw-r--r--source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edit_data.cc28
-rw-r--r--source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_data.cc29
7 files changed, 192 insertions, 65 deletions
diff --git a/source/blender/draw/intern/draw_cache_extract_mesh.cc b/source/blender/draw/intern/draw_cache_extract_mesh.cc
index 117ce2a2817..fe55778527b 100644
--- a/source/blender/draw/intern/draw_cache_extract_mesh.cc
+++ b/source/blender/draw/intern/draw_cache_extract_mesh.cc
@@ -848,6 +848,7 @@ static void mesh_buffer_cache_create_requested_subdiv(MeshBatchCache *cache,
}
MeshRenderData mr;
+ memset(&mr, 0, sizeof(MeshRenderData));
draw_subdiv_init_mesh_render_data(subdiv_cache, &mr, ts);
mesh_render_data_update_loose_geom(&mr, mbc, MR_ITER_LEDGE | MR_ITER_LVERT, MR_DATA_LOOSE_GEOM);
@@ -860,9 +861,25 @@ static void mesh_buffer_cache_create_requested_subdiv(MeshBatchCache *cache,
extractor->init_subdiv(subdiv_cache, &mr, cache, buffer, data);
- if (extractor->iter_subdiv) {
- for (uint i = 0; i < subdiv_cache->num_subdiv_quads; i++) {
- extractor->iter_subdiv(subdiv_cache, &mr, data, i);
+ if (extractor->iter_subdiv_mesh || extractor->iter_subdiv_bm) {
+ int *subdiv_loop_poly_index = subdiv_cache->subdiv_loop_poly_index;
+ if (subdiv_cache->bm) {
+ for (uint i = 0; i < subdiv_cache->num_subdiv_quads; i++) {
+ /* Multiply by 4 to have the start index of the quad's loop, as subdiv_loop_poly_index is
+ * based on the subdivision loops. */
+ const int poly_origindex = subdiv_loop_poly_index[i * 4];
+ const BMFace *efa = bm_original_face_get(&mr, poly_origindex);
+ extractor->iter_subdiv_bm(subdiv_cache, &mr, data, i, efa);
+ }
+ }
+ else {
+ for (uint i = 0; i < subdiv_cache->num_subdiv_quads; i++) {
+ /* Multiply by 4 to have the start index of the quad's loop, as subdiv_loop_poly_index is
+ * based on the subdivision loops. */
+ const int poly_origindex = subdiv_loop_poly_index[i * 4];
+ const MPoly *mp = &mr.mpoly[poly_origindex];
+ extractor->iter_subdiv_mesh(subdiv_cache, &mr, data, i, mp);
+ }
}
}
diff --git a/source/blender/draw/intern/draw_cache_impl_subdivision.cc b/source/blender/draw/intern/draw_cache_impl_subdivision.cc
index 3e6cd01e7cb..e975d213e22 100644
--- a/source/blender/draw/intern/draw_cache_impl_subdivision.cc
+++ b/source/blender/draw/intern/draw_cache_impl_subdivision.cc
@@ -1676,6 +1676,10 @@ void draw_subdiv_init_mesh_render_data(DRWSubdivCache *cache,
mr->poly_len = mesh->totpoly;
mr->loop_len = mesh->totloop;
mr->extract_type = MR_EXTRACT_MESH;
+ mr->toolsettings = toolsettings;
+ mr->v_origindex = static_cast<int *>(CustomData_get_layer(&mr->me->vdata, CD_ORIGINDEX));
+ mr->e_origindex = static_cast<int *>(CustomData_get_layer(&mr->me->edata, CD_ORIGINDEX));
+ mr->p_origindex = static_cast<int *>(CustomData_get_layer(&mr->me->pdata, CD_ORIGINDEX));
/* MeshRenderData is only used for generating edit mode data here. */
if (!cache->bm) {
@@ -1686,7 +1690,6 @@ void draw_subdiv_init_mesh_render_data(DRWSubdivCache *cache,
BM_mesh_elem_table_ensure(bm, BM_EDGE | BM_FACE | BM_VERT);
mr->bm = bm;
- mr->toolsettings = toolsettings;
mr->eed_act = BM_mesh_active_edge_get(bm);
mr->efa_act = BM_mesh_active_face_get(bm, false, true);
mr->eve_act = BM_mesh_active_vert_get(bm);
@@ -1696,9 +1699,6 @@ void draw_subdiv_init_mesh_render_data(DRWSubdivCache *cache,
mr->freestyle_edge_ofs = CustomData_get_offset(&bm->edata, CD_FREESTYLE_EDGE);
mr->freestyle_face_ofs = CustomData_get_offset(&bm->pdata, CD_FREESTYLE_FACE);
#endif
- mr->v_origindex = static_cast<int *>(CustomData_get_layer(&mr->me->vdata, CD_ORIGINDEX));
- mr->e_origindex = static_cast<int *>(CustomData_get_layer(&mr->me->edata, CD_ORIGINDEX));
- mr->p_origindex = static_cast<int *>(CustomData_get_layer(&mr->me->pdata, CD_ORIGINDEX));
}
/**
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh.h b/source/blender/draw/intern/mesh_extractors/extract_mesh.h
index 5d3eaf16f10..834f378c07a 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh.h
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh.h
@@ -223,10 +223,16 @@ typedef void(ExtractInitSubdivFn)(const struct DRWSubdivCache *subdiv_cache,
struct MeshBatchCache *cache,
void *buf,
void *data);
-typedef void(ExtractIterSubdivFn)(const struct DRWSubdivCache *subdiv_cache,
- const MeshRenderData *mr,
- void *data,
- uint subdiv_quad_index);
+typedef void(ExtractIterSubdivBMeshFn)(const struct DRWSubdivCache *subdiv_cache,
+ const MeshRenderData *mr,
+ void *data,
+ uint subdiv_quad_index,
+ const BMFace *coarse_quad);
+typedef void(ExtractIterSubdivMeshFn)(const struct DRWSubdivCache *subdiv_cache,
+ const MeshRenderData *mr,
+ void *data,
+ uint subdiv_quad_index,
+ const MPoly *coarse_quad);
typedef void(ExtractFinishSubdivFn)(const struct DRWSubdivCache *subdiv_cache,
const MeshRenderData *mr,
struct MeshBatchCache *cache,
@@ -251,7 +257,8 @@ typedef struct MeshExtract {
ExtractFinishFn *finish;
/** Executed on main thread for subdivision evaluation. */
ExtractInitSubdivFn *init_subdiv;
- ExtractIterSubdivFn *iter_subdiv;
+ ExtractIterSubdivBMeshFn *iter_subdiv_bm;
+ ExtractIterSubdivMeshFn *iter_subdiv_mesh;
ExtractFinishSubdivFn *finish_subdiv;
/** Used to request common data. */
eMRDataType data_type;
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc
index 3a2b6d468d8..cd71beb1f02 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc
@@ -110,28 +110,49 @@ static void extract_edituv_tris_init_subdiv(const DRWSubdivCache *subdiv_cache,
data->sync_selection = (mr->toolsettings->uv_flag & UV_SYNC_SELECTION) != 0;
}
-static void extract_edituv_tris_iter_subdiv(const DRWSubdivCache *subdiv_cache,
- const MeshRenderData *mr,
- void *_data,
- uint subdiv_quad_index)
+static void extract_edituv_tris_iter_subdiv_bm(const DRWSubdivCache *UNUSED(subdiv_cache),
+ const MeshRenderData *UNUSED(mr),
+ void *_data,
+ uint subdiv_quad_index,
+ const BMFace *coarse_quad)
{
MeshExtract_EditUvElem_Data *data = static_cast<MeshExtract_EditUvElem_Data *>(_data);
- int *subdiv_loop_poly_index = subdiv_cache->subdiv_loop_poly_index;
+ const uint loop_idx = subdiv_quad_index * 4;
+
+ edituv_tri_add(data,
+ BM_elem_flag_test(coarse_quad, BM_ELEM_HIDDEN) != 0,
+ BM_elem_flag_test(coarse_quad, BM_ELEM_SELECT) != 0,
+ loop_idx,
+ loop_idx + 1,
+ loop_idx + 2);
+ edituv_tri_add(data,
+ BM_elem_flag_test(coarse_quad, BM_ELEM_HIDDEN) != 0,
+ BM_elem_flag_test(coarse_quad, BM_ELEM_SELECT) != 0,
+ loop_idx,
+ loop_idx + 2,
+ loop_idx + 3);
+}
+
+static void extract_edituv_tris_iter_subdiv_mesh(const DRWSubdivCache *UNUSED(subdiv_cache),
+ const MeshRenderData *UNUSED(mr),
+ void *_data,
+ uint subdiv_quad_index,
+ const MPoly *coarse_quad)
+{
+ MeshExtract_EditUvElem_Data *data = static_cast<MeshExtract_EditUvElem_Data *>(_data);
const uint loop_idx = subdiv_quad_index * 4;
- const int poly_origindex = subdiv_loop_poly_index[loop_idx];
- BMFace *efa = bm_original_face_get(mr, poly_origindex);
edituv_tri_add(data,
- BM_elem_flag_test(efa, BM_ELEM_HIDDEN) != 0,
- BM_elem_flag_test(efa, BM_ELEM_SELECT) != 0,
+ (coarse_quad->flag & ME_HIDE) != 0,
+ (coarse_quad->flag & ME_FACE_SEL) != 0,
loop_idx,
loop_idx + 1,
loop_idx + 2);
edituv_tri_add(data,
- BM_elem_flag_test(efa, BM_ELEM_HIDDEN) != 0,
- BM_elem_flag_test(efa, BM_ELEM_SELECT) != 0,
+ (coarse_quad->flag & ME_HIDE) != 0,
+ (coarse_quad->flag & ME_FACE_SEL) != 0,
loop_idx,
loop_idx + 2,
loop_idx + 3);
@@ -156,7 +177,8 @@ constexpr MeshExtract create_extractor_edituv_tris()
extractor.iter_looptri_mesh = extract_edituv_tris_iter_looptri_mesh;
extractor.finish = extract_edituv_tris_finish;
extractor.init_subdiv = extract_edituv_tris_init_subdiv;
- extractor.iter_subdiv = extract_edituv_tris_iter_subdiv;
+ extractor.iter_subdiv_bm = extract_edituv_tris_iter_subdiv_bm;
+ extractor.iter_subdiv_mesh = extract_edituv_tris_iter_subdiv_mesh;
extractor.finish_subdiv = extract_edituv_tris_finish_subdiv;
extractor.data_type = MR_DATA_NONE;
extractor.data_size = sizeof(MeshExtract_EditUvElem_Data);
@@ -253,28 +275,49 @@ static void extract_edituv_lines_init_subdiv(const DRWSubdivCache *subdiv_cache,
data->sync_selection = (mr->toolsettings->uv_flag & UV_SYNC_SELECTION) != 0;
}
-static void extract_edituv_lines_iter_subdiv(const DRWSubdivCache *subdiv_cache,
- const MeshRenderData *mr,
- void *_data,
- uint subdiv_quad_index)
+static void extract_edituv_lines_iter_subdiv_bm(const DRWSubdivCache *subdiv_cache,
+ const MeshRenderData *mr,
+ void *_data,
+ uint subdiv_quad_index,
+ const BMFace *coarse_poly)
{
MeshExtract_EditUvElem_Data *data = static_cast<MeshExtract_EditUvElem_Data *>(_data);
- int *subdiv_loop_poly_index = subdiv_cache->subdiv_loop_poly_index;
int *subdiv_loop_edge_index = (int *)GPU_vertbuf_get_data(subdiv_cache->edges_orig_index);
uint start_loop_idx = subdiv_quad_index * 4;
uint end_loop_idx = (subdiv_quad_index + 1) * 4;
+ for (uint loop_idx = start_loop_idx; loop_idx < end_loop_idx; loop_idx++) {
+ const int edge_origindex = subdiv_loop_edge_index[loop_idx];
+ const bool real_edge = (edge_origindex != -1 &&
+ (mr->e_origindex == nullptr ||
+ mr->e_origindex[edge_origindex] != ORIGINDEX_NONE));
+ edituv_edge_add(data,
+ BM_elem_flag_test_bool(coarse_poly, BM_ELEM_HIDDEN) != 0 || !real_edge,
+ BM_elem_flag_test_bool(coarse_poly, BM_ELEM_SELECT) != 0,
+ loop_idx,
+ (loop_idx + 1 == end_loop_idx) ? start_loop_idx : (loop_idx + 1));
+ }
+}
- const int poly_origindex = subdiv_loop_poly_index[start_loop_idx];
- BMFace *efa = bm_original_face_get(mr, poly_origindex);
+static void extract_edituv_lines_iter_subdiv_mesh(const DRWSubdivCache *subdiv_cache,
+ const MeshRenderData *mr,
+ void *_data,
+ uint subdiv_quad_index,
+ const MPoly *coarse_poly)
+{
+ MeshExtract_EditUvElem_Data *data = static_cast<MeshExtract_EditUvElem_Data *>(_data);
+ int *subdiv_loop_edge_index = (int *)GPU_vertbuf_get_data(subdiv_cache->edges_orig_index);
+ uint start_loop_idx = subdiv_quad_index * 4;
+ uint end_loop_idx = (subdiv_quad_index + 1) * 4;
for (uint loop_idx = start_loop_idx; loop_idx < end_loop_idx; loop_idx++) {
const int edge_origindex = subdiv_loop_edge_index[loop_idx];
const bool real_edge = (edge_origindex != -1 &&
- mr->e_origindex[edge_origindex] != ORIGINDEX_NONE);
+ (mr->e_origindex == nullptr ||
+ mr->e_origindex[edge_origindex] != ORIGINDEX_NONE));
edituv_edge_add(data,
- BM_elem_flag_test_bool(efa, BM_ELEM_HIDDEN) != 0 || !real_edge,
- BM_elem_flag_test_bool(efa, BM_ELEM_SELECT) != 0,
+ (coarse_poly->flag & ME_HIDE) != 0 || !real_edge,
+ (coarse_poly->flag & ME_FACE_SEL) != 0,
loop_idx,
(loop_idx + 1 == end_loop_idx) ? start_loop_idx : (loop_idx + 1));
}
@@ -299,7 +342,8 @@ constexpr MeshExtract create_extractor_edituv_lines()
extractor.iter_poly_mesh = extract_edituv_lines_iter_poly_mesh;
extractor.finish = extract_edituv_lines_finish;
extractor.init_subdiv = extract_edituv_lines_init_subdiv;
- extractor.iter_subdiv = extract_edituv_lines_iter_subdiv;
+ extractor.iter_subdiv_bm = extract_edituv_lines_iter_subdiv_bm;
+ extractor.iter_subdiv_mesh = extract_edituv_lines_iter_subdiv_mesh;
extractor.finish_subdiv = extract_edituv_lines_finish_subdiv;
extractor.data_type = MR_DATA_NONE;
extractor.data_size = sizeof(MeshExtract_EditUvElem_Data);
@@ -390,28 +434,48 @@ static void extract_edituv_points_init_subdiv(const DRWSubdivCache *subdiv_cache
data->sync_selection = (mr->toolsettings->uv_flag & UV_SYNC_SELECTION) != 0;
}
-static void extract_edituv_points_iter_subdiv(const DRWSubdivCache *subdiv_cache,
- const MeshRenderData *mr,
- void *_data,
- uint subdiv_quad_index)
+static void extract_edituv_points_iter_subdiv_bm(const DRWSubdivCache *subdiv_cache,
+ const MeshRenderData *mr,
+ void *_data,
+ uint subdiv_quad_index,
+ const BMFace *coarse_quad)
{
MeshExtract_EditUvElem_Data *data = static_cast<MeshExtract_EditUvElem_Data *>(_data);
int *subdiv_loop_vert_index = (int *)GPU_vertbuf_get_data(subdiv_cache->verts_orig_index);
- int *subdiv_loop_poly_index = subdiv_cache->subdiv_loop_poly_index;
uint start_loop_idx = subdiv_quad_index * 4;
uint end_loop_idx = (subdiv_quad_index + 1) * 4;
for (uint i = start_loop_idx; i < end_loop_idx; i++) {
const int vert_origindex = subdiv_loop_vert_index[i];
- const int poly_origindex = subdiv_loop_poly_index[i];
- BMFace *efa = bm_original_face_get(mr, poly_origindex);
+ const bool real_vert = (mr->extract_type == MR_EXTRACT_MAPPED && (mr->v_origindex) &&
+ vert_origindex != -1 &&
+ mr->v_origindex[vert_origindex] != ORIGINDEX_NONE);
+ edituv_point_add(data,
+ (BM_elem_flag_test(coarse_quad, BM_ELEM_HIDDEN)) || !real_vert,
+ BM_elem_flag_test(coarse_quad, BM_ELEM_SELECT) != 0,
+ i);
+ }
+}
+static void extract_edituv_points_iter_subdiv_mesh(const DRWSubdivCache *subdiv_cache,
+ const MeshRenderData *mr,
+ void *_data,
+ uint subdiv_quad_index,
+ const MPoly *coarse_quad)
+{
+ MeshExtract_EditUvElem_Data *data = static_cast<MeshExtract_EditUvElem_Data *>(_data);
+ int *subdiv_loop_vert_index = (int *)GPU_vertbuf_get_data(subdiv_cache->verts_orig_index);
+
+ uint start_loop_idx = subdiv_quad_index * 4;
+ uint end_loop_idx = (subdiv_quad_index + 1) * 4;
+ for (uint i = start_loop_idx; i < end_loop_idx; i++) {
+ const int vert_origindex = subdiv_loop_vert_index[i];
const bool real_vert = (mr->extract_type == MR_EXTRACT_MAPPED && (mr->v_origindex) &&
vert_origindex != -1 &&
mr->v_origindex[vert_origindex] != ORIGINDEX_NONE);
edituv_point_add(data,
- (BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) || !real_vert,
- BM_elem_flag_test(efa, BM_ELEM_SELECT) != 0,
+ ((coarse_quad->flag & ME_HIDE) != 0) || !real_vert,
+ (coarse_quad->flag & ME_FACE_SEL) != 0,
i);
}
}
@@ -435,7 +499,8 @@ constexpr MeshExtract create_extractor_edituv_points()
extractor.iter_poly_mesh = extract_edituv_points_iter_poly_mesh;
extractor.finish = extract_edituv_points_finish;
extractor.init_subdiv = extract_edituv_points_init_subdiv;
- extractor.iter_subdiv = extract_edituv_points_iter_subdiv;
+ extractor.iter_subdiv_bm = extract_edituv_points_iter_subdiv_bm;
+ extractor.iter_subdiv_mesh = extract_edituv_points_iter_subdiv_mesh;
extractor.finish_subdiv = extract_edituv_points_finish_subdiv;
extractor.data_type = MR_DATA_NONE;
extractor.data_size = sizeof(MeshExtract_EditUvElem_Data);
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc
index 59db4ca6445..2b01b6801c2 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc
@@ -218,6 +218,24 @@ static void extract_lines_adjacency_iter_subdiv(const DRWSubdivCache *subdiv_cac
lines_adjacency_triangle(v0, v2, v3, l0, l2, l3, data);
}
+static void extract_lines_adjacency_iter_subdiv_bm(const DRWSubdivCache *subdiv_cache,
+ const MeshRenderData *mr,
+ void *_data,
+ uint subdiv_quad_index,
+ const BMFace *UNUSED(coarse_quad))
+{
+ extract_lines_adjacency_iter_subdiv(subdiv_cache, mr, _data, subdiv_quad_index);
+}
+
+static void extract_lines_adjacency_iter_subdiv_mesh(const DRWSubdivCache *subdiv_cache,
+ const MeshRenderData *mr,
+ void *_data,
+ uint subdiv_quad_index,
+ const MPoly *UNUSED(coarse_quad))
+{
+ extract_lines_adjacency_iter_subdiv(subdiv_cache, mr, _data, subdiv_quad_index);
+}
+
static void extract_lines_adjacency_finish_subdiv(const DRWSubdivCache *UNUSED(subdiv_cache),
const MeshRenderData *mr,
struct MeshBatchCache *cache,
@@ -237,7 +255,8 @@ constexpr MeshExtract create_extractor_lines_adjacency()
extractor.iter_looptri_mesh = extract_lines_adjacency_iter_looptri_mesh;
extractor.finish = extract_lines_adjacency_finish;
extractor.init_subdiv = extract_lines_adjacency_init_subdiv;
- extractor.iter_subdiv = extract_lines_adjacency_iter_subdiv;
+ extractor.iter_subdiv_bm = extract_lines_adjacency_iter_subdiv_bm;
+ extractor.iter_subdiv_mesh = extract_lines_adjacency_iter_subdiv_mesh;
extractor.finish_subdiv = extract_lines_adjacency_finish_subdiv;
extractor.data_type = MR_DATA_NONE;
extractor.data_size = sizeof(MeshExtract_LineAdjacency_Data);
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edit_data.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edit_data.cc
index 2ac495f3b4c..3cc1375329e 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edit_data.cc
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edit_data.cc
@@ -261,22 +261,21 @@ static void extract_edit_data_init_subdiv(const DRWSubdivCache *subdiv_cache,
*(EditLoopData **)data = vbo_data;
}
-static void extract_edit_data_iter_subdiv(const DRWSubdivCache *subdiv_cache,
- const MeshRenderData *mr,
- void *_data,
- uint subdiv_quad_index)
+static void extract_edit_data_iter_subdiv_bm(const DRWSubdivCache *subdiv_cache,
+ const MeshRenderData *mr,
+ void *_data,
+ uint subdiv_quad_index,
+ const BMFace *coarse_quad)
{
EditLoopData *vbo_data = *(EditLoopData **)_data;
int *subdiv_loop_vert_index = (int *)GPU_vertbuf_get_data(subdiv_cache->verts_orig_index);
int *subdiv_loop_edge_index = (int *)GPU_vertbuf_get_data(subdiv_cache->edges_orig_index);
- int *subdiv_loop_poly_index = subdiv_cache->subdiv_loop_poly_index;
uint start_loop_idx = subdiv_quad_index * 4;
uint end_loop_idx = (subdiv_quad_index + 1) * 4;
for (uint i = start_loop_idx; i < end_loop_idx; i++) {
const int vert_origindex = subdiv_loop_vert_index[i];
const int edge_origindex = subdiv_loop_edge_index[i];
- const int poly_origindex = subdiv_loop_poly_index[i];
EditLoopData *edit_loop_data = &vbo_data[i];
memset(edit_loop_data, 0, sizeof(EditLoopData));
@@ -295,12 +294,22 @@ static void extract_edit_data_iter_subdiv(const DRWSubdivCache *subdiv_cache,
}
}
- BMFace *efa = bm_original_face_get(mr, poly_origindex);
/* The -1 parameter is for edit_uvs, which we don't do here. */
- mesh_render_data_face_flag(mr, efa, -1, edit_loop_data);
+ mesh_render_data_face_flag(mr, coarse_quad, -1, edit_loop_data);
}
}
+static void extract_edit_data_iter_subdiv_mesh(const DRWSubdivCache *subdiv_cache,
+ const MeshRenderData *mr,
+ void *_data,
+ uint subdiv_quad_index,
+ const MPoly *coarse_quad)
+{
+ const int coarse_quad_index = static_cast<int>(coarse_quad - mr->mpoly);
+ BMFace *coarse_quad_bm = bm_original_face_get(mr, coarse_quad_index);
+ extract_edit_data_iter_subdiv_bm(subdiv_cache, mr, _data, subdiv_quad_index, coarse_quad_bm);
+}
+
static void extract_edit_data_loose_geom_subdiv(const DRWSubdivCache *subdiv_cache,
const MeshRenderData *mr,
const MeshExtractLooseGeom *loose_geom,
@@ -336,7 +345,8 @@ constexpr MeshExtract create_extractor_edit_data()
extractor.iter_lvert_bm = extract_edit_data_iter_lvert_bm;
extractor.iter_lvert_mesh = extract_edit_data_iter_lvert_mesh;
extractor.init_subdiv = extract_edit_data_init_subdiv;
- extractor.iter_subdiv = extract_edit_data_iter_subdiv;
+ extractor.iter_subdiv_bm = extract_edit_data_iter_subdiv_bm;
+ extractor.iter_subdiv_mesh = extract_edit_data_iter_subdiv_mesh;
extractor.iter_loose_geom_subdiv = extract_edit_data_loose_geom_subdiv;
extractor.data_type = MR_DATA_NONE;
extractor.data_size = sizeof(EditLoopData *);
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_data.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_data.cc
index b1866708d14..b25e40690c9 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_data.cc
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_data.cc
@@ -139,38 +139,46 @@ static void extract_edituv_data_init_subdiv(const DRWSubdivCache *subdiv_cache,
extract_edituv_data_init_common(mr, vbo, data, subdiv_cache->num_subdiv_loops);
}
-static void extract_edituv_data_iter_subdiv(const DRWSubdivCache *subdiv_cache,
- const MeshRenderData *mr,
- void *_data,
- uint subdiv_quad_index)
+static void extract_edituv_data_iter_subdiv_bm(const DRWSubdivCache *subdiv_cache,
+ const MeshRenderData *mr,
+ void *_data,
+ uint subdiv_quad_index,
+ const BMFace *coarse_quad)
{
MeshExtract_EditUVData_Data *data = static_cast<MeshExtract_EditUVData_Data *>(_data);
int *subdiv_loop_vert_index = (int *)GPU_vertbuf_get_data(subdiv_cache->verts_orig_index);
int *subdiv_loop_edge_index = (int *)GPU_vertbuf_get_data(subdiv_cache->edges_orig_index);
- int *subdiv_loop_poly_index = subdiv_cache->subdiv_loop_poly_index;
uint start_loop_idx = subdiv_quad_index * 4;
uint end_loop_idx = (subdiv_quad_index + 1) * 4;
for (uint i = start_loop_idx; i < end_loop_idx; i++) {
const int vert_origindex = subdiv_loop_vert_index[i];
const int edge_origindex = subdiv_loop_edge_index[i];
- const int poly_origindex = subdiv_loop_poly_index[i];
EditLoopData *edit_loop_data = &data->vbo_data[i];
memset(edit_loop_data, 0, sizeof(EditLoopData));
- BMFace *efa = bm_original_face_get(mr, poly_origindex);
-
if (vert_origindex != -1 && edge_origindex != -1) {
BMEdge *eed = bm_original_edge_get(mr, edge_origindex);
/* Loop on an edge endpoint. */
- BMLoop *l = BM_face_edge_share_loop(efa, eed);
+ BMLoop *l = BM_face_edge_share_loop(const_cast<BMFace *>(coarse_quad), eed);
mesh_render_data_loop_flag(mr, l, data->cd_ofs, edit_loop_data);
mesh_render_data_loop_edge_flag(mr, l, data->cd_ofs, edit_loop_data);
}
}
}
+static void extract_edituv_data_iter_subdiv_mesh(const DRWSubdivCache *subdiv_cache,
+ const MeshRenderData *mr,
+ void *_data,
+ uint subdiv_quad_index,
+ const MPoly *coarse_quad)
+{
+ const int coarse_quad_index = static_cast<int>(coarse_quad - mr->mpoly);
+ BMFace *coarse_quad_bm = bm_original_face_get(mr, coarse_quad_index);
+ extract_edituv_data_iter_subdiv_bm(subdiv_cache, mr, _data, subdiv_quad_index, coarse_quad_bm);
+}
+
constexpr MeshExtract create_extractor_edituv_data()
{
MeshExtract extractor = {nullptr};
@@ -178,7 +186,8 @@ constexpr MeshExtract create_extractor_edituv_data()
extractor.iter_poly_bm = extract_edituv_data_iter_poly_bm;
extractor.iter_poly_mesh = extract_edituv_data_iter_poly_mesh;
extractor.init_subdiv = extract_edituv_data_init_subdiv;
- extractor.iter_subdiv = extract_edituv_data_iter_subdiv;
+ extractor.iter_subdiv_bm = extract_edituv_data_iter_subdiv_bm;
+ extractor.iter_subdiv_mesh = extract_edituv_data_iter_subdiv_mesh;
extractor.data_type = MR_DATA_NONE;
extractor.data_size = sizeof(MeshExtract_EditUVData_Data);
extractor.use_threading = true;