[Bf-blender-cvs] [176d7bcc2eb] master: Cleanup: Move remaining mesh draw code to C++

Hans Goudey noreply at git.blender.org
Sun Jun 5 12:05:06 CEST 2022


Commit: 176d7bcc2eb47b9820861037f90a7fb26de8c9a0
Author: Hans Goudey
Date:   Sun Jun 5 12:04:42 2022 +0200
Branches: master
https://developer.blender.org/rB176d7bcc2eb47b9820861037f90a7fb26de8c9a0

Cleanup: Move remaining mesh draw code to C++

After this commit, all mesh data extraction and drawing code is in C++,
including headers, making it possible to use improved types for future
performance improvements and simplifications.

The only non-trivial changes are in `draw_cache_impl_mesh.cc`,
where use of certain features and macros in C necessitated larger
changes.

Differential Revision: https://developer.blender.org/D15088

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/intern/draw_attributes.cc
M	source/blender/draw/intern/draw_attributes.h
R092	source/blender/draw/intern/draw_cache_extract.h	source/blender/draw/intern/draw_cache_extract.hh
M	source/blender/draw/intern/draw_cache_extract_mesh.cc
R083	source/blender/draw/intern/draw_cache_extract_mesh_render_data.c	source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc
M	source/blender/draw/intern/draw_cache_impl_curves.cc
R078	source/blender/draw/intern/draw_cache_impl_mesh.c	source/blender/draw/intern/draw_cache_impl_mesh.cc
M	source/blender/draw/intern/draw_cache_impl_subdivision.cc
R098	source/blender/draw/intern/mesh_extractors/extract_mesh.c	source/blender/draw/intern/mesh_extractors/extract_mesh.cc
R076	source/blender/draw/intern/mesh_extractors/extract_mesh.h	source/blender/draw/intern/mesh_extractors/extract_mesh.hh
M	source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_fdots.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_paint_mask.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_points.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_tris.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_attributes.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edge_fac.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edit_data.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_data.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_angle.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_area.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_fdots_edituv_data.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_fdots_nor.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_fdots_pos.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_fdots_uv.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_lnor.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_orco.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_sculpt_data.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_select_idx.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_skin_roots.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_tan.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_uv.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vcol.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_weights.cc
M	source/blender/gpu/intern/gpu_node_graph.c
M	source/blender/makesdna/DNA_mesh_types.h

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index e6c8558bb37..9cb3743dd02 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -39,8 +39,8 @@ set(INC
 set(SRC
   intern/draw_cache.c
   intern/draw_cache_extract_mesh.cc
-  intern/draw_cache_extract_mesh_render_data.c
-  intern/mesh_extractors/extract_mesh.c
+  intern/draw_cache_extract_mesh_render_data.cc
+  intern/mesh_extractors/extract_mesh.cc
   intern/mesh_extractors/extract_mesh_ibo_edituv.cc
   intern/mesh_extractors/extract_mesh_ibo_fdots.cc
   intern/mesh_extractors/extract_mesh_ibo_lines.cc
@@ -75,7 +75,7 @@ set(SRC
   intern/draw_cache_impl_displist.c
   intern/draw_cache_impl_gpencil.c
   intern/draw_cache_impl_lattice.c
-  intern/draw_cache_impl_mesh.c
+  intern/draw_cache_impl_mesh.cc
   intern/draw_cache_impl_metaball.c
   intern/draw_cache_impl_particles.c
   intern/draw_cache_impl_pointcloud.c
@@ -201,7 +201,7 @@ set(SRC
   intern/DRW_render.h
   intern/draw_attributes.h
   intern/draw_cache.h
-  intern/draw_cache_extract.h
+  intern/draw_cache_extract.hh
   intern/draw_cache_impl.h
   intern/draw_cache_inline.h
   intern/draw_color_management.h
@@ -221,7 +221,7 @@ set(SRC
   intern/draw_texture_pool.h
   intern/draw_view.h
   intern/draw_view_data.h
-  intern/mesh_extractors/extract_mesh.h
+  intern/mesh_extractors/extract_mesh.hh
   intern/smaa_textures.h
   engines/basic/basic_engine.h
   engines/basic/basic_private.h
diff --git a/source/blender/draw/intern/draw_attributes.cc b/source/blender/draw/intern/draw_attributes.cc
index f84a6c86fac..8fb4210901f 100644
--- a/source/blender/draw/intern/draw_attributes.cc
+++ b/source/blender/draw/intern/draw_attributes.cc
@@ -84,9 +84,9 @@ DRW_AttributeRequest *drw_attributes_add_request(DRW_Attributes *attrs,
 bool drw_custom_data_match_attribute(const CustomData *custom_data,
                                      const char *name,
                                      int *r_layer_index,
-                                     int *r_type)
+                                     eCustomDataType *r_type)
 {
-  const int possible_attribute_types[7] = {
+  const eCustomDataType possible_attribute_types[7] = {
       CD_PROP_BOOL,
       CD_PROP_INT8,
       CD_PROP_INT32,
@@ -97,7 +97,7 @@ bool drw_custom_data_match_attribute(const CustomData *custom_data,
   };
 
   for (int i = 0; i < ARRAY_SIZE(possible_attribute_types); i++) {
-    const int attr_type = possible_attribute_types[i];
+    const eCustomDataType attr_type = possible_attribute_types[i];
     int layer_index = CustomData_get_named_layer(custom_data, attr_type, name);
     if (layer_index == -1) {
       continue;
diff --git a/source/blender/draw/intern/draw_attributes.h b/source/blender/draw/intern/draw_attributes.h
index c375670cd70..4f82f3b94e9 100644
--- a/source/blender/draw/intern/draw_attributes.h
+++ b/source/blender/draw/intern/draw_attributes.h
@@ -53,7 +53,7 @@ DRW_AttributeRequest *drw_attributes_add_request(DRW_Attributes *attrs,
 bool drw_custom_data_match_attribute(const CustomData *custom_data,
                                      const char *name,
                                      int *r_layer_index,
-                                     int *r_type);
+                                     eCustomDataType *r_type);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/draw/intern/draw_cache_extract.h b/source/blender/draw/intern/draw_cache_extract.hh
similarity index 92%
rename from source/blender/draw/intern/draw_cache_extract.h
rename to source/blender/draw/intern/draw_cache_extract.hh
index ce3ad9923da..b16a35347c0 100644
--- a/source/blender/draw/intern/draw_cache_extract.h
+++ b/source/blender/draw/intern/draw_cache_extract.hh
@@ -7,11 +7,13 @@
 
 #pragma once
 
-struct DRWSubdivCache;
-struct MeshRenderData;
-struct TaskGraph;
+#include <algorithm>
+
+#include "BLI_utildefines.h"
 
 #include "DNA_customdata_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_view3d_enums.h"
 
 #include "BKE_attribute.h"
 #include "BKE_object.h"
@@ -22,8 +24,12 @@ struct TaskGraph;
 
 #include "draw_attributes.h"
 
+struct DRWSubdivCache;
+struct MeshRenderData;
+struct TaskGraph;
+
 /* Vertex Group Selection and display options */
-typedef struct DRW_MeshWeightState {
+struct DRW_MeshWeightState {
   int defgroup_active;
   int defgroup_len;
 
@@ -37,7 +43,7 @@ typedef struct DRW_MeshWeightState {
   /* Set of all locked and unlocked deform bones for Lock Relative mode. */
   bool *defgroup_locked;   /* [defgroup_len] */
   bool *defgroup_unlocked; /* [defgroup_len] */
-} DRW_MeshWeightState;
+};
 
 /* DRW_MeshWeightState.flags */
 enum {
@@ -46,7 +52,7 @@ enum {
   DRW_MESH_WEIGHT_STATE_LOCK_RELATIVE = (1 << 2),
 };
 
-typedef struct DRW_MeshCDMask {
+struct DRW_MeshCDMask {
   uint32_t uv : 8;
   uint32_t tan : 8;
   uint32_t vcol : 8;
@@ -56,20 +62,20 @@ typedef struct DRW_MeshCDMask {
   /** Edit uv layer is from the base edit mesh as
    *  modifiers could remove it. (see T68857) */
   uint32_t edit_uv : 1;
-} DRW_MeshCDMask;
+};
 /* Keep `DRW_MeshCDMask` struct within an `uint32_t`.
  * bit-wise and atomic operations are used to compare and update the struct.
  * See `mesh_cd_layers_type_*` functions. */
 BLI_STATIC_ASSERT(sizeof(DRW_MeshCDMask) <= sizeof(uint32_t), "DRW_MeshCDMask exceeds 32 bits")
-typedef enum eMRIterType {
+enum eMRIterType {
   MR_ITER_LOOPTRI = 1 << 0,
   MR_ITER_POLY = 1 << 1,
   MR_ITER_LEDGE = 1 << 2,
   MR_ITER_LVERT = 1 << 3,
-} eMRIterType;
+};
 ENUM_OPERATORS(eMRIterType, MR_ITER_LVERT)
 
-typedef enum eMRDataType {
+enum eMRDataType {
   MR_DATA_NONE = 0,
   MR_DATA_POLY_NOR = 1 << 1,
   MR_DATA_LOOP_NOR = 1 << 2,
@@ -78,25 +84,37 @@ typedef enum eMRDataType {
   /** Force loop normals calculation. */
   MR_DATA_TAN_LOOP_NOR = 1 << 5,
   MR_DATA_POLYS_SORTED = 1 << 6,
-} eMRDataType;
+};
 ENUM_OPERATORS(eMRDataType, MR_DATA_POLYS_SORTED)
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 BLI_INLINE int mesh_render_mat_len_get(const Object *object, const Mesh *me)
 {
   if (me->edit_mesh != NULL) {
     const Mesh *editmesh_eval_final = BKE_object_get_editmesh_eval_final(object);
     if (editmesh_eval_final != NULL) {
-      return MAX2(1, editmesh_eval_final->totcol);
+      return std::max<int>(1, editmesh_eval_final->totcol);
     }
   }
-  return MAX2(1, me->totcol);
+  return std::max<int>(1, me->totcol);
 }
 
-typedef struct MeshBufferList {
+struct MeshBufferList {
+
+  // enum class BufferItem {
+  //   PosNor,
+  //   LNor,
+  //   EdgeFac,
+  //   Weights,
+  //   UV,
+  //   Tan,
+  //   VCol,
+  //   SculptData,
+  //   Orco,
+  //   EditData,
+  //   EditUVData,
+  //   EditUVStretchArea,
+
+  // }
   /* Every VBO below contains at least enough
    * data for every loops in the mesh (except fdots and skin roots).
    * For some VBOs, it extends to (in this exact order) :
@@ -148,9 +166,9 @@ typedef struct MeshBufferList {
     GPUIndexBuf *edituv_points;
     GPUIndexBuf *edituv_fdots;
   } ibo;
-} MeshBufferList;
+};
 
-typedef struct MeshBatchList {
+struct MeshBatchList {
   /* Surfaces / Render */
   GPUBatch *surface;
   GPUBatch *surface_weights;
@@ -184,7 +202,7 @@ typedef struct MeshBatchList {
   GPUBatch *wire_loops;     /* Loops around faces. no edges between selected faces */
   GPUBatch *wire_loops_uvs; /* Same as wire_loops but only has uvs. */
   GPUBatch *sculpt_overlays;
-} MeshBatchList;
+};
 
 #define MBC_BATCH_LEN (sizeof(MeshBatchList) / sizeof(void *))
 #define MBC_VBO_LEN (sizeof(((MeshBufferList){0}).vbo) / sizeof(void *))
@@ -192,7 +210,7 @@ typedef struct MeshBatchList {
 
 #define MBC_BATCH_INDEX(batch) (offsetof(MeshBatchList, batch) / sizeof(void *))
 
-typedef enum DRWBatchFlag {
+enum DRWBatchFlag {
   MBC_SURFACE = (1u << MBC_BATCH_INDEX(surface)),
   MBC_SURFACE_WEIGHTS = (1u << MBC_BATCH_INDEX(surface_weights)),
   MBC_EDIT_TRIANGLES = (1u << MBC_BATCH_INDEX(edit_triangles)),
@@ -221,23 +239,25 @@ typedef enum DRWBatchFlag {
   MBC_WIRE_LOOPS = (1u << MBC_BATCH_INDEX(wire_loops)),
   MBC_WIRE_LOOPS_UVS = (1u << MBC_BATCH_INDEX(wire_loops_uvs)),
   MBC_SCULPT_OVERLAYS = (1u << MBC_BATCH_INDEX(sculpt_overlays)),
-} DRWBatchFlag;
+  MBC_SURFACE_PER_MAT = (1u << MBC_BATCH_LEN),
+};
+ENUM_OPERATORS(DRWBatchFlag, MBC_SURFACE_PER_MAT);
 
 BLI_STATIC_ASSERT(MBC_BATCH_LEN < 32, "Number of batches exceeded the limit of bit fields");
 
-typedef struct MeshExtractLooseGeom {
+struct MeshExtractLooseGeom {
   int edge_len;
   int vert_len;
   int *verts;
   int *edges;
-} MeshExtractLooseGeom;
+};
 
 /**
  * Data that are kept around between extractions to reduce rebuilding time.
  *
  * - Loose geometry.
  */
-typedef struct MeshBufferCache {
+struct MeshBufferCache {
   MeshBufferList buff;
 
   MeshExtractLooseGeom loose_geom;
@@ -247,7 +267,7 @@ typedef struct MeshBufferCache {
     int *mat_tri_len;
     int visible_tri_len;
   } poly_sorted;
-} MeshBufferCache;
+};
 
 #define FOREACH_MESH_BUFFER_CACHE(batch_cache, mbc) \
   for (MeshBufferCache *mbc = &batch_cache->final; \
@@ -256,7 +276,7 @@ typedef struct MeshBufferCache {
                  &batch_cache->cage : \
                  ((mbc == &batch_cache->cage) ? &batch_cache->uv_cage : NULL))
 
-typedef struct MeshBatchCache {
+struct MeshBatchCache {
   MeshBufferCache final, cage, uv_cage;
 
   MeshBatchList batch;
@@ -302,12 +322,14 @@ typedef struct MeshBatchCache {
 
   eV3DShadingColorType color_type;
   bool pbvh_is_drawing;
-} MeshBatchCache;
+};
 
 #define MBC_EDITUV \
   (MBC_EDITUV_FACES_STRETCH_AREA | MBC_EDITUV_FACES_STRETCH_ANGLE | MBC_EDITUV_FACES | \
    MBC_EDITUV_EDGES | MBC_EDITUV_VERTS | MBC_EDITUV_FACEDOTS | MBC_WIRE_LOOPS_UVS)
 
+namespace blender::draw {
+
 void mesh_buffer_cache_create_requested(struct TaskGraph *task_graph,
                                         MeshBatchCache *cache,
                                         MeshBufferCache *mbc,
@@ -328,6 +350,4 @@ void mesh_buffer_cache_create_requested_subdiv(MeshBatchCache *cache,
                                                struct DRWSubdivCache *subdiv_cache,
                                                struct MeshRenderData *mr);
 
-#ifdef __cplusplus
-}
-#endif
+}  // names

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list