[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