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. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
