[Bf-blender-cvs] [4fdf34b40dc] refactor-mesh-hide-generic: Cleanup
Hans Goudey
noreply at git.blender.org
Sun May 15 21:23:19 CEST 2022
Commit: 4fdf34b40dc51ea13ebe36f2a03e51c2e36a2619
Author: Hans Goudey
Date: Sun May 15 21:23:15 2022 +0200
Branches: refactor-mesh-hide-generic
https://developer.blender.org/rB4fdf34b40dc51ea13ebe36f2a03e51c2e36a2619
Cleanup
===================================================================
M source/blender/blenkernel/intern/mesh_evaluate.cc
M source/blender/blenkernel/intern/pbvh.c
M source/blender/editors/mesh/editface.cc
===================================================================
diff --git a/source/blender/blenkernel/intern/mesh_evaluate.cc b/source/blender/blenkernel/intern/mesh_evaluate.cc
index 94cce18082c..fb4ba992c21 100644
--- a/source/blender/blenkernel/intern/mesh_evaluate.cc
+++ b/source/blender/blenkernel/intern/mesh_evaluate.cc
@@ -1012,8 +1012,13 @@ void BKE_mesh_flush_hidden_from_verts(Mesh *me)
MeshComponent component;
component.replace(me, GeometryOwnershipType::Editable);
- VArray<bool> vert_hide = component.attribute_get_for_read<bool>(
+ const VArray<bool> vert_hide = component.attribute_get_for_read<bool>(
".vert_hide", ATTR_DOMAIN_POINT, false);
+ if (vert_hide.is_single() && !vert_hide.get_internal_single()) {
+ component.attribute_try_delete(".edge_hide");
+ component.attribute_try_delete(".face_hide");
+ return;
+ }
OutputAttribute_Typed<bool> edge_hide = component.attribute_try_get_for_output_only<bool>(
".edge_hide", ATTR_DOMAIN_EDGE);
@@ -1033,8 +1038,13 @@ void BKE_mesh_flush_hidden_from_polys(Mesh *me)
MeshComponent component;
component.replace(me, GeometryOwnershipType::Editable);
- VArray<bool> face_hide = component.attribute_get_for_read<bool>(
+ const VArray<bool> face_hide = component.attribute_get_for_read<bool>(
".face_hide", ATTR_DOMAIN_FACE, false);
+ if (face_hide.is_single() && face_hide.get_internal_single()) {
+ component.attribute_try_delete(".vert_hide");
+ component.attribute_try_delete(".edge_hide");
+ return;
+ }
OutputAttribute_Typed<bool> edge_hide = component.attribute_try_get_for_output_only<bool>(
".edge_hide", ATTR_DOMAIN_EDGE);
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index 882fcab87cb..74809f9fc12 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -562,9 +562,7 @@ void BKE_pbvh_build_mesh(PBVH *pbvh,
pbvh->verts = verts;
BKE_mesh_vertex_normals_ensure(mesh);
pbvh->vert_normals = BKE_mesh_vertex_normals_for_write(mesh);
-
pbvh->vert_hide = (bool *)CustomData_get_layer_named(&mesh->vdata, CD_PROP_BOOL, ".vert_hide");
-
pbvh->vert_bitmap = BLI_BITMAP_NEW(totvert, "bvh->vert_bitmap");
pbvh->totvert = totvert;
pbvh->leaf_limit = LEAF_LIMIT;
diff --git a/source/blender/editors/mesh/editface.cc b/source/blender/editors/mesh/editface.cc
index 36086148bb4..41af8bcfef5 100644
--- a/source/blender/editors/mesh/editface.cc
+++ b/source/blender/editors/mesh/editface.cc
@@ -9,6 +9,8 @@
#include "BLI_bitmap.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_span.hh"
+#include "BLI_virtual_array.hh"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -19,6 +21,7 @@
#include "BKE_context.h"
#include "BKE_customdata.h"
+#include "BKE_geometry_set.hh"
#include "BKE_global.h"
#include "BKE_mesh.h"
#include "BKE_object.h"
@@ -34,6 +37,10 @@
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
+using blender::MutableSpan;
+using blender::VArray;
+using blender::bke::OutputAttribute_Typed;
+
/* own include */
void paintface_flush_flags(bContext *C, Object *ob, short flag, const bool flush_hidden)
@@ -49,7 +56,7 @@ void paintface_flush_flags(bContext *C, Object *ob, short flag, const bool flush
return;
}
- /* NOTE: call #BKE_mesh_flush_hidden_from_verts first when changing hidden flags. */
+ /* NOTE: call #BKE_mesh_flush_hidden_from_verts_ex first when changing hidden flags. */
/* we could call this directly in all areas that change selection,
* since this could become slow for realtime updates (circle-select for eg) */
@@ -120,21 +127,28 @@ void paintface_hide(bContext *C, Object *ob, const bool unselected)
return;
}
- bool *face_hide = (bool *)CustomData_get_layer_named(&me->pdata, CD_PROP_BOOL, ".face_hide");
+ MeshComponent component;
+ component.replace(me, GeometryOwnershipType::Editable);
+
+ OutputAttribute_Typed<bool> face_hide_attribute =
+ component.attribute_try_get_for_output_only<bool>(".face_hide", ATTR_DOMAIN_FACE);
+ MutableSpan<bool> face_hide = face_hide_attribute.as_span();
for (int i = 0; i < me->totpoly; i++) {
MPoly *mpoly = &me->mpoly[i];
- if (!(face_hide && face_hide[i])) {
+ if (!face_hide[i]) {
if (((mpoly->flag & ME_FACE_SEL) == 0) == unselected) {
face_hide[i] = true;
}
}
- if (face_hide && face_hide[i]) {
+ if (face_hide[i]) {
mpoly->flag &= ~ME_FACE_SEL;
}
}
+ face_hide_attribute.save();
+
BKE_mesh_flush_hidden_from_polys(me);
paintface_flush_flags(C, ob, SELECT, true);
@@ -147,16 +161,22 @@ void paintface_reveal(bContext *C, Object *ob, const bool select)
return;
}
- bool *face_hide = (bool *)CustomData_get_layer_named(&me->pdata, CD_PROP_BOOL, ".face_hide");
+ MeshComponent component;
+ component.replace(me, GeometryOwnershipType::Editable);
- for (int i = 0; i < me->totpoly; i++) {
- MPoly *mpoly = &me->mpoly[i];
- if (face_hide && face_hide[i]) {
- SET_FLAG_FROM_TEST(mpoly->flag, select, ME_FACE_SEL);
- face_hide[i] = false;
+ if (select) {
+ const VArray<bool> face_hide = component.attribute_get_for_read<bool>(
+ ".face_hide", ATTR_DOMAIN_FACE, false);
+ for (int i = 0; i < me->totpoly; i++) {
+ MPoly *mpoly = &me->mpoly[i];
+ if (face_hide[i]) {
+ mpoly->flag |= ME_FACE_SEL;
+ }
}
}
+ component.attribute_try_delete(".face_hide");
+
BKE_mesh_flush_hidden_from_polys(me);
paintface_flush_flags(C, ob, SELECT, true);
@@ -172,8 +192,11 @@ static void select_linked_tfaces_with_seams(Mesh *me, const uint index, const bo
BLI_bitmap *edge_tag = BLI_BITMAP_NEW(me->totedge, __func__);
BLI_bitmap *poly_tag = BLI_BITMAP_NEW(me->totpoly, __func__);
- const bool *face_hide = (const bool *)CustomData_get_layer_named(
- &me->pdata, CD_PROP_BOOL, ".face_hide");
+ MeshComponent component;
+ component.replace(me, GeometryOwnershipType::Editable);
+
+ const VArray<bool> face_hide = component.attribute_get_for_read<bool>(
+ ".face_hide", ATTR_DOMAIN_FACE, false);
if (index != (uint)-1) {
/* only put face under cursor in array */
@@ -185,7 +208,7 @@ static void select_linked_tfaces_with_seams(Mesh *me, const uint index, const bo
/* fill array by selection */
for (int i = 0; i < me->totpoly; i++) {
MPoly *mp = &me->mpoly[i];
- if (face_hide && face_hide[i]) {
+ if (face_hide[i]) {
/* pass */
}
else if (mp->flag & ME_FACE_SEL) {
@@ -201,7 +224,7 @@ static void select_linked_tfaces_with_seams(Mesh *me, const uint index, const bo
/* expand selection */
for (int i = 0; i < me->totpoly; i++) {
MPoly *mp = &me->mpoly[i];
- if (face_hide && face_hide[i]) {
+ if (face_hide[i]) {
continue;
}
@@ -266,15 +289,18 @@ bool paintface_deselect_all_visible(bContext *C, Object *ob, int action, bool fl
return false;
}
- const bool *face_hide = (const bool *)CustomData_get_layer_named(
- &me->pdata, CD_PROP_BOOL, ".face_hide");
+ MeshComponent component;
+ component.replace(me, GeometryOwnershipType::Editable);
+
+ const VArray<bool> face_hide = component.attribute_get_for_read<bool>(
+ ".face_hide", ATTR_DOMAIN_FACE, false);
if (action == SEL_TOGGLE) {
action = SEL_SELECT;
for (int i = 0; i < me->totpoly; i++) {
MPoly *mpoly = &me->mpoly[i];
- if (!(face_hide && face_hide[i]) && mpoly->flag & ME_FACE_SEL) {
+ if (!face_hide[i] && mpoly->flag & ME_FACE_SEL) {
action = SEL_DESELECT;
break;
}
@@ -285,7 +311,7 @@ bool paintface_deselect_all_visible(bContext *C, Object *ob, int action, bool fl
for (int i = 0; i < me->totpoly; i++) {
MPoly *mpoly = &me->mpoly[i];
- if (!(face_hide && face_hide[i])) {
+ if (!face_hide[i]) {
switch (action) {
case SEL_SELECT:
if ((mpoly->flag & ME_FACE_SEL) == 0) {
@@ -328,12 +354,15 @@ bool paintface_minmax(Object *ob, float r_min[3], float r_max[3])
copy_m3_m4(bmat, ob->obmat);
- const bool *face_hide = (const bool *)CustomData_get_layer_named(
- &me->pdata, CD_PROP_BOOL, ".face_hide");
+ MeshComponent component;
+ component.replace(const_cast<Mesh *>(me), GeometryOwnershipType::ReadOnly);
+
+ const VArray<bool> face_hide = component.attribute_get_for_read<bool>(
+ ".face_hide", ATTR_DOMAIN_FACE, false);
for (int i = 0; i < me->totpoly; i++) {
MPoly *mp = &me->mpoly[i];
- if ((face_hide && face_hide[i]) || !(mp->flag & ME_FACE_SEL)) {
+ if (face_hide[i] || !(mp->flag & ME_FACE_SEL)) {
continue;
}
@@ -363,13 +392,16 @@ bool paintface_mouse_select(bContext *C,
/* Get the face under the cursor */
Mesh *me = BKE_mesh_from_object(ob);
- const bool *face_hide = (const bool *)CustomData_get_layer_named(
- &me->pdata, CD_PROP_BOOL, ".face_hide");
+ MeshComponent component;
+ component.replace(const_cast<Mesh *>(me), GeometryOwnershipType::ReadOnly);
+
+ const VArray<bool> face_hide = component.attribute_get_for_read<bool>(
+ ".face_hide", ATTR_DOMAIN_FACE, false);
if (ED_mesh_pick_face(C, ob, mval, ED_MESH_PICK_DEFAULT_FACE_DIST, &index)) {
if (index < me->totpoly) {
mpoly_sel = me->mpoly + index;
- if (!(face_hide && face_hide[index])) {
+ if (!face_hide[index]) {
found = true;
}
}
@@ -484,15 +516,18 @@ bool paintvert_deselect_all_visible(Object *ob, int action, bool flush_flags)
return false;
}
- const bool *vert_hide = (const bool *)CustomData_get_layer_named(
- &me->vdata, CD_PROP_BOOL, ".vert_hide");
+ MeshComponent component;
+ component.replace(const_cast<Mesh *>(me), GeometryOwnershipType::ReadOnly);
+
+ const VArray<bool> vert_hide = component.attribute_get_for_read<bool>(
+ "vert_hide", ATTR_DOMAIN_POINT, false);
if (action == SEL_TOGGLE) {
action = SEL_SELECT;
for (int i = 0; i < me->totvert; i++) {
MVert *mvert = &me->mvert[i];
- if (!(vert_hide && vert_hide[i]) && mvert->flag & SELECT) {
+ if (!vert_hide[i] && mvert->flag & SELECT) {
action = SEL_DESELECT;
break;
}
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list