[Bf-blender-cvs] [3c95a0c1222] tmp-batch-cache-cleanup: Mesh Batch Cache: Refactor Part 5

Clément Foucault noreply at git.blender.org
Mon Jul 22 12:53:00 CEST 2019


Commit: 3c95a0c1222202e2b282432476c182d7b9d9c8f4
Author: Clément Foucault
Date:   Wed Jul 17 00:31:03 2019 +0200
Branches: tmp-batch-cache-cleanup
https://developer.blender.org/rB3c95a0c1222202e2b282432476c182d7b9d9c8f4

Mesh Batch Cache: Refactor Part 5

- Add Vcol support
- Add UV/Tangent support
- Add Orco support
- Add Paint Line Mask support
- Add Adjacency Lines support
- Add EditUV face/line/point/facedot support
- Add EditUV data flag support
- Add EditUV StretchAngle/Area support
- Add Facedots select index support
- Add Weight support
- Add Mesh Analysis support

===================================================================

M	source/blender/draw/intern/draw_cache_impl_mesh.c
M	source/blender/gpu/shaders/gpu_shader_2D_edituvs_stretch_vert.glsl

===================================================================

diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 0bebbdd4ede..716329f3eb7 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -361,6 +361,8 @@ typedef enum eMRDataType {
   MR_DATATYPE_LOOP_NORMALS = 1 << 12,
   /* New data types to replace all above */
   MR_DATA_POLY_NOR = 1 << 13,
+  MR_DATA_LOOP_NOR = 1 << 14,
+  MR_DATA_LOOPTRI = 1 << 15,
 } eMRDataType;
 
 #define MR_DATATYPE_VERT_LOOP_POLY (MR_DATATYPE_VERT | MR_DATATYPE_POLY | MR_DATATYPE_LOOP)
@@ -1271,10 +1273,14 @@ static MeshRenderData *mesh_render_data_create_ex_new(Mesh *me,
   mr->toolsettings = ts;
   mr->mat_len = mesh_render_mat_len_get(me);
 
+  const bool is_auto_smooth = (me->flag & ME_AUTOSMOOTH) != 0;
+  const float split_angle = is_auto_smooth ? me->smoothresh : (float)M_PI;
+
   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->edit_data = me->runtime.edit_data;
     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;
 
@@ -1309,7 +1315,7 @@ static MeshRenderData *mesh_render_data_create_ex_new(Mesh *me,
      * 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->edit_bmesh = NULL;
       mr->iter = MR_EXTRACT_MESH;
     }
   }
