diff options
author | Campbell Barton <ideasman42@gmail.com> | 2020-06-13 06:14:07 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2020-06-13 06:19:34 +0300 |
commit | 9f5833798caf9581c2d781f4e2f8b95acb1560e0 (patch) | |
tree | 2c216f13fb90244a2160959faa754f0e327836d7 /source/blender/modifiers | |
parent | a35de34eb78aba5e08938066c0ecdcb05f677a8f (diff) |
Modifier: skip edit-mesh conversion for armature, curve & lattice
This is an improvement over 2.7x which converted edit-mesh to mesh
(CDDM) for all 3 modifiers.
Overall this increases performance in edit-mode by around 15-20%.
Diffstat (limited to 'source/blender/modifiers')
-rw-r--r-- | source/blender/modifiers/intern/MOD_armature.c | 55 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_curve.c | 43 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_lattice.c | 17 |
3 files changed, 57 insertions, 58 deletions
diff --git a/source/blender/modifiers/intern/MOD_armature.c b/source/blender/modifiers/intern/MOD_armature.c index c8697f90b95..0cc0680804e 100644 --- a/source/blender/modifiers/intern/MOD_armature.c +++ b/source/blender/modifiers/intern/MOD_armature.c @@ -163,62 +163,47 @@ static void deformVerts(ModifierData *md, 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 */ - BKE_armature_deform_coords_with_mesh(amd->object, - ctx->object, - vertexCos, - NULL, - numVerts, - amd->deformflag, - amd->vert_coords_prev, - amd->defgrp_name, - mesh_src); + 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 */ MEM_SAFE_FREE(amd->vert_coords_prev); - - if (mesh_src != mesh) { - BKE_id_free(NULL, mesh_src); - } } 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); - BKE_armature_deform_coords_with_mesh(amd->object, - ctx->object, - vertexCos, - defMats, - numVerts, - amd->deformflag, - NULL, - amd->defgrp_name, - mesh_src); - - 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, diff --git a/source/blender/modifiers/intern/MOD_curve.c b/source/blender/modifiers/intern/MOD_curve.c index b55e48f46ce..a13bb07f678 100644 --- a/source/blender/modifiers/intern/MOD_curve.c +++ b/source/blender/modifiers/intern/MOD_curve.c @@ -34,6 +34,7 @@ #include "BKE_context.h" #include "BKE_curve.h" +#include "BKE_deform.h" #include "BKE_editmesh.h" #include "BKE_lib_id.h" #include "BKE_lib_query.h" @@ -129,8 +130,9 @@ static void deformVerts(ModifierData *md, int defgrp_index = -1; MOD_get_vgroup(ctx->object, mesh_src, cmd->name, &dvert, &defgrp_index); - /* silly that defaxis and BKE_curve_deform_coords are off by 1 + /* Silly that defaxis and BKE_curve_deform_coords are off by 1 * but leave for now to save having to call do_versions */ + BKE_curve_deform_coords(cmd->object, ctx->object, vertexCos, @@ -147,22 +149,41 @@ static void deformVerts(ModifierData *md, static void deformVertsEM(ModifierData *md, const ModifierEvalContext *ctx, - struct BMEditMesh *em, - Mesh *mesh, + BMEditMesh *em, + Mesh *UNUSED(mesh), float (*vertexCos)[3], int numVerts) { - Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, em, mesh, NULL, numVerts, false, false); + CurveModifierData *cmd = (CurveModifierData *)md; + bool use_dverts = false; + int defgrp_index = -1; - /* TODO(Campbell): use edit-mode data only (remove this line). */ - if (mesh_src != NULL) { - BKE_mesh_wrapper_ensure_mdata(mesh_src); + if (ctx->object->type == OB_MESH && cmd->name[0] != '\0') { + defgrp_index = BKE_object_defgroup_name_index(ctx->object, cmd->name); + if (defgrp_index != -1) { + use_dverts = true; + } } - deformVerts(md, ctx, mesh_src, vertexCos, numVerts); - - if (!ELEM(mesh_src, NULL, mesh)) { - BKE_id_free(NULL, mesh_src); + if (use_dverts) { + BKE_curve_deform_coords_with_editmesh(cmd->object, + ctx->object, + vertexCos, + numVerts, + defgrp_index, + cmd->flag, + cmd->defaxis - 1, + em); + } + else { + BKE_curve_deform_coords(cmd->object, + ctx->object, + vertexCos, + numVerts, + NULL, + defgrp_index, + cmd->flag, + cmd->defaxis - 1); } } diff --git a/source/blender/modifiers/intern/MOD_lattice.c b/source/blender/modifiers/intern/MOD_lattice.c index a6eaf7e78aa..574ea969be4 100644 --- a/source/blender/modifiers/intern/MOD_lattice.c +++ b/source/blender/modifiers/intern/MOD_lattice.c @@ -130,23 +130,16 @@ static void deformVerts(ModifierData *md, static void deformVertsEM(ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *em, - struct Mesh *mesh, + struct Mesh *UNUSED(mesh), float (*vertexCos)[3], int numVerts) { - struct 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); - } + LatticeModifierData *lmd = (LatticeModifierData *)md; - deformVerts(md, ctx, mesh_src, vertexCos, numVerts); + MOD_previous_vcos_store(md, vertexCos); /* if next modifier needs original vertices */ - if (!ELEM(mesh_src, NULL, mesh)) { - BKE_id_free(NULL, mesh_src); - } + BKE_lattice_deform_coords_with_editmesh( + lmd->object, ctx->object, vertexCos, numVerts, lmd->flag, lmd->name, lmd->strength, em); } static void panel_draw(const bContext *C, Panel *panel) |