[Bf-blender-cvs] [ade37d83807] refactor-mesh-position-generic: Convert many more uses of MVert
Hans Goudey
noreply at git.blender.org
Tue Sep 13 07:15:51 CEST 2022
Commit: ade37d8380728a8f40f05c971585f91325c8ad69
Author: Hans Goudey
Date: Tue Sep 13 00:15:40 2022 -0500
Branches: refactor-mesh-position-generic
https://developer.blender.org/rBade37d8380728a8f40f05c971585f91325c8ad69
Convert many more uses of MVert
===================================================================
M source/blender/blenkernel/BKE_DerivedMesh.h
M source/blender/blenkernel/intern/DerivedMesh.cc
M source/blender/blenkernel/intern/mesh.cc
M source/blender/blenkernel/intern/mesh_legacy_convert.cc
M source/blender/blenkernel/intern/mesh_merge.c
M source/blender/blenkernel/intern/mesh_mirror.c
M source/blender/blenkernel/intern/modifier.c
M source/blender/blenkernel/intern/multires_reshape.h
M source/blender/blenkernel/intern/particle.c
M source/blender/blenkernel/intern/particle_distribute.c
M source/blender/blenkernel/intern/particle_system.c
M source/blender/blenkernel/intern/pbvh.c
M source/blender/blenkernel/intern/pbvh_intern.h
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/blenkernel/intern/shrinkwrap.c
M source/blender/blenkernel/intern/softbody.c
M source/blender/blenkernel/intern/subdiv_converter_mesh.c
M source/blender/blenkernel/intern/subdiv_eval.c
M source/blender/blenkernel/intern/subsurf_ccg.c
M source/blender/draw/intern/draw_cache_extract_mesh.cc
M source/blender/draw/intern/mesh_extractors/extract_mesh.hh
M source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_points.cc
M source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edge_fac.cc
M source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edit_data.cc
M source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_angle.cc
M source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_fdots_pos.cc
M source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc
M source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc
M source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_select_idx.cc
M source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_tan.cc
M source/blender/editors/armature/armature_skinning.c
M source/blender/editors/object/object_vgroup.cc
M source/blender/editors/physics/particle_edit.c
M source/blender/editors/sculpt_paint/paint_image_proj.c
M source/blender/editors/sculpt_paint/paint_vertex.cc
M source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
M source/blender/io/alembic/exporter/abc_writer_hair.cc
M source/blender/makesrna/intern/rna_particle.c
M source/blender/modifiers/intern/MOD_array.c
M source/blender/modifiers/intern/MOD_collision.c
M source/blender/modifiers/intern/MOD_explode.c
M source/blender/modifiers/intern/MOD_mask.cc
M source/blender/modifiers/intern/MOD_meshcache.c
M source/blender/modifiers/intern/MOD_meshsequencecache.cc
M source/blender/modifiers/intern/MOD_multires.c
M source/blender/modifiers/intern/MOD_particleinstance.c
M source/blender/modifiers/intern/MOD_remesh.c
M source/blender/modifiers/intern/MOD_screw.c
M source/blender/modifiers/intern/MOD_skin.c
M source/blender/modifiers/intern/MOD_solidify_extrude.c
M source/blender/modifiers/intern/MOD_solidify_nonmanifold.c
M source/blender/modifiers/intern/MOD_surface.c
M source/blender/modifiers/intern/MOD_surfacedeform.c
M source/blender/modifiers/intern/MOD_util.c
M source/blender/modifiers/intern/MOD_weighted_normal.c
M source/blender/modifiers/intern/MOD_weightvg_util.c
M source/blender/nodes/geometry/nodes/node_geo_convex_hull.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_extrude_mesh.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_scale_elements.cc
M source/blender/nodes/geometry/nodes/node_geo_transfer_attribute.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/texture_pointdensity.c
M source/blender/simulation/intern/hair_volume.cpp
===================================================================
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 68ce3ca7318..a8cdf943910 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -127,7 +127,7 @@ struct DerivedMesh {
* and freed on the next ->release(). consider using getVert/Edge/Face if
* you are only interested in a few verts/edges/faces.
*/
- struct MVert *(*getVertArray)(DerivedMesh *dm);
+ float (*) (*getVertArray)(DerivedMesh *dm)[3];
struct MEdge *(*getEdgeArray)(DerivedMesh *dm);
struct MLoop *(*getLoopArray)(DerivedMesh *dm);
struct MPoly *(*getPolyArray)(DerivedMesh *dm);
@@ -135,7 +135,7 @@ struct DerivedMesh {
/** Copy all verts/edges/faces from the derived mesh into
* *{vert/edge/face}_r (must point to a buffer large enough)
*/
- void (*copyVertArray)(DerivedMesh *dm, struct MVert *r_vert);
+ void (*copyVertArray)(DerivedMesh *dm, float (*r_positions)[3]);
void (*copyEdgeArray)(DerivedMesh *dm, struct MEdge *r_edge);
void (*copyLoopArray)(DerivedMesh *dm, struct MLoop *r_loop);
void (*copyPolyArray)(DerivedMesh *dm, struct MPoly *r_poly);
diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc
index 790f549b12d..6622199782c 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.cc
+++ b/source/blender/blenkernel/intern/DerivedMesh.cc
@@ -678,6 +678,7 @@ static void mesh_calc_modifiers(struct Depsgraph *depsgraph,
* float array rather than MVert*. Tracked along with mesh_final as an
* optimization to avoid copying coordinates back and forth if there are
* multiple sequential deform only modifiers. */
+ /* TODO(@Hans): Remove this. */
float(*deformed_verts)[3] = nullptr;
int num_deformed_verts = mesh_input->totvert;
bool isPrevDeform = false;
diff --git a/source/blender/blenkernel/intern/mesh.cc b/source/blender/blenkernel/intern/mesh.cc
index 58397da202f..fe22bbf8850 100644
--- a/source/blender/blenkernel/intern/mesh.cc
+++ b/source/blender/blenkernel/intern/mesh.cc
@@ -29,6 +29,7 @@
#include "BLI_math.h"
#include "BLI_math_vector.hh"
#include "BLI_memarena.h"
+#include "BLI_resource_scope.hh"
#include "BLI_span.hh"
#include "BLI_string.h"
#include "BLI_task.hh"
@@ -227,6 +228,7 @@ static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address
Vector<CustomDataLayer, 16> edge_layers;
Vector<CustomDataLayer, 16> loop_layers;
Vector<CustomDataLayer, 16> poly_layers;
+ blender::ResourceScope temp_arrays_for_legacy_format;
/* cache only - don't write */
mesh->mface = nullptr;
@@ -251,9 +253,6 @@ static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address
else {
Set<std::string> names_to_skip;
if (!BLO_write_is_undo(writer)) {
- BKE_mesh_legacy_convert_hide_layers_to_flags(mesh);
- BKE_mesh_legacy_convert_material_indices_to_mpoly(mesh);
- BKE_mesh_legacy_bevel_weight_from_layers(mesh);
/* When converting to the old mesh format, don't save redundant attributes. */
names_to_skip.add_multiple_new({".hide_vert",
".hide_edge",
@@ -275,6 +274,13 @@ static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address
CustomData_blend_write_prepare(mesh->edata, edge_layers, names_to_skip);
CustomData_blend_write_prepare(mesh->ldata, loop_layers, names_to_skip);
CustomData_blend_write_prepare(mesh->pdata, poly_layers, names_to_skip);
+
+ if (!BLO_write_is_undo(writer)) {
+ BKE_mesh_legacy_convert_positions_to_verts(mesh, temp_arrays_for_legacy_format, vert_layers);
+ BKE_mesh_legacy_convert_hide_layers_to_flags(mesh);
+ BKE_mesh_legacy_convert_material_indices_to_mpoly(mesh);
+ BKE_mesh_legacy_bevel_weight_from_layers(mesh);
+ }
}
BLO_write_id_struct(writer, Mesh, id_address, &mesh->id);
@@ -359,6 +365,7 @@ static void mesh_blend_read_data(BlendDataReader *reader, ID *id)
BKE_mesh_legacy_convert_flags_to_hide_layers(mesh);
BKE_mesh_legacy_convert_mpoly_to_material_indices(mesh);
BKE_mesh_legacy_bevel_weight_to_layers(mesh);
+ BKE_mesh_legacy_convert_verts_to_positions(mesh);
}
/* We don't expect to load normals from files, since they are derived data. */
@@ -479,9 +486,8 @@ static int customdata_compare(
const float thresh_sq = thresh * thresh;
CustomDataLayer *l1, *l2;
int layer_count1 = 0, layer_count2 = 0, j;
- const uint64_t cd_mask_non_generic = CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MPOLY |
- CD_MASK_MLOOPUV | CD_MASK_PROP_BYTE_COLOR |
- CD_MASK_MDEFORMVERT;
+ const uint64_t cd_mask_non_generic = CD_MASK_MEDGE | CD_MASK_MPOLY | CD_MASK_MLOOPUV |
+ CD_MASK_PROP_BYTE_COLOR | CD_MASK_MDEFORMVERT;
const uint64_t cd_mask_all_attr = CD_MASK_PROP_ALL | cd_mask_non_generic;
const Span<MLoop> loops_1 = m1->loops();
const Span<MLoop> loops_2 = m2->loops();
diff --git a/source/blender/blenkernel/intern/mesh_legacy_convert.cc b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
index 06902cacc3e..851ae4cf909 100644
--- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
@@ -17,8 +17,10 @@
#include "BLI_edgehash.h"
#include "BLI_math.h"
+#include "BLI_math_vec_types.hh"
#include "BLI_memarena.h"
#include "BLI_polyfill_2d.h"
+#include "BLI_resource_scope.hh"
#include "BLI_task.hh"
#include "BLI_utildefines.h"
@@ -29,6 +31,9 @@
#include "BKE_mesh_legacy_convert.h"
#include "BKE_multires.h"
+using blender::MutableSpan;
+using blender::Span;
+
/* -------------------------------------------------------------------- */
/** \name NGon Tessellation (NGon to MFace Conversion)
* \{ */
@@ -578,7 +583,7 @@ int BKE_mesh_mface_index_validate(MFace *mface, CustomData *fdata, int mfindex,
static int mesh_tessface_calc(CustomData *fdata,
CustomData *ldata,
CustomData *pdata,
- MVert *mvert,
+ float (*positions)[3],
int totface,
int totloop,
int totpoly)
@@ -708,9 +713,9 @@ static int mesh_tessface_calc(CustomData *fdata,
/* Calculate the normal, flipped: to get a positive 2D cross product. */
ml = mloop + mp_loopstart;
- co_prev = mvert[ml[mp_totloop - 1].v].co;
+ co_prev = positions[ml[mp_totloop - 1].v];
for (j = 0; j < mp_totloop; j++, ml++) {
- co_curr = mvert[ml->v].co;
+ co_curr = positions[ml->v];
add_newell_cross_v3_v3v3(normal, co_prev, co_curr);
co_prev = co_curr;
}
@@ -723,7 +728,7 @@ static int mesh_tessface_calc(CustomData *fdata,
ml = mloop + mp_loopstart;
for (j = 0; j < mp_totloop; j++, ml++) {
- mul_v2_m3v3(projverts[j], axis_mat, mvert[ml->v].co);
+ mul_v2_m3v3(projverts[j], axis_mat, positions[ml->v]);
}
BLI_polyfill_calc_arena(projverts, mp_totloop, 1, tris, arena);
@@ -925,7 +930,8 @@ void BKE_mesh_add_mface_layers(CustomData *fdata, CustomData *ldata, int total)
void BKE_mesh_legacy_bevel_weight_from_layers(Mesh *mesh)
{
using namespace blender;
- MutableSpan<MVert> verts = mesh->positions_for_write();
+ MutableSpan<MVert> verts(static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
+ mesh->totvert);
if (const float *weights = static_cast<const float *>(
CustomData_get_layer(&mesh->vdata, CD_BWEIGHT))) {
mesh->cd_flag |= ME_CDFLAG_VERT_BWEIGHT;
@@ -958,7 +964,8 @@ void BKE_mesh_legacy_bevel_weight_from_layers(Mesh *mesh)
void BKE_mesh_legacy_bevel_weight_to_layers(Mesh *mesh)
{
using namespace blender;
- const Span<MVert> verts = mesh->positions();
+ const Span<MVert> verts(static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
+ mesh->totvert);
if (mesh->cd_flag & ME_CDFLAG_VERT_BWEIGHT) {
float *weights = static_cast<float *>(
CustomData_add_layer(&mesh->vdata, CD_BWEIGHT, CD_CONSTRUCT, nullptr, verts.size()));
@@ -989,7 +996,8 @@ void BKE_mesh_legacy_convert_hide_layers_to_flags(Mesh *mesh)
using namespace blender::bke;
const AttributeAccessor attributes = mesh->attributes();
- MutableSpan<MVert> verts = mesh->positions_for_write();
+ MutableSpan<MVert> verts(static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
+ mesh->totvert);
const VArray<bool> hide_vert = attributes.lookup_or_default<bool>(
".hide_vert", ATTR_DOMAIN_POINT, false);
threading::parallel_for(verts.index_range(), 4096, [&](IndexRange range) {
@@ -1023,7 +1031,8 @@ void BKE_mesh_legacy_convert_flags_to_hide_layers(Mesh *mesh)
using namespace blender::bke;
MutableAttributeAccessor attributes = mesh->attributes_for_write();
- const Span<MVert> verts = mesh->positions();
+ const Span<MVert> verts(static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
+ mesh->totvert);
if (std::any_of(
verts.begin(), verts.end(), [](const MVert &vert) { return vert.flag & ME_HIDE; })) {
SpanAttributeWriter<bool> hide_vert = attributes.lookup_or_add_for_write_only_span<bool>(
@@ -1115,7 +1124,8 @@ void BKE_mesh_legacy_convert_selection_layers_to_flags(Mesh *mesh)
using namespace blender::bke;
const AttributeAccessor attributes = mesh->attributes();
- MutableSpan<MVert> verts = mesh->positions_for_write();
+ MutableSpan<MVert> verts(static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
+ mesh->totvert);
const VArray<bool> selection_vert = attributes.lookup_or_default<bool>(
".selection_vert", ATTR_DOMAIN_POINT, false);
threading::parallel_for(verts.index_range(), 4096, [&](IndexRange range) {
@@ -1149,7 +1159,8 @@ void BKE_mesh_legacy_convert_flags_to_selection_layers(Mesh *mesh)
using namespace blender::bke;
MutableAttr
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list