[Bf-blender-cvs] [f0d93a71df8] master: Cleanup: API for MeshExtractRunTimeData.

Jeroen Bakker noreply at git.blender.org
Tue Jun 1 13:18:50 CEST 2021


Commit: f0d93a71df85e91ec4e06d2b37e24fb728edf2c2
Author: Jeroen Bakker
Date:   Tue Jun 1 12:59:15 2021 +0200
Branches: master
https://developer.blender.org/rBf0d93a71df85e91ec4e06d2b37e24fb728edf2c2

Cleanup: API for MeshExtractRunTimeData.

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

M	source/blender/draw/intern/draw_cache_extract_mesh.cc
M	source/blender/draw/intern/draw_cache_extract_mesh_extractors.c
M	source/blender/draw/intern/draw_cache_extract_mesh_private.h

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

diff --git a/source/blender/draw/intern/draw_cache_extract_mesh.cc b/source/blender/draw/intern/draw_cache_extract_mesh.cc
index b3ebce98524..5a086805580 100644
--- a/source/blender/draw/intern/draw_cache_extract_mesh.cc
+++ b/source/blender/draw/intern/draw_cache_extract_mesh.cc
@@ -54,63 +54,80 @@ namespace blender::draw {
 /** \name Mesh Elements Extract Struct
  * \{ */
 
-struct MeshExtractRunData {
+struct ExtractorRunData {
+  /* Extractor where this run data belongs to. */
   const MeshExtract *extractor;
-  void *buffer;
-  void *user_data;
-};
-
-using MeshExtractRunDataArray = blender::Vector<MeshExtractRunData>;
+  /* During iteration the VBO/IBO that is being build. */
+  void *buffer = nullptr;
+  /* User data during iteration. Created in MeshExtract.init and passed along to other MeshExtract
+   * functions. */
+  void *user_data = nullptr;
 
-static void mesh_extract_run_data_array_add(MeshExtractRunDataArray &array,
-                                            const MeshExtract *extractor)
-{
-  MeshExtractRunData run_data;
-  run_data.extractor = extractor;
-  run_data.buffer = NULL;
-  run_data.user_data = NULL;
-  array.append(run_data);
-}
+  ExtractorRunData(const MeshExtract *extractor) : extractor(extractor)
+  {
+  }
+};
 
-static void mesh_extract_run_data_array_filter_iter_type(const MeshExtractRunDataArray &src,
-                                                         MeshExtractRunDataArray &dst,
-                                                         eMRIterType iter_type)
-{
-  for (const MeshExtractRunData &data : src) {
-    const MeshExtract *extractor = data.extractor;
-    if ((iter_type & MR_ITER_LOOPTRI) && extractor->iter_looptri_bm) {
-      BLI_assert(extractor->iter_looptri_mesh);
-      dst.append(data);
-      continue;
-    }
-    if ((iter_type & MR_ITER_POLY) && extractor->iter_poly_bm) {
-      BLI_assert(extractor->iter_poly_mesh);
-      dst.append(data);
-      continue;
+class ExtractorRunDatas : public Vector<ExtractorRunData> {
+ public:
+  void filter_into(ExtractorRunDatas &result, eMRIterType iter_type) const
+  {
+    for (const ExtractorRunData &data : *this) {
+      const MeshExtract *extractor = data.extractor;
+      if ((iter_type & MR_ITER_LOOPTRI) && extractor->iter_looptri_bm) {
+        BLI_assert(extractor->iter_looptri_mesh);
+        result.append(data);
+        continue;
+      }
+      if ((iter_type & MR_ITER_POLY) && extractor->iter_poly_bm) {
+        BLI_assert(extractor->iter_poly_mesh);
+        result.append(data);
+        continue;
+      }
+      if ((iter_type & MR_ITER_LEDGE) && extractor->iter_ledge_bm) {
+        BLI_assert(extractor->iter_ledge_mesh);
+        result.append(data);
+        continue;
+      }
+      if ((iter_type & MR_ITER_LVERT) && extractor->iter_lvert_bm) {
+        BLI_assert(extractor->iter_lvert_mesh);
+        result.append(data);
+        continue;
+      }
     }
-    if ((iter_type & MR_ITER_LEDGE) && extractor->iter_ledge_bm) {
-      BLI_assert(extractor->iter_ledge_mesh);
-      dst.append(data);
-      continue;
+  }
+
+  void filter_threaded_extractors_into(ExtractorRunDatas &result)
+  {
+    for (const ExtractorRunData &data : *this) {
+      const MeshExtract *extractor = data.extractor;
+      if (extractor->use_threading) {
+        result.append(extractor);
+      }
     }
-    if ((iter_type & MR_ITER_LVERT) && extractor->iter_lvert_bm) {
-      BLI_assert(extractor->iter_lvert_mesh);
-      dst.append(data);
-      continue;
+  }
+
+  eMRIterType iter_types()
+  {
+    eMRIterType iter_type = static_cast<eMRIterType>(0);
+
+    for (const ExtractorRunData &data : *this) {
+      const MeshExtract *extractor = data.extractor;
+      iter_type |= mesh_extract_iter_type(extractor);
     }
+    return iter_type;
   }
-}
 
-static void mesh_extract_run_data_array_filter_threading(
-    const MeshExtractRunDataArray &src, MeshExtractRunDataArray &dst_multi_threaded)
-{
-  for (const MeshExtractRunData &data : src) {
-    const MeshExtract *extractor = data.extractor;
-    if (extractor->use_threading) {
-      mesh_extract_run_data_array_add(dst_multi_threaded, extractor);
+  eMRDataType data_types()
+  {
+    eMRDataType data_type = static_cast<eMRDataType>(0);
+    for (const ExtractorRunData &data : *this) {
+      const MeshExtract *extractor = data.extractor;
+      data_type |= extractor->data_type;
     }
+    return data_type;
   }
-}
+};
 
 /** \} */
 
@@ -118,34 +135,13 @@ static void mesh_extract_run_data_array_filter_threading(
 /** \name Extract
  * \{ */
 
-static void extracts_flags_get(const MeshExtractRunDataArray &extractors,
-                               eMRIterType *r_iter_type,
-                               eMRDataType *r_data_flag)
-{
-  eMRIterType iter_type = static_cast<eMRIterType>(0);
-  eMRDataType data_flag = static_cast<eMRDataType>(0);
-
-  for (const MeshExtractRunData &data : extractors) {
-    const MeshExtract *extractor = data.extractor;
-    iter_type |= mesh_extract_iter_type(extractor);
-    data_flag |= extractor->data_flag;
-  }
-
-  if (r_iter_type) {
-    *r_iter_type = iter_type;
-  }
-  if (r_data_flag) {
-    *r_data_flag = data_flag;
-  }
-}
-
 BLI_INLINE void extract_init(const MeshRenderData *mr,
                              struct MeshBatchCache *cache,
-                             MeshExtractRunDataArray &extractors,
+                             ExtractorRunDatas &extractors,
                              MeshBufferCache *mbc)
 {
   /* Multi thread. */
-  for (MeshExtractRunData &run_data : extractors) {
+  for (ExtractorRunData &run_data : extractors) {
     const MeshExtract *extractor = run_data.extractor;
     run_data.buffer = mesh_extract_buffer_get(extractor, mbc);
     run_data.user_data = extractor->init(mr, cache, run_data.buffer);
@@ -154,14 +150,14 @@ BLI_INLINE void extract_init(const MeshRenderData *mr,
 
 BLI_INLINE void extract_iter_looptri_bm(const MeshRenderData *mr,
                                         const ExtractTriBMesh_Params *params,
-                                        const MeshExtractRunDataArray &all_extractors)
+                                        const ExtractorRunDatas &all_extractors)
 {
-  MeshExtractRunDataArray extractors;
-  mesh_extract_run_data_array_filter_iter_type(all_extractors, extractors, MR_ITER_LOOPTRI);
+  ExtractorRunDatas extractors;
+  all_extractors.filter_into(extractors, MR_ITER_LOOPTRI);
 
   EXTRACT_TRIS_LOOPTRI_FOREACH_BM_BEGIN(elt, elt_index, params)
   {
-    for (MeshExtractRunData &run_data : extractors) {
+    for (ExtractorRunData &run_data : extractors) {
       run_data.extractor->iter_looptri_bm(mr, elt, elt_index, run_data.user_data);
     }
   }
@@ -170,14 +166,14 @@ BLI_INLINE void extract_iter_looptri_bm(const MeshRenderData *mr,
 
 BLI_INLINE void extract_iter_looptri_mesh(const MeshRenderData *mr,
                                           const ExtractTriMesh_Params *params,
-                                          const MeshExtractRunDataArray &all_extractors)
+                                          const ExtractorRunDatas &all_extractors)
 {
-  MeshExtractRunDataArray extractors;
-  mesh_extract_run_data_array_filter_iter_type(all_extractors, extractors, MR_ITER_LOOPTRI);
+  ExtractorRunDatas extractors;
+  all_extractors.filter_into(extractors, MR_ITER_LOOPTRI);
 
   EXTRACT_TRIS_LOOPTRI_FOREACH_MESH_BEGIN(mlt, mlt_index, params)
   {
-    for (MeshExtractRunData &run_data : extractors) {
+    for (ExtractorRunData &run_data : extractors) {
       run_data.extractor->iter_looptri_mesh(mr, mlt, mlt_index, run_data.user_data);
     }
   }
@@ -186,14 +182,14 @@ BLI_INLINE void extract_iter_looptri_mesh(const MeshRenderData *mr,
 
 BLI_INLINE void extract_iter_poly_bm(const MeshRenderData *mr,
                                      const ExtractPolyBMesh_Params *params,
-                                     const MeshExtractRunDataArray &all_extractors)
+                                     const ExtractorRunDatas &all_extractors)
 {
-  MeshExtractRunDataArray extractors;
-  mesh_extract_run_data_array_filter_iter_type(all_extractors, extractors, MR_ITER_POLY);
+  ExtractorRunDatas extractors;
+  all_extractors.filter_into(extractors, MR_ITER_POLY);
 
   EXTRACT_POLY_FOREACH_BM_BEGIN(f, f_index, params, mr)
   {
-    for (MeshExtractRunData &run_data : extractors) {
+    for (ExtractorRunData &run_data : extractors) {
       run_data.extractor->iter_poly_bm(mr, f, f_index, run_data.user_data);
     }
   }
@@ -202,14 +198,14 @@ BLI_INLINE void extract_iter_poly_bm(const MeshRenderData *mr,
 
 BLI_INLINE void extract_iter_poly_mesh(const MeshRenderData *mr,
                                        const ExtractPolyMesh_Params *params,
-                                       const MeshExtractRunDataArray &all_extractors)
+                                       const ExtractorRunDatas &all_extractors)
 {
-  MeshExtractRunDataArray extractors;
-  mesh_extract_run_data_array_filter_iter_type(all_extractors, extractors, MR_ITER_POLY);
+  ExtractorRunDatas extractors;
+  all_extractors.filter_into(extractors, MR_ITER_POLY);
 
   EXTRACT_POLY_FOREACH_MESH_BEGIN(mp, mp_index, params, mr)
   {
-    for (MeshExtractRunData &run_data : extractors) {
+    for (ExtractorRunData &run_data : extractors) {
       run_data.extractor->iter_poly_mesh(mr, mp, mp_index, run_data.user_data);
     }
   }
@@ -218,14 +214,14 @@ BLI_INLINE void extract_iter_poly_mesh(const MeshRenderData *mr,
 
 BLI_INLINE void extract_iter_ledge_bm(const MeshRenderData *mr,
                                       const ExtractLEdgeBMesh_Params *params,
-                                      const MeshExtractRunDataArray &all_extractors)
+                                      const ExtractorRunDatas &all_extractors)
 {
-  MeshExtractRunDataArray extractors;
-  mesh_extract_run_data_array_filter_iter_type(all_extractors, extractors, MR_ITER_LEDGE);
+  ExtractorRunDatas extractors;
+  all_extractors.filter_into(extractors, MR_ITER_LEDGE);
 
   EXTRACT_LEDGE_FOREACH_BM_BEGIN(eed, ledge_index, params)
   {
-    for (MeshExtractRunData &run_data : extractors) {
+    for (ExtractorRunData &run_data : extractors) {
       run_data

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list