From 3dc222ea7b6ceca6cccf4050ba91a6d3ff9e740f Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 28 Aug 2020 13:58:39 +0200 Subject: Refactor: move defvert .blend IO to blenkernel This is part of T76372. --- source/blender/blenkernel/BKE_deform.h | 7 ++++ source/blender/blenkernel/intern/deform.c | 48 ++++++++++++++++++++++++++++ source/blender/blenloader/intern/readfile.c | 35 ++++---------------- source/blender/blenloader/intern/writefile.c | 23 +++---------- 4 files changed, 66 insertions(+), 47 deletions(-) diff --git a/source/blender/blenkernel/BKE_deform.h b/source/blender/blenkernel/BKE_deform.h index 35111d5240e..a9f81676a7a 100644 --- a/source/blender/blenkernel/BKE_deform.h +++ b/source/blender/blenkernel/BKE_deform.h @@ -35,6 +35,8 @@ struct MLoop; struct MPoly; struct Object; struct bDeformGroup; +struct BlendWriter; +struct BlendDataReader; struct bDeformGroup *BKE_object_defgroup_new(struct Object *ob, const char *name); void BKE_defgroup_copy_list(struct ListBase *lb1, const struct ListBase *lb2); @@ -162,6 +164,11 @@ void BKE_defvert_extract_vgroup_to_polyweights(struct MDeformVert *dvert, void BKE_defvert_weight_to_rgb(float r_rgb[3], const float weight); +void BKE_defvert_blend_write(struct BlendWriter *writer, int count, struct MDeformVert *dvlist); +void BKE_defvert_blend_read(struct BlendDataReader *reader, + int count, + struct MDeformVert *mdverts); + #ifdef __cplusplus } #endif diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c index 1a32deac776..4f5a2740ca6 100644 --- a/source/blender/blenkernel/intern/deform.c +++ b/source/blender/blenkernel/intern/deform.c @@ -50,6 +50,8 @@ #include "BKE_object.h" #include "BKE_object_deform.h" +#include "BLO_read_write.h" + #include "data_transfer_intern.h" bDeformGroup *BKE_object_defgroup_new(Object *ob, const char *name) @@ -1523,3 +1525,49 @@ void BKE_defvert_weight_to_rgb(float r_rgb[3], const float weight) } /** \} */ + +/* -------------------------------------------------------------------- */ +/** \name .blend file I/O + * \{ */ + +void BKE_defvert_blend_write(BlendWriter *writer, int count, MDeformVert *dvlist) +{ + if (dvlist == NULL) { + return; + } + + /* Write the dvert list */ + BLO_write_struct_array(writer, MDeformVert, count, dvlist); + + /* Write deformation data for each dvert */ + for (int i = 0; i < count; i++) { + if (dvlist[i].dw) { + BLO_write_struct_array(writer, MDeformWeight, dvlist[i].totweight, dvlist[i].dw); + } + } +} + +void BKE_defvert_blend_read(BlendDataReader *reader, int count, MDeformVert *mdverts) +{ + if (mdverts == NULL) { + return; + } + + for (int i = count; i > 0; i--, mdverts++) { + /*convert to vgroup allocation system*/ + MDeformWeight *dw; + if (mdverts->dw && (dw = BLO_read_get_new_data_address(reader, mdverts->dw))) { + const ssize_t dw_len = mdverts->totweight * sizeof(MDeformWeight); + void *dw_tmp = MEM_mallocN(dw_len, __func__); + memcpy(dw_tmp, dw, dw_len); + mdverts->dw = dw_tmp; + MEM_freeN(dw); + } + else { + mdverts->dw = NULL; + mdverts->totweight = 0; + } + } +} + +/** \} */ diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index c24db724222..eed85546ab4 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -120,6 +120,7 @@ #include "BKE_constraint.h" #include "BKE_curve.h" #include "BKE_curveprofile.h" +#include "BKE_deform.h" #include "BKE_effect.h" #include "BKE_fcurve.h" #include "BKE_fcurve_driver.h" @@ -4125,29 +4126,6 @@ static void lib_link_mesh(BlendLibReader *reader, Mesh *me) BLO_read_id_address(reader, me->id.lib, &me->texcomesh); } -static void direct_link_dverts(BlendDataReader *reader, int count, MDeformVert *mdverts) -{ - if (mdverts == NULL) { - return; - } - - for (int i = count; i > 0; i--, mdverts++) { - /*convert to vgroup allocation system*/ - MDeformWeight *dw; - if (mdverts->dw && (dw = BLO_read_get_new_data_address(reader, mdverts->dw))) { - const ssize_t dw_len = mdverts->totweight * sizeof(MDeformWeight); - void *dw_tmp = MEM_mallocN(dw_len, "direct_link_dverts"); - memcpy(dw_tmp, dw, dw_len); - mdverts->dw = dw_tmp; - MEM_freeN(dw); - } - else { - mdverts->dw = NULL; - mdverts->totweight = 0; - } - } -} - static void direct_link_mdisps(BlendDataReader *reader, int count, MDisps *mdisps, int external) { if (mdisps) { @@ -4251,9 +4229,9 @@ static void direct_link_mesh(BlendDataReader *reader, Mesh *mesh) BLO_read_data_address(reader, &mesh->adt); BKE_animdata_blend_read_data(reader, mesh->adt); - /* Normally direct_link_dverts should be called in direct_link_customdata, + /* Normally BKE_defvert_blend_read should be called in direct_link_customdata, * but for backwards compatibility in do_versions to work we do it here. */ - direct_link_dverts(reader, mesh->totvert, mesh->dvert); + BKE_defvert_blend_read(reader, mesh->totvert, mesh->dvert); direct_link_customdata(reader, &mesh->vdata, mesh->totvert); direct_link_customdata(reader, &mesh->edata, mesh->totedge); @@ -4277,7 +4255,8 @@ static void direct_link_mesh(BlendDataReader *reader, Mesh *mesh) MultiresLevel *lvl = mesh->mr->levels.first; direct_link_customdata(reader, &mesh->mr->vdata, lvl->totvert); - direct_link_dverts(reader, lvl->totvert, CustomData_get(&mesh->mr->vdata, 0, CD_MDEFORMVERT)); + BKE_defvert_blend_read( + reader, lvl->totvert, CustomData_get(&mesh->mr->vdata, 0, CD_MDEFORMVERT)); direct_link_customdata(reader, &mesh->mr->fdata, lvl->totface); BLO_read_data_address(reader, &mesh->mr->edge_flags); @@ -4338,7 +4317,7 @@ static void direct_link_latt(BlendDataReader *reader, Lattice *lt) BLO_read_data_address(reader, <->def); BLO_read_data_address(reader, <->dvert); - direct_link_dverts(reader, lt->pntsu * lt->pntsv * lt->pntsw, lt->dvert); + BKE_defvert_blend_read(reader, lt->pntsu * lt->pntsv * lt->pntsw, lt->dvert); lt->editlatt = NULL; lt->batch_cache = NULL; @@ -6202,7 +6181,7 @@ static void direct_link_gpencil(BlendDataReader *reader, bGPdata *gpd) /* relink weight data */ if (gps->dvert) { BLO_read_data_address(reader, &gps->dvert); - direct_link_dverts(reader, gps->totpoints, gps->dvert); + BKE_defvert_blend_read(reader, gps->totpoints, gps->dvert); } } } diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 6ce822a09c1..e69f46735d4 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -161,6 +161,7 @@ #include "BKE_constraint.h" #include "BKE_curve.h" #include "BKE_curveprofile.h" +#include "BKE_deform.h" #include "BKE_fcurve.h" #include "BKE_fcurve_driver.h" #include "BKE_global.h" // for G @@ -1784,22 +1785,6 @@ static void write_curve(BlendWriter *writer, Curve *cu, const void *id_address) } } -static void write_dverts(BlendWriter *writer, int count, MDeformVert *dvlist) -{ - if (dvlist) { - - /* Write the dvert list */ - BLO_write_struct_array(writer, MDeformVert, count, dvlist); - - /* Write deformation data for each dvert */ - for (int i = 0; i < count; i++) { - if (dvlist[i].dw) { - BLO_write_struct_array(writer, MDeformWeight, dvlist[i].totweight, dvlist[i].dw); - } - } - } -} - static void write_mdisps(BlendWriter *writer, int count, MDisps *mdlist, int external) { if (mdlist) { @@ -1854,7 +1839,7 @@ static void write_customdata(BlendWriter *writer, if (layer->type == CD_MDEFORMVERT) { /* layer types that allocate own memory need special handling */ - write_dverts(writer, count, layer->data); + BKE_defvert_blend_write(writer, count, layer->data); } else if (layer->type == CD_MDISPS) { write_mdisps(writer, count, layer->data, layer->flag & CD_FLAG_EXTERNAL); @@ -1974,7 +1959,7 @@ static void write_lattice(BlendWriter *writer, Lattice *lt, const void *id_addre /* direct data */ BLO_write_struct_array(writer, BPoint, lt->pntsu * lt->pntsv * lt->pntsw, lt->def); - write_dverts(writer, lt->pntsu * lt->pntsv * lt->pntsw, lt->dvert); + BKE_defvert_blend_write(writer, lt->pntsu * lt->pntsv * lt->pntsw, lt->dvert); } } @@ -2529,7 +2514,7 @@ static void write_gpencil(BlendWriter *writer, bGPdata *gpd, const void *id_addr LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { BLO_write_struct_array(writer, bGPDspoint, gps->totpoints, gps->points); BLO_write_struct_array(writer, bGPDtriangle, gps->tot_triangles, gps->triangles); - write_dverts(writer, gps->totpoints, gps->dvert); + BKE_defvert_blend_write(writer, gps->totpoints, gps->dvert); } } } -- cgit v1.2.3