Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenkernel/intern/mesh_legacy_convert.cc')
-rw-r--r--source/blender/blenkernel/intern/mesh_legacy_convert.cc89
1 files changed, 73 insertions, 16 deletions
diff --git a/source/blender/blenkernel/intern/mesh_legacy_convert.cc b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
index 23426f8c087..7f203252bc8 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 Legacy Edge Calculation
* \{ */
@@ -212,7 +217,8 @@ void BKE_mesh_calc_edges_legacy(Mesh *me, const bool use_old)
using namespace blender;
MEdge *medge;
int totedge = 0;
- const Span<MVert> verts = me->verts();
+ const Span<MVert> verts(static_cast<const MVert *>(CustomData_get_layer(&me->vdata, CD_MVERT)),
+ me->totvert);
const Span<MPoly> polys = me->polys();
MutableSpan<MLoop> loops = me->loops_for_write();
@@ -253,7 +259,8 @@ void BKE_mesh_do_versions_cd_flag_init(Mesh *mesh)
return;
}
- const Span<MVert> verts = mesh->verts();
+ const Span<MVert> verts(static_cast<const MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
+ mesh->totvert);
const Span<MEdge> edges = mesh->edges();
for (const MVert &vert : verts) {
@@ -939,7 +946,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)
@@ -1069,9 +1076,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;
}
@@ -1084,7 +1091,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);
@@ -1186,7 +1193,7 @@ void BKE_mesh_tessface_calc(Mesh *mesh)
mesh->totface = mesh_tessface_calc(&mesh->fdata,
&mesh->ldata,
&mesh->pdata,
- BKE_mesh_verts_for_write(mesh),
+ BKE_mesh_positions_for_write(mesh),
mesh->totface,
mesh->totloop,
mesh->totpoly);
@@ -1240,7 +1247,7 @@ void BKE_mesh_legacy_face_set_to_generic(Mesh *mesh)
void BKE_mesh_legacy_bevel_weight_from_layers(Mesh *mesh)
{
using namespace blender;
- MutableSpan<MVert> verts = mesh->verts_for_write();
+ MutableSpan<MVert> verts(mesh->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;
@@ -1273,7 +1280,7 @@ 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->verts();
+ const Span<MVert> verts(mesh->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()));
@@ -1342,7 +1349,7 @@ void BKE_mesh_legacy_convert_hide_layers_to_flags(Mesh *mesh)
using namespace blender::bke;
const AttributeAccessor attributes = mesh->attributes();
- MutableSpan<MVert> verts = mesh->verts_for_write();
+ MutableSpan<MVert> verts(mesh->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) {
@@ -1376,7 +1383,7 @@ 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->verts();
+ const Span<MVert> verts(mesh->mvert, mesh->totvert);
if (std::any_of(verts.begin(), verts.end(), [](const MVert &vert) {
return vert.flag_legacy & ME_HIDE;
})) {
@@ -1469,7 +1476,7 @@ void BKE_mesh_legacy_convert_selection_layers_to_flags(Mesh *mesh)
using namespace blender::bke;
const AttributeAccessor attributes = mesh->attributes();
- MutableSpan<MVert> verts = mesh->verts_for_write();
+ MutableSpan<MVert> verts(mesh->mvert, mesh->totvert);
const VArray<bool> select_vert = attributes.lookup_or_default<bool>(
".select_vert", ATTR_DOMAIN_POINT, false);
threading::parallel_for(verts.index_range(), 4096, [&](IndexRange range) {
@@ -1503,7 +1510,7 @@ void BKE_mesh_legacy_convert_flags_to_selection_layers(Mesh *mesh)
using namespace blender::bke;
MutableAttributeAccessor attributes = mesh->attributes_for_write();
- const Span<MVert> verts = mesh->verts();
+ const Span<MVert> verts(mesh->mvert, mesh->totvert);
if (std::any_of(verts.begin(), verts.end(), [](const MVert &vert) {
return vert.flag_legacy & SELECT;
})) {
@@ -1511,7 +1518,7 @@ void BKE_mesh_legacy_convert_flags_to_selection_layers(Mesh *mesh)
".select_vert", ATTR_DOMAIN_POINT);
threading::parallel_for(verts.index_range(), 4096, [&](IndexRange range) {
for (const int i : range) {
- select_vert.span[i] = (verts[i].flag_legacy & SELECT) != 0;
+ select_vert.span[i] = verts[i].flag_legacy & SELECT;
}
});
select_vert.finish();
@@ -1524,7 +1531,7 @@ void BKE_mesh_legacy_convert_flags_to_selection_layers(Mesh *mesh)
".select_edge", ATTR_DOMAIN_EDGE);
threading::parallel_for(edges.index_range(), 4096, [&](IndexRange range) {
for (const int i : range) {
- select_edge.span[i] = (edges[i].flag & SELECT) != 0;
+ select_edge.span[i] = edges[i].flag & SELECT;
}
});
select_edge.finish();
@@ -1537,7 +1544,7 @@ void BKE_mesh_legacy_convert_flags_to_selection_layers(Mesh *mesh)
".select_poly", ATTR_DOMAIN_FACE);
threading::parallel_for(polys.index_range(), 4096, [&](IndexRange range) {
for (const int i : range) {
- select_poly.span[i] = (polys[i].flag & ME_FACE_SEL) != 0;
+ select_poly.span[i] = polys[i].flag & ME_FACE_SEL;
}
});
select_poly.finish();
@@ -1545,3 +1552,53 @@ void BKE_mesh_legacy_convert_flags_to_selection_layers(Mesh *mesh)
}
/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \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(
+ &mesh->vdata, CD_PROP_FLOAT3, CD_CONSTRUCT, nullptr, mesh->totvert, "position")),
+ mesh->totvert);
+ threading::parallel_for(verts.index_range(), 2048, [&](IndexRange range) {
+ for (const int i : range) {
+ positions[i] = verts[i].co_legacy;
+ }
+ });
+
+ CustomData_free_layers(&mesh->vdata, CD_MVERT, mesh->totvert);
+}
+
+/** \} */