Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacques Lucke <jacques@blender.org>2020-08-28 14:58:39 +0300
committerJacques Lucke <jacques@blender.org>2020-08-28 15:30:45 +0300
commit3dc222ea7b6ceca6cccf4050ba91a6d3ff9e740f (patch)
tree9a7176cfce251ee878101b32eb315f6991f90f1e /source/blender/blenkernel
parent2bb60db94a25e69dd8527c3523a8ac1afdd0520d (diff)
Refactor: move defvert .blend IO to blenkernel
This is part of T76372.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_deform.h7
-rw-r--r--source/blender/blenkernel/intern/deform.c48
2 files changed, 55 insertions, 0 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;
+ }
+ }
+}
+
+/** \} */