Refactor: move defvert .blend IO to blenkernel
This is part of T76372.
This commit is contained in:
parent
2bb60db94a
commit
3dc222ea7b
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue