[Bf-blender-cvs] [b5794d79567] refactor-mesh-remove-pointers: Start of removing access to mesh pointers

Hans Goudey noreply at git.blender.org
Sun Jul 17 18:07:45 CEST 2022


Commit: b5794d795679bb4d734cb26c8e3be57922ce7855
Author: Hans Goudey
Date:   Wed Jul 13 14:29:43 2022 -0500
Branches: refactor-mesh-remove-pointers
https://developer.blender.org/rBb5794d795679bb4d734cb26c8e3be57922ce7855

Start of removing access to mesh pointers

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

M	source/blender/blenkernel/BKE_mesh.h
M	source/blender/blenkernel/BKE_mesh_sample.hh
M	source/blender/blenkernel/intern/DerivedMesh.cc
M	source/blender/blenkernel/intern/bvhutils.cc
M	source/blender/blenkernel/intern/cloth.c
M	source/blender/blenkernel/intern/constraint.c
M	source/blender/blenkernel/intern/crazyspace.c
M	source/blender/blenkernel/intern/data_transfer.c
M	source/blender/blenkernel/intern/dynamicpaint.c
M	source/blender/blenkernel/intern/effect.c
M	source/blender/blenkernel/intern/fluid.c
M	source/blender/blenkernel/intern/gpencil_geom.cc
M	source/blender/blenkernel/intern/key.c
M	source/blender/blenkernel/intern/mesh.cc
M	source/blender/blenkernel/intern/mesh_boolean_convert.cc
M	source/blender/blenkernel/intern/mesh_convert.cc
M	source/blender/blenkernel/intern/mesh_evaluate.cc
M	source/blender/blenkernel/intern/mesh_fair.cc
M	source/blender/blenkernel/intern/mesh_iterators.c
M	source/blender/blenkernel/intern/mesh_merge.c
M	source/blender/blenkernel/intern/mesh_normals.cc
M	source/blender/blenkernel/intern/mesh_remap.c
M	source/blender/blenkernel/intern/mesh_sample.cc
M	source/blender/blenkernel/intern/mesh_tangent.c
M	source/blender/blenkernel/intern/mesh_validate.cc
M	source/blender/editors/object/object_modifier.cc
M	source/blender/editors/object/object_remesh.cc
M	source/blender/editors/object/object_shapekey.c
M	source/blender/editors/object/object_vgroup.c
M	source/blender/editors/sculpt_paint/curves_sculpt_add.cc
M	source/blender/editors/sculpt_paint/curves_sculpt_slide.cc
M	source/blender/editors/sculpt_paint/sculpt_dyntopo.c
M	source/blender/geometry/intern/add_curves_on_mesh.cc
M	source/blender/makesdna/DNA_mesh_types.h
M	source/blender/modifiers/intern/MOD_remesh.c
M	source/blender/modifiers/intern/MOD_surfacedeform.c
M	source/blender/modifiers/intern/MOD_wave.c
M	source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc
M	source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc
M	source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc
M	source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc
M	source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc
M	source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_angle.cc
M	source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_vertices.cc
M	source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_area.cc
M	source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_is_planar.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_grid.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_line.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc
M	source/blender/nodes/geometry/nodes/node_geo_set_position.cc
M	source/blender/nodes/geometry/nodes/node_geo_uv_pack_islands.cc
M	source/blender/nodes/geometry/nodes/node_geo_uv_unwrap.cc
M	source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc
M	source/blender/python/mathutils/mathutils_bvhtree.c
M	source/blender/render/intern/bake.c
M	source/blender/render/intern/multires_bake.c
M	source/blender/render/intern/texture_margin.cc
M	source/blender/render/intern/texture_pointdensity.c

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

diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 731c9872aae..2e01c6db9a6 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -6,10 +6,16 @@
  * \ingroup bke
  */
 
-#include "BKE_mesh_types.h"
 #include "BLI_compiler_attrs.h"
+#include "BLI_compiler_compat.h"
 #include "BLI_utildefines.h"
 
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "BKE_customdata.h"
+#include "BKE_mesh_types.h"
+
 struct BLI_Stack;
 struct BMesh;
 struct BMeshCreateParams;
