[Bf-blender-cvs] [e4531be647a] refactor-mesh-hide-generic: Merge branch 'temp-legacy-mesh-format-option' into refactor-mesh-hide-generic

Hans Goudey noreply at git.blender.org
Fri Jul 8 18:50:15 CEST 2022


Commit: e4531be647a3960c4b41ec4fe92129de22df4edf
Author: Hans Goudey
Date:   Fri Jul 8 10:44:32 2022 -0500
Branches: refactor-mesh-hide-generic
https://developer.blender.org/rBe4531be647a3960c4b41ec4fe92129de22df4edf

Merge branch 'temp-legacy-mesh-format-option' into refactor-mesh-hide-generic

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



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

diff --cc source/blender/blenkernel/BKE_customdata.h
index 95a32959d94,010fbb27172..f1a9b93174a
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@@ -243,9 -225,8 +243,10 @@@ void *CustomData_add_layer_anonymous(st
   * In edit-mode, use #EDBM_data_layer_free instead of this function.
   */
  bool CustomData_free_layer(struct CustomData *data, int type, int totelem, int index);
+ bool CustomData_free_layer_named(struct CustomData *data, const char *name, const int totelem);
  
 +bool CustomData_free_layer_named(struct CustomData *data, const char *name, const int totelem);
 +
  /**
   * Frees the layer index with the give type.
   * returns 1 on success, 0 if no layer with the given type is found.
diff --cc source/blender/blenkernel/intern/customdata.cc
index f87f06da800,277218033e9..777a086282e
--- a/source/blender/blenkernel/intern/customdata.cc
+++ b/source/blender/blenkernel/intern/customdata.cc
@@@ -2325,45 -2327,9 +2327,46 @@@ bool CustomData_merge(const CustomData 
    return changed;
  }
  
 +static bool layer_stored_in_bmesh(const StringRef name)
 +{
 +  return ELEM(name, ".hide_vert", ".hide_edge", ".hide_face");
 +}
 +
 +static CustomData shallow_copy_remove_non_bmesh_attributes(const CustomData &src)
 +{
 +  Vector<CustomDataLayer> dst_layers;
 +  for (const CustomDataLayer &layer : Span<CustomDataLayer>{src.layers, src.totlayer}) {
 +    if (layer_stored_in_bmesh(layer.name)) {
 +      dst_layers.append(layer);
 +    }
 +  }
 +
 +  CustomData dst = src;
 +  dst.layers = static_cast<CustomDataLayer *>(
 +      MEM_calloc_arrayN(dst_layers.size(), sizeof(CustomDataLayer), __func__));
 +  dst.totlayer = dst_layers.size();
 +  memcpy(dst.layers, dst_layers.data(), dst_layers.as_span().size_in_bytes());
 +
 +  CustomData_update_typemap(&dst);
 +
 +  return dst;
 +}
 +
 +bool CustomData_merge_mesh_to_bmesh(const CustomData *source,
 +                                    CustomData *dest,
 +                                    eCustomDataMask mask,
 +                                    eCDAllocType alloctype,
 +                                    int totelem)
 +{
 +  CustomData source_copy = shallow_copy_remove_non_bmesh_attributes(*source);
 +  const bool result = CustomData_merge(&source_copy, dest, mask, alloctype, totelem);
 +  MEM_SAFE_FREE(source_copy.layers);
 +  return result;
 +}
 +
  void CustomData_realloc(CustomData *data, int totelem)
  {
+   BLI_assert(totelem >= 0);
    for (int i = 0; i < data->totlayer; i++) {
      CustomDataLayer *layer = &data->layers[i];
      const LayerTypeInfo *typeInfo;
diff --cc source/blender/blenkernel/intern/pbvh.c
index a8969460593,00a4eee47e3..c17676a63f1
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@@ -1340,19 -1360,12 +1361,14 @@@ static void pbvh_update_draw_buffer_cb(
                                       update_flags);
          break;
        case PBVH_FACES: {
-         CustomDataLayer *layer = NULL;
-         eAttrDomain domain;
- 
-         BKE_pbvh_get_color_layer(pbvh->mesh, &layer, &domain);
- 
-         GPU_pbvh_mesh_buffers_update(node->draw_buffers,
+         GPU_pbvh_mesh_buffers_update(pbvh->vbo_id,
+                                      node->draw_buffers,
                                       pbvh->verts,
 +                                     pbvh->vert_normals,
 +                                     pbvh->vert_hide,
+                                      vdata,
+                                      ldata,
                                       CustomData_get_layer(pbvh->vdata, CD_PAINT_MASK),
-                                      layer ? layer->data : NULL,
-                                      layer ? layer->type : -1,
-                                      layer ? domain : ATTR_DOMAIN_AUTO,
                                       CustomData_get_layer(pbvh->pdata, CD_SCULPT_FACE_SETS),
                                       pbvh->face_sets_color_seed,
                                       pbvh->face_sets_color_default,
diff --cc source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc
index 00000000000,77cbb5efa12..be55db3dd31
mode 000000,100644..100644
--- a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc
+++ b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc
@@@ -1,0 -1,584 +1,591 @@@
+ /* SPDX-License-Identifier: GPL-2.0-or-later
+  * Copyright 2021 Blender Foundation. All rights reserved. */
+ 
+ /** \file
+  * \ingroup draw
+  *
+  * \brief Extraction of Mesh data into VBO to feed to GPU.
+  */
+ 
+ #include "MEM_guardedalloc.h"
+ 
+ #include "BLI_array.hh"
+ #include "BLI_bitmap.h"
+ #include "BLI_math.h"
+ #include "BLI_task.h"
+ 
+ #include "BKE_editmesh.h"
+ #include "BKE_editmesh_cache.h"
+ #include "BKE_mesh.h"
+ 
+ #include "GPU_batch.h"
+ 
+ #include "ED_mesh.h"
+ 
+ #include "mesh_extractors/extract_mesh.hh"
+ 
+ /* ---------------------------------------------------------------------- */
+ /** \name Update Loose Geometry
+  * \{ */
+ 
+ static void mesh_render_data_lverts_bm(const MeshRenderData *mr,
+                                        MeshBufferCache *cache,
+                                        BMesh *bm);
+ static void mesh_render_data_ledges_bm(const MeshRenderData *mr,
+                                        MeshBufferCache *cache,
+                                        BMesh *bm);
+ static void mesh_render_data_loose_geom_mesh(const MeshRenderData *mr, MeshBufferCache *cache);
+ static void mesh_render_data_loose_geom_build(const MeshRenderData *mr, MeshBufferCache *cache);
+ 
+ static void mesh_render_data_loose_geom_load(MeshRenderData *mr, MeshBufferCache *cache)
+ {
+   mr->ledges = cache->loose_geom.edges;
+   mr->lverts = cache->loose_geom.verts;
+   mr->vert_loose_len = cache->loose_geom.vert_len;
+   mr->edge_loose_len = cache->loose_geom.edge_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, MeshBufferCache *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->loose_geom.verts) {
+     return;
+   }
+   mesh_render_data_loose_geom_build(mr, cache);
+ }
+ 
+ static void mesh_render_data_loose_geom_build(const MeshRenderData *mr, MeshBufferCache *cache)
+ {
+   cache->loose_geom.vert_len = 0;
+   cache->loose_geom.edge_len = 0;
+ 
+   if (mr->extract_type != MR_EXTRACT_BMESH) {
+     /* Mesh */
+     mesh_render_data_loose_geom_mesh(mr, cache);
+   }
+   else {
+     /* #BMesh */
+     BMesh *bm = mr->bm;
+     mesh_render_data_lverts_bm(mr, cache, bm);
+     mesh_render_data_ledges_bm(mr, cache, bm);
+   }
+ }
+ 
+ static void mesh_render_data_loose_geom_mesh(const MeshRenderData *mr, MeshBufferCache *cache)
+ {
+   BLI_bitmap *lvert_map = BLI_BITMAP_NEW(mr->vert_len, __func__);
+ 
+   cache->loose_geom.edges = static_cast<int *>(
+       MEM_mallocN(mr->edge_len * sizeof(*cache->loose_geom.edges), __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->loose_geom.edges[cache->loose_geom.edge_len++] = med_index;
+     }
+     /* Tag verts as not loose. */
+     BLI_BITMAP_ENABLE(lvert_map, med->v1);
+     BLI_BITMAP_ENABLE(lvert_map, med->v2);
+   }
+   if (cache->loose_geom.edge_len < mr->edge_len) {
+     cache->loose_geom.edges = static_cast<int *>(MEM_reallocN(
+         cache->loose_geom.edges, cache->loose_geom.edge_len * sizeof(*cache->loose_geom.edges)));
+   }
+ 
+   cache->loose_geom.verts = static_cast<int *>(
+       MEM_mallocN(mr->vert_len * sizeof(*cache->loose_geom.verts), __func__));
+   for (int v = 0; v < mr->vert_len; v++) {
+     if (!BLI_BITMAP_TEST(lvert_map, v)) {
+       cache->loose_geom.verts[cache->loose_geom.vert_len++] = v;
+     }
+   }
+   if (cache->loose_geom.vert_len < mr->vert_len) {
+     cache->loose_geom.verts = static_cast<int *>(MEM_reallocN(
+         cache->loose_geom.verts, cache->loose_geom.vert_len * sizeof(*cache->loose_geom.verts)));
+   }
+ 
+   MEM_freeN(lvert_map);
+ }
+ 
+ static void mesh_render_data_lverts_bm(const MeshRenderData *mr, MeshBufferCache *cache, BMesh *bm)
+ {
+   int elem_id;
+   BMIter iter;
+   BMVert *eve;
+   cache->loose_geom.verts = static_cast<int *>(
+       MEM_mallocN(mr->vert_len * sizeof(*cache->loose_geom.verts), __func__));
+   BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, elem_id) {
+     if (eve->e == nullptr) {
+       cache->loose_geom.verts[cache->loose_geom.vert_len++] = elem_id;
+     }
+   }
+   if (cache->loose_geom.vert_len < mr->vert_len) {
+     cache->loose_geom.verts = static_cast<int *>(MEM_reallocN(
+         cache->loose_geom.verts, cache->loose_geom.vert_len * sizeof(*cache->loose_geom.verts)));
+   }
+ }
+ 
+ static void mesh_render_data_ledges_bm(const MeshRenderData *mr, MeshBufferCache *cache, BMesh *bm)
+ {
+   int elem_id;
+   BMIter iter;
+   BMEdge *ede;
+   cache->loose_geom.edges = static_cast<int *>(
+       MEM_mallocN(mr->edge_len * sizeof(*cache->loose_geom.edges), __func__));
+   BM_ITER_MESH_INDEX (ede, &iter, bm, BM_EDGES_OF_MESH, elem_id) {
+     if (ede->l == nullptr) {
+       cache->loose_geom.edges[cache->loose_geom.edge_len++] = elem_id;
+     }
+   }
+   if (cache->loose_geom.edge_len < mr->edge_len) {
+     cache->loose_geom.edges = static_cast<int *>(MEM_reallocN(
+         cache->loose_geom.edges, cache->loose_geom.edge_len * sizeof(*cache->loose_geom.edges)));
+   }
+ }
+ 
+ void mesh_render_data_update_loose_geom(MeshRenderData *mr,
+                                         MeshBufferCache *cache,
+                                         const eMRIterType iter_type,
+                                         const eMRDataType data_flag)
+ {
+   if ((iter_type & (MR_ITER_LEDGE | MR_ITER_LVERT)) || (data_flag & MR_DATA_LOOSE_GEOM)) {
+     mesh_render_data_loose_geom_ensure(mr, cache);
+     mesh_render_data_loose_geom_load(mr, cache);
+   }
+ }
+ 
+ /** \} */
+ 
+ /* -------------------------------------

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list