[Bf-blender-cvs] [cfa101cf467] blenloader-api: update surface deform modifier
Jacques Lucke
noreply at git.blender.org
Sat Mar 7 19:09:27 CET 2020
Commit: cfa101cf46756bae274252852397044b25936ecc
Author: Jacques Lucke
Date: Sat Mar 7 17:59:22 2020 +0100
Branches: blenloader-api
https://developer.blender.org/rBcfa101cf46756bae274252852397044b25936ecc
update surface deform modifier
===================================================================
M source/blender/blenloader/BLO_callback_api.h
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/writefile.c
M source/blender/modifiers/intern/MOD_surfacedeform.c
===================================================================
diff --git a/source/blender/blenloader/BLO_callback_api.h b/source/blender/blenloader/BLO_callback_api.h
index 84d106da5a1..99be5aa40b5 100644
--- a/source/blender/blenloader/BLO_callback_api.h
+++ b/source/blender/blenloader/BLO_callback_api.h
@@ -55,6 +55,8 @@ void BLO_read_list(BloReader *reader, struct ListBase *list, BloLinkListFn callb
#define BLO_read_array_int32(reader, ptr, array_size) \
BLO_read_array_endian_corrected(reader, int32, ptr, array_size)
+#define BLO_read_array_uint32(reader, ptr, array_size) \
+ BLO_read_array_endian_corrected(reader, uint32, ptr, array_size)
#define BLO_read_array_float(reader, ptr, array_size) \
BLO_read_array_endian_corrected(reader, float, ptr, array_size)
#define BLO_read_array_float3(reader, ptr, array_size) \
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index fe0ac010171..7254555aae4 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5500,43 +5500,6 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb, Object *ob)
msmcd->reader = NULL;
msmcd->reader_object_path[0] = '\0';
}
- else if (md->type == eModifierType_SurfaceDeform) {
- SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md;
-
- smd->verts = newdataadr(fd, smd->verts);
-
- if (smd->verts) {
- for (int i = 0; i < smd->numverts; i++) {
- smd->verts[i].binds = newdataadr(fd, smd->verts[i].binds);
-
- if (smd->verts[i].binds) {
- for (int j = 0; j < smd->verts[i].numbinds; j++) {
- smd->verts[i].binds[j].vert_inds = newdataadr(fd, smd->verts[i].binds[j].vert_inds);
- smd->verts[i].binds[j].vert_weights = newdataadr(
- fd, smd->verts[i].binds[j].vert_weights);
-
- if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
- if (smd->verts[i].binds[j].vert_inds) {
- BLI_endian_switch_uint32_array(smd->verts[i].binds[j].vert_inds,
- smd->verts[i].binds[j].numverts);
- }
-
- if (smd->verts[i].binds[j].vert_weights) {
- if (smd->verts[i].binds[j].mode == MOD_SDEF_MODE_CENTROID ||
- smd->verts[i].binds[j].mode == MOD_SDEF_MODE_LOOPTRI) {
- BLI_endian_switch_float_array(smd->verts[i].binds[j].vert_weights, 3);
- }
- else {
- BLI_endian_switch_float_array(smd->verts[i].binds[j].vert_weights,
- smd->verts[i].binds[j].numverts);
- }
- }
- }
- }
- }
- }
- }
- }
else if (md->type == eModifierType_Bevel) {
BevelModifierData *bmd = (BevelModifierData *)md;
bmd->custom_profile = newdataadr(fd, bmd->custom_profile);
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 51fe6c9b0fc..99bdc1b71f2 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1677,37 +1677,6 @@ static void write_modifiers(WriteData *wd, ListBase *modbase)
writedata(wd, DATA, sizeof(float[3]) * csmd->bind_coords_num, csmd->bind_coords);
}
}
- else if (md->type == eModifierType_SurfaceDeform) {
- SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md;
-
- writestruct(wd, DATA, SDefVert, smd->numverts, smd->verts);
-
- if (smd->verts) {
- for (int i = 0; i < smd->numverts; i++) {
- writestruct(wd, DATA, SDefBind, smd->verts[i].numbinds, smd->verts[i].binds);
-
- if (smd->verts[i].binds) {
- for (int j = 0; j < smd->verts[i].numbinds; j++) {
- writedata(wd,
- DATA,
- sizeof(int) * smd->verts[i].binds[j].numverts,
- smd->verts[i].binds[j].vert_inds);
-
- if (smd->verts[i].binds[j].mode == MOD_SDEF_MODE_CENTROID ||
- smd->verts[i].binds[j].mode == MOD_SDEF_MODE_LOOPTRI) {
- writedata(wd, DATA, sizeof(float) * 3, smd->verts[i].binds[j].vert_weights);
- }
- else {
- writedata(wd,
- DATA,
- sizeof(float) * smd->verts[i].binds[j].numverts,
- smd->verts[i].binds[j].vert_weights);
- }
- }
- }
- }
- }
- }
else if (md->type == eModifierType_Bevel) {
BevelModifierData *bmd = (BevelModifierData *)md;
if (bmd->custom_profile) {
diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c
index a0b5a1c7456..c3eded956fb 100644
--- a/source/blender/modifiers/intern/MOD_surfacedeform.c
+++ b/source/blender/modifiers/intern/MOD_surfacedeform.c
@@ -41,6 +41,8 @@
#include "MEM_guardedalloc.h"
+#include "BLO_callback_api.h"
+
#include "MOD_util.h"
typedef struct SDefAdjacency {
@@ -203,6 +205,58 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
}
}
+static void bloWrite(BloWriter *writer, const ModifierData *md)
+{
+ SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md;
+
+ BLO_write_struct_array(writer, SDefVert, smd->numverts, smd->verts);
+ if (smd->verts) {
+ for (int i = 0; i < smd->numverts; i++) {
+ BLO_write_struct_array(writer, SDefBind, smd->verts[i].numbinds, smd->verts[i].binds);
+
+ if (smd->verts[i].binds) {
+ for (int j = 0; j < smd->verts[i].numbinds; j++) {
+ SDefBind *bind = &smd->verts[i].binds[j];
+ BLO_write_raw_array(writer, sizeof(int), bind->numverts, bind->vert_inds);
+
+ if (ELEM(bind->mode, MOD_SDEF_MODE_CENTROID, MOD_SDEF_MODE_LOOPTRI)) {
+ BLO_write_raw(writer, sizeof(float) * 3, bind->vert_weights);
+ }
+ else {
+ BLO_write_raw_array(writer, sizeof(float), bind->numverts, bind->vert_weights);
+ }
+ }
+ }
+ }
+ }
+}
+
+static void bloRead(BloReader *reader, ModifierData *md)
+{
+ SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md;
+
+ BLO_read_update_address(reader, smd->verts);
+ if (smd->verts) {
+ for (int i = 0; i < smd->numverts; i++) {
+ BLO_read_update_address(reader, smd->verts[i].binds);
+
+ if (smd->verts[i].binds) {
+ for (int j = 0; j < smd->verts[i].numbinds; j++) {
+ SDefBind *bind = &smd->verts[i].binds[j];
+ BLO_read_array_uint32(reader, bind->vert_inds, bind->numverts);
+
+ if (ELEM(bind->mode, MOD_SDEF_MODE_CENTROID, MOD_SDEF_MODE_LOOPTRI)) {
+ BLO_read_array_float3(reader, bind->vert_weights, 1);
+ }
+ else {
+ BLO_read_array_float(reader, bind->vert_weights, bind->numverts);
+ }
+ }
+ }
+ }
+ }
+}
+
static void freeAdjacencyMap(SDefAdjacencyArray *const vert_edges,
SDefAdjacency *const adj_ref,
SDefEdgePolys *const edge_polys)
@@ -1315,6 +1369,6 @@ ModifierTypeInfo modifierType_SurfaceDeform = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
- /* bloWrite */ NULL,
- /* bloRead */ NULL,
+ /* bloWrite */ bloWrite,
+ /* bloRead */ bloRead,
};
More information about the Bf-blender-cvs
mailing list