[Bf-blender-cvs] [930ad9257d0] master: Cleanup: Split draw_cache_extract_mesh into multiple files.

Jeroen Bakker noreply at git.blender.org
Tue Jun 1 09:23:47 CEST 2021


Commit: 930ad9257d00a1891a948ff71756ffe8acb61686
Author: Jeroen Bakker
Date:   Tue Jun 1 09:23:37 2021 +0200
Branches: master
https://developer.blender.org/rB930ad9257d00a1891a948ff71756ffe8acb61686

Cleanup: Split draw_cache_extract_mesh into multiple files.

draw_cache_extract_mesh for task scheduling. Will be refactored to draw_cache_extract_mesh_scheduling later on after migrating to CPP.

draw_cache_extract_mesh_render_data extraction of mesh render data from edit mesh/mesh into a more generic structure.

draw_cache_extract_mesh_extractors containing all the extractors. This will be split up further into a single file per extractor.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/intern/draw_cache_extract.h
M	source/blender/draw/intern/draw_cache_extract_mesh.c
A	source/blender/draw/intern/draw_cache_extract_mesh_extractors.c
A	source/blender/draw/intern/draw_cache_extract_mesh_private.h
A	source/blender/draw/intern/draw_cache_extract_mesh_render_data.c
M	source/blender/editors/include/ED_uvedit.h

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 0541aa982f3..adbe7fdf274 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -51,6 +51,8 @@ set(INC
 
 set(SRC
   intern/draw_cache.c
+  intern/draw_cache_extract_mesh_extractors.c
+  intern/draw_cache_extract_mesh_render_data.c
   intern/draw_cache_extract_mesh.c
   intern/draw_cache_impl_curve.cc
   intern/draw_cache_impl_displist.c
diff --git a/source/blender/draw/intern/draw_cache_extract.h b/source/blender/draw/intern/draw_cache_extract.h
index e6b7fb9ddf5..abba3aeeb70 100644
--- a/source/blender/draw/intern/draw_cache_extract.h
+++ b/source/blender/draw/intern/draw_cache_extract.h
@@ -24,6 +24,10 @@
 
 struct TaskGraph;
 
+#include "GPU_batch.h"
+#include "GPU_index_buffer.h"
+#include "GPU_vertex_buffer.h"
+
 /* Vertex Group Selection and display options */
 typedef struct DRW_MeshWeightState {
   int defgroup_active;
@@ -80,12 +84,6 @@ typedef enum eMRDataType {
   MR_DATA_TAN_LOOP_NOR = 1 << 4,
 } eMRDataType;
 
-typedef enum eMRExtractType {
-  MR_EXTRACT_BMESH,
-  MR_EXTRACT_MAPPED,
-  MR_EXTRACT_MESH,
-} eMRExtractType;
-
 BLI_INLINE int mesh_render_mat_len_get(Mesh *me)
 {
   /* In edit mode, the displayed mesh is stored in the edit-mesh. */
diff --git a/source/blender/draw/intern/draw_cache_extract_mesh.c b/source/blender/draw/intern/draw_cache_extract_mesh.c
index a2ec3e4e94e..0d2a4704b1b 100644
--- a/source/blender/draw/intern/draw_cache_extract_mesh.c
+++ b/source/blender/draw/intern/draw_cache_extract_mesh.c
@@ -22,5536 +22,112 @@
  *
  * \brief Extraction of Mesh data into VBO to feed to GPU.
  */
+#include "MEM_guardedalloc.h"
 
-#include "MEM_guardedalloc.h"
-
-#include "BLI_alloca.h"
-#include "BLI_bitmap.h"
-#include "BLI_buffer.h"
-#include "BLI_edgehash.h"
-#include "BLI_jitter_2d.h"
-#include "BLI_math_bits.h"
-#include "BLI_math_vector.h"
-#include "BLI_string.h"
-#include "BLI_task.h"
-#include "BLI_utildefines.h"
-
-#include "DNA_mesh_types.h"
-#include "DNA_meshdata_types.h"
-#include "DNA_object_types.h"
-#include "DNA_scene_types.h"
-
-#include "BKE_bvhutils.h"
-#include "BKE_customdata.h"
-#include "BKE_deform.h"
-#include "BKE_editmesh.h"
-#include "BKE_editmesh_bvh.h"
-#include "BKE_editmesh_cache.h"
-#include "BKE_editmesh_tangent.h"
-#include "BKE_mesh.h"
-#include "BKE_mesh_runtime.h"
-#include "BKE_mesh_tangent.h"
-#include "BKE_modifier.h"
-#include "BKE_object_deform.h"
-#include "BKE_paint.h"
-
-#include "atomic_ops.h"
-
-#include "bmesh.h"
-
-#include "GPU_batch.h"
-#include "GPU_capabilities.h"
-
-#include "DRW_render.h"
-
-#include "ED_mesh.h"
-#include "ED_uvedit.h"
-
-#include "draw_cache_impl.h"
-#include "draw_cache_inline.h"
-
-#include "draw_cache_extract.h"
-
-// #define DEBUG_TIME
-
-#ifdef DEBUG_TIME
-#  include "PIL_time_utildefines.h"
-#endif
-
-#define CHUNK_SIZE 8192
-
-/*
- * Max number of extractions types.
- */
-#define M_EXTRACT_LEN 38
-
-/* ---------------------------------------------------------------------- */
-/** \name Mesh/BMesh Interface (indirect, partially cached access to complex data).
- * \{ */
-
-typedef struct MeshRenderData {
-  eMRExtractType extract_type;
-
-  int poly_len, edge_len, vert_len, loop_len;
-  int edge_loose_len;
-  int vert_loose_len;
-  int loop_loose_len;
-  int tri_len;
-  int mat_len;
-
-  bool use_hide;
-  bool use_subsurf_fdots;
-  bool use_final_mesh;
-
-  /** Use for #MeshStatVis calculation which use world-space coords. */
-  float obmat[4][4];
-
-  const ToolSettings *toolsettings;
-  /** Edit Mesh */
-  BMEditMesh *edit_bmesh;
-  BMesh *bm;
-  EditMeshData *edit_data;
-
-  /* For deformed edit-mesh data. */
-  /* Use for #ME_WRAPPER_TYPE_BMESH. */
-  const float (*bm_vert_coords)[3];
-  const float (*bm_vert_normals)[3];
-  const float (*bm_poly_normals)[3];
-  const float (*bm_poly_centers)[3];
-
-  int *v_origindex, *e_origindex, *p_origindex;
-  int crease_ofs;
-  int bweight_ofs;
-  int freestyle_edge_ofs;
-  int freestyle_face_ofs;
-  /** Mesh */
-  Mesh *me;
-  const MVert *mvert;
-  const MEdge *medge;
-  const MLoop *mloop;
-  const MPoly *mpoly;
-  BMVert *eve_act;
-  BMEdge *eed_act;
-  BMFace *efa_act;
-  BMFace *efa_act_uv;
-  /* Data created on-demand (usually not for #BMesh based data). */
-  MLoopTri *mlooptri;
-  float (*loop_normals)[3];
-  float (*poly_normals)[3];
-  int *lverts, *ledges;
-} MeshRenderData;
-
-static void mesh_render_data_loose_geom_load(MeshRenderData *mr, MeshBufferExtractionCache *cache)
-{
-  mr->ledges = cache->ledges;
-  mr->lverts = cache->lverts;
-  mr->vert_loose_len = cache->vert_loose_len;
-  mr->edge_loose_len = cache->edge_loose_len;
-
-  mr->loop_loose_len = mr->vert_loose_len + (mr->edge_loose_len * 2);
-}
-
-static void mesh_render_data_loose_geom_ensure(const MeshRenderData *mr,
-                                               MeshBufferExtractionCache *cache)
-{
-  /* Early exit: Are loose geometry already available. Only checking for loose verts as loose edges
-   * and verts are calculated at the same time.*/
-  if (cache->lverts) {
-    return;
-  }
-
-  cache->vert_loose_len = 0;
-  cache->edge_loose_len = 0;
-
-  if (mr->extract_type != MR_EXTRACT_BMESH) {
-    /* Mesh */
-
-    BLI_bitmap *lvert_map = BLI_BITMAP_NEW(mr->vert_len, __func__);
-
-    cache->ledges = MEM_mallocN(mr->edge_len * sizeof(*cache->ledges), __func__);
-    const MEdge *med = mr->medge;
-    for (int med_index = 0; med_index < mr->edge_len; med_index++, med++) {
-      if (med->flag & ME_LOOSEEDGE) {
-        cache->ledges[cache->edge_loose_len++] = med_index;
-      }
-      /* Tag verts as not loose. */
-      BLI_BITMAP_ENABLE(lvert_map, med->v1);
-      BLI_BITMAP_ENABLE(lvert_map, med->v2);
-    }
-    if (cache->edge_loose_len < mr->edge_len) {
-      cache->ledges = MEM_reallocN(cache->ledges, cache->edge_loose_len * sizeof(*cache->ledges));
-    }
-
-    cache->lverts = MEM_mallocN(mr->vert_len * sizeof(*mr->lverts), __func__);
-    for (int v = 0; v < mr->vert_len; v++) {
-      if (!BLI_BITMAP_TEST(lvert_map, v)) {
-        cache->lverts[cache->vert_loose_len++] = v;
-      }
-    }
-    if (cache->vert_loose_len < mr->vert_len) {
-      cache->lverts = MEM_reallocN(cache->lverts, cache->vert_loose_len * sizeof(*cache->lverts));
-    }
-
-    MEM_freeN(lvert_map);
-  }
-  else {
-    /* #BMesh */
-    BMesh *bm = mr->bm;
-    int elem_id;
-    BMIter iter;
-    BMVert *eve;
-    BMEdge *ede;
-
-    cache->lverts = MEM_mallocN(mr->vert_len * sizeof(*cache->lverts), __func__);
-    BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, elem_id) {
-      if (eve->e == NULL) {
-        cache->lverts[cache->vert_loose_len++] = elem_id;
-      }
-    }
-    if (cache->vert_loose_len < mr->vert_len) {
-      cache->lverts = MEM_reallocN(cache->lverts, cache->vert_loose_len * sizeof(*cache->lverts));
-    }
-
-    cache->ledges = MEM_mallocN(mr->edge_len * sizeof(*cache->ledges), __func__);
-    BM_ITER_MESH_INDEX (ede, &iter, bm, BM_EDGES_OF_MESH, elem_id) {
-      if (ede->l == NULL) {
-        cache->ledges[cache->edge_loose_len++] = elem_id;
-      }
-    }
-    if (cache->edge_loose_len < mr->edge_len) {
-      cache->ledges = MEM_reallocN(cache->ledges, cache->edge_loose_len * sizeof(*cache->ledges));
-    }
-  }
-}
-
-/**
- * Part of the creation of the #MeshRenderData that happens in a thread.
- */
-static void mesh_render_data_update_looptris(MeshRenderData *mr,
-                                             const eMRIterType iter_type,
-                                             const eMRDataType data_flag)
-{
-  Mesh *me = mr->me;
-  if (mr->extract_type != MR_EXTRACT_BMESH) {
-    /* Mesh */
-    if ((iter_type & MR_ITER_LOOPTRI) || (data_flag & MR_DATA_LOOPTRI)) {
-      mr->mlooptri = MEM_mallocN(sizeof(*mr->mlooptri) * mr->tri_len, "MR_DATATYPE_LOOPTRI");
-      BKE_mesh_recalc_looptri(
-          me->mloop, me->mpoly, me->mvert, me->totloop, me->totpoly, mr->mlooptri);
-    }
-  }
-  else {
-    /* #BMesh */
-    if ((iter_type & MR_ITER_LOOPTRI) || (data_flag & MR_DATA_LOOPTRI)) {
-      /* Edit mode ensures this is valid, no need to calculate. */
-      BLI_assert((mr->bm->totloop == 0) || (mr->edit_bmesh->looptris != NULL));
-    }
-  }
-}
-
-static void mesh_render_data_update_normals(MeshRenderData *mr,
-                                            const eMRIterType UNUSED(iter_type),
-                                            const eMRDataType data_flag)
-{
-  Mesh *me = mr->me;
-  const bool is_auto_smooth = (me->flag & ME_AUTOSMOOTH) != 0;
-  const float split_angle = is_auto_smooth ? me->smoothresh : (float)M_PI;
-
-  if (mr->extract_type != MR_EXTRACT_BMESH) {
-    /* Mesh */
-    if (data_flag & (MR_DATA_POLY_NOR | MR_DATA_LOOP_NOR | MR_DATA_TAN_LOOP_NOR)) {
-      mr->poly_normals = MEM_mallocN(sizeof(*mr->poly_normals) * mr->poly_len, __func__);
-      BKE_mesh_calc_normals_poly((MVert *)mr->mvert,
-                                 NULL,
-                                 mr->vert_len,
-                                 mr->mloop,
-                                 mr->mpoly,
-                                 mr->loop_len,
-                                 mr->poly_len,
-                                 mr->poly_normals,
-                                 true);
-    }
-    if (((data_flag & MR_DATA_LOOP_NOR) && is_auto_smooth) || (data_flag & MR_DATA_TAN_LOOP_NOR)) {
-      mr->loop_normals = MEM_mallocN(sizeof(*mr->loop_normals) * mr->loop_len, __func__);
-      short(*clnors)[2] = CustomData_get_layer(&mr->me->ldata, CD_CUSTOMLOOPNORMAL);
-      BKE_mesh_normals_loop_split(mr->me->mvert,
-                                  mr->vert_len,
-                                  mr->me->medge,
-                                  mr->edge_len,
-                                  mr->me->mloop,
-                                  mr->loop_normals,
-                                  mr->loop_len,
-                                  mr->me->mpoly,
-                                  mr->poly_normals,
-                                  mr->poly_len,
-                                  is_auto_smooth,
-                                  split_angle,
-                        

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list