[Bf-blender-cvs] [93f175f2792] tmp-batch-cache-cleanup: Mesh Batch Cache: Refactor Part 6

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


Commit: 93f175f27920ad6b0eef35c8179fb9e91a6a795f
Author: Clément Foucault
Date:   Fri Jul 19 17:20:46 2019 +0200
Branches: tmp-batch-cache-cleanup
https://developer.blender.org/rB93f175f27920ad6b0eef35c8179fb9e91a6a795f

Mesh Batch Cache: Refactor Part 6

Add back subdiv facedot correct position.

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

M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_cache_impl.h
M	source/blender/draw/intern/draw_cache_impl_mesh.c
M	source/blender/draw/intern/draw_manager.c
M	source/blender/editors/uvedit/uvedit_draw.c

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

diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index e2e98a2db5a..bad4b55eb1a 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -4033,7 +4033,7 @@ void drw_batch_cache_validate(Object *ob)
 void drw_batch_cache_generate_requested(Object *ob)
 {
   const DRWContextState *draw_ctx = DRW_context_state_get();
-  const ToolSettings *ts = draw_ctx->scene->toolsettings;
+  const Scene *scene = draw_ctx->scene;
   const enum eContextObjectMode mode = CTX_data_mode_enum_ex(
       draw_ctx->object_edit, draw_ctx->obact, draw_ctx->object_mode);
   const bool is_paint_mode = ELEM(
@@ -4047,13 +4047,13 @@ void drw_batch_cache_generate_requested(Object *ob)
   struct Mesh *mesh_eval = ob->runtime.mesh_eval;
   switch (ob->type) {
     case OB_MESH:
-      DRW_mesh_batch_cache_create_requested(ob, (Mesh *)ob->data, ts, is_paint_mode, use_hide);
+      DRW_mesh_batch_cache_create_requested(ob, (Mesh *)ob->data, scene, is_paint_mode, use_hide);
       break;
     case OB_CURVE:
     case OB_FONT:
     case OB_SURF:
       if (mesh_eval) {
-        DRW_mesh_batch_cache_create_requested(ob, mesh_eval, ts, is_paint_mode, use_hide);
+        DRW_mesh_batch_cache_create_requested(ob, mesh_eval, scene, is_paint_mode, use_hide);
       }
       DRW_curve_batch_cache_create_requested(ob);
       break;
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index ea0b8f406dd..7d086f10a41 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -119,7 +119,7 @@ struct GPUBatch *DRW_lattice_batch_cache_get_edit_verts(struct Lattice *lt);
 /* Mesh */
 void DRW_mesh_batch_cache_create_requested(struct Object *ob,
                                            struct Mesh *me,
-                                           const struct ToolSettings *ts,
+                                           const struct Scene *scene,
                                            const bool is_paint_mode,
                                            const bool use_hide);
 
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 716329f3eb7..1ce0833354d 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -219,6 +219,7 @@ typedef struct MeshRenderData {
 
   bool use_mapped;
   bool use_hide;
+  bool use_subsurf_fdots;
 
   /* HACK not supposed to be there but it's needed. */
   struct MeshBatchCache *cache;
@@ -4989,13 +4990,15 @@ static void *mesh_facedot_init(const MeshRenderData *mr, void *UNUSED(buf))
 }
 static void mesh_facedot_iter(const MeshExtractIterData *iter, void *UNUSED(buf), void *elb)
 {
-  if (!(iter->use_hide && (iter->mpoly->flag & ME_HIDE))) {
+  if (!(iter->use_hide && (iter->mpoly->flag & ME_HIDE)) &&
+      (!iter->mr->use_subsurf_fdots || (iter->mvert->flag & ME_VERT_FACEDOT))) {
     GPU_indexbuf_set_point_vert(elb, iter->face_idx, iter->face_idx);
   }
 }
 static void mesh_facedot_iter_edit(const MeshExtractIterData *iter, void *UNUSED(buf), void *elb)
 {
-  if (iter->efa && !BM_elem_flag_test(iter->efa, BM_ELEM_HIDDEN)) {
+  if (iter->efa && !BM_elem_flag_test(iter->efa, BM_ELEM_HIDDEN) &&
+      (!iter->mr->use_subsurf_fdots || (iter->mvert->flag & ME_VERT_FACEDOT))) {
     GPU_indexbuf_set_point_vert(elb, iter->face_idx, iter->face_idx);
   }
 }
@@ -5414,7 +5417,8 @@ static void *mesh_edituv_fdot_init(const MeshRenderData *mr, void *UNUSED(ibo))
 }
 static void mesh_edituv_fdot_iter(const MeshExtractIterData *iter, void *UNUSED(buf), void *data)
 {
-  if (!(iter->use_hide && (iter->mpoly->flag & ME_HIDE))) {
+  if (!(iter->use_hide && (iter->mpoly->flag & ME_HIDE)) &&
+      (!iter->mr->use_subsurf_fdots || (iter->mvert->flag & ME_VERT_FACEDOT))) {
     MeshExtract_EditUvFdot_Data *extract_data = (MeshExtract_EditUvFdot_Data *)data;
     GPU_indexbuf_set_point_vert(&extract_data->elb, iter->face_idx, iter->face_idx);
   }
@@ -5425,7 +5429,8 @@ static void mesh_edituv_fdot_iter_edit(const MeshExtractIterData *iter,
 {
   MeshExtract_EditUvFdot_Data *extract_data = (MeshExtract_EditUvFdot_Data *)data;
   if (iter->efa && !BM_elem_flag_test(iter->efa, BM_ELEM_HIDDEN) &&
-      (extract_data->sync_selection || BM_elem_flag_test(iter->efa, BM_ELEM_SELECT))) {
+      (extract_data->sync_selection || BM_elem_flag_test(iter->efa, BM_ELEM_SELECT)) &&
+      (!iter->mr->use_subsurf_fdots || (iter->mvert->flag & ME_VERT_FACEDOT))) {
     GPU_indexbuf_set_point_vert(&extract_data->elb, iter->face_idx, iter->face_idx);
   }
 }
@@ -6565,10 +6570,17 @@ static void *mesh_fdots_pos_init(const MeshRenderData *mr, void *buf)
 static void mesh_fdots_pos_iter(const MeshExtractIterData *iter, void *UNUSED(buf), void *data)
 {
   float(*center)[3] = (float(*)[3])data;
-  float w = 1.0f / (float)iter->mpoly->totloop;
-  /* This is thread safe since we are spliting workload in faces (for loop iter) so one face is
-   * only touched by one thread. */
-  madd_v3_v3fl(center[iter->face_idx], iter->mvert->co, w);
+  if (iter->mr->use_subsurf_fdots) {
+    if (iter->mvert->flag & ME_VERT_FACEDOT) {
+      copy_v3_v3(center[iter->face_idx], iter->mvert->co);
+    }
+  }
+  else {
+    float w = 1.0f / (float)iter->mpoly->totloop;
+    /* This is thread safe since we are spliting workload in faces (for loop iter) so one face is
+     * only touched by one thread. */
+    madd_v3_v3fl(center[iter->face_idx], iter->mvert->co, w);
+  }
 }
 static void mesh_fdots_pos_iter_edit(const MeshExtractIterData *iter,
                                      void *UNUSED(buf),
@@ -6664,11 +6676,18 @@ static void *mesh_fdots_uv_init(const MeshRenderData *mr, void *buf)
 static void mesh_fdots_uv_iter(const MeshExtractIterData *iter, void *UNUSED(buf), void *data)
 {
   MeshExtract_FdotUV_Data *extract_data = (MeshExtract_FdotUV_Data *)data;
-  float w = 1.0f / (float)iter->mpoly->totloop;
-  /* This is thread safe since we are spliting workload in faces (for loop iter) so one face is
-   * only touched by one thread. */
-  madd_v2_v2fl(
-      extract_data->vbo_data[iter->face_idx], extract_data->uv_data[iter->loop_idx].uv, w);
+  if (iter->mr->use_subsurf_fdots) {
+    if (iter->mvert->flag & ME_VERT_FACEDOT) {
+      copy_v2_v2(extract_data->vbo_data[iter->face_idx], extract_data->uv_data[iter->loop_idx].uv);
+    }
+  }
+  else {
+    float w = 1.0f / (float)iter->mpoly->totloop;
+    /* This is thread safe since we are spliting workload in faces (for loop iter) so one face is
+     * only touched by one thread. */
+    madd_v2_v2fl(
+        extract_data->vbo_data[iter->face_idx], extract_data->uv_data[iter->loop_idx].uv, w);
+  }
 }
 static void mesh_fdots_uv_iter_edit(const MeshExtractIterData *iter, void *UNUSED(buf), void *data)
 {
@@ -7194,6 +7213,7 @@ static void mesh_buffer_cache_create_requested(MeshBatchCache *cache,
                                                MeshBufferCache mbc,
                                                Mesh *me,
                                                const bool do_final,
+                                               const bool use_subsurf_fdots,
                                                const DRW_MeshCDMask *cd_layer_used,
                                                const ToolSettings *ts,
                                                const bool use_hide)
@@ -7270,6 +7290,7 @@ static void mesh_buffer_cache_create_requested(MeshBatchCache *cache,
       me, do_final, iter_flag, data_flag, cd_layer_used, ts);
   mr->cache = cache; /* HACK */
   mr->use_hide = use_hide;
+  mr->use_subsurf_fdots = use_subsurf_fdots;
 
   int ref_id = 0;
   for (int i = 0; i < sizeof(mbc) / sizeof(void *); i++) {
@@ -8007,8 +8028,9 @@ void DRW_mesh_batch_cache_free_old(Mesh *me, int ctime)
 
 /* Can be called for any surface type. Mesh *me is the final mesh. */
 void DRW_mesh_batch_cache_create_requested(
-    Object *ob, Mesh *me, const ToolSettings *ts, const bool is_paint_mode, const bool use_hide)
+    Object *ob, Mesh *me, const Scene *scene, const bool is_paint_mode, const bool use_hide)
 {
+  const ToolSettings *ts = scene->toolsettings;
   MeshBatchCache *cache = mesh_batch_cache_get(me);
 
   /* Early out */
@@ -8297,7 +8319,10 @@ void DRW_mesh_batch_cache_create_requested(
     DRW_vbo_request(cache->batch.edituv_facedots, &mbufcache->vbo.facedots_data_edituv);
   }
 
-  mesh_buffer_cache_create_requested(cache, cache->final, me, true, &cache->cd_used, ts, use_hide);
+  const bool use_subsurf_fdots = scene ? modifiers_usesSubsurfFacedots(scene, ob) : false;
+
+  mesh_buffer_cache_create_requested(
+      cache, cache->final, me, true, use_subsurf_fdots, &cache->cd_used, ts, use_hide);
 
   /* Init index buffer subranges. */
   if (cache->surface_per_mat[0] && (cache->surface_per_mat[0]->elem == cache->final.ibo.tris)) {
@@ -8321,7 +8346,8 @@ void DRW_mesh_batch_cache_create_requested(
   }
 
   if (do_cage) {
-    mesh_buffer_cache_create_requested(cache, cache->cage, me, false, &cache->cd_used, ts, true);
+    mesh_buffer_cache_create_requested(
+        cache, cache->cage, me, false, use_subsurf_fdots, &cache->cd_used, ts, true);
   }
 
 #ifdef DEBUG
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 2841e017ef6..00c9d20f1fd 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -2772,7 +2772,7 @@ void DRW_draw_select_id_object(Scene *scene,
         if (use_faceselect && draw_facedot) {
           geom_facedots = DRW_mesh_batch_cache_get_facedots_with_select_id(me);
         }
-        DRW_mesh_batch_cache_create_requested(ob, me, NULL, false, true);
+        DRW_mesh_batch_cache_create_requested(ob, me, scene, false, true);
 
         draw_mesh_face(geom_faces, initial_offset, use_faceselect, world_clip_planes);
 
@@ -2824,7 +2824,7 @@ void DRW_draw_select_id_object(Scene *scene,
             ((ob->mode & OB_MODE_WEIGHT_PAINT) || (ob->mode & OB_MODE_VERTEX_PAINT))) {
 
           GPUBatch *geom_verts = DRW_mesh_batch_cach

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list