[Bf-blender-cvs] [30a68e4d58b] tmp-batch-cache-cleanup: Mesh Batch Cache: Refactor part 3
Clément Foucault
noreply at git.blender.org
Mon Jul 22 12:52:55 CEST 2019
Commit: 30a68e4d58b5838f521ea0dc3dc58ead418bf65e
Author: Clément Foucault
Date: Sun Jul 14 16:50:46 2019 +0200
Branches: tmp-batch-cache-cleanup
https://developer.blender.org/rB30a68e4d58b5838f521ea0dc3dc58ead418bf65e
Mesh Batch Cache: Refactor part 3
- Add subrange usage for material triangles
- Add loose edges/verts support for Mesh
- Cleanup eval mesh selection
- Add use_hide support
- Add selection index Vbos
- Add edit data vbo
- Add dummy edgefac vbo
===================================================================
M source/blender/draw/intern/draw_cache_impl_mesh.c
===================================================================
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index a81ae6e3b05..620955fdffc 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -213,12 +213,16 @@ typedef struct MeshRenderData {
int mat_len;
int loose_vert_len; /* Obsolete */
int loose_edge_len; /* Obsolete */
- int *tri_mat_len;
int *lverts;
int *ledges;
bool use_mapped;
+ bool use_hide;
+
+ /* HACK not supposed to be there but it's needed. */
+ struct MeshBatchCache *cache;
+
/* Support for mapped mesh data. */
struct {
/* Must be set if we want to get mapped data. */
@@ -1255,6 +1259,7 @@ static MeshRenderData *mesh_render_data_create_ex(Mesh *me,
}
static MeshRenderData *mesh_render_data_create_ex_new(Mesh *me,
+ const bool do_final,
const int types,
const DRW_MeshCDMask *UNUSED(cd_used),
const ToolSettings *ts)
@@ -1263,30 +1268,55 @@ static MeshRenderData *mesh_render_data_create_ex_new(Mesh *me,
mr->toolsettings = ts;
mr->mat_len = mesh_render_mat_len_get(me);
- mr->me = me;
- mr->edit_bmesh = me->edit_mesh;
- mr->use_mapped = me->edit_mesh && me->edit_mesh->mesh_eval_cage &&
- !me->edit_mesh->mesh_eval_cage->runtime.is_original;
+ if (me->edit_mesh) {
+ BLI_assert(me->edit_mesh->mesh_eval_cage && me->edit_mesh->mesh_eval_final);
+ mr->bm = me->edit_mesh->bm;
+ mr->edit_bmesh = me->edit_mesh;
+ mr->me = (do_final) ? me->edit_mesh->mesh_eval_final : me->edit_mesh->mesh_eval_cage;
+ mr->use_mapped = mr->me && !mr->me->runtime.is_original;
- mr->iter = mr->edit_bmesh ? (mr->use_mapped ? MR_EXTRACT_MAPPED : MR_EXTRACT_BMESH) :
- MR_EXTRACT_MESH;
+ int bm_ensure_types = BM_VERT | BM_EDGE | BM_LOOP | BM_FACE;
- if (mr->edit_bmesh) {
- mr->bm = mr->edit_bmesh->bm;
- }
+ BM_mesh_elem_index_ensure(mr->bm, bm_ensure_types);
+ BM_mesh_elem_table_ensure(mr->bm, bm_ensure_types & ~BM_LOOP);
+
+ mr->efa_act_uv = EDBM_uv_active_face_get(mr->edit_bmesh, false, false);
+ mr->efa_act = BM_mesh_active_face_get(mr->bm, false, true);
+ mr->eed_act = BM_mesh_active_edge_get(mr->bm);
+ mr->eve_act = BM_mesh_active_vert_get(mr->bm);
+
+ mr->cd.offset.crease = CustomData_get_offset(&mr->bm->edata, CD_CREASE);
+ mr->cd.offset.bweight = CustomData_get_offset(&mr->bm->edata, CD_BWEIGHT);
+#ifdef WITH_FREESTYLE
+ mr->cd.offset.freestyle_edge = CustomData_get_offset(&mr->bm->edata, CD_FREESTYLE_EDGE);
+ mr->cd.offset.freestyle_face = CustomData_get_offset(&mr->bm->pdata, CD_FREESTYLE_FACE);
+#endif
+
+ if (mr->use_mapped) {
+ mr->v_origindex = CustomData_get_layer(&mr->me->vdata, CD_ORIGINDEX);
+ mr->e_origindex = CustomData_get_layer(&mr->me->edata, CD_ORIGINDEX);
+ mr->p_origindex = CustomData_get_layer(&mr->me->pdata, CD_ORIGINDEX);
- if (mr->use_mapped) {
- mr->me = mr->edit_bmesh->mesh_eval_cage;
+ mr->use_mapped = (mr->v_origindex || mr->e_origindex || mr->p_origindex);
+ }
- mr->v_origindex = CustomData_get_layer(&mr->me->vdata, CD_ORIGINDEX);
- mr->e_origindex = CustomData_get_layer(&mr->me->edata, CD_ORIGINDEX);
- mr->p_origindex = CustomData_get_layer(&mr->me->pdata, CD_ORIGINDEX);
+ mr->iter = mr->use_mapped ? MR_EXTRACT_MAPPED : MR_EXTRACT_BMESH;
- mr->use_mapped = (mr->v_origindex || mr->e_origindex || mr->p_origindex);
- BLI_assert(mr->use_mapped);
+ /* Seems like the mesh_eval_final do not have the right origin indices.
+ * Force not mapped in this case. */
+ if (do_final && me->edit_mesh->mesh_eval_final != me->edit_mesh->mesh_eval_cage) {
+ mr->use_mapped = false;
+ mr->edit_bmesh = NULL;
+ mr->iter = MR_EXTRACT_MESH;
+ }
+ }
+ else {
+ mr->me = me;
+ mr->edit_bmesh = NULL;
+ mr->iter = MR_EXTRACT_MESH;
}
- if (!mr->edit_bmesh || mr->use_mapped) {
+ if (mr->iter != MR_EXTRACT_BMESH) {
/* Mesh */
mr->vert_len = mr->me->totvert;
mr->edge_len = mr->me->totedge;
@@ -1301,15 +1331,47 @@ static MeshRenderData *mesh_render_data_create_ex_new(Mesh *me,
if (types & MR_ITER_LOOPTRI) {
mr->mlooptri = MEM_mallocN(sizeof(*mr->mlooptri) * mr->tri_len, "MR_DATATYPE_LOOPTRI");
- BKE_mesh_recalc_looptri(
- me->mloop, me->mpoly, me->mvert, me->totloop, me->totpoly, mr->mlooptri);
+ BKE_mesh_recalc_looptri(mr->me->mloop,
+ mr->me->mpoly,
+ mr->me->mvert,
+ mr->me->totloop,
+ mr->me->totpoly,
+ mr->mlooptri);
}
if (types & (MR_ITER_LEDGE | MR_ITER_LVERT)) {
mr->vert_loose_len = 0;
mr->edge_loose_len = 0;
- /* TODO */
- /* Note: Might not be possible for lverts. */
+ /* Reset Flag */
+ MVert *mvert = mr->mvert;
+ for (int v = 0; v < mr->vert_len; v++, mvert++) {
+ mvert->flag |= ME_VERT_TMP_TAG;
+ }
+
+ mr->ledges = MEM_mallocN(mr->edge_len * sizeof(int), __func__);
+ const MEdge *medge = mr->medge;
+ for (int e = 0; e < mr->edge_len; e++, medge++) {
+ if (medge->flag & ME_LOOSEEDGE) {
+ mr->ledges[mr->edge_loose_len++] = e;
+ }
+ /* Tag verts as not loose. */
+ mr->mvert[medge->v1].flag &= ~ME_VERT_TMP_TAG;
+ mr->mvert[medge->v2].flag &= ~ME_VERT_TMP_TAG;
+ }
+ if (mr->edge_loose_len < mr->edge_len) {
+ mr->ledges = MEM_reallocN(mr->ledges, mr->edge_loose_len * sizeof(*mr->ledges));
+ }
+
+ mr->lverts = MEM_mallocN(mr->vert_len * sizeof(*mr->lverts), __func__);
+ mvert = mr->mvert;
+ for (int v = 0; v < mr->vert_len; v++, mvert++) {
+ if (mvert->flag & ME_VERT_TMP_TAG) {
+ mr->lverts[mr->vert_loose_len++] = v;
+ }
+ }
+ if (mr->vert_loose_len < mr->vert_len) {
+ mr->lverts = MEM_reallocN(mr->lverts, mr->vert_loose_len * sizeof(*mr->lverts));
+ }
mr->loop_loose_len = mr->vert_loose_len + mr->edge_loose_len * 2;
}
@@ -1324,23 +1386,6 @@ static MeshRenderData *mesh_render_data_create_ex_new(Mesh *me,
mr->poly_len = bm->totface;
mr->tri_len = poly_to_tri_count(mr->poly_len, mr->loop_len);
- mr->efa_act_uv = EDBM_uv_active_face_get(mr->edit_bmesh, false, false);
- mr->efa_act = BM_mesh_active_face_get(bm, false, true);
- mr->eed_act = BM_mesh_active_edge_get(bm);
- mr->eve_act = BM_mesh_active_vert_get(bm);
-
- mr->cd.offset.crease = CustomData_get_offset(&bm->edata, CD_CREASE);
- mr->cd.offset.bweight = CustomData_get_offset(&bm->edata, CD_BWEIGHT);
-#ifdef WITH_FREESTYLE
- mr->cd.offset.freestyle_edge = CustomData_get_offset(&bm->edata, CD_FREESTYLE_EDGE);
- mr->cd.offset.freestyle_face = CustomData_get_offset(&bm->pdata, CD_FREESTYLE_FACE);
-#endif
-
- int bm_ensure_types = BM_VERT | BM_EDGE | BM_LOOP | BM_FACE;
-
- BM_mesh_elem_index_ensure(bm, bm_ensure_types);
- BM_mesh_elem_table_ensure(bm, bm_ensure_types & ~BM_LOOP);
-
if (types & MR_ITER_LOOPTRI) {
/* Edit mode ensures this is valid, no need to calculate. */
BLI_assert((bm->totloop == 0) || (mr->edit_bmesh->looptris != NULL));
@@ -1363,13 +1408,13 @@ static MeshRenderData *mesh_render_data_create_ex_new(Mesh *me,
mr->lverts = MEM_reallocN(mr->lverts, mr->vert_loose_len * sizeof(*mr->lverts));
}
- mr->ledges = MEM_mallocN(mr->edge_len * sizeof(int), __func__);
+ mr->ledges = MEM_mallocN(mr->edge_len * sizeof(*mr->ledges), __func__);
BM_ITER_MESH_INDEX (ede, &iter, bm, BM_EDGES_OF_MESH, elem_id) {
if (ede->l == NULL) {
mr->ledges[mr->edge_loose_len++] = elem_id;
}
}
- if (mr->edge_loose_len < mr->vert_len) {
+ if (mr->edge_loose_len < mr->edge_len) {
mr->ledges = MEM_reallocN(mr->ledges, mr->edge_loose_len * sizeof(*mr->ledges));
}
@@ -1794,34 +1839,33 @@ fallback:
/** \name Internal Cache Generation
* \{ */
-static uchar mesh_render_data_face_flag(MeshRenderData *rdata, const BMFace *efa, const int cd_ofs)
+static void mesh_render_data_face_flag(MeshRenderData *rdata,
+ const BMFace *efa,
+ const int cd_ofs,
+ EdgeDrawAttr *eattr)
{
- uchar fflag = 0;
-
if (efa == rdata->efa_act) {
- fflag |= VFLAG_FACE_ACTIVE;
+ eattr->v_flag |= VFLAG_FACE_ACTIVE;
}
if (BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
- fflag |= VFLAG_FACE_SELECTED;
+ eattr->v_flag |= VFLAG_FACE_SELECTED;
}
if (efa == rdata->efa_act_uv) {
- fflag |= VFLAG_FACE_UV_ACTIVE;
+ eattr->v_flag |= VFLAG_FACE_UV_ACTIVE;
}
if ((cd_ofs != -1) && uvedit_face_select_test_ex(rdata->toolsettings, (BMFace *)efa, cd_ofs)) {
- fflag |= VFLAG_FACE_UV_SELECT;
+ eattr->v_flag |= VFLAG_FACE_UV_SELECT;
}
#ifdef WITH_FREESTYLE
if (rdata->cd.offset.freestyle_face != -1) {
const FreestyleFace *ffa = BM_ELEM_CD_GET_VOID_P(efa, rdata->cd.offset.freestyle_face);
if (ffa->flag & FREESTYLE_FACE_MARK) {
- fflag |= VFLAG_FACE_FREESTYLE;
+ eattr->v_flag |= VFLAG_FACE_FREESTYLE;
}
}
#endif
-
- return fflag;
}
static void mesh_render_data_edge_flag(const MeshRenderData *rdata,
@@ -2243,6 +2287,10 @@ typedef struct MeshBatchCache {
GPUBatch **surface_per_mat;
+ /* HACK: Temp copy to init the subrange IBOs. */
+ int *tri_mat_start, *tri_mat_end;
+ int edge_loose_start, edge_loose_end;
+
/* arrays of bool uniform names (and value) that will be use to
* set srgb conversion for auto attributes.*/
char *auto_layer_names;
@@ -2512,6 +2560,9 @@ static void mesh_batch_cache_clear(Mesh *me)
mesh_batch_cache_discard_uvedit(cache);
+ MEM_SAFE_FREE(cache->tri_mat_end);
+ MEM_SAFE_FREE(cache->tri_mat_start);
+
cache->batch_ready = 0;
drw_mesh_
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list