From adcb7a2ce7c3ec79f2b30cc1cef02aa1ea9e7690 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Tue, 23 Jun 2020 16:51:43 +0200 Subject: Refactor: move blenloader code of surface deform modifier --- .../blender/modifiers/intern/MOD_surfacedeform.c | 64 +++++++++++++++++++++- 1 file changed, 62 insertions(+), 2 deletions(-) (limited to 'source/blender/modifiers/intern/MOD_surfacedeform.c') diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c index e1bc6305b0a..fc41afb6613 100644 --- a/source/blender/modifiers/intern/MOD_surfacedeform.c +++ b/source/blender/modifiers/intern/MOD_surfacedeform.c @@ -47,6 +47,8 @@ #include "UI_interface.h" #include "UI_resources.h" +#include "BLO_read_write.h" + #include "RNA_access.h" #include "DEG_depsgraph.h" @@ -1438,6 +1440,64 @@ static void panelRegister(ARegionType *region_type) modifier_panel_register(region_type, eModifierType_SurfaceDeform, panel_draw); } +static void blendWrite(BlendWriter *writer, const ModifierData *md) +{ + const SurfaceDeformModifierData *smd = (const 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++) { + BLO_write_uint32_array( + writer, 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) { + BLO_write_float3_array(writer, 1, smd->verts[i].binds[j].vert_weights); + } + else { + BLO_write_float_array( + writer, smd->verts[i].binds[j].numverts, smd->verts[i].binds[j].vert_weights); + } + } + } + } + } +} + +static void blendRead(BlendDataReader *reader, ModifierData *md) +{ + SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md; + + BLO_read_data_address(reader, &smd->verts); + + if (smd->verts) { + for (int i = 0; i < smd->numverts; i++) { + BLO_read_data_address(reader, &smd->verts[i].binds); + + if (smd->verts[i].binds) { + for (int j = 0; j < smd->verts[i].numbinds; j++) { + BLO_read_uint32_array( + reader, 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) { + BLO_read_float3_array(reader, 1, &smd->verts[i].binds[j].vert_weights); + } + else { + BLO_read_float_array( + reader, smd->verts[i].binds[j].numverts, &smd->verts[i].binds[j].vert_weights); + } + } + } + } + } +} + ModifierTypeInfo modifierType_SurfaceDeform = { /* name */ "SurfaceDeform", /* structName */ "SurfaceDeformModifierData", @@ -1468,6 +1528,6 @@ ModifierTypeInfo modifierType_SurfaceDeform = { /* foreachTexLink */ NULL, /* freeRuntimeData */ NULL, /* panelRegister */ panelRegister, - /* blendWrite */ NULL, - /* blendRead */ NULL, + /* blendWrite */ blendWrite, + /* blendRead */ blendRead, }; -- cgit v1.2.3