[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