forked from blender/blender
main sync #3
@ -130,7 +130,6 @@ bool BM_attribute_stored_in_bmesh_builtin(const StringRef name)
|
|||||||
"sharp_edge");
|
"sharp_edge");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Static function for alloc (duplicate in modifiers_bmesh.c) */
|
|
||||||
static BMFace *bm_face_create_from_mpoly(BMesh &bm,
|
static BMFace *bm_face_create_from_mpoly(BMesh &bm,
|
||||||
Span<MLoop> loops,
|
Span<MLoop> loops,
|
||||||
Span<BMVert *> vtable,
|
Span<BMVert *> vtable,
|
||||||
@ -594,7 +593,7 @@ void BM_mesh_bm_from_me(BMesh *bm, const Mesh *me, const struct BMeshFromMeshPar
|
|||||||
/**
|
/**
|
||||||
* \brief BMesh -> Mesh
|
* \brief BMesh -> Mesh
|
||||||
*/
|
*/
|
||||||
static BMVert **bm_to_mesh_vertex_map(BMesh *bm, int ototvert)
|
static BMVert **bm_to_mesh_vertex_map(BMesh *bm, const int old_verts_num)
|
||||||
{
|
{
|
||||||
const int cd_shape_keyindex_offset = CustomData_get_offset(&bm->vdata, CD_SHAPE_KEYINDEX);
|
const int cd_shape_keyindex_offset = CustomData_get_offset(&bm->vdata, CD_SHAPE_KEYINDEX);
|
||||||
BMVert **vertMap = nullptr;
|
BMVert **vertMap = nullptr;
|
||||||
@ -603,13 +602,13 @@ static BMVert **bm_to_mesh_vertex_map(BMesh *bm, int ototvert)
|
|||||||
BMIter iter;
|
BMIter iter;
|
||||||
|
|
||||||
/* Caller needs to ensure this. */
|
/* Caller needs to ensure this. */
|
||||||
BLI_assert(ototvert > 0);
|
BLI_assert(old_verts_num > 0);
|
||||||
|
|
||||||
vertMap = static_cast<BMVert **>(MEM_callocN(sizeof(*vertMap) * ototvert, "vertMap"));
|
vertMap = static_cast<BMVert **>(MEM_callocN(sizeof(*vertMap) * old_verts_num, "vertMap"));
|
||||||
if (cd_shape_keyindex_offset != -1) {
|
if (cd_shape_keyindex_offset != -1) {
|
||||||
BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
|
BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
|
||||||
const int keyi = BM_ELEM_CD_GET_INT(eve, cd_shape_keyindex_offset);
|
const int keyi = BM_ELEM_CD_GET_INT(eve, cd_shape_keyindex_offset);
|
||||||
if ((keyi != ORIGINDEX_NONE) && (keyi < ototvert) &&
|
if ((keyi != ORIGINDEX_NONE) && (keyi < old_verts_num) &&
|
||||||
/* Not fool-proof, but chances are if we have many verts with the same index,
|
/* Not fool-proof, but chances are if we have many verts with the same index,
|
||||||
* we will want to use the first one,
|
* we will want to use the first one,
|
||||||
* since the second is more likely to be a duplicate. */
|
* since the second is more likely to be a duplicate. */
|
||||||
@ -620,7 +619,7 @@ static BMVert **bm_to_mesh_vertex_map(BMesh *bm, int ototvert)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
|
BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
|
||||||
if (i < ototvert) {
|
if (i < old_verts_num) {
|
||||||
vertMap[i] = eve;
|
vertMap[i] = eve;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -1377,20 +1376,16 @@ static void bm_to_mesh_loops(const BMesh &bm, const Span<const BMLoop *> bm_loop
|
|||||||
|
|
||||||
void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMeshParams *params)
|
void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMeshParams *params)
|
||||||
{
|
{
|
||||||
SCOPED_TIMER_AVERAGED(__func__);
|
|
||||||
using namespace blender;
|
using namespace blender;
|
||||||
const int ototvert = me->totvert;
|
const int old_verts_num = me->totvert;
|
||||||
|
|
||||||
/* Free custom data. */
|
|
||||||
CustomData_free(&me->vdata, me->totvert);
|
CustomData_free(&me->vdata, me->totvert);
|
||||||
CustomData_free(&me->edata, me->totedge);
|
CustomData_free(&me->edata, me->totedge);
|
||||||
CustomData_free(&me->fdata, me->totface);
|
CustomData_free(&me->fdata, me->totface);
|
||||||
CustomData_free(&me->ldata, me->totloop);
|
CustomData_free(&me->ldata, me->totloop);
|
||||||
CustomData_free(&me->pdata, me->totpoly);
|
CustomData_free(&me->pdata, me->totpoly);
|
||||||
|
|
||||||
BKE_mesh_runtime_clear_geometry(me);
|
BKE_mesh_runtime_clear_geometry(me);
|
||||||
|
|
||||||
/* Add new custom data. */
|
|
||||||
me->totvert = bm->totvert;
|
me->totvert = bm->totvert;
|
||||||
me->totedge = bm->totedge;
|
me->totedge = bm->totedge;
|
||||||
me->totface = 0;
|
me->totface = 0;
|
||||||
@ -1533,8 +1528,8 @@ void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMesh
|
|||||||
},
|
},
|
||||||
[&]() {
|
[&]() {
|
||||||
/* Patch hook indices and vertex parents. */
|
/* Patch hook indices and vertex parents. */
|
||||||
if (params->calc_object_remap && (ototvert > 0)) {
|
if (params->calc_object_remap && (old_verts_num > 0)) {
|
||||||
bmesh_to_mesh_calc_object_remap(*bmain, *me, *bm, ototvert);
|
bmesh_to_mesh_calc_object_remap(*bmain, *me, *bm, old_verts_num);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[&]() {
|
[&]() {
|
||||||
@ -1596,7 +1591,6 @@ void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMesh
|
|||||||
void BM_mesh_bm_to_me_for_eval(BMesh *bm, Mesh *me, const CustomData_MeshMasks *cd_mask_extra)
|
void BM_mesh_bm_to_me_for_eval(BMesh *bm, Mesh *me, const CustomData_MeshMasks *cd_mask_extra)
|
||||||
{
|
{
|
||||||
using namespace blender;
|
using namespace blender;
|
||||||
|
|
||||||
/* Must be an empty mesh. */
|
/* Must be an empty mesh. */
|
||||||
BLI_assert(me->totvert == 0);
|
BLI_assert(me->totvert == 0);
|
||||||
BLI_assert(cd_mask_extra == nullptr || (cd_mask_extra->vmask & CD_MASK_SHAPEKEY) == 0);
|
BLI_assert(cd_mask_extra == nullptr || (cd_mask_extra->vmask & CD_MASK_SHAPEKEY) == 0);
|
||||||
@ -1609,7 +1603,7 @@ void BM_mesh_bm_to_me_for_eval(BMesh *bm, Mesh *me, const CustomData_MeshMasks *
|
|||||||
me->totloop = bm->totloop;
|
me->totloop = bm->totloop;
|
||||||
me->totpoly = bm->totface;
|
me->totpoly = bm->totface;
|
||||||
|
|
||||||
/* Don't process shape-keys, we only feed them through the modifier stack as needed,
|
/* Don't process shape-keys. We only feed them through the modifier stack as needed,
|
||||||
* e.g. for applying modifiers or the like. */
|
* e.g. for applying modifiers or the like. */
|
||||||
CustomData_MeshMasks mask = CD_MASK_DERIVEDMESH;
|
CustomData_MeshMasks mask = CD_MASK_DERIVEDMESH;
|
||||||
if (cd_mask_extra != nullptr) {
|
if (cd_mask_extra != nullptr) {
|
||||||
|
Loading…
Reference in New Issue
Block a user