@@ -1024,6 +1030,92 @@ char *BKE_mesh_debug_info(const struct Mesh *me)
 void BKE_mesh_debug_print(const struct Mesh *me) ATTR_NONNULL(1);
 #endif
 
+BLI_INLINE const MVert *BKE_mesh_vertices(const Mesh *mesh)
+{
+  return (const MVert *)CustomData_get_layer(&mesh->vdata, CD_MVERT);
+}
+BLI_INLINE MVert *BKE_mesh_vertices_for_write(Mesh *mesh)
+{
+  CustomData_duplicate_referenced_layer(&mesh->vdata, CD_MVERT, mesh->totvert);
+  return (MVert *)CustomData_get_layer(&mesh->vdata, CD_MVERT);
+}
+
+BLI_INLINE const MEdge *BKE_mesh_edges(const Mesh *mesh)
+{
+  return (const MEdge *)CustomData_get_layer(&mesh->edata, CD_MEDGE);
+}
+BLI_INLINE MEdge *BKE_mesh_edges_for_write(Mesh *mesh)
+{
+  CustomData_duplicate_referenced_layer(&mesh->edata, CD_MEDGE, mesh->totedge);
+  return (MEdge *)CustomData_get_layer(&mesh->edata, CD_MEDGE);
+}
+
+BLI_INLINE const MPoly *BKE_mesh_polygons(const Mesh *mesh)
+{
+  return (const MPoly *)CustomData_get_layer(&mesh->vdata, CD_MPOLY);
+}
+BLI_INLINE MPoly *BKE_mesh_polygons_for_write(Mesh *mesh)
+{
+  CustomData_duplicate_referenced_layer(&mesh->pdata, CD_MPOLY, mesh->totpoly);
+  return (MPoly *)CustomData_get_layer(&mesh->pdata, CD_MPOLY);
+}
+
+BLI_INLINE const MLoop *BKE_mesh_loops(const Mesh *mesh)
+{
+  return (const MLoop *)CustomData_get_layer(&mesh->vdata, CD_MLOOP);
+}
+BLI_INLINE MLoop *BKE_mesh_loops_for_write(Mesh *mesh)
+{
+  CustomData_duplicate_referenced_layer(&mesh->ldata, CD_MLOOP, mesh->totloop);
+  return (MLoop *)CustomData_get_layer(&mesh->ldata, CD_MLOOP);
+}
+
 #ifdef __cplusplus
 }
 #endif
+
+#ifdef __cplusplus
+
+#  include "BLI_span.hh"
+
+namespace blender::bke {
+
+inline Span<MVert> mesh_vertices(const Mesh &mesh)
+{
+  return {BKE_mesh_vertices(&mesh), mesh.totvert};
+}
+inline MutableSpan<MVert> mesh_vertices_for_write(Mesh &mesh)
+{
+  return {BKE_mesh_vertices_for_write(&mesh), mesh.totvert};
+}
+
+inline Span<MEdge> mesh_edges(const Mesh &mesh)
+{
+  return {BKE_mesh_edges(&mesh), mesh.totedge};
+}
+inline MutableSpan<MEdge> mesh_edges_for_write(Mesh &mesh)
+{
+  return {BKE_mesh_edges_for_write(&mesh), mesh.totedge};
+}
+
+inline Span<MPoly> mesh_polygons(const Mesh &mesh)
+{
+  return {BKE_mesh_polygons(&mesh), mesh.totpoly};
+}
+inline MutableSpan<MPoly> mesh_polygons_for_write(Mesh &mesh)
+{
+  return {BKE_mesh_polygons_for_write(&mesh), mesh.totpoly};
+}
+
+inline Span<MLoop> mesh_loops(const Mesh &mesh)
+{
+  return {BKE_mesh_loops(&mesh), mesh.totloop};
+}
+inline MutableSpan<MLoop> mesh_loops_for_write(Mesh &mesh)
+{
+  return {BKE_mesh_loops_for_write(&mesh), mesh.totloop};
+}
+
+}  // namespace blender::bke
+
+#endif
diff --git a/source/blender/blenkernel/BKE_mesh_sample.hh b/source/blender/blenkernel/BKE_mesh_sample.hh
index 356709d8942..50d24917d50 100644
--- a/source/blender/blenkernel/BKE_mesh_sample.hh
+++ b/source/blender/blenkernel/BKE_mesh_sample.hh
@@ -133,7 +133,8 @@ int sample_surface_points_projected(
     Vector<int> &r_looptri_indices,
     Vector<float3> &r_positions);
 
