[Bf-blender-cvs] [7fb57e9e6d3] refactor-mesh-position-generic: Merge branch 'master' into refactor-mesh-position-generic
Hans Goudey
noreply at git.blender.org
Sun Nov 27 03:58:37 CET 2022
Commit: 7fb57e9e6d36ebe2b921e6fd6bfb706c0796915a
Author: Hans Goudey
Date: Sat Nov 26 20:44:51 2022 -0600
Branches: refactor-mesh-position-generic
https://developer.blender.org/rB7fb57e9e6d36ebe2b921e6fd6bfb706c0796915a
Merge branch 'master' into refactor-mesh-position-generic
===================================================================
===================================================================
diff --cc source/blender/blenkernel/BKE_mesh.h
index 700274a7872,577107149ee..934847ae925
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@@ -431,6 -437,15 +438,11 @@@ bool BKE_mesh_vertex_normals_are_dirty(
*/
bool BKE_mesh_poly_normals_are_dirty(const struct Mesh *mesh);
+ void BKE_mesh_calc_poly_normal(const struct MPoly *mpoly,
+ const struct MLoop *loopstart,
- const struct MVert *mvarray,
++ const float (*positions)[3],
+ float r_no[3]);
-void BKE_mesh_calc_poly_normal_coords(const struct MPoly *mpoly,
- const struct MLoop *loopstart,
- const float (*vertex_coords)[3],
- float r_no[3]);
+
/**
* Calculate face normals directly into a result array.
*
@@@ -693,13 -708,9 +705,9 @@@ void BKE_mesh_set_custom_normals_from_v
/* *** mesh_evaluate.cc *** */
- void BKE_mesh_calc_poly_normal(const struct MPoly *mpoly,
- const struct MLoop *loopstart,
- const float (*positions)[3],
- float r_no[3]);
void BKE_mesh_calc_poly_center(const struct MPoly *mpoly,
const struct MLoop *loopstart,
- const struct MVert *mvarray,
+ const float (*positions)[3],
float r_cent[3]);
/* NOTE: passing poly-normal is only a speedup so we can skip calculating it. */
float BKE_mesh_calc_poly_area(const struct MPoly *mpoly,
diff --cc source/blender/blenkernel/BKE_mesh_legacy_convert.h
index 27932852b98,e46942aa9e9..97234ccd139
--- a/source/blender/blenkernel/BKE_mesh_legacy_convert.h
+++ b/source/blender/blenkernel/BKE_mesh_legacy_convert.h
@@@ -86,13 -82,9 +86,16 @@@ void BKE_mesh_legacy_convert_material_i
*/
void BKE_mesh_legacy_convert_mpoly_to_material_indices(struct Mesh *mesh);
+ /** Convert from runtime loose edge cache to legacy edge flag. */
+ void BKE_mesh_legacy_convert_loose_edges_to_flag(struct Mesh *mesh);
+
+struct MVert *BKE_mesh_legacy_convert_positions_to_verts(
+ Mesh *mesh,
+ blender::ResourceScope &temp_arrays_for_convert,
+ blender::Vector<CustomDataLayer, 16> &vert_layers_to_write);
+
+void BKE_mesh_legacy_convert_verts_to_positions(Mesh *mesh);
+
#endif
/**
diff --cc source/blender/blenkernel/intern/mesh.cc
index d148fc42ff0,02d375bd782..9a13e3b5293
--- a/source/blender/blenkernel/intern/mesh.cc
+++ b/source/blender/blenkernel/intern/mesh.cc
@@@ -259,16 -263,8 +260,17 @@@ static void mesh_blend_write(BlendWrite
".select_edge",
".select_poly"});
+ mesh->mvert = 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_selection_layers_to_flags(mesh);
+ BKE_mesh_legacy_convert_material_indices_to_mpoly(mesh);
+ BKE_mesh_legacy_bevel_weight_from_layers(mesh);
+ BKE_mesh_legacy_face_set_from_generic(mesh, poly_layers);
+ BKE_mesh_legacy_edge_crease_from_layers(mesh);
++ BKE_mesh_legacy_convert_loose_edges_to_flag(mesh);
+
/* Set deprecated mesh data pointers for forward compatibility. */
- mesh->mvert = const_cast<MVert *>(mesh->verts().data());
mesh->medge = const_cast<MEdge *>(mesh->edges().data());
mesh->mpoly = const_cast<MPoly *>(mesh->polys().data());
mesh->mloop = const_cast<MLoop *>(mesh->loops().data());
diff --cc source/blender/blenkernel/intern/mesh_evaluate.cc
index 1c7087e0014,de080c9dff2..ca2580838b7
--- a/source/blender/blenkernel/intern/mesh_evaluate.cc
+++ b/source/blender/blenkernel/intern/mesh_evaluate.cc
@@@ -39,65 -38,9 +39,9 @@@ using blender::VArray
/** \name Polygon Calculations
* \{ */
- /*
- * COMPUTE POLY NORMAL
- *
- * Computes the normal of a planar
- * polygon See Graphics Gems for
- * computing newell normal.
- */
- static void mesh_calc_ngon_normal(const MPoly *mpoly,
- const MLoop *loopstart,
- const float (*positions)[3],
- float normal[3])
- {
- const int nverts = mpoly->totloop;
- const float *v_prev = positions[loopstart[nverts - 1].v];
- const float *v_curr;
-
- zero_v3(normal);
-
- /* Newell's Method */
- for (int i = 0; i < nverts; i++) {
- v_curr = positions[loopstart[i].v];
- add_newell_cross_v3_v3v3(normal, v_prev, v_curr);
- v_prev = v_curr;
- }
-
- if (UNLIKELY(normalize_v3(normal) == 0.0f)) {
- normal[2] = 1.0f; /* other axis set to 0.0 */
- }
- }
-
- void BKE_mesh_calc_poly_normal(const MPoly *mpoly,
- const MLoop *loopstart,
- const float (*positions)[3],
- float r_no[3])
- {
- if (mpoly->totloop > 4) {
- mesh_calc_ngon_normal(mpoly, loopstart, positions, r_no);
- }
- else if (mpoly->totloop == 3) {
- normal_tri_v3(
- r_no, positions[loopstart[0].v], positions[loopstart[1].v], positions[loopstart[2].v]);
- }
- else if (mpoly->totloop == 4) {
- normal_quad_v3(r_no,
- positions[loopstart[0].v],
- positions[loopstart[1].v],
- positions[loopstart[2].v],
- positions[loopstart[3].v]);
- }
- else { /* horrible, two sided face! */
- r_no[0] = 0.0;
- r_no[1] = 0.0;
- r_no[2] = 1.0;
- }
- }
-
static void mesh_calc_ngon_center(const MPoly *mpoly,
const MLoop *loopstart,
- const MVert *mvert,
+ const float (*positions)[3],
float cent[3])
{
const float w = 1.0f / float(mpoly->totloop);
@@@ -229,7 -171,7 +173,7 @@@ static float UNUSED_FUNCTION(mesh_calc_
*/
static float mesh_calc_poly_volume_centroid_with_reference_center(const MPoly *mpoly,
const MLoop *loopstart,
- const float (*positions)[3],
- const MVert *mvarray,
++ const Span<float3> positions,
const float reference_center[3],
float r_cent[3])
{
@@@ -351,10 -293,10 +295,10 @@@ void BKE_mesh_poly_edgebitmap_insert(ui
bool BKE_mesh_center_median(const Mesh *me, float r_cent[3])
{
- const Span<MVert> verts = me->verts();
+ const Span<float3> positions = me->positions();
zero_v3(r_cent);
- for (const float3 &position : positions) {
- add_v3_v3(r_cent, position);
- for (const MVert &vert : verts) {
- add_v3_v3(r_cent, vert.co);
++ for (const int i : positions.index_range()) {
++ add_v3_v3(r_cent, positions[i]);
}
/* otherwise we get NAN for 0 verts */
if (me->totvert) {
@@@ -437,7 -378,7 +381,7 @@@ bool BKE_mesh_center_of_volume(const Me
float poly_volume;
float total_volume = 0.0f;
float poly_cent[3];
- const float(*positions)[3] = BKE_mesh_positions(me);
- const MVert *verts = BKE_mesh_verts(me);
++ const Span<float3> positions = me->positions();
const MPoly *polys = BKE_mesh_polys(me);
const MLoop *loops = BKE_mesh_loops(me);
diff --cc source/blender/blenkernel/intern/mesh_legacy_convert.cc
index 7f203252bc8,1673e972a32..d3e93484784
--- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
@@@ -1553,52 -1541,29 +1548,79 @@@ void BKE_mesh_legacy_convert_flags_to_s
/** \} */
+ /* -------------------------------------------------------------------- */
+ /** \name Loose Edges
+ * \{ */
+
+ void BKE_mesh_legacy_convert_loose_edges_to_flag(Mesh *mesh)
+ {
+ using namespace blender;
+ using namespace blender::bke;
+
+ const LooseEdgeCache &loose_edges = mesh->loose_edges();
+ MutableSpan<MEdge> edges = mesh->edges_for_write();
+ threading::parallel_for(edges.index_range(), 4096, [&](const IndexRange range) {
+ if (loose_edges.count == 0) {
+ for (const int64_t i : range) {
+ edges[i].flag &= ~ME_LOOSEEDGE;
+ }
+ }
+ else {
+ for (const int64_t i : range) {
+ SET_FLAG_FROM_TEST(edges[i].flag, loose_edges.is_loose_bits[i], ME_LOOSEEDGE);
+ }
+ }
+ });
+ }
+
+ /** \} */
++
+/* -------------------------------------------------------------------- */
+/** \name Vertex and Position Conversion
+ * \{ */
+
+MVert *BKE_mesh_legacy_convert_positions_to_verts(
+ Mesh *mesh,
+ blender::ResourceScope &temp_arrays_for_convert,
+ blender::Vector<CustomDataLayer, 16> &vert_layers_to_write)
+{
+ using namespace blender;
+
+ const Span<float3> positions = mesh->positions();
+
+ CustomDataLayer mvert_layer{};
+ mvert_layer.type = CD_MVERT;
+ MutableSpan<MVert> verts = temp_arrays_for_convert.construct<Array<MVert>>(mesh->totvert);
+ mvert_layer.data = verts.data();
+
+ threading::parallel_for(verts.index_range(), 2048, [&](IndexRange range) {
+ for (const int i : range) {
+ copy_v3_v3(verts[i].co_legacy, positions[i]);
+ }
+ });
+
+ vert_layers_to_write.append(mvert_layer);
+ return verts.data();
+}
+
+void BKE_mesh_legacy_convert_verts_to_positions(Mesh *mesh)
+{
+ using namespace blender;
+ using namespace blender::bke;
+
+ const Span<MVert> verts(static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
+ mesh->totvert);
+ MutableSpan<float3> positions(
+ static_cast<float3 *>(CustomData_add_layer_named(
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list