@@ -1332,7 +1338,11 @@ static MeshRenderData *mesh_render_data_create_ex_new(Mesh *me,
     mr->mloop = CustomData_get_layer(&mr->me->ldata, CD_MLOOP);
     mr->mpoly = CustomData_get_layer(&mr->me->pdata, CD_MPOLY);
 
-    if (data_flag & MR_DATA_POLY_NOR) {
+    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 (data_flag & (MR_DATA_POLY_NOR | MR_DATA_LOOP_NOR)) {
       mr->poly_normals = MEM_mallocN(sizeof(*mr->poly_normals) * mr->poly_len, __func__);
       BKE_mesh_calc_normals_poly(mr->mvert,
                                  NULL,
@@ -1344,7 +1354,26 @@ static MeshRenderData *mesh_render_data_create_ex_new(Mesh *me,
                                  mr->poly_normals,
                                  true);
     }
-    if (types & MR_ITER_LOOPTRI) {
+    if (data_flag & MR_DATA_LOOP_NOR) {
+      mr->loop_normals = MEM_mallocN(sizeof(*mr->loop_normals) * mr->loop_len, __func__);
+      short(*clnors)[2] = CustomData_get_layer(&mr->me->ldata, CD_CUSTOMLOOPNORMAL);
+      BKE_mesh_normals_loop_split(mr->me->mvert,
+                                  mr->vert_len,
+                                  mr->me->medge,
+                                  mr->edge_len,
+                                  mr->me->mloop,
+                                  mr->loop_normals,
+                                  mr->loop_len,
+                                  mr->me->mpoly,
+                                  mr->poly_normals,
+                                  mr->poly_len,
+                                  is_auto_smooth,
+                                  split_angle,
+                                  NULL,
+                                  clnors,
+                                  NULL);
+    }
+    if ((types & MR_ITER_LOOPTRI) || (data_flag & MR_DATA_LOOPTRI)) {
       mr->mlooptri = MEM_mallocN(sizeof(*mr->mlooptri) * mr->tri_len, "MR_DATATYPE_LOOPTRI");
       BKE_mesh_recalc_looptri(mr->me->mloop,
                               mr->me->mpoly,
@@ -1404,7 +1433,22 @@ static MeshRenderData *mesh_render_data_create_ex_new(Mesh *me,
     if (data_flag & MR_DATA_POLY_NOR) {
       /* Use bmface->no instead. */
     }
-    if (types & MR_ITER_LOOPTRI) {
+    if (data_flag & MR_DATA_LOOP_NOR) {
+      mr->loop_normals = MEM_mallocN(sizeof(*mr->loop_normals) * mr->loop_len, __func__);
+      int clnors_offset = CustomData_get_offset(&mr->bm->ldata, CD_CUSTOMLOOPNORMAL);
+      BM_loops_calc_normal_vcos(mr->bm,
+                                NULL,
+                                NULL,
+                                NULL,
+                                is_auto_smooth,
+                                split_angle,
+                                mr->loop_normals,
+                                NULL,
+                                NULL,
+                                clnors_offset,
+                                false);
+    }
+    if ((types & MR_ITER_LOOPTRI) || (data_flag & MR_DATA_LOOPTRI)) {
       /* Edit mode ensures this is valid, no need to calculate. */
       BLI_assert((bm->totloop == 0) || (mr->edit_bmesh->looptris != NULL));
     }
@@ -1755,7 +1799,8 @@ fallback:
   }
 }
 
-static float evaluate_vertex_weight(const MDeformVert *dvert, const DRW_MeshWeightState *wstate)
+static float UNUSED_FUNCTION(evaluate_vertex_weight)(const MDeformVert *dvert,
+                                                     const DRW_MeshWeightState *wstate)
 {
   float input = 0.0f;
   bool show_alert_color = false;
@@ -1801,8 +1846,8 @@ static float evaluate_vertex_weight(const MDeformVert *dvert, const DRW_MeshWeig
 }
 
 /** Ensure #MeshRenderData.vert_weight */
-static void mesh_render_data_ensure_vert_weight(MeshRenderData *rdata,
-                                                const struct DRW_MeshWeightState *wstate)
+static void UNUSED_FUNCTION(mesh_render_data_ensure_vert_weight)(
+    MeshRenderData *rdata, const struct DRW_MeshWeightState *wstate)
 {
   float *vweight = rdata->vert_weight;
   if (vweight == NULL) {
@@ -1824,7 +1869,7 @@ static void mesh_render_data_ensure_vert_weight(MeshRenderData *rdata,
       vweight = rdata->vert_weight = MEM_mallocN(sizeof(*vweight) * rdata->vert_len, __func__);
       BM_ITER_MESH_INDEX (eve, &viter, bm, BM_VERT, i) {
         const MDeformVert *dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
-        vweight[i] = evaluate_vertex_weight(dvert, wstate);
+        vweight[i] = UNUSED_evaluate_vertex_weight(dvert, wstate);
       }
     }
     else {
@@ -1834,7 +1879,7 @@ static void mesh_render_data_ensure_vert_weight(MeshRenderData *rdata,
 
       vweight = rdata->vert_weight = MEM_mallocN(sizeof(*vweight) * rdata->vert_len, __func__);
       for (int i = 0; i < rdata->vert_len; i++) {
-        vweight[i] = evaluate_vertex_weight(&rdata->dvert[i], wstate);
+        vweight[i] = UNUSED_evaluate_vertex_weight(&rdata->dvert[i], wstate);
       }
     }
   }
@@ -2213,7 +2258,7 @@ typedef enum DRWBatchFlag {
 
 #define MBC_EDITUV \
   (MBC_EDITUV_FACES_STRECH_AREA | MBC_EDITUV_FACES_STRECH_ANGLE | MBC_EDITUV_FACES | \
-   MBC_EDITUV_EDGES | MBC_EDITUV_VERTS | MBC_EDITUV_FACEDOTS)
+   MBC_EDITUV_EDGES | MBC_EDITUV_VERTS | MBC_EDITUV_FACEDOTS | MBC_WIRE_LOOPS_UVS)
 
 #define FOREACH_MESH_BUFFER_CACHE(batch_cache, mbc) \
   for (MeshBufferCache *mbc = &batch_cache->final; \
@@ -2263,7 +2308,7 @@ typedef struct MeshBufferCache {
     GPUIndexBuf *lines_adjacency;
     /* Uv overlays. (visibility can differ from 3D view) */
     GPUIndexBuf *edituv_tris;
-    GPUIndexBuf *edituv_line_strips;
+    GPUIndexBuf *edituv_lines;
     GPUIndexBuf *edituv_points;
     GPUIndexBuf *edituv_facedots;
   } ibo;
@@ -2469,8 +2514,9 @@ static void mesh_batch_cache_discard_uvedit(MeshBatchCache *cache)
     GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.facedots_uv);
     GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.facedots_data_edituv);
     GPU_INDEXBUF_DISCARD_SAFE(mbufcache->ibo.edituv_tris);
-    GPU_INDEXBUF_DISCARD_SAFE(mbufcache->ibo.edituv_line_strips);
+    GPU_INDEXBUF_DISCARD_SAFE(mbufcache->ibo.edituv_lines);
     GPU_INDEXBUF_DISCARD_SAFE(mbufcache->ibo.edituv_points);
+    GPU_INDEXBUF_DISCARD_SAFE(mbufcache->ibo.edituv_facedots);
   }
   GPU_BATCH_DISCARD_SAFE(cache->batch.edituv_faces_strech_area);
   GPU_BATCH_DISCARD_SAFE(cache->batch.edituv_faces_strech_angle);
@@ -2478,6 +2524,7 @@ static void mesh_batch_cache_discard_uvedit(MeshBatchCache *cache)
   GPU_BATCH_DISCARD_SAFE(cache->batch.edituv_edges);
   GPU_BATCH_DISCARD_SAFE(cache->batch.edituv_verts);
   GPU_BATCH_DISCARD_SAFE(cache->batch.edituv_facedots);
+  GPU_BATCH_DISCARD_SAFE(cache->batch.wire_loops_uvs);
 
   cache->batch_ready &= ~MBC_EDITUV;
 }
@@ -2499,11 +2546,15 @@ void DRW_mesh_batch_cache_dirty_tag(Mesh *me, int mode)
       GPU_BATCH_DISCARD_SAFE(cache->batch.edit_vertices);
       GPU_BATCH_DISCARD_SAFE(cache->batch.edit_edges);
       GPU_BATCH_DISCARD_SAFE(cache->batch.edit_facedots);
+      GPU_BATCH_DISCARD_SAFE(cache->batch.edit_selection_verts);
+      GPU_BATCH_DISCARD_SAFE(cache->batch.edit_selection_edges);
+      GPU_BATCH_DISCARD_SAFE(cache->batch.edit_selection_faces);
       GPU_BATCH_DISCARD_SAFE(cache->batch.edit_selection_facedots);
       GPU_BATCH_DISCARD_SAFE(cache->batch.edit_mesh_analysis);
       cache->batch_ready &= ~(MBC_EDIT_TRIANGLES | MBC_EDIT_VERTICES | MBC_EDIT_EDGES |
                               MBC_EDIT_FACEDOTS | MBC_EDIT_SELECTION_FACEDOTS |
-                              MBC_EDIT_MESH_ANALYSIS);
+                              MBC_EDIT_SELECTION_FACES | MBC_EDIT_SELECTION_EDGES |
+                              MBC_EDIT_SELECTION_VERTS | MBC_EDIT_MESH_ANALYSIS);
       /* Because visible UVs depends on edit mode selection, discard everything. */
       mesh_batch_cache_discard_uvedit(cache);
       break;
@@ -3163,7 +3214,7 @@ static void UNUSED_FUNCTION(mesh_create_weights)(MeshRenderData *rdata,
 
   const int vbo_len_capacity = mesh_render_data_verts_len_get_maybe_mapped(rdata);
 
-  mesh_render_data_ensure_vert_weight(rdata, wstate);
+  // mesh_render_data_ensure_vert_weight(rdata, wstate);
   const float *vert_weight = rdata->vert_weight;
 
   GPU_vertbuf_init_with_format(vbo, &format);
@@ -4694,7 +4745,7 @@ typedef struct MeshExtractIterData {
   BMLoop *eloop;
   BMLoop **elooptri;
   /* Index of current element. Is not BMesh index if iteration is on mapped. */
-  int vert_idx, edge_idx, face_idx, loop_idx;
+  int vert_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list