-float3 compute_bary_coord_in_triangle(const Mesh &mesh,
+float3 compute_bary_coord_in_triangle(Span<MVert> vertices,
+                                      Span<MLoop> loops,
                                       const MLoopTri &looptri,
                                       const float3 &position);
 
diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc
index c2ea01bcadf..c37dcb697c9 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.cc
+++ b/source/blender/blenkernel/intern/DerivedMesh.cc
@@ -68,6 +68,8 @@
 
 using blender::float3;
 using blender::IndexRange;
+using blender::Span;
+using blender::VArray;
 
 /* very slow! enable for testing only! */
 //#define USE_MODIFIER_VALIDATE
@@ -822,18 +824,14 @@ static void mesh_calc_modifiers(struct Depsgraph *depsgraph,
       mesh_final = BKE_mesh_copy_for_eval(mesh_input, true);
       ASSERT_IS_VALID_MESH(mesh_final);
     }
-    float3 *rest_positions = static_cast<float3 *>(CustomData_add_layer_named(&mesh_final->vdata,
-                                                                              CD_PROP_FLOAT3,
-                                                                              CD_DEFAULT,
-                                                                              nullptr,
-                                                                              mesh_final->totvert,
-                                                                              "rest_position"));
-    blender::threading::parallel_for(
-        IndexRange(mesh_final->totvert), 1024, [&](const IndexRange range) {
-          for (const int i : range) {
-            rest_positions[i] = mesh_final->mvert[i].co;
-          }
-        });
+    blender::bke::MutableAttributeAccessor attributes = blender::bke::mesh_attributes_for_write(
+        *mesh_final);
+    blender::bke::SpanAttributeWriter rest_positions =
+        attributes.lookup_or_add_for_write_only_span<float3>("rest_position", ATTR_DOMAIN_POINT);
+    VArray<float3> positions = attributes.lookup_or_default<float3>(
+        "position", ATTR_DOMAIN_POINT, float3(0));
+    positions.materialize(rest_positions.span);
+    rest_positions.finish();
   }
 
   /* Apply all leading deform modifiers. */
@@ -1994,9 +1992,9 @@ void mesh_get_mapped_verts_coords(Mesh *me_eval, float (*r_cos)[3], const int to
     MEM_freeN(userData.vertex_visit);
   }
   else {
-    MVert *mv = me_eval->mvert;
-    for (int i = 0; i < totcos; i++, mv++) {
-      copy_v3_v3(r_cos[i], mv->co);
+    const Span<MVert> vertices = blender::bke::mesh_vertices(*me_eval);
+    for (int i = 0; i < totcos; i++) {
+      copy_v3_v3(r_cos[i], vertices[i].co);
     }
   }
 }
@@ -2009,9 +2007,11 @@ static void mesh_init_origspace(Mesh *mesh)
                                                                    CD_ORIGSPACE_MLOOP);
   const int numpoly = mesh->totpoly;
   // const int numloop = mesh->totloop;
-  MVert *mv = mesh->mvert;
-  MLoop *ml = mesh->mloop;
-  MPoly *mp = mesh->mpoly;
+  const Span<MVert> vertices = blender::bke::mesh_vertices(*mesh);
+  const Span<MPoly> polygons = blender::bke::mesh_polygons(*mesh);
+  const Span<MLoop> loops = blender::bke::mesh_loops(*mesh);
+
+  const MPoly *mp = polygons.data();
   int i, j, k;
 
   blender::Vector<blender::float2, 64> vcos_2d;
@@ -2025,19 +2025,19 @@ static void mesh_init_origspace(Mesh *mesh)
       }
     }
     else {
-      MLoop *l = &ml[mp->loopstart];
+      const MLoop *l = &loops[mp->loopstart];
       float p_nor[3], co[3];
       float mat[3][3];
 
       float min[2] = {FLT_MAX, FLT_MAX}, max[2] = {-FLT_MAX, -FLT_MAX};
       float translate[2], scale[2];
 
-      BKE_mesh_calc_poly_normal(mp, l, mv, p_nor);
+      BKE_mesh_calc_poly_normal(mp, l, vertices.data(), p_nor);
       axis_dominant_v3_to_m3(mat, p_nor);
 
       vcos_2d.resize(mp->totloop);
       for (j = 0; j < mp->totloop; j++, l++) {
-        mul_v3_m3v3(co, mat, mv[l->v].co);
+        mul_v3_m3v3(co, mat, vertices[l->v].co);
         copy_v2_v2(vcos_2d[j], co);
 
         for (k = 0; k < 2; k++) {
diff --git a/source/blender/blenkernel/intern/bvhutils.cc b/source/blender/blenkernel/intern/bvhutils.cc
index 35c2039634a..da52a967e94 100644
--- a/source/blender/blenkernel/intern/bvhutils.cc
+++ b/source/blender/blenkernel/intern/bvhutils.cc
@@ -15,6 +15,7 @@
 
 #include "BLI_linklist.h"
 #include "BLI_math.h"
+#include "BLI_span.hh"
 #include "BLI_task.h"
 #include "BLI_threads.h"
 #include "BLI_utildefines.h"
@@ -26,6 +27,8 @@
 
 #include "MEM_guardedalloc.h"
 
+using blender::Span;
+
 /* -------------------------------------------------------------------- */
 /** \name BVHCache
  * \{ */
@@ -1223,11 +1226,12 @@ BVHTree *BKE_bvhtree_from_mesh_get(struct BVHTreeFromMesh *data,
     looptri = BKE_mesh_runtime_looptri_ensure(mesh);
     looptri_len = BKE_mesh_runtime_looptri_len(mesh);
   }
+  Span<MVert> vertices = blender::bke::mesh_vertices(*mesh);
 
   /* Setup BVHTreeFromMesh */
   bvhtree_from_mesh_setup_data(nullptr,
                                bvh_cache_type,
-                               mesh->mvert,
+                               vertices.data(),
                                mesh->medge,
                                mesh->mface,
                                mesh->mloop,
@@ -1254,25 +1258,31 @@ BVHTree *BKE_bvhtree_from_mesh_get(struct BVHTreeFromMesh *data,
   switch (bvh_cache_type) {
     case BVHTREE_FROM_LOOSEVERTS:
       mask = loose_verts_map_get(
-          mesh->medge, mesh->totedge, mesh->mvert, mesh->totvert, &mask_bits_act_len);
+          mesh->medge, mesh->totedge, vertices.data(), mesh->totvert, &mask_bits_act_len);
       ATTR_FALLTHROUGH;
     case BVHTREE_FROM_VERTS:
       data->tree = bvhtree_from_mesh_verts_create_tree(
-          0.0f, tree_type, 6, mesh->mvert, mesh->totvert, mask, mask_bits_act_len);
+          0.0f, tree_type, 6, vertices.data(), mesh->totvert, mask, mask_bits_act_len);
       break;
 
     case BVHTREE_FROM_LOOSEEDGES:
       mask = loose_edges_map_get(mesh->medge, mesh->totedge, &mask_bits_act_len);
       ATTR_FALLTHROUGH;
     case BVHTREE_FROM_EDGES:
-      data->tree = bvhtree_from_mesh_edges_create_tree(
-          mesh->mvert, mesh->medge, mesh->totedge, mask, mask_bits_act_len, 0.0f, tree_type, 6);
+      data->tree = bvhtree_from_mesh_edges_create_tree(vertices.data(),
+                                                       mesh->medge,
+                                                       mesh->totedge,
+                                                       mask,
+                                        

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list