[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