[Bf-blender-cvs] [fd395c9a0a2] refactor-mesh-position-generic: Merge branch 'master' into refactor-mesh-position-generic
Hans Goudey
noreply at git.blender.org
Fri Dec 16 01:04:06 CET 2022
Commit: fd395c9a0a2b5cc874e38c6d1236e9ba7e982d30
Author: Hans Goudey
Date: Thu Dec 15 17:47:51 2022 -0600
Branches: refactor-mesh-position-generic
https://developer.blender.org/rBfd395c9a0a2b5cc874e38c6d1236e9ba7e982d30
Merge branch 'master' into refactor-mesh-position-generic
===================================================================
===================================================================
diff --cc source/blender/blenkernel/BKE_mesh_legacy_convert.h
index 97234ccd139,65804e9ac24..a561cf9e8fd
--- a/source/blender/blenkernel/BKE_mesh_legacy_convert.h
+++ b/source/blender/blenkernel/BKE_mesh_legacy_convert.h
@@@ -89,13 -85,9 +87,16 @@@ void BKE_mesh_legacy_convert_mpoly_to_m
/** Convert from runtime loose edge cache to legacy edge flag. */
void BKE_mesh_legacy_convert_loose_edges_to_flag(struct Mesh *mesh);
+ void BKE_mesh_legacy_attribute_flags_to_strings(struct Mesh *mesh);
+ void BKE_mesh_legacy_attribute_strings_to_flags(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 7672223bd83,6ec171c4bcc..4e783ad428c
--- a/source/blender/blenkernel/intern/mesh.cc
+++ b/source/blender/blenkernel/intern/mesh.cc
@@@ -268,9 -257,21 +272,12 @@@ static void mesh_blend_write(BlendWrite
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_attribute_strings_to_flags(mesh);
+ mesh->active_color_attribute = nullptr;
+ mesh->default_color_attribute = nullptr;
BKE_mesh_legacy_convert_loose_edges_to_flag(mesh);
- /* When converting to the old mesh format, don't save redundant attributes. */
- names_to_skip.add_multiple_new({".hide_vert",
- ".hide_edge",
- ".hide_poly",
- "material_index",
- ".select_vert",
- ".select_edge",
- ".select_poly"});
/* 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_convert.cc
index f66d7c2b69b,7a4c3c0834b..f0442d4b8bf
--- a/source/blender/blenkernel/intern/mesh_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_convert.cc
@@@ -1080,143 -1102,7 +1080,6 @@@ Mesh *BKE_mesh_new_from_object_to_bmain
return mesh_in_bmain;
}
- static void add_shapekey_layers(Mesh *mesh_dest, Mesh *mesh_src)
- {
- KeyBlock *kb;
- Key *key = mesh_src->key;
- int i;
-
- if (!mesh_src->key) {
- return;
- }
-
- /* ensure we can use mesh vertex count for derived mesh custom data */
- if (mesh_src->totvert != mesh_dest->totvert) {
- CLOG_ERROR(&LOG,
- "vertex size mismatch (mesh/dm) '%s' (%d != %d)",
- mesh_src->id.name + 2,
- mesh_src->totvert,
- mesh_dest->totvert);
- return;
- }
-
- for (i = 0, kb = (KeyBlock *)key->block.first; kb; kb = kb->next, i++) {
- int ci;
- float *array;
-
- if (mesh_src->totvert != kb->totelem) {
- CLOG_ERROR(&LOG,
- "vertex size mismatch (Mesh '%s':%d != KeyBlock '%s':%d)",
- mesh_src->id.name + 2,
- mesh_src->totvert,
- kb->name,
- kb->totelem);
- array = (float *)MEM_calloc_arrayN(size_t(mesh_src->totvert), sizeof(float[3]), __func__);
- }
- else {
- array = (float *)MEM_malloc_arrayN(size_t(mesh_src->totvert), sizeof(float[3]), __func__);
- memcpy(array, kb->data, sizeof(float[3]) * size_t(mesh_src->totvert));
- }
-
- CustomData_add_layer_named(
- &mesh_dest->vdata, CD_SHAPEKEY, CD_ASSIGN, array, mesh_dest->totvert, kb->name);
- ci = CustomData_get_layer_index_n(&mesh_dest->vdata, CD_SHAPEKEY, i);
-
- mesh_dest->vdata.layers[ci].uid = kb->uid;
- }
- }
-
- Mesh *BKE_mesh_create_derived_for_modifier(struct Depsgraph *depsgraph,
- Scene *scene,
- Object *ob_eval,
- ModifierData *md_eval,
- const bool use_virtual_modifiers,
- const bool build_shapekey_layers)
- {
- Mesh *me = ob_eval->runtime.data_orig ? (Mesh *)ob_eval->runtime.data_orig :
- (Mesh *)ob_eval->data;
- const ModifierTypeInfo *mti = BKE_modifier_get_info((ModifierType)md_eval->type);
- Mesh *result = nullptr;
- KeyBlock *kb;
- ModifierEvalContext mectx = {depsgraph, ob_eval, MOD_APPLY_TO_BASE_MESH};
-
- if (!(md_eval->mode & eModifierMode_Realtime)) {
- return result;
- }
-
- if (mti->isDisabled && mti->isDisabled(scene, md_eval, false)) {
- return result;
- }
-
- if (build_shapekey_layers && me->key &&
- (kb = (KeyBlock *)BLI_findlink(&me->key->block, ob_eval->shapenr - 1))) {
- MutableSpan<float3> verts = me->positions_for_write();
- BKE_keyblock_convert_to_mesh(kb, reinterpret_cast<float(*)[3]>(verts.data()), me->totvert);
- }
-
- Mesh *mesh_temp = (Mesh *)BKE_id_copy_ex(nullptr, &me->id, nullptr, LIB_ID_COPY_LOCALIZE);
- int numVerts = 0;
- float(*deformedVerts)[3] = nullptr;
-
- if (use_virtual_modifiers) {
- VirtualModifierData virtualModifierData;
- for (ModifierData *md_eval_virt =
- BKE_modifiers_get_virtual_modifierlist(ob_eval, &virtualModifierData);
- md_eval_virt && (md_eval_virt != ob_eval->modifiers.first);
- md_eval_virt = md_eval_virt->next) {
- if (!BKE_modifier_is_enabled(scene, md_eval_virt, eModifierMode_Realtime)) {
- continue;
- }
- /* All virtual modifiers are deform modifiers. */
- const ModifierTypeInfo *mti_virt = BKE_modifier_get_info((ModifierType)md_eval_virt->type);
- BLI_assert(mti_virt->type == eModifierTypeType_OnlyDeform);
- if (mti_virt->type != eModifierTypeType_OnlyDeform) {
- continue;
- }
-
- if (deformedVerts == nullptr) {
- deformedVerts = BKE_mesh_vert_coords_alloc(me, &numVerts);
- }
- mti_virt->deformVerts(md_eval_virt, &mectx, mesh_temp, deformedVerts, numVerts);
- }
- }
-
- if (mti->type == eModifierTypeType_OnlyDeform) {
- if (deformedVerts == nullptr) {
- deformedVerts = BKE_mesh_vert_coords_alloc(me, &numVerts);
- }
- result = mesh_temp;
- mti->deformVerts(md_eval, &mectx, result, deformedVerts, numVerts);
- BKE_mesh_vert_coords_apply(result, deformedVerts);
-
- if (build_shapekey_layers) {
- add_shapekey_layers(result, me);
- }
- }
- else {
- if (deformedVerts != nullptr) {
- BKE_mesh_vert_coords_apply(mesh_temp, deformedVerts);
- }
-
- if (build_shapekey_layers) {
- add_shapekey_layers(mesh_temp, me);
- }
-
- result = mti->modifyMesh(md_eval, &mectx, mesh_temp);
- ASSERT_IS_VALID_MESH(result);
-
- if (mesh_temp != result) {
- BKE_id_free(nullptr, mesh_temp);
- }
- }
-
- if (deformedVerts != nullptr) {
- MEM_freeN(deformedVerts);
- }
-
- return result;
- }
--
static KeyBlock *keyblock_ensure_from_uid(Key &key, const int uid, const StringRefNull name)
{
if (KeyBlock *kb = BKE_keyblock_find_uid(&key, uid)) {
diff --cc source/blender/blenkernel/intern/mesh_legacy_convert.cc
index d3e93484784,a53b0e66924..f106a89c55c
--- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
@@@ -938,10 -931,11 +938,11 @@@ int BKE_mesh_mface_index_validate(MFac
return nr;
}
- static int mesh_tessface_calc(CustomData *fdata,
+ static int mesh_tessface_calc(Mesh &mesh,
+ CustomData *fdata,
CustomData *ldata,
CustomData *pdata,
- MVert *mvert,
+ float (*positions)[3],
int totface,
int totloop,
int totpoly)
@@@ -1185,10 -1179,11 +1186,11 @@@
void BKE_mesh_tessface_calc(Mesh *mesh)
{
- mesh->totface = mesh_tessface_calc(&mesh->fdata,
+ mesh->totface = mesh_tessface_calc(*mesh,
+ &mesh->fdata,
&mesh->ldata,
&mesh->pdata,
- BKE_mesh_verts_for_write(mesh),
+ BKE_mesh_positions_for_write(mesh),
mesh->totface,
mesh->totloop,
mesh->totpoly);
@@@ -1575,52 -1570,122 +1577,172 @@@ void BKE_mesh_legacy_convert_loose_edge
/** \} */
+/* -------------------------------------------------------------------- */
+/** \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<MVer
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list