From be4df85919b42cb2cf8a01c904a8552c5c173944 Mon Sep 17 00:00:00 2001 From: Mai Lavelle Date: Wed, 18 Apr 2018 15:45:54 +0200 Subject: Modifiers: Add wrapper functions with Mesh / DerivedMesh conversion Makes the follow changes: - Add new `deform*` and `apply*` function pointers to `ModifierTypeInfo` that take `Mesh`, and rename the old functions to indicate that they take `DerivedMesh`. These new functions are currently set to `NULL` for all modifiers. - Add wrapper `modifier_deform*` and `modifier_apply*` functions in two variants: one that works with `Mesh` and the other which works with `DerivedMesh` that is named with `*_DM_depercated`. These functions check which type of data the modifier supports and converts if necessary - Update the rest of Blender to be aware and make use of these new functions The goal of these changes is to make it possible to port to using `Mesh` incrementally without ever needing to enter into a state where modifiers don't work. After everything has been ported over the old functions and wrappers could be removed. Reviewers: campbellbarton, sergey, mont29 Subscribers: sybren Tags: #bf_blender_2.8 Differential Revision: https://developer.blender.org/D3155 --- source/blender/blenkernel/intern/DerivedMesh.c | 6 +- source/blender/blenkernel/intern/crazyspace.c | 13 +- source/blender/blenkernel/intern/displist.c | 6 +- source/blender/blenkernel/intern/lattice.c | 2 +- source/blender/blenkernel/intern/modifier.c | 284 ++++++++++++++++++++++++- source/blender/blenkernel/intern/multires.c | 6 +- 6 files changed, 295 insertions(+), 22 deletions(-) (limited to 'source/blender/blenkernel/intern') diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 959c05d4a91..c2e92136632 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -2356,7 +2356,7 @@ static void editbmesh_calc_modifiers( } } - if (mti->deformVertsEM) + if (mti->deformVertsEM || mti->deformVertsEM_DM) modwrap_deformVertsEM(md, depsgraph, ob, em, dm, deformedVerts, numVerts); else modwrap_deformVerts(md, depsgraph, ob, dm, deformedVerts, numVerts, 0); @@ -2403,7 +2403,7 @@ static void editbmesh_calc_modifiers( mask &= ~CD_MASK_ORCO; DM_set_only_copy(orcodm, mask | CD_MASK_ORIGINDEX); - if (mti->applyModifierEM) { + if (mti->applyModifierEM || mti->applyModifierEM_DM) { ndm = modwrap_applyModifierEM(md, depsgraph, ob, em, orcodm, MOD_APPLY_ORCO); } else { @@ -2431,7 +2431,7 @@ static void editbmesh_calc_modifiers( } } - if (mti->applyModifierEM) + if (mti->applyModifierEM || mti->applyModifierEM_DM) ndm = modwrap_applyModifierEM(md, depsgraph, ob, em, dm, MOD_APPLY_USECACHE | MOD_APPLY_ALLOW_GPU); else ndm = modwrap_applyModifier(md, depsgraph, ob, dm, MOD_APPLY_USECACHE | MOD_APPLY_ALLOW_GPU); diff --git a/source/blender/blenkernel/intern/crazyspace.c b/source/blender/blenkernel/intern/crazyspace.c index f5795444b7d..ad332220032 100644 --- a/source/blender/blenkernel/intern/crazyspace.c +++ b/source/blender/blenkernel/intern/crazyspace.c @@ -276,7 +276,7 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh( if (!editbmesh_modifier_is_enabled(scene, md, dm)) continue; - if (mti->type == eModifierTypeType_OnlyDeform && mti->deformMatricesEM) { + if (mti->type == eModifierTypeType_OnlyDeform && (mti->deformMatricesEM || mti->deformMatricesEM_DM)) { if (!defmats) { const int required_mode = eModifierMode_Realtime | eModifierMode_Editmode; CustomDataMask data_mask = CD_MASK_BAREMESH; @@ -292,8 +292,7 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh( unit_m3(defmats[a]); } - mti->deformMatricesEM(md, depsgraph, ob, em, dm, deformedVerts, defmats, - numVerts); + modifier_deformMatricesEM_DM_deprecated(md, depsgraph, ob, em, dm, deformedVerts, defmats, numVerts); } else break; @@ -350,7 +349,9 @@ int BKE_sculpt_get_first_deform_matrices( unit_m3(defmats[a]); } - if (mti->deformMatrices) mti->deformMatrices(md, depsgraph, ob, dm, deformedVerts, defmats, numVerts); + if (mti->deformMatrices || mti->deformMatrices_DM) { + modifier_deformMatrices_DM_deprecated(md, depsgraph, ob, dm, deformedVerts, defmats, numVerts); + } else break; } } @@ -397,10 +398,10 @@ void BKE_crazyspace_build_sculpt(struct Depsgraph *depsgraph, Scene *scene, Obje if (mti->type == eModifierTypeType_OnlyDeform) { /* skip leading modifiers which have been already * handled in sculpt_get_first_deform_matrices */ - if (mti->deformMatrices && !deformed) + if ((mti->deformMatrices || mti->deformMatrices_DM) && !deformed) continue; - mti->deformVerts(md, depsgraph, ob, NULL, deformedVerts, me->totvert, 0); + modifier_deformVerts_DM_deprecated(md, depsgraph, ob, NULL, deformedVerts, me->totvert, 0); deformed = 1; } } diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index e74e540fab9..74825130b03 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -860,7 +860,7 @@ static void curve_calc_modifiers_pre( deformedVerts = BKE_curve_nurbs_vertexCos_get(nurb, &numVerts); } - mti->deformVerts(md, depsgraph, ob, NULL, deformedVerts, numVerts, app_flag); + modifier_deformVerts_DM_deprecated(md, depsgraph, ob, NULL, deformedVerts, numVerts, app_flag); if (md == pretessellatePoint) break; @@ -969,14 +969,14 @@ static void curve_calc_modifiers_post( dm->getVertCos(dm, vertCos); } - mti->deformVerts(md, depsgraph, ob, dm, vertCos, totvert, appf); + modifier_deformVerts_DM_deprecated(md, depsgraph, ob, dm, vertCos, totvert, appf); } else { if (!vertCos) { vertCos = displist_get_allverts(dispbase, &totvert); } - mti->deformVerts(md, depsgraph, ob, NULL, vertCos, totvert, appf); + modifier_deformVerts_DM_deprecated(md, depsgraph, ob, NULL, vertCos, totvert, appf); } } else { diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index b9e6e0e8fa9..570ad9c8980 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -1053,7 +1053,7 @@ void BKE_lattice_modifiers_calc(struct Depsgraph *depsgraph, Scene *scene, Objec if (mti->type != eModifierTypeType_OnlyDeform) continue; if (!vertexCos) vertexCos = BKE_lattice_vertexcos_get(ob, &numVerts); - mti->deformVerts(md, depsgraph, ob, NULL, vertexCos, numVerts, 0); + modifier_deformVerts_DM_deprecated(md, depsgraph, ob, NULL, vertexCos, numVerts, 0); } /* always displist to make this work like derivedmesh */ diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index c15ae9e4a7c..8f372a8fa93 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -46,6 +46,7 @@ #include "MEM_guardedalloc.h" #include "DNA_armature_types.h" +#include "DNA_mesh_types.h" #include "DNA_object_types.h" #include "BLI_utildefines.h" @@ -58,9 +59,11 @@ #include "BLT_translation.h" #include "BKE_appdir.h" +#include "BKE_cdderivedmesh.h" #include "BKE_key.h" #include "BKE_library.h" #include "BKE_library_query.h" +#include "BKE_mesh.h" #include "BKE_multires.h" #include "BKE_DerivedMesh.h" @@ -681,7 +684,7 @@ bool modifiers_usesArmature(Object *ob, bArmature *arm) bool modifier_isCorrectableDeformed(ModifierData *md) { const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - return (mti->deformMatricesEM != NULL); + return (mti->deformMatricesEM != NULL) || (mti->deformMatricesEM_DM != NULL); } bool modifiers_isCorrectableDeformed(struct Scene *scene, Object *ob) @@ -796,7 +799,7 @@ struct DerivedMesh *modwrap_applyModifier( if (mti->dependsOnNormals && mti->dependsOnNormals(md)) { DM_ensure_normals(dm); } - return mti->applyModifier(md, depsgraph, ob, dm, flag); + return modifier_applyModifier_DM_deprecated(md, depsgraph, ob, dm, flag); } struct DerivedMesh *modwrap_applyModifierEM( @@ -811,7 +814,7 @@ struct DerivedMesh *modwrap_applyModifierEM( if (mti->dependsOnNormals && mti->dependsOnNormals(md)) { DM_ensure_normals(dm); } - return mti->applyModifierEM(md, depsgraph, ob, em, dm, flag); + return modifier_applyModifierEM_DM_deprecated(md, depsgraph, ob, em, dm, flag); } void modwrap_deformVerts( @@ -826,7 +829,7 @@ void modwrap_deformVerts( if (dm && mti->dependsOnNormals && mti->dependsOnNormals(md)) { DM_ensure_normals(dm); } - mti->deformVerts(md, depsgraph, ob, dm, vertexCos, numVerts, flag); + modifier_deformVerts_DM_deprecated(md, depsgraph, ob, dm, vertexCos, numVerts, flag); } void modwrap_deformVertsEM( @@ -840,6 +843,277 @@ void modwrap_deformVertsEM( if (dm && mti->dependsOnNormals && mti->dependsOnNormals(md)) { DM_ensure_normals(dm); } - mti->deformVertsEM(md, depsgraph, ob, em, dm, vertexCos, numVerts); + modifier_deformVertsEM_DM_deprecated(md, depsgraph, ob, em, dm, vertexCos, numVerts); } /* end modifier callback wrappers */ + + +/* wrappers for modifier callbacks that accept Mesh and select the proper implementation + * depending on if the modifier has been ported to Mesh or is still using DerivedMesh + */ + +void modifier_deformVerts(struct ModifierData *md, struct Depsgraph *depsgraph, + struct Object *ob, struct Mesh *mesh, + float (*vertexCos)[3], int numVerts, + ModifierApplyFlag flag) +{ + const ModifierTypeInfo *mti = modifierType_getInfo(md->type); + + if (mti->deformVerts) { + mti->deformVerts(md, depsgraph, ob, mesh, vertexCos, numVerts, flag); + } + else { + DerivedMesh *dm = CDDM_from_mesh(mesh); + + mti->deformVerts_DM(md, depsgraph, ob, dm, vertexCos, numVerts, flag); + + dm->release(dm); + } +} + +void modifier_deformMatrices(struct ModifierData *md, struct Depsgraph *depsgraph, + struct Object *ob, struct Mesh *mesh, + float (*vertexCos)[3], float (*defMats)[3][3], int numVerts) +{ + const ModifierTypeInfo *mti = modifierType_getInfo(md->type); + + if (mti->deformMatrices) { + mti->deformMatrices(md, depsgraph, ob, mesh, vertexCos, defMats, numVerts); + } + else { + DerivedMesh *dm = CDDM_from_mesh(mesh); + + mti->deformMatrices_DM(md, depsgraph, ob, dm, vertexCos, defMats, numVerts); + + dm->release(dm); + } +} + +void modifier_deformVertsEM(struct ModifierData *md, struct Depsgraph *depsgraph, + struct Object *ob, struct BMEditMesh *editData, struct Mesh *mesh, + float (*vertexCos)[3], int numVerts) +{ + const ModifierTypeInfo *mti = modifierType_getInfo(md->type); + + if (mti->deformVertsEM) { + mti->deformVertsEM(md, depsgraph, ob, editData, mesh, vertexCos, numVerts); + } + else { + DerivedMesh *dm = CDDM_from_mesh(mesh); + + mti->deformVertsEM_DM(md, depsgraph, ob, editData, dm, vertexCos, numVerts); + + dm->release(dm); + } +} + +void modifier_deformMatricesEM(struct ModifierData *md, struct Depsgraph *depsgraph, + struct Object *ob, struct BMEditMesh *editData, struct Mesh *mesh, + float (*vertexCos)[3], float (*defMats)[3][3], int numVerts) +{ + const ModifierTypeInfo *mti = modifierType_getInfo(md->type); + + if (mti->deformMatricesEM) { + mti->deformMatricesEM(md, depsgraph, ob, editData, mesh, vertexCos, defMats, numVerts); + } + else { + DerivedMesh *dm = CDDM_from_mesh(mesh); + + mti->deformMatricesEM_DM(md, depsgraph, ob, editData, dm, vertexCos, defMats, numVerts); + + dm->release(dm); + } +} + +struct Mesh *modifier_applyModifier(struct ModifierData *md, struct Depsgraph *depsgraph, + struct Object *ob, struct Mesh *mesh, ModifierApplyFlag flag) +{ + const ModifierTypeInfo *mti = modifierType_getInfo(md->type); + + if (mti->applyModifier) { + return mti->applyModifier(md, depsgraph, ob, mesh, flag); + } + else { + DerivedMesh *dm = CDDM_from_mesh(mesh); + + DerivedMesh *ndm = mti->applyModifier_DM(md, depsgraph, ob, dm, flag); + + if(ndm != dm) { + dm->release(dm); + } + + DM_to_mesh(ndm, mesh, ob, CD_MASK_EVERYTHING, true); + + return mesh; + } +} + +struct Mesh *modifier_applyModifierEM(struct ModifierData *md, struct Depsgraph *depsgraph, + struct Object *ob, struct BMEditMesh *editData, + struct Mesh *mesh, ModifierApplyFlag flag) +{ + const ModifierTypeInfo *mti = modifierType_getInfo(md->type); + + if (mti->applyModifierEM) { + return mti->applyModifierEM(md, depsgraph, ob, editData, mesh, flag); + } + else { + DerivedMesh *dm = CDDM_from_mesh(mesh); + + DerivedMesh *ndm = mti->applyModifierEM_DM(md, depsgraph, ob, editData, dm, flag); + + if(ndm != dm) { + dm->release(dm); + } + + DM_to_mesh(ndm, mesh, ob, CD_MASK_EVERYTHING, true); + + return mesh; + } +} + +/* depricated variants of above that accept DerivedMesh */ + +void modifier_deformVerts_DM_deprecated(struct ModifierData *md, struct Depsgraph *depsgraph, + struct Object *ob, struct DerivedMesh *dm, + float (*vertexCos)[3], int numVerts, + ModifierApplyFlag flag) +{ + const ModifierTypeInfo *mti = modifierType_getInfo(md->type); + + if (mti->deformVerts_DM) { + mti->deformVerts_DM(md, depsgraph, ob, dm, vertexCos, numVerts, flag); + } + else { + struct Mesh mesh; + BKE_mesh_init(&mesh); + + DM_to_mesh(dm, &mesh, ob, CD_MASK_EVERYTHING, false); + + mti->deformVerts(md, depsgraph, ob, &mesh, vertexCos, numVerts, flag); + + BKE_mesh_free(&mesh); + } +} + +void modifier_deformMatrices_DM_deprecated(struct ModifierData *md, struct Depsgraph *depsgraph, + struct Object *ob, struct DerivedMesh *dm, + float (*vertexCos)[3], float (*defMats)[3][3], int numVerts) +{ + + const ModifierTypeInfo *mti = modifierType_getInfo(md->type); + + if (mti->deformMatrices_DM) { + mti->deformMatrices_DM(md, depsgraph, ob, dm, vertexCos, defMats, numVerts); + } + else { + struct Mesh mesh; + BKE_mesh_init(&mesh); + + DM_to_mesh(dm, &mesh, ob, CD_MASK_EVERYTHING, false); + + mti->deformMatrices(md, depsgraph, ob, &mesh, vertexCos, defMats, numVerts); + + BKE_mesh_free(&mesh); + } +} + +void modifier_deformVertsEM_DM_deprecated(struct ModifierData *md, struct Depsgraph *depsgraph, + struct Object *ob, struct BMEditMesh *editData, struct DerivedMesh *dm, + float (*vertexCos)[3], int numVerts) +{ + const ModifierTypeInfo *mti = modifierType_getInfo(md->type); + + if (mti->deformVertsEM_DM) { + mti->deformVertsEM_DM(md, depsgraph, ob, editData, dm, vertexCos, numVerts); + } + else { + struct Mesh mesh; + BKE_mesh_init(&mesh); + + DM_to_mesh(dm, &mesh, ob, CD_MASK_EVERYTHING, false); + + mti->deformVertsEM(md, depsgraph, ob, editData, &mesh, vertexCos, numVerts); + + BKE_mesh_free(&mesh); + } +} + +void modifier_deformMatricesEM_DM_deprecated(struct ModifierData *md, struct Depsgraph *depsgraph, + struct Object *ob, struct BMEditMesh *editData, struct DerivedMesh *dm, + float (*vertexCos)[3], float (*defMats)[3][3], int numVerts) +{ + const ModifierTypeInfo *mti = modifierType_getInfo(md->type); + + if (mti->deformMatricesEM_DM) { + mti->deformMatricesEM_DM(md, depsgraph, ob, editData, dm, vertexCos, defMats, numVerts); + } + else { + struct Mesh mesh; + BKE_mesh_init(&mesh); + + DM_to_mesh(dm, &mesh, ob, CD_MASK_EVERYTHING, false); + + mti->deformMatricesEM(md, depsgraph, ob, editData, &mesh, vertexCos, defMats, numVerts); + + BKE_mesh_free(&mesh); + } +} + +struct DerivedMesh *modifier_applyModifier_DM_deprecated(struct ModifierData *md, struct Depsgraph *depsgraph, + struct Object *ob, struct DerivedMesh *dm, ModifierApplyFlag flag) +{ + const ModifierTypeInfo *mti = modifierType_getInfo(md->type); + + if (mti->applyModifier_DM) { + return mti->applyModifier_DM(md, depsgraph, ob, dm, flag); + } + else { + struct Mesh mesh; + BKE_mesh_init(&mesh); + + DM_to_mesh(dm, &mesh, ob, CD_MASK_EVERYTHING, false); + + struct Mesh *new_mesh = mti->applyModifier(md, depsgraph, ob, &mesh, flag); + + DerivedMesh *ndm = CDDM_from_mesh(new_mesh); + + if(new_mesh != &mesh) { + BKE_mesh_free(&mesh); + + /* XXX free new_mesh? */ + } + + return ndm; + } +} + +struct DerivedMesh *modifier_applyModifierEM_DM_deprecated(struct ModifierData *md, struct Depsgraph *depsgraph, + struct Object *ob, struct BMEditMesh *editData, + struct DerivedMesh *dm, ModifierApplyFlag flag) +{ + const ModifierTypeInfo *mti = modifierType_getInfo(md->type); + + if (mti->applyModifierEM) { + return mti->applyModifierEM_DM(md, depsgraph, ob, editData, dm, flag); + } + else { + struct Mesh mesh; + BKE_mesh_init(&mesh); + + DM_to_mesh(dm, &mesh, ob, CD_MASK_EVERYTHING, false); + + struct Mesh *new_mesh = mti->applyModifierEM(md, depsgraph, ob, editData, &mesh, flag); + + DerivedMesh *ndm = CDDM_from_mesh(new_mesh); + + if(new_mesh != &mesh) { + BKE_mesh_free(&mesh); + + /* XXX free new_mesh? */ + } + + return ndm; + } +} + diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index edba03dd707..0dcb4a46b3f 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -280,11 +280,10 @@ static MDisps *multires_mdisps_initialize_hidden(Mesh *me, int level) DerivedMesh *get_multires_dm(struct Depsgraph *depsgraph, Scene *scene, MultiresModifierData *mmd, Object *ob) { ModifierData *md = (ModifierData *)mmd; - const ModifierTypeInfo *mti = modifierType_getInfo(md->type); DerivedMesh *tdm = mesh_get_derived_deform(depsgraph, scene, ob, CD_MASK_BAREMESH); DerivedMesh *dm; - dm = mti->applyModifier(md, depsgraph, ob, tdm, MOD_APPLY_USECACHE | MOD_APPLY_IGNORE_SIMPLIFY); + dm = modifier_applyModifier_DM_deprecated(md, depsgraph, ob, tdm, MOD_APPLY_USECACHE | MOD_APPLY_IGNORE_SIMPLIFY); if (dm == tdm) { dm = CDDM_copy(tdm); } @@ -429,7 +428,6 @@ int multiresModifier_reshape(struct Depsgraph *depsgraph, Scene *scene, Multires int multiresModifier_reshapeFromDeformMod(struct Depsgraph *depsgraph, Scene *scene, MultiresModifierData *mmd, Object *ob, ModifierData *md) { - const ModifierTypeInfo *mti = modifierType_getInfo(md->type); DerivedMesh *dm, *ndm; int numVerts, result; float (*deformedVerts)[3]; @@ -443,7 +441,7 @@ int multiresModifier_reshapeFromDeformMod(struct Depsgraph *depsgraph, Scene *sc deformedVerts = MEM_malloc_arrayN(numVerts, sizeof(float[3]), "multiresReshape_deformVerts"); dm->getVertCos(dm, deformedVerts); - mti->deformVerts(md, depsgraph, ob, dm, deformedVerts, numVerts, 0); + modifier_deformVerts_DM_deprecated(md, depsgraph, ob, dm, deformedVerts, numVerts, 0); ndm = CDDM_copy(dm); CDDM_apply_vert_coords(ndm, deformedVerts); -- cgit v1.2.3