diff options
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_modifier.h | 44 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh_convert.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/modifier.c | 121 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 5 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_dynamicpaint.c | 9 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_explode.c | 9 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_multires.c | 8 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_smoke.c | 9 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_subsurf.c | 28 |
11 files changed, 98 insertions, 143 deletions
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index ec18e652aec..52015ff025d 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -171,30 +171,8 @@ typedef struct ModifierTypeInfo { /********************* Non-deform modifier functions *********************/ /* DEPRECATED */ - /* For non-deform types: apply the modifier and return a derived - * data object (type is dependent on object type). - * - * The derivedData argument should always be non-NULL; the modifier - * should read the object data from the derived object instead of the - * actual object data. - * - * The modifier may reuse the derivedData argument (i.e. return it in - * modified form), but must not release it. - */ - struct DerivedMesh *(*applyModifier_DM)(struct ModifierData *md, const struct ModifierEvalContext *ctx, - struct DerivedMesh *derivedData); - - /* Like applyModifier but called during editmode (for supporting - * modifiers). - * - * The derived object that is returned must support the operations that - * are expected from editmode objects. The same qualifications regarding - * derivedData apply as for applyModifier. - */ - struct DerivedMesh *(*applyModifierEM_DM)(struct ModifierData *md, const struct ModifierEvalContext *ctx, - struct BMEditMesh *editData, - struct DerivedMesh *derivedData); - + void (*applyModifier_DM_removed)(void); + void (*applyModifierEM_DM_removed)(void); /********************* Deform modifier functions *********************/ @@ -464,6 +442,16 @@ void modwrap_deformVertsEM( struct BMEditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts); +#define applyModifier_DM_wrapper(NEW_FUNC_NAME, OLD_FUNC_NAME) \ + static Mesh *NEW_FUNC_NAME(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh) \ + { \ + DerivedMesh *dm = CDDM_from_mesh_ex(mesh, CD_REFERENCE, CD_MASK_EVERYTHING); \ + DerivedMesh *ndm = OLD_FUNC_NAME(md, ctx, dm); \ + if (ndm != dm) dm->release(dm); \ + DM_to_mesh(ndm, mesh, ctx->object, CD_MASK_EVERYTHING, true); \ + return mesh; \ + } + /* 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 */ @@ -472,18 +460,10 @@ void modifier_deformVerts_ensure_normals( struct ModifierData *md, const struct ModifierEvalContext *ctx, struct Mesh *mesh, float (*vertexCos)[3], int numVerts); -struct Mesh *modifier_applyModifier( - struct ModifierData *md, const struct ModifierEvalContext *ctx, - struct Mesh *mesh); - struct Mesh *modifier_applyModifier_ensure_normals( struct ModifierData *md, const struct ModifierEvalContext *ctx, struct Mesh *mesh); -struct Mesh *modifier_applyModifierEM( - struct ModifierData *md, const struct ModifierEvalContext *ctx, - struct BMEditMesh *editData, struct Mesh *mesh); - /* depricated variants of above that accept DerivedMesh */ void modifier_deformVerts_DM_deprecated( diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 0c8fcced59e..fb4a2bbb0ad 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -2655,7 +2655,7 @@ static void editbmesh_calc_modifiers( mask &= ~CD_MASK_ORCO; DM_set_only_copy(orcodm, mask | CD_MASK_ORIGINDEX); - if (mti->applyModifierEM || mti->applyModifierEM_DM) { + if (mti->applyModifierEM) { ndm = modwrap_applyModifierEM(md, &mectx_orco, em, orcodm); } else { @@ -2683,7 +2683,7 @@ static void editbmesh_calc_modifiers( } } - if (mti->applyModifierEM || mti->applyModifierEM_DM) + if (mti->applyModifierEM) ndm = modwrap_applyModifierEM(md, &mectx_cache, em, dm); else ndm = modwrap_applyModifier(md, &mectx_cache, dm); diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index fdcf38c7d41..26a66dc9ce2 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -1021,7 +1021,7 @@ static void curve_calc_modifiers_post( vertCos = NULL; } - mesh_applied = modifier_applyModifier(md, &mectx_apply, modified); + mesh_applied = mti->applyModifier(md, &mectx_apply, modified); if (mesh_applied) { /* Modifier returned a new derived mesh */ diff --git a/source/blender/blenkernel/intern/mesh_convert.c b/source/blender/blenkernel/intern/mesh_convert.c index 17d7276dfe7..753937687be 100644 --- a/source/blender/blenkernel/intern/mesh_convert.c +++ b/source/blender/blenkernel/intern/mesh_convert.c @@ -1172,7 +1172,7 @@ Mesh *BKE_mesh_create_derived_for_modifier( if (build_shapekey_layers) add_shapekey_layers(mesh_temp, me); - result = modifier_applyModifier(md, &mectx, mesh_temp); + result = mti->applyModifier(md, &mectx, mesh_temp); ASSERT_IS_VALID_MESH(result); if (mesh_temp != result) { diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index a233f4294c0..dae941668ca 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -898,29 +898,6 @@ void modifier_deformVerts_ensure_normals(struct ModifierData *md, const Modifier mti->deformVerts(md, ctx, mesh, vertexCos, numVerts); } -struct Mesh *modifier_applyModifier(struct ModifierData *md, const ModifierEvalContext *ctx, - struct Mesh *mesh) -{ - const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - - if (mti->applyModifier) { - return mti->applyModifier(md, ctx, mesh); - } - else { - DerivedMesh *dm = CDDM_from_mesh_ex(mesh, CD_REFERENCE, CD_MASK_EVERYTHING); - - DerivedMesh *ndm = mti->applyModifier_DM(md, ctx, dm); - - if (ndm != dm) { - dm->release(dm); - } - - DM_to_mesh(ndm, mesh, ctx->object, CD_MASK_EVERYTHING, true); - - return mesh; - } -} - struct Mesh *modifier_applyModifier_ensure_normals(struct ModifierData *md, const ModifierEvalContext *ctx, struct Mesh *mesh) { @@ -930,31 +907,7 @@ struct Mesh *modifier_applyModifier_ensure_normals(struct ModifierData *md, cons if (mti->dependsOnNormals && mti->dependsOnNormals(md)) { BKE_mesh_calc_normals(mesh); } - return modifier_applyModifier(md, ctx, mesh); -} - -struct Mesh *modifier_applyModifierEM(struct ModifierData *md, const ModifierEvalContext *ctx, - struct BMEditMesh *editData, - struct Mesh *mesh) -{ - const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - - if (mti->applyModifierEM) { - return mti->applyModifierEM(md, ctx, editData, mesh); - } - else { - DerivedMesh *dm = CDDM_from_mesh_ex(mesh, CD_REFERENCE, CD_MASK_EVERYTHING); - - DerivedMesh *ndm = mti->applyModifierEM_DM(md, ctx, editData, dm); - - if (ndm != dm) { - dm->release(dm); - } - - DM_to_mesh(ndm, mesh, ctx->object, CD_MASK_EVERYTHING, true); - - return mesh; - } + return mti->applyModifier(md, ctx, mesh); } /* depricated variants of above that accept DerivedMesh */ @@ -1045,31 +998,27 @@ struct DerivedMesh *modifier_applyModifier_DM_deprecated(struct ModifierData *md { const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - if (mti->applyModifier_DM) { - return mti->applyModifier_DM(md, ctx, dm); + /* TODO(sybren): deduplicate all the copies of this code in this file. */ + Mesh *mesh = NULL; + if (dm != NULL) { + mesh = BKE_id_new_nomain(ID_ME, NULL); + DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false); } - else { - /* TODO(sybren): deduplicate all the copies of this code in this file. */ - Mesh *mesh = NULL; - if (dm != NULL) { - mesh = BKE_id_new_nomain(ID_ME, NULL); - DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false); - } - struct Mesh *new_mesh = mti->applyModifier(md, ctx, mesh); + struct Mesh *new_mesh = mti->applyModifier(md, ctx, mesh); - /* Make a DM that doesn't reference new_mesh so we can free the latter. */ - DerivedMesh *ndm = CDDM_from_mesh_ex(new_mesh, CD_DUPLICATE, CD_MASK_EVERYTHING); + /* Make a DM that doesn't reference new_mesh so we can free the latter. */ + DerivedMesh *ndm = CDDM_from_mesh_ex(new_mesh, CD_DUPLICATE, CD_MASK_EVERYTHING); - if (new_mesh != mesh) { - BKE_id_free(NULL, new_mesh); - } - if (mesh != NULL) { - BKE_id_free(NULL, mesh); - } - - return ndm; + if (new_mesh != mesh) { + BKE_id_free(NULL, new_mesh); + } + if (mesh != NULL) { + BKE_id_free(NULL, mesh); } + + return ndm; + } struct DerivedMesh *modifier_applyModifierEM_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx, @@ -1078,31 +1027,27 @@ struct DerivedMesh *modifier_applyModifierEM_DM_deprecated(struct ModifierData * { const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - if (mti->applyModifierEM_DM) { - return mti->applyModifierEM_DM(md, ctx, editData, dm); + /* TODO(sybren): deduplicate all the copies of this code in this file. */ + Mesh *mesh = NULL; + if (dm != NULL) { + mesh = BKE_id_new_nomain(ID_ME, NULL); + DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false); } - else { - /* TODO(sybren): deduplicate all the copies of this code in this file. */ - Mesh *mesh = NULL; - if (dm != NULL) { - mesh = BKE_id_new_nomain(ID_ME, NULL); - DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false); - } - - struct Mesh *new_mesh = mti->applyModifierEM(md, ctx, editData, mesh); - /* Make a DM that doesn't reference new_mesh so we can free the latter. */ - DerivedMesh *ndm = CDDM_from_mesh_ex(new_mesh, CD_DUPLICATE, CD_MASK_EVERYTHING); + struct Mesh *new_mesh = mti->applyModifierEM(md, ctx, editData, mesh); - if (new_mesh != mesh) { - BKE_id_free(NULL, new_mesh); - } - if (mesh != NULL) { - BKE_id_free(NULL, mesh); - } + /* Make a DM that doesn't reference new_mesh so we can free the latter. */ + DerivedMesh *ndm = CDDM_from_mesh_ex(new_mesh, CD_DUPLICATE, CD_MASK_EVERYTHING); - return ndm; + if (new_mesh != mesh) { + BKE_id_free(NULL, new_mesh); } + if (mesh != NULL) { + BKE_id_free(NULL, mesh); + } + + return ndm; + } /** diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index 38d3ec79f82..0a6d7f99237 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -309,7 +309,10 @@ Mesh *get_multires_mesh( .depsgraph = depsgraph, .object = ob_eval, .flag = MOD_APPLY_USECACHE | MOD_APPLY_IGNORE_SIMPLIFY}; - Mesh *result = modifier_applyModifier(&mmd->modifier, &modifier_ctx, deformed_mesh); + + const ModifierTypeInfo *mti = modifierType_getInfo(mmd->modifier.type); + Mesh *result = mti->applyModifier(&mmd->modifier, &modifier_ctx, deformed_mesh); + if (result == deformed_mesh) { result = BKE_mesh_copy_for_eval(deformed_mesh); } diff --git a/source/blender/modifiers/intern/MOD_dynamicpaint.c b/source/blender/modifiers/intern/MOD_dynamicpaint.c index 61219096b43..74dbb28d186 100644 --- a/source/blender/modifiers/intern/MOD_dynamicpaint.c +++ b/source/blender/modifiers/intern/MOD_dynamicpaint.c @@ -31,6 +31,7 @@ #include "DNA_object_types.h" #include "DNA_object_force_types.h" #include "DNA_scene_types.h" +#include "DNA_mesh_types.h" #include "BLI_utildefines.h" @@ -100,7 +101,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) return dataMask; } -static DerivedMesh *applyModifier( +static DerivedMesh *applyModifier_DM( ModifierData *md, const ModifierEvalContext *ctx, DerivedMesh *dm) { @@ -114,6 +115,8 @@ static DerivedMesh *applyModifier( return dm; } +applyModifier_DM_wrapper(applyModifier, applyModifier_DM) + static bool is_brush_cb(Object *UNUSED(ob), ModifierData *pmd) { return ((DynamicPaintModifierData *)pmd)->brush != NULL; @@ -183,14 +186,14 @@ ModifierTypeInfo modifierType_DynamicPaint = { /* deformMatrices_DM */ NULL, /* deformVertsEM_DM */ NULL, /* deformMatricesEM_DM*/NULL, - /* applyModifier_DM */ applyModifier, + /* applyModifier_DM */ NULL, /* applyModifierEM_DM */NULL, /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, - /* applyModifier */ NULL, + /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, /* initData */ initData, diff --git a/source/blender/modifiers/intern/MOD_explode.c b/source/blender/modifiers/intern/MOD_explode.c index 7c38677ba8b..df454eb9008 100644 --- a/source/blender/modifiers/intern/MOD_explode.c +++ b/source/blender/modifiers/intern/MOD_explode.c @@ -36,6 +36,7 @@ #include "DNA_meshdata_types.h" #include "DNA_scene_types.h" #include "DNA_object_types.h" +#include "DNA_mesh_types.h" #include "BLI_utildefines.h" #include "BLI_kdtree.h" @@ -998,7 +999,7 @@ static ParticleSystemModifierData *findPrecedingParticlesystem(Object *ob, Modif } return psmd; } -static DerivedMesh *applyModifier( +static DerivedMesh *applyModifier_DM( ModifierData *md, const ModifierEvalContext *ctx, DerivedMesh *derivedData) { @@ -1048,6 +1049,8 @@ static DerivedMesh *applyModifier( return derivedData; } +applyModifier_DM_wrapper(applyModifier, applyModifier_DM) + ModifierTypeInfo modifierType_Explode = { /* name */ "Explode", @@ -1061,14 +1064,14 @@ ModifierTypeInfo modifierType_Explode = { /* deformMatrices_DM */ NULL, /* deformVertsEM_DM */ NULL, /* deformMatricesEM_DM*/NULL, - /* applyModifier_DM */ applyModifier, + /* applyModifier_DM */ NULL, /* applyModifierEM_DM */NULL, /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, - /* applyModifier */ NULL, + /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, /* initData */ initData, diff --git a/source/blender/modifiers/intern/MOD_multires.c b/source/blender/modifiers/intern/MOD_multires.c index 813ce830b04..826c9cbe81f 100644 --- a/source/blender/modifiers/intern/MOD_multires.c +++ b/source/blender/modifiers/intern/MOD_multires.c @@ -67,7 +67,7 @@ static void initData(ModifierData *md) mmd->quality = 3; } -static DerivedMesh *applyModifier( +static DerivedMesh *applyModifier_DM( ModifierData *md, const ModifierEvalContext *ctx, DerivedMesh *dm) { @@ -144,6 +144,8 @@ static DerivedMesh *applyModifier( return result; } +applyModifier_DM_wrapper(applyModifier, applyModifier_DM) + #ifdef WITH_OPENSUBDIV_MODIFIER /* Subdivide into fully qualified mesh. */ @@ -261,7 +263,7 @@ ModifierTypeInfo modifierType_Multires = { /* deformMatrices_DM */ NULL, /* deformVertsEM_DM */ NULL, /* deformMatricesEM_DM*/NULL, - /* applyModifier_DM */ applyModifier, + /* applyModifier_DM */ NULL, /* applyModifierEM_DM */NULL, /* deformVerts */ NULL, @@ -271,7 +273,7 @@ ModifierTypeInfo modifierType_Multires = { #ifdef WITH_OPENSUBDIV_MODIFIER /* applyModifier */ applyModifier_subdiv, #else - /* applyModifier */ NULL, + /* applyModifier */ applyModifier, #endif /* applyModifierEM */ NULL, diff --git a/source/blender/modifiers/intern/MOD_smoke.c b/source/blender/modifiers/intern/MOD_smoke.c index a15c4169df3..0caeda0e426 100644 --- a/source/blender/modifiers/intern/MOD_smoke.c +++ b/source/blender/modifiers/intern/MOD_smoke.c @@ -42,6 +42,7 @@ #include "DNA_scene_types.h" #include "DNA_smoke_types.h" #include "DNA_object_force_types.h" +#include "DNA_mesh_types.h" #include "BLI_utildefines.h" @@ -104,7 +105,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) return dataMask; } -static DerivedMesh *applyModifier( +static DerivedMesh *applyModifier_DM( ModifierData *md, const ModifierEvalContext *ctx, DerivedMesh *dm) { @@ -118,6 +119,8 @@ static DerivedMesh *applyModifier( return smokeModifier_do(smd, ctx->depsgraph, scene, ctx->object, dm); } +applyModifier_DM_wrapper(applyModifier, applyModifier_DM) + static bool dependsOnTime(ModifierData *UNUSED(md)) { return true; @@ -182,14 +185,14 @@ ModifierTypeInfo modifierType_Smoke = { /* deformMatrices_DM */ NULL, /* deformVertsEM_DM */ NULL, /* deformMatricesEM_DM*/NULL, - /* applyModifier_DM */ applyModifier, + /* applyModifier_DM */ NULL, /* applyModifierEM_DM */NULL, /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, - /* applyModifier */ NULL, + /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, /* initData */ initData, diff --git a/source/blender/modifiers/intern/MOD_subsurf.c b/source/blender/modifiers/intern/MOD_subsurf.c index deccec05190..d7c8d0c7bb6 100644 --- a/source/blender/modifiers/intern/MOD_subsurf.c +++ b/source/blender/modifiers/intern/MOD_subsurf.c @@ -99,7 +99,7 @@ static bool isDisabled(const Scene *scene, ModifierData *md, bool useRenderParam return get_render_subsurf_level(&scene->r, levels, useRenderParams != 0) == 0; } -static DerivedMesh *applyModifier( +static DerivedMesh *applyModifier_DM( ModifierData *md, const ModifierEvalContext *ctx, DerivedMesh *derivedData) { @@ -133,7 +133,9 @@ static DerivedMesh *applyModifier( return result; } -static DerivedMesh *applyModifierEM( +applyModifier_DM_wrapper(applyModifier, applyModifier_DM) + +static DerivedMesh *applyModifierEM_DM( ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *UNUSED(editData), DerivedMesh *derivedData) @@ -148,6 +150,20 @@ static DerivedMesh *applyModifierEM( return result; } +static Mesh *applyModifierEM( + struct ModifierData *md, const struct ModifierEvalContext *ctx, + struct BMEditMesh *editData, + struct Mesh *mesh) +{ + DerivedMesh *dm = CDDM_from_mesh_ex(mesh, CD_REFERENCE, CD_MASK_EVERYTHING); + DerivedMesh *ndm = applyModifierEM_DM(md, ctx, editData, dm); + if (ndm != dm) { + dm->release(dm); + } + DM_to_mesh(ndm, mesh, ctx->object, CD_MASK_EVERYTHING, true); + return mesh; +} + #ifdef WITH_OPENSUBDIV_MODIFIER static int subdiv_levels_for_modifier_get(const SubsurfModifierData *smd, const ModifierEvalContext *ctx) @@ -275,8 +291,8 @@ ModifierTypeInfo modifierType_Subsurf = { /* deformMatrices_DM */ NULL, /* deformVertsEM_DM */ NULL, /* deformMatricesEM_DM*/NULL, - /* applyModifier_DM */ applyModifier, - /* applyModifierEM_DM */applyModifierEM, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, /* deformVerts */ NULL, /* deformMatrices */ NULL, @@ -285,9 +301,9 @@ ModifierTypeInfo modifierType_Subsurf = { #ifdef WITH_OPENSUBDIV_MODIFIER /* applyModifier */ applyModifier_subdiv, #else - /* applyModifier */ NULL, + /* applyModifier */ applyModifier, #endif - /* applyModifierEM */ NULL, + /* applyModifierEM */ applyModifierEM, /* initData */ initData, /* requiredDataMask */ NULL, |