diff options
Diffstat (limited to 'source/blender/modifiers/intern/MOD_armature.c')
-rw-r--r-- | source/blender/modifiers/intern/MOD_armature.c | 124 |
1 files changed, 55 insertions, 69 deletions
diff --git a/source/blender/modifiers/intern/MOD_armature.c b/source/blender/modifiers/intern/MOD_armature.c index ad8d6ac8b8a..b62c03d1b03 100644 --- a/source/blender/modifiers/intern/MOD_armature.c +++ b/source/blender/modifiers/intern/MOD_armature.c @@ -34,9 +34,9 @@ #include "DNA_screen_types.h" #include "BKE_action.h" +#include "BKE_armature.h" #include "BKE_context.h" #include "BKE_editmesh.h" -#include "BKE_lattice.h" #include "BKE_lib_id.h" #include "BKE_lib_query.h" #include "BKE_mesh.h" @@ -49,6 +49,8 @@ #include "RNA_access.h" +#include "BLO_read_write.h" + #include "DEG_depsgraph_query.h" #include "bmesh.h" @@ -74,7 +76,7 @@ static void copyData(const ModifierData *md, ModifierData *target, const int fla ArmatureModifierData *tamd = (ArmatureModifierData *)target; BKE_modifier_copydata_generic(md, target, flag); - tamd->prevCos = NULL; + tamd->vert_coords_prev = NULL; } static void requiredDataMask(Object *UNUSED(ob), @@ -146,88 +148,64 @@ static void deformVerts(ModifierData *md, MOD_previous_vcos_store(md, vertexCos); /* if next modifier needs original vertices */ - armature_deform_verts(amd->object, - ctx->object, - mesh, - vertexCos, - NULL, - numVerts, - amd->deformflag, - (float(*)[3])amd->prevCos, - amd->defgrp_name, - NULL); + BKE_armature_deform_coords_with_mesh(amd->object, + ctx->object, + vertexCos, + NULL, + numVerts, + amd->deformflag, + amd->vert_coords_prev, + amd->defgrp_name, + mesh); /* free cache */ - if (amd->prevCos) { - MEM_freeN(amd->prevCos); - amd->prevCos = NULL; - } + MEM_SAFE_FREE(amd->vert_coords_prev); } static void deformVertsEM(ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *em, - Mesh *mesh, + Mesh *UNUSED(mesh), float (*vertexCos)[3], int numVerts) { ArmatureModifierData *amd = (ArmatureModifierData *)md; - Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, em, mesh, NULL, numVerts, false, false); - - /* TODO(Campbell): use edit-mode data only (remove this line). */ - if (mesh_src != NULL) { - BKE_mesh_wrapper_ensure_mdata(mesh_src); - } MOD_previous_vcos_store(md, vertexCos); /* if next modifier needs original vertices */ - armature_deform_verts(amd->object, - ctx->object, - mesh_src, - vertexCos, - NULL, - numVerts, - amd->deformflag, - (float(*)[3])amd->prevCos, - amd->defgrp_name, - NULL); + BKE_armature_deform_coords_with_editmesh(amd->object, + ctx->object, + vertexCos, + NULL, + numVerts, + amd->deformflag, + amd->vert_coords_prev, + amd->defgrp_name, + em); /* free cache */ - if (amd->prevCos) { - MEM_freeN(amd->prevCos); - amd->prevCos = NULL; - } - - if (mesh_src != mesh) { - BKE_id_free(NULL, mesh_src); - } + MEM_SAFE_FREE(amd->vert_coords_prev); } static void deformMatricesEM(ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *em, - Mesh *mesh, + Mesh *UNUSED(mesh), float (*vertexCos)[3], float (*defMats)[3][3], int numVerts) { ArmatureModifierData *amd = (ArmatureModifierData *)md; - Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, em, mesh, NULL, numVerts, false, false); - - armature_deform_verts(amd->object, - ctx->object, - mesh_src, - vertexCos, - defMats, - numVerts, - amd->deformflag, - NULL, - amd->defgrp_name, - NULL); - - if (mesh_src != mesh) { - BKE_id_free(NULL, mesh_src); - } + + BKE_armature_deform_coords_with_editmesh(amd->object, + ctx->object, + vertexCos, + defMats, + numVerts, + amd->deformflag, + NULL, + amd->defgrp_name, + em); } static void deformMatrices(ModifierData *md, @@ -240,16 +218,15 @@ static void deformMatrices(ModifierData *md, ArmatureModifierData *amd = (ArmatureModifierData *)md; Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false); - armature_deform_verts(amd->object, - ctx->object, - mesh_src, - vertexCos, - defMats, - numVerts, - amd->deformflag, - NULL, - amd->defgrp_name, - NULL); + BKE_armature_deform_coords_with_mesh(amd->object, + ctx->object, + vertexCos, + defMats, + numVerts, + amd->deformflag, + NULL, + amd->defgrp_name, + mesh_src); if (!ELEM(mesh_src, NULL, mesh)) { BKE_id_free(NULL, mesh_src); @@ -274,7 +251,7 @@ static void panel_draw(const bContext *C, Panel *panel) uiItemR(col, &ptr, "use_deform_preserve_volume", 0, NULL, ICON_NONE); uiItemR(col, &ptr, "use_multi_modifier", 0, NULL, ICON_NONE); - col = uiLayoutColumnWithHeading(layout, true, "Bind to"); + col = uiLayoutColumnWithHeading(layout, true, IFACE_("Bind to")); uiItemR(col, &ptr, "use_vertex_groups", 0, IFACE_("Vertex Groups"), ICON_NONE); uiItemR(col, &ptr, "use_bone_envelopes", 0, IFACE_("Bone Envelopes"), ICON_NONE); @@ -286,6 +263,13 @@ static void panelRegister(ARegionType *region_type) modifier_panel_register(region_type, eModifierType_Armature, panel_draw); } +static void blendRead(BlendDataReader *UNUSED(reader), ModifierData *md) +{ + ArmatureModifierData *amd = (ArmatureModifierData *)md; + + amd->vert_coords_prev = NULL; +} + ModifierTypeInfo modifierType_Armature = { /* name */ "Armature", /* structName */ "ArmatureModifierData", @@ -317,4 +301,6 @@ ModifierTypeInfo modifierType_Armature = { /* foreachTexLink */ NULL, /* freeRuntimeData */ NULL, /* panelRegister */ panelRegister, + /* blendWrite */ NULL, + /* blendRead */ blendRead, }; |