[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