Cleanup: data transfer: get rid of dual destination mesh.

Not needed anymore, we only actually need to know wether it's orig mesh
or eval one in a few places...
This commit is contained in:
Bastien Montagne 2018-06-21 15:17:40 +02:00
parent 1859215576
commit ef90a8e12c
Notes: blender-bot 2023-02-14 11:07:28 +01:00
Referenced by commit 02d1f1482a, Fix mistake in rBef90a8e12caf in data transfer code.
2 changed files with 81 additions and 114 deletions

View File

@ -145,7 +145,7 @@ bool BKE_object_data_transfer_mesh(
struct ReportList *reports);
bool BKE_object_data_transfer_dm(
struct Depsgraph *depsgraph, struct Scene *scene,
struct Object *ob_src, struct Object *ob_dst, struct Mesh *dm_dst,
struct Object *ob_src, struct Object *ob_dst, struct Mesh *me_dst,
const int data_types, bool use_create,
const int map_vert_mode, const int map_edge_mode, const int map_loop_mode, const int map_poly_mode,
struct SpaceTransform *space_transform, const bool auto_transform,

View File

@ -310,21 +310,21 @@ static void data_transfer_dtdata_type_preprocess(
}
static void data_transfer_dtdata_type_postprocess(
Object *UNUSED(ob_src), Object *UNUSED(ob_dst), Mesh *UNUSED(dm_src), Mesh *dm_dst, Mesh *me_dst,
Object *UNUSED(ob_src), Object *UNUSED(ob_dst), Mesh *UNUSED(dm_src), Mesh *me_dst,
const int dtdata_type, const bool changed)
{
if (dtdata_type == DT_TYPE_LNOR) {
/* Bake edited destination loop normals into custom normals again. */
MVert *verts_dst = dm_dst ? dm_dst->mvert : me_dst->mvert;
const int num_verts_dst = dm_dst ? dm_dst->totvert : me_dst->totvert;
MEdge *edges_dst = dm_dst ? dm_dst->medge : me_dst->medge;
const int num_edges_dst = dm_dst ? dm_dst->totedge : me_dst->totedge;
MPoly *polys_dst = dm_dst ? dm_dst->mpoly : me_dst->mpoly;
const int num_polys_dst = dm_dst ? dm_dst->totpoly : me_dst->totpoly;
MLoop *loops_dst = dm_dst ? dm_dst->mloop : me_dst->mloop;
const int num_loops_dst = dm_dst ? dm_dst->totloop : me_dst->totloop;
CustomData *pdata_dst = dm_dst ? &dm_dst->pdata : &me_dst->pdata;
CustomData *ldata_dst = dm_dst ? &dm_dst->ldata : &me_dst->ldata;
MVert *verts_dst = me_dst->mvert;
const int num_verts_dst = me_dst->totvert;
MEdge *edges_dst = me_dst->medge;
const int num_edges_dst = me_dst->totedge;
MPoly *polys_dst = me_dst->mpoly;
const int num_polys_dst = me_dst->totpoly;
MLoop *loops_dst = me_dst->mloop;
const int num_loops_dst = me_dst->totloop;
CustomData *pdata_dst = &me_dst->pdata;
CustomData *ldata_dst = &me_dst->ldata;
const float (*poly_nors_dst)[3] = CustomData_get_layer(pdata_dst, CD_NORMAL);
float (*loop_nors_dst)[3] = CustomData_get_layer(ldata_dst, CD_NORMAL);
@ -760,7 +760,7 @@ static bool data_transfer_layersmapping_cdlayers(
}
static bool data_transfer_layersmapping_generate(
ListBase *r_map, Object *ob_src, Object *ob_dst, Mesh *dm_src, Mesh *dm_dst, Mesh *me_dst,
ListBase *r_map, Object *ob_src, Object *ob_dst, Mesh *dm_src, Mesh *me_dst,
const int elem_type, int cddata_type, int mix_mode, float mix_factor, const float *mix_weights,
const int num_elem_dst, const bool use_create, const bool use_delete, const int fromlayers, const int tolayers,
SpaceTransform *space_transform)
@ -773,11 +773,11 @@ static bool data_transfer_layersmapping_generate(
if (elem_type == ME_VERT) {
if (!(cddata_type & CD_FAKE)) {
cd_src = &dm_src->vdata;
cd_dst = dm_dst ? &dm_dst->vdata : &me_dst->vdata;
cd_dst = &me_dst->vdata;
if (!data_transfer_layersmapping_cdlayers(r_map, cddata_type, mix_mode, mix_factor, mix_weights,
num_elem_dst, use_create, use_delete,
cd_src, cd_dst, dm_dst != NULL,
cd_src, cd_dst, me_dst != ob_dst->data,
fromlayers, tolayers,
interp, interp_data))
{
@ -793,23 +793,16 @@ static bool data_transfer_layersmapping_generate(
const uint64_t data_flag = 0;
if (!(dm_src->cd_flag & ME_CDFLAG_VERT_BWEIGHT)) {
if (use_delete && !dm_dst) {
if (use_delete) {
me_dst->cd_flag &= ~ME_CDFLAG_VERT_BWEIGHT;
}
return true;
}
if (dm_dst) {
dm_dst->cd_flag |= ME_CDFLAG_VERT_BWEIGHT;
}
else {
me_dst->cd_flag |= ME_CDFLAG_VERT_BWEIGHT;
}
me_dst->cd_flag |= ME_CDFLAG_VERT_BWEIGHT;
if (r_map) {
data_transfer_layersmapping_add_item(r_map, cddata_type, mix_mode, mix_factor, mix_weights,
dm_src->mvert,
dm_dst ? dm_dst->mvert : me_dst->mvert,
dm_src->totvert,
dm_dst ? dm_dst->totvert : me_dst->totvert,
dm_src->mvert, me_dst->mvert,
dm_src->totvert, me_dst->totvert,
elem_size, data_size, data_offset, data_flag,
data_transfer_interp_char, interp_data);
}
@ -819,11 +812,11 @@ static bool data_transfer_layersmapping_generate(
bool ret;
cd_src = &dm_src->vdata;
cd_dst = dm_dst ? &dm_dst->vdata : &me_dst->vdata;
cd_dst = &me_dst->vdata;
ret = data_transfer_layersmapping_vgroups(r_map, mix_mode, mix_factor, mix_weights,
num_elem_dst, use_create, use_delete,
ob_src, ob_dst, cd_src, cd_dst, dm_dst != NULL,
ob_src, ob_dst, cd_src, cd_dst, me_dst != ob_dst->data,
fromlayers, tolayers);
/* Mesh stores its dvert in a specific pointer too. :( */
@ -838,11 +831,11 @@ static bool data_transfer_layersmapping_generate(
else if (elem_type == ME_EDGE) {
if (!(cddata_type & CD_FAKE)) { /* Unused for edges, currently... */
cd_src = &dm_src->edata;
cd_dst = dm_dst ? &dm_dst->edata : &me_dst->edata;
cd_dst = &me_dst->edata;
if (!data_transfer_layersmapping_cdlayers(r_map, cddata_type, mix_mode, mix_factor, mix_weights,
num_elem_dst, use_create, use_delete,
cd_src, cd_dst, dm_dst != NULL,
cd_src, cd_dst, me_dst != ob_dst->data,
fromlayers, tolayers,
interp, interp_data))
{
@ -858,23 +851,16 @@ static bool data_transfer_layersmapping_generate(
const uint64_t data_flag = 0;
if (!(dm_src->cd_flag & ME_CDFLAG_EDGE_CREASE)) {
if (use_delete && !dm_dst) {
if (use_delete && !me_dst) {
me_dst->cd_flag &= ~ME_CDFLAG_EDGE_CREASE;
}
return true;
}
if (dm_dst) {
dm_dst->cd_flag |= ME_CDFLAG_EDGE_CREASE;
}
else {
me_dst->cd_flag |= ME_CDFLAG_EDGE_CREASE;
}
me_dst->cd_flag |= ME_CDFLAG_EDGE_CREASE;
if (r_map) {
data_transfer_layersmapping_add_item(r_map, cddata_type, mix_mode, mix_factor, mix_weights,
dm_src->medge,
dm_dst ? dm_dst->medge : me_dst->medge,
dm_src->totedge,
dm_dst ? dm_dst->totedge : me_dst->totedge,
dm_src->medge, me_dst->medge,
dm_src->totedge, me_dst->totedge,
elem_size, data_size, data_offset, data_flag,
data_transfer_interp_char, interp_data);
}
@ -887,23 +873,16 @@ static bool data_transfer_layersmapping_generate(
const uint64_t data_flag = 0;
if (!(dm_src->cd_flag & ME_CDFLAG_EDGE_BWEIGHT)) {
if (use_delete && !dm_dst) {
if (use_delete && !me_dst) {
me_dst->cd_flag &= ~ME_CDFLAG_EDGE_BWEIGHT;
}
return true;
}
if (dm_dst) {
dm_dst->cd_flag |= ME_CDFLAG_EDGE_BWEIGHT;
}
else {
me_dst->cd_flag |= ME_CDFLAG_EDGE_BWEIGHT;
}
me_dst->cd_flag |= ME_CDFLAG_EDGE_BWEIGHT;
if (r_map) {
data_transfer_layersmapping_add_item(r_map, cddata_type, mix_mode, mix_factor, mix_weights,
dm_src->medge,
dm_dst ? dm_dst->medge : me_dst->medge,
dm_src->totedge,
dm_dst ? dm_dst->totedge : me_dst->totedge,
dm_src->medge, me_dst->medge,
dm_src->totedge, me_dst->totedge,
elem_size, data_size, data_offset, data_flag,
data_transfer_interp_char, interp_data);
}
@ -917,10 +896,8 @@ static bool data_transfer_layersmapping_generate(
data_transfer_layersmapping_add_item(
r_map, cddata_type, mix_mode, mix_factor, mix_weights,
dm_src->medge,
dm_dst ? dm_dst->medge : me_dst->medge,
dm_src->totedge,
dm_dst ? dm_dst->totedge : me_dst->totedge,
dm_src->medge, me_dst->medge,
dm_src->totedge, me_dst->totedge,
elem_size, data_size, data_offset, data_flag, NULL, interp_data);
return true;
}
@ -941,11 +918,11 @@ static bool data_transfer_layersmapping_generate(
if (!(cddata_type & CD_FAKE)) {
cd_src = &dm_src->ldata;
cd_dst = dm_dst ? &dm_dst->ldata : &me_dst->ldata;
cd_dst = &me_dst->ldata;
if (!data_transfer_layersmapping_cdlayers(
r_map, cddata_type, mix_mode, mix_factor, mix_weights,
num_elem_dst, use_create, use_delete, cd_src, cd_dst, dm_dst != NULL,
num_elem_dst, use_create, use_delete, cd_src, cd_dst, me_dst != ob_dst->data,
fromlayers, tolayers,
interp, interp_data))
{
@ -965,11 +942,11 @@ static bool data_transfer_layersmapping_generate(
if (!(cddata_type & CD_FAKE)) {
cd_src = &dm_src->pdata;
cd_dst = dm_dst ? &dm_dst->pdata : &me_dst->pdata;
cd_dst = &me_dst->pdata;
if (!data_transfer_layersmapping_cdlayers(
r_map, cddata_type, mix_mode, mix_factor, mix_weights,
num_elem_dst, use_create, use_delete, cd_src, cd_dst, dm_dst != NULL,
num_elem_dst, use_create, use_delete, cd_src, cd_dst, me_dst != ob_dst->data,
fromlayers, tolayers,
interp, interp_data))
{
@ -986,10 +963,8 @@ static bool data_transfer_layersmapping_generate(
data_transfer_layersmapping_add_item(
r_map, cddata_type, mix_mode, mix_factor, mix_weights,
dm_src->mpoly,
dm_dst ? dm_dst->mpoly : me_dst->mpoly,
dm_src->totpoly,
dm_dst ? dm_dst->totpoly : me_dst->totpoly,
dm_src->mpoly, me_dst->mpoly,
dm_src->totpoly, me_dst->totpoly,
elem_size, data_size, data_offset, data_flag, NULL, interp_data);
return true;
}
@ -1056,35 +1031,35 @@ void BKE_object_data_transfer_layout(
const int num_elem_dst = me_dst->totvert;
data_transfer_layersmapping_generate(
NULL, ob_src, ob_dst, dm_src, NULL, me_dst, ME_VERT, cddata_type, 0, 0.0f, NULL,
NULL, ob_src, ob_dst, dm_src, me_dst, ME_VERT, cddata_type, 0, 0.0f, NULL,
num_elem_dst, use_create, use_delete, fromlayers, tolayers, NULL);
}
if (DT_DATATYPE_IS_EDGE(dtdata_type)) {
const int num_elem_dst = me_dst->totedge;
data_transfer_layersmapping_generate(
NULL, ob_src, ob_dst, dm_src, NULL, me_dst, ME_EDGE, cddata_type, 0, 0.0f, NULL,
NULL, ob_src, ob_dst, dm_src, me_dst, ME_EDGE, cddata_type, 0, 0.0f, NULL,
num_elem_dst, use_create, use_delete, fromlayers, tolayers, NULL);
}
if (DT_DATATYPE_IS_LOOP(dtdata_type)) {
const int num_elem_dst = me_dst->totloop;
data_transfer_layersmapping_generate(
NULL, ob_src, ob_dst, dm_src, NULL, me_dst, ME_LOOP, cddata_type, 0, 0.0f, NULL,
NULL, ob_src, ob_dst, dm_src, me_dst, ME_LOOP, cddata_type, 0, 0.0f, NULL,
num_elem_dst, use_create, use_delete, fromlayers, tolayers, NULL);
}
if (DT_DATATYPE_IS_POLY(dtdata_type)) {
const int num_elem_dst = me_dst->totpoly;
data_transfer_layersmapping_generate(
NULL, ob_src, ob_dst, dm_src, NULL, me_dst, ME_POLY, cddata_type, 0, 0.0f, NULL,
NULL, ob_src, ob_dst, dm_src, me_dst, ME_POLY, cddata_type, 0, 0.0f, NULL,
num_elem_dst, use_create, use_delete, fromlayers, tolayers, NULL);
}
}
}
bool BKE_object_data_transfer_dm(
struct Depsgraph *depsgraph, Scene *scene, Object *ob_src, Object *ob_dst, Mesh *dm_dst,
struct Depsgraph *depsgraph, Scene *scene, Object *ob_src, Object *ob_dst, Mesh *me_dst,
const int data_types, bool use_create, const int map_vert_mode, const int map_edge_mode,
const int map_loop_mode, const int map_poly_mode, SpaceTransform *space_transform, const bool auto_transform,
const float max_distance, const float ray_radius, const float islands_handling_precision,
@ -1101,7 +1076,6 @@ bool BKE_object_data_transfer_dm(
SpaceTransform auto_space_transform;
Mesh *dm_src;
Mesh *me_dst;
bool dirty_nors_dst = true; /* Assumed always true if not using a dm as destination. */
int i;
@ -1120,21 +1094,18 @@ bool BKE_object_data_transfer_dm(
BLI_assert((ob_src != ob_dst) && (ob_src->type == OB_MESH) && (ob_dst->type == OB_MESH));
me_dst = ob_dst->data;
if (dm_dst) {
dirty_nors_dst = (dm_dst->runtime.cd_dirty_vert & CD_NORMAL) != 0;
if (me_dst) {
dirty_nors_dst = (me_dst->runtime.cd_dirty_vert & CD_NORMAL) != 0;
/* Never create needed custom layers on passed destination mesh
* (assumed to *not* be ob_dst->data, aka modifier case). */
use_create = false;
}
else {
me_dst = ob_dst->data;
}
if (vgroup_name) {
if (dm_dst) {
mdef = CustomData_get_layer(&dm_dst->vdata, CD_MDEFORMVERT);
}
else {
mdef = CustomData_get_layer(&me_dst->vdata, CD_MDEFORMVERT);
}
mdef = CustomData_get_layer(&me_dst->vdata, CD_MDEFORMVERT);
if (mdef) {
vg_idx = defgroup_name_index(ob_dst, vgroup_name);
}
@ -1156,14 +1127,11 @@ bool BKE_object_data_transfer_dm(
}
if (auto_transform) {
MVert *verts_dst = dm_dst ? dm_dst->mvert : me_dst->mvert;
const int num_verts_dst = dm_dst ? dm_dst->totvert : me_dst->totvert;
if (space_transform == NULL) {
space_transform = &auto_space_transform;
}
BKE_mesh_remap_find_best_match_from_dm(verts_dst, num_verts_dst, dm_src, space_transform);
BKE_mesh_remap_find_best_match_from_dm(me_dst->mvert, me_dst->totvert, dm_src, space_transform);
}
/* Check all possible data types.
@ -1177,8 +1145,7 @@ bool BKE_object_data_transfer_dm(
continue;
}
data_transfer_dtdata_type_preprocess(
dm_src, dm_dst ? dm_dst : me_dst, dtdata_type, dirty_nors_dst);
data_transfer_dtdata_type_preprocess(dm_src, me_dst, dtdata_type, dirty_nors_dst);
cddata_type = BKE_object_data_transfer_dttype_to_cdtype(dtdata_type);
@ -1192,8 +1159,8 @@ bool BKE_object_data_transfer_dm(
}
if (DT_DATATYPE_IS_VERT(dtdata_type)) {
MVert *verts_dst = dm_dst ? dm_dst->mvert : me_dst->mvert;
const int num_verts_dst = dm_dst ? dm_dst->totvert : me_dst->totvert;
MVert *verts_dst = me_dst->mvert;
const int num_verts_dst = me_dst->totvert;
if (!geom_map_init[VDATA]) {
const int num_verts_src = dm_src->totvert;
@ -1234,7 +1201,7 @@ bool BKE_object_data_transfer_dm(
}
if (data_transfer_layersmapping_generate(
&lay_map, ob_src, ob_dst, dm_src, dm_dst, me_dst, ME_VERT,
&lay_map, ob_src, ob_dst, dm_src, me_dst, ME_VERT,
cddata_type, mix_mode, mix_factor, weights[VDATA],
num_verts_dst, use_create, use_delete, fromlayers, tolayers, space_transform))
{
@ -1250,10 +1217,10 @@ bool BKE_object_data_transfer_dm(
}
}
if (DT_DATATYPE_IS_EDGE(dtdata_type)) {
MVert *verts_dst = dm_dst ? dm_dst->mvert : me_dst->mvert;
const int num_verts_dst = dm_dst ? dm_dst->totvert : me_dst->totvert;
MEdge *edges_dst = dm_dst ? dm_dst->medge : me_dst->medge;
const int num_edges_dst = dm_dst ? dm_dst->totedge : me_dst->totedge;
MVert *verts_dst = me_dst->mvert;
const int num_verts_dst = me_dst->totvert;
MEdge *edges_dst = me_dst->medge;
const int num_edges_dst = me_dst->totedge;
if (!geom_map_init[EDATA]) {
const int num_edges_src = dm_src->totedge;
@ -1291,7 +1258,7 @@ bool BKE_object_data_transfer_dm(
}
if (data_transfer_layersmapping_generate(
&lay_map, ob_src, ob_dst, dm_src, dm_dst, me_dst, ME_EDGE,
&lay_map, ob_src, ob_dst, dm_src, me_dst, ME_EDGE,
cddata_type, mix_mode, mix_factor, weights[EDATA],
num_edges_dst, use_create, use_delete, fromlayers, tolayers, space_transform))
{
@ -1307,16 +1274,16 @@ bool BKE_object_data_transfer_dm(
}
}
if (DT_DATATYPE_IS_LOOP(dtdata_type)) {
MVert *verts_dst = dm_dst ? dm_dst->mvert : me_dst->mvert;
const int num_verts_dst = dm_dst ? dm_dst->totvert : me_dst->totvert;
MEdge *edges_dst = dm_dst ? dm_dst->medge : me_dst->medge;
const int num_edges_dst = dm_dst ? dm_dst->totedge : me_dst->totedge;
MPoly *polys_dst = dm_dst ? dm_dst->mpoly : me_dst->mpoly;
const int num_polys_dst = dm_dst ? dm_dst->totpoly : me_dst->totpoly;
MLoop *loops_dst = dm_dst ? dm_dst->mloop : me_dst->mloop;
const int num_loops_dst = dm_dst ? dm_dst->totloop : me_dst->totloop;
CustomData *pdata_dst = dm_dst ? &dm_dst->pdata : &me_dst->pdata;
CustomData *ldata_dst = dm_dst ? &dm_dst->ldata : &me_dst->ldata;
MVert *verts_dst = me_dst->mvert;
const int num_verts_dst = me_dst->totvert;
MEdge *edges_dst = me_dst->medge;
const int num_edges_dst = me_dst->totedge;
MPoly *polys_dst = me_dst->mpoly;
const int num_polys_dst = me_dst->totpoly;
MLoop *loops_dst = me_dst->mloop;
const int num_loops_dst = me_dst->totloop;
CustomData *pdata_dst = &me_dst->pdata;
CustomData *ldata_dst = &me_dst->ldata;
MeshRemapIslandsCalc island_callback = data_transfer_get_loop_islands_generator(cddata_type);
@ -1346,7 +1313,7 @@ bool BKE_object_data_transfer_dm(
verts_dst, num_verts_dst, edges_dst, num_edges_dst,
loops_dst, num_loops_dst, polys_dst, num_polys_dst,
ldata_dst, pdata_dst,
((dm_dst ? dm_dst : me_dst)->flag & ME_AUTOSMOOTH) != 0, (dm_dst ? dm_dst : me_dst)->smoothresh, dirty_nors_dst,
(me_dst->flag & ME_AUTOSMOOTH) != 0, me_dst->smoothresh, dirty_nors_dst,
dm_src,
island_callback, islands_handling_precision, &geom_map[LDATA]);
geom_map_init[LDATA] = true;
@ -1360,7 +1327,7 @@ bool BKE_object_data_transfer_dm(
}
if (data_transfer_layersmapping_generate(
&lay_map, ob_src, ob_dst, dm_src, dm_dst, me_dst, ME_LOOP,
&lay_map, ob_src, ob_dst, dm_src, me_dst, ME_LOOP,
cddata_type, mix_mode, mix_factor, weights[LDATA],
num_loops_dst, use_create, use_delete, fromlayers, tolayers, space_transform))
{
@ -1376,13 +1343,13 @@ bool BKE_object_data_transfer_dm(
}
}
if (DT_DATATYPE_IS_POLY(dtdata_type)) {
MVert *verts_dst = dm_dst ? dm_dst->mvert : me_dst->mvert;
const int num_verts_dst = dm_dst ? dm_dst->totvert : me_dst->totvert;
MPoly *polys_dst = dm_dst ? dm_dst->mpoly : me_dst->mpoly;
const int num_polys_dst = dm_dst ? dm_dst->totpoly : me_dst->totpoly;
MLoop *loops_dst = dm_dst ? dm_dst->mloop : me_dst->mloop;
const int num_loops_dst = dm_dst ? dm_dst->totloop : me_dst->totloop;
CustomData *pdata_dst = dm_dst ? &dm_dst->pdata : &me_dst->pdata;
MVert *verts_dst = me_dst->mvert;
const int num_verts_dst = me_dst->totvert;
MPoly *polys_dst = me_dst->mpoly;
const int num_polys_dst = me_dst->totpoly;
MLoop *loops_dst = me_dst->mloop;
const int num_loops_dst = me_dst->totloop;
CustomData *pdata_dst = &me_dst->pdata;
if (!geom_map_init[PDATA]) {
const int num_polys_src = dm_src->totpoly;
@ -1421,7 +1388,7 @@ bool BKE_object_data_transfer_dm(
}
if (data_transfer_layersmapping_generate(
&lay_map, ob_src, ob_dst, dm_src, dm_dst, me_dst, ME_POLY,
&lay_map, ob_src, ob_dst, dm_src, me_dst, ME_POLY,
cddata_type, mix_mode, mix_factor, weights[PDATA],
num_polys_dst, use_create, use_delete, fromlayers, tolayers, space_transform))
{
@ -1437,7 +1404,7 @@ bool BKE_object_data_transfer_dm(
}
}
data_transfer_dtdata_type_postprocess(ob_src, ob_dst, dm_src, dm_dst, me_dst, dtdata_type, changed);
data_transfer_dtdata_type_postprocess(ob_src, ob_dst, dm_src, me_dst, dtdata_type, changed);
}
for (i = 0; i < DATAMAX; i++) {