diff options
Diffstat (limited to 'source/blender/modifiers/intern')
60 files changed, 2704 insertions, 2335 deletions
diff --git a/source/blender/modifiers/intern/MOD_armature.c b/source/blender/modifiers/intern/MOD_armature.c index 5b5e139d33a..574a62ffd3a 100644 --- a/source/blender/modifiers/intern/MOD_armature.c +++ b/source/blender/modifiers/intern/MOD_armature.c @@ -42,15 +42,17 @@ #include "BLI_utildefines.h" #include "BLI_string.h" - -#include "BKE_cdderivedmesh.h" +#include "BKE_editmesh.h" #include "BKE_lattice.h" +#include "BKE_library.h" #include "BKE_library_query.h" +#include "BKE_mesh.h" #include "BKE_modifier.h" -#include "MEM_guardedalloc.h" +#include "bmesh.h" +#include "bmesh_tools.h" -#include "depsgraph_private.h" +#include "MEM_guardedalloc.h" #include "MOD_util.h" @@ -83,7 +85,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED( return dataMask; } -static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(useRenderParams)) { ArmatureModifierData *amd = (ArmatureModifierData *) md; @@ -99,18 +101,6 @@ static void foreachObjectLink( walk(userData, ob, &amd->object, IDWALK_CB_NOP); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - ArmatureModifierData *amd = (ArmatureModifierData *) md; - - if (amd->object) { - DagNode *curNode = dag_get_node(ctx->forest, amd->object); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Armature Modifier"); - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { ArmatureModifierData *amd = (ArmatureModifierData *)md; @@ -122,17 +112,16 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte } static void deformVerts( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *mesh, float (*vertexCos)[3], - int numVerts, - ModifierApplyFlag UNUSED(flag)) + int numVerts) { ArmatureModifierData *amd = (ArmatureModifierData *) md; modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */ - armature_deform_verts(amd->object, ob, derivedData, vertexCos, NULL, + armature_deform_verts(amd->object, ctx->object, mesh, vertexCos, NULL, numVerts, amd->deformflag, (float(*)[3])amd->prevCos, amd->defgrp_name); /* free cache */ @@ -143,17 +132,15 @@ static void deformVerts( } static void deformVertsEM( - ModifierData *md, Object *ob, struct BMEditMesh *em, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) + ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *em, + Mesh *mesh, float (*vertexCos)[3], int numVerts) { ArmatureModifierData *amd = (ArmatureModifierData *) md; - DerivedMesh *dm = derivedData; - - if (!derivedData) dm = CDDM_from_editbmesh(em, false, false); + Mesh *mesh_src = get_mesh(ctx->object, em, mesh, NULL, false, false); modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */ - armature_deform_verts(amd->object, ob, dm, vertexCos, NULL, + armature_deform_verts(amd->object, ctx->object, mesh_src, vertexCos, NULL, numVerts, amd->deformflag, (float(*)[3])amd->prevCos, amd->defgrp_name); /* free cache */ @@ -162,38 +149,40 @@ static void deformVertsEM( amd->prevCos = NULL; } - if (!derivedData) dm->release(dm); + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); + } } static void deformMatricesEM( - ModifierData *md, Object *ob, struct BMEditMesh *em, - DerivedMesh *derivedData, float (*vertexCos)[3], + ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *em, + Mesh *mesh, float (*vertexCos)[3], float (*defMats)[3][3], int numVerts) { ArmatureModifierData *amd = (ArmatureModifierData *) md; - DerivedMesh *dm = derivedData; + Mesh *mesh_src = get_mesh(ctx->object, em, mesh, NULL, false, false); - if (!derivedData) dm = CDDM_from_editbmesh(em, false, false); - - armature_deform_verts(amd->object, ob, dm, vertexCos, defMats, numVerts, + armature_deform_verts(amd->object, ctx->object, mesh_src, vertexCos, defMats, numVerts, amd->deformflag, NULL, amd->defgrp_name); - if (!derivedData) dm->release(dm); + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); + } } static void deformMatrices( - ModifierData *md, Object *ob, DerivedMesh *derivedData, + ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, float (*vertexCos)[3], float (*defMats)[3][3], int numVerts) { ArmatureModifierData *amd = (ArmatureModifierData *) md; - DerivedMesh *dm = derivedData; + Mesh *mesh_src = get_mesh(ctx->object, NULL, mesh, NULL, false, false); - if (!derivedData) dm = CDDM_from_mesh((Mesh *)ob->data); - - armature_deform_verts(amd->object, ob, dm, vertexCos, defMats, numVerts, + armature_deform_verts(amd->object, ctx->object, mesh_src, vertexCos, defMats, numVerts, amd->deformflag, NULL, amd->defgrp_name); - if (!derivedData) dm->release(dm); + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); + } } ModifierTypeInfo modifierType_Armature = { @@ -206,17 +195,25 @@ ModifierTypeInfo modifierType_Armature = { eModifierTypeFlag_SupportsEditmode, /* copyData */ copyData, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ deformMatrices, /* deformVertsEM */ deformVertsEM, /* deformMatricesEM */ deformMatricesEM, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ isDisabled, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c index a69af265a17..5ae0013aab0 100644 --- a/source/blender/modifiers/intern/MOD_array.c +++ b/source/blender/modifiers/intern/MOD_array.c @@ -41,13 +41,14 @@ #include "BLI_utildefines.h" #include "DNA_curve_types.h" +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BKE_cdderivedmesh.h" #include "BKE_displist.h" #include "BKE_curve.h" +#include "BKE_library.h" #include "BKE_library_query.h" #include "BKE_modifier.h" #include "BKE_mesh.h" @@ -55,13 +56,7 @@ #include "MOD_util.h" -#include "depsgraph_private.h" - -/* Due to cyclic dependencies it's possible that curve used for - * deformation here is not evaluated at the time of evaluating - * this modifier. - */ -#define CYCLIC_DEPENDENCY_WORKAROUND +#include "DEG_depsgraph.h" static void initData(ModifierData *md) { @@ -94,37 +89,6 @@ static void foreachObjectLink( walk(userData, ob, &amd->offset_ob, IDWALK_CB_NOP); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - ArrayModifierData *amd = (ArrayModifierData *) md; - - if (amd->start_cap) { - DagNode *curNode = dag_get_node(ctx->forest, amd->start_cap); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier"); - } - if (amd->end_cap) { - DagNode *curNode = dag_get_node(ctx->forest, amd->end_cap); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier"); - } - if (amd->curve_ob) { - DagNode *curNode = dag_get_node(ctx->forest, amd->curve_ob); - curNode->eval_flags |= DAG_EVAL_NEED_CURVE_PATH; - - dag_add_relation(ctx->forest, curNode, ctx->obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier"); - } - if (amd->offset_ob) { - DagNode *curNode = dag_get_node(ctx->forest, amd->offset_ob); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier"); - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { ArrayModifierData *amd = (ArrayModifierData *)md; @@ -303,8 +267,8 @@ static void dm_mvert_map_doubles( } -static void dm_merge_transform( - DerivedMesh *result, DerivedMesh *cap_dm, float cap_offset[4][4], +static void mesh_merge_transform( + Mesh *result, Mesh *cap_mesh, float cap_offset[4][4], unsigned int cap_verts_index, unsigned int cap_edges_index, int cap_loops_index, int cap_polys_index, int cap_nverts, int cap_nedges, int cap_nloops, int cap_npolys, int *remap, int remap_len) { @@ -316,18 +280,12 @@ static void dm_merge_transform( MPoly *mp; MDeformVert *dvert; - /* needed for subsurf so arrays are allocated */ - cap_dm->getVertArray(cap_dm); - cap_dm->getEdgeArray(cap_dm); - cap_dm->getLoopArray(cap_dm); - cap_dm->getPolyArray(cap_dm); - - DM_copy_vert_data(cap_dm, result, 0, cap_verts_index, cap_nverts); - DM_copy_edge_data(cap_dm, result, 0, cap_edges_index, cap_nedges); - DM_copy_loop_data(cap_dm, result, 0, cap_loops_index, cap_nloops); - DM_copy_poly_data(cap_dm, result, 0, cap_polys_index, cap_npolys); + CustomData_copy_data(&cap_mesh->vdata, &result->vdata, 0, cap_verts_index, cap_nverts); + CustomData_copy_data(&cap_mesh->edata, &result->edata, 0, cap_edges_index, cap_nedges); + CustomData_copy_data(&cap_mesh->ldata, &result->ldata, 0, cap_loops_index, cap_nloops); + CustomData_copy_data(&cap_mesh->pdata, &result->pdata, 0, cap_polys_index, cap_npolys); - mv = CDDM_get_verts(result) + cap_verts_index; + mv = result->mvert + cap_verts_index; for (i = 0; i < cap_nverts; i++, mv++) { mul_m4_v3(cap_offset, mv->co); @@ -336,57 +294,55 @@ static void dm_merge_transform( } /* remap the vertex groups if necessary */ - dvert = DM_get_vert_data(result, cap_verts_index, CD_MDEFORMVERT); + dvert = result->dvert + cap_verts_index; if (dvert != NULL) { BKE_object_defgroup_index_map_apply(dvert, cap_nverts, remap, remap_len); } /* adjust cap edge vertex indices */ - me = CDDM_get_edges(result) + cap_edges_index; + me = result->medge + cap_edges_index; for (i = 0; i < cap_nedges; i++, me++) { me->v1 += cap_verts_index; me->v2 += cap_verts_index; } /* adjust cap poly loopstart indices */ - mp = CDDM_get_polys(result) + cap_polys_index; + mp = result->mpoly + cap_polys_index; for (i = 0; i < cap_npolys; i++, mp++) { mp->loopstart += cap_loops_index; } /* adjust cap loop vertex and edge indices */ - ml = CDDM_get_loops(result) + cap_loops_index; + ml = result->mloop + cap_loops_index; for (i = 0; i < cap_nloops; i++, ml++) { ml->v += cap_verts_index; ml->e += cap_edges_index; } /* set origindex */ - index_orig = result->getVertDataArray(result, CD_ORIGINDEX); + index_orig = CustomData_get_layer(&result->vdata, CD_ORIGINDEX); if (index_orig) { copy_vn_i(index_orig + cap_verts_index, cap_nverts, ORIGINDEX_NONE); } - index_orig = result->getEdgeDataArray(result, CD_ORIGINDEX); + index_orig = CustomData_get_layer(&result->edata, CD_ORIGINDEX); if (index_orig) { copy_vn_i(index_orig + cap_edges_index, cap_nedges, ORIGINDEX_NONE); } - index_orig = result->getPolyDataArray(result, CD_ORIGINDEX); + index_orig = CustomData_get_layer(&result->pdata, CD_ORIGINDEX); if (index_orig) { copy_vn_i(index_orig + cap_polys_index, cap_npolys, ORIGINDEX_NONE); } - index_orig = result->getLoopDataArray(result, CD_ORIGINDEX); + index_orig = CustomData_get_layer(&result->ldata, CD_ORIGINDEX); if (index_orig) { copy_vn_i(index_orig + cap_loops_index, cap_nloops, ORIGINDEX_NONE); } } -static DerivedMesh *arrayModifier_doArray( - ArrayModifierData *amd, - Scene *scene, Object *ob, DerivedMesh *dm, - ModifierApplyFlag flag) +static Mesh *arrayModifier_doArray( + ArrayModifierData *amd, const ModifierEvalContext *ctx, Mesh *mesh) { const float eps = 1e-6f; const MVert *src_mvert; @@ -407,7 +363,7 @@ static DerivedMesh *arrayModifier_doArray( int tot_doubles; const bool use_merge = (amd->flags & MOD_ARR_MERGE) != 0; - const bool use_recalc_normals = (dm->dirty & DM_DIRTY_NORMALS) || use_merge; + const bool use_recalc_normals = (mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL) || use_merge; const bool use_offset_ob = ((amd->offset_type & MOD_ARR_OFF_OBJ) && amd->offset_ob); int start_cap_nverts = 0, start_cap_nedges = 0, start_cap_npolys = 0, start_cap_nloops = 0; @@ -416,47 +372,50 @@ static DerivedMesh *arrayModifier_doArray( int chunk_nverts, chunk_nedges, chunk_nloops, chunk_npolys; int first_chunk_start, first_chunk_nverts, last_chunk_start, last_chunk_nverts; - DerivedMesh *result, *start_cap_dm = NULL, *end_cap_dm = NULL; + Mesh *result, *start_cap_mesh = NULL, *end_cap_mesh = NULL; + bool start_cap_mesh_free, end_cap_mesh_free; int *vgroup_start_cap_remap = NULL; int vgroup_start_cap_remap_len = 0; int *vgroup_end_cap_remap = NULL; int vgroup_end_cap_remap_len = 0; - chunk_nverts = dm->getNumVerts(dm); - chunk_nedges = dm->getNumEdges(dm); - chunk_nloops = dm->getNumLoops(dm); - chunk_npolys = dm->getNumPolys(dm); + chunk_nverts = mesh->totvert; + chunk_nedges = mesh->totedge; + chunk_nloops = mesh->totloop; + chunk_npolys = mesh->totpoly; count = amd->count; - if (amd->start_cap && amd->start_cap != ob && amd->start_cap->type == OB_MESH) { - vgroup_start_cap_remap = BKE_object_defgroup_index_map_create(amd->start_cap, ob, &vgroup_start_cap_remap_len); + if (amd->start_cap && amd->start_cap != ctx->object && amd->start_cap->type == OB_MESH) { + vgroup_start_cap_remap = BKE_object_defgroup_index_map_create( + amd->start_cap, ctx->object, &vgroup_start_cap_remap_len); - start_cap_dm = get_dm_for_modifier(amd->start_cap, flag); - if (start_cap_dm) { - start_cap_nverts = start_cap_dm->getNumVerts(start_cap_dm); - start_cap_nedges = start_cap_dm->getNumEdges(start_cap_dm); - start_cap_nloops = start_cap_dm->getNumLoops(start_cap_dm); - start_cap_npolys = start_cap_dm->getNumPolys(start_cap_dm); + start_cap_mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(amd->start_cap, &start_cap_mesh_free); + if (start_cap_mesh) { + start_cap_nverts = start_cap_mesh->totvert; + start_cap_nedges = start_cap_mesh->totedge; + start_cap_nloops = start_cap_mesh->totloop; + start_cap_npolys = start_cap_mesh->totpoly; } } - if (amd->end_cap && amd->end_cap != ob && amd->end_cap->type == OB_MESH) { - vgroup_end_cap_remap = BKE_object_defgroup_index_map_create(amd->end_cap, ob, &vgroup_end_cap_remap_len); + if (amd->end_cap && amd->end_cap != ctx->object && amd->end_cap->type == OB_MESH) { + vgroup_end_cap_remap = BKE_object_defgroup_index_map_create( + amd->end_cap, ctx->object, &vgroup_end_cap_remap_len); - end_cap_dm = get_dm_for_modifier(amd->end_cap, flag); - if (end_cap_dm) { - end_cap_nverts = end_cap_dm->getNumVerts(end_cap_dm); - end_cap_nedges = end_cap_dm->getNumEdges(end_cap_dm); - end_cap_nloops = end_cap_dm->getNumLoops(end_cap_dm); - end_cap_npolys = end_cap_dm->getNumPolys(end_cap_dm); + end_cap_mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(amd->end_cap, &end_cap_mesh_free); + if (end_cap_mesh) { + end_cap_nverts = end_cap_mesh->totvert; + end_cap_nedges = end_cap_mesh->totedge; + end_cap_nloops = end_cap_mesh->totloop; + end_cap_npolys = end_cap_mesh->totpoly; } } /* Build up offset array, cumulating all settings options */ unit_m4(offset); - src_mvert = dm->getVertArray(dm); + src_mvert = mesh->mvert; if (amd->offset_type & MOD_ARR_OFF_CONST) { add_v3_v3(offset[3], amd->offset); @@ -480,8 +439,8 @@ static DerivedMesh *arrayModifier_doArray( float obinv[4][4]; float result_mat[4][4]; - if (ob) - invert_m4_m4(obinv, ob->obmat); + if (ctx->object) + invert_m4_m4(obinv, ctx->object->obmat); else unit_m4(obinv); @@ -497,12 +456,6 @@ static DerivedMesh *arrayModifier_doArray( if (amd->fit_type == MOD_ARR_FITCURVE && amd->curve_ob) { Curve *cu = amd->curve_ob->data; if (cu) { -#ifdef CYCLIC_DEPENDENCY_WORKAROUND - if (amd->curve_ob->curve_cache == NULL) { - BKE_displist_make_curveTypes(scene, amd->curve_ob, false); - } -#endif - if (amd->curve_ob->curve_cache && amd->curve_ob->curve_cache->path) { float scale_fac = mat4_to_scale(amd->curve_ob->obmat); length = scale_fac * amd->curve_ob->curve_cache->path->totdist; @@ -536,8 +489,8 @@ static DerivedMesh *arrayModifier_doArray( result_npolys = chunk_npolys * count + start_cap_npolys + end_cap_npolys; /* Initialize a result dm */ - result = CDDM_from_template(dm, result_nverts, result_nedges, 0, result_nloops, result_npolys); - result_dm_verts = CDDM_get_verts(result); + result = BKE_mesh_new_nomain_from_template(mesh, result_nverts, result_nedges, 0, result_nloops, result_npolys); + result_dm_verts = result->mvert; if (use_merge) { /* Will need full_doubles_map for handling merge */ @@ -546,23 +499,22 @@ static DerivedMesh *arrayModifier_doArray( } /* copy customdata to original geometry */ - DM_copy_vert_data(dm, result, 0, 0, chunk_nverts); - DM_copy_edge_data(dm, result, 0, 0, chunk_nedges); - DM_copy_loop_data(dm, result, 0, 0, chunk_nloops); - DM_copy_poly_data(dm, result, 0, 0, chunk_npolys); + CustomData_copy_data(&mesh->vdata, &result->vdata, 0, 0, chunk_nverts); + CustomData_copy_data(&mesh->edata, &result->edata, 0, 0, chunk_nedges); + CustomData_copy_data(&mesh->ldata, &result->ldata, 0, 0, chunk_nloops); + CustomData_copy_data(&mesh->pdata, &result->pdata, 0, 0, chunk_npolys); /* Subsurf for eg wont have mesh data in the custom data arrays. * now add mvert/medge/mpoly layers. */ - - if (!CustomData_has_layer(&dm->vertData, CD_MVERT)) { - dm->copyVertArray(dm, result_dm_verts); + if (!CustomData_has_layer(&mesh->vdata, CD_MVERT)) { + memcpy(result->mvert, mesh->mvert, sizeof(*result->mvert) * mesh->totvert); } - if (!CustomData_has_layer(&dm->edgeData, CD_MEDGE)) { - dm->copyEdgeArray(dm, CDDM_get_edges(result)); + if (!CustomData_has_layer(&mesh->edata, CD_MEDGE)) { + memcpy(result->medge, mesh->medge, sizeof(*result->medge) * mesh->totedge); } - if (!CustomData_has_layer(&dm->polyData, CD_MPOLY)) { - dm->copyLoopArray(dm, CDDM_get_loops(result)); - dm->copyPolyArray(dm, CDDM_get_polys(result)); + if (!CustomData_has_layer(&mesh->pdata, CD_MPOLY)) { + memcpy(result->mloop, mesh->mloop, sizeof(*result->mloop) * mesh->totloop); + memcpy(result->mpoly, mesh->mpoly, sizeof(*result->mpoly) * mesh->totpoly); } /* Remember first chunk, in case of cap merge */ @@ -572,10 +524,10 @@ static DerivedMesh *arrayModifier_doArray( unit_m4(current_offset); for (c = 1; c < count; c++) { /* copy customdata to new geometry */ - DM_copy_vert_data(result, result, 0, c * chunk_nverts, chunk_nverts); - DM_copy_edge_data(result, result, 0, c * chunk_nedges, chunk_nedges); - DM_copy_loop_data(result, result, 0, c * chunk_nloops, chunk_nloops); - DM_copy_poly_data(result, result, 0, c * chunk_npolys, chunk_npolys); + CustomData_copy_data(&mesh->vdata, &result->vdata, 0, c * chunk_nverts, chunk_nverts); + CustomData_copy_data(&mesh->edata, &result->edata, 0, c * chunk_nedges, chunk_nedges); + CustomData_copy_data(&mesh->ldata, &result->ldata, 0, c * chunk_nloops, chunk_nloops); + CustomData_copy_data(&mesh->pdata, &result->pdata, 0, c * chunk_npolys, chunk_npolys); mv_prev = result_dm_verts; mv = mv_prev + c * chunk_nverts; @@ -598,19 +550,19 @@ static DerivedMesh *arrayModifier_doArray( } /* adjust edge vertex indices */ - me = CDDM_get_edges(result) + c * chunk_nedges; + me = result->medge + c * chunk_nedges; for (i = 0; i < chunk_nedges; i++, me++) { me->v1 += c * chunk_nverts; me->v2 += c * chunk_nverts; } - mp = CDDM_get_polys(result) + c * chunk_npolys; + mp = result->mpoly + c * chunk_npolys; for (i = 0; i < chunk_npolys; i++, mp++) { mp->loopstart += c * chunk_nloops; } /* adjust loop vertex and edge indices */ - ml = CDDM_get_loops(result) + c * chunk_nloops; + ml = result->mloop + c * chunk_nloops; for (i = 0; i < chunk_nloops; i++, ml++) { ml->v += c * chunk_nverts; ml->e += c * chunk_nedges; @@ -660,9 +612,9 @@ static DerivedMesh *arrayModifier_doArray( /* handle UVs */ if (chunk_nloops > 0 && is_zero_v2(amd->uv_offset) == false) { - const int totuv = CustomData_number_of_layers(&result->loopData, CD_MLOOPUV); + const int totuv = CustomData_number_of_layers(&result->ldata, CD_MLOOPUV); for (i = 0; i < totuv; i++) { - MLoopUV *dmloopuv = CustomData_get_layer_n(&result->loopData, CD_MLOOPUV, i); + MLoopUV *dmloopuv = CustomData_get_layer_n(&result->ldata, CD_MLOOPUV, i); dmloopuv += chunk_nloops; for (c = 1; c < count; c++) { const float uv_offset[2] = { @@ -696,12 +648,12 @@ static DerivedMesh *arrayModifier_doArray( } /* start capping */ - if (start_cap_dm) { + if (start_cap_mesh) { float start_offset[4][4]; int start_cap_start = result_nverts - start_cap_nverts - end_cap_nverts; invert_m4_m4(start_offset, offset); - dm_merge_transform( - result, start_cap_dm, start_offset, + mesh_merge_transform( + result, start_cap_mesh, start_offset, result_nverts - start_cap_nverts - end_cap_nverts, result_nedges - start_cap_nedges - end_cap_nedges, result_nloops - start_cap_nloops - end_cap_nloops, @@ -721,12 +673,12 @@ static DerivedMesh *arrayModifier_doArray( } } - if (end_cap_dm) { + if (end_cap_mesh) { float end_offset[4][4]; int end_cap_start = result_nverts - end_cap_nverts; mul_m4_m4m4(end_offset, current_offset, offset); - dm_merge_transform( - result, end_cap_dm, end_offset, + mesh_merge_transform( + result, end_cap_mesh, end_offset, result_nverts - end_cap_nverts, result_nedges - end_cap_nedges, result_nloops - end_cap_nloops, @@ -768,16 +720,16 @@ static DerivedMesh *arrayModifier_doArray( } } if (tot_doubles > 0) { - result = CDDM_merge_verts(result, full_doubles_map, tot_doubles, CDDM_MERGE_VERTS_DUMP_IF_EQUAL); + result = BKE_mesh_merge_verts(result, full_doubles_map, tot_doubles, MESH_MERGE_VERTS_DUMP_IF_EQUAL); } MEM_freeN(full_doubles_map); } - /* In case org dm has dirty normals, or we made some merging, mark normals as dirty in new dm! + /* In case org dm has dirty normals, or we made some merging, mark normals as dirty in new mesh! * TODO: we may need to set other dirty flags as well? */ if (use_recalc_normals) { - result->dirty |= DM_DIRTY_NORMALS; + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; } if (vgroup_start_cap_remap) { @@ -786,18 +738,23 @@ static DerivedMesh *arrayModifier_doArray( if (vgroup_end_cap_remap) { MEM_freeN(vgroup_end_cap_remap); } + if (start_cap_mesh != NULL && start_cap_mesh_free) { + BKE_id_free(NULL, start_cap_mesh); + } + if (end_cap_mesh != NULL && end_cap_mesh_free) { + BKE_id_free(NULL, end_cap_mesh); + } return result; } -static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, - DerivedMesh *dm, - ModifierApplyFlag flag) +static Mesh *applyModifier( + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *mesh) { ArrayModifierData *amd = (ArrayModifierData *) md; - return arrayModifier_doArray(amd, md->scene, ob, dm, flag); + return arrayModifier_doArray(amd, ctx, mesh); } @@ -813,17 +770,25 @@ ModifierTypeInfo modifierType_Array = { eModifierTypeFlag_AcceptsCVs, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ NULL, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_bevel.c b/source/blender/modifiers/intern/MOD_bevel.c index c70870d5671..546fde3968a 100644 --- a/source/blender/modifiers/intern/MOD_bevel.c +++ b/source/blender/modifiers/intern/MOD_bevel.c @@ -32,14 +32,16 @@ * \ingroup modifiers */ +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "BLI_utildefines.h" #include "BLI_math.h" #include "BLI_string.h" -#include "BKE_cdderivedmesh.h" #include "BKE_deform.h" +#include "BKE_mesh.h" #include "BKE_modifier.h" #include "MOD_util.h" @@ -77,12 +79,9 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) /* * This calls the new bevel code (added since 2.64) */ -static DerivedMesh *applyModifier( - ModifierData *md, struct Object *ob, - DerivedMesh *dm, - ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh) { - DerivedMesh *result; + Mesh *result; BMesh *bm; BMIter iter; BMEdge *e; @@ -95,12 +94,21 @@ static DerivedMesh *applyModifier( const bool vertex_only = (bmd->flags & MOD_BEVEL_VERT) != 0; const bool do_clamp = !(bmd->flags & MOD_BEVEL_OVERLAP_OK); const int offset_type = bmd->val_flags; - const int mat = CLAMPIS(bmd->mat, -1, ob->totcol - 1); + const int mat = CLAMPIS(bmd->mat, -1, ctx->object->totcol - 1); const bool loop_slide = (bmd->flags & MOD_BEVEL_EVEN_WIDTHS) == 0; - bm = DM_to_bmesh(dm, true); + bm = BKE_mesh_to_bmesh_ex( + mesh, + &(struct BMeshCreateParams){0}, + &(struct BMeshFromMeshParams){ + .calc_face_normal = true, + .add_key_index = false, + .use_shapekey = true, + .active_shapekey = ctx->object->shapenr, + }); + if ((bmd->lim_flags & MOD_BEVEL_VGROUP) && bmd->defgrp_name[0]) - modifier_get_vgroup(ob, dm, bmd->defgrp_name, &dvert, &vgroup); + modifier_get_vgroup_mesh(ctx->object, mesh, bmd->defgrp_name, &dvert, &vgroup); if (vertex_only) { BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { @@ -160,14 +168,14 @@ static DerivedMesh *applyModifier( vertex_only, bmd->lim_flags & MOD_BEVEL_WEIGHT, do_clamp, dvert, vgroup, mat, loop_slide); - result = CDDM_from_bmesh(bm, true); + result = BKE_bmesh_to_mesh_nomain(bm, &(struct BMeshToMeshParams){0}); BLI_assert(bm->vtoolflagpool == NULL && bm->etoolflagpool == NULL && bm->ftoolflagpool == NULL); /* make sure we never alloc'd these */ BM_mesh_free(bm); - result->dirty |= DM_DIRTY_NORMALS; + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; return result; } @@ -187,17 +195,25 @@ ModifierTypeInfo modifierType_Bevel = { eModifierTypeFlag_EnableInEditmode, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, /* dependsOnNormals */ dependsOnNormals, diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c index edbfd0408b5..6cea7b8fece 100644 --- a/source/blender/modifiers/intern/MOD_boolean.c +++ b/source/blender/modifiers/intern/MOD_boolean.c @@ -41,19 +41,23 @@ #include "BLI_utildefines.h" #include "BLI_math_matrix.h" -#include "BKE_cdderivedmesh.h" #include "BKE_library_query.h" #include "BKE_modifier.h" -#include "depsgraph_private.h" - #include "MOD_util.h" - #include "BLI_alloca.h" #include "BLI_math_geom.h" #include "BKE_material.h" #include "BKE_global.h" /* only to check G.debug */ +#include "BKE_mesh.h" +#include "BKE_library.h" + +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" + +#include "DEG_depsgraph_query.h" + #include "MEM_guardedalloc.h" #include "bmesh.h" @@ -72,7 +76,7 @@ static void initData(ModifierData *md) bmd->double_threshold = 1e-6f; } -static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(useRenderParams)) { BooleanModifierData *bmd = (BooleanModifierData *) md; @@ -88,18 +92,6 @@ static void foreachObjectLink( walk(userData, ob, &bmd->object, IDWALK_CB_NOP); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - BooleanModifierData *bmd = (BooleanModifierData *) md; - - if (bmd->object) { - DagNode *curNode = dag_get_node(ctx->forest, bmd->object); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Boolean Modifier"); - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { BooleanModifierData *bmd = (BooleanModifierData *)md; @@ -111,25 +103,30 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Boolean Modifier"); } -static DerivedMesh *get_quick_derivedMesh( - Object *ob_self, DerivedMesh *dm_self, - Object *ob_other, DerivedMesh *dm_other, +static Mesh *get_quick_mesh( + Object *ob_self, Mesh *mesh_self, + Object *ob_other, Mesh *mesh_other, int operation) { - DerivedMesh *result = NULL; + Mesh *result = NULL; - if (dm_self->getNumPolys(dm_self) == 0 || dm_other->getNumPolys(dm_other) == 0) { + if (mesh_self->totpoly == 0 || mesh_other->totpoly == 0) { switch (operation) { case eBooleanModifierOp_Intersect: - result = CDDM_new(0, 0, 0, 0, 0); + result = BKE_mesh_new_nomain(0, 0, 0, 0, 0); break; case eBooleanModifierOp_Union: - if (dm_self->getNumPolys(dm_self) != 0) { - result = dm_self; + if (mesh_self->totpoly != 0) { + result = mesh_self; } else { - result = CDDM_copy(dm_other); + BKE_id_copy_ex(NULL, &mesh_other->id, (ID **)&result, + LIB_ID_CREATE_NO_MAIN | + LIB_ID_CREATE_NO_USER_REFCOUNT | + LIB_ID_CREATE_NO_DEG_TAG | + LIB_ID_COPY_NO_PREVIEW, + false); float imat[4][4]; float omat[4][4]; @@ -137,20 +134,20 @@ static DerivedMesh *get_quick_derivedMesh( invert_m4_m4(imat, ob_self->obmat); mul_m4_m4m4(omat, imat, ob_other->obmat); - const int mverts_len = result->getNumVerts(result); - MVert *mv = CDDM_get_verts(result); + const int mverts_len = result->totvert; + MVert *mv = result->mvert; for (int i = 0; i < mverts_len; i++, mv++) { mul_m4_v3(omat, mv->co); } - result->dirty |= DM_DIRTY_NORMALS; + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; } break; case eBooleanModifierOp_Difference: - result = dm_self; + result = mesh_self; break; } } @@ -170,32 +167,34 @@ static int bm_face_isect_pair(BMFace *f, void *UNUSED(user_data)) return BM_elem_flag_test(f, BM_FACE_TAG) ? 1 : 0; } -static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, - DerivedMesh *dm, - ModifierApplyFlag flag) +static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh) { BooleanModifierData *bmd = (BooleanModifierData *) md; - DerivedMesh *dm_other; + Mesh *result = mesh; - if (!bmd->object) - return dm; + Mesh *mesh_other; + bool mesh_other_free; - dm_other = get_dm_for_modifier(bmd->object, flag); + if (!bmd->object) { + return result; + } - if (dm_other) { - DerivedMesh *result; + Object *ob_eval = DEG_get_evaluated_object(ctx->depsgraph, bmd->object); + mesh_other = BKE_modifier_get_evaluated_mesh_from_evaluated_object(ob_eval, &mesh_other_free); + if (mesh_other) { + Object *object = ctx->object; + Object *other = bmd->object; /* when one of objects is empty (has got no faces) we could speed up * calculation a bit returning one of objects' derived meshes (or empty one) * Returning mesh is depended on modifiers operation (sergey) */ - result = get_quick_derivedMesh(ob, dm, bmd->object, dm_other, bmd->operation); + result = get_quick_mesh(object, mesh, other, mesh_other, bmd->operation); if (result == NULL) { - const bool is_flip = (is_negative_m4(ob->obmat) != is_negative_m4(bmd->object->obmat)); + const bool is_flip = (is_negative_m4(object->obmat) != is_negative_m4(other->obmat)); BMesh *bm; - const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_DM(dm, dm_other); + const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(mesh, mesh_other); #ifdef DEBUG_TIME TIMEIT_START(boolean_bmesh); @@ -204,7 +203,7 @@ static DerivedMesh *applyModifier( &allocsize, &((struct BMeshCreateParams){.use_toolflags = false,})); - DM_to_bmesh_ex(dm_other, bm, true); + BM_mesh_bm_from_me(bm, mesh_other, &((struct BMeshFromMeshParams){.calc_face_normal = true,})); if (UNLIKELY(is_flip)) { const int cd_loop_mdisp_offset = CustomData_get_offset(&bm->ldata, CD_MDISPS); @@ -215,7 +214,7 @@ static DerivedMesh *applyModifier( } } - DM_to_bmesh_ex(dm, bm, true); + BM_mesh_bm_from_me(bm, mesh, &((struct BMeshFromMeshParams){.calc_face_normal = true,})); /* main bmesh intersection setup */ { @@ -233,14 +232,14 @@ static DerivedMesh *applyModifier( { BMIter iter; int i; - const int i_verts_end = dm_other->getNumVerts(dm_other); - const int i_faces_end = dm_other->getNumPolys(dm_other); + const int i_verts_end = mesh_other->totvert; + const int i_faces_end = mesh_other->totpoly; float imat[4][4]; float omat[4][4]; - invert_m4_m4(imat, ob->obmat); - mul_m4_m4m4(omat, imat, bmd->object->obmat); + invert_m4_m4(imat, object->obmat); + mul_m4_m4m4(omat, imat, other->obmat); BMVert *eve; i = 0; @@ -262,10 +261,11 @@ static DerivedMesh *applyModifier( negate_m3(nmat); } - const short ob_src_totcol = bmd->object->totcol; + const short ob_src_totcol = other->totcol; short *material_remap = BLI_array_alloca(material_remap, ob_src_totcol ? ob_src_totcol : 1); - BKE_material_remap_object_calc(ob, bmd->object, material_remap); + /* Using original (not evaluated) object here since we are writing to it. */ + BKE_material_remap_object_calc(ctx->object, other, material_remap); BMFace *efa; i = 0; @@ -317,28 +317,28 @@ static DerivedMesh *applyModifier( MEM_freeN(looptris); } - result = CDDM_from_bmesh(bm, true); + result = BKE_bmesh_to_mesh_nomain(bm, &((struct BMeshToMeshParams){0})); BM_mesh_free(bm); - result->dirty |= DM_DIRTY_NORMALS; + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; #ifdef DEBUG_TIME TIMEIT_END(boolean_bmesh); #endif - - return result; } /* if new mesh returned, return it; otherwise there was * an error, so delete the modifier object */ - if (result) - return result; - else + if (result == NULL) modifier_setError(md, "Cannot execute boolean operation"); } - return dm; + if (mesh_other != NULL && mesh_other_free) { + BKE_id_free(NULL, mesh_other); + } + + return result; } static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md)) @@ -359,17 +359,25 @@ ModifierTypeInfo modifierType_Boolean = { eModifierTypeFlag_UsesPointCache, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ isDisabled, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_build.c b/source/blender/modifiers/intern/MOD_build.c index e877d5649d4..902a9e7f14f 100644 --- a/source/blender/modifiers/intern/MOD_build.c +++ b/source/blender/modifiers/intern/MOD_build.c @@ -41,18 +41,16 @@ #include "BLI_ghash.h" #include "DNA_meshdata_types.h" +#include "DNA_mesh_types.h" +#include "DNA_object_types.h" -#include "BKE_cdderivedmesh.h" +#include "DEG_depsgraph_query.h" + +#include "BKE_mesh.h" #include "BKE_modifier.h" #include "BKE_particle.h" #include "BKE_scene.h" - - -#ifdef _OPENMP -# include "BKE_mesh.h" /* BKE_MESH_OMP_LIMIT */ -#endif - static void initData(ModifierData *md) { BuildModifierData *bmd = (BuildModifierData *) md; @@ -66,13 +64,11 @@ static bool dependsOnTime(ModifierData *UNUSED(md)) return true; } -static DerivedMesh *applyModifier( - ModifierData *md, Object *UNUSED(ob), - DerivedMesh *derivedData, - ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier( + ModifierData *md, const ModifierEvalContext *ctx, + struct Mesh *mesh) { - DerivedMesh *dm = derivedData; - DerivedMesh *result; + Mesh *result; BuildModifierData *bmd = (BuildModifierData *) md; int i, j, k; int numFaces_dst, numEdges_dst, numLoops_dst = 0; @@ -85,16 +81,16 @@ static DerivedMesh *applyModifier( GHash *vertHash = BLI_ghash_int_new("build ve apply gh"); /* maps edge indices in new mesh to indices in old mesh */ GHash *edgeHash = BLI_ghash_int_new("build ed apply gh"); + /* maps edge indices in old mesh to indices in new mesh */ GHash *edgeHash2 = BLI_ghash_int_new("build ed apply gh"); - const int numVert_src = dm->getNumVerts(dm); - const int numEdge_src = dm->getNumEdges(dm); - const int numPoly_src = dm->getNumPolys(dm); - MPoly *mpoly_src = dm->getPolyArray(dm); - MLoop *mloop_src = dm->getLoopArray(dm); - MEdge *medge_src = dm->getEdgeArray(dm); - MVert *mvert_src = dm->getVertArray(dm); - + const int numVert_src = mesh->totvert; + const int numEdge_src = mesh->totedge; + const int numPoly_src = mesh->totpoly; + MPoly *mpoly_src = mesh->mpoly; + MLoop *mloop_src = mesh->mloop; + MEdge *medge_src = mesh->medge; + MVert *mvert_src = mesh->mvert; vertMap = MEM_malloc_arrayN(numVert_src, sizeof(*vertMap), "build modifier vertMap"); edgeMap = MEM_malloc_arrayN(numEdge_src, sizeof(*edgeMap), "build modifier edgeMap"); @@ -104,9 +100,9 @@ static DerivedMesh *applyModifier( range_vn_i(edgeMap, numEdge_src, 0); range_vn_i(faceMap, numPoly_src, 0); - frac = (BKE_scene_frame_get(md->scene) - bmd->start) / bmd->length; + struct Scene *scene = DEG_get_input_scene(ctx->depsgraph); + frac = (BKE_scene_frame_get(scene) - bmd->start) / bmd->length; CLAMP(frac, 0.0f, 1.0f); - if (bmd->flag & MOD_BUILD_FLAG_REVERSE) { frac = 1.0f - frac; } @@ -118,7 +114,6 @@ static DerivedMesh *applyModifier( if (numFaces_dst) { MPoly *mpoly, *mp; MLoop *ml, *mloop; - MEdge *medge; uintptr_t hash_num, hash_num_alt; if (bmd->flag & MOD_BUILD_FLAG_RANDOMIZE) { @@ -151,11 +146,10 @@ static DerivedMesh *applyModifier( /* get the set of edges that will be in the new mesh (i.e. all edges * that have both verts in the new mesh) */ - medge = medge_src; hash_num = 0; hash_num_alt = 0; for (i = 0; i < numEdge_src; i++, hash_num_alt++) { - MEdge *me = medge + i; + MEdge *me = medge_src + i; if (BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me->v1)) && BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me->v2))) @@ -165,6 +159,7 @@ static DerivedMesh *applyModifier( hash_num++; } } + BLI_assert(hash_num == BLI_ghash_len(edgeHash)); } else if (numEdges_dst) { MEdge *medge, *me; @@ -221,11 +216,10 @@ static DerivedMesh *applyModifier( } } - /* now we know the number of verts, edges and faces, we can create - * the mesh - */ - result = CDDM_from_template(dm, BLI_ghash_len(vertHash), - BLI_ghash_len(edgeHash), 0, numLoops_dst, numFaces_dst); + /* now we know the number of verts, edges and faces, we can create the mesh. */ + result = BKE_mesh_new_nomain_from_template( + mesh, BLI_ghash_len(vertHash), BLI_ghash_len(edgeHash), + 0, numLoops_dst, numFaces_dst); /* copy the vertices across */ GHASH_ITER (gh_iter, vertHash) { @@ -235,9 +229,9 @@ static DerivedMesh *applyModifier( int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(&gh_iter)); source = mvert_src[oldIndex]; - dest = CDDM_get_vert(result, newIndex); + dest = &result->mvert[newIndex]; - DM_copy_vert_data(dm, result, oldIndex, newIndex, 1); + CustomData_copy_data(&mesh->vdata, &result->vdata, oldIndex, newIndex, 1); *dest = source; } @@ -248,17 +242,17 @@ static DerivedMesh *applyModifier( int oldIndex = GET_INT_FROM_POINTER(BLI_ghash_lookup(edgeHash, SET_INT_IN_POINTER(i))); source = medge_src[oldIndex]; - dest = CDDM_get_edge(result, i); + dest = &result->medge[i]; source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1))); source.v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v2))); - DM_copy_edge_data(dm, result, oldIndex, i, 1); + CustomData_copy_data(&mesh->edata, &result->edata, oldIndex, i, 1); *dest = source; } - mpoly_dst = CDDM_get_polys(result); - /* mloop_dst = */ ml_dst = CDDM_get_loops(result); + mpoly_dst = result->mpoly; + ml_dst = result->mloop; /* copy the faces across, remapping indices */ k = 0; @@ -268,12 +262,11 @@ static DerivedMesh *applyModifier( source = mpoly_src + faceMap[i]; dest = mpoly_dst + i; - DM_copy_poly_data(dm, result, faceMap[i], i, 1); + CustomData_copy_data(&mesh->pdata, &result->pdata, faceMap[i], i, 1); *dest = *source; dest->loopstart = k; - - DM_copy_loop_data(dm, result, source->loopstart, dest->loopstart, dest->totloop); + CustomData_copy_data(&mesh->ldata, &result->ldata, source->loopstart, dest->loopstart, dest->totloop); ml_src = mloop_src + source->loopstart; for (j = 0; j < source->totloop; j++, k++, ml_src++, ml_dst++) { @@ -290,10 +283,11 @@ static DerivedMesh *applyModifier( MEM_freeN(edgeMap); MEM_freeN(faceMap); - if (dm->dirty & DM_DIRTY_NORMALS) { - result->dirty |= DM_DIRTY_NORMALS; + if (mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL) { + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; } + /* TODO(sybren): also copy flags & tags? */ return result; } @@ -305,18 +299,27 @@ ModifierTypeInfo modifierType_Build = { /* type */ eModifierTypeType_Nonconstructive, /* flags */ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_AcceptsCVs, + /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ NULL, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ dependsOnTime, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_cast.c b/source/blender/modifiers/intern/MOD_cast.c index f09f2d619a2..67294c77c05 100644 --- a/source/blender/modifiers/intern/MOD_cast.c +++ b/source/blender/modifiers/intern/MOD_cast.c @@ -33,6 +33,7 @@ */ +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" @@ -41,13 +42,12 @@ #include "BKE_deform.h" -#include "BKE_DerivedMesh.h" +#include "BKE_editmesh.h" +#include "BKE_library.h" #include "BKE_library_query.h" +#include "BKE_mesh.h" #include "BKE_modifier.h" - -#include "depsgraph_private.h" - #include "MOD_util.h" static void initData(ModifierData *md) @@ -63,7 +63,7 @@ static void initData(ModifierData *md) cmd->object = NULL; } -static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(useRenderParams)) { CastModifierData *cmd = (CastModifierData *) md; short flag; @@ -95,18 +95,6 @@ static void foreachObjectLink( walk(userData, ob, &cmd->object, IDWALK_CB_NOP); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - CastModifierData *cmd = (CastModifierData *) md; - - if (cmd->object) { - DagNode *curNode = dag_get_node(ctx->forest, cmd->object); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, DAG_RL_OB_DATA, - "Cast Modifier"); - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { CastModifierData *cmd = (CastModifierData *)md; @@ -117,7 +105,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte } static void sphere_do( - CastModifierData *cmd, Object *ob, DerivedMesh *dm, + CastModifierData *cmd, Object *ob, Mesh *mesh, float (*vertexCos)[3], int numVerts) { MDeformVert *dvert = NULL; @@ -165,7 +153,7 @@ static void sphere_do( /* 3) if we were given a vertex group name, * only those vertices should be affected */ - modifier_get_vgroup(ob, dm, cmd->defgrp_name, &dvert, &defgrp_index); + modifier_get_vgroup_mesh(ob, mesh, cmd->defgrp_name, &dvert, &defgrp_index); if (flag & MOD_CAST_SIZE_FROM_RADIUS) { len = cmd->radius; @@ -238,7 +226,7 @@ static void sphere_do( } static void cuboid_do( - CastModifierData *cmd, Object *ob, DerivedMesh *dm, + CastModifierData *cmd, Object *ob, Mesh *mesh, float (*vertexCos)[3], int numVerts) { MDeformVert *dvert = NULL; @@ -267,7 +255,7 @@ static void cuboid_do( /* 3) if we were given a vertex group name, * only those vertices should be affected */ - modifier_get_vgroup(ob, dm, cmd->defgrp_name, &dvert, &defgrp_index); + modifier_get_vgroup_mesh(ob, mesh, cmd->defgrp_name, &dvert, &defgrp_index); if (ctrl_ob) { if (flag & MOD_CAST_USE_OB_TRANSFORM) { @@ -435,44 +423,48 @@ static void cuboid_do( } static void deformVerts( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *mesh, float (*vertexCos)[3], - int numVerts, - ModifierApplyFlag UNUSED(flag)) + int numVerts) { - DerivedMesh *dm = NULL; CastModifierData *cmd = (CastModifierData *)md; + Mesh *mesh_src = get_mesh(ctx->object, NULL, mesh, NULL, false, false); - dm = get_dm(ob, NULL, derivedData, NULL, false, false); + BLI_assert(mesh_src->totvert == numVerts); if (cmd->type == MOD_CAST_TYPE_CUBOID) { - cuboid_do(cmd, ob, dm, vertexCos, numVerts); + cuboid_do(cmd, ctx->object, mesh_src, vertexCos, numVerts); } else { /* MOD_CAST_TYPE_SPHERE or MOD_CAST_TYPE_CYLINDER */ - sphere_do(cmd, ob, dm, vertexCos, numVerts); + sphere_do(cmd, ctx->object, mesh_src, vertexCos, numVerts); } - if (dm != derivedData) - dm->release(dm); + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); + } } static void deformVertsEM( - ModifierData *md, Object *ob, struct BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) + ModifierData *md, const ModifierEvalContext *ctx, + struct BMEditMesh *editData, + Mesh *mesh, float (*vertexCos)[3], int numVerts) { - DerivedMesh *dm = get_dm(ob, editData, derivedData, NULL, false, false); CastModifierData *cmd = (CastModifierData *)md; + Mesh *mesh_src = get_mesh(ctx->object, editData, mesh, NULL, false, false); + + BLI_assert(mesh_src->totvert == numVerts); if (cmd->type == MOD_CAST_TYPE_CUBOID) { - cuboid_do(cmd, ob, dm, vertexCos, numVerts); + cuboid_do(cmd, ctx->object, mesh_src, vertexCos, numVerts); } else { /* MOD_CAST_TYPE_SPHERE or MOD_CAST_TYPE_CYLINDER */ - sphere_do(cmd, ob, dm, vertexCos, numVerts); + sphere_do(cmd, ctx->object, mesh_src, vertexCos, numVerts); } - if (dm != derivedData) - dm->release(dm); + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); + } } @@ -486,17 +478,25 @@ ModifierTypeInfo modifierType_Cast = { eModifierTypeFlag_SupportsEditmode, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ deformVertsEM, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ isDisabled, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_cloth.c b/source/blender/modifiers/intern/MOD_cloth.c index 0317e0a92e4..05c9e44d980 100644 --- a/source/blender/modifiers/intern/MOD_cloth.c +++ b/source/blender/modifiers/intern/MOD_cloth.c @@ -36,6 +36,7 @@ #include "DNA_cloth_types.h" #include "DNA_key_types.h" +#include "DNA_mesh_types.h" #include "DNA_scene_types.h" #include "DNA_object_types.h" @@ -43,17 +44,17 @@ #include "BLI_utildefines.h" - #include "BKE_cloth.h" -#include "BKE_cdderivedmesh.h" #include "BKE_effect.h" #include "BKE_global.h" #include "BKE_key.h" +#include "BKE_library.h" #include "BKE_library_query.h" +#include "BKE_mesh.h" #include "BKE_modifier.h" #include "BKE_pointcache.h" -#include "depsgraph_private.h" +#include "DEG_depsgraph_query.h" #include "MOD_util.h" @@ -73,11 +74,13 @@ static void initData(ModifierData *md) } static void deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], - int numVerts, ModifierApplyFlag UNUSED(flag)) + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *mesh, float (*vertexCos)[3], + int numVerts) { - DerivedMesh *dm; + Mesh *mesh_src; ClothModifierData *clmd = (ClothModifierData *) md; + Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); /* check for alloc failing */ if (!clmd->sim_parms || !clmd->coll_parms) { @@ -87,9 +90,20 @@ static void deformVerts( return; } - dm = get_dm(ob, NULL, derivedData, NULL, false, false); - if (dm == derivedData) - dm = CDDM_copy(dm); + if (mesh == NULL) { + mesh_src = get_mesh(ctx->object, NULL, NULL, NULL, false, false); + } + else { + /* Not possible to use get_mesh() in this case as we'll modify its vertices + * and get_mesh() would return 'mesh' directly. */ + BKE_id_copy_ex( + NULL, (ID *)mesh, (ID **)&mesh_src, + LIB_ID_CREATE_NO_MAIN | + LIB_ID_CREATE_NO_USER_REFCOUNT | + LIB_ID_CREATE_NO_DEG_TAG | + LIB_ID_COPY_NO_PREVIEW, + false); + } /* TODO(sergey): For now it actually duplicates logic from DerivedMesh.c * and needs some more generic solution. But starting experimenting with @@ -97,40 +111,24 @@ static void deformVerts( * * Also hopefully new cloth system will arrive soon.. */ - if (derivedData == NULL && clmd->sim_parms->shapekey_rest) { - KeyBlock *kb = BKE_keyblock_from_key(BKE_key_from_object(ob), + if (mesh == NULL && clmd->sim_parms->shapekey_rest) { + KeyBlock *kb = BKE_keyblock_from_key(BKE_key_from_object(ctx->object), clmd->sim_parms->shapekey_rest); if (kb && kb->data != NULL) { float (*layerorco)[3]; - if (!(layerorco = DM_get_vert_data_layer(dm, CD_CLOTH_ORCO))) { - DM_add_vert_layer(dm, CD_CLOTH_ORCO, CD_CALLOC, NULL); - layerorco = DM_get_vert_data_layer(dm, CD_CLOTH_ORCO); + if (!(layerorco = CustomData_get_layer(&mesh_src->vdata, CD_CLOTH_ORCO))) { + layerorco = CustomData_add_layer(&mesh_src->vdata, CD_CLOTH_ORCO, CD_CALLOC, NULL, mesh_src->totvert); } memcpy(layerorco, kb->data, sizeof(float) * 3 * numVerts); } } - CDDM_apply_vert_coords(dm, vertexCos); - - clothModifier_do(clmd, md->scene, ob, dm, vertexCos); + BKE_mesh_apply_vert_coords(mesh_src, vertexCos); - dm->release(dm); -} - -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - ClothModifierData *clmd = (ClothModifierData *) md; + clothModifier_do(clmd, ctx->depsgraph, scene, ctx->object, mesh_src, vertexCos); - if (clmd) { - /* Actual code uses get_collisionobjects */ -#ifdef WITH_LEGACY_DEPSGRAPH - dag_add_collision_relations(ctx->forest, ctx->scene, ctx->object, ctx->obNode, clmd->coll_parms->group, ctx->object->lay|ctx->scene->lay, eModifierType_Collision, NULL, true, "Cloth Collision"); - dag_add_forcefield_relations(ctx->forest, ctx->scene, ctx->object, ctx->obNode, clmd->sim_parms->effector_weights, true, 0, "Cloth Field"); -#else - (void)ctx; -#endif - } + BKE_id_free(NULL, mesh_src); } static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) @@ -138,7 +136,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte ClothModifierData *clmd = (ClothModifierData *)md; if (clmd != NULL) { /* Actual code uses get_collisionobjects */ - DEG_add_collision_relations(ctx->node, ctx->scene, ctx->object, clmd->coll_parms->group, ctx->object->lay|ctx->scene->lay, eModifierType_Collision, NULL, true, "Cloth Collision"); + DEG_add_collision_relations(ctx->node, ctx->scene, ctx->object, clmd->coll_parms->group, eModifierType_Collision, NULL, true, "Cloth Collision"); DEG_add_forcefield_relations(ctx->node, ctx->scene, ctx->object, clmd->sim_parms->effector_weights, true, 0, "Cloth Field"); } @@ -245,17 +243,25 @@ ModifierTypeInfo modifierType_Cloth = { eModifierTypeFlag_Single, /* copyData */ copyData, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ freeData, /* isDisabled */ NULL, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ dependsOnTime, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_collision.c b/source/blender/modifiers/intern/MOD_collision.c index 4390a5830d8..7f02bbf0453 100644 --- a/source/blender/modifiers/intern/MOD_collision.c +++ b/source/blender/modifiers/intern/MOD_collision.c @@ -33,6 +33,7 @@ */ #include "DNA_object_types.h" +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "MEM_guardedalloc.h" @@ -41,13 +42,18 @@ #include "BLI_utildefines.h" #include "BKE_collision.h" -#include "BKE_cdderivedmesh.h" #include "BKE_global.h" +#include "BKE_library.h" +#include "BKE_mesh.h" +#include "BKE_mesh_runtime.h" #include "BKE_modifier.h" #include "BKE_pointcache.h" #include "BKE_scene.h" #include "MOD_modifiertypes.h" +#include "MOD_util.h" + +#include "DEG_depsgraph_query.h" static void initData(ModifierData *md) { @@ -96,38 +102,49 @@ static bool dependsOnTime(ModifierData *UNUSED(md)) } static void deformVerts( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *mesh, float (*vertexCos)[3], - int UNUSED(numVerts), - ModifierApplyFlag UNUSED(flag)) + int UNUSED(numVerts)) { CollisionModifierData *collmd = (CollisionModifierData *) md; - DerivedMesh *dm = NULL; + Mesh *mesh_src; MVert *tempVert = NULL; + Object *ob = ctx->object; - /* if possible use/create DerivedMesh */ - if (derivedData) dm = CDDM_copy(derivedData); - else if (ob->type == OB_MESH) dm = CDDM_from_mesh(ob->data); + if (mesh == NULL) { + mesh_src = get_mesh(ob, NULL, NULL, NULL, false, false); + } + else { + /* Not possible to use get_mesh() in this case as we'll modify its vertices + * and get_mesh() would return 'mesh' directly. */ + BKE_id_copy_ex( + NULL, (ID *)mesh, (ID **)&mesh_src, + LIB_ID_CREATE_NO_MAIN | + LIB_ID_CREATE_NO_USER_REFCOUNT | + LIB_ID_CREATE_NO_DEG_TAG | + LIB_ID_COPY_NO_PREVIEW, + false); + } if (!ob->pd) { printf("CollisionModifier deformVerts: Should not happen!\n"); return; } - if (dm) { + if (mesh_src) { float current_time = 0; unsigned int mvert_num = 0; - CDDM_apply_vert_coords(dm, vertexCos); - CDDM_calc_normals(dm); + BKE_mesh_apply_vert_coords(mesh_src, vertexCos); + BKE_mesh_calc_normals(mesh_src); - current_time = BKE_scene_frame_get(md->scene); + current_time = DEG_get_ctime(ctx->depsgraph); if (G.debug_value > 0) printf("current_time %f, collmd->time_xnew %f\n", current_time, collmd->time_xnew); - mvert_num = dm->getNumVerts(dm); + mvert_num = mesh_src->totvert; if (current_time > collmd->time_xnew) { unsigned int i; @@ -138,7 +155,7 @@ static void deformVerts( if (collmd->time_xnew == -1000) { /* first time */ - collmd->x = dm->dupVertArray(dm); /* frame start position */ + collmd->x = MEM_dupallocN(mesh_src->mvert); /* frame start position */ for (i = 0; i < mvert_num; i++) { /* we save global positions */ @@ -152,12 +169,12 @@ static void deformVerts( collmd->mvert_num = mvert_num; - collmd->tri_num = dm->getNumLoopTri(dm); { - const MLoop *mloop = dm->getLoopArray(dm); - const MLoopTri *looptri = dm->getLoopTriArray(dm); + const MLoop *mloop = mesh_src->mloop; + const MLoopTri *looptri = BKE_mesh_runtime_looptri_ensure(mesh_src); + collmd->tri_num = BKE_mesh_runtime_looptri_len(mesh_src); MVertTri *tri = MEM_malloc_arrayN(collmd->tri_num, sizeof(*tri), __func__); - DM_verttri_from_looptri(tri, mloop, looptri, collmd->tri_num); + BKE_mesh_runtime_verttri_from_looptri(tri, mloop, looptri, collmd->tri_num); collmd->tri = tri; } @@ -177,7 +194,7 @@ static void deformVerts( collmd->xnew = tempVert; collmd->time_x = collmd->time_xnew; - memcpy(collmd->xnew, dm->getVertArray(dm), mvert_num * sizeof(MVert)); + memcpy(collmd->xnew, mesh_src->mvert, mvert_num * sizeof(MVert)); bool is_static = true; @@ -238,8 +255,9 @@ static void deformVerts( } } - if (dm) - dm->release(dm); + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); + } } @@ -252,17 +270,25 @@ ModifierTypeInfo modifierType_Collision = { eModifierTypeFlag_Single, /* copyData */ NULL, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ NULL, /* freeData */ freeData, /* isDisabled */ NULL, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ dependsOnTime, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_correctivesmooth.c b/source/blender/modifiers/intern/MOD_correctivesmooth.c index c8369c89716..df5cd956000 100644 --- a/source/blender/modifiers/intern/MOD_correctivesmooth.c +++ b/source/blender/modifiers/intern/MOD_correctivesmooth.c @@ -41,10 +41,10 @@ #include "MEM_guardedalloc.h" -#include "BKE_cdderivedmesh.h" #include "BKE_deform.h" #include "BKE_mesh.h" #include "BKE_editmesh.h" +#include "BKE_library.h" #include "MOD_modifiertypes.h" #include "MOD_util.h" @@ -125,7 +125,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) /* check individual weights for changes and cache values */ -static void dm_get_weights( +static void mesh_get_weights( MDeformVert *dvert, const int defgrp_index, const unsigned int numVerts, const bool use_invert_vgroup, float *smooth_weights) @@ -145,16 +145,16 @@ static void dm_get_weights( } -static void dm_get_boundaries(DerivedMesh *dm, float *smooth_weights) +static void mesh_get_boundaries(Mesh *mesh, float *smooth_weights) { - const MPoly *mpoly = dm->getPolyArray(dm); - const MLoop *mloop = dm->getLoopArray(dm); - const MEdge *medge = dm->getEdgeArray(dm); + const MPoly *mpoly = mesh->mpoly; + const MLoop *mloop = mesh->mloop; + const MEdge *medge = mesh->medge; unsigned int mpoly_num, medge_num, i; unsigned short *boundaries; - mpoly_num = (unsigned int)dm->getNumPolys(dm); - medge_num = (unsigned int)dm->getNumEdges(dm); + mpoly_num = (unsigned int)mesh->totpoly; + medge_num = (unsigned int)mesh->totedge; boundaries = MEM_calloc_arrayN(medge_num, sizeof(*boundaries), __func__); @@ -185,7 +185,7 @@ static void dm_get_boundaries(DerivedMesh *dm, float *smooth_weights) * (average of surrounding verts) */ static void smooth_iter__simple( - CorrectiveSmoothModifierData *csmd, DerivedMesh *dm, + CorrectiveSmoothModifierData *csmd, Mesh *mesh, float (*vertexCos)[3], unsigned int numVerts, const float *smooth_weights, unsigned int iterations) @@ -193,8 +193,8 @@ static void smooth_iter__simple( const float lambda = csmd->lambda; unsigned int i; - const unsigned int numEdges = (unsigned int)dm->getNumEdges(dm); - const MEdge *edges = dm->getEdgeArray(dm); + const unsigned int numEdges = (unsigned int)mesh->totedge; + const MEdge *edges = mesh->medge; float *vertex_edge_count_div; struct SmoothingData_Simple { @@ -260,17 +260,17 @@ static void smooth_iter__simple( /* Edge-Length Weighted Smoothing */ static void smooth_iter__length_weight( - CorrectiveSmoothModifierData *csmd, DerivedMesh *dm, + CorrectiveSmoothModifierData *csmd, Mesh *mesh, float (*vertexCos)[3], unsigned int numVerts, const float *smooth_weights, unsigned int iterations) { const float eps = FLT_EPSILON * 10.0f; - const unsigned int numEdges = (unsigned int)dm->getNumEdges(dm); + const unsigned int numEdges = (unsigned int)mesh->totedge; /* note: the way this smoothing method works, its approx half as strong as the simple-smooth, * and 2.0 rarely spikes, double the value for consistent behavior. */ const float lambda = csmd->lambda * 2.0f; - const MEdge *edges = dm->getEdgeArray(dm); + const MEdge *edges = mesh->medge; float *vertex_edge_count; unsigned int i; @@ -356,25 +356,25 @@ static void smooth_iter__length_weight( static void smooth_iter( - CorrectiveSmoothModifierData *csmd, DerivedMesh *dm, + CorrectiveSmoothModifierData *csmd, Mesh *mesh, float (*vertexCos)[3], unsigned int numVerts, const float *smooth_weights, unsigned int iterations) { switch (csmd->smooth_type) { case MOD_CORRECTIVESMOOTH_SMOOTH_LENGTH_WEIGHT: - smooth_iter__length_weight(csmd, dm, vertexCos, numVerts, smooth_weights, iterations); + smooth_iter__length_weight(csmd, mesh, vertexCos, numVerts, smooth_weights, iterations); break; /* case MOD_CORRECTIVESMOOTH_SMOOTH_SIMPLE: */ default: - smooth_iter__simple(csmd, dm, vertexCos, numVerts, smooth_weights, iterations); + smooth_iter__simple(csmd, mesh, vertexCos, numVerts, smooth_weights, iterations); break; } } static void smooth_verts( - CorrectiveSmoothModifierData *csmd, DerivedMesh *dm, + CorrectiveSmoothModifierData *csmd, Mesh *mesh, MDeformVert *dvert, const int defgrp_index, float (*vertexCos)[3], unsigned int numVerts) { @@ -385,7 +385,7 @@ static void smooth_verts( smooth_weights = MEM_malloc_arrayN(numVerts, sizeof(float), __func__); if (dvert) { - dm_get_weights( + mesh_get_weights( dvert, defgrp_index, numVerts, (csmd->flag & MOD_CORRECTIVESMOOTH_INVERT_VGROUP) != 0, smooth_weights); @@ -395,11 +395,11 @@ static void smooth_verts( } if (csmd->flag & MOD_CORRECTIVESMOOTH_PIN_BOUNDARY) { - dm_get_boundaries(dm, smooth_weights); + mesh_get_boundaries(mesh, smooth_weights); } } - smooth_iter(csmd, dm, vertexCos, numVerts, smooth_weights, (unsigned int)csmd->repeat); + smooth_iter(csmd, mesh, vertexCos, numVerts, smooth_weights, (unsigned int)csmd->repeat); if (smooth_weights) { MEM_freeN(smooth_weights); @@ -463,15 +463,15 @@ static void calc_tangent_loop_accum( static void calc_tangent_spaces( - DerivedMesh *dm, float (*vertexCos)[3], + Mesh *mesh, float (*vertexCos)[3], float (*r_tangent_spaces)[3][3]) { - const unsigned int mpoly_num = (unsigned int)dm->getNumPolys(dm); + const unsigned int mpoly_num = (unsigned int)mesh->totpoly; #ifndef USE_TANGENT_CALC_INLINE const unsigned int mvert_num = (unsigned int)dm->getNumVerts(dm); #endif - const MPoly *mpoly = dm->getPolyArray(dm); - const MLoop *mloop = dm->getLoopArray(dm); + const MPoly *mpoly = mesh->mpoly; + const MLoop *mloop = mesh->mloop; unsigned int i; for (i = 0; i < mpoly_num; i++) { @@ -522,7 +522,7 @@ static void calc_tangent_spaces( * It's not run on every update (during animation for example). */ static void calc_deltas( - CorrectiveSmoothModifierData *csmd, DerivedMesh *dm, + CorrectiveSmoothModifierData *csmd, Mesh *mesh, MDeformVert *dvert, const int defgrp_index, const float (*rest_coords)[3], unsigned int numVerts) { @@ -542,9 +542,9 @@ static void calc_deltas( csmd->delta_cache = MEM_malloc_arrayN(numVerts, sizeof(float[3]), __func__); } - smooth_verts(csmd, dm, dvert, defgrp_index, smooth_vertex_coords, numVerts); + smooth_verts(csmd, mesh, dvert, defgrp_index, smooth_vertex_coords, numVerts); - calc_tangent_spaces(dm, smooth_vertex_coords, tangent_spaces); + calc_tangent_spaces(mesh, smooth_vertex_coords, tangent_spaces); for (i = 0; i < numVerts; i++) { float imat[3][3], delta[3]; @@ -566,7 +566,7 @@ static void calc_deltas( static void correctivesmooth_modifier_do( - ModifierData *md, Object *ob, DerivedMesh *dm, + ModifierData *md, Object *ob, Mesh *mesh, float (*vertexCos)[3], unsigned int numVerts, struct BMEditMesh *em) { @@ -581,7 +581,7 @@ static void correctivesmooth_modifier_do( MDeformVert *dvert = NULL; int defgrp_index; - modifier_get_vgroup(ob, dm, csmd->defgrp_name, &dvert, &defgrp_index); + modifier_get_vgroup_mesh(ob, mesh, csmd->defgrp_name, &dvert, &defgrp_index); /* if rest bind_coords not are defined, set them (only run during bind) */ if ((csmd->rest_source == MOD_CORRECTIVESMOOTH_RESTSOURCE_BIND) && @@ -595,7 +595,7 @@ static void correctivesmooth_modifier_do( } if (UNLIKELY(use_only_smooth)) { - smooth_verts(csmd, dm, dvert, defgrp_index, vertexCos, numVerts); + smooth_verts(csmd, mesh, dvert, defgrp_index, vertexCos, numVerts); return; } @@ -651,7 +651,7 @@ static void correctivesmooth_modifier_do( TIMEIT_START(corrective_smooth_deltas); #endif - calc_deltas(csmd, dm, dvert, defgrp_index, rest_coords, numVerts); + calc_deltas(csmd, mesh, dvert, defgrp_index, rest_coords, numVerts); #ifdef DEBUG_TIME TIMEIT_END(corrective_smooth_deltas); @@ -672,7 +672,7 @@ static void correctivesmooth_modifier_do( #endif /* do the actual delta mush */ - smooth_verts(csmd, dm, dvert, defgrp_index, vertexCos, numVerts); + smooth_verts(csmd, mesh, dvert, defgrp_index, vertexCos, numVerts); { unsigned int i; @@ -682,7 +682,7 @@ static void correctivesmooth_modifier_do( /* calloc, since values are accumulated */ tangent_spaces = MEM_calloc_arrayN(numVerts, sizeof(float[3][3]), __func__); - calc_tangent_spaces(dm, vertexCos, tangent_spaces); + calc_tangent_spaces(mesh, vertexCos, tangent_spaces); for (i = 0; i < numVerts; i++) { float delta[3]; @@ -714,29 +714,29 @@ error: static void deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, ModifierApplyFlag UNUSED(flag)) + ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, + float (*vertexCos)[3], int numVerts) { - DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, false, false); + Mesh *mesh_src = get_mesh(ctx->object, NULL, mesh, NULL, false, false); - correctivesmooth_modifier_do(md, ob, dm, vertexCos, (unsigned int)numVerts, NULL); + correctivesmooth_modifier_do(md, ctx->object, mesh_src, vertexCos, (unsigned int)numVerts, NULL); - if (dm != derivedData) { - dm->release(dm); + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); } } static void deformVertsEM( - ModifierData *md, Object *ob, struct BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) + ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *editData, + Mesh *mesh, float (*vertexCos)[3], int numVerts) { - DerivedMesh *dm = get_dm(ob, editData, derivedData, NULL, false, false); + Mesh *mesh_src = get_mesh(ctx->object, editData, mesh, NULL, false, false); - correctivesmooth_modifier_do(md, ob, dm, vertexCos, (unsigned int)numVerts, editData); + correctivesmooth_modifier_do(md, ctx->object, mesh_src, vertexCos, (unsigned int)numVerts, editData); - if (dm != derivedData) { - dm->release(dm); + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); } } @@ -750,17 +750,25 @@ ModifierTypeInfo modifierType_CorrectiveSmooth = { eModifierTypeFlag_SupportsEditmode, /* copyData */ copyData, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ deformVertsEM, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ freeData, /* isDisabled */ NULL, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_curve.c b/source/blender/modifiers/intern/MOD_curve.c index 90cfc6ba076..55837eb00e4 100644 --- a/source/blender/modifiers/intern/MOD_curve.c +++ b/source/blender/modifiers/intern/MOD_curve.c @@ -34,20 +34,24 @@ #include <string.h> +#include "DNA_mesh_types.h" #include "DNA_scene_types.h" #include "DNA_object_types.h" #include "BLI_utildefines.h" -#include "BKE_cdderivedmesh.h" +#include "BKE_editmesh.h" #include "BKE_lattice.h" +#include "BKE_library.h" #include "BKE_library_query.h" +#include "BKE_mesh.h" #include "BKE_modifier.h" -#include "depsgraph_private.h" +#include "DEG_depsgraph.h" #include "DEG_depsgraph_build.h" #include "MOD_modifiertypes.h" +#include "MOD_util.h" static void initData(ModifierData *md) { @@ -67,7 +71,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) return dataMask; } -static bool isDisabled(ModifierData *md, int UNUSED(userRenderParams)) +static bool isDisabled(const Scene *UNUSED(scene), ModifierData *md, int UNUSED(userRenderParams)) { CurveModifierData *cmd = (CurveModifierData *) md; @@ -83,19 +87,6 @@ static void foreachObjectLink( walk(userData, ob, &cmd->object, IDWALK_CB_NOP); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - CurveModifierData *cmd = (CurveModifierData *) md; - - if (cmd->object) { - DagNode *curNode = dag_get_node(ctx->forest, cmd->object); - curNode->eval_flags |= DAG_EVAL_NEED_CURVE_PATH; - - dag_add_relation(ctx->forest, curNode, ctx->obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Curve Modifier"); - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { CurveModifierData *cmd = (CurveModifierData *)md; @@ -115,31 +106,43 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte } static void deformVerts( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, + ModifierData *md, + const ModifierEvalContext *ctx, + Mesh *mesh, float (*vertexCos)[3], - int numVerts, - ModifierApplyFlag UNUSED(flag)) + int numVerts) { CurveModifierData *cmd = (CurveModifierData *) md; + Mesh *mesh_src = get_mesh(ctx->object, NULL, mesh, NULL, false, false); + + BLI_assert(mesh_src->totvert == numVerts); /* silly that defaxis and curve_deform_verts are off by 1 * but leave for now to save having to call do_versions */ - curve_deform_verts(md->scene, cmd->object, ob, derivedData, vertexCos, numVerts, - cmd->name, cmd->defaxis - 1); + curve_deform_verts(cmd->object, ctx->object, mesh_src, vertexCos, numVerts, cmd->name, cmd->defaxis - 1); + + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); + } } static void deformVertsEM( - ModifierData *md, Object *ob, struct BMEditMesh *em, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) + ModifierData *md, + const ModifierEvalContext *ctx, + struct BMEditMesh *em, + Mesh *mesh, + float (*vertexCos)[3], + int numVerts) { - DerivedMesh *dm = derivedData; + Mesh *mesh_src = get_mesh(ctx->object, em, mesh, NULL, false, false); - if (!derivedData) dm = CDDM_from_editbmesh(em, false, false); + BLI_assert(mesh_src->totvert == numVerts); - deformVerts(md, ob, dm, vertexCos, numVerts, 0); + deformVerts(md, ctx, mesh_src, vertexCos, numVerts); - if (!derivedData) dm->release(dm); + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); + } } @@ -153,17 +156,25 @@ ModifierTypeInfo modifierType_Curve = { eModifierTypeFlag_SupportsEditmode, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ deformVertsEM, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ isDisabled, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_datatransfer.c b/source/blender/modifiers/intern/MOD_datatransfer.c index b6aa903ba27..8e025059d6c 100644 --- a/source/blender/modifiers/intern/MOD_datatransfer.c +++ b/source/blender/modifiers/intern/MOD_datatransfer.c @@ -37,9 +37,7 @@ #include "DNA_object_types.h" #include "BKE_customdata.h" -#include "BKE_cdderivedmesh.h" #include "BKE_data_transfer.h" -#include "BKE_DerivedMesh.h" #include "BKE_library.h" #include "BKE_library_query.h" #include "BKE_mesh_mapping.h" @@ -47,11 +45,11 @@ #include "BKE_modifier.h" #include "BKE_report.h" +#include "DEG_depsgraph_query.h" + #include "MEM_guardedalloc.h" #include "MOD_util.h" -#include "depsgraph_private.h" - /************************************** * Modifiers functions. * **************************************/ @@ -127,19 +125,6 @@ static void foreachObjectLink( walk(userData, ob, &dtmd->ob_source, IDWALK_CB_NOP); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - DataTransferModifierData *dtmd = (DataTransferModifierData *) md; - DagNode *curNode; - - if (dtmd->ob_source) { - curNode = dag_get_node(ctx->forest, dtmd->ob_source); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, - "DataTransfer Modifier"); - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { DataTransferModifierData *dtmd = (DataTransferModifierData *) md; @@ -148,7 +133,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte } } -static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(useRenderParams)) { DataTransferModifierData *dtmd = (DataTransferModifierData *) md; /* If no source object, bypass. */ @@ -163,16 +148,15 @@ static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) DT_TYPE_SHARP_FACE \ ) -static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mesh *me_mod) { DataTransferModifierData *dtmd = (DataTransferModifierData *) md; - DerivedMesh *dm = derivedData; + struct Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); + Mesh *result = me_mod; ReportList reports; /* Only used to check wehther we are operating on org data or not... */ - Mesh *me = ob->data; + Mesh *me = ctx->object->data; const bool invert_vgroup = (dtmd->flags & MOD_DATATRANSFER_INVERT_VGROUP) != 0; @@ -182,21 +166,27 @@ static DerivedMesh *applyModifier( SpaceTransform *space_transform = (dtmd->flags & MOD_DATATRANSFER_OBSRC_TRANSFORM) ? &space_transform_data : NULL; if (space_transform) { - BLI_SPACE_TRANSFORM_SETUP(space_transform, ob, dtmd->ob_source); + BLI_SPACE_TRANSFORM_SETUP(space_transform, ctx->object, dtmd->ob_source); } - MVert *mvert = dm->getVertArray(dm); - MEdge *medge = dm->getEdgeArray(dm); - if (((me->mvert == mvert) || (me->medge == medge)) && (dtmd->data_types & DT_TYPES_AFFECT_MESH)) { + if ((result == me_mod || (me->mvert == result->mvert) || (me->medge == result->medge)) && + (dtmd->data_types & DT_TYPES_AFFECT_MESH)) + { /* We need to duplicate data here, otherwise setting custom normals, edges' shaprness, etc., could * modify org mesh, see T43671. */ - dm = CDDM_copy(dm); + BKE_id_copy_ex( + NULL, &me_mod->id, (ID **)&result, + LIB_ID_CREATE_NO_MAIN | + LIB_ID_CREATE_NO_USER_REFCOUNT | + LIB_ID_CREATE_NO_DEG_TAG | + LIB_ID_COPY_NO_PREVIEW, + false); } BKE_reports_init(&reports, RPT_STORE); /* Note: no islands precision for now here. */ - BKE_object_data_transfer_dm(md->scene, dtmd->ob_source, ob, dm, dtmd->data_types, false, + BKE_object_data_transfer_ex(ctx->depsgraph, scene, dtmd->ob_source, ctx->object, result, dtmd->data_types, false, dtmd->vmap_mode, dtmd->emap_mode, dtmd->lmap_mode, dtmd->pmap_mode, space_transform, false, max_dist, dtmd->map_ray_radius, 0.0f, dtmd->layers_select_src, dtmd->layers_select_dst, @@ -208,11 +198,11 @@ static DerivedMesh *applyModifier( else if ((dtmd->data_types & DT_TYPE_LNOR) && !(me->flag & ME_AUTOSMOOTH)) { modifier_setError((ModifierData *)dtmd, "Enable 'Auto Smooth' option in mesh settings"); } - else if (dm->getNumVerts(dm) > HIGH_POLY_WARNING || ((Mesh *)(dtmd->ob_source->data))->totvert > HIGH_POLY_WARNING) { + else if (result->totvert > HIGH_POLY_WARNING || ((Mesh *)(dtmd->ob_source->data))->totvert > HIGH_POLY_WARNING) { modifier_setError(md, "You are using a rather high poly as source or destination, computation might be slow"); } - return dm; + return result; } #undef HIGH_POLY_WARNING @@ -229,17 +219,25 @@ ModifierTypeInfo modifierType_DataTransfer = { eModifierTypeFlag_UsesPreview, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ isDisabled, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ dependsOnNormals, diff --git a/source/blender/modifiers/intern/MOD_decimate.c b/source/blender/modifiers/intern/MOD_decimate.c index 3d0102a8fb9..89ed8d627f1 100644 --- a/source/blender/modifiers/intern/MOD_decimate.c +++ b/source/blender/modifiers/intern/MOD_decimate.c @@ -33,15 +33,17 @@ */ #include "DNA_object_types.h" +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "BLI_math.h" #include "BLI_utildefines.h" #include "MEM_guardedalloc.h" -#include "BKE_modifier.h" #include "BKE_deform.h" -#include "BKE_cdderivedmesh.h" +#include "BKE_mesh.h" +#include "BKE_library.h" #include "bmesh.h" #include "bmesh_tools.h" @@ -77,13 +79,12 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) return dataMask; } -static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, - ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier( + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *meshData) { DecimateModifierData *dmd = (DecimateModifierData *) md; - DerivedMesh *dm = derivedData, *result = NULL; + Mesh *mesh = meshData, *result = NULL; BMesh *bm; bool calc_face_normal; float *vweights = NULL; @@ -93,34 +94,34 @@ static DerivedMesh *applyModifier( #endif /* set up front so we dont show invalid info in the UI */ - dmd->face_count = dm->getNumPolys(dm); + dmd->face_count = mesh->totpoly; switch (dmd->mode) { case MOD_DECIM_MODE_COLLAPSE: if (dmd->percent == 1.0f) { - return dm; + return mesh; } calc_face_normal = true; break; case MOD_DECIM_MODE_UNSUBDIV: if (dmd->iter == 0) { - return dm; + return mesh; } calc_face_normal = false; break; case MOD_DECIM_MODE_DISSOLVE: if (dmd->angle == 0.0f) { - return dm; + return mesh; } calc_face_normal = true; break; default: - return dm; + return mesh; } if (dmd->face_count <= 3) { modifier_setError(md, "Modifier requires more than 3 input faces"); - return dm; + return mesh; } if (dmd->mode == MOD_DECIM_MODE_COLLAPSE) { @@ -128,10 +129,10 @@ static DerivedMesh *applyModifier( MDeformVert *dvert; int defgrp_index; - modifier_get_vgroup(ob, dm, dmd->defgrp_name, &dvert, &defgrp_index); + modifier_get_vgroup_mesh(ctx->object, mesh, dmd->defgrp_name, &dvert, &defgrp_index); if (dvert) { - const unsigned int vert_tot = dm->getNumVerts(dm); + const unsigned int vert_tot = mesh->totvert; unsigned int i; vweights = MEM_malloc_arrayN(vert_tot, sizeof(float), __func__); @@ -150,7 +151,10 @@ static DerivedMesh *applyModifier( } } - bm = DM_to_bmesh(dm, calc_face_normal); + bm = BKE_mesh_to_bmesh_ex( + mesh, + &((struct BMeshCreateParams){0}), + &((struct BMeshFromMeshParams){.calc_face_normal = calc_face_normal,})); switch (dmd->mode) { case MOD_DECIM_MODE_COLLAPSE: @@ -182,7 +186,7 @@ static DerivedMesh *applyModifier( /* update for display only */ dmd->face_count = bm->totface; - result = CDDM_from_bmesh(bm, false); + result = BKE_bmesh_to_mesh_nomain(bm, &((struct BMeshToMeshParams){0})); BLI_assert(bm->vtoolflagpool == NULL && bm->etoolflagpool == NULL && bm->ftoolflagpool == NULL); /* make sure we never alloc'd these */ @@ -196,7 +200,7 @@ static DerivedMesh *applyModifier( TIMEIT_END(decim); #endif - result->dirty = DM_DIRTY_NORMALS; + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; return result; } @@ -208,18 +212,27 @@ ModifierTypeInfo modifierType_Decimate = { /* type */ eModifierTypeType_Nonconstructive, /* flags */ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_AcceptsCVs, + /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_displace.c b/source/blender/modifiers/intern/MOD_displace.c index ed78e026a7f..351a496daa1 100644 --- a/source/blender/modifiers/intern/MOD_displace.c +++ b/source/blender/modifiers/intern/MOD_displace.c @@ -33,6 +33,7 @@ */ +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" @@ -40,7 +41,8 @@ #include "BLI_math.h" #include "BLI_task.h" -#include "BKE_cdderivedmesh.h" +#include "BKE_customdata.h" +#include "BKE_editmesh.h" #include "BKE_library.h" #include "BKE_library_query.h" #include "BKE_image.h" @@ -50,7 +52,9 @@ #include "BKE_deform.h" #include "BKE_object.h" -#include "depsgraph_private.h" +#include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" + #include "MEM_guardedalloc.h" #include "MOD_util.h" @@ -134,33 +138,12 @@ static void foreachTexLink( walk(userData, ob, md, "texture"); } -static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(useRenderParams)) { DisplaceModifierData *dmd = (DisplaceModifierData *) md; return ((!dmd->texture && dmd->direction == MOD_DISP_DIR_RGB_XYZ) || dmd->strength == 0.0f); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - DisplaceModifierData *dmd = (DisplaceModifierData *) md; - - if (dmd->map_object && dmd->texmapping == MOD_DISP_MAP_OBJECT) { - DagNode *curNode = dag_get_node(ctx->forest, dmd->map_object); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Displace Modifier"); - } - - - if (dmd->texmapping == MOD_DISP_MAP_GLOBAL || - (ELEM(dmd->direction, MOD_DISP_DIR_X, MOD_DISP_DIR_Y, MOD_DISP_DIR_Z, MOD_DISP_DIR_RGB_XYZ) && - dmd->space == MOD_DISP_SPACE_GLOBAL)) - { - dag_add_relation(ctx->forest, ctx->obNode, ctx->obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Displace Modifier"); - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { DisplaceModifierData *dmd = (DisplaceModifierData *)md; @@ -177,6 +160,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte typedef struct DisplaceUserdata { /*const*/ DisplaceModifierData *dmd; + struct Scene *scene; struct ImagePool *pool; MDeformVert *dvert; float weight; @@ -223,7 +207,7 @@ static void displaceModifier_do_task( if (dmd->texture) { texres.nor = NULL; - BKE_texture_get_value_ex(dmd->modifier.scene, dmd->texture, tex_co[iter], &texres, data->pool, false); + BKE_texture_get_value_ex(data->scene, dmd->texture, tex_co[iter], &texres, data->pool, false); delta = texres.tin - dmd->midlevel; } else { @@ -289,11 +273,12 @@ static void displaceModifier_do_task( } } -/* dm must be a CDDerivedMesh */ static void displaceModifier_do( - DisplaceModifierData *dmd, Object *ob, - DerivedMesh *dm, float (*vertexCos)[3], int numVerts) + DisplaceModifierData *dmd, const ModifierEvalContext *ctx, + Mesh *mesh, float (*vertexCos)[3], const int numVerts) { + Object *ob = ctx->object; + Depsgraph *depsgraph = ctx->depsgraph; MVert *mvert; MDeformVert *dvert; int direction = dmd->direction; @@ -307,33 +292,33 @@ static void displaceModifier_do( if (!dmd->texture && dmd->direction == MOD_DISP_DIR_RGB_XYZ) return; if (dmd->strength == 0.0f) return; - mvert = CDDM_get_verts(dm); - modifier_get_vgroup(ob, dm, dmd->defgrp_name, &dvert, &defgrp_index); + mvert = mesh->mvert; + modifier_get_vgroup_mesh(ob, mesh, dmd->defgrp_name, &dvert, &defgrp_index); if (dmd->texture) { tex_co = MEM_calloc_arrayN((size_t)numVerts, sizeof(*tex_co), "displaceModifier_do tex_co"); - get_texture_coords((MappingInfoModifierData *)dmd, ob, dm, vertexCos, tex_co, numVerts); + get_texture_coords_mesh((MappingInfoModifierData *)dmd, ob, mesh, vertexCos, tex_co); - modifier_init_texture(dmd->modifier.scene, dmd->texture); + modifier_init_texture(depsgraph, dmd->texture); } else { tex_co = NULL; } if (direction == MOD_DISP_DIR_CLNOR) { - CustomData *ldata = dm->getLoopDataLayout(dm); + CustomData *ldata = &mesh->ldata; if (CustomData_has_layer(ldata, CD_CUSTOMLOOPNORMAL)) { float (*clnors)[3] = NULL; - if ((dm->dirty & DM_DIRTY_NORMALS) || !CustomData_has_layer(ldata, CD_NORMAL)) { - dm->calcLoopNormals(dm, true, (float)M_PI); + if ((mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL) || !CustomData_has_layer(ldata, CD_NORMAL)) { + BKE_mesh_calc_normals_split(mesh); } clnors = CustomData_get_layer(ldata, CD_NORMAL); vert_clnors = MEM_malloc_arrayN(numVerts, sizeof(*vert_clnors), __func__); - BKE_mesh_normals_loop_to_vertex(numVerts, dm->getLoopArray(dm), dm->getNumLoops(dm), + BKE_mesh_normals_loop_to_vertex(numVerts, mesh->mloop, mesh->totloop, (const float (*)[3])clnors, vert_clnors); } else { @@ -347,6 +332,7 @@ static void displaceModifier_do( } DisplaceUserdata data = {NULL}; + data.scene = DEG_get_evaluated_scene(ctx->depsgraph); data.dmd = dmd; data.dvert = dvert; data.weight = weight; @@ -384,32 +370,36 @@ static void displaceModifier_do( } static void deformVerts( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, + ModifierData *md, + const ModifierEvalContext *ctx, + Mesh *mesh, float (*vertexCos)[3], - int numVerts, - ModifierApplyFlag UNUSED(flag)) + int numVerts) { - DerivedMesh *dm = get_cddm(ob, NULL, derivedData, vertexCos, dependsOnNormals(md)); + Mesh *mesh_src = get_mesh(ctx->object, NULL, mesh, NULL, false, false); + + BLI_assert(mesh_src->totvert == numVerts); - displaceModifier_do((DisplaceModifierData *)md, ob, dm, - vertexCos, numVerts); + displaceModifier_do((DisplaceModifierData *)md, ctx, mesh_src, vertexCos, numVerts); - if (dm != derivedData) - dm->release(dm); + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); + } } static void deformVertsEM( - ModifierData *md, Object *ob, struct BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) + ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *editData, + Mesh *mesh, float (*vertexCos)[3], int numVerts) { - DerivedMesh *dm = get_cddm(ob, editData, derivedData, vertexCos, dependsOnNormals(md)); + Mesh *mesh_src = get_mesh(ctx->object, editData, mesh, NULL, false, false); - displaceModifier_do((DisplaceModifierData *)md, ob, dm, - vertexCos, numVerts); + BLI_assert(mesh_src->totvert == numVerts); - if (dm != derivedData) - dm->release(dm); + displaceModifier_do((DisplaceModifierData *)md, ctx, mesh_src, vertexCos, numVerts); + + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); + } } @@ -422,17 +412,25 @@ ModifierTypeInfo modifierType_Displace = { eModifierTypeFlag_SupportsEditmode, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ deformVertsEM, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ isDisabled, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ dependsOnTime, /* dependsOnNormals */ dependsOnNormals, diff --git a/source/blender/modifiers/intern/MOD_dynamicpaint.c b/source/blender/modifiers/intern/MOD_dynamicpaint.c index 8d3aea2d5c8..6619f0079e7 100644 --- a/source/blender/modifiers/intern/MOD_dynamicpaint.c +++ b/source/blender/modifiers/intern/MOD_dynamicpaint.c @@ -36,14 +36,14 @@ #include "BKE_cdderivedmesh.h" #include "BKE_dynamicpaint.h" -#include "BKE_global.h" +#include "BKE_layer.h" #include "BKE_library.h" #include "BKE_library_query.h" -#include "BKE_main.h" #include "BKE_modifier.h" -#include "depsgraph_private.h" +#include "DEG_depsgraph.h" #include "DEG_depsgraph_build.h" +#include "DEG_depsgraph_query.h" #include "MOD_modifiertypes.h" @@ -82,7 +82,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ || surface->init_color_type == MOD_DPAINT_INITIAL_TEXTURE) { - dataMask |= CD_MASK_MLOOPUV | CD_MASK_MTEXPOLY; + dataMask |= CD_MASK_MLOOPUV; } /* mcol */ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT || @@ -96,25 +96,19 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) } } } - - if (pmd->brush) { - if (pmd->brush->flags & MOD_DPAINT_USE_MATERIAL) { - dataMask |= CD_MASK_MLOOPUV | CD_MASK_MTEXPOLY; - } - } return dataMask; } static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, - DerivedMesh *dm, - ModifierApplyFlag flag) + ModifierData *md, const ModifierEvalContext *ctx, + DerivedMesh *dm) { DynamicPaintModifierData *pmd = (DynamicPaintModifierData *) md; /* dont apply dynamic paint on orco dm stack */ - if (!(flag & MOD_APPLY_ORCO)) { - return dynamicPaint_Modifier_do(G.main, G.main->eval_ctx, pmd, md->scene, ob, dm); + if (!(ctx->flag & MOD_APPLY_ORCO)) { + Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); + return dynamicPaint_Modifier_do(pmd, ctx->depsgraph, scene, ctx->object, dm); } return dm; } @@ -124,27 +118,6 @@ static bool is_brush_cb(Object *UNUSED(ob), ModifierData *pmd) return ((DynamicPaintModifierData *)pmd)->brush != NULL; } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - DynamicPaintModifierData *pmd = (DynamicPaintModifierData *) md; - - /* add relation from canvases to all brush objects */ - if (pmd && pmd->canvas) { -#ifdef WITH_LEGACY_DEPSGRAPH - for (DynamicPaintSurface *surface = pmd->canvas->surfaces.first; surface; surface = surface->next) { - if (surface->effect & MOD_DPAINT_EFFECT_DO_DRIP) { - dag_add_forcefield_relations(ctx->forest, ctx->scene, ctx->object, ctx->obNode, surface->effector_weights, true, 0, "Dynamic Paint Field"); - } - - /* Actual code uses custom loop over group/scene without layer checks in dynamicPaint_doStep */ - dag_add_collision_relations(ctx->forest, ctx->scene, ctx->object, ctx->obNode, surface->brush_group, -1, eModifierType_DynamicPaint, is_brush_cb, false, "Dynamic Paint Brush"); - } -#else - (void)ctx; -#endif - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)md; @@ -156,7 +129,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte } /* Actual code uses custom loop over group/scene without layer checks in dynamicPaint_doStep */ - DEG_add_collision_relations(ctx->node, ctx->scene, ctx->object, surface->brush_group, -1, eModifierType_DynamicPaint, is_brush_cb, false, "Dynamic Paint Brush"); + DEG_add_collision_relations(ctx->node, ctx->scene, ctx->object, surface->brush_group, eModifierType_DynamicPaint, is_brush_cb, false, "Dynamic Paint Brush"); } } } @@ -183,9 +156,6 @@ static void foreachIDLink( } } } - if (pmd->brush) { - walk(userData, ob, (ID **)&pmd->brush->mat, IDWALK_CB_USER); - } } static void foreachTexLink( @@ -207,17 +177,25 @@ ModifierTypeInfo modifierType_DynamicPaint = { eModifierTypeFlag_UsesPreview, /* copyData */ copyData, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ applyModifier, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, - /* applyModifier */ applyModifier, + /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ freeData, /* isDisabled */ NULL, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ dependsOnTime, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c index 1de698a6218..a8d4d55c5d3 100644 --- a/source/blender/modifiers/intern/MOD_edgesplit.c +++ b/source/blender/modifiers/intern/MOD_edgesplit.c @@ -40,26 +40,36 @@ #include "BLI_utildefines.h" #include "BLI_math.h" -#include "BKE_cdderivedmesh.h" +#include "BKE_library.h" +#include "BKE_mesh.h" #include "BKE_modifier.h" #include "bmesh.h" #include "bmesh_tools.h" +#include "DNA_mesh_types.h" #include "DNA_object_types.h" #include "MOD_modifiertypes.h" -static DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd) +static Mesh *doEdgeSplit(Mesh *mesh, EdgeSplitModifierData *emd, const ModifierEvalContext *ctx) { - DerivedMesh *result; + Mesh *result; BMesh *bm; BMIter iter; BMEdge *e; float threshold = cosf(emd->split_angle + 0.000000175f); const bool calc_face_normals = (emd->flags & MOD_EDGESPLIT_FROMANGLE) != 0; - bm = DM_to_bmesh(dm, calc_face_normals); + bm = BKE_mesh_to_bmesh_ex( + mesh, + &(struct BMeshCreateParams){0}, + &(struct BMeshFromMeshParams){ + .calc_face_normal = calc_face_normals, + .add_key_index = false, + .use_shapekey = true, + .active_shapekey = ctx->object->shapenr, + }); if (emd->flags & MOD_EDGESPLIT_FROMANGLE) { BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) { @@ -96,10 +106,10 @@ static DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd) /* BM_mesh_validate(bm); */ /* for troubleshooting */ - result = CDDM_from_bmesh(bm, true); + result = BKE_bmesh_to_mesh_nomain(bm, &((struct BMeshToMeshParams){0})); BM_mesh_free(bm); - result->dirty |= DM_DIRTY_NORMALS; + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; return result; } @@ -112,17 +122,18 @@ static void initData(ModifierData *md) emd->flags = MOD_EDGESPLIT_FROMANGLE | MOD_EDGESPLIT_FROMFLAG; } -static DerivedMesh *applyModifier( - ModifierData *md, Object *UNUSED(ob), DerivedMesh *dm, - ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier( + ModifierData *md, + const ModifierEvalContext *ctx, + Mesh *mesh) { - DerivedMesh *result; + Mesh *result; EdgeSplitModifierData *emd = (EdgeSplitModifierData *) md; if (!(emd->flags & (MOD_EDGESPLIT_FROMANGLE | MOD_EDGESPLIT_FROMFLAG))) - return dm; + return mesh; - result = doEdgeSplit(dm, emd); + result = doEdgeSplit(mesh, emd, ctx); return result; } @@ -140,17 +151,25 @@ ModifierTypeInfo modifierType_EdgeSplit = { eModifierTypeFlag_EnableInEditmode, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ NULL, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_explode.c b/source/blender/modifiers/intern/MOD_explode.c index a7f09aec481..948aaf0751e 100644 --- a/source/blender/modifiers/intern/MOD_explode.c +++ b/source/blender/modifiers/intern/MOD_explode.c @@ -51,6 +51,8 @@ #include "BKE_particle.h" #include "BKE_scene.h" +#include "DEG_depsgraph_query.h" + #include "MEM_guardedalloc.h" #include "MOD_modifiertypes.h" @@ -148,7 +150,7 @@ static void createFacepa( /* make tree of emitter locations */ tree = BLI_kdtree_new(totpart); for (p = 0, pa = psys->particles; p < totpart; p++, pa++) { - psys_particle_on_emitter(psmd, psys->part->from, pa->num, pa->num_dmcache, pa->fuv, pa->foffset, co, NULL, NULL, NULL, NULL, NULL); + psys_particle_on_emitter(psmd, psys->part->from, pa->num, pa->num_dmcache, pa->fuv, pa->foffset, co, NULL, NULL, NULL, NULL); BLI_kdtree_insert(tree, p, co); } BLI_kdtree_balance(tree); @@ -788,7 +790,7 @@ static DerivedMesh *cutEdges(ExplodeModifierData *emd, DerivedMesh *dm) } static DerivedMesh *explodeMesh( ExplodeModifierData *emd, - ParticleSystemModifierData *psmd, Scene *scene, Object *ob, + ParticleSystemModifierData *psmd, const ModifierEvalContext *ctx, Scene *scene, DerivedMesh *to_explode) { DerivedMesh *explode, *dm = to_explode; @@ -814,8 +816,9 @@ static DerivedMesh *explodeMesh( mface = dm->getTessFaceArray(dm); totpart = psmd->psys->totpart; + sim.depsgraph = ctx->depsgraph; sim.scene = scene; - sim.ob = ob; + sim.ob = ctx->object; sim.psys = psmd->psys; sim.psmd = psmd; @@ -870,7 +873,7 @@ static DerivedMesh *explodeMesh( /*dupvert = CDDM_get_verts(explode);*/ /* getting back to object space */ - invert_m4_m4(imat, ob->obmat); + invert_m4_m4(imat, ctx->object->obmat); psmd->psys->lattice_deform_data = psys_create_lattice_deform_data(&sim); @@ -901,7 +904,7 @@ static DerivedMesh *explodeMesh( psys_get_particle_state(&sim, ed_v2, &state, 1); vertco = CDDM_get_vert(explode, v)->co; - mul_m4_v3(ob->obmat, vertco); + mul_m4_v3(ctx->object->obmat, vertco); sub_v3_v3(vertco, birth.co); @@ -996,20 +999,19 @@ static ParticleSystemModifierData *findPrecedingParticlesystem(Object *ob, Modif return psmd; } static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, - ModifierApplyFlag UNUSED(flag)) + ModifierData *md, const ModifierEvalContext *ctx, + DerivedMesh *derivedData) { DerivedMesh *dm = derivedData; ExplodeModifierData *emd = (ExplodeModifierData *) md; - ParticleSystemModifierData *psmd = findPrecedingParticlesystem(ob, md); + ParticleSystemModifierData *psmd = findPrecedingParticlesystem(ctx->object, md); if (psmd) { ParticleSystem *psys = psmd->psys; if (psys == NULL || psys->totpart == 0) return derivedData; if (psys->part == NULL || psys->particles == NULL) return derivedData; - if (psmd->dm_final == NULL) return derivedData; + if (psmd->mesh_final == NULL) return derivedData; DM_ensure_tessface(dm); /* BMESH - UNTIL MODIFIER IS UPDATED FOR MPoly */ @@ -1028,18 +1030,20 @@ static DerivedMesh *applyModifier( createFacepa(emd, psmd, derivedData); } /* 2. create new mesh */ + Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); if (emd->flag & eExplodeFlag_EdgeCut) { int *facepa = emd->facepa; DerivedMesh *splitdm = cutEdges(emd, dm); - DerivedMesh *explode = explodeMesh(emd, psmd, md->scene, ob, splitdm); + DerivedMesh *explode = explodeMesh(emd, psmd, ctx, scene, splitdm); MEM_freeN(emd->facepa); emd->facepa = facepa; splitdm->release(splitdm); return explode; } - else - return explodeMesh(emd, psmd, md->scene, ob, derivedData); + else { + return explodeMesh(emd, psmd, ctx, scene, derivedData); + } } return derivedData; } @@ -1052,17 +1056,25 @@ ModifierTypeInfo modifierType_Explode = { /* type */ eModifierTypeType_Constructive, /* flags */ eModifierTypeFlag_AcceptsMesh, /* copyData */ copyData, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ applyModifier, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, - /* applyModifier */ applyModifier, + /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ freeData, /* isDisabled */ NULL, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ dependsOnTime, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_fluidsim.c b/source/blender/modifiers/intern/MOD_fluidsim.c index 00b7f245d4c..ffa74be0b33 100644 --- a/source/blender/modifiers/intern/MOD_fluidsim.c +++ b/source/blender/modifiers/intern/MOD_fluidsim.c @@ -41,9 +41,9 @@ #include "BKE_cdderivedmesh.h" +#include "BKE_layer.h" #include "BKE_modifier.h" -#include "depsgraph_private.h" #include "DEG_depsgraph_build.h" #include "MOD_fluidsim_util.h" @@ -86,9 +86,8 @@ static void copyData(const ModifierData *md, ModifierData *target) static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, - DerivedMesh *dm, - ModifierApplyFlag flag) + ModifierData *md, const ModifierEvalContext *ctx, + DerivedMesh *dm) { FluidsimModifierData *fluidmd = (FluidsimModifierData *) md; DerivedMesh *result = NULL; @@ -102,43 +101,18 @@ static DerivedMesh *applyModifier( } } - result = fluidsimModifier_do(fluidmd, md->scene, ob, dm, flag & MOD_APPLY_RENDER, flag & MOD_APPLY_USECACHE); + result = fluidsimModifier_do(fluidmd, ctx, dm); return result ? result : dm; } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - FluidsimModifierData *fluidmd = (FluidsimModifierData *) md; - Base *base; - - if (fluidmd && fluidmd->fss) { - if (fluidmd->fss->type == OB_FLUIDSIM_DOMAIN) { - for (base = ctx->scene->base.first; base; base = base->next) { - Object *ob1 = base->object; - if (ob1 != ctx->object) { - FluidsimModifierData *fluidmdtmp = - (FluidsimModifierData *)modifiers_findByType(ob1, eModifierType_Fluidsim); - - /* only put dependencies from NON-DOMAIN fluids in here */ - if (fluidmdtmp && fluidmdtmp->fss && (fluidmdtmp->fss->type != OB_FLUIDSIM_DOMAIN)) { - DagNode *curNode = dag_get_node(ctx->forest, ob1); - dag_add_relation(ctx->forest, curNode, ctx->obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Fluidsim Object"); - } - } - } - } - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { FluidsimModifierData *fluidmd = (FluidsimModifierData *) md; if (fluidmd && fluidmd->fss) { if (fluidmd->fss->type == OB_FLUIDSIM_DOMAIN) { - Base *base; - for (base = ctx->scene->base.first; base; base = base->next) { - Object *ob1 = base->object; + FOREACH_SCENE_OBJECT_BEGIN(ctx->scene, ob1) + { if (ob1 != ctx->object) { FluidsimModifierData *fluidmdtmp = (FluidsimModifierData *)modifiers_findByType(ob1, eModifierType_Fluidsim); @@ -149,6 +123,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte } } } + FOREACH_SCENE_OBJECT_END; } } } @@ -170,17 +145,25 @@ ModifierTypeInfo modifierType_Fluidsim = { eModifierTypeFlag_Single, /* copyData */ copyData, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ applyModifier, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, - /* applyModifier */ applyModifier, + /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ NULL, /* freeData */ freeData, /* isDisabled */ NULL, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ dependsOnTime, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_fluidsim_util.c b/source/blender/modifiers/intern/MOD_fluidsim_util.c index e366116a5fb..cea9e69526c 100644 --- a/source/blender/modifiers/intern/MOD_fluidsim_util.c +++ b/source/blender/modifiers/intern/MOD_fluidsim_util.c @@ -53,6 +53,9 @@ # include "BKE_global.h" #endif +#include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" + #include "MOD_fluidsim_util.h" #include "MOD_modifiertypes.h" @@ -513,17 +516,20 @@ static DerivedMesh *fluidsim_read_cache( #endif // WITH_MOD_FLUID DerivedMesh *fluidsimModifier_do( - FluidsimModifierData *fluidmd, Scene *scene, - Object *ob, - DerivedMesh *dm, - int useRenderParams, int UNUSED(isFinalCalc)) + FluidsimModifierData *fluidmd, + const ModifierEvalContext *ctx, + DerivedMesh *dm) { #ifdef WITH_MOD_FLUID + Object *ob = ctx->object; + Depsgraph *depsgraph = ctx->depsgraph; + const bool useRenderParams = (ctx->flag & MOD_APPLY_RENDER) != 0; +// const bool isFinalCalc = (ctx->flag & MOD_APPLY_USECACHE) != 0; DerivedMesh *result = NULL; int framenr; FluidsimSettings *fss = NULL; - framenr = (int)scene->r.cfra; + framenr = (int)DEG_get_ctime(depsgraph); /* only handle fluidsim domains */ if (fluidmd && fluidmd->fss && (fluidmd->fss->type != OB_FLUIDSIM_DOMAIN)) @@ -553,10 +559,8 @@ DerivedMesh *fluidsimModifier_do( #else /* unused */ (void)fluidmd; - (void)scene; - (void)ob; + (void)ctx; (void)dm; - (void)useRenderParams; return NULL; #endif } diff --git a/source/blender/modifiers/intern/MOD_fluidsim_util.h b/source/blender/modifiers/intern/MOD_fluidsim_util.h index 61ad270f6c8..3329e6dbebe 100644 --- a/source/blender/modifiers/intern/MOD_fluidsim_util.h +++ b/source/blender/modifiers/intern/MOD_fluidsim_util.h @@ -37,6 +37,7 @@ struct Object; struct Scene; struct FluidsimModifierData; struct DerivedMesh; +struct ModifierEvalContext; /* new fluid-modifier interface */ void fluidsim_init(struct FluidsimModifierData *fluidmd); @@ -44,8 +45,8 @@ void fluidsim_free(struct FluidsimModifierData *fluidmd); struct DerivedMesh *fluidsimModifier_do( struct FluidsimModifierData *fluidmd, - struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, - int useRenderParams, int isFinalCalc); + const struct ModifierEvalContext *ctx, + struct DerivedMesh *dm); #endif diff --git a/source/blender/modifiers/intern/MOD_hook.c b/source/blender/modifiers/intern/MOD_hook.c index 5bbcaee2caa..f80cb9d6073 100644 --- a/source/blender/modifiers/intern/MOD_hook.c +++ b/source/blender/modifiers/intern/MOD_hook.c @@ -33,6 +33,7 @@ */ +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" @@ -40,14 +41,14 @@ #include "BLI_utildefines.h" #include "BKE_action.h" -#include "BKE_cdderivedmesh.h" +#include "BKE_editmesh.h" +#include "BKE_library.h" #include "BKE_library_query.h" +#include "BKE_mesh.h" #include "BKE_modifier.h" #include "BKE_deform.h" #include "BKE_colortools.h" - -#include "depsgraph_private.h" #include "MEM_guardedalloc.h" #include "MOD_util.h" @@ -95,7 +96,7 @@ static void freeData(ModifierData *md) MEM_SAFE_FREE(hmd->indexar); } -static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(useRenderParams)) { HookModifierData *hmd = (HookModifierData *) md; @@ -111,20 +112,6 @@ static void foreachObjectLink( walk(userData, ob, &hmd->object, IDWALK_CB_NOP); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - HookModifierData *hmd = (HookModifierData *) md; - - if (hmd->object) { - DagNode *curNode = dag_get_node(ctx->forest, hmd->object); - - if (hmd->subtarget[0]) - dag_add_relation(ctx->forest, curNode, ctx->obNode, DAG_RL_OB_DATA | DAG_RL_DATA_DATA, "Hook Modifier"); - else - dag_add_relation(ctx->forest, curNode, ctx->obNode, DAG_RL_OB_DATA, "Hook Modifier"); - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { HookModifierData *hmd = (HookModifierData *)md; @@ -265,7 +252,7 @@ static void hook_co_apply(struct HookData_cb *hd, const int j) } static void deformVerts_do( - HookModifierData *hmd, Object *ob, DerivedMesh *dm, + HookModifierData *hmd, Object *ob, Mesh *mesh, float (*vertexCos)[3], int numVerts) { bPoseChannel *pchan = BKE_pose_channel_find_name(hmd->object->pose, hmd->subtarget); @@ -284,7 +271,7 @@ static void deformVerts_do( /* Generic data needed for applying per-vertex calculations (initialize all members) */ hd.vertexCos = vertexCos; - modifier_get_vgroup(ob, dm, hmd->name, &hd.dvert, &hd.defgrp_index); + modifier_get_vgroup_mesh(ob, mesh, hmd->name, &hd.dvert, &hd.defgrp_index); hd.curfalloff = hmd->curfalloff; @@ -333,8 +320,8 @@ static void deformVerts_do( else if (hmd->indexar) { /* vertex indices? */ const int *origindex_ar; - /* if DerivedMesh is present and has original index data, use it */ - if (dm && (origindex_ar = dm->getVertDataArray(dm, CD_ORIGINDEX))) { + /* if mesh is present and has original index data, use it */ + if (mesh && (origindex_ar = CustomData_get_layer(&mesh->vdata, CD_ORIGINDEX))) { for (i = 0, index_pt = hmd->indexar; i < hmd->totindex; i++, index_pt++) { if (*index_pt < numVerts) { int j; @@ -347,7 +334,7 @@ static void deformVerts_do( } } } - else { /* missing dm or ORIGINDEX */ + else { /* missing mesh or ORIGINDEX */ for (i = 0, index_pt = hmd->indexar; i < hmd->totindex; i++, index_pt++) { if (*index_pt < numVerts) { hook_co_apply(&hd, *index_pt); @@ -363,39 +350,34 @@ static void deformVerts_do( } static void deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, - ModifierApplyFlag UNUSED(flag)) + struct ModifierData *md, const struct ModifierEvalContext *ctx, struct Mesh *mesh, + float (*vertexCos)[3], int numVerts) { - HookModifierData *hmd = (HookModifierData *) md; - DerivedMesh *dm = derivedData; - /* We need a valid dm for meshes when a vgroup is set... */ - if (!dm && ob->type == OB_MESH && hmd->name[0] != '\0') - dm = get_dm(ob, NULL, dm, NULL, false, false); + HookModifierData *hmd = (HookModifierData *)md; + Mesh *mesh_src = get_mesh(ctx->object, NULL, mesh, NULL, false, false); - deformVerts_do(hmd, ob, dm, vertexCos, numVerts); + deformVerts_do(hmd, ctx->object, mesh_src, vertexCos, numVerts); - if (derivedData != dm) - dm->release(dm); + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); + } } static void deformVertsEM( - ModifierData *md, Object *ob, struct BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) + struct ModifierData *md, const struct ModifierEvalContext *ctx, + struct BMEditMesh *editData, + struct Mesh *mesh, float (*vertexCos)[3], int numVerts) { - HookModifierData *hmd = (HookModifierData *) md; - DerivedMesh *dm = derivedData; - /* We need a valid dm for meshes when a vgroup is set... */ - if (!dm && ob->type == OB_MESH && hmd->name[0] != '\0') - dm = get_dm(ob, editData, dm, NULL, false, false); + HookModifierData *hmd = (HookModifierData *)md; + Mesh *mesh_src = get_mesh(ctx->object, editData, mesh, NULL, false, false); - deformVerts_do(hmd, ob, dm, vertexCos, numVerts); + deformVerts_do(hmd, ctx->object, mesh_src, vertexCos, numVerts); - if (derivedData != dm) - dm->release(dm); + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); + } } - ModifierTypeInfo modifierType_Hook = { /* name */ "Hook", /* structName */ "HookModifierData", @@ -405,17 +387,25 @@ ModifierTypeInfo modifierType_Hook = { eModifierTypeFlag_AcceptsLattice | eModifierTypeFlag_SupportsEditmode, /* copyData */ copyData, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ deformVertsEM, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ freeData, /* isDisabled */ isDisabled, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_laplaciandeform.c b/source/blender/modifiers/intern/MOD_laplaciandeform.c index 81cfa980135..6ece9fb1f1b 100644 --- a/source/blender/modifiers/intern/MOD_laplaciandeform.c +++ b/source/blender/modifiers/intern/MOD_laplaciandeform.c @@ -35,10 +35,15 @@ #include "MEM_guardedalloc.h" +#include "BKE_deform.h" +#include "BKE_editmesh.h" +#include "BKE_library.h" #include "BKE_mesh_mapping.h" -#include "BKE_cdderivedmesh.h" +#include "BKE_mesh_runtime.h" #include "BKE_particle.h" -#include "BKE_deform.h" + +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "MOD_util.h" @@ -499,18 +504,18 @@ static void laplacianDeformPreview(LaplacianSystem *sys, float (*vertexCos)[3]) } } -static bool isValidVertexGroup(LaplacianDeformModifierData *lmd, Object *ob, DerivedMesh *dm) +static bool isValidVertexGroup(LaplacianDeformModifierData *lmd, Object *ob, Mesh *mesh) { int defgrp_index; MDeformVert *dvert = NULL; - modifier_get_vgroup(ob, dm, lmd->anchor_grp_name, &dvert, &defgrp_index); + modifier_get_vgroup_mesh(ob, mesh, lmd->anchor_grp_name, &dvert, &defgrp_index); return (dvert != NULL); } static void initSystem( - LaplacianDeformModifierData *lmd, Object *ob, DerivedMesh *dm, + LaplacianDeformModifierData *lmd, Object *ob, Mesh *mesh, float (*vertexCos)[3], int numVerts) { int i; @@ -521,7 +526,7 @@ static void initSystem( MDeformVert *dv = NULL; LaplacianSystem *sys; - if (isValidVertexGroup(lmd, ob, dm)) { + if (isValidVertexGroup(lmd, ob, mesh)) { int *index_anchors = MEM_malloc_arrayN(numVerts, sizeof(int), __func__); /* over-alloc */ const MLoopTri *mlooptri; const MLoop *mloop; @@ -530,7 +535,7 @@ static void initSystem( STACK_INIT(index_anchors, numVerts); - modifier_get_vgroup(ob, dm, lmd->anchor_grp_name, &dvert, &defgrp_index); + modifier_get_vgroup_mesh(ob, mesh, lmd->anchor_grp_name, &dvert, &defgrp_index); BLI_assert(dvert != NULL); dv = dvert; for (i = 0; i < numVerts; i++) { @@ -542,8 +547,8 @@ static void initSystem( } total_anchors = STACK_SIZE(index_anchors); - lmd->cache_system = initLaplacianSystem(numVerts, dm->getNumEdges(dm), dm->getNumLoopTri(dm), - total_anchors, lmd->anchor_grp_name, lmd->repeat); + lmd->cache_system = initLaplacianSystem(numVerts, mesh->totedge, BKE_mesh_runtime_looptri_len(mesh), + total_anchors, lmd->anchor_grp_name, lmd->repeat); sys = (LaplacianSystem *)lmd->cache_system; memcpy(sys->index_anchors, index_anchors, sizeof(int) * total_anchors); memcpy(sys->co, vertexCos, sizeof(float[3]) * numVerts); @@ -553,15 +558,15 @@ static void initSystem( lmd->total_verts = numVerts; createFaceRingMap( - dm->getNumVerts(dm), dm->getLoopTriArray(dm), dm->getNumLoopTri(dm), - dm->getLoopArray(dm), &sys->ringf_map, &sys->ringf_indices); + mesh->totvert, BKE_mesh_runtime_looptri_ensure(mesh), BKE_mesh_runtime_looptri_len(mesh), + mesh->mloop, &sys->ringf_map, &sys->ringf_indices); createVertRingMap( - dm->getNumVerts(dm), dm->getEdgeArray(dm), dm->getNumEdges(dm), + mesh->totvert, mesh->medge, mesh->totedge, &sys->ringv_map, &sys->ringv_indices); - mlooptri = dm->getLoopTriArray(dm); - mloop = dm->getLoopArray(dm); + mlooptri = BKE_mesh_runtime_looptri_ensure(mesh); + mloop = mesh->mloop;; for (i = 0; i < sys->total_tris; i++) { sys->tris[i][0] = mloop[mlooptri[i].tri[0]].v; @@ -571,7 +576,7 @@ static void initSystem( } } -static int isSystemDifferent(LaplacianDeformModifierData *lmd, Object *ob, DerivedMesh *dm, int numVerts) +static int isSystemDifferent(LaplacianDeformModifierData *lmd, Object *ob, Mesh *mesh, int numVerts) { int i; int defgrp_index; @@ -584,13 +589,13 @@ static int isSystemDifferent(LaplacianDeformModifierData *lmd, Object *ob, Deriv if (sys->total_verts != numVerts) { return LAPDEFORM_SYSTEM_CHANGE_VERTEXES; } - if (sys->total_edges != dm->getNumEdges(dm)) { + if (sys->total_edges != mesh->totedge) { return LAPDEFORM_SYSTEM_CHANGE_EDGES; } if (!STREQ(lmd->anchor_grp_name, sys->anchor_grp_name)) { return LAPDEFORM_SYSTEM_ONLY_CHANGE_GROUP; } - modifier_get_vgroup(ob, dm, lmd->anchor_grp_name, &dvert, &defgrp_index); + modifier_get_vgroup_mesh(ob, mesh, lmd->anchor_grp_name, &dvert, &defgrp_index); if (!dvert) { return LAPDEFORM_SYSTEM_CHANGE_NOT_VALID_GROUP; } @@ -610,7 +615,7 @@ static int isSystemDifferent(LaplacianDeformModifierData *lmd, Object *ob, Deriv } static void LaplacianDeformModifier_do( - LaplacianDeformModifierData *lmd, Object *ob, DerivedMesh *dm, + LaplacianDeformModifierData *lmd, Object *ob, Mesh *mesh, float (*vertexCos)[3], int numVerts) { float (*filevertexCos)[3]; @@ -628,7 +633,7 @@ static void LaplacianDeformModifier_do( return; } if (lmd->cache_system) { - sysdif = isSystemDifferent(lmd, ob, dm, numVerts); + sysdif = isSystemDifferent(lmd, ob, mesh, numVerts); sys = lmd->cache_system; if (sysdif) { if (sysdif == LAPDEFORM_SYSTEM_ONLY_CHANGE_ANCHORS || sysdif == LAPDEFORM_SYSTEM_ONLY_CHANGE_GROUP) { @@ -638,7 +643,7 @@ static void LaplacianDeformModifier_do( lmd->total_verts = 0; deleteLaplacianSystem(sys); lmd->cache_system = NULL; - initSystem(lmd, ob, dm, filevertexCos, numVerts); + initSystem(lmd, ob, mesh, filevertexCos, numVerts); sys = lmd->cache_system; /* may have been reallocated */ MEM_SAFE_FREE(filevertexCos); if (sys) { @@ -650,7 +655,7 @@ static void LaplacianDeformModifier_do( modifier_setError(&lmd->modifier, "Vertices changed from %d to %d", lmd->total_verts, numVerts); } else if (sysdif == LAPDEFORM_SYSTEM_CHANGE_EDGES) { - modifier_setError(&lmd->modifier, "Edges changed from %d to %d", sys->total_edges, dm->getNumEdges(dm)); + modifier_setError(&lmd->modifier, "Edges changed from %d to %d", sys->total_edges, mesh->totedge); } else if (sysdif == LAPDEFORM_SYSTEM_CHANGE_NOT_VALID_GROUP) { modifier_setError(&lmd->modifier, "Vertex group '%s' is not valid", sys->anchor_grp_name); @@ -663,7 +668,7 @@ static void LaplacianDeformModifier_do( } } else { - if (!isValidVertexGroup(lmd, ob, dm)) { + if (!isValidVertexGroup(lmd, ob, mesh)) { modifier_setError(&lmd->modifier, "Vertex group '%s' is not valid", lmd->anchor_grp_name); lmd->flag &= ~MOD_LAPLACIANDEFORM_BIND; } @@ -672,13 +677,13 @@ static void LaplacianDeformModifier_do( memcpy(filevertexCos, lmd->vertexco, sizeof(float[3]) * numVerts); MEM_SAFE_FREE(lmd->vertexco); lmd->total_verts = 0; - initSystem(lmd, ob, dm, filevertexCos, numVerts); + initSystem(lmd, ob, mesh, filevertexCos, numVerts); sys = lmd->cache_system; MEM_SAFE_FREE(filevertexCos); laplacianDeformPreview(sys, vertexCos); } else { - initSystem(lmd, ob, dm, vertexCos, numVerts); + initSystem(lmd, ob, mesh, vertexCos, numVerts); sys = lmd->cache_system; laplacianDeformPreview(sys, vertexCos); } @@ -710,7 +715,7 @@ static void copyData(const ModifierData *md, ModifierData *target) tlmd->cache_system = NULL; } -static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(useRenderParams)) { LaplacianDeformModifierData *lmd = (LaplacianDeformModifierData *)md; if (lmd->anchor_grp_name[0]) return 0; @@ -726,26 +731,26 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) } static void deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, ModifierApplyFlag UNUSED(flag)) + ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, + float (*vertexCos)[3], int numVerts) { - DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, false, false); + Mesh *mesh_src = get_mesh(ctx->object, NULL, mesh, NULL, false, false); - LaplacianDeformModifier_do((LaplacianDeformModifierData *)md, ob, dm, vertexCos, numVerts); - if (dm != derivedData) { - dm->release(dm); + LaplacianDeformModifier_do((LaplacianDeformModifierData *)md, ctx->object, mesh_src, vertexCos, numVerts); + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); } } static void deformVertsEM( - ModifierData *md, Object *ob, struct BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) + ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *editData, + Mesh *mesh, float (*vertexCos)[3], int numVerts) { - DerivedMesh *dm = get_dm(ob, editData, derivedData, NULL, false, false); - LaplacianDeformModifier_do((LaplacianDeformModifierData *)md, ob, dm, + Mesh *mesh_src = get_mesh(ctx->object, editData, mesh, NULL, false, false); + LaplacianDeformModifier_do((LaplacianDeformModifierData *)md, ctx->object, mesh_src, vertexCos, numVerts); - if (dm != derivedData) { - dm->release(dm); + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); } } @@ -767,17 +772,25 @@ ModifierTypeInfo modifierType_LaplacianDeform = { /* type */ eModifierTypeType_OnlyDeform, /* flags */ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode, /* copyData */ copyData, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ deformVertsEM, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ freeData, /* isDisabled */ isDisabled, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_laplaciansmooth.c b/source/blender/modifiers/intern/MOD_laplaciansmooth.c index 49b9c4af29c..e903dd0de58 100644 --- a/source/blender/modifiers/intern/MOD_laplaciansmooth.c +++ b/source/blender/modifiers/intern/MOD_laplaciansmooth.c @@ -29,6 +29,7 @@ */ +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" @@ -37,8 +38,10 @@ #include "MEM_guardedalloc.h" -#include "BKE_cdderivedmesh.h" #include "BKE_deform.h" +#include "BKE_editmesh.h" +#include "BKE_library.h" +#include "BKE_mesh.h" #include "BKE_modifier.h" #include "MOD_util.h" @@ -78,7 +81,7 @@ struct BLaplacianSystem { typedef struct BLaplacianSystem LaplacianSystem; static CustomDataMask required_data_mask(Object *ob, ModifierData *md); -static bool is_disabled(ModifierData *md, int useRenderParams); +static bool is_disabled(const struct Scene *UNUSED(scene), ModifierData *md, int useRenderParams); static float compute_volume(const float center[3], float (*vertexCos)[3], const MPoly *mpoly, int numPolys, const MLoop *mloop); static LaplacianSystem *init_laplacian_system(int a_numEdges, int a_numPolys, int a_numLoops, int a_numVerts); static void delete_laplacian_system(LaplacianSystem *sys); @@ -330,7 +333,7 @@ static void validate_solution(LaplacianSystem *sys, short flag, float lambda, fl { int i; float lam; - float vini, vend; + float vini = 0.0f, vend = 0.0f; if (flag & MOD_LAPLACIANSMOOTH_PRESERVE_VOLUME) { vini = compute_volume(sys->vert_centroid, sys->vertexCos, sys->mpoly, sys->numPolys, sys->mloop); @@ -356,7 +359,7 @@ static void validate_solution(LaplacianSystem *sys, short flag, float lambda, fl } static void laplaciansmoothModifier_do( - LaplacianSmoothModifierData *smd, Object *ob, DerivedMesh *dm, + LaplacianSmoothModifierData *smd, Object *ob, Mesh *mesh, float (*vertexCos)[3], int numVerts) { LaplacianSystem *sys; @@ -366,17 +369,17 @@ static void laplaciansmoothModifier_do( int i, iter; int defgrp_index; - sys = init_laplacian_system(dm->getNumEdges(dm), dm->getNumPolys(dm), dm->getNumLoops(dm), numVerts); + sys = init_laplacian_system(mesh->totedge, mesh->totpoly, mesh->totloop, numVerts); if (!sys) { return; } - sys->mpoly = dm->getPolyArray(dm); - sys->mloop = dm->getLoopArray(dm); - sys->medges = dm->getEdgeArray(dm); + sys->mpoly = mesh->mpoly; + sys->mloop = mesh->mloop; + sys->medges = mesh->medge; sys->vertexCos = vertexCos; sys->min_area = 0.00001f; - modifier_get_vgroup(ob, dm, smd->defgrp_name, &dvert, &defgrp_index); + modifier_get_vgroup_mesh(ob, mesh, smd->defgrp_name, &dvert, &defgrp_index); sys->vert_centroid[0] = 0.0f; sys->vert_centroid[1] = 0.0f; @@ -471,7 +474,7 @@ static void init_data(ModifierData *md) smd->defgrp_name[0] = '\0'; } -static bool is_disabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool is_disabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(useRenderParams)) { LaplacianSmoothModifierData *smd = (LaplacianSmoothModifierData *) md; short flag; @@ -496,39 +499,39 @@ static CustomDataMask required_data_mask(Object *UNUSED(ob), ModifierData *md) } static void deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, ModifierApplyFlag UNUSED(flag)) + ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, + float (*vertexCos)[3], int numVerts) { - DerivedMesh *dm; + Mesh *mesh_src; if (numVerts == 0) return; - dm = get_dm(ob, NULL, derivedData, NULL, false, false); + mesh_src = get_mesh(ctx->object, NULL, mesh, NULL, false, false); - laplaciansmoothModifier_do((LaplacianSmoothModifierData *)md, ob, dm, + laplaciansmoothModifier_do((LaplacianSmoothModifierData *)md, ctx->object, mesh_src, vertexCos, numVerts); - if (dm != derivedData) - dm->release(dm); + if (mesh_src != mesh) + BKE_id_free(NULL, mesh_src); } static void deformVertsEM( - ModifierData *md, Object *ob, struct BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) + ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *editData, + Mesh *mesh, float (*vertexCos)[3], int numVerts) { - DerivedMesh *dm; + Mesh *mesh_src; if (numVerts == 0) return; - dm = get_dm(ob, editData, derivedData, NULL, false, false); + mesh_src = get_mesh(ctx->object, editData, mesh, NULL, false, false); - laplaciansmoothModifier_do((LaplacianSmoothModifierData *)md, ob, dm, + laplaciansmoothModifier_do((LaplacianSmoothModifierData *)md, ctx->object, mesh_src, vertexCos, numVerts); - if (dm != derivedData) - dm->release(dm); + if (mesh_src != mesh) + BKE_id_free(NULL, mesh_src); } @@ -540,18 +543,26 @@ ModifierTypeInfo modifierType_LaplacianSmooth = { /* flags */ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode, - /* copy_data */ modifier_copyData_generic, + /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ deformVertsEM, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ init_data, /* requiredDataMask */ required_data_mask, /* freeData */ NULL, /* isDisabled */ is_disabled, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_lattice.c b/source/blender/modifiers/intern/MOD_lattice.c index 760e3c0e22a..695e14a69df 100644 --- a/source/blender/modifiers/intern/MOD_lattice.c +++ b/source/blender/modifiers/intern/MOD_lattice.c @@ -39,12 +39,14 @@ #include "BLI_utildefines.h" -#include "BKE_cdderivedmesh.h" +#include "BKE_editmesh.h" #include "BKE_lattice.h" +#include "BKE_library.h" #include "BKE_library_query.h" +#include "BKE_mesh.h" #include "BKE_modifier.h" -#include "depsgraph_private.h" +#include "MEM_guardedalloc.h" #include "MOD_util.h" @@ -65,7 +67,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) return dataMask; } -static bool isDisabled(ModifierData *md, int UNUSED(userRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(userRenderParams)) { LatticeModifierData *lmd = (LatticeModifierData *) md; @@ -81,18 +83,6 @@ static void foreachObjectLink( walk(userData, ob, &lmd->object, IDWALK_CB_NOP); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - LatticeModifierData *lmd = (LatticeModifierData *) md; - - if (lmd->object) { - DagNode *latNode = dag_get_node(ctx->forest, lmd->object); - - dag_add_relation(ctx->forest, latNode, ctx->obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Lattice Modifier"); - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { LatticeModifierData *lmd = (LatticeModifierData *)md; @@ -104,32 +94,34 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte } static void deformVerts( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, + ModifierData *md, const ModifierEvalContext *ctx, + struct Mesh *mesh, float (*vertexCos)[3], - int numVerts, - ModifierApplyFlag UNUSED(flag)) + int numVerts) { LatticeModifierData *lmd = (LatticeModifierData *) md; - + struct Mesh *mesh_src = get_mesh(ctx->object, NULL, mesh, NULL, false, false); modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */ - lattice_deform_verts(lmd->object, ob, derivedData, + lattice_deform_verts(lmd->object, ctx->object, mesh_src, vertexCos, numVerts, lmd->name, lmd->strength); -} + + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); + }} static void deformVertsEM( - ModifierData *md, Object *ob, struct BMEditMesh *em, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) + ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *em, + struct Mesh *mesh, float (*vertexCos)[3], int numVerts) { - DerivedMesh *dm = derivedData; + struct Mesh *mesh_src = get_mesh(ctx->object, em, mesh, NULL, false, false); - if (!derivedData) dm = CDDM_from_editbmesh(em, false, false); + deformVerts(md, ctx, mesh_src, vertexCos, numVerts); - deformVerts(md, ob, dm, vertexCos, numVerts, 0); - - if (!derivedData) dm->release(dm); + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); + } } @@ -141,18 +133,27 @@ ModifierTypeInfo modifierType_Lattice = { /* flags */ eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_AcceptsLattice | eModifierTypeFlag_SupportsEditmode, + /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ deformVertsEM, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ isDisabled, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_mask.c b/source/blender/modifiers/intern/MOD_mask.c index 25db2d5ff0b..fd833a2a322 100644 --- a/source/blender/modifiers/intern/MOD_mask.c +++ b/source/blender/modifiers/intern/MOD_mask.c @@ -40,17 +40,19 @@ #include "BLI_ghash.h" #include "DNA_armature_types.h" +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "BKE_action.h" /* BKE_pose_channel_find_name */ -#include "BKE_cdderivedmesh.h" +#include "BKE_customdata.h" +#include "BKE_library.h" #include "BKE_library_query.h" +#include "BKE_mesh.h" #include "BKE_modifier.h" #include "BKE_deform.h" -#include "depsgraph_private.h" #include "DEG_depsgraph_build.h" #include "MOD_modifiertypes.h" @@ -70,20 +72,6 @@ static void foreachObjectLink( walk(userData, ob, &mmd->ob_arm, IDWALK_CB_NOP); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - MaskModifierData *mmd = (MaskModifierData *)md; - - if (mmd->ob_arm) { - bArmature *arm = (bArmature *)mmd->ob_arm->data; - DagNode *armNode = dag_get_node(ctx->forest, mmd->ob_arm); - - /* tag relationship in depsgraph, but also on the armature */ - dag_add_relation(ctx->forest, armNode, ctx->obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Mask Modifier"); - arm->flag |= ARM_HAS_VIZ_DEPS; - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { MaskModifierData *mmd = (MaskModifierData *)md; @@ -96,14 +84,12 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte } } -static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, - DerivedMesh *dm, - ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh) { MaskModifierData *mmd = (MaskModifierData *)md; + Object *ob = ctx->object; const bool found_test = (mmd->flag & MOD_MASK_INV) == 0; - DerivedMesh *result = NULL; + Mesh *result = NULL; GHash *vertHash = NULL, *edgeHash, *polyHash; GHashIterator gh_iter; MDeformVert *dvert, *dv; @@ -123,9 +109,9 @@ static DerivedMesh *applyModifier( int *loop_mapping; - dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); + dvert = CustomData_get_layer(&mesh->vdata, CD_MDEFORMVERT); if (dvert == NULL) { - return found_test ? CDDM_from_template(dm, 0, 0, 0, 0, 0) : dm; + return found_test ? BKE_mesh_new_nomain_from_template(mesh, 0, 0, 0, 0, 0) : mesh; } /* Overview of Method: @@ -135,9 +121,9 @@ static DerivedMesh *applyModifier( */ /* get original number of verts, edges, and faces */ - maxVerts = dm->getNumVerts(dm); - maxEdges = dm->getNumEdges(dm); - maxPolys = dm->getNumPolys(dm); + maxVerts = mesh->totvert; + maxEdges = mesh->totedge; + maxPolys = mesh->totpoly; /* check if we can just return the original mesh * - must have verts and therefore verts assigned to vgroups to do anything useful @@ -145,7 +131,7 @@ static DerivedMesh *applyModifier( if (!(ELEM(mmd->mode, MOD_MASK_MODE_ARM, MOD_MASK_MODE_VGROUP)) || (maxVerts == 0) || BLI_listbase_is_empty(&ob->defbase)) { - return dm; + return mesh; } /* if mode is to use selected armature bones, aggregate the bone groups */ @@ -158,8 +144,9 @@ static DerivedMesh *applyModifier( const int defbase_tot = BLI_listbase_count(&ob->defbase); /* check that there is armature object with bones to use, otherwise return original mesh */ - if (ELEM(NULL, oba, oba->pose, ob->defbase.first)) - return dm; + if (ELEM(NULL, oba, oba->pose, ob->defbase.first)) { + return mesh; + } /* determine whether each vertexgroup is associated with a selected bone or not * - each cell is a boolean saying whether bone corresponding to the ith group is selected @@ -220,8 +207,9 @@ static DerivedMesh *applyModifier( int defgrp_index = defgroup_name_index(ob, mmd->vgroup); /* if no vgroup (i.e. dverts) found, return the initial mesh */ - if (defgrp_index == -1) - return dm; + if (defgrp_index == -1) { + return mesh; + } /* hashes for quickly providing a mapping from old to new - use key=oldindex, value=newindex */ vertHash = BLI_ghash_int_new_ex("mask vert2 bh", (unsigned int)maxVerts); @@ -243,10 +231,10 @@ static DerivedMesh *applyModifier( edgeHash = BLI_ghash_int_new_ex("mask ed2 gh", (unsigned int)maxEdges); polyHash = BLI_ghash_int_new_ex("mask fa2 gh", (unsigned int)maxPolys); - mvert_src = dm->getVertArray(dm); - medge_src = dm->getEdgeArray(dm); - mpoly_src = dm->getPolyArray(dm); - mloop_src = dm->getLoopArray(dm); + mvert_src = mesh->mvert; + medge_src = mesh->medge; + mpoly_src = mesh->mpoly; + mloop_src = mesh->mloop; /* overalloc, assume all polys are seen */ loop_mapping = MEM_malloc_arrayN((size_t)maxPolys, sizeof(int), "mask loopmap"); @@ -291,12 +279,12 @@ static DerivedMesh *applyModifier( /* now we know the number of verts, edges and faces, * we can create the new (reduced) mesh */ - result = CDDM_from_template(dm, numVerts, numEdges, 0, numLoops, numPolys); + result = BKE_mesh_new_nomain_from_template(mesh, numVerts, numEdges, 0, numLoops, numPolys); - mpoly_dst = CDDM_get_polys(result); - mloop_dst = CDDM_get_loops(result); - medge_dst = CDDM_get_edges(result); - mvert_dst = CDDM_get_verts(result); + mpoly_dst = result->mpoly; + mloop_dst = result->mloop; + medge_dst = result->medge; + mvert_dst = result->mvert; /* using ghash-iterators, map data into new mesh */ /* vertices */ @@ -310,7 +298,7 @@ static DerivedMesh *applyModifier( v_dst = &mvert_dst[i_dst]; *v_dst = *v_src; - DM_copy_vert_data(dm, result, i_src, i_dst, 1); + CustomData_copy_data(&mesh->vdata, &result->vdata, i_src, i_dst, 1); } /* edges */ @@ -323,7 +311,7 @@ static DerivedMesh *applyModifier( e_src = &medge_src[i_src]; e_dst = &medge_dst[i_dst]; - DM_copy_edge_data(dm, result, i_src, i_dst, 1); + CustomData_copy_data(&mesh->edata, &result->edata, i_src, i_dst, 1); *e_dst = *e_src; e_dst->v1 = GET_UINT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_UINT_IN_POINTER(e_src->v1))); e_dst->v2 = GET_UINT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_UINT_IN_POINTER(e_src->v2))); @@ -340,8 +328,8 @@ static DerivedMesh *applyModifier( const MLoop *ml_src = &mloop_src[i_ml_src]; MLoop *ml_dst = &mloop_dst[i_ml_dst]; - DM_copy_poly_data(dm, result, i_src, i_dst, 1); - DM_copy_loop_data(dm, result, i_ml_src, i_ml_dst, mp_src->totloop); + CustomData_copy_data(&mesh->pdata, &result->pdata, i_src, i_dst, 1); + CustomData_copy_data(&mesh->ldata, &result->ldata, i_ml_src, i_ml_dst, mp_src->totloop); *mp_dst = *mp_src; mp_dst->loopstart = i_ml_dst; @@ -355,7 +343,7 @@ static DerivedMesh *applyModifier( /* why is this needed? - campbell */ /* recalculate normals */ - result->dirty |= DM_DIRTY_NORMALS; + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; /* free hashes */ BLI_ghash_free(vertHash, NULL, NULL); @@ -377,17 +365,25 @@ ModifierTypeInfo modifierType_Mask = { eModifierTypeFlag_SupportsEditmode, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ NULL, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_meshcache.c b/source/blender/modifiers/intern/MOD_meshcache.c index a1523b33a68..9d6dfc0e1eb 100644 --- a/source/blender/modifiers/intern/MOD_meshcache.c +++ b/source/blender/modifiers/intern/MOD_meshcache.c @@ -42,6 +42,8 @@ #include "BKE_mesh.h" #include "BKE_main.h" +#include "DEG_depsgraph_query.h" + #include "MEM_guardedalloc.h" #include "MOD_meshcache_util.h" /* utility functions */ @@ -70,7 +72,7 @@ static bool dependsOnTime(ModifierData *md) return (mcmd->play_mode == MOD_MESHCACHE_PLAY_CFEA); } -static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(useRenderParams)) { MeshCacheModifierData *mcmd = (MeshCacheModifierData *) md; @@ -80,7 +82,7 @@ static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) static void meshcache_do( - MeshCacheModifierData *mcmd, Object *ob, DerivedMesh *UNUSED(dm), + MeshCacheModifierData *mcmd, Scene *scene, Object *ob, DerivedMesh *UNUSED(dm), float (*vertexCos_Real)[3], int numVerts) { const bool use_factor = mcmd->factor < 1.0f; @@ -88,7 +90,6 @@ static void meshcache_do( MEM_malloc_arrayN(numVerts, sizeof(*vertexCos_Store), __func__) : NULL; float (*vertexCos)[3] = vertexCos_Store ? vertexCos_Store : vertexCos_Real; - Scene *scene = mcmd->modifier.scene; const float fps = FPS; char filepath[FILE_MAX]; @@ -264,24 +265,25 @@ static void meshcache_do( } static void deformVerts( - ModifierData *md, Object *ob, + ModifierData *md, const ModifierEvalContext *ctx, DerivedMesh *derivedData, float (*vertexCos)[3], - int numVerts, - ModifierApplyFlag UNUSED(flag)) + int numVerts) { MeshCacheModifierData *mcmd = (MeshCacheModifierData *)md; + Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); - meshcache_do(mcmd, ob, derivedData, vertexCos, numVerts); + meshcache_do(mcmd, scene, ctx->object, derivedData, vertexCos, numVerts); } static void deformVertsEM( - ModifierData *md, Object *ob, struct BMEditMesh *UNUSED(editData), + ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *UNUSED(editData), DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) { MeshCacheModifierData *mcmd = (MeshCacheModifierData *)md; + Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); - meshcache_do(mcmd, ob, derivedData, vertexCos, numVerts); + meshcache_do(mcmd, scene, ctx->object, derivedData, vertexCos, numVerts); } @@ -295,17 +297,25 @@ ModifierTypeInfo modifierType_MeshCache = { eModifierTypeFlag_SupportsEditmode, /* copyData */ modifier_copyData_generic, - /* deformVerts */ deformVerts, + + /* deformVerts_DM */ deformVerts, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ deformVertsEM, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + + /* deformVerts */ NULL, /* deformMatrices */ NULL, - /* deformVertsEM */ deformVertsEM, + /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ NULL, /* freeData */ NULL, /* isDisabled */ isDisabled, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ dependsOnTime, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c index 39a6e9029b4..15203f4fc2e 100644 --- a/source/blender/modifiers/intern/MOD_meshdeform.c +++ b/source/blender/modifiers/intern/MOD_meshdeform.c @@ -32,6 +32,7 @@ * \ingroup modifiers */ +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -40,17 +41,19 @@ #include "BLI_task.h" #include "BLI_utildefines.h" -#include "BKE_cdderivedmesh.h" #include "BKE_global.h" +#include "BKE_library.h" #include "BKE_library_query.h" +#include "BKE_mesh.h" #include "BKE_modifier.h" #include "BKE_deform.h" #include "BKE_editmesh.h" -#include "depsgraph_private.h" - #include "MEM_guardedalloc.h" +#include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" + #include "MOD_util.h" #ifdef __SSE2__ @@ -106,7 +109,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) return dataMask; } -static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(useRenderParams)) { MeshDeformModifierData *mmd = (MeshDeformModifierData *) md; @@ -122,19 +125,6 @@ static void foreachObjectLink( walk(userData, ob, &mmd->object, IDWALK_CB_NOP); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - MeshDeformModifierData *mmd = (MeshDeformModifierData *) md; - - if (mmd->object) { - DagNode *curNode = dag_get_node(ctx->forest, mmd->object); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA | DAG_RL_DATA_OB | DAG_RL_OB_OB, - "Mesh Deform Modifier"); - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { MeshDeformModifierData *mmd = (MeshDeformModifierData *)md; @@ -236,8 +226,8 @@ static void meshdeform_vert_task( const MDeformVert *dvert = data->dvert; const int defgrp_index = data->defgrp_index; const int *offsets = mmd->bindoffsets; - const MDefInfluence *influences = mmd->bindinfluences; - /*const*/ float (*dco)[3] = data->dco; + const MDefInfluence *__restrict influences = mmd->bindinfluences; + /*const*/ float (*__restrict dco)[3] = data->dco; float (*vertexCos)[3] = data->vertexCos; float co[3]; float weight, totweight, fac = 1.0f; @@ -264,11 +254,12 @@ static void meshdeform_vert_task( totweight = meshdeform_dynamic_bind(mmd, dco, co); } else { - int a; totweight = 0.0f; zero_v3(co); + int start = offsets[iter]; + int end = offsets[iter + 1]; - for (a = offsets[iter]; a < offsets[iter + 1]; a++) { + for (int a = start; a < end; a++) { weight = influences[a].weight; madd_v3_v3fl(co, dco[influences[a].vertex], weight); totweight += weight; @@ -286,22 +277,25 @@ static void meshdeform_vert_task( } static void meshdeformModifier_do( - ModifierData *md, Object *ob, DerivedMesh *dm, + ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, float (*vertexCos)[3], int numVerts) { MeshDeformModifierData *mmd = (MeshDeformModifierData *) md; - DerivedMesh *tmpdm, *cagedm; + Object *ob = ctx->object; + + Mesh *cagemesh; MDeformVert *dvert = NULL; float imat[4][4], cagemat[4][4], iobmat[4][4], icagemat[3][3], cmat[4][4]; float co[3], (*dco)[3], (*bindcagecos)[3]; int a, totvert, totcagevert, defgrp_index; float (*cagecos)[3]; MeshdeformUserdata data; + bool free_cagemesh = false; if (!mmd->object || (!mmd->bindcagecos && !mmd->bindfunc)) return; - /* Get cage derivedmesh. + /* Get cage mesh. * * Only do this is the target object is in edit mode by itself, meaning * we don't allow linked edit meshes here. @@ -311,24 +305,9 @@ static void meshdeformModifier_do( * * We'll support this case once granular dependency graph is landed. */ - if (mmd->object == md->scene->obedit) { - BMEditMesh *em = BKE_editmesh_from_object(mmd->object); - tmpdm = editbmesh_get_derived_cage_and_final(md->scene, mmd->object, em, 0, &cagedm); - if (tmpdm) - tmpdm->release(tmpdm); - } - else - cagedm = mmd->object->derivedFinal; - - /* if we don't have one computed, use derivedmesh from data - * without any modifiers */ - if (!cagedm) { - cagedm = get_dm(mmd->object, NULL, NULL, NULL, false, false); - if (cagedm) - cagedm->needsFree = 1; - } + cagemesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(mmd->object, &free_cagemesh); - if (!cagedm) { + if (cagemesh == NULL) { modifier_setError(md, "Cannot get mesh from cage object"); return; } @@ -346,36 +325,35 @@ static void meshdeformModifier_do( /* progress bar redraw can make this recursive .. */ if (!recursive) { + Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); recursive = 1; - mmd->bindfunc(md->scene, mmd, cagedm, (float *)vertexCos, numVerts, cagemat); + mmd->bindfunc(scene, mmd, cagemesh, (float *)vertexCos, numVerts, cagemat); recursive = 0; } } /* verify we have compatible weights */ totvert = numVerts; - totcagevert = cagedm->getNumVerts(cagedm); + totcagevert = cagemesh->totvert; if (mmd->totvert != totvert) { modifier_setError(md, "Verts changed from %d to %d", mmd->totvert, totvert); - cagedm->release(cagedm); + if (free_cagemesh) BKE_id_free(NULL, cagemesh); return; } else if (mmd->totcagevert != totcagevert) { modifier_setError(md, "Cage verts changed from %d to %d", mmd->totcagevert, totcagevert); - cagedm->release(cagedm); + if (free_cagemesh) BKE_id_free(NULL, cagemesh); return; } else if (mmd->bindcagecos == NULL) { modifier_setError(md, "Bind data missing"); - cagedm->release(cagedm); + if (free_cagemesh) BKE_id_free(NULL, cagemesh); return; } - cagecos = MEM_malloc_arrayN(totcagevert, sizeof(*cagecos), "meshdeformModifier vertCos"); - /* setup deformation data */ - cagedm->getVertCos(cagedm, cagecos); + cagecos = BKE_mesh_vertexCos_get(cagemesh, NULL); bindcagecos = (float(*)[3])mmd->bindcagecos; /* We allocate 1 element extra to make it possible to @@ -396,7 +374,7 @@ static void meshdeformModifier_do( copy_v3_v3(dco[a], co); } - modifier_get_vgroup(ob, dm, mmd->defgrp_name, &dvert, &defgrp_index); + modifier_get_vgroup_mesh(ob, mesh, mmd->defgrp_name, &dvert, &defgrp_index); /* Initialize data to be pass to the for body function. */ data.mmd = mmd; @@ -416,42 +394,45 @@ static void meshdeformModifier_do( meshdeform_vert_task, &settings); - /* release cage derivedmesh */ + /* release cage mesh */ MEM_freeN(dco); MEM_freeN(cagecos); - cagedm->release(cagedm); + if (cagemesh != NULL && free_cagemesh) { + BKE_id_free(NULL, cagemesh); + } } static void deformVerts( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *mesh, float (*vertexCos)[3], - int numVerts, - ModifierApplyFlag UNUSED(flag)) + int numVerts) { - DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, false, false); + Mesh *mesh_src = get_mesh(ctx->object, NULL, mesh, NULL, false, false); modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */ - meshdeformModifier_do(md, ob, dm, vertexCos, numVerts); + meshdeformModifier_do(md, ctx, mesh_src, vertexCos, numVerts); - if (dm && dm != derivedData) - dm->release(dm); + if (mesh_src && mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); + } } static void deformVertsEM( - ModifierData *md, Object *ob, + ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *UNUSED(editData), - DerivedMesh *derivedData, + Mesh *mesh, float (*vertexCos)[3], int numVerts) { - DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, false, false); + Mesh *mesh_src = get_mesh(ctx->object, NULL, mesh, NULL, false, false); - meshdeformModifier_do(md, ob, dm, vertexCos, numVerts); + meshdeformModifier_do(md, ctx, mesh_src, vertexCos, numVerts); - if (dm && dm != derivedData) - dm->release(dm); + if (mesh_src && mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); + } } #define MESHDEFORM_MIN_INFLUENCE 0.00001f @@ -527,17 +508,25 @@ ModifierTypeInfo modifierType_MeshDeform = { eModifierTypeFlag_SupportsEditmode, /* copyData */ copyData, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ deformVertsEM, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ freeData, /* isDisabled */ isDisabled, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_meshsequencecache.c b/source/blender/modifiers/intern/MOD_meshsequencecache.c index 8e04ff04648..a6c9f865e4c 100644 --- a/source/blender/modifiers/intern/MOD_meshsequencecache.c +++ b/source/blender/modifiers/intern/MOD_meshsequencecache.c @@ -26,19 +26,18 @@ #include "DNA_cachefile_types.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "BKE_cachefile.h" -#include "BKE_DerivedMesh.h" -#include "BKE_cdderivedmesh.h" #include "BKE_library.h" #include "BKE_library_query.h" #include "BKE_scene.h" -#include "depsgraph_private.h" #include "DEG_depsgraph_build.h" +#include "DEG_depsgraph_query.h" #include "MOD_modifiertypes.h" @@ -80,7 +79,7 @@ static void freeData(ModifierData *md) } } -static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(useRenderParams)) { MeshSeqCacheModifierData *mcmd = (MeshSeqCacheModifierData *) md; @@ -88,68 +87,72 @@ static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) return (mcmd->cache_file == NULL) || (mcmd->object_path[0] == '\0'); } -static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, - DerivedMesh *dm, - ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier( + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *mesh) { #ifdef WITH_ALEMBIC MeshSeqCacheModifierData *mcmd = (MeshSeqCacheModifierData *) md; /* Only used to check whether we are operating on org data or not... */ - Mesh *me = (ob->type == OB_MESH) ? ob->data : NULL; - DerivedMesh *org_dm = dm; + Mesh *me = (ctx->object->type == OB_MESH) ? ctx->object->data : NULL; + Mesh *org_mesh = mesh; - Scene *scene = md->scene; - const float frame = BKE_scene_frame_get(scene); + Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); + const float frame = DEG_get_ctime(ctx->depsgraph); const float time = BKE_cachefile_time_offset(mcmd->cache_file, frame, FPS); const char *err_str = NULL; - CacheFile *cache_file = mcmd->cache_file; + CacheFile *cache_file = (CacheFile *)DEG_get_original_id(&mcmd->cache_file->id); BKE_cachefile_ensure_handle(G.main, cache_file); if (!mcmd->reader) { mcmd->reader = CacheReader_open_alembic_object(cache_file->handle, NULL, - ob, + ctx->object, mcmd->object_path); if (!mcmd->reader) { modifier_setError(md, "Could not create Alembic reader for file %s", cache_file->filepath); - return dm; + return mesh; } } if (me != NULL) { - MVert *mvert = dm->getVertArray(dm); - MEdge *medge = dm->getEdgeArray(dm); - MPoly *mpoly = dm->getPolyArray(dm); + MVert *mvert = mesh->mvert; + MEdge *medge = mesh->medge; + MPoly *mpoly = mesh->mpoly; if ((me->mvert == mvert) || (me->medge == medge) || (me->mpoly == mpoly)) { /* We need to duplicate data here, otherwise we'll modify org mesh, see T51701. */ - dm = CDDM_copy(dm); + BKE_id_copy_ex(NULL, &mesh->id, (ID **)&mesh, + LIB_ID_CREATE_NO_MAIN | + LIB_ID_CREATE_NO_USER_REFCOUNT | + LIB_ID_CREATE_NO_DEG_TAG | + LIB_ID_COPY_NO_PREVIEW, + false); } } - DerivedMesh *result = ABC_read_mesh(mcmd->reader, - ob, - dm, - time, - &err_str, - mcmd->read_flag); + Mesh *result = ABC_read_mesh(mcmd->reader, + ctx->object, + mesh, + time, + &err_str, + mcmd->read_flag); if (err_str) { modifier_setError(md, "%s", err_str); } - if (!ELEM(result, NULL, dm) && (dm != org_dm)) { - dm->release(dm); - dm = org_dm; + if (!ELEM(result, NULL, mesh) && (mesh != org_mesh)) { + BKE_id_free(NULL, mesh); + mesh = org_mesh; } - return result ? result : dm; + return result ? result : mesh; #else - return dm; - UNUSED_VARS(md, ob); + return mesh; + UNUSED_VARS(ctx, md); #endif } @@ -169,18 +172,6 @@ static void foreachIDLink( } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - MeshSeqCacheModifierData *mcmd = (MeshSeqCacheModifierData *) md; - - if (mcmd->cache_file != NULL) { - DagNode *curNode = dag_get_node(ctx->forest, mcmd->cache_file); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Cache File Modifier"); - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { MeshSeqCacheModifierData *mcmd = (MeshSeqCacheModifierData *) md; @@ -191,28 +182,37 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte } ModifierTypeInfo modifierType_MeshSequenceCache = { - /* name */ "Mesh Sequence Cache", - /* structName */ "MeshSeqCacheModifierData", - /* structSize */ sizeof(MeshSeqCacheModifierData), - /* type */ eModifierTypeType_Constructive, - /* flags */ eModifierTypeFlag_AcceptsMesh | - eModifierTypeFlag_AcceptsCVs, - /* copyData */ copyData, - /* deformVerts */ NULL, - /* deformMatrices */ NULL, - /* deformVertsEM */ NULL, - /* deformMatricesEM */ NULL, - /* applyModifier */ applyModifier, - /* applyModifierEM */ NULL, - /* initData */ initData, - /* requiredDataMask */ NULL, - /* freeData */ freeData, - /* isDisabled */ isDisabled, - /* updateDepgraph */ updateDepgraph, - /* updateDepsgraph */ updateDepsgraph, - /* dependsOnTime */ dependsOnTime, - /* dependsOnNormals */ NULL, - /* foreachObjectLink */ NULL, - /* foreachIDLink */ foreachIDLink, - /* foreachTexLink */ NULL, + /* name */ "Mesh Sequence Cache", + /* structName */ "MeshSeqCacheModifierData", + /* structSize */ sizeof(MeshSeqCacheModifierData), + /* type */ eModifierTypeType_Constructive, + /* flags */ eModifierTypeFlag_AcceptsMesh | + eModifierTypeFlag_AcceptsCVs, + + /* copyData */ copyData, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + + /* deformVerts */ NULL, + /* deformMatrices */ NULL, + /* deformVertsEM */ NULL, + /* deformMatricesEM */ NULL, + /* applyModifier */ applyModifier, + /* applyModifierEM */ NULL, + + /* initData */ initData, + /* requiredDataMask */ NULL, + /* freeData */ freeData, + /* isDisabled */ isDisabled, + /* updateDepsgraph */ updateDepsgraph, + /* dependsOnTime */ dependsOnTime, + /* dependsOnNormals */ NULL, + /* foreachObjectLink */ NULL, + /* foreachIDLink */ foreachIDLink, + /* foreachTexLink */ NULL, }; diff --git a/source/blender/modifiers/intern/MOD_mirror.c b/source/blender/modifiers/intern/MOD_mirror.c index 3f6480562d9..4b16f165a12 100644 --- a/source/blender/modifiers/intern/MOD_mirror.c +++ b/source/blender/modifiers/intern/MOD_mirror.c @@ -33,19 +33,20 @@ */ +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "BLI_math.h" -#include "BKE_cdderivedmesh.h" +#include "BKE_library.h" #include "BKE_library_query.h" +#include "BKE_mesh.h" #include "BKE_modifier.h" #include "BKE_deform.h" #include "MEM_guardedalloc.h" -#include "depsgraph_private.h" #include "DEG_depsgraph_build.h" #include "MOD_modifiertypes.h" @@ -68,17 +69,6 @@ static void foreachObjectLink( walk(userData, ob, &mmd->mirror_ob, IDWALK_CB_NOP); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - MirrorModifierData *mmd = (MirrorModifierData *) md; - - if (mmd->mirror_ob) { - DagNode *latNode = dag_get_node(ctx->forest, mmd->mirror_ob); - - dag_add_relation(ctx->forest, latNode, ctx->obNode, DAG_RL_OB_DATA, "Mirror Modifier"); - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { MirrorModifierData *mmd = (MirrorModifierData *)md; @@ -88,21 +78,21 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Mirror Modifier"); } -static DerivedMesh *doMirrorOnAxis( +static Mesh *doMirrorOnAxis( MirrorModifierData *mmd, Object *ob, - DerivedMesh *dm, + const Mesh *mesh, int axis) { const float tolerance_sq = mmd->tolerance * mmd->tolerance; const bool do_vtargetmap = (mmd->flag & MOD_MIR_NO_MERGE) == 0; int tot_vtargetmap = 0; /* total merge vertices */ - DerivedMesh *result; - const int maxVerts = dm->getNumVerts(dm); - const int maxEdges = dm->getNumEdges(dm); - const int maxLoops = dm->getNumLoops(dm); - const int maxPolys = dm->getNumPolys(dm); + Mesh *result; + const int maxVerts = mesh->totvert; + const int maxEdges = mesh->totedge; + const int maxLoops = mesh->totloop; + const int maxPolys = mesh->totpoly; MVert *mv, *mv_prev; MEdge *me; MLoop *ml; @@ -135,35 +125,34 @@ static DerivedMesh *doMirrorOnAxis( mul_m4_m4m4(mtx, itmp, mtx); } - result = CDDM_from_template(dm, maxVerts * 2, maxEdges * 2, 0, maxLoops * 2, maxPolys * 2); + result = BKE_mesh_new_nomain_from_template( + mesh, maxVerts * 2, maxEdges * 2, 0, maxLoops * 2, maxPolys * 2); /*copy customdata to original geometry*/ - DM_copy_vert_data(dm, result, 0, 0, maxVerts); - DM_copy_edge_data(dm, result, 0, 0, maxEdges); - DM_copy_loop_data(dm, result, 0, 0, maxLoops); - DM_copy_poly_data(dm, result, 0, 0, maxPolys); - + CustomData_copy_data(&mesh->vdata, &result->vdata, 0, 0, maxVerts); + CustomData_copy_data(&mesh->edata, &result->edata, 0, 0, maxEdges); + CustomData_copy_data(&mesh->ldata, &result->ldata, 0, 0, maxLoops); + CustomData_copy_data(&mesh->pdata, &result->pdata, 0, 0, maxPolys); /* Subsurf for eg wont have mesh data in the custom data arrays. * now add mvert/medge/mpoly layers. */ - - if (!CustomData_has_layer(&dm->vertData, CD_MVERT)) { - dm->copyVertArray(dm, CDDM_get_verts(result)); + if (!CustomData_has_layer(&mesh->vdata, CD_MVERT)) { + memcpy(result->mvert, mesh->mvert, sizeof(*result->mvert) * mesh->totvert); } - if (!CustomData_has_layer(&dm->edgeData, CD_MEDGE)) { - dm->copyEdgeArray(dm, CDDM_get_edges(result)); + if (!CustomData_has_layer(&mesh->edata, CD_MEDGE)) { + memcpy(result->medge, mesh->medge, sizeof(*result->medge) * mesh->totedge); } - if (!CustomData_has_layer(&dm->polyData, CD_MPOLY)) { - dm->copyLoopArray(dm, CDDM_get_loops(result)); - dm->copyPolyArray(dm, CDDM_get_polys(result)); + if (!CustomData_has_layer(&mesh->pdata, CD_MPOLY)) { + memcpy(result->mloop, mesh->mloop, sizeof(*result->mloop) * mesh->totloop); + memcpy(result->mpoly, mesh->mpoly, sizeof(*result->mpoly) * mesh->totpoly); } /* copy customdata to new geometry, * copy from its self because this data may have been created in the checks above */ - DM_copy_vert_data(result, result, 0, maxVerts, maxVerts); - DM_copy_edge_data(result, result, 0, maxEdges, maxEdges); + CustomData_copy_data(&result->vdata, &result->vdata, 0, maxVerts, maxVerts); + CustomData_copy_data(&result->edata, &result->edata, 0, maxEdges, maxEdges); /* loops are copied later */ - DM_copy_poly_data(result, result, 0, maxPolys, maxPolys); + CustomData_copy_data(&result->pdata, &result->pdata, 0, maxPolys, maxPolys); if (do_vtargetmap) { /* second half is filled with -1 */ @@ -174,7 +163,7 @@ static DerivedMesh *doMirrorOnAxis( } /* mirror vertex coordinates */ - mv_prev = CDDM_get_verts(result); + mv_prev = result->mvert; mv = mv_prev + maxVerts; for (i = 0; i < maxVerts; i++, mv++, mv_prev++) { mul_m4_v3(mtx, mv->co); @@ -202,33 +191,37 @@ static DerivedMesh *doMirrorOnAxis( } /* handle shape keys */ - totshape = CustomData_number_of_layers(&result->vertData, CD_SHAPEKEY); + totshape = CustomData_number_of_layers(&result->vdata, CD_SHAPEKEY); for (a = 0; a < totshape; a++) { - float (*cos)[3] = CustomData_get_layer_n(&result->vertData, CD_SHAPEKEY, a); - for (i = maxVerts; i < result->numVertData; i++) { + float (*cos)[3] = CustomData_get_layer_n(&result->vdata, CD_SHAPEKEY, a); + for (i = maxVerts; i < result->totvert; i++) { mul_m4_v3(mtx, cos[i]); } } /* adjust mirrored edge vertex indices */ - me = CDDM_get_edges(result) + maxEdges; + me = result->medge + maxEdges; for (i = 0; i < maxEdges; i++, me++) { me->v1 += maxVerts; me->v2 += maxVerts; } /* adjust mirrored poly loopstart indices, and reverse loop order (normals) */ - mp = CDDM_get_polys(result) + maxPolys; - ml = CDDM_get_loops(result); + mp = result->mpoly + maxPolys; + ml = result->mloop; for (i = 0; i < maxPolys; i++, mp++) { MLoop *ml2; int j, e; /* reverse the loop, but we keep the first vertex in the face the same, * to ensure that quads are split the same way as on the other side */ - DM_copy_loop_data(result, result, mp->loopstart, mp->loopstart + maxLoops, 1); + CustomData_copy_data(&result->ldata, &result->ldata, mp->loopstart, mp->loopstart + maxLoops, 1); + for (j = 1; j < mp->totloop; j++) - DM_copy_loop_data(result, result, mp->loopstart + j, mp->loopstart + maxLoops + mp->totloop - j, 1); + CustomData_copy_data(&result->ldata, &result->ldata, + mp->loopstart + j, + mp->loopstart + maxLoops + mp->totloop - j, + 1); ml2 = ml + mp->loopstart + maxLoops; e = ml2[0].e; @@ -241,7 +234,7 @@ static DerivedMesh *doMirrorOnAxis( } /* adjust mirrored loop vertex and edge indices */ - ml = CDDM_get_loops(result) + maxLoops; + ml = result->mloop + maxLoops; for (i = 0; i < maxLoops; i++, ml++) { ml->v += maxVerts; ml->e += maxEdges; @@ -253,10 +246,10 @@ static DerivedMesh *doMirrorOnAxis( const bool do_mirr_u = (mmd->flag & MOD_MIR_MIRROR_U) != 0; const bool do_mirr_v = (mmd->flag & MOD_MIR_MIRROR_V) != 0; - const int totuv = CustomData_number_of_layers(&result->loopData, CD_MLOOPUV); + const int totuv = CustomData_number_of_layers(&result->ldata, CD_MLOOPUV); for (a = 0; a < totuv; a++) { - MLoopUV *dmloopuv = CustomData_get_layer_n(&result->loopData, CD_MLOOPUV, a); + MLoopUV *dmloopuv = CustomData_get_layer_n(&result->ldata, CD_MLOOPUV, a); int j = maxLoops; dmloopuv += j; /* second set of loops only */ for (; j-- > 0; dmloopuv++) { @@ -269,8 +262,8 @@ static DerivedMesh *doMirrorOnAxis( } /* handle vgroup stuff */ - if ((mmd->flag & MOD_MIR_VGROUP) && CustomData_has_layer(&result->vertData, CD_MDEFORMVERT)) { - MDeformVert *dvert = (MDeformVert *) CustomData_get_layer(&result->vertData, CD_MDEFORMVERT) + maxVerts; + if ((mmd->flag & MOD_MIR_VGROUP) && CustomData_has_layer(&result->vdata, CD_MDEFORMVERT)) { + MDeformVert *dvert = (MDeformVert *) CustomData_get_layer(&result->vdata, CD_MDEFORMVERT) + maxVerts; int *flip_map = NULL, flip_map_len = 0; flip_map = defgroup_flip_map(ob, &flip_map_len, false); @@ -292,7 +285,7 @@ static DerivedMesh *doMirrorOnAxis( /* slow - so only call if one or more merge verts are found, * users may leave this on and not realize there is nothing to merge - campbell */ if (tot_vtargetmap) { - result = CDDM_merge_verts(result, vtargetmap, tot_vtargetmap, CDDM_MERGE_VERTS_DUMP_IF_MAPPED); + result = BKE_mesh_merge_verts(result, vtargetmap, tot_vtargetmap, MESH_MERGE_VERTS_DUMP_IF_MAPPED); } MEM_freeN(vtargetmap); } @@ -300,43 +293,48 @@ static DerivedMesh *doMirrorOnAxis( return result; } -static DerivedMesh *mirrorModifier__doMirror( +static Mesh *mirrorModifier__doMirror( MirrorModifierData *mmd, - Object *ob, DerivedMesh *dm) + Object *ob, Mesh *mesh) { - DerivedMesh *result = dm; + Mesh *result = mesh; /* check which axes have been toggled and mirror accordingly */ if (mmd->flag & MOD_MIR_AXIS_X) { result = doMirrorOnAxis(mmd, ob, result, 0); } if (mmd->flag & MOD_MIR_AXIS_Y) { - DerivedMesh *tmp = result; + Mesh *tmp = result; result = doMirrorOnAxis(mmd, ob, result, 1); - if (tmp != dm) tmp->release(tmp); /* free intermediate results */ + if (tmp != mesh) { + /* free intermediate results */ + BKE_id_free(NULL, tmp); + } } if (mmd->flag & MOD_MIR_AXIS_Z) { - DerivedMesh *tmp = result; + Mesh *tmp = result; result = doMirrorOnAxis(mmd, ob, result, 2); - if (tmp != dm) tmp->release(tmp); /* free intermediate results */ + if (tmp != mesh) { + /* free intermediate results */ + BKE_id_free(NULL, tmp); + } } return result; } -static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, - ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier( + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *mesh) { - DerivedMesh *result; + Mesh *result; MirrorModifierData *mmd = (MirrorModifierData *) md; - result = mirrorModifier__doMirror(mmd, ob, derivedData); - - if (result != derivedData) - result->dirty |= DM_DIRTY_NORMALS; + result = mirrorModifier__doMirror(mmd, ctx->object, mesh); + if (result != mesh) { + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; + } return result; } @@ -355,17 +353,25 @@ ModifierTypeInfo modifierType_Mirror = { eModifierTypeFlag_UsesPreview, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ NULL, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_multires.c b/source/blender/modifiers/intern/MOD_multires.c index cdbacac97b9..aa9bc0dbc20 100644 --- a/source/blender/modifiers/intern/MOD_multires.c +++ b/source/blender/modifiers/intern/MOD_multires.c @@ -46,6 +46,8 @@ #include "BKE_modifier.h" #include "BKE_subsurf.h" +#include "DEG_depsgraph_query.h" + #include "MOD_modifiertypes.h" static void initData(ModifierData *md) @@ -59,14 +61,15 @@ static void initData(ModifierData *md) } static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, DerivedMesh *dm, - ModifierApplyFlag flag) + ModifierData *md, const ModifierEvalContext *ctx, + DerivedMesh *dm) { MultiresModifierData *mmd = (MultiresModifierData *)md; + struct Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); DerivedMesh *result; - Mesh *me = (Mesh *)ob->data; - const bool useRenderParams = (flag & MOD_APPLY_RENDER) != 0; - const bool ignore_simplify = (flag & MOD_APPLY_IGNORE_SIMPLIFY) != 0; + Mesh *me = (Mesh *)ctx->object->data; + const bool useRenderParams = (ctx->flag & MOD_APPLY_RENDER) != 0; + const bool ignore_simplify = (ctx->flag & MOD_APPLY_IGNORE_SIMPLIFY) != 0; MultiresFlags flags = 0; const bool has_mask = CustomData_has_layer(&me->ldata, CD_GRID_PAINT_MASK); @@ -86,12 +89,12 @@ static DerivedMesh *applyModifier( if (ignore_simplify) flags |= MULTIRES_IGNORE_SIMPLIFY; - result = multires_make_derived_from_derived(dm, mmd, ob, flags); + result = multires_make_derived_from_derived(dm, mmd, scene, ctx->object, flags); if (result == dm) return dm; - if (useRenderParams || !(flag & MOD_APPLY_USECACHE)) { + if (useRenderParams || !(ctx->flag & MOD_APPLY_USECACHE)) { DerivedMesh *cddm; cddm = CDDM_copy(result); @@ -145,17 +148,25 @@ ModifierTypeInfo modifierType_Multires = { eModifierTypeFlag_RequiresOriginalData, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ applyModifier, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, - /* applyModifier */ applyModifier, + /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ NULL, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_none.c b/source/blender/modifiers/intern/MOD_none.c index d9d9ba2966d..c973bd18830 100644 --- a/source/blender/modifiers/intern/MOD_none.c +++ b/source/blender/modifiers/intern/MOD_none.c @@ -43,7 +43,7 @@ * no other functions will be called */ -static bool isDisabled(ModifierData *UNUSED(md), int UNUSED(userRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *UNUSED(md), int UNUSED(userRenderParams)) { return true; } @@ -57,17 +57,25 @@ ModifierTypeInfo modifierType_None = { eModifierTypeFlag_AcceptsCVs, /* copyData */ NULL, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ NULL, /* requiredDataMask */ NULL, /* freeData */ NULL, /* isDisabled */ isDisabled, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_normal_edit.c b/source/blender/modifiers/intern/MOD_normal_edit.c index 0cf24d312dd..b9d5bc7703e 100644 --- a/source/blender/modifiers/intern/MOD_normal_edit.c +++ b/source/blender/modifiers/intern/MOD_normal_edit.c @@ -37,18 +37,16 @@ #include "BLI_utildefines.h" #include "BLI_bitmap.h" -#include "BKE_cdderivedmesh.h" +#include "BKE_library.h" #include "BKE_library_query.h" #include "BKE_mesh.h" #include "BKE_deform.h" -#include "depsgraph_private.h" - #include "MOD_util.h" static void generate_vert_coordinates( - DerivedMesh *dm, Object *ob, Object *ob_center, const float offset[3], + Mesh *mesh, Object *ob, Object *ob_center, const float offset[3], const int num_verts, float (*r_cos)[3], float r_size[3]) { float min_co[3], max_co[3]; @@ -57,30 +55,37 @@ static void generate_vert_coordinates( INIT_MINMAX(min_co, max_co); - dm->getVertCos(dm, r_cos); + MVert *mv = mesh->mvert; + for (int i = 0; i < mesh->totvert; i++, mv++) { + copy_v3_v3(r_cos[i], mv->co); + if (r_size != NULL && ob_center == NULL) { + minmax_v3v3_v3(min_co, max_co, r_cos[i]); + } + } /* Get size (i.e. deformation of the spheroid generating normals), either from target object, or own geometry. */ - if (ob_center) { - /* Not we are not interested in signs here - they are even troublesome actually, due to security clamping! */ - abs_v3_v3(r_size, ob_center->size); - } - else { - minmax_v3v3_v3_array(min_co, max_co, r_cos, num_verts); - /* Set size. */ - sub_v3_v3v3(r_size, max_co, min_co); - } + if (r_size != NULL) { + if (ob_center != NULL) { + /* Not we are not interested in signs here - they are even troublesome actually, due to security clamping! */ + abs_v3_v3(r_size, ob_center->size); + } + else { + /* Set size. */ + sub_v3_v3v3(r_size, max_co, min_co); + } - /* Error checks - we do not want one or more of our sizes to be null! */ - if (is_zero_v3(r_size)) { - r_size[0] = r_size[1] = r_size[2] = 1.0f; - } - else { - CLAMP_MIN(r_size[0], FLT_EPSILON); - CLAMP_MIN(r_size[1], FLT_EPSILON); - CLAMP_MIN(r_size[2], FLT_EPSILON); + /* Error checks - we do not want one or more of our sizes to be null! */ + if (is_zero_v3(r_size)) { + r_size[0] = r_size[1] = r_size[2] = 1.0f; + } + else { + CLAMP_MIN(r_size[0], FLT_EPSILON); + CLAMP_MIN(r_size[1], FLT_EPSILON); + CLAMP_MIN(r_size[2], FLT_EPSILON); + } } - if (ob_center) { + if (ob_center != NULL) { float inv_obmat[4][4]; /* Translate our coordinates so that center of ob_center is at (0, 0, 0). */ @@ -92,7 +97,7 @@ static void generate_vert_coordinates( do_diff = true; } - else if (!is_zero_v3(offset)) { + else if (offset != NULL && !is_zero_v3(offset)) { negate_v3_v3(diff, offset); do_diff = true; @@ -188,7 +193,7 @@ static bool polygons_check_flip( } static void normalEditModifier_do_radial( - NormalEditModifierData *enmd, Object *ob, DerivedMesh *dm, + NormalEditModifierData *enmd, Object *ob, Mesh *mesh, short (*clnors)[2], float (*loopnors)[3], float (*polynors)[3], const short mix_mode, const float mix_factor, const float mix_limit, MDeformVert *dvert, const int defgrp_index, const bool use_invert_vgroup, @@ -204,7 +209,7 @@ static void normalEditModifier_do_radial( BLI_bitmap *done_verts = BLI_BITMAP_NEW((size_t)num_verts, __func__); - generate_vert_coordinates(dm, ob, enmd->target, enmd->offset, num_verts, cos, size); + generate_vert_coordinates(mesh, ob, enmd->target, enmd->offset, num_verts, cos, size); /** * size gives us our spheroid coefficients ``(A, B, C)``. @@ -273,10 +278,11 @@ static void normalEditModifier_do_radial( mix_limit, mix_mode, num_verts, mloop, loopnors, nos, num_loops); } - if (do_polynors_fix && polygons_check_flip(mloop, nos, dm->getLoopDataLayout(dm), mpoly, polynors, num_polys)) { - dm->dirty |= DM_DIRTY_TESS_CDLAYERS; + if (do_polynors_fix && polygons_check_flip(mloop, nos, &mesh->ldata, mpoly, polynors, num_polys)) { + /* XXX TODO is this still needed? */ + // mesh->dirty |= DM_DIRTY_TESS_CDLAYERS; /* We need to recompute vertex normals! */ - dm->calcNormals(dm); + BKE_mesh_calc_normals(mesh); } BKE_mesh_normals_loop_custom_set(mvert, num_verts, medge, num_edges, mloop, nos, num_loops, @@ -288,7 +294,7 @@ static void normalEditModifier_do_radial( } static void normalEditModifier_do_directional( - NormalEditModifierData *enmd, Object *ob, DerivedMesh *dm, + NormalEditModifierData *enmd, Object *ob, Mesh *mesh, short (*clnors)[2], float (*loopnors)[3], float (*polynors)[3], const short mix_mode, const float mix_factor, const float mix_limit, MDeformVert *dvert, const int defgrp_index, const bool use_invert_vgroup, @@ -298,22 +304,17 @@ static void normalEditModifier_do_directional( const bool do_polynors_fix = (enmd->flag & MOD_NORMALEDIT_NO_POLYNORS_FIX) == 0; const bool use_parallel_normals = (enmd->flag & MOD_NORMALEDIT_USE_DIRECTION_PARALLEL) != 0; - float (*cos)[3] = MEM_malloc_arrayN((size_t)num_verts, sizeof(*cos), __func__); float (*nos)[3] = MEM_malloc_arrayN((size_t)num_loops, sizeof(*nos), __func__); float target_co[3]; int i; - dm->getVertCos(dm, cos); - /* Get target's center coordinates in ob local coordinates. */ - { - float mat[4][4]; + float mat[4][4]; - invert_m4_m4(mat, ob->obmat); - mul_m4_m4m4(mat, mat, enmd->target->obmat); - copy_v3_v3(target_co, mat[3]); - } + invert_m4_m4(mat, ob->obmat); + mul_m4_m4m4(mat, mat, enmd->target->obmat); + copy_v3_v3(target_co, mat[3]); if (use_parallel_normals) { float no[3]; @@ -326,6 +327,9 @@ static void normalEditModifier_do_directional( } } else { + float (*cos)[3] = MEM_malloc_arrayN((size_t)num_verts, sizeof(*cos), __func__); + generate_vert_coordinates(mesh, ob, enmd->target, NULL, num_verts, cos, NULL); + BLI_bitmap *done_verts = BLI_BITMAP_NEW((size_t)num_verts, __func__); MLoop *ml; float (*no)[3]; @@ -346,6 +350,7 @@ static void normalEditModifier_do_directional( } MEM_freeN(done_verts); + MEM_freeN(cos); } if (loopnors) { @@ -353,14 +358,13 @@ static void normalEditModifier_do_directional( mix_limit, mix_mode, num_verts, mloop, loopnors, nos, num_loops); } - if (do_polynors_fix && polygons_check_flip(mloop, nos, dm->getLoopDataLayout(dm), mpoly, polynors, num_polys)) { - dm->dirty |= DM_DIRTY_TESS_CDLAYERS; + if (do_polynors_fix && polygons_check_flip(mloop, nos, &mesh->ldata, mpoly, polynors, num_polys)) { + mesh->runtime.cd_dirty_vert |= CD_MASK_NORMAL; } BKE_mesh_normals_loop_custom_set(mvert, num_verts, medge, num_edges, mloop, nos, num_loops, mpoly, (const float(*)[3])polynors, num_polys, clnors); - MEM_freeN(cos); MEM_freeN(nos); } @@ -376,93 +380,112 @@ static bool is_valid_target(NormalEditModifierData *enmd) return false; } -static DerivedMesh *normalEditModifier_do(NormalEditModifierData *enmd, Object *ob, DerivedMesh *dm) +static Mesh *normalEditModifier_do(NormalEditModifierData *enmd, Object *ob, Mesh *mesh) { - Mesh *me = ob->data; - - const int num_verts = dm->getNumVerts(dm); - const int num_edges = dm->getNumEdges(dm); - const int num_loops = dm->getNumLoops(dm); - const int num_polys = dm->getNumPolys(dm); - MVert *mvert; - MEdge *medge; - MLoop *mloop; - MPoly *mpoly; - const bool use_invert_vgroup = ((enmd->flag & MOD_NORMALEDIT_INVERT_VGROUP) != 0); const bool use_current_clnors = !((enmd->mix_mode == MOD_NORMALEDIT_MIX_COPY) && (enmd->mix_factor == 1.0f) && (enmd->defgrp_name[0] == '\0') && (enmd->mix_limit == (float)M_PI)); + /* Do not run that modifier at all if autosmooth is disabled! */ + if (!is_valid_target(enmd) || mesh->totloop == 0) { + return mesh; + } + + /* XXX TODO ARG GRRR XYQWNMPRXTYY + * Once we fully switch to Mesh evaluation of modifiers, we can expect to get that flag from the COW copy. + * But for now, it is lost in the DM intermediate step, so we need to directly check orig object's data. */ +#if 0 + if (!(mesh->flag & ME_AUTOSMOOTH)) { +#else + if (!(((Mesh *)ob->data)->flag & ME_AUTOSMOOTH)) { +#endif + modifier_setError((ModifierData *)enmd, "Enable 'Auto Smooth' option in mesh settings"); + return mesh; + } + + Mesh *result; + if (mesh->medge == ((Mesh *)ob->data)->medge) { + /* We need to duplicate data here, otherwise setting custom normals (which may also affect sharp edges) could + * modify org mesh, see T43671. */ + BKE_id_copy_ex( + NULL, &mesh->id, (ID **)&result, + LIB_ID_CREATE_NO_MAIN | + LIB_ID_CREATE_NO_USER_REFCOUNT | + LIB_ID_CREATE_NO_DEG_TAG | + LIB_ID_COPY_NO_PREVIEW, + false); + } + else { + result = mesh; + } + + const int num_verts = result->totvert; + const int num_edges = result->totedge; + const int num_loops = result->totloop; + const int num_polys = result->totpoly; + MVert *mvert = result->mvert; + MEdge *medge = result->medge; + MLoop *mloop = result->mloop; + MPoly *mpoly = result->mpoly; + int defgrp_index; MDeformVert *dvert; float (*loopnors)[3] = NULL; - short (*clnors)[2]; + short (*clnors)[2] = NULL; float (*polynors)[3]; - bool free_polynors = false; - /* Do not run that modifier at all if autosmooth is disabled! */ - if (!is_valid_target(enmd) || !num_loops) { - return dm; + CustomData *ldata = &result->ldata; + if (CustomData_has_layer(ldata, CD_NORMAL)) { + loopnors = CustomData_get_layer(ldata, CD_NORMAL); } - - if (!(me->flag & ME_AUTOSMOOTH)) { - modifier_setError((ModifierData *)enmd, "Enable 'Auto Smooth' option in mesh settings"); - return dm; + else { + loopnors = CustomData_add_layer(ldata, CD_NORMAL, CD_CALLOC, NULL, num_loops); } - medge = dm->getEdgeArray(dm); - if (me->medge == medge) { - /* We need to duplicate data here, otherwise setting custom normals (which may also affect sharp edges) could - * modify org mesh, see T43671. */ - dm = CDDM_copy(dm); - medge = dm->getEdgeArray(dm); + /* Compute poly (always needed) and vert normals. */ + CustomData *pdata = &result->pdata; + polynors = CustomData_get_layer(pdata, CD_NORMAL); + if (!polynors) { + polynors = CustomData_add_layer(pdata, CD_NORMAL, CD_CALLOC, NULL, num_polys); } - mvert = dm->getVertArray(dm); - mloop = dm->getLoopArray(dm); - mpoly = dm->getPolyArray(dm); + BKE_mesh_calc_normals_poly(mvert, NULL, num_verts, mloop, mpoly, num_loops, num_polys, polynors, + (result->runtime.cd_dirty_vert & CD_MASK_NORMAL) ? false : true); + + result->runtime.cd_dirty_vert &= ~CD_MASK_NORMAL; if (use_current_clnors) { - dm->calcLoopNormals(dm, true, me->smoothresh); - loopnors = dm->getLoopDataArray(dm, CD_NORMAL); - } + clnors = CustomData_duplicate_referenced_layer(ldata, CD_CUSTOMLOOPNORMAL, num_loops); - clnors = CustomData_duplicate_referenced_layer(&dm->loopData, CD_CUSTOMLOOPNORMAL, num_loops); - if (!clnors) { - DM_add_loop_layer(dm, CD_CUSTOMLOOPNORMAL, CD_CALLOC, NULL); - clnors = dm->getLoopDataArray(dm, CD_CUSTOMLOOPNORMAL); + BKE_mesh_normals_loop_split(mvert, num_verts, medge, num_edges, mloop, loopnors, num_loops, + mpoly, (const float (*)[3])polynors, num_polys, + true, result->smoothresh, + NULL, clnors, NULL); } - polynors = dm->getPolyDataArray(dm, CD_NORMAL); - if (!polynors) { - polynors = MEM_malloc_arrayN((size_t)num_polys, sizeof(*polynors), __func__); - BKE_mesh_calc_normals_poly(mvert, NULL, num_verts, mloop, mpoly, num_loops, num_polys, polynors, false); - free_polynors = true; + if (!clnors) { + clnors = CustomData_add_layer(ldata, CD_CUSTOMLOOPNORMAL, CD_CALLOC, NULL, num_loops); } - modifier_get_vgroup(ob, dm, enmd->defgrp_name, &dvert, &defgrp_index); + modifier_get_vgroup_mesh(ob, result, enmd->defgrp_name, &dvert, &defgrp_index); if (enmd->mode == MOD_NORMALEDIT_MODE_RADIAL) { normalEditModifier_do_radial( - enmd, ob, dm, clnors, loopnors, polynors, + enmd, ob, result, clnors, loopnors, polynors, enmd->mix_mode, enmd->mix_factor, enmd->mix_limit, dvert, defgrp_index, use_invert_vgroup, mvert, num_verts, medge, num_edges, mloop, num_loops, mpoly, num_polys); } else if (enmd->mode == MOD_NORMALEDIT_MODE_DIRECTIONAL) { normalEditModifier_do_directional( - enmd, ob, dm, clnors, loopnors, polynors, + enmd, ob, result, clnors, loopnors, polynors, enmd->mix_mode, enmd->mix_factor, enmd->mix_limit, dvert, defgrp_index, use_invert_vgroup, mvert, num_verts, medge, num_edges, mloop, num_loops, mpoly, num_polys); } - if (free_polynors) { - MEM_freeN(polynors); - } - - return dm; + return result; } static void initData(ModifierData *md) @@ -501,24 +524,13 @@ static void foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk, walk(userData, ob, &enmd->target, IDWALK_CB_NOP); } -static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(useRenderParams)) { NormalEditModifierData *enmd = (NormalEditModifierData *)md; return !is_valid_target(enmd); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - NormalEditModifierData *enmd = (NormalEditModifierData *) md; - - if (enmd->target) { - DagNode *Node = dag_get_node(ctx->forest, enmd->target); - - dag_add_relation(ctx->forest, Node, ctx->obNode, DAG_RL_OB_DATA, "NormalEdit Modifier"); - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { NormalEditModifierData *enmd = (NormalEditModifierData *) md; @@ -527,9 +539,9 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte } } -static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm, ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh) { - return normalEditModifier_do((NormalEditModifierData *)md, ob, dm); + return normalEditModifier_do((NormalEditModifierData *)md, ctx->object, mesh); } ModifierTypeInfo modifierType_NormalEdit = { @@ -541,18 +553,27 @@ ModifierTypeInfo modifierType_NormalEdit = { eModifierTypeFlag_SupportsMapping | eModifierTypeFlag_SupportsEditmode | eModifierTypeFlag_EnableInEditmode, + /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ isDisabled, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ dependsOnNormals, diff --git a/source/blender/modifiers/intern/MOD_ocean.c b/source/blender/modifiers/intern/MOD_ocean.c index c29e835797b..702e557ccb1 100644 --- a/source/blender/modifiers/intern/MOD_ocean.c +++ b/source/blender/modifiers/intern/MOD_ocean.c @@ -46,6 +46,8 @@ #include "BKE_modifier.h" #include "BKE_ocean.h" +#include "DEG_depsgraph_query.h" + #include "MOD_modifiertypes.h" #ifdef WITH_OCEANSIM @@ -391,7 +393,6 @@ static DerivedMesh *generate_ocean_geometry(OceanModifierData *omd) /* add uvs */ if (CustomData_number_of_layers(&result->loopData, CD_MLOOPUV) < MAX_MTFACE) { gogd.mloopuvs = CustomData_add_layer(&result->loopData, CD_MLOOPUV, CD_CALLOC, NULL, num_polys * 4); - CustomData_add_layer(&result->polyData, CD_MTEXPOLY, CD_CALLOC, NULL, num_polys); if (gogd.mloopuvs) { /* unlikely to fail */ gogd.ix = 1.0 / gogd.rx; @@ -407,7 +408,7 @@ static DerivedMesh *generate_ocean_geometry(OceanModifierData *omd) } static DerivedMesh *doOcean( - ModifierData *md, Object *ob, + ModifierData *md, Scene *scene, Object *ob, DerivedMesh *derivedData, int UNUSED(useRenderParams)) { @@ -451,7 +452,7 @@ static DerivedMesh *doOcean( if (!omd->oceancache) { init_cache_data(ob, omd); } - BKE_ocean_simulate_cache(omd->oceancache, md->scene->r.cfra); + BKE_ocean_simulate_cache(omd->oceancache, scene->r.cfra); } else { simulate_ocean_modifier(omd); @@ -465,7 +466,7 @@ static DerivedMesh *doOcean( dm = CDDM_copy(derivedData); } - cfra = md->scene->r.cfra; + cfra = scene->r.cfra; CLAMP(cfra, omd->bakestart, omd->bakeend); cfra -= omd->bakestart; /* shift to 0 based */ @@ -548,24 +549,24 @@ static DerivedMesh *doOcean( } #else /* WITH_OCEANSIM */ static DerivedMesh *doOcean( - ModifierData *md, Object *UNUSED(ob), + ModifierData *UNUSED(md), Scene *UNUSED(scene), Object *UNUSED(ob), DerivedMesh *derivedData, int UNUSED(useRenderParams)) { /* unused */ - (void)md; return derivedData; } #endif /* WITH_OCEANSIM */ static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, - ModifierApplyFlag UNUSED(flag)) + ModifierData *md, const ModifierEvalContext *ctx, + DerivedMesh *derivedData) { DerivedMesh *result; + Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); - result = doOcean(md, ob, derivedData, 0); + + result = doOcean(md, scene, ctx->object, derivedData, 0); if (result != derivedData) result->dirty |= DM_DIRTY_NORMALS; @@ -584,17 +585,25 @@ ModifierTypeInfo modifierType_Ocean = { eModifierTypeFlag_EnableInEditmode, /* copyData */ copyData, - /* deformMatrices */ NULL, + /* deformMatrices_DM */ NULL, + + /* deformVerts_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ applyModifier, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, + /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, - /* applyModifier */ applyModifier, + /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ freeData, /* isDisabled */ NULL, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, /* dependsOnNormals */ dependsOnNormals, diff --git a/source/blender/modifiers/intern/MOD_particleinstance.c b/source/blender/modifiers/intern/MOD_particleinstance.c index 9b5b07e4b74..bb6ed8e8344 100644 --- a/source/blender/modifiers/intern/MOD_particleinstance.c +++ b/source/blender/modifiers/intern/MOD_particleinstance.c @@ -33,6 +33,7 @@ */ +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "MEM_guardedalloc.h" @@ -43,17 +44,17 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BKE_cdderivedmesh.h" #include "BKE_effect.h" #include "BKE_global.h" #include "BKE_lattice.h" #include "BKE_library_query.h" +#include "BKE_mesh.h" #include "BKE_modifier.h" #include "BKE_particle.h" #include "BKE_pointcache.h" -#include "depsgraph_private.h" #include "DEG_depsgraph_build.h" +#include "DEG_depsgraph_query.h" static void initData(ModifierData *md) { @@ -87,7 +88,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) } -static bool isDisabled(ModifierData *md, int useRenderParams) +static bool isDisabled(const struct Scene *scene, ModifierData *md, int useRenderParams) { ParticleInstanceModifierData *pimd = (ParticleInstanceModifierData *)md; ParticleSystem *psys; @@ -112,7 +113,7 @@ static bool isDisabled(ModifierData *md, int useRenderParams) if (useRenderParams) required_mode = eModifierMode_Render; else required_mode = eModifierMode_Realtime; - if (!modifier_isEnabled(md->scene, ob_md, required_mode)) + if (!modifier_isEnabled(scene, ob_md, required_mode)) return true; break; @@ -123,20 +124,6 @@ static bool isDisabled(ModifierData *md, int useRenderParams) return false; } - -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - ParticleInstanceModifierData *pimd = (ParticleInstanceModifierData *) md; - - if (pimd->ob) { - DagNode *curNode = dag_get_node(ctx->forest, pimd->ob); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, - "Particle Instance Modifier"); - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { ParticleInstanceModifierData *pimd = (ParticleInstanceModifierData *) md; @@ -163,7 +150,7 @@ static bool particle_skip(ParticleInstanceModifierData *pimd, ParticleSystem *ps if (p >= psys->totpart) { ChildParticle *cpa = psys->child + (p - psys->totpart); - pa = psys->particles + (between? cpa->pa[0]: cpa->parent); + pa = psys->particles + (between ? cpa->pa[0] : cpa->parent); } else { pa = psys->particles + p; @@ -187,8 +174,8 @@ static bool particle_skip(ParticleInstanceModifierData *pimd, ParticleSystem *ps /* TODO make randomization optional? */ randp = (int)(psys_frand(psys, 3578 + p) * totpart) % totpart; - minp = (int)(totpart * pimd->particle_offset) % (totpart+1); - maxp = (int)(totpart * (pimd->particle_offset + pimd->particle_amount)) % (totpart+1); + minp = (int)(totpart * pimd->particle_offset) % (totpart + 1); + maxp = (int)(totpart * (pimd->particle_offset + pimd->particle_amount)) % (totpart + 1); if (maxp > minp) { return randp < minp || randp >= maxp; @@ -210,23 +197,23 @@ static void store_float_in_vcol(MLoopCol *vcol, float float_value) vcol->a = 1.0f; } -static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, - ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier( + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *mesh) { - DerivedMesh *dm = derivedData, *result; + Mesh *result; ParticleInstanceModifierData *pimd = (ParticleInstanceModifierData *) md; + struct Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); ParticleSimulationData sim; ParticleSystem *psys = NULL; ParticleData *pa = NULL; MPoly *mpoly, *orig_mpoly; MLoop *mloop, *orig_mloop; MVert *mvert, *orig_mvert; - int totvert, totpoly, totloop , totedge; + int totvert, totpoly, totloop, totedge; int maxvert, maxpoly, maxloop, maxedge, part_end = 0, part_start; int k, p, p_skip; - short track = ob->trackflag % 3, trackneg, axis = pimd->axis; + short track = ctx->object->trackflag % 3, trackneg, axis = pimd->axis; float max_co = 0.0, min_co = 0.0, temp_co[3]; float *size = NULL; float spacemat[4][4]; @@ -234,20 +221,20 @@ static DerivedMesh *applyModifier( const bool use_children = pimd->flag & eParticleInstanceFlag_Children; bool between; - trackneg = ((ob->trackflag > 2) ? 1 : 0); + trackneg = ((ctx->object->trackflag > 2) ? 1 : 0); - if (pimd->ob == ob) { + if (pimd->ob == ctx->object) { pimd->ob = NULL; - return derivedData; + return mesh; } if (pimd->ob) { psys = BLI_findlink(&pimd->ob->particlesystem, pimd->psys - 1); if (psys == NULL || psys->totpart == 0) - return derivedData; + return mesh; } else { - return derivedData; + return mesh; } part_start = use_parents ? 0 : psys->totpart; @@ -259,9 +246,10 @@ static DerivedMesh *applyModifier( part_end += psys->totchild; if (part_end == 0) - return derivedData; + return mesh; - sim.scene = md->scene; + sim.depsgraph = ctx->depsgraph; + sim.scene = scene; sim.ob = pimd->ob; sim.psys = psys; sim.psmd = psys_get_modifier(pimd->ob, psys); @@ -300,10 +288,10 @@ static DerivedMesh *applyModifier( break; } - totvert = dm->getNumVerts(dm); - totpoly = dm->getNumPolys(dm); - totloop = dm->getNumLoops(dm); - totedge = dm->getNumEdges(dm); + totvert = mesh->totvert; + totpoly = mesh->totpoly; + totloop = mesh->totloop; + totedge = mesh->totedge; /* count particles */ maxvert = 0; @@ -326,22 +314,22 @@ static DerivedMesh *applyModifier( if (psys->flag & (PSYS_HAIR_DONE | PSYS_KEYED) || psys->pointcache->flag & PTCACHE_BAKED) { float min[3], max[3]; INIT_MINMAX(min, max); - dm->getMinMax(dm, min, max); + BKE_mesh_minmax(mesh, min, max); min_co = min[track]; max_co = max[track]; } - result = CDDM_from_template(dm, maxvert, maxedge, 0, maxloop, maxpoly); + result = BKE_mesh_new_nomain_from_template(mesh, maxvert, maxedge, 0, maxloop, maxpoly); - mvert = result->getVertArray(result); - orig_mvert = dm->getVertArray(dm); - mpoly = result->getPolyArray(result); - orig_mpoly = dm->getPolyArray(dm); - mloop = result->getLoopArray(result); - orig_mloop = dm->getLoopArray(dm); + mvert = result->mvert; + orig_mvert = mesh->mvert; + mpoly = result->mpoly; + orig_mpoly = mesh->mpoly; + mloop = result->mloop; + orig_mloop = mesh->mloop; - MLoopCol *mloopcols_index = CustomData_get_layer_named(&result->loopData, CD_MLOOPCOL, pimd->index_layer_name); - MLoopCol *mloopcols_value = CustomData_get_layer_named(&result->loopData, CD_MLOOPCOL, pimd->value_layer_name); + MLoopCol *mloopcols_index = CustomData_get_layer_named(&result->ldata, CD_MLOOPCOL, pimd->index_layer_name); + MLoopCol *mloopcols_value = CustomData_get_layer_named(&result->ldata, CD_MLOOPCOL, pimd->value_layer_name); int *vert_part_index = NULL; float *vert_part_value = NULL; if (mloopcols_index != NULL) { @@ -354,7 +342,7 @@ static DerivedMesh *applyModifier( for (p = part_start, p_skip = 0; p < part_end; p++) { float prev_dir[3]; float frame[4]; /* frame orientation quaternion */ - float p_random = psys_frand(psys, 77091 + 283*p); + float p_random = psys_frand(psys, 77091 + 283 * p); /* skip particle? */ if (particle_skip(pimd, psys, p)) @@ -368,7 +356,7 @@ static DerivedMesh *applyModifier( MVert *mv = mvert + vindex; inMV = orig_mvert + k; - DM_copy_vert_data(dm, result, k, p_skip * totvert + k, 1); + CustomData_copy_data(&mesh->vdata, &result->vdata, k, p_skip * totvert + k, 1); *mv = *inMV; if (vert_part_index != NULL) { @@ -418,15 +406,15 @@ static DerivedMesh *applyModifier( pa = psys->particles + p; else { ChildParticle *cpa = psys->child + (p - psys->totpart); - pa = psys->particles + (between? cpa->pa[0]: cpa->parent); + pa = psys->particles + (between ? cpa->pa[0] : cpa->parent); } - psys_mat_hair_to_global(sim.ob, sim.psmd->dm_final, sim.psys->part->from, pa, hairmat); + psys_mat_hair_to_global(sim.ob, sim.psmd->mesh_final, sim.psys->part->from, pa, hairmat); copy_m3_m4(mat, hairmat); /* to quaternion */ mat3_to_quat(frame, mat); if (pimd->rotation > 0.0f || pimd->random_rotation > 0.0f) { - float angle = 2.0f*M_PI * (pimd->rotation + pimd->random_rotation * (psys_frand(psys, 19957323 + p) - 0.5f)); + float angle = 2.0f * M_PI * (pimd->rotation + pimd->random_rotation * (psys_frand(psys, 19957323 + p) - 0.5f)); float eul[3] = { 0.0f, 0.0f, angle }; float rot[4]; @@ -482,8 +470,8 @@ static DerivedMesh *applyModifier( } /* create edges and adjust edge vertex indices*/ - DM_copy_edge_data(dm, result, 0, p_skip * totedge, totedge); - MEdge *me = CDDM_get_edges(result) + p_skip * totedge; + CustomData_copy_data(&mesh->edata, &result->edata, 0, p_skip * totedge, totedge); + MEdge *me = &result->medge[p_skip * totedge]; for (k = 0; k < totedge; k++, me++) { me->v1 += p_skip * totvert; me->v2 += p_skip * totvert; @@ -495,7 +483,7 @@ static DerivedMesh *applyModifier( MPoly *inMP = orig_mpoly + k; MPoly *mp = mpoly + p_skip * totpoly + k; - DM_copy_poly_data(dm, result, k, p_skip * totpoly + k, 1); + CustomData_copy_data(&mesh->pdata, &result->pdata, k, p_skip * totpoly + k, 1); *mp = *inMP; mp->loopstart += p_skip * totloop; @@ -504,7 +492,7 @@ static DerivedMesh *applyModifier( MLoop *ml = mloop + mp->loopstart; int j = mp->totloop; - DM_copy_loop_data(dm, result, inMP->loopstart, mp->loopstart, j); + CustomData_copy_data(&mesh->ldata, &result->ldata, inMP->loopstart, mp->loopstart, j); for (; j; j--, ml++, inML++) { ml->v = inML->v + (p_skip * totvert); ml->e = inML->e + (p_skip * totedge); @@ -534,7 +522,7 @@ static DerivedMesh *applyModifier( MEM_SAFE_FREE(vert_part_index); MEM_SAFE_FREE(vert_part_value); - result->dirty |= DM_DIRTY_NORMALS; + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; return result; } @@ -549,17 +537,25 @@ ModifierTypeInfo modifierType_ParticleInstance = { eModifierTypeFlag_EnableInEditmode, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ isDisabled, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_particlesystem.c b/source/blender/modifiers/intern/MOD_particlesystem.c index 80b6c16b382..784e44f5758 100644 --- a/source/blender/modifiers/intern/MOD_particlesystem.c +++ b/source/blender/modifiers/intern/MOD_particlesystem.c @@ -42,33 +42,34 @@ #include "BKE_cdderivedmesh.h" -#include "BKE_global.h" +#include "BKE_editmesh.h" +#include "BKE_mesh.h" +#include "BKE_library.h" #include "BKE_modifier.h" #include "BKE_particle.h" -#include "MOD_util.h" +#include "DEG_depsgraph_query.h" +#include "MOD_util.h" static void initData(ModifierData *md) { ParticleSystemModifierData *psmd = (ParticleSystemModifierData *) md; psmd->psys = NULL; - psmd->dm_final = NULL; - psmd->dm_deformed = NULL; + psmd->mesh_final = NULL; + psmd->mesh_original = NULL; psmd->totdmvert = psmd->totdmedge = psmd->totdmface = 0; } static void freeData(ModifierData *md) { ParticleSystemModifierData *psmd = (ParticleSystemModifierData *) md; - if (psmd->dm_final) { - psmd->dm_final->needsFree = true; - psmd->dm_final->release(psmd->dm_final); - psmd->dm_final = NULL; - if (psmd->dm_deformed) { - psmd->dm_deformed->needsFree = true; - psmd->dm_deformed->release(psmd->dm_deformed); - psmd->dm_deformed = NULL; + if (psmd->mesh_final) { + BKE_id_free(NULL, psmd->mesh_final); + psmd->mesh_final = NULL; + if (psmd->mesh_original) { + BKE_id_free(NULL, psmd->mesh_original); + psmd->mesh_original = NULL; } } psmd->totdmvert = psmd->totdmedge = psmd->totdmface = 0; @@ -88,8 +89,8 @@ static void copyData(const ModifierData *md, ModifierData *target) modifier_copyData_generic(md, target); - tpsmd->dm_final = NULL; - tpsmd->dm_deformed = NULL; + tpsmd->mesh_final = NULL; + tpsmd->mesh_original = NULL; tpsmd->totdmvert = tpsmd->totdmedge = tpsmd->totdmface = 0; } @@ -101,47 +102,42 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) /* saves the current emitter state for a particle system and calculates particles */ static void deformVerts( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *mesh, float (*vertexCos)[3], - int UNUSED(numVerts), - ModifierApplyFlag flag) + int UNUSED(numVerts)) { - DerivedMesh *dm = derivedData; + Mesh *mesh_src = mesh; ParticleSystemModifierData *psmd = (ParticleSystemModifierData *) md; ParticleSystem *psys = NULL; - bool needsFree = false; /* float cfra = BKE_scene_frame_get(md->scene); */ /* UNUSED */ - if (ob->particlesystem.first) + if (ctx->object->particlesystem.first) psys = psmd->psys; else return; - if (!psys_check_enabled(ob, psys, (flag & MOD_APPLY_RENDER) != 0)) + if (!psys_check_enabled(ctx->object, psys, (ctx->flag & MOD_APPLY_RENDER) != 0)) return; - if (dm == NULL) { - dm = get_dm(ob, NULL, NULL, vertexCos, false, true); - - if (!dm) + if (mesh_src == NULL) { + mesh_src = get_mesh(ctx->object, NULL, NULL, vertexCos, false, true); + if (mesh_src == NULL) { return; - - needsFree = true; + } } /* clear old dm */ - if (psmd->dm_final) { - psmd->dm_final->needsFree = true; - psmd->dm_final->release(psmd->dm_final); - if (psmd->dm_deformed) { - psmd->dm_deformed->needsFree = 1; - psmd->dm_deformed->release(psmd->dm_deformed); - psmd->dm_deformed = NULL; + if (psmd->mesh_final) { + BKE_id_free(NULL, psmd->mesh_final); + psmd->mesh_final = NULL; + if (psmd->mesh_original) { + BKE_id_free(NULL, psmd->mesh_original); + psmd->mesh_original = NULL; } } else if (psmd->flag & eParticleSystemFlag_file_loaded) { - /* in file read dm just wasn't saved in file so no need to reset everything */ + /* in file read mesh just wasn't saved in file so no need to reset everything */ psmd->flag &= ~eParticleSystemFlag_file_loaded; } else { @@ -149,48 +145,75 @@ static void deformVerts( psys->recalc |= PSYS_RECALC_RESET; } - /* make new dm */ - psmd->dm_final = CDDM_copy(dm); - CDDM_apply_vert_coords(psmd->dm_final, vertexCos); - CDDM_calc_normals(psmd->dm_final); - - if (needsFree) { - dm->needsFree = true; - dm->release(dm); - } + /* make new mesh */ + BKE_id_copy_ex(NULL, &mesh_src->id, (ID **)&psmd->mesh_final, + LIB_ID_CREATE_NO_MAIN | + LIB_ID_CREATE_NO_USER_REFCOUNT | + LIB_ID_CREATE_NO_DEG_TAG | + LIB_ID_COPY_NO_PREVIEW, + false); + BKE_mesh_apply_vert_coords(psmd->mesh_final, vertexCos); + BKE_mesh_calc_normals(psmd->mesh_final); + + BKE_mesh_tessface_ensure(psmd->mesh_final); + + if (!psmd->mesh_final->runtime.deformed_only) { + /* Get the original mesh from the object, this is what the particles + * are attached to so in case of non-deform modifiers we need to remap + * them to the final mesh (typically subdivision surfaces). */ + Mesh *mesh_original = NULL; + + if (ctx->object->type == OB_MESH) { + BMEditMesh *edit_btmesh = BKE_editmesh_from_object(ctx->object); + + if (edit_btmesh) { + /* In edit mode get directly from the edit mesh. */ + psmd->mesh_original = BKE_bmesh_to_mesh_nomain(edit_btmesh->bm, &(struct BMeshToMeshParams){0}); + } + else { + /* Otherwise get regular mesh. */ + mesh_original = ctx->object->data; + } + } + else { + mesh_original = mesh_src; + } - /* protect dm */ - psmd->dm_final->needsFree = false; + if (mesh_original) { + /* Make a persistent copy of the mesh. We don't actually need + * all this data, just some topology for remapping. Could be + * optimized once. */ + BKE_id_copy_ex(NULL, &mesh_original->id, (ID **)&psmd->mesh_original, + LIB_ID_CREATE_NO_MAIN | + LIB_ID_CREATE_NO_USER_REFCOUNT | + LIB_ID_CREATE_NO_DEG_TAG | + LIB_ID_COPY_NO_PREVIEW, + false); + } - DM_ensure_tessface(psmd->dm_final); + BKE_mesh_tessface_ensure(psmd->mesh_original); + } - if (!psmd->dm_final->deformedOnly) { - /* XXX Think we can assume here that if current DM is not only-deformed, ob->deformedOnly has been set. - * This is awfully weak though. :| */ - if (ob->derivedDeform) { - psmd->dm_deformed = CDDM_copy(ob->derivedDeform); - } - else { /* Can happen in some cases, e.g. when rendering from Edit mode... */ - psmd->dm_deformed = CDDM_from_mesh((Mesh *)ob->data); - } - DM_ensure_tessface(psmd->dm_deformed); + if (mesh_src != psmd->mesh_final && mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); } /* report change in mesh structure */ - if (psmd->dm_final->getNumVerts(psmd->dm_final) != psmd->totdmvert || - psmd->dm_final->getNumEdges(psmd->dm_final) != psmd->totdmedge || - psmd->dm_final->getNumTessFaces(psmd->dm_final) != psmd->totdmface) + if (psmd->mesh_final->totvert != psmd->totdmvert || + psmd->mesh_final->totedge != psmd->totdmedge || + psmd->mesh_final->totface != psmd->totdmface) { psys->recalc |= PSYS_RECALC_RESET; - psmd->totdmvert = psmd->dm_final->getNumVerts(psmd->dm_final); - psmd->totdmedge = psmd->dm_final->getNumEdges(psmd->dm_final); - psmd->totdmface = psmd->dm_final->getNumTessFaces(psmd->dm_final); + psmd->totdmvert = psmd->mesh_final->totvert; + psmd->totdmedge = psmd->mesh_final->totedge; + psmd->totdmface = psmd->mesh_final->totface; } - if (!(ob->transflag & OB_NO_PSYS_UPDATE)) { + if (!(ctx->object->transflag & OB_NO_PSYS_UPDATE)) { + struct Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); psmd->flag &= ~eParticleSystemFlag_psys_updated; - particle_system_update(G.main, md->scene, ob, psys, (flag & MOD_APPLY_RENDER) != 0); + particle_system_update(ctx->depsgraph, scene, ctx->object, psys, (ctx->flag & MOD_APPLY_RENDER) != 0); psmd->flag |= eParticleSystemFlag_psys_updated; } } @@ -225,17 +248,25 @@ ModifierTypeInfo modifierType_ParticleSystem = { eModifierTypeFlag_EnableInEditmode */, /* copyData */ copyData, + + /* deformVerts_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, - /* deformVertsEM */ NULL, /* deformMatrices */ NULL, + /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ freeData, /* isDisabled */ NULL, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_remesh.c b/source/blender/modifiers/intern/MOD_remesh.c index bd25f2cc727..edf59f6b6b2 100644 --- a/source/blender/modifiers/intern/MOD_remesh.c +++ b/source/blender/modifiers/intern/MOD_remesh.c @@ -30,15 +30,16 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BKE_cdderivedmesh.h" -#include "BKE_DerivedMesh.h" - #include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" +#include "DNA_mesh_types.h" #include "MOD_modifiertypes.h" +#include "BKE_mesh.h" +#include "BKE_mesh_runtime.h" + #include <assert.h> #include <stdlib.h> #include <string.h> @@ -61,28 +62,30 @@ static void initData(ModifierData *md) #ifdef WITH_MOD_REMESH -static void init_dualcon_mesh(DualConInput *mesh, DerivedMesh *dm) +static void init_dualcon_mesh(DualConInput *input, Mesh *mesh) { - memset(mesh, 0, sizeof(DualConInput)); + memset(input, 0, sizeof(DualConInput)); - mesh->co = (void *)dm->getVertArray(dm); - mesh->co_stride = sizeof(MVert); - mesh->totco = dm->getNumVerts(dm); + input->co = (void *)mesh->mvert; + input->co_stride = sizeof(MVert); + input->totco = mesh->totvert; - mesh->mloop = (void *)dm->getLoopArray(dm); - mesh->loop_stride = sizeof(MLoop); - mesh->looptri = (void *)dm->getLoopTriArray(dm); - mesh->tri_stride = sizeof(MLoopTri); - mesh->tottri = dm->getNumLoopTri(dm); + input->mloop = (void *)mesh->mloop; + input->loop_stride = sizeof(MLoop); - INIT_MINMAX(mesh->min, mesh->max); - dm->getMinMax(dm, mesh->min, mesh->max); + BKE_mesh_runtime_looptri_ensure(mesh); + input->looptri = (void *)mesh->runtime.looptris.array; + input->tri_stride = sizeof(MLoopTri); + input->tottri = mesh->runtime.looptris.len; + + INIT_MINMAX(input->min, input->max); + BKE_mesh_minmax(mesh, input->min, input->max); } /* simple structure to hold the output: a CDDM and two counters to * keep track of the current elements */ typedef struct { - DerivedMesh *dm; + Mesh *mesh; int curvert, curface; } DualConOutput; @@ -97,33 +100,33 @@ static void *dualcon_alloc_output(int totvert, int totquad) return NULL; } - output->dm = CDDM_new(totvert, 0, 0, 4 * totquad, totquad); + output->mesh = BKE_mesh_new_nomain(totvert, 0, 0, 4 * totquad, totquad); return output; } static void dualcon_add_vert(void *output_v, const float co[3]) { DualConOutput *output = output_v; - DerivedMesh *dm = output->dm; + Mesh *mesh = output->mesh; - assert(output->curvert < dm->getNumVerts(dm)); + assert(output->curvert < mesh->totvert); - copy_v3_v3(CDDM_get_verts(dm)[output->curvert].co, co); + copy_v3_v3(mesh->mvert[output->curvert].co, co); output->curvert++; } static void dualcon_add_quad(void *output_v, const int vert_indices[4]) { DualConOutput *output = output_v; - DerivedMesh *dm = output->dm; + Mesh *mesh = output->mesh; MLoop *mloop; MPoly *cur_poly; int i; - assert(output->curface < dm->getNumPolys(dm)); + assert(output->curface < mesh->totpoly); - mloop = CDDM_get_loops(dm); - cur_poly = CDDM_get_poly(dm, output->curface); + mloop = mesh->mloop; + cur_poly = &mesh->mpoly[output->curface]; cur_poly->loopstart = output->curface * 4; cur_poly->totloop = 4; @@ -133,22 +136,21 @@ static void dualcon_add_quad(void *output_v, const int vert_indices[4]) output->curface++; } -static DerivedMesh *applyModifier( +static Mesh *applyModifier( ModifierData *md, - Object *UNUSED(ob), - DerivedMesh *dm, - ModifierApplyFlag UNUSED(flag)) + const ModifierEvalContext *UNUSED(ctx), + Mesh *mesh) { RemeshModifierData *rmd; DualConOutput *output; DualConInput input; - DerivedMesh *result; + Mesh *result; DualConFlags flags = 0; DualConMode mode = 0; rmd = (RemeshModifierData *)md; - init_dualcon_mesh(&input, dm); + init_dualcon_mesh(&input, mesh); if (rmd->flag & MOD_REMESH_FLOOD_FILL) flags |= DUALCON_FLOOD_FILL; @@ -175,12 +177,12 @@ static DerivedMesh *applyModifier( rmd->hermite_num, rmd->scale, rmd->depth); - result = output->dm; + result = output->mesh; MEM_freeN(output); if (rmd->flag & MOD_REMESH_SMOOTH_SHADING) { - MPoly *mpoly = CDDM_get_polys(result); - int i, totpoly = result->getNumPolys(result); + MPoly *mpoly = result->mpoly; + int i, totpoly = result->totpoly; /* Apply smooth shading to output faces */ for (i = 0; i < totpoly; i++) { @@ -188,19 +190,19 @@ static DerivedMesh *applyModifier( } } - CDDM_calc_edges(result); - result->dirty |= DM_DIRTY_NORMALS; + BKE_mesh_calc_edges(result, true, false); + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; return result; } #else /* !WITH_MOD_REMESH */ -static DerivedMesh *applyModifier( - ModifierData *UNUSED(md), Object *UNUSED(ob), - DerivedMesh *derivedData, - ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier( + ModifierData *UNUSED(md), + const ModifierEvalContext *UNUSED(ctx), + Mesh *mesh) { - return derivedData; + return mesh; } #endif /* !WITH_MOD_REMESH */ @@ -213,18 +215,27 @@ ModifierTypeInfo modifierType_Remesh = { /* flags */ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode, + /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ NULL, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_screw.c b/source/blender/modifiers/intern/MOD_screw.c index 5c1296d222e..96335707082 100644 --- a/source/blender/modifiers/intern/MOD_screw.c +++ b/source/blender/modifiers/intern/MOD_screw.c @@ -36,6 +36,7 @@ /* Screw modifier: revolves the edges about an axis */ #include <limits.h> +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" @@ -43,10 +44,10 @@ #include "BLI_alloca.h" #include "BLI_utildefines.h" -#include "BKE_cdderivedmesh.h" +#include "BKE_library.h" #include "BKE_library_query.h" +#include "BKE_mesh.h" -#include "depsgraph_private.h" #include "DEG_depsgraph_build.h" #include "MOD_modifiertypes.h" @@ -112,8 +113,8 @@ static void screwvert_iter_step(ScrewVertIter *iter) } } -static DerivedMesh *dm_remove_doubles_on_axis( - DerivedMesh *result, MVert *mvert_new, const uint totvert, const uint step_tot, +static Mesh *mesh_remove_doubles_on_axis( + Mesh *result, MVert *mvert_new, const uint totvert, const uint step_tot, const float axis_vec[3], const float axis_offset[3], const float merge_threshold) { const float merge_threshold_sq = SQUARE(merge_threshold); @@ -157,7 +158,7 @@ static DerivedMesh *dm_remove_doubles_on_axis( } } } - result = CDDM_merge_verts(result, full_doubles_map, (int)(tot_doubles * (step_tot - 1)), CDDM_MERGE_VERTS_DUMP_IF_MAPPED); + result = BKE_mesh_merge_verts(result, full_doubles_map, (int)(tot_doubles * (step_tot - 1)), MESH_MERGE_VERTS_DUMP_IF_MAPPED); MEM_freeN(full_doubles_map); } return result; @@ -176,15 +177,14 @@ static void initData(ModifierData *md) ltmd->merge_dist = 0.01f; } -static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, - ModifierApplyFlag flag) +static Mesh *applyModifier( + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *meshData) { - DerivedMesh *dm = derivedData; - DerivedMesh *result; + Mesh *mesh = meshData; + Mesh *result; ScrewModifierData *ltmd = (ScrewModifierData *) md; - const bool use_render_params = (flag & MOD_APPLY_RENDER) != 0; + const bool use_render_params = (ctx->flag & MOD_APPLY_RENDER) != 0; int *origindex; int mpoly_index = 0; @@ -208,15 +208,15 @@ static DerivedMesh *applyModifier( }; unsigned int maxVerts = 0, maxEdges = 0, maxPolys = 0; - const unsigned int totvert = (unsigned int)dm->getNumVerts(dm); - const unsigned int totedge = (unsigned int)dm->getNumEdges(dm); - const unsigned int totpoly = (unsigned int)dm->getNumPolys(dm); + const unsigned int totvert = (unsigned int)mesh->totvert; + const unsigned int totedge = (unsigned int)mesh->totedge; + const unsigned int totpoly = (unsigned int)mesh->totpoly; unsigned int *edge_poly_map = NULL; /* orig edge to orig poly */ unsigned int *vert_loop_map = NULL; /* orig vert to orig loop */ /* UV Coords */ - const unsigned int mloopuv_layers_tot = (unsigned int)CustomData_number_of_layers(&dm->loopData, CD_MLOOPUV); + const unsigned int mloopuv_layers_tot = (unsigned int)CustomData_number_of_layers(&mesh->ldata, CD_MLOOPUV); MLoopUV **mloopuv_layers = BLI_array_alloca(mloopuv_layers, mloopuv_layers_tot); float uv_u_scale; float uv_v_minmax[2] = {FLT_MAX, -FLT_MAX}; @@ -251,7 +251,7 @@ static DerivedMesh *applyModifier( /* don't do anything? */ if (!totvert) - return CDDM_from_template(dm, 0, 0, 0, 0, 0); + return BKE_mesh_new_nomain_from_template(mesh, 0, 0, 0, 0, 0); switch (ltmd->axis) { case 0: @@ -272,7 +272,7 @@ static DerivedMesh *applyModifier( if (ltmd->ob_axis) { /* calc the matrix relative to the axis object */ - invert_m4_m4(mtx_tmp_a, ob->obmat); + invert_m4_m4(mtx_tmp_a, ctx->object->obmat); copy_m4_m4(mtx_tx_inv, ltmd->ob_axis->obmat); mul_m4_m4m4(mtx_tx, mtx_tmp_a, mtx_tx_inv); @@ -376,24 +376,24 @@ static DerivedMesh *applyModifier( uv_u_scale = (uv_u_scale / (float)ltmd->iter) * (angle / ((float)M_PI * 2.0f)); } - result = CDDM_from_template(dm, (int)maxVerts, (int)maxEdges, 0, (int)maxPolys * 4, (int)maxPolys); + result = BKE_mesh_new_nomain_from_template(mesh, (int)maxVerts, (int)maxEdges, 0, (int)maxPolys * 4, (int)maxPolys); /* copy verts from mesh */ - mvert_orig = dm->getVertArray(dm); - medge_orig = dm->getEdgeArray(dm); + mvert_orig = mesh->mvert; + medge_orig = mesh->medge; - mvert_new = result->getVertArray(result); - mpoly_new = result->getPolyArray(result); - mloop_new = result->getLoopArray(result); - medge_new = result->getEdgeArray(result); + mvert_new = result->mvert; + mpoly_new = result->mpoly; + mloop_new = result->mloop; + medge_new = result->medge; - if (!CustomData_has_layer(&result->polyData, CD_ORIGINDEX)) { - CustomData_add_layer(&result->polyData, CD_ORIGINDEX, CD_CALLOC, NULL, (int)maxPolys); + if (!CustomData_has_layer(&result->pdata, CD_ORIGINDEX)) { + CustomData_add_layer(&result->pdata, CD_ORIGINDEX, CD_CALLOC, NULL, (int)maxPolys); } - origindex = CustomData_get_layer(&result->polyData, CD_ORIGINDEX); + origindex = CustomData_get_layer(&result->pdata, CD_ORIGINDEX); - DM_copy_vert_data(dm, result, 0, 0, (int)totvert); /* copy first otherwise this overwrites our own vertex normals */ + CustomData_copy_data(&mesh->vdata, &result->vdata, 0, 0, (int)totvert); if (mloopuv_layers_tot) { float zero_co[3] = {0}; @@ -403,7 +403,7 @@ static DerivedMesh *applyModifier( if (mloopuv_layers_tot) { unsigned int uv_lay; for (uv_lay = 0; uv_lay < mloopuv_layers_tot; uv_lay++) { - mloopuv_layers[uv_lay] = CustomData_get_layer_n(&result->loopData, CD_MLOOPUV, (int)uv_lay); + mloopuv_layers[uv_lay] = CustomData_get_layer_n(&result->ldata, CD_MLOOPUV, (int)uv_lay); } if (ltmd->flag & MOD_SCREW_UV_STRETCH_V) { @@ -439,8 +439,8 @@ static DerivedMesh *applyModifier( if (totpoly) { MPoly *mp_orig; - mpoly_orig = dm->getPolyArray(dm); - mloop_orig = dm->getLoopArray(dm); + mpoly_orig = mesh->mpoly; + mloop_orig = mesh->mloop; edge_poly_map = MEM_malloc_arrayN(totedge, sizeof(*edge_poly_map), __func__); memset(edge_poly_map, 0xff, sizeof(*edge_poly_map) * totedge); @@ -851,7 +851,7 @@ static DerivedMesh *applyModifier( madd_v3_v3fl(mat[3], axis_vec, screw_ofs * ((float)step / (float)(step_tot - 1))); /* copy a slice */ - DM_copy_vert_data(dm, result, 0, (int)varray_stride, (int)totvert); + CustomData_copy_data(&mesh->vdata, &result->vdata, 0, (int)varray_stride, (int)totvert); mv_new_base = mvert_new; mv_new = &mvert_new[varray_stride]; /* advance to the next slice */ @@ -954,7 +954,7 @@ static DerivedMesh *applyModifier( /* Polygon */ if (has_mpoly_orig) { - DM_copy_poly_data(dm, result, (int)mpoly_index_orig, (int)mpoly_index, 1); + CustomData_copy_data(&mesh->pdata, &result->pdata, (int)mpoly_index_orig, (int)mpoly_index, 1); origindex[mpoly_index] = (int)mpoly_index_orig; } else { @@ -969,10 +969,11 @@ static DerivedMesh *applyModifier( /* Loop-Custom-Data */ if (has_mloop_orig) { int l_index = (int)(ml_new - mloop_new); - DM_copy_loop_data(dm, result, (int)mloop_index_orig[0], l_index + 0, 1); - DM_copy_loop_data(dm, result, (int)mloop_index_orig[1], l_index + 1, 1); - DM_copy_loop_data(dm, result, (int)mloop_index_orig[1], l_index + 2, 1); - DM_copy_loop_data(dm, result, (int)mloop_index_orig[0], l_index + 3, 1); + + CustomData_copy_data(&mesh->ldata, &result->ldata, (int)mloop_index_orig[0], l_index + 0, 1); + CustomData_copy_data(&mesh->ldata, &result->ldata, (int)mloop_index_orig[1], l_index + 1, 1); + CustomData_copy_data(&mesh->ldata, &result->ldata, (int)mloop_index_orig[1], l_index + 2, 1); + CustomData_copy_data(&mesh->ldata, &result->ldata, (int)mloop_index_orig[0], l_index + 3, 1); if (mloopuv_layers_tot) { unsigned int uv_lay; @@ -1094,36 +1095,22 @@ static DerivedMesh *applyModifier( } if ((ltmd->flag & MOD_SCREW_MERGE) && (screw_ofs == 0.0f)) { - DerivedMesh *result_prev = result; - result = dm_remove_doubles_on_axis( + Mesh *result_prev = result; + result = mesh_remove_doubles_on_axis( result, mvert_new, totvert, step_tot, axis_vec, ltmd->ob_axis ? mtx_tx[3] : NULL, ltmd->merge_dist); if (result != result_prev) { - result->dirty |= DM_DIRTY_NORMALS; + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; } } if ((ltmd->flag & MOD_SCREW_NORMAL_CALC) == 0) { - result->dirty |= DM_DIRTY_NORMALS; + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; } return result; } - -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - ScrewModifierData *ltmd = (ScrewModifierData *) md; - - if (ltmd->ob_axis) { - DagNode *curNode = dag_get_node(ctx->forest, ltmd->ob_axis); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, - "Screw Modifier"); - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { ScrewModifierData *ltmd = (ScrewModifierData *)md; @@ -1153,17 +1140,25 @@ ModifierTypeInfo modifierType_Screw = { eModifierTypeFlag_EnableInEditmode, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ NULL, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_shapekey.c b/source/blender/modifiers/intern/MOD_shapekey.c index e7453feef5e..a6c7419da49 100644 --- a/source/blender/modifiers/intern/MOD_shapekey.c +++ b/source/blender/modifiers/intern/MOD_shapekey.c @@ -34,40 +34,39 @@ #include "BLI_math.h" +#include "DNA_mesh_types.h" #include "DNA_key_types.h" #include "BLI_utildefines.h" -#include "BKE_cdderivedmesh.h" #include "BKE_key.h" #include "BKE_particle.h" #include "MOD_modifiertypes.h" static void deformVerts( - ModifierData *UNUSED(md), Object *ob, - DerivedMesh *UNUSED(derivedData), + ModifierData *UNUSED(md), const ModifierEvalContext *ctx, + Mesh *UNUSED(mesh), float (*vertexCos)[3], - int numVerts, - ModifierApplyFlag UNUSED(flag)) + int numVerts) { - Key *key = BKE_key_from_object(ob); + Key *key = BKE_key_from_object(ctx->object); if (key && key->block.first) { int deformedVerts_tot; BKE_key_evaluate_object_ex( - ob, &deformedVerts_tot, + ctx->object, &deformedVerts_tot, (float *)vertexCos, sizeof(*vertexCos) * numVerts); } } static void deformMatrices( - ModifierData *md, Object *ob, DerivedMesh *derivedData, + ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, float (*vertexCos)[3], float (*defMats)[3][3], int numVerts) { - Key *key = BKE_key_from_object(ob); - KeyBlock *kb = BKE_keyblock_from_object(ob); + Key *key = BKE_key_from_object(ctx->object); + KeyBlock *kb = BKE_keyblock_from_object(ctx->object); float scale[3][3]; (void)vertexCos; /* unused */ @@ -75,39 +74,39 @@ static void deformMatrices( if (kb && kb->totelem == numVerts && kb != key->refkey) { int a; - if (ob->shapeflag & OB_SHAPE_LOCK) scale_m3_fl(scale, 1); + if (ctx->object->shapeflag & OB_SHAPE_LOCK) scale_m3_fl(scale, 1); else scale_m3_fl(scale, kb->curval); for (a = 0; a < numVerts; a++) copy_m3_m3(defMats[a], scale); } - deformVerts(md, ob, derivedData, vertexCos, numVerts, 0); + deformVerts(md, ctx, mesh, vertexCos, numVerts); } static void deformVertsEM( - ModifierData *md, Object *ob, + ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *UNUSED(editData), - DerivedMesh *derivedData, + Mesh *mesh, float (*vertexCos)[3], int numVerts) { - Key *key = BKE_key_from_object(ob); + Key *key = BKE_key_from_object(ctx->object); if (key && key->type == KEY_RELATIVE) - deformVerts(md, ob, derivedData, vertexCos, numVerts, 0); + deformVerts(md, ctx, mesh, vertexCos, numVerts); } static void deformMatricesEM( - ModifierData *UNUSED(md), Object *ob, + ModifierData *UNUSED(md), const ModifierEvalContext *ctx, struct BMEditMesh *UNUSED(editData), - DerivedMesh *UNUSED(derivedData), + Mesh *UNUSED(mesh), float (*vertexCos)[3], float (*defMats)[3][3], int numVerts) { - Key *key = BKE_key_from_object(ob); - KeyBlock *kb = BKE_keyblock_from_object(ob); + Key *key = BKE_key_from_object(ctx->object); + KeyBlock *kb = BKE_keyblock_from_object(ctx->object); float scale[3][3]; (void)vertexCos; /* unused */ @@ -132,17 +131,25 @@ ModifierTypeInfo modifierType_ShapeKey = { eModifierTypeFlag_SupportsEditmode, /* copyData */ NULL, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ deformMatrices, /* deformVertsEM */ deformVertsEM, /* deformMatricesEM */ deformMatricesEM, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ NULL, /* requiredDataMask */ NULL, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_shrinkwrap.c b/source/blender/modifiers/intern/MOD_shrinkwrap.c index c30be7d3a11..72c1c1552c7 100644 --- a/source/blender/modifiers/intern/MOD_shrinkwrap.c +++ b/source/blender/modifiers/intern/MOD_shrinkwrap.c @@ -35,17 +35,20 @@ #include <string.h> +#include "DNA_mesh_types.h" #include "DNA_object_types.h" #include "BLI_math.h" #include "BLI_utildefines.h" -#include "BKE_cdderivedmesh.h" +#include "BKE_editmesh.h" +#include "BKE_library.h" #include "BKE_library_query.h" +#include "BKE_mesh.h" #include "BKE_modifier.h" #include "BKE_shrinkwrap.h" -#include "depsgraph_private.h" +#include "DEG_depsgraph_query.h" #include "MOD_util.h" @@ -81,7 +84,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) return dataMask; } -static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(useRenderParams)) { ShrinkwrapModifierData *smd = (ShrinkwrapModifierData *) md; return !smd->target; @@ -97,56 +100,42 @@ static void foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk, } static void deformVerts( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *mesh, float (*vertexCos)[3], - int numVerts, - ModifierApplyFlag flag) + int numVerts) { - DerivedMesh *dm = derivedData; - CustomDataMask dataMask = requiredDataMask(ob, md); - bool forRender = (flag & MOD_APPLY_RENDER) != 0; + struct Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); + Mesh *mesh_src = mesh; - /* ensure we get a CDDM with applied vertex coords */ - if (dataMask) { - dm = get_cddm(ob, NULL, dm, vertexCos, dependsOnNormals(md)); + if (mesh_src == NULL) { + mesh_src = ctx->object->data; } - shrinkwrapModifier_deform((ShrinkwrapModifierData *)md, ob, dm, vertexCos, numVerts, forRender); + BLI_assert(mesh_src->totvert == numVerts); - if (dm != derivedData) - dm->release(dm); + shrinkwrapModifier_deform((ShrinkwrapModifierData *)md, scene, ctx->object, mesh_src, vertexCos, numVerts); } static void deformVertsEM( - ModifierData *md, Object *ob, struct BMEditMesh *editData, DerivedMesh *derivedData, + ModifierData *md, const ModifierEvalContext *ctx, + struct BMEditMesh *editData, Mesh *mesh, float (*vertexCos)[3], int numVerts) { - DerivedMesh *dm = derivedData; - CustomDataMask dataMask = requiredDataMask(ob, md); + struct Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); + Mesh *mesh_src = mesh; - /* ensure we get a CDDM with applied vertex coords */ - if (dataMask) { - dm = get_cddm(ob, editData, dm, vertexCos, dependsOnNormals(md)); + if (mesh_src == NULL) { + mesh_src = BKE_bmesh_to_mesh_nomain(editData->bm, &(struct BMeshToMeshParams){0}); } - shrinkwrapModifier_deform((ShrinkwrapModifierData *)md, ob, dm, vertexCos, numVerts, false); + BLI_assert(mesh_src->totvert == numVerts); - if (dm != derivedData) - dm->release(dm); -} - -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - ShrinkwrapModifierData *smd = (ShrinkwrapModifierData *) md; - - if (smd->target) - dag_add_relation(ctx->forest, dag_get_node(ctx->forest, smd->target), ctx->obNode, - DAG_RL_OB_DATA | DAG_RL_DATA_DATA, "Shrinkwrap Modifier"); + shrinkwrapModifier_deform((ShrinkwrapModifierData *)md, scene, ctx->object, mesh_src, vertexCos, numVerts); - if (smd->auxTarget) - dag_add_relation(ctx->forest, dag_get_node(ctx->forest, smd->auxTarget), ctx->obNode, - DAG_RL_OB_DATA | DAG_RL_DATA_DATA, "Shrinkwrap Modifier"); + if (!mesh) { + BKE_id_free(NULL, mesh_src); + } } static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) @@ -184,17 +173,25 @@ ModifierTypeInfo modifierType_Shrinkwrap = { eModifierTypeFlag_EnableInEditmode, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ deformVertsEM, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ isDisabled, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ dependsOnNormals, diff --git a/source/blender/modifiers/intern/MOD_simpledeform.c b/source/blender/modifiers/intern/MOD_simpledeform.c index b3982bc5f3e..22fe0bacf87 100644 --- a/source/blender/modifiers/intern/MOD_simpledeform.c +++ b/source/blender/modifiers/intern/MOD_simpledeform.c @@ -32,22 +32,24 @@ * \ingroup modifiers */ +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "BLI_math.h" #include "BLI_utildefines.h" -#include "BKE_cdderivedmesh.h" +#include "BKE_editmesh.h" +#include "BKE_mesh.h" +#include "BKE_library.h" #include "BKE_library_query.h" #include "BKE_modifier.h" #include "BKE_deform.h" - -#include "depsgraph_private.h" - #include "MOD_util.h" +#include "bmesh.h" + #define BEND_EPS 0.000001f /* Re-maps the indicies for X Y Z by shifting them up and wrapping, such that @@ -184,11 +186,10 @@ static void simpleDeform_bend(const float factor, const int axis, const float dc /* simple deform modifier */ static void SimpleDeformModifier_do( - SimpleDeformModifierData *smd, struct Object *ob, struct DerivedMesh *dm, + SimpleDeformModifierData *smd, struct Object *ob, struct Mesh *mesh, float (*vertexCos)[3], int numVerts) { const float base_limit[2] = {0.0f, 0.0f}; - int i; float smd_limit[2], smd_factor; SpaceTransform *transf = NULL, tmp_transf; @@ -285,7 +286,7 @@ static void SimpleDeformModifier_do( } } - modifier_get_vgroup(ob, dm, smd->vgroup_name, &dvert, &vgroup); + modifier_get_vgroup_mesh(ob, mesh, smd->vgroup_name, &dvert, &vgroup); const bool invert_vgroup = (smd->flag & MOD_SIMPLEDEFORM_FLAG_INVERT_VGROUP) != 0; const uint *axis_map = axis_map_table[(smd->mode != MOD_SIMPLEDEFORM_MODE_BEND) ? deform_axis : 2]; @@ -370,14 +371,6 @@ static void foreachObjectLink( walk(userData, ob, &smd->origin, IDWALK_CB_NOP); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md; - - if (smd->origin) - dag_add_relation(ctx->forest, dag_get_node(ctx->forest, smd->origin), ctx->obNode, DAG_RL_OB_DATA, "SimpleDeform Modifier"); -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md; @@ -387,45 +380,34 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte } static void deformVerts( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, + ModifierData *md, const ModifierEvalContext *ctx, + struct Mesh *mesh, float (*vertexCos)[3], - int numVerts, - ModifierApplyFlag UNUSED(flag)) + int numVerts) { - DerivedMesh *dm = derivedData; - CustomDataMask dataMask = requiredDataMask(ob, md); - - /* we implement requiredDataMask but thats not really useful since - * mesh_calc_modifiers pass a NULL derivedData */ - if (dataMask) - dm = get_dm(ob, NULL, dm, NULL, false, false); + Mesh *mesh_src = get_mesh(ctx->object, NULL, mesh, NULL, false, false); - SimpleDeformModifier_do((SimpleDeformModifierData *)md, ob, dm, vertexCos, numVerts); + SimpleDeformModifier_do((SimpleDeformModifierData *)md, ctx->object, mesh_src, vertexCos, numVerts); - if (dm != derivedData) - dm->release(dm); + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); + } } static void deformVertsEM( - ModifierData *md, Object *ob, + ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *editData, - DerivedMesh *derivedData, + struct Mesh *mesh, float (*vertexCos)[3], int numVerts) { - DerivedMesh *dm = derivedData; - CustomDataMask dataMask = requiredDataMask(ob, md); - - /* we implement requiredDataMask but thats not really useful since - * mesh_calc_modifiers pass a NULL derivedData */ - if (dataMask) - dm = get_dm(ob, editData, dm, NULL, false, false); + Mesh *mesh_src = get_mesh(ctx->object, editData, mesh, NULL, false, false); - SimpleDeformModifier_do((SimpleDeformModifierData *)md, ob, dm, vertexCos, numVerts); + SimpleDeformModifier_do((SimpleDeformModifierData *)md, ctx->object, mesh_src, vertexCos, numVerts); - if (dm != derivedData) - dm->release(dm); + if (mesh_src != mesh) { + BKE_id_free(NULL, mesh_src); + } } @@ -442,17 +424,25 @@ ModifierTypeInfo modifierType_SimpleDeform = { eModifierTypeFlag_EnableInEditmode, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ deformVertsEM, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_skin.c b/source/blender/modifiers/intern/MOD_skin.c index 13e8f232b78..31d556292f8 100644 --- a/source/blender/modifiers/intern/MOD_skin.c +++ b/source/blender/modifiers/intern/MOD_skin.c @@ -59,6 +59,7 @@ #include "MEM_guardedalloc.h" +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_modifier_types.h" @@ -70,9 +71,8 @@ #include "BLI_stack.h" #include "BLI_bitmap.h" -#include "BKE_cdderivedmesh.h" #include "BKE_deform.h" -#include "BKE_DerivedMesh.h" +#include "BKE_library.h" #include "BKE_mesh.h" #include "BKE_mesh_mapping.h" #include "BKE_modifier.h" @@ -826,11 +826,11 @@ static int calc_edge_subdivisions( #undef NUM_SUBDIVISIONS_MAX } -/* Take a DerivedMesh and subdivide its edges to keep skin nodes +/* Take a Mesh and subdivide its edges to keep skin nodes * reasonably close. */ -static DerivedMesh *subdivide_base(DerivedMesh *orig) +static Mesh *subdivide_base(Mesh *orig) { - DerivedMesh *dm; + Mesh *result; MVertSkin *orignode, *outnode; MVert *origvert, *outvert; MEdge *origedge, *outedge, *e; @@ -840,12 +840,12 @@ static DerivedMesh *subdivide_base(DerivedMesh *orig) int i, j, k, u, v; float radrat; - orignode = CustomData_get_layer(&orig->vertData, CD_MVERT_SKIN); - origvert = orig->getVertArray(orig); - origedge = orig->getEdgeArray(orig); - origdvert = orig->getVertDataArray(orig, CD_MDEFORMVERT); - totorigvert = orig->getNumVerts(orig); - totorigedge = orig->getNumEdges(orig); + orignode = CustomData_get_layer(&orig->vdata, CD_MVERT_SKIN); + origvert = orig->mvert; + origedge = orig->medge; + origdvert = orig->dvert; + totorigvert = orig->totvert; + totorigedge = orig->totedge; /* Get degree of all vertices */ degree = MEM_calloc_arrayN(totorigvert, sizeof(int), "degree"); @@ -864,20 +864,21 @@ static DerivedMesh *subdivide_base(DerivedMesh *orig) MEM_freeN(degree); - /* Allocate output derivedmesh */ - dm = CDDM_from_template(orig, - totorigvert + totsubd, - totorigedge + totsubd, - 0, 0, 0); + /* Allocate output mesh */ + result = BKE_mesh_new_nomain_from_template( + orig, + totorigvert + totsubd, + totorigedge + totsubd, + 0, 0, 0); - outvert = dm->getVertArray(dm); - outedge = dm->getEdgeArray(dm); - outnode = CustomData_get_layer(&dm->vertData, CD_MVERT_SKIN); - outdvert = CustomData_get_layer(&dm->vertData, CD_MDEFORMVERT); + outvert = result->mvert; + outedge = result->medge; + outnode = CustomData_get_layer(&result->vdata, CD_MVERT_SKIN); + outdvert = result->dvert; /* Copy original vertex data */ - CustomData_copy_data(&orig->vertData, - &dm->vertData, + CustomData_copy_data(&orig->vdata, + &result->vdata, 0, 0, totorigvert); /* Subdivide edges */ @@ -961,7 +962,7 @@ static DerivedMesh *subdivide_base(DerivedMesh *orig) MEM_freeN(edge_subd); - return dm; + return result; } /******************************* Output *******************************/ @@ -1819,12 +1820,12 @@ static BMesh *build_skin(SkinNode *skin_nodes, return so.bm; } -static void skin_set_orig_indices(DerivedMesh *dm) +static void skin_set_orig_indices(Mesh *mesh) { int *orig, totpoly; - totpoly = dm->getNumPolys(dm); - orig = CustomData_add_layer(&dm->polyData, CD_ORIGINDEX, + totpoly = mesh->totpoly; + orig = CustomData_add_layer(&mesh->pdata, CD_ORIGINDEX, CD_CALLOC, NULL, totpoly); copy_vn_i(orig, totpoly, ORIGINDEX_NONE); } @@ -1835,10 +1836,10 @@ static void skin_set_orig_indices(DerivedMesh *dm) * 2) Generate node frames * 3) Output vertices and polygons from frames, connections, and hulls */ -static DerivedMesh *base_skin(DerivedMesh *origdm, - SkinModifierData *smd) +static Mesh *base_skin(Mesh *origmesh, + SkinModifierData *smd) { - DerivedMesh *result; + Mesh *result; MVertSkin *nodes; BMesh *bm; EMat *emat; @@ -1851,13 +1852,13 @@ static DerivedMesh *base_skin(DerivedMesh *origdm, int totvert, totedge; bool has_valid_root = false; - nodes = CustomData_get_layer(&origdm->vertData, CD_MVERT_SKIN); + nodes = CustomData_get_layer(&origmesh->vdata, CD_MVERT_SKIN); - mvert = origdm->getVertArray(origdm); - dvert = origdm->getVertDataArray(origdm, CD_MDEFORMVERT); - medge = origdm->getEdgeArray(origdm); - totvert = origdm->getNumVerts(origdm); - totedge = origdm->getNumEdges(origdm); + mvert = origmesh->mvert; + dvert = origmesh->dvert; + medge = origmesh->medge; + totvert = origmesh->totvert; + totedge = origmesh->totedge; BKE_mesh_vert_edge_map_create(&emap, &emapmem, medge, totvert, totedge); @@ -1879,31 +1880,29 @@ static DerivedMesh *base_skin(DerivedMesh *origdm, if (!bm) return NULL; - result = CDDM_from_bmesh(bm, false); + result = BKE_bmesh_to_mesh_nomain(bm, &(struct BMeshToMeshParams){0}); BM_mesh_free(bm); - result->dirty |= DM_DIRTY_NORMALS; + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; skin_set_orig_indices(result); return result; } -static DerivedMesh *final_skin(SkinModifierData *smd, - DerivedMesh *origdm) +static Mesh *final_skin(SkinModifierData *smd, Mesh *mesh) { - DerivedMesh *dm; + Mesh *result; /* Skin node layer is required */ - if (!CustomData_get_layer(&origdm->vertData, CD_MVERT_SKIN)) - return origdm; - - origdm = subdivide_base(origdm); - dm = base_skin(origdm, smd); + if (!CustomData_get_layer(&mesh->vdata, CD_MVERT_SKIN)) + return mesh; - origdm->release(origdm); + mesh = subdivide_base(mesh); + result = base_skin(mesh, smd); - return dm; + BKE_id_free(NULL, mesh); + return result; } @@ -1921,15 +1920,14 @@ static void initData(ModifierData *md) smd->symmetry_axes = MOD_SKIN_SYMM_X; } -static DerivedMesh *applyModifier(ModifierData *md, - Object *UNUSED(ob), - DerivedMesh *dm, - ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier(ModifierData *md, + const ModifierEvalContext *UNUSED(ctx), + Mesh *mesh) { - DerivedMesh *result; + Mesh *result; - if (!(result = final_skin((SkinModifierData *)md, dm))) - return dm; + if (!(result = final_skin((SkinModifierData *)md, mesh))) + return mesh; return result; } @@ -1947,17 +1945,25 @@ ModifierTypeInfo modifierType_Skin = { /* flags */ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_smoke.c b/source/blender/modifiers/intern/MOD_smoke.c index cd2a542efa9..9384f850d96 100644 --- a/source/blender/modifiers/intern/MOD_smoke.c +++ b/source/blender/modifiers/intern/MOD_smoke.c @@ -46,14 +46,16 @@ #include "BLI_utildefines.h" #include "BKE_cdderivedmesh.h" +#include "BKE_layer.h" #include "BKE_library.h" #include "BKE_library_query.h" #include "BKE_main.h" #include "BKE_modifier.h" #include "BKE_smoke.h" -#include "depsgraph_private.h" +#include "DEG_depsgraph.h" #include "DEG_depsgraph_build.h" +#include "DEG_depsgraph_query.h" #include "MOD_modifiertypes.h" @@ -102,16 +104,17 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) } static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, - DerivedMesh *dm, - ModifierApplyFlag flag) + ModifierData *md, const ModifierEvalContext *ctx, + DerivedMesh *dm) { SmokeModifierData *smd = (SmokeModifierData *) md; - if (flag & MOD_APPLY_ORCO) + if (ctx->flag & MOD_APPLY_ORCO) { return dm; + } - return smokeModifier_do(smd, md->scene, ob, dm); + Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); + return smokeModifier_do(smd, ctx->depsgraph, scene, ctx->object, dm); } static bool dependsOnTime(ModifierData *UNUSED(md)) @@ -131,30 +134,14 @@ static bool is_coll_cb(Object *UNUSED(ob), ModifierData *md) return (smd->type & MOD_SMOKE_TYPE_COLL) && smd->coll; } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - SmokeModifierData *smd = (SmokeModifierData *) md; - - if (smd && (smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain) { - /* Actual code uses get_collisionobjects */ -#ifdef WITH_LEGACY_DEPSGRAPH - dag_add_collision_relations(ctx->forest, ctx->scene, ctx->object, ctx->obNode, smd->domain->fluid_group, ctx->object->lay|ctx->scene->lay, eModifierType_Smoke, is_flow_cb, true, "Smoke Flow"); - dag_add_collision_relations(ctx->forest, ctx->scene, ctx->object, ctx->obNode, smd->domain->coll_group, ctx->object->lay|ctx->scene->lay, eModifierType_Smoke, is_coll_cb, true, "Smoke Coll"); - dag_add_forcefield_relations(ctx->forest, ctx->scene, ctx->object, ctx->obNode, smd->domain->effector_weights, true, PFIELD_SMOKEFLOW, "Smoke Force Field"); -#else - (void)ctx; -#endif - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { SmokeModifierData *smd = (SmokeModifierData *)md; if (smd && (smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain) { /* Actual code uses get_collisionobjects */ - DEG_add_collision_relations(ctx->node, ctx->scene, ctx->object, smd->domain->fluid_group, ctx->object->lay|ctx->scene->lay, eModifierType_Smoke, is_flow_cb, true, "Smoke Flow"); - DEG_add_collision_relations(ctx->node, ctx->scene, ctx->object, smd->domain->coll_group, ctx->object->lay|ctx->scene->lay, eModifierType_Smoke, is_coll_cb, true, "Smoke Coll"); + DEG_add_collision_relations(ctx->node, ctx->scene, ctx->object, smd->domain->fluid_group, eModifierType_Smoke, is_flow_cb, true, "Smoke Flow"); + DEG_add_collision_relations(ctx->node, ctx->scene, ctx->object, smd->domain->coll_group, eModifierType_Smoke, is_coll_cb, true, "Smoke Coll"); DEG_add_forcefield_relations(ctx->node, ctx->scene, ctx->object, smd->domain->effector_weights, true, PFIELD_SMOKEFLOW, "Smoke Force Field"); } @@ -191,17 +178,25 @@ ModifierTypeInfo modifierType_Smoke = { eModifierTypeFlag_Single, /* copyData */ copyData, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ applyModifier, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, - /* applyModifier */ applyModifier, + /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ freeData, /* isDisabled */ NULL, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ dependsOnTime, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_smooth.c b/source/blender/modifiers/intern/MOD_smooth.c index 5aa38e2c693..2d5084abac3 100644 --- a/source/blender/modifiers/intern/MOD_smooth.c +++ b/source/blender/modifiers/intern/MOD_smooth.c @@ -33,6 +33,7 @@ */ +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "BLI_math.h" @@ -40,7 +41,9 @@ #include "MEM_guardedalloc.h" -#include "BKE_cdderivedmesh.h" +#include "BKE_editmesh.h" +#include "BKE_library.h" +#include "BKE_mesh.h" #include "BKE_particle.h" #include "BKE_deform.h" @@ -58,7 +61,7 @@ static void initData(ModifierData *md) smd->defgrp_name[0] = '\0'; } -static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(useRenderParams)) { SmoothModifierData *smd = (SmoothModifierData *) md; short flag; @@ -83,7 +86,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) } static void smoothModifier_do( - SmoothModifierData *smd, Object *ob, DerivedMesh *dm, + SmoothModifierData *smd, Object *ob, Mesh *mesh, float (*vertexCos)[3], int numVerts) { MDeformVert *dvert = NULL; @@ -106,16 +109,16 @@ static void smoothModifier_do( fac = smd->fac; facm = 1 - fac; - if (dm->getNumVerts(dm) == numVerts) { - medges = dm->getEdgeArray(dm); - numDMEdges = dm->getNumEdges(dm); + if (mesh->totvert == numVerts) { + medges = mesh->medge; + numDMEdges = mesh->totedge; } else { medges = NULL; numDMEdges = 0; } - modifier_get_vgroup(ob, dm, smd->defgrp_name, &dvert, &defgrp_index); + modifier_get_vgroup_mesh(ob, mesh, smd->defgrp_name, &dvert, &defgrp_index); /* NOTICE: this can be optimized a little bit by moving the * if (dvert) out of the loop, if needed */ @@ -207,29 +210,39 @@ static void smoothModifier_do( } static void deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, ModifierApplyFlag UNUSED(flag)) + ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, + float (*vertexCos)[3], int numVerts) { - DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, false, false); + Mesh *mesh_src = mesh; - smoothModifier_do((SmoothModifierData *)md, ob, dm, - vertexCos, numVerts); + if (mesh_src == NULL) { + mesh_src = ctx->object->data; + } - if (dm != derivedData) - dm->release(dm); + BLI_assert(mesh_src->totvert == numVerts); + + smoothModifier_do((SmoothModifierData *)md, ctx->object, mesh_src, + vertexCos, numVerts); } static void deformVertsEM( - ModifierData *md, Object *ob, struct BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) + ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *editData, + Mesh *mesh, float (*vertexCos)[3], int numVerts) { - DerivedMesh *dm = get_dm(ob, editData, derivedData, NULL, false, false); + Mesh *mesh_src = mesh; + + if (mesh_src == NULL) { + mesh_src = BKE_bmesh_to_mesh_nomain(editData->bm, &(struct BMeshToMeshParams){0}); + } + + BLI_assert(mesh_src->totvert == numVerts); - smoothModifier_do((SmoothModifierData *)md, ob, dm, + smoothModifier_do((SmoothModifierData *)md, ctx->object, mesh_src, vertexCos, numVerts); - if (dm != derivedData) - dm->release(dm); + if (!mesh) { + BKE_id_free(NULL, mesh_src); + } } @@ -243,17 +256,25 @@ ModifierTypeInfo modifierType_Smooth = { eModifierTypeFlag_SupportsEditmode, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ deformVertsEM, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ isDisabled, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_softbody.c b/source/blender/modifiers/intern/MOD_softbody.c index 95aa8f985fa..126c99a2d69 100644 --- a/source/blender/modifiers/intern/MOD_softbody.c +++ b/source/blender/modifiers/intern/MOD_softbody.c @@ -35,27 +35,29 @@ #include <stdio.h> #include "DNA_scene_types.h" +#include "DNA_mesh_types.h" #include "DNA_object_force_types.h" #include "BLI_utildefines.h" -#include "BKE_cdderivedmesh.h" +#include "BKE_layer.h" #include "BKE_particle.h" #include "BKE_softbody.h" -#include "depsgraph_private.h" +#include "DEG_depsgraph.h" #include "DEG_depsgraph_build.h" +#include "DEG_depsgraph_query.h" #include "MOD_modifiertypes.h" static void deformVerts( - ModifierData *md, Object *ob, - DerivedMesh *UNUSED(derivedData), + ModifierData *UNUSED(md), const ModifierEvalContext *ctx, + Mesh *UNUSED(derivedData), float (*vertexCos)[3], - int numVerts, - ModifierApplyFlag UNUSED(flag)) + int numVerts) { - sbObjectStep(md->scene, ob, (float)md->scene->r.cfra, vertexCos, numVerts); + Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); + sbObjectStep(ctx->depsgraph, scene, ctx->object, DEG_get_ctime(ctx->depsgraph), vertexCos, numVerts); } static bool dependsOnTime(ModifierData *UNUSED(md)) @@ -63,25 +65,11 @@ static bool dependsOnTime(ModifierData *UNUSED(md)) return true; } -static void updateDepgraph(ModifierData *UNUSED(md), const ModifierUpdateDepsgraphContext *ctx) -{ - if (ctx->object->soft) { -#ifdef WITH_LEGACY_DEPSGRAPH - /* Actual code uses ccd_build_deflector_hash */ - dag_add_collision_relations(ctx->forest, ctx->scene, ctx->object, ctx->obNode, ctx->object->soft->collision_group, ctx->object->lay, eModifierType_Collision, NULL, false, "Softbody Collision"); - - dag_add_forcefield_relations(ctx->forest, ctx->scene, ctx->object, ctx->obNode, ctx->object->soft->effector_weights, true, 0, "Softbody Field"); -#else - (void)ctx; -#endif - } -} - static void updateDepsgraph(ModifierData *UNUSED(md), const ModifierUpdateDepsgraphContext *ctx) { if (ctx->object->soft) { /* Actual code uses ccd_build_deflector_hash */ - DEG_add_collision_relations(ctx->node, ctx->scene, ctx->object, ctx->object->soft->collision_group, ctx->object->lay, eModifierType_Collision, NULL, false, "Softbody Collision"); + DEG_add_collision_relations(ctx->node, ctx->scene, ctx->object, ctx->object->soft->collision_group, eModifierType_Collision, NULL, false, "Softbody Collision"); DEG_add_forcefield_relations(ctx->node, ctx->scene, ctx->object, ctx->object->soft->effector_weights, true, 0, "Softbody Field"); } @@ -98,17 +86,25 @@ ModifierTypeInfo modifierType_Softbody = { eModifierTypeFlag_Single, /* copyData */ NULL, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ NULL, /* requiredDataMask */ NULL, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ dependsOnTime, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c index 572898c1982..180c25dcd84 100644 --- a/source/blender/modifiers/intern/MOD_solidify.c +++ b/source/blender/modifiers/intern/MOD_solidify.c @@ -40,7 +40,6 @@ #include "BLI_bitmap.h" #include "BLI_math.h" -#include "BKE_cdderivedmesh.h" #include "BKE_mesh.h" #include "BKE_particle.h" #include "BKE_deform.h" @@ -73,7 +72,7 @@ BLI_INLINE bool edgeref_is_init(const EdgeFaceRef *edge_ref) * \param face_nors Precalculated face normals. * \param r_vert_nors Return vert normals. */ -static void dm_calc_normal(DerivedMesh *dm, float (*face_nors)[3], float (*r_vert_nors)[3]) +static void mesh_calc_hq_normal(Mesh *mesh, float (*face_nors)[3], float (*r_vert_nors)[3]) { int i, numVerts, numEdges, numFaces; MPoly *mpoly, *mp; @@ -81,13 +80,13 @@ static void dm_calc_normal(DerivedMesh *dm, float (*face_nors)[3], float (*r_ver MEdge *medge, *ed; MVert *mvert, *mv; - numVerts = dm->getNumVerts(dm); - numEdges = dm->getNumEdges(dm); - numFaces = dm->getNumPolys(dm); - mpoly = dm->getPolyArray(dm); - medge = dm->getEdgeArray(dm); - mvert = dm->getVertArray(dm); - mloop = dm->getLoopArray(dm); + numVerts = mesh->totvert; + numEdges = mesh->totedge; + numFaces = mesh->totface; + mpoly = mesh->mpoly; + medge = mesh->medge; + mvert = mesh->mvert; + mloop = mesh->mloop; /* we don't want to overwrite any referenced layers */ @@ -195,26 +194,25 @@ BLI_INLINE void madd_v3v3short_fl(float r[3], const short a[3], const float f) r[2] += (float)a[2] * f; } -static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, - DerivedMesh *dm, - ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier( + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *mesh) { - DerivedMesh *result; + Mesh *result; const SolidifyModifierData *smd = (SolidifyModifierData *) md; MVert *mv, *mvert, *orig_mvert; MEdge *ed, *medge, *orig_medge; MLoop *ml, *mloop, *orig_mloop; MPoly *mp, *mpoly, *orig_mpoly; - const unsigned int numVerts = (unsigned int)dm->getNumVerts(dm); - const unsigned int numEdges = (unsigned int)dm->getNumEdges(dm); - const unsigned int numFaces = (unsigned int)dm->getNumPolys(dm); - const unsigned int numLoops = (unsigned int)dm->getNumLoops(dm); + const unsigned int numVerts = (unsigned int)mesh->totvert; + const unsigned int numEdges = (unsigned int)mesh->totedge; + const unsigned int numFaces = (unsigned int)mesh->totpoly; + const unsigned int numLoops = (unsigned int)mesh->totloop; unsigned int newLoops = 0, newFaces = 0, newEdges = 0, newVerts = 0, rimVerts = 0; /* only use material offsets if we have 2 or more materials */ - const short mat_nr_max = ob->totcol > 1 ? ob->totcol - 1 : 0; + const short mat_nr_max = ctx->object->totcol > 1 ? ctx->object->totcol - 1 : 0; const short mat_ofs = mat_nr_max ? smd->mat_ofs : 0; const short mat_ofs_rim = mat_nr_max ? smd->mat_ofs_rim : 0; @@ -252,12 +250,12 @@ static DerivedMesh *applyModifier( /* array size is doubled in case of using a shell */ const unsigned int stride = do_shell ? 2 : 1; - modifier_get_vgroup(ob, dm, smd->defgrp_name, &dvert, &defgrp_index); + modifier_get_vgroup_mesh(ctx->object, mesh, smd->defgrp_name, &dvert, &defgrp_index); - orig_mvert = dm->getVertArray(dm); - orig_medge = dm->getEdgeArray(dm); - orig_mloop = dm->getLoopArray(dm); - orig_mpoly = dm->getPolyArray(dm); + orig_mvert = mesh->mvert; + orig_medge = mesh->medge; + orig_mloop = mesh->mloop; + orig_mpoly = mesh->mpoly; if (need_face_normals) { /* calculate only face normals */ @@ -358,49 +356,50 @@ static DerivedMesh *applyModifier( if (smd->flag & MOD_SOLIDIFY_NORMAL_CALC) { vert_nors = MEM_calloc_arrayN(numVerts, 3 * sizeof(float), "mod_solid_vno_hq"); - dm_calc_normal(dm, face_nors, vert_nors); + mesh_calc_hq_normal(mesh, face_nors, vert_nors); } - result = CDDM_from_template(dm, - (int)((numVerts * stride) + newVerts), - (int)((numEdges * stride) + newEdges + rimVerts), 0, - (int)((numLoops * stride) + newLoops), - (int)((numFaces * stride) + newFaces)); + result = BKE_mesh_new_nomain_from_template( + mesh, + (int)((numVerts * stride) + newVerts), + (int)((numEdges * stride) + newEdges + rimVerts), 0, + (int)((numLoops * stride) + newLoops), + (int)((numFaces * stride) + newFaces)); - mpoly = CDDM_get_polys(result); - mloop = CDDM_get_loops(result); - medge = CDDM_get_edges(result); - mvert = CDDM_get_verts(result); + mpoly = result->mpoly; + mloop = result->mloop; + medge = result->medge; + mvert = result->mvert; if (do_shell) { - DM_copy_vert_data(dm, result, 0, 0, (int)numVerts); - DM_copy_vert_data(dm, result, 0, (int)numVerts, (int)numVerts); + CustomData_copy_data(&mesh->vdata, &result->vdata, 0, 0, (int)numVerts); + CustomData_copy_data(&mesh->vdata, &result->vdata, 0, (int)numVerts, (int)numVerts); - DM_copy_edge_data(dm, result, 0, 0, (int)numEdges); - DM_copy_edge_data(dm, result, 0, (int)numEdges, (int)numEdges); + CustomData_copy_data(&mesh->edata, &result->edata, 0, 0, (int)numEdges); + CustomData_copy_data(&mesh->edata, &result->edata, 0, (int)numEdges, (int)numEdges); - DM_copy_loop_data(dm, result, 0, 0, (int)numLoops); - DM_copy_loop_data(dm, result, 0, (int)numLoops, (int)numLoops); + CustomData_copy_data(&mesh->ldata, &result->ldata, 0, 0, (int)numLoops); + CustomData_copy_data(&mesh->ldata, &result->ldata, 0, (int)numLoops, (int)numLoops); - DM_copy_poly_data(dm, result, 0, 0, (int)numFaces); - DM_copy_poly_data(dm, result, 0, (int)numFaces, (int)numFaces); + CustomData_copy_data(&mesh->pdata, &result->pdata, 0, 0, (int)numFaces); + CustomData_copy_data(&mesh->pdata, &result->pdata, 0, (int)numFaces, (int)numFaces); } else { int i, j; - DM_copy_vert_data(dm, result, 0, 0, (int)numVerts); + CustomData_copy_data(&mesh->vdata, &result->vdata, 0, 0, (int)numVerts); for (i = 0, j = (int)numVerts; i < numVerts; i++) { if (old_vert_arr[i] != INVALID_UNUSED) { - DM_copy_vert_data(dm, result, i, j, 1); + CustomData_copy_data(&mesh->vdata, &result->vdata, i, j, 1); j++; } } - DM_copy_edge_data(dm, result, 0, 0, (int)numEdges); + CustomData_copy_data(&mesh->edata, &result->edata, 0, 0, (int)numEdges); for (i = 0, j = (int)numEdges; i < numEdges; i++) { if (!ELEM(edge_users[i], INVALID_UNUSED, INVALID_PAIR)) { MEdge *ed_src, *ed_dst; - DM_copy_edge_data(dm, result, i, j, 1); + CustomData_copy_data(&mesh->edata, &result->edata, i, j, 1); ed_src = &medge[i]; ed_dst = &medge[j]; @@ -411,8 +410,8 @@ static DerivedMesh *applyModifier( } /* will be created later */ - DM_copy_loop_data(dm, result, 0, 0, (int)numLoops); - DM_copy_poly_data(dm, result, 0, 0, (int)numFaces); + CustomData_copy_data(&mesh->ldata, &result->ldata, 0, 0, (int)numLoops); + CustomData_copy_data(&mesh->pdata, &result->pdata, 0, 0, (int)numFaces); } #undef INVALID_UNUSED @@ -445,7 +444,7 @@ static DerivedMesh *applyModifier( unsigned int i; mp = mpoly + numFaces; - for (i = 0; i < dm->numPolyData; i++, mp++) { + for (i = 0; i < mesh->totpoly; i++, mp++) { const int loop_end = mp->totloop - 1; MLoop *ml2; unsigned int e; @@ -453,19 +452,19 @@ static DerivedMesh *applyModifier( /* reverses the loop direction (MLoop.v as well as custom-data) * MLoop.e also needs to be corrected too, done in a separate loop below. */ - ml2 = mloop + mp->loopstart + dm->numLoopData; + ml2 = mloop + mp->loopstart + mesh->totloop; #if 0 for (j = 0; j < mp->totloop; j++) { - CustomData_copy_data(&dm->loopData, &result->loopData, mp->loopstart + j, - mp->loopstart + (loop_end - j) + dm->numLoopData, 1); + CustomData_copy_data(&mesh->ldata, &result->ldata, mp->loopstart + j, + mp->loopstart + (loop_end - j) + mesh->totloop, 1); } #else /* slightly more involved, keep the first vertex the same for the copy, * ensures the diagonals in the new face match the original. */ j = 0; for (int j_prev = loop_end; j < mp->totloop; j_prev = j++) { - CustomData_copy_data(&dm->loopData, &result->loopData, mp->loopstart + j, - mp->loopstart + (loop_end - j_prev) + dm->numLoopData, 1); + CustomData_copy_data(&mesh->ldata, &result->ldata, mp->loopstart + j, + mp->loopstart + (loop_end - j_prev) + mesh->totloop, 1); } #endif @@ -480,7 +479,7 @@ static DerivedMesh *applyModifier( } ml2[loop_end].e = e; - mp->loopstart += dm->numLoopData; + mp->loopstart += mesh->totloop; for (j = 0; j < mp->totloop; j++) { ml2[j].e += numEdges; @@ -727,8 +726,8 @@ static DerivedMesh *applyModifier( MEM_freeN(vert_nors); /* must recalculate normals with vgroups since they can displace unevenly [#26888] */ - if ((dm->dirty & DM_DIRTY_NORMALS) || (smd->flag & MOD_SOLIDIFY_RIM) || dvert) { - result->dirty |= DM_DIRTY_NORMALS; + if ((mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL) || (smd->flag & MOD_SOLIDIFY_RIM) || dvert) { + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; } else if (do_shell) { unsigned int i; @@ -754,7 +753,9 @@ static DerivedMesh *applyModifier( #define SOLIDIFY_SIDE_NORMALS #ifdef SOLIDIFY_SIDE_NORMALS - const bool do_side_normals = !(result->dirty & DM_DIRTY_NORMALS); + /* Note that, due to the code setting cd_dirty_vert a few lines above, + * do_side_normals is always false. - Sybren */ + const bool do_side_normals = !(result->runtime.cd_dirty_vert & CD_MASK_NORMAL); /* annoying to allocate these since we only need the edge verts, */ float (*edge_vert_nos)[3] = do_side_normals ? MEM_calloc_arrayN(numVerts, 3 * sizeof(float), __func__) : NULL; float nor[3]; @@ -772,7 +773,8 @@ static DerivedMesh *applyModifier( } /* add faces & edges */ - origindex_edge = result->getEdgeDataArray(result, CD_ORIGINDEX); + origindex_edge = CustomData_get_layer(&result->edata, CD_ORIGINDEX); + BLI_assert(origindex_edge != NULL); ed = &medge[(numEdges * stride) + newEdges]; /* start after copied edges */ orig_ed = &origindex_edge[(numEdges * stride) + newEdges]; for (i = 0; i < rimVerts; i++, ed++, orig_ed++) { @@ -808,7 +810,7 @@ static DerivedMesh *applyModifier( ed = medge + eidx; /* copy most of the face settings */ - DM_copy_poly_data(dm, result, (int)fidx, (int)((numFaces * stride) + i), 1); + CustomData_copy_data(&mesh->pdata, &result->pdata, (int)fidx, (int)((numFaces * stride) + i), 1); mp->loopstart = (int)(j + (numLoops * stride)); mp->flag = mpoly[fidx].flag; @@ -820,10 +822,10 @@ static DerivedMesh *applyModifier( mp->totloop = 4; - CustomData_copy_data(&dm->loopData, &result->loopData, k2, (int)((numLoops * stride) + j + 0), 1); - CustomData_copy_data(&dm->loopData, &result->loopData, k1, (int)((numLoops * stride) + j + 1), 1); - CustomData_copy_data(&dm->loopData, &result->loopData, k1, (int)((numLoops * stride) + j + 2), 1); - CustomData_copy_data(&dm->loopData, &result->loopData, k2, (int)((numLoops * stride) + j + 3), 1); + CustomData_copy_data(&mesh->ldata, &result->ldata, k2, (int)((numLoops * stride) + j + 0), 1); + CustomData_copy_data(&mesh->ldata, &result->ldata, k1, (int)((numLoops * stride) + j + 1), 1); + CustomData_copy_data(&mesh->ldata, &result->ldata, k1, (int)((numLoops * stride) + j + 2), 1); + CustomData_copy_data(&mesh->ldata, &result->ldata, k2, (int)((numLoops * stride) + j + 3), 1); if (flip == false) { ml[j].v = ed->v1; @@ -898,6 +900,7 @@ static DerivedMesh *applyModifier( int k; /* note, only the first vertex (lower half of the index) is calculated */ + BLI_assert(ed->v1 < numVerts); normalize_v3_v3(nor_cpy, edge_vert_nos[ed_orig->v1]); for (k = 0; k < 2; k++) { /* loop over both verts of the edge */ @@ -955,17 +958,25 @@ ModifierTypeInfo modifierType_Solidify = { eModifierTypeFlag_EnableInEditmode, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, /* dependsOnNormals */ dependsOnNormals, diff --git a/source/blender/modifiers/intern/MOD_subsurf.c b/source/blender/modifiers/intern/MOD_subsurf.c index 18f9d0dc1b9..63c6f16449d 100644 --- a/source/blender/modifiers/intern/MOD_subsurf.c +++ b/source/blender/modifiers/intern/MOD_subsurf.c @@ -46,10 +46,12 @@ #include "BKE_cdderivedmesh.h" -#include "BKE_depsgraph.h" #include "BKE_scene.h" #include "BKE_subsurf.h" +#include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" + #include "MOD_modifiertypes.h" #include "intern/CCGSubSurf.h" @@ -89,27 +91,27 @@ static void freeData(ModifierData *md) } } -static bool isDisabled(ModifierData *md, int useRenderParams) +static bool isDisabled(const Scene *scene, ModifierData *md, int useRenderParams) { SubsurfModifierData *smd = (SubsurfModifierData *) md; int levels = (useRenderParams) ? smd->renderLevels : smd->levels; - return get_render_subsurf_level(&md->scene->r, levels, useRenderParams != 0) == 0; + return get_render_subsurf_level(&scene->r, levels, useRenderParams != 0) == 0; } static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, - ModifierApplyFlag flag) + ModifierData *md, const ModifierEvalContext *ctx, + DerivedMesh *derivedData) { SubsurfModifierData *smd = (SubsurfModifierData *) md; + struct Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); SubsurfFlags subsurf_flags = 0; DerivedMesh *result; - const bool useRenderParams = (flag & MOD_APPLY_RENDER) != 0; - const bool isFinalCalc = (flag & MOD_APPLY_USECACHE) != 0; + const bool useRenderParams = (ctx->flag & MOD_APPLY_RENDER) != 0; + const bool isFinalCalc = (ctx->flag & MOD_APPLY_USECACHE) != 0; #ifdef WITH_OPENSUBDIV - const bool allow_gpu = (flag & MOD_APPLY_ALLOW_GPU) != 0; + const bool allow_gpu = (ctx->flag & MOD_APPLY_ALLOW_GPU) != 0; #endif bool do_cddm_convert = useRenderParams || !isFinalCalc; @@ -117,7 +119,7 @@ static DerivedMesh *applyModifier( subsurf_flags |= SUBSURF_USE_RENDER_PARAMS; if (isFinalCalc) subsurf_flags |= SUBSURF_IS_FINAL_CALC; - if (ob->mode & OB_MODE_EDIT) + if (ctx->object->mode & OB_MODE_EDIT) subsurf_flags |= SUBSURF_IN_EDIT_MODE; #ifdef WITH_OPENSUBDIV @@ -132,10 +134,10 @@ static DerivedMesh *applyModifier( if (U.opensubdiv_compute_type == USER_OPENSUBDIV_COMPUTE_NONE) { modifier_setError(md, "OpenSubdiv is disabled in User Preferences"); } - else if ((ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT)) != 0) { + else if ((ctx->object->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT)) != 0) { modifier_setError(md, "OpenSubdiv is not supported in paint modes"); } - else if ((DAG_get_eval_flags_for_object(md->scene, ob) & DAG_EVAL_NEED_CPU) == 0) { + else if ((DEG_get_eval_flags_for_id(ctx->depsgraph, &ctx->object->id) & DAG_EVAL_NEED_CPU) == 0) { subsurf_flags |= SUBSURF_USE_GPU_BACKEND; do_cddm_convert = false; } @@ -145,36 +147,40 @@ static DerivedMesh *applyModifier( } #endif - result = subsurf_make_derived_from_derived(derivedData, smd, NULL, subsurf_flags); + result = subsurf_make_derived_from_derived(derivedData, smd, scene, NULL, subsurf_flags); result->cd_flag = derivedData->cd_flag; - if (do_cddm_convert) { + { DerivedMesh *cddm = CDDM_copy(result); result->release(result); result = cddm; } +#ifndef WITH_OPESUBDIV + (void) do_cddm_convert; +#endif + return result; } static DerivedMesh *applyModifierEM( - ModifierData *md, Object *UNUSED(ob), + ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *UNUSED(editData), - DerivedMesh *derivedData, - ModifierApplyFlag flag) + DerivedMesh *derivedData) { SubsurfModifierData *smd = (SubsurfModifierData *) md; + struct Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); DerivedMesh *result; /* 'orco' using editmode flags would cause cache to be used twice in editbmesh_calc_modifiers */ - SubsurfFlags ss_flags = (flag & MOD_APPLY_ORCO) ? 0 : (SUBSURF_FOR_EDIT_MODE | SUBSURF_IN_EDIT_MODE); + SubsurfFlags ss_flags = (ctx->flag & MOD_APPLY_ORCO) ? 0 : (SUBSURF_FOR_EDIT_MODE | SUBSURF_IN_EDIT_MODE); #ifdef WITH_OPENSUBDIV - const bool allow_gpu = (flag & MOD_APPLY_ALLOW_GPU) != 0; + const bool allow_gpu = (ctx->flag & MOD_APPLY_ALLOW_GPU) != 0; if (md->next == NULL && allow_gpu && smd->use_opensubdiv) { modifier_setError(md, "OpenSubdiv is not supported in edit mode"); } #endif - result = subsurf_make_derived_from_derived(derivedData, smd, NULL, ss_flags); + result = subsurf_make_derived_from_derived(derivedData, smd, scene, NULL, ss_flags); return result; } @@ -204,17 +210,25 @@ ModifierTypeInfo modifierType_Subsurf = { eModifierTypeFlag_AcceptsCVs, /* copyData */ copyData, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ applyModifier, + /* applyModifierEM_DM */applyModifierEM, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, - /* applyModifier */ applyModifier, - /* applyModifierEM */ applyModifierEM, + /* applyModifier */ NULL, + /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ NULL, /* freeData */ freeData, /* isDisabled */ isDisabled, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, /* dependsOnNormals */ dependsOnNormals, diff --git a/source/blender/modifiers/intern/MOD_surface.c b/source/blender/modifiers/intern/MOD_surface.c index a64e05ffe1e..d6e78c6f19b 100644 --- a/source/blender/modifiers/intern/MOD_surface.c +++ b/source/blender/modifiers/intern/MOD_surface.c @@ -35,13 +35,18 @@ #include "DNA_scene_types.h" #include "DNA_object_types.h" +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "BLI_math.h" -#include "BLI_utildefines.h" +#include "BKE_bvhutils.h" +#include "BKE_library.h" +#include "BKE_mesh.h" +#include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" -#include "BKE_cdderivedmesh.h" +#include "BLI_math.h" +#include "BLI_utildefines.h" #include "MOD_modifiertypes.h" #include "MOD_util.h" @@ -66,9 +71,9 @@ static void freeData(ModifierData *md) MEM_SAFE_FREE(surmd->bvhtree); } - if (surmd->dm) { - surmd->dm->release(surmd->dm); - surmd->dm = NULL; + if (surmd->mesh) { + BKE_id_free(NULL, surmd->mesh); + surmd->mesh = NULL; } MEM_SAFE_FREE(surmd->x); @@ -83,41 +88,51 @@ static bool dependsOnTime(ModifierData *UNUSED(md)) } static void deformVerts( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *mesh, float (*vertexCos)[3], - int UNUSED(numVerts), - ModifierApplyFlag UNUSED(flag)) + int UNUSED(numVerts)) { SurfaceModifierData *surmd = (SurfaceModifierData *) md; + const int cfra = (int)DEG_get_ctime(ctx->depsgraph); - if (surmd->dm) - surmd->dm->release(surmd->dm); + if (surmd->mesh) { + BKE_id_free(NULL, surmd->mesh); + } - /* if possible use/create DerivedMesh */ - if (derivedData) surmd->dm = CDDM_copy(derivedData); - else surmd->dm = get_dm(ob, NULL, NULL, NULL, false, false); + if (mesh) { + /* Not possible to use get_mesh() in this case as we'll modify its vertices + * and get_mesh() would return 'mesh' directly. */ + BKE_id_copy_ex( + NULL, (ID *)mesh, (ID **)&surmd->mesh, + LIB_ID_CREATE_NO_MAIN | + LIB_ID_CREATE_NO_USER_REFCOUNT | + LIB_ID_CREATE_NO_DEG_TAG | + LIB_ID_COPY_NO_PREVIEW, + false); + } + else surmd->mesh = get_mesh(ctx->object, NULL, NULL, NULL, false, false); - if (!ob->pd) { + if (!ctx->object->pd) { printf("SurfaceModifier deformVerts: Should not happen!\n"); return; } - if (surmd->dm) { + if (surmd->mesh) { unsigned int numverts = 0, i = 0; int init = 0; float *vec; MVert *x, *v; - CDDM_apply_vert_coords(surmd->dm, vertexCos); - CDDM_calc_normals(surmd->dm); + BKE_mesh_apply_vert_coords(surmd->mesh, vertexCos); + BKE_mesh_calc_normals(surmd->mesh); - numverts = surmd->dm->getNumVerts(surmd->dm); + numverts = surmd->mesh->totvert; if (numverts != surmd->numverts || surmd->x == NULL || surmd->v == NULL || - md->scene->r.cfra != surmd->cfra + 1) + cfra != surmd->cfra + 1) { if (surmd->x) { MEM_freeN(surmd->x); @@ -138,8 +153,8 @@ static void deformVerts( /* convert to global coordinates and calculate velocity */ for (i = 0, x = surmd->x, v = surmd->v; i < numverts; i++, x++, v++) { - vec = CDDM_get_vert(surmd->dm, i)->co; - mul_m4_v3(ob->obmat, vec); + vec = surmd->mesh->mvert[i].co; + mul_m4_v3(ctx->object->obmat, vec); if (init) v->co[0] = v->co[1] = v->co[2] = 0.0f; @@ -149,17 +164,17 @@ static void deformVerts( copy_v3_v3(x->co, vec); } - surmd->cfra = md->scene->r.cfra; + surmd->cfra = cfra; if (surmd->bvhtree) free_bvhtree_from_mesh(surmd->bvhtree); else surmd->bvhtree = MEM_callocN(sizeof(BVHTreeFromMesh), "BVHTreeFromMesh"); - if (surmd->dm->getNumPolys(surmd->dm)) - bvhtree_from_mesh_get(surmd->bvhtree, surmd->dm, BVHTREE_FROM_LOOPTRI, 2); + if (surmd->mesh->totpoly) + BKE_bvhtree_from_mesh_get(surmd->bvhtree, surmd->mesh, BVHTREE_FROM_LOOPTRI, 2); else - bvhtree_from_mesh_get(surmd->bvhtree, surmd->dm, BVHTREE_FROM_EDGES, 2); + BKE_bvhtree_from_mesh_get(surmd->bvhtree, surmd->mesh, BVHTREE_FROM_EDGES, 2); } } @@ -174,17 +189,25 @@ ModifierTypeInfo modifierType_Surface = { eModifierTypeFlag_NoUserAdd, /* copyData */ NULL, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ NULL, /* freeData */ freeData, /* isDisabled */ NULL, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ dependsOnTime, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c index 95347128ef9..a3ab2d74602 100644 --- a/source/blender/modifiers/intern/MOD_surfacedeform.c +++ b/source/blender/modifiers/intern/MOD_surfacedeform.c @@ -1,3 +1,5 @@ +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -6,12 +8,14 @@ #include "BLI_math_geom.h" #include "BLI_task.h" -#include "BKE_cdderivedmesh.h" +#include "BKE_bvhutils.h" +#include "BKE_mesh_runtime.h" #include "BKE_editmesh.h" +#include "BKE_library.h" #include "BKE_library_query.h" #include "BKE_modifier.h" -#include "depsgraph_private.h" +#include "DEG_depsgraph.h" #include "MEM_guardedalloc.h" @@ -167,17 +171,6 @@ static void foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk, walk(userData, ob, &smd->target, IDWALK_NOP); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md; - - if (smd->target) { - DagNode *curNode = dag_get_node(ctx->forest, smd->target); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, DAG_RL_DATA_DATA, "Surface Deform Modifier"); - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md; @@ -918,14 +911,14 @@ static void bindVert( static bool surfacedeformBind( SurfaceDeformModifierData *smd, float (*vertexCos)[3], - unsigned int numverts, unsigned int tnumpoly, unsigned int tnumverts, DerivedMesh *tdm) + unsigned int numverts, unsigned int tnumpoly, unsigned int tnumverts, Mesh *target) { BVHTreeFromMesh treeData = {NULL}; - const MVert *mvert = tdm->getVertArray(tdm); - const MPoly *mpoly = tdm->getPolyArray(tdm); - const MEdge *medge = tdm->getEdgeArray(tdm); - const MLoop *mloop = tdm->getLoopArray(tdm); - unsigned int tnumedges = tdm->getNumEdges(tdm); + const MVert *mvert = target->mvert; + const MPoly *mpoly = target->mpoly; + const MEdge *medge = target->medge; + const MLoop *mloop = target->mloop; + unsigned int tnumedges = target->totedge; int adj_result; SDefAdjacencyArray *vert_edges; SDefAdjacency *adj_array; @@ -959,7 +952,7 @@ static bool surfacedeformBind( return false; } - bvhtree_from_mesh_get(&treeData, tdm, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&treeData, target, BVHTREE_FROM_LOOPTRI, 2); if (treeData.tree == NULL) { modifier_setError((ModifierData *)smd, "Out of memory"); freeAdjacencyMap(vert_edges, adj_array, edge_polys); @@ -988,7 +981,7 @@ static bool surfacedeformBind( .mpoly = mpoly, .medge = medge, .mloop = mloop, - .looptri = tdm->getLoopTriArray(tdm), + .looptri = BKE_mesh_runtime_looptri_ensure(target), .targetCos = MEM_malloc_arrayN(tnumverts, sizeof(float[3]), "SDefTargetBindVertArray"), .bind_verts = smd->verts, .vertexCos = vertexCos, @@ -1105,10 +1098,14 @@ static void deformVert( } } -static void surfacedeformModifier_do(ModifierData *md, float (*vertexCos)[3], unsigned int numverts, Object *ob) +static void surfacedeformModifier_do( + ModifierData *md, + const ModifierEvalContext *UNUSED(ctx), + float (*vertexCos)[3], unsigned int numverts, Object *ob) { SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md; - DerivedMesh *tdm; + bool free_target; + Mesh *target; unsigned int tnumverts, tnumpoly; /* Exit function if bind flag is not set (free bind data if any) */ @@ -1117,22 +1114,14 @@ static void surfacedeformModifier_do(ModifierData *md, float (*vertexCos)[3], un return; } - /* Handle target mesh both in and out of edit mode */ - if (smd->target == md->scene->obedit) { - BMEditMesh *em = BKE_editmesh_from_object(smd->target); - tdm = em->derivedFinal; - } - else { - tdm = smd->target->derivedFinal; - } - - if (!tdm) { + target = BKE_modifier_get_evaluated_mesh_from_evaluated_object(smd->target, &free_target); + if (!target) { modifier_setError(md, "No valid target mesh"); return; } - tnumverts = tdm->getNumVerts(tdm); - tnumpoly = tdm->getNumPolys(tdm); + tnumverts = target->totvert; + tnumpoly = target->totpoly; /* If not bound, execute bind */ if (!(smd->verts)) { @@ -1141,7 +1130,7 @@ static void surfacedeformModifier_do(ModifierData *md, float (*vertexCos)[3], un invert_m4_m4(tmp_mat, ob->obmat); mul_m4_m4m4(smd->mat, tmp_mat, smd->target->obmat); - if (!surfacedeformBind(smd, vertexCos, numverts, tnumpoly, tnumverts, tdm)) { + if (!surfacedeformBind(smd, vertexCos, numverts, tnumpoly, tnumverts, target)) { smd->flags &= ~MOD_SDEF_BIND; return; } @@ -1150,10 +1139,12 @@ static void surfacedeformModifier_do(ModifierData *md, float (*vertexCos)[3], un /* Poly count checks */ if (smd->numverts != numverts) { modifier_setError(md, "Verts changed from %u to %u", smd->numverts, numverts); + if (free_target) BKE_id_free(NULL, target); return; } else if (smd->numpoly != tnumpoly) { modifier_setError(md, "Target polygons changed from %u to %u", smd->numpoly, tnumpoly); + if (free_target) BKE_id_free(NULL, target); return; } @@ -1165,8 +1156,7 @@ static void surfacedeformModifier_do(ModifierData *md, float (*vertexCos)[3], un }; if (data.targetCos != NULL) { - bool tdm_vert_alloc; - const MVert * const mvert = DM_get_vert_array(tdm, &tdm_vert_alloc); + const MVert * const mvert = target->mvert; for (int i = 0; i < tnumverts; i++) { mul_v3_m4v3(data.targetCos[i], smd->mat, mvert[i].co); @@ -1180,33 +1170,32 @@ static void surfacedeformModifier_do(ModifierData *md, float (*vertexCos)[3], un deformVert, &settings); - if (tdm_vert_alloc) { - MEM_freeN((void *)mvert); - } - MEM_freeN(data.targetCos); } + + if (target != NULL && free_target) { + BKE_id_free(NULL, target); + } } static void deformVerts( - ModifierData *md, Object *ob, - DerivedMesh *UNUSED(derivedData), - float (*vertexCos)[3], int numVerts, - ModifierApplyFlag UNUSED(flag)) + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *UNUSED(mesh), + float (*vertexCos)[3], int numVerts) { - surfacedeformModifier_do(md, vertexCos, numVerts, ob); + surfacedeformModifier_do(md, ctx, vertexCos, numVerts, ctx->object); } static void deformVertsEM( - ModifierData *md, Object *ob, + ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *UNUSED(editData), - DerivedMesh *UNUSED(derivedData), + Mesh *UNUSED(mesh), float (*vertexCos)[3], int numVerts) { - surfacedeformModifier_do(md, vertexCos, numVerts, ob); + surfacedeformModifier_do(md, ctx, vertexCos, numVerts, ctx->object); } -static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool isDisabled(const Scene *UNUSED(scene), ModifierData *md, int UNUSED(useRenderParams)) { SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md; @@ -1222,17 +1211,25 @@ ModifierTypeInfo modifierType_SurfaceDeform = { eModifierTypeFlag_SupportsEditmode, /* copyData */ copyData, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ deformVertsEM, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ NULL, /* freeData */ freeData, /* isDisabled */ isDisabled, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_triangulate.c b/source/blender/modifiers/intern/MOD_triangulate.c index cc313ba2d0c..d845246e1a1 100644 --- a/source/blender/modifiers/intern/MOD_triangulate.c +++ b/source/blender/modifiers/intern/MOD_triangulate.c @@ -25,40 +25,45 @@ * \ingroup modifiers */ +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "BLI_utildefines.h" -#include "BKE_cdderivedmesh.h" #include "BKE_modifier.h" +#include "BKE_mesh.h" #include "bmesh.h" #include "bmesh_tools.h" #include "MOD_modifiertypes.h" -static DerivedMesh *triangulate_dm(DerivedMesh *dm, const int quad_method, const int ngon_method) +static Mesh *triangulate_mesh(Mesh *mesh, const int quad_method, const int ngon_method) { - DerivedMesh *result; + Mesh *result; BMesh *bm; int total_edges, i; MEdge *me; - bm = DM_to_bmesh(dm, true); + bm = BKE_mesh_to_bmesh_ex( + mesh, + &((struct BMeshCreateParams){0}), + &((struct BMeshFromMeshParams){.calc_face_normal = true,})); BM_mesh_triangulate(bm, quad_method, ngon_method, false, NULL, NULL, NULL); - result = CDDM_from_bmesh(bm, false); + result = BKE_bmesh_to_mesh_nomain(bm, &((struct BMeshToMeshParams){0})); BM_mesh_free(bm); - total_edges = result->getNumEdges(result); - me = CDDM_get_edges(result); + total_edges = result->totedge; + me = result->medge; /* force drawing of all edges (seems to be omitted in CDDM_from_bmesh) */ for (i = 0; i < total_edges; i++, me++) me->flag |= ME_EDGEDRAW | ME_EDGERENDER; - result->dirty |= DM_DIRTY_NORMALS; + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; return result; } @@ -74,16 +79,15 @@ static void initData(ModifierData *md) tmd->ngon_method = MOD_TRIANGULATE_NGON_BEAUTY; } -static DerivedMesh *applyModifier( +static Mesh *applyModifier( ModifierData *md, - Object *UNUSED(ob), - DerivedMesh *dm, - ModifierApplyFlag UNUSED(flag)) + const ModifierEvalContext *UNUSED(ctx), + Mesh *mesh) { TriangulateModifierData *tmd = (TriangulateModifierData *)md; - DerivedMesh *result; - if (!(result = triangulate_dm(dm, tmd->quad_method, tmd->ngon_method))) { - return dm; + Mesh *result; + if (!(result = triangulate_mesh(mesh, tmd->quad_method, tmd->ngon_method))) { + return mesh; } return result; @@ -101,17 +105,25 @@ ModifierTypeInfo modifierType_Triangulate = { eModifierTypeFlag_AcceptsCVs, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ NULL, //requiredDataMask, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c index 3694428d62d..29a3745a7e1 100644 --- a/source/blender/modifiers/intern/MOD_util.c +++ b/source/blender/modifiers/intern/MOD_util.c @@ -34,6 +34,7 @@ #include "DNA_image_types.h" #include "DNA_meshdata_types.h" +#include "DNA_mesh_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -44,24 +45,113 @@ #include "BKE_cdderivedmesh.h" #include "BKE_deform.h" +#include "BKE_editmesh.h" #include "BKE_image.h" #include "BKE_lattice.h" +#include "BKE_library.h" #include "BKE_mesh.h" #include "BKE_modifier.h" +#include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" + #include "MOD_util.h" #include "MOD_modifiertypes.h" #include "MEM_guardedalloc.h" -void modifier_init_texture(const Scene *scene, Tex *tex) +#include "bmesh.h" + +void modifier_init_texture(const Depsgraph *depsgraph, Tex *tex) { if (!tex) return; if (tex->ima && BKE_image_is_animated(tex->ima)) { - BKE_image_user_frame_calc(&tex->iuser, scene->r.cfra, 0); + BKE_image_user_frame_calc(&tex->iuser, DEG_get_ctime(depsgraph), 0); + } +} + +/* TODO to be renamed to get_texture_coords once we are done with moving modifiers to Mesh. */ +/** \param cos may be NULL, in which case we use directly mesh vertices' coordinates. */ +void get_texture_coords_mesh( + MappingInfoModifierData *dmd, + Object *ob, + Mesh *mesh, + float (*cos)[3], + float (*r_texco)[3]) +{ + const int numVerts = mesh->totvert; + int i; + int texmapping = dmd->texmapping; + float mapob_imat[4][4]; + + if (texmapping == MOD_DISP_MAP_OBJECT) { + if (dmd->map_object) + invert_m4_m4(mapob_imat, dmd->map_object->obmat); + else /* if there is no map object, default to local */ + texmapping = MOD_DISP_MAP_LOCAL; + } + + /* UVs need special handling, since they come from faces */ + if (texmapping == MOD_DISP_MAP_UV) { + if (CustomData_has_layer(&mesh->ldata, CD_MLOOPUV)) { + MPoly *mpoly = mesh->mpoly; + MPoly *mp; + MLoop *mloop = mesh->mloop; + BLI_bitmap *done = BLI_BITMAP_NEW(numVerts, __func__); + const int numPolys = mesh->totpoly; + char uvname[MAX_CUSTOMDATA_LAYER_NAME]; + MLoopUV *mloop_uv; + + CustomData_validate_layer_name(&mesh->ldata, CD_MLOOPUV, dmd->uvlayer_name, uvname); + mloop_uv = CustomData_get_layer_named(&mesh->ldata, CD_MLOOPUV, uvname); + + /* verts are given the UV from the first face that uses them */ + for (i = 0, mp = mpoly; i < numPolys; ++i, ++mp) { + unsigned int fidx = mp->totloop - 1; + + do { + unsigned int lidx = mp->loopstart + fidx; + unsigned int vidx = mloop[lidx].v; + + if (!BLI_BITMAP_TEST(done, vidx)) { + /* remap UVs from [0, 1] to [-1, 1] */ + r_texco[vidx][0] = (mloop_uv[lidx].uv[0] * 2.0f) - 1.0f; + r_texco[vidx][1] = (mloop_uv[lidx].uv[1] * 2.0f) - 1.0f; + BLI_BITMAP_ENABLE(done, vidx); + } + + } while (fidx--); + } + + MEM_freeN(done); + return; + } + else { + /* if there are no UVs, default to local */ + texmapping = MOD_DISP_MAP_LOCAL; + } + } + + MVert *mv = mesh->mvert; + for (i = 0; i < numVerts; ++i, ++mv, ++r_texco) { + switch (texmapping) { + case MOD_DISP_MAP_LOCAL: + copy_v3_v3(*r_texco, cos != NULL ? *cos : mv->co); + break; + case MOD_DISP_MAP_GLOBAL: + mul_v3_m4v3(*r_texco, ob->obmat, cos != NULL ? *cos : mv->co); + break; + case MOD_DISP_MAP_OBJECT: + mul_v3_m4v3(*r_texco, ob->obmat, cos != NULL ? *cos : mv->co); + mul_m4_v3(mapob_imat, *r_texco); + break; + } + if (cos != NULL) { + cos++; + } } } @@ -204,6 +294,57 @@ DerivedMesh *get_dm( return dm; } +/* returns a mesh if mesh == NULL, for deforming modifiers that need it */ +Mesh *get_mesh( + Object *ob, struct BMEditMesh *em, Mesh *mesh, + float (*vertexCos)[3], bool use_normals, bool use_orco) +{ + if (mesh) { + /* pass */ + } + else if (ob->type == OB_MESH) { + if (em) { + mesh = BKE_bmesh_to_mesh_nomain(em->bm, &(struct BMeshToMeshParams){0}); + } + else { + /* TODO(sybren): after modifier conversion of DM to Mesh is done, check whether + * we really need a copy here. Maybe the CoW ob->data can be directly used. */ + BKE_id_copy_ex( + NULL, ob->data, (ID **)&mesh, + (LIB_ID_CREATE_NO_MAIN | + LIB_ID_CREATE_NO_USER_REFCOUNT | + LIB_ID_CREATE_NO_DEG_TAG | + LIB_ID_COPY_NO_PREVIEW | + LIB_ID_COPY_CD_REFERENCE), + false); + mesh->runtime.deformed_only = 1; + } + + /* TODO(sybren): after modifier conversion of DM to Mesh is done, check whether + * we really need vertexCos here. */ + if (vertexCos) { + BKE_mesh_apply_vert_coords(mesh, vertexCos); + mesh->runtime.cd_dirty_vert |= CD_MASK_NORMAL; + } + + if (use_orco) { + CustomData_add_layer(&mesh->vdata, CD_ORCO, CD_ASSIGN, BKE_mesh_orco_verts_get(ob), mesh->totvert); + } + } + else if (ELEM(ob->type, OB_FONT, OB_CURVE, OB_SURF)) { + /* TODO(sybren): get evaluated mesh from depsgraph once that's properly generated for curves. */ + mesh = BKE_mesh_new_nomain_from_curve(ob); + } + + if (use_normals) { + if (LIKELY(mesh)) { + BKE_mesh_ensure_normals(mesh); + } + } + + return mesh; +} + /* Get derived mesh for other object, which is used as an operand for the modifier, * i.e. second operand for boolean modifier. */ @@ -231,6 +372,20 @@ void modifier_get_vgroup(Object *ob, DerivedMesh *dm, const char *name, MDeformV } } +/* TODO(sybren): replace the above function with this one, once we got rid of DerivedMesh for modifiers. */ +void modifier_get_vgroup_mesh(Object *ob, struct Mesh *mesh, const char *name, MDeformVert **dvert, int *defgrp_index) +{ + *defgrp_index = defgroup_name_index(ob, name); + *dvert = NULL; + + if (*defgrp_index != -1) { + if (ob->type == OB_LATTICE) + *dvert = BKE_lattice_deform_verts_get(ob); + else if (mesh) + *dvert = mesh->dvert; + } +} + /* only called by BKE_modifier.h/modifier.c */ void modifier_type_init(ModifierTypeInfo *types[]) diff --git a/source/blender/modifiers/intern/MOD_util.h b/source/blender/modifiers/intern/MOD_util.h index 0414b8e6d52..0b3452b22b8 100644 --- a/source/blender/modifiers/intern/MOD_util.h +++ b/source/blender/modifiers/intern/MOD_util.h @@ -34,16 +34,24 @@ #include "DEG_depsgraph_build.h" struct DerivedMesh; +struct Depsgraph; struct MDeformVert; +struct Mesh; struct ModifierData; struct Object; struct Scene; struct Tex; -void modifier_init_texture(const struct Scene *scene, struct Tex *texture); +void modifier_init_texture(const struct Depsgraph *depsgraph, struct Tex *texture); void get_texture_coords( struct MappingInfoModifierData *dmd, struct Object *ob, struct DerivedMesh *dm, float (*co)[3], float (*texco)[3], int numVerts); +void get_texture_coords_mesh( + struct MappingInfoModifierData *dmd, + struct Object *ob, + struct Mesh *mesh, + float (*cos)[3], + float (*r_texco)[3]); void modifier_vgroup_cache(struct ModifierData *md, float (*vertexCos)[3]); struct DerivedMesh *get_cddm( struct Object *ob, struct BMEditMesh *em, struct DerivedMesh *dm, @@ -51,9 +59,16 @@ struct DerivedMesh *get_cddm( struct DerivedMesh *get_dm( struct Object *ob, struct BMEditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3], bool use_normals, bool use_orco); +struct Mesh *get_mesh( + struct Object *ob, struct BMEditMesh *em, struct Mesh *mesh, + float (*vertexCos)[3], bool use_normals, bool use_orco); struct DerivedMesh *get_dm_for_modifier(struct Object *ob, ModifierApplyFlag flag); + void modifier_get_vgroup( struct Object *ob, struct DerivedMesh *dm, const char *name, struct MDeformVert **dvert, int *defgrp_index); +void modifier_get_vgroup_mesh( + struct Object *ob, struct Mesh *mesh, + const char *name, struct MDeformVert **dvert, int *defgrp_index); #endif /* __MOD_UTIL_H__ */ diff --git a/source/blender/modifiers/intern/MOD_uvproject.c b/source/blender/modifiers/intern/MOD_uvproject.c index 1089eb1bea4..9a06d397be6 100644 --- a/source/blender/modifiers/intern/MOD_uvproject.c +++ b/source/blender/modifiers/intern/MOD_uvproject.c @@ -35,6 +35,7 @@ /* UV Project modifier: Generates UVs projected from an object */ +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_camera_types.h" #include "DNA_object_types.h" @@ -47,21 +48,22 @@ #include "BKE_camera.h" #include "BKE_library.h" #include "BKE_library_query.h" +#include "BKE_material.h" #include "BKE_mesh.h" -#include "BKE_DerivedMesh.h" #include "MOD_modifiertypes.h" #include "MEM_guardedalloc.h" -#include "depsgraph_private.h" +#include "DEG_depsgraph.h" #include "DEG_depsgraph_build.h" +#include "DEG_depsgraph_query.h" static void initData(ModifierData *md) { UVProjectModifierData *umd = (UVProjectModifierData *) md; - umd->flags = 0; + umd->num_projectors = 1; umd->aspectx = umd->aspecty = 1.0f; umd->scalex = umd->scaley = 1.0f; @@ -72,7 +74,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED( CustomDataMask dataMask = 0; /* ask for UV coordinates */ - dataMask |= CD_MLOOPUV | CD_MTEXPOLY; + dataMask |= CD_MLOOPUV; return dataMask; } @@ -92,28 +94,13 @@ static void foreachIDLink( ModifierData *md, Object *ob, IDWalkFunc walk, void *userData) { +#if 0 UVProjectModifierData *umd = (UVProjectModifierData *) md; - - walk(userData, ob, (ID **)&umd->image, IDWALK_CB_USER); +#endif foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - UVProjectModifierData *umd = (UVProjectModifierData *) md; - int i; - - for (i = 0; i < umd->num_projectors; ++i) { - if (umd->projectors[i]) { - DagNode *curNode = dag_get_node(ctx->forest, umd->projectors[i]); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "UV Project Modifier"); - } - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { UVProjectModifierData *umd = (UVProjectModifierData *)md; @@ -132,18 +119,15 @@ typedef struct Projector { void *uci; /* optional uv-project info (panorama projection) */ } Projector; -static DerivedMesh *uvprojectModifier_do( +static Mesh *uvprojectModifier_do( UVProjectModifierData *umd, - Object *ob, DerivedMesh *dm) + Object *ob, Mesh *mesh) { float (*coords)[3], (*co)[3]; MLoopUV *mloop_uv; - MTexPoly *mtexpoly, *mt = NULL; int i, numVerts, numPolys, numLoops; - Image *image = umd->image; MPoly *mpoly, *mp; MLoop *mloop; - const bool override_image = (umd->flags & MOD_UVPROJECT_OVERRIDEIMAGE) != 0; Projector projectors[MOD_UVPROJECT_MAXPROJECTORS]; int num_projectors = 0; char uvname[MAX_CUSTOMDATA_LAYER_NAME]; @@ -157,14 +141,14 @@ static DerivedMesh *uvprojectModifier_do( if (umd->projectors[i]) projectors[num_projectors++].ob = umd->projectors[i]; - if (num_projectors == 0) return dm; + if (num_projectors == 0) return mesh; /* make sure there are UV Maps available */ - if (!CustomData_has_layer(&dm->loopData, CD_MLOOPUV)) return dm; + if (!CustomData_has_layer(&mesh->ldata, CD_MLOOPUV)) return mesh; /* make sure we're using an existing layer */ - CustomData_validate_layer_name(&dm->loopData, CD_MLOOPUV, umd->uvlayer_name, uvname); + CustomData_validate_layer_name(&mesh->ldata, CD_MLOOPUV, umd->uvlayer_name, uvname); /* calculate a projection matrix and normal for each projector */ for (i = 0; i < num_projectors; ++i) { @@ -177,7 +161,6 @@ static DerivedMesh *uvprojectModifier_do( projectors[i].uci = NULL; if (projectors[i].ob->type == OB_CAMERA) { - cam = (Camera *)projectors[i].ob->data; if (cam->type == CAM_PANO) { projectors[i].uci = BLI_uvproject_camera_info(projectors[i].ob, NULL, aspx, aspy); @@ -221,22 +204,14 @@ static DerivedMesh *uvprojectModifier_do( mul_mat3_m4_v3(projectors[i].ob->obmat, projectors[i].normal); } - numPolys = dm->getNumPolys(dm); - numLoops = dm->getNumLoops(dm); + numPolys = mesh->totpoly; + numLoops = mesh->totloop; /* make sure we are not modifying the original UV map */ - mloop_uv = CustomData_duplicate_referenced_layer_named(&dm->loopData, + mloop_uv = CustomData_duplicate_referenced_layer_named(&mesh->ldata, CD_MLOOPUV, uvname, numLoops); - /* can be NULL */ - mt = mtexpoly = CustomData_duplicate_referenced_layer_named(&dm->polyData, - CD_MTEXPOLY, uvname, numPolys); - - numVerts = dm->getNumVerts(dm); - - coords = MEM_malloc_arrayN(numVerts, sizeof(*coords), - "uvprojectModifier_do coords"); - dm->getVertCos(dm, coords); + coords = BKE_mesh_vertexCos_get(mesh, &numVerts); /* convert coords to world space */ for (i = 0, co = coords; i < numVerts; ++i, ++co) @@ -247,77 +222,70 @@ static DerivedMesh *uvprojectModifier_do( for (i = 0, co = coords; i < numVerts; ++i, ++co) mul_project_m4_v3(projectors[0].projmat, *co); - mpoly = dm->getPolyArray(dm); - mloop = dm->getLoopArray(dm); - - /* apply coords as UVs, and apply image if tfaces are new */ - for (i = 0, mp = mpoly; i < numPolys; ++i, ++mp, ++mt) { - if (override_image || !image || (mtexpoly == NULL || mt->tpage == image)) { - if (num_projectors == 1) { - if (projectors[0].uci) { - unsigned int fidx = mp->totloop - 1; - do { - unsigned int lidx = mp->loopstart + fidx; - unsigned int vidx = mloop[lidx].v; - BLI_uvproject_from_camera(mloop_uv[lidx].uv, coords[vidx], projectors[0].uci); - } while (fidx--); - } - else { - /* apply transformed coords as UVs */ - unsigned int fidx = mp->totloop - 1; - do { - unsigned int lidx = mp->loopstart + fidx; - unsigned int vidx = mloop[lidx].v; - copy_v2_v2(mloop_uv[lidx].uv, coords[vidx]); - } while (fidx--); - } + mpoly = mesh->mpoly; + mloop = mesh->mloop; + + /* apply coords as UVs */ + for (i = 0, mp = mpoly; i < numPolys; ++i, ++mp) { + if (num_projectors == 1) { + if (projectors[0].uci) { + unsigned int fidx = mp->totloop - 1; + do { + unsigned int lidx = mp->loopstart + fidx; + unsigned int vidx = mloop[lidx].v; + BLI_uvproject_from_camera(mloop_uv[lidx].uv, coords[vidx], projectors[0].uci); + } while (fidx--); } else { - /* multiple projectors, select the closest to face normal direction */ - float face_no[3]; - int j; - Projector *best_projector; - float best_dot; - - /* get the untransformed face normal */ - BKE_mesh_calc_poly_normal_coords(mp, mloop + mp->loopstart, (const float (*)[3])coords, face_no); - - /* find the projector which the face points at most directly - * (projector normal with largest dot product is best) - */ - best_dot = dot_v3v3(projectors[0].normal, face_no); - best_projector = &projectors[0]; - - for (j = 1; j < num_projectors; ++j) { - float tmp_dot = dot_v3v3(projectors[j].normal, - face_no); - if (tmp_dot > best_dot) { - best_dot = tmp_dot; - best_projector = &projectors[j]; - } - } - - if (best_projector->uci) { - unsigned int fidx = mp->totloop - 1; - do { - unsigned int lidx = mp->loopstart + fidx; - unsigned int vidx = mloop[lidx].v; - BLI_uvproject_from_camera(mloop_uv[lidx].uv, coords[vidx], best_projector->uci); - } while (fidx--); - } - else { - unsigned int fidx = mp->totloop - 1; - do { - unsigned int lidx = mp->loopstart + fidx; - unsigned int vidx = mloop[lidx].v; - mul_v2_project_m4_v3(mloop_uv[lidx].uv, best_projector->projmat, coords[vidx]); - } while (fidx--); - } + /* apply transformed coords as UVs */ + unsigned int fidx = mp->totloop - 1; + do { + unsigned int lidx = mp->loopstart + fidx; + unsigned int vidx = mloop[lidx].v; + copy_v2_v2(mloop_uv[lidx].uv, coords[vidx]); + } while (fidx--); } } + else { + /* multiple projectors, select the closest to face normal direction */ + float face_no[3]; + int j; + Projector *best_projector; + float best_dot; + + /* get the untransformed face normal */ + BKE_mesh_calc_poly_normal_coords(mp, mloop + mp->loopstart, (const float (*)[3])coords, face_no); + + /* find the projector which the face points at most directly + * (projector normal with largest dot product is best) + */ + best_dot = dot_v3v3(projectors[0].normal, face_no); + best_projector = &projectors[0]; + + for (j = 1; j < num_projectors; ++j) { + float tmp_dot = dot_v3v3(projectors[j].normal, face_no); + if (tmp_dot > best_dot) { + best_dot = tmp_dot; + best_projector = &projectors[j]; + } + } - if (override_image && mtexpoly) { - mt->tpage = image; + if (best_projector->uci) { + unsigned int fidx = mp->totloop - 1; + do { + unsigned int lidx = mp->loopstart + fidx; + unsigned int vidx = mloop[lidx].v; + BLI_uvproject_from_camera(mloop_uv[lidx].uv, coords[vidx], best_projector->uci); + } while (fidx--); + } + else { + unsigned int fidx = mp->totloop - 1; + do { + unsigned int lidx = mp->loopstart + fidx; + unsigned int vidx = mloop[lidx].v; + mul_v2_project_m4_v3(mloop_uv[lidx].uv, best_projector->projmat, coords[vidx]); + } while (fidx--); + } } } @@ -333,20 +301,19 @@ static DerivedMesh *uvprojectModifier_do( } /* Mark tessellated CD layers as dirty. */ - dm->dirty |= DM_DIRTY_TESS_CDLAYERS; + mesh->runtime.cd_dirty_vert |= CD_MASK_TESSLOOPNORMAL; - return dm; + return mesh; } -static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, - ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier( + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *mesh) { - DerivedMesh *result; + Mesh *result; UVProjectModifierData *umd = (UVProjectModifierData *) md; - result = uvprojectModifier_do(umd, ob, derivedData); + result = uvprojectModifier_do(umd, ctx->object, mesh); return result; } @@ -363,17 +330,25 @@ ModifierTypeInfo modifierType_UVProject = { eModifierTypeFlag_EnableInEditmode, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_uvwarp.c b/source/blender/modifiers/intern/MOD_uvwarp.c index 39c11e34df2..2b2d1709b15 100644 --- a/source/blender/modifiers/intern/MOD_uvwarp.c +++ b/source/blender/modifiers/intern/MOD_uvwarp.c @@ -27,6 +27,7 @@ #include <string.h> +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" @@ -35,13 +36,10 @@ #include "BLI_utildefines.h" #include "BKE_action.h" /* BKE_pose_channel_find_name */ -#include "BKE_cdderivedmesh.h" #include "BKE_deform.h" #include "BKE_library_query.h" #include "BKE_modifier.h" -#include "depsgraph_private.h" - #include "MOD_util.h" @@ -140,10 +138,9 @@ static void uv_warp_compute( } } -static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, - DerivedMesh *dm, - ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier( + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *mesh) { UVWarpModifierData *umd = (UVWarpModifierData *) md; int numPolys, numLoops; @@ -161,12 +158,12 @@ static DerivedMesh *applyModifier( const int axis_v = umd->axis_v; /* make sure there are UV Maps available */ - if (!CustomData_has_layer(&dm->loopData, CD_MLOOPUV)) { - return dm; + if (!CustomData_has_layer(&mesh->ldata, CD_MLOOPUV)) { + return mesh; } else if (ELEM(NULL, umd->object_src, umd->object_dst)) { modifier_setError(md, "From/To objects must be set"); - return dm; + return mesh; } /* make sure anything moving UVs is available */ @@ -192,16 +189,16 @@ static DerivedMesh *applyModifier( } /* make sure we're using an existing layer */ - CustomData_validate_layer_name(&dm->loopData, CD_MLOOPUV, umd->uvlayer_name, uvname); + CustomData_validate_layer_name(&mesh->ldata, CD_MLOOPUV, umd->uvlayer_name, uvname); - numPolys = dm->getNumPolys(dm); - numLoops = dm->getNumLoops(dm); + numPolys = mesh->totpoly; + numLoops = mesh->totloop; - mpoly = dm->getPolyArray(dm); - mloop = dm->getLoopArray(dm); + mpoly = mesh->mpoly; + mloop = mesh->mloop; /* make sure we are not modifying the original UV map */ - mloopuv = CustomData_duplicate_referenced_layer_named(&dm->loopData, CD_MLOOPUV, uvname, numLoops); - modifier_get_vgroup(ob, dm, umd->vgroup_name, &dvert, &defgrp_index); + mloopuv = CustomData_duplicate_referenced_layer_named(&mesh->ldata, CD_MLOOPUV, uvname, numLoops); + modifier_get_vgroup_mesh(ctx->object, mesh, umd->vgroup_name, &dvert, &defgrp_index); UVWarpData data = {.mpoly = mpoly, .mloop = mloop, .mloopuv = mloopuv, .dvert = dvert, .defgrp_index = defgrp_index, @@ -214,9 +211,10 @@ static DerivedMesh *applyModifier( uv_warp_compute, &settings); - dm->dirty |= DM_DIRTY_TESS_CDLAYERS; + /* XXX TODO is this still needed? */ +// me_eval->dirty |= DM_DIRTY_TESS_CDLAYERS; - return dm; + return mesh; } static void foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk, void *userData) @@ -227,28 +225,6 @@ static void foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk, walk(userData, ob, &umd->object_src, IDWALK_CB_NOP); } -static void uv_warp_deps_object_bone( - DagForest *forest, DagNode *obNode, - Object *obj, const char *bonename) -{ - if (obj) { - DagNode *curNode = dag_get_node(forest, obj); - - if (bonename[0]) - dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA | DAG_RL_DATA_DATA, "UVWarp Modifier"); - else - dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA, "UVWarp Modifier"); - } -} - -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - UVWarpModifierData *umd = (UVWarpModifierData *) md; - - uv_warp_deps_object_bone(ctx->forest, ctx->obNode, umd->object_src, umd->bone_src); - uv_warp_deps_object_bone(ctx->forest, ctx->obNode, umd->object_dst, umd->bone_dst); -} - static void uv_warp_deps_object_bone_new( struct DepsNodeHandle *node, Object *object, @@ -278,18 +254,27 @@ ModifierTypeInfo modifierType_UVWarp = { /* flags */ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode | eModifierTypeFlag_EnableInEditmode, + /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ NULL, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_warp.c b/source/blender/modifiers/intern/MOD_warp.c index 3689b1ae724..a6781cccb50 100644 --- a/source/blender/modifiers/intern/MOD_warp.c +++ b/source/blender/modifiers/intern/MOD_warp.c @@ -29,20 +29,24 @@ #include "MEM_guardedalloc.h" -#include "DNA_object_types.h" +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" +#include "DNA_object_types.h" #include "BLI_math.h" #include "BLI_utildefines.h" -#include "BKE_cdderivedmesh.h" +#include "BKE_editmesh.h" +#include "BKE_library.h" #include "BKE_library_query.h" +#include "BKE_mesh.h" #include "BKE_modifier.h" #include "BKE_deform.h" #include "BKE_texture.h" #include "BKE_colortools.h" -#include "depsgraph_private.h" +#include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" #include "RE_shader_ext.h" @@ -105,7 +109,7 @@ static void freeData(ModifierData *md) } -static bool isDisabled(ModifierData *md, int UNUSED(userRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(userRenderParams)) { WarpModifierData *wmd = (WarpModifierData *) md; @@ -135,24 +139,6 @@ static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void walk(userData, ob, md, "texture"); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - WarpModifierData *wmd = (WarpModifierData *) md; - - if (wmd->object_from && wmd->object_to) { - DagNode *fromNode = dag_get_node(ctx->forest, wmd->object_from); - DagNode *toNode = dag_get_node(ctx->forest, wmd->object_to); - - dag_add_relation(ctx->forest, fromNode, ctx->obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Warp Modifier1"); - dag_add_relation(ctx->forest, toNode, ctx->obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Warp Modifier2"); - } - - if ((wmd->texmapping == MOD_DISP_MAP_OBJECT) && wmd->map_object) { - DagNode *curNode = dag_get_node(ctx->forest, wmd->map_object); - dag_add_relation(ctx->forest, curNode, ctx->obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Warp Modifier3"); - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { WarpModifierData *wmd = (WarpModifierData *) md; @@ -166,9 +152,11 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte } static void warpModifier_do( - WarpModifierData *wmd, Object *ob, - DerivedMesh *dm, float (*vertexCos)[3], int numVerts) + WarpModifierData *wmd, const ModifierEvalContext *ctx, + Mesh *mesh, float (*vertexCos)[3], int numVerts) { + Object *ob = ctx->object; + Depsgraph *depsgraph = ctx->depsgraph; float obinv[4][4]; float mat_from[4][4]; float mat_from_inv[4][4]; @@ -190,7 +178,7 @@ static void warpModifier_do( if (!(wmd->object_from && wmd->object_to)) return; - modifier_get_vgroup(ob, dm, wmd->defgrp_name, &dvert, &defgrp_index); + modifier_get_vgroup_mesh(ob, mesh, wmd->defgrp_name, &dvert, &defgrp_index); if (dvert == NULL) { defgrp_index = -1; } @@ -228,9 +216,9 @@ static void warpModifier_do( if (wmd->texture) { tex_co = MEM_malloc_arrayN(numVerts, sizeof(*tex_co), "warpModifier_do tex_co"); - get_texture_coords((MappingInfoModifierData *)wmd, ob, dm, vertexCos, tex_co, numVerts); + get_texture_coords_mesh((MappingInfoModifierData *)wmd, ob, mesh, vertexCos, tex_co); - modifier_init_texture(wmd->modifier.scene, wmd->texture); + modifier_init_texture(depsgraph, wmd->texture); } for (i = 0; i < numVerts; i++) { @@ -284,9 +272,10 @@ static void warpModifier_do( fac *= weight; if (tex_co) { + struct Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); TexResult texres; texres.nor = NULL; - BKE_texture_get_value(wmd->modifier.scene, wmd->texture, tex_co[i], &texres, false); + BKE_texture_get_value(scene, wmd->texture, tex_co[i], &texres, false); fac *= texres.tin; } @@ -316,50 +305,42 @@ static void warpModifier_do( } } - if (tex_co) + if (tex_co) { MEM_freeN(tex_co); - -} - -static int warp_needs_dm(WarpModifierData *wmd) -{ - return wmd->texture || wmd->defgrp_name[0]; + } } static void deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, ModifierApplyFlag UNUSED(flag)) + ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, + float (*vertexCos)[3], int numVerts) { - DerivedMesh *dm = NULL; - int use_dm = warp_needs_dm((WarpModifierData *)md); + Mesh *mesh_src = mesh; - if (use_dm) { - dm = get_cddm(ob, NULL, derivedData, vertexCos, false); + if (mesh_src == NULL) { + mesh_src = ctx->object->data; } - warpModifier_do((WarpModifierData *)md, ob, dm, vertexCos, numVerts); + BLI_assert(mesh_src->totvert == numVerts); - if (use_dm) { - if (dm != derivedData) dm->release(dm); - } + warpModifier_do((WarpModifierData *)md, ctx, mesh_src, vertexCos, numVerts); } static void deformVertsEM( - ModifierData *md, Object *ob, struct BMEditMesh *em, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) + ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *em, + Mesh *mesh, float (*vertexCos)[3], int numVerts) { - DerivedMesh *dm = derivedData; - int use_dm = warp_needs_dm((WarpModifierData *)md); + Mesh *mesh_src = mesh; - if (use_dm) { - if (!derivedData) - dm = CDDM_from_editbmesh(em, false, false); + if (mesh_src == NULL) { + mesh_src = BKE_bmesh_to_mesh_nomain(em->bm, &(struct BMeshToMeshParams){0}); } - deformVerts(md, ob, dm, vertexCos, numVerts, 0); + BLI_assert(mesh_src->totvert == numVerts); + + warpModifier_do((WarpModifierData *)md, ctx, mesh_src, vertexCos, numVerts); - if (use_dm) { - if (!derivedData) dm->release(dm); + if (!mesh) { + BKE_id_free(NULL, mesh_src); } } @@ -373,17 +354,25 @@ ModifierTypeInfo modifierType_Warp = { eModifierTypeFlag_AcceptsLattice | eModifierTypeFlag_SupportsEditmode, /* copyData */ copyData, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ deformVertsEM, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ freeData, /* isDisabled */ isDisabled, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ dependsOnTime, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_wave.c b/source/blender/modifiers/intern/MOD_wave.c index 38123c5e3bb..c1b85336774 100644 --- a/source/blender/modifiers/intern/MOD_wave.c +++ b/source/blender/modifiers/intern/MOD_wave.c @@ -35,28 +35,31 @@ #include "BLI_math.h" +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "DNA_scene_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "BLI_utildefines.h" #include "BKE_deform.h" -#include "BKE_DerivedMesh.h" +#include "BKE_editmesh.h" #include "BKE_library.h" #include "BKE_library_query.h" +#include "BKE_mesh.h" #include "BKE_scene.h" #include "BKE_texture.h" -#include "depsgraph_private.h" - #include "MEM_guardedalloc.h" #include "RE_shader_ext.h" #include "MOD_modifiertypes.h" #include "MOD_util.h" +#include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" + static void initData(ModifierData *md) { WaveModifierData *wmd = (WaveModifierData *) md; // whadya know, moved here from Iraq @@ -111,25 +114,6 @@ static void foreachTexLink( walk(userData, ob, md, "texture"); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - WaveModifierData *wmd = (WaveModifierData *) md; - - if (wmd->objectcenter) { - DagNode *curNode = dag_get_node(ctx->forest, wmd->objectcenter); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, DAG_RL_OB_DATA, - "Wave Modifier"); - } - - if (wmd->map_object) { - DagNode *curNode = dag_get_node(ctx->forest, wmd->map_object); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, DAG_RL_OB_DATA, - "Wave Modifer"); - } -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { WaveModifierData *wmd = (WaveModifierData *)md; @@ -160,14 +144,15 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) static void waveModifier_do( WaveModifierData *md, - Scene *scene, Object *ob, DerivedMesh *dm, + Depsgraph *depsgraph, + Object *ob, Mesh *mesh, float (*vertexCos)[3], int numVerts) { WaveModifierData *wmd = (WaveModifierData *) md; MVert *mvert = NULL; MDeformVert *dvert; int defgrp_index; - float ctime = BKE_scene_frame_get(scene); + float ctime = DEG_get_ctime(depsgraph); float minfac = (float)(1.0 / exp(wmd->width * wmd->narrow * wmd->width * wmd->narrow)); float lifefac = wmd->height; float (*tex_co)[3] = NULL; @@ -176,7 +161,7 @@ static void waveModifier_do( float falloff_fac = 1.0f; /* when falloff == 0.0f this stays at 1.0f */ if ((wmd->flag & MOD_WAVE_NORM) && (ob->type == OB_MESH)) - mvert = dm->getVertArray(dm); + mvert = mesh->mvert; if (wmd->objectcenter) { float mat[4][4]; @@ -189,7 +174,7 @@ static void waveModifier_do( } /* get the index of the deform group */ - modifier_get_vgroup(ob, dm, wmd->defgrp_name, &dvert, &defgrp_index); + modifier_get_vgroup_mesh(ob, mesh, wmd->defgrp_name, &dvert, &defgrp_index); if (wmd->damp == 0) wmd->damp = 10.0f; @@ -207,9 +192,9 @@ static void waveModifier_do( if (wmd->texture) { tex_co = MEM_malloc_arrayN(numVerts, sizeof(*tex_co), "waveModifier_do tex_co"); - get_texture_coords((MappingInfoModifierData *)wmd, ob, dm, vertexCos, tex_co, numVerts); + get_texture_coords_mesh((MappingInfoModifierData *)wmd, ob, mesh, vertexCos, tex_co); - modifier_init_texture(wmd->modifier.scene, wmd->texture); + modifier_init_texture(depsgraph, wmd->texture); } if (lifefac != 0.0f) { @@ -280,9 +265,10 @@ static void waveModifier_do( /*apply texture*/ if (wmd->texture) { + Scene *scene = DEG_get_evaluated_scene(depsgraph); TexResult texres; texres.nor = NULL; - BKE_texture_get_value(wmd->modifier.scene, wmd->texture, tex_co[i], &texres, false); + BKE_texture_get_value(scene, wmd->texture, tex_co[i], &texres, false); amplit *= texres.tin; } @@ -313,42 +299,42 @@ static void waveModifier_do( } static void deformVerts( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *mesh, float (*vertexCos)[3], - int numVerts, - ModifierApplyFlag UNUSED(flag)) + int numVerts) { - DerivedMesh *dm = derivedData; + Mesh *mesh_src = mesh; WaveModifierData *wmd = (WaveModifierData *)md; if (wmd->flag & MOD_WAVE_NORM) - dm = get_cddm(ob, NULL, dm, vertexCos, false); + mesh_src = get_mesh(ctx->object, NULL, mesh, vertexCos, true, false); else if (wmd->texture || wmd->defgrp_name[0]) - dm = get_dm(ob, NULL, dm, NULL, false, false); + mesh_src = get_mesh(ctx->object, NULL, mesh, NULL, false, false); - waveModifier_do(wmd, md->scene, ob, dm, vertexCos, numVerts); + waveModifier_do(wmd, ctx->depsgraph, ctx->object, mesh_src, vertexCos, numVerts); - if (dm != derivedData) - dm->release(dm); + if (mesh_src != mesh) + BKE_id_free(NULL, mesh_src); } static void deformVertsEM( - ModifierData *md, Object *ob, struct BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) + ModifierData *md, const ModifierEvalContext *ctx, + struct BMEditMesh *editData, + Mesh *mesh, float (*vertexCos)[3], int numVerts) { - DerivedMesh *dm = derivedData; + Mesh *mesh_src = mesh; WaveModifierData *wmd = (WaveModifierData *)md; if (wmd->flag & MOD_WAVE_NORM) - dm = get_cddm(ob, editData, dm, vertexCos, false); + mesh_src = get_mesh(ctx->object, editData, mesh, vertexCos, true, false); else if (wmd->texture || wmd->defgrp_name[0]) - dm = get_dm(ob, editData, dm, NULL, false, false); + mesh_src = get_mesh(ctx->object, editData, mesh, NULL, false, false); - waveModifier_do(wmd, md->scene, ob, dm, vertexCos, numVerts); + waveModifier_do(wmd, ctx->depsgraph, ctx->object, mesh_src, vertexCos, numVerts); - if (dm != derivedData) - dm->release(dm); + if (mesh_src != mesh) + BKE_id_free(NULL, mesh_src); } @@ -360,18 +346,27 @@ ModifierTypeInfo modifierType_Wave = { /* flags */ eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_AcceptsLattice | eModifierTypeFlag_SupportsEditmode, + /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ deformVerts, /* deformMatrices */ NULL, /* deformVertsEM */ deformVertsEM, /* deformMatricesEM */ NULL, /* applyModifier */ NULL, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ NULL, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ dependsOnTime, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c index e512c3fdc95..a18e12e06ec 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.c +++ b/source/blender/modifiers/intern/MOD_weightvg_util.c @@ -34,17 +34,20 @@ #include "BLI_utildefines.h" #include "DNA_color_types.h" /* CurveMapping. */ +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BKE_cdderivedmesh.h" #include "BKE_colortools.h" /* CurveMapping. */ +#include "BKE_customdata.h" #include "BKE_deform.h" #include "BKE_modifier.h" #include "BKE_texture.h" /* Texture masking. */ +#include "DEG_depsgraph.h" + #include "MEM_guardedalloc.h" #include "MOD_util.h" #include "MOD_weightvg_util.h" @@ -115,11 +118,13 @@ void weightvg_do_map(int num, float *new_w, short falloff_type, CurveMapping *cm * XXX The standard "factor" value is assumed in [0.0, 1.0] range. Else, weird results might appear. */ void weightvg_do_mask( - int num, const int *indices, float *org_w, const float *new_w, - Object *ob, DerivedMesh *dm, float fact, const char defgrp_name[MAX_VGROUP_NAME], - Scene *scene, Tex *texture, int tex_use_channel, int tex_mapping, + const ModifierEvalContext *ctx, + const int num, const int *indices, float *org_w, const float *new_w, + Object *ob, Mesh *mesh, const float fact, const char defgrp_name[MAX_VGROUP_NAME], + Scene *scene, Tex *texture, const int tex_use_channel, const int tex_mapping, Object *tex_map_object, const char *tex_uvlayer_name) { + Depsgraph *depsgraph = ctx->depsgraph; int ref_didx; int i; @@ -132,8 +137,7 @@ void weightvg_do_mask( float (*tex_co)[3]; /* See mapping note below... */ MappingInfoModifierData t_map; - float (*v_co)[3]; - int numVerts = dm->getNumVerts(dm); + const int numVerts = mesh->totvert; /* Use new generic get_texture_coords, but do not modify our DNA struct for it... * XXX Why use a ModifierData stuff here ? Why not a simple, generic struct for parameters ? @@ -144,13 +148,11 @@ void weightvg_do_mask( t_map.map_object = tex_map_object; BLI_strncpy(t_map.uvlayer_name, tex_uvlayer_name, sizeof(t_map.uvlayer_name)); t_map.texmapping = tex_mapping; - v_co = MEM_malloc_arrayN(numVerts, sizeof(*v_co), "WeightVG Modifier, TEX mode, v_co"); - dm->getVertCos(dm, v_co); + tex_co = MEM_calloc_arrayN(numVerts, sizeof(*tex_co), "WeightVG Modifier, TEX mode, tex_co"); - get_texture_coords(&t_map, ob, dm, v_co, tex_co, num); - MEM_freeN(v_co); + get_texture_coords_mesh(&t_map, ob, mesh, NULL, tex_co); - modifier_init_texture(scene, texture); + modifier_init_texture(depsgraph, texture); /* For each weight (vertex), make the mix between org and new weights. */ for (i = 0; i < num; ++i) { @@ -210,9 +212,11 @@ void weightvg_do_mask( /* Proceed only if vgroup is valid, else use constant factor. */ /* Get actual dverts (ie vertex group data). */ - dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); + dvert = CustomData_get_layer(&mesh->vdata, CD_MDEFORMVERT); /* Proceed only if vgroup is valid, else assume factor = O. */ - if (dvert == NULL) return; + if (dvert == NULL) { + return; + } /* For each weight (vertex), make the mix between org and new weights. */ for (i = 0; i < num; i++) { diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.h b/source/blender/modifiers/intern/MOD_weightvg_util.h index 4a31f973974..93594fd8b29 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.h +++ b/source/blender/modifiers/intern/MOD_weightvg_util.h @@ -32,7 +32,10 @@ #define __MOD_WEIGHTVG_UTIL_H__ struct CurveMapping; -struct DerivedMesh; +struct MDeformVert; +struct MDeformWeight; +struct Mesh; +struct ModifierEvalContext; struct Object; struct Tex; struct Scene; @@ -41,7 +44,7 @@ struct RNG; /* * XXX I'd like to make modified weights visible in WeightPaint mode, * but couldn't figure a way to do this... - * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)? + * Maybe this will need changes in mesh_calc_modifiers? * Or the WeightPaint mode code itself? */ @@ -71,9 +74,10 @@ void weightvg_do_map(int num, float *new_w, short mode, struct CurveMapping *cma * XXX The standard "factor" value is assumed in [0.0, 1.0] range. Else, weird results might appear. */ void weightvg_do_mask( - int num, const int *indices, float *org_w, const float *new_w, Object *ob, - DerivedMesh *dm, float fact, const char defgrp_name[MAX_VGROUP_NAME], - struct Scene *scene, Tex *texture, int tex_use_channel, int tex_mapping, + const ModifierEvalContext *ctx, + const int num, const int *indices, float *org_w, const float *new_w, Object *ob, + struct Mesh *mesh, const float fact, const char defgrp_name[MAX_VGROUP_NAME], + struct Scene *scene, Tex *texture, const int tex_use_channel, const int tex_mapping, Object *tex_map_object, const char *tex_uvlayer_name); /* Applies weights to given vgroup (defgroup), and optionally add/remove vertices from the group. @@ -81,7 +85,7 @@ void weightvg_do_mask( * vertex index (in case the weight table does not cover the whole vertices...). */ void weightvg_update_vg( - MDeformVert *dvert, int defgrp_idx, MDeformWeight **dws, int num, + struct MDeformVert *dvert, int defgrp_idx, struct MDeformWeight **dws, int num, const int *indices, const float *weights, const bool do_add, const float add_thresh, const bool do_rem, const float rem_thresh); diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c index e793c8580c9..a26cb73d823 100644 --- a/source/blender/modifiers/intern/MOD_weightvgedit.c +++ b/source/blender/modifiers/intern/MOD_weightvgedit.c @@ -34,11 +34,11 @@ #include "BLI_rand.h" #include "DNA_color_types.h" /* CurveMapping. */ +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" -#include "BKE_cdderivedmesh.h" #include "BKE_colortools.h" /* CurveMapping. */ #include "BKE_deform.h" #include "BKE_library.h" @@ -46,8 +46,8 @@ #include "BKE_modifier.h" #include "BKE_texture.h" /* Texture masking. */ -#include "depsgraph_private.h" #include "DEG_depsgraph_build.h" +#include "DEG_depsgraph_query.h" #include "MEM_guardedalloc.h" @@ -137,23 +137,6 @@ static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void walk(userData, ob, md, "mask_texture"); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - WeightVGEditModifierData *wmd = (WeightVGEditModifierData *) md; - DagNode *curNode; - - if (wmd->mask_tex_map_obj && wmd->mask_tex_mapping == MOD_DISP_MAP_OBJECT) { - curNode = dag_get_node(ctx->forest, wmd->mask_tex_map_obj); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, - "WeightVGEdit Modifier"); - } - - if (wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL) - dag_add_relation(ctx->forest, ctx->obNode, ctx->obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, - "WeightVGEdit Modifier"); -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { WeightVGEditModifierData *wmd = (WeightVGEditModifierData *)md; @@ -165,26 +148,28 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte } } -static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(useRenderParams)) { WeightVGEditModifierData *wmd = (WeightVGEditModifierData *) md; /* If no vertex group, bypass. */ return (wmd->defgrp_name[0] == '\0'); } -static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier( + ModifierData *md, + const ModifierEvalContext *ctx, + Mesh *mesh) { + BLI_assert(mesh != NULL); + WeightVGEditModifierData *wmd = (WeightVGEditModifierData *) md; - DerivedMesh *dm = derivedData; + MDeformVert *dvert = NULL; MDeformWeight **dw = NULL; float *org_w; /* Array original weights. */ float *new_w; /* Array new weights. */ - int numVerts; - int defgrp_index; int i; + /* Flags. */ const bool do_add = (wmd->edit_flags & MOD_WVG_EDIT_ADD2VG) != 0; const bool do_rem = (wmd->edit_flags & MOD_WVG_EDIT_REMFVG) != 0; @@ -194,30 +179,43 @@ static DerivedMesh *applyModifier( #endif /* Get number of verts. */ - numVerts = dm->getNumVerts(dm); + const int numVerts = mesh->totvert; /* Check if we can just return the original mesh. * Must have verts and therefore verts assigned to vgroups to do anything useful! */ - if ((numVerts == 0) || BLI_listbase_is_empty(&ob->defbase)) - return dm; + if ((numVerts == 0) || BLI_listbase_is_empty(&ctx->object->defbase)) { + return mesh; + } /* Get vgroup idx from its name. */ - defgrp_index = defgroup_name_index(ob, wmd->defgrp_name); - if (defgrp_index == -1) - return dm; + const int defgrp_index = defgroup_name_index(ctx->object, wmd->defgrp_name); + if (defgrp_index == -1) { + return mesh; + } - dvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MDEFORMVERT, numVerts); + const bool has_mdef = CustomData_has_layer(&mesh->vdata, CD_MDEFORMVERT); /* If no vertices were ever added to an object's vgroup, dvert might be NULL. */ - if (!dvert) { + if (!has_mdef) { /* If this modifier is not allowed to add vertices, just return. */ - if (!do_add) - return dm; - /* Else, add a valid data layer! */ - dvert = CustomData_add_layer(&dm->vertData, CD_MDEFORMVERT, CD_CALLOC, NULL, numVerts); - /* Ultimate security check. */ - if (!dvert) - return dm; + if (!do_add) { + return mesh; + } + } + + Mesh *result = mesh; + + if (has_mdef) { + dvert = CustomData_duplicate_referenced_layer(&result->vdata, CD_MDEFORMVERT, numVerts); + } + else { + /* Add a valid data layer! */ + dvert = CustomData_add_layer(&result->vdata, CD_MDEFORMVERT, CD_CALLOC, NULL, numVerts); + } + /* Ultimate security check. */ + if (!dvert) { + BKE_id_free(NULL, result); + return mesh; } /* Get org weights, assuming 0.0 for vertices not in given vgroup. */ @@ -238,18 +236,21 @@ static DerivedMesh *applyModifier( if (wmd->falloff_type != MOD_WVG_MAPPING_NONE) { RNG *rng = NULL; - if (wmd->falloff_type == MOD_WVG_MAPPING_RANDOM) - rng = BLI_rng_new_srandom(BLI_ghashutil_strhash(ob->id.name + 2)); + if (wmd->falloff_type == MOD_WVG_MAPPING_RANDOM) { + rng = BLI_rng_new_srandom(BLI_ghashutil_strhash(ctx->object->id.name + 2)); + } weightvg_do_map(numVerts, new_w, wmd->falloff_type, wmd->cmap_curve, rng); - if (rng) + if (rng) { BLI_rng_free(rng); + } } /* Do masking. */ - weightvg_do_mask(numVerts, NULL, org_w, new_w, ob, dm, wmd->mask_constant, - wmd->mask_defgrp_name, wmd->modifier.scene, wmd->mask_texture, + struct Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); + weightvg_do_mask(ctx, numVerts, NULL, org_w, new_w, ctx->object, result, wmd->mask_constant, + wmd->mask_defgrp_name, scene, wmd->mask_texture, wmd->mask_tex_use_channel, wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name); @@ -269,7 +270,7 @@ static DerivedMesh *applyModifier( MEM_freeN(dw); /* Return the vgroup-modified mesh. */ - return dm; + return result; } @@ -284,17 +285,25 @@ ModifierTypeInfo modifierType_WeightVGEdit = { eModifierTypeFlag_UsesPreview, /* copyData */ copyData, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ freeData, /* isDisabled */ isDisabled, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ dependsOnTime, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c index 51341890c51..90bd5acff62 100644 --- a/source/blender/modifiers/intern/MOD_weightvgmix.c +++ b/source/blender/modifiers/intern/MOD_weightvgmix.c @@ -32,26 +32,26 @@ #include "BLI_math.h" #include "BLI_listbase.h" +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" -#include "BKE_cdderivedmesh.h" +#include "BKE_customdata.h" #include "BKE_deform.h" #include "BKE_library.h" #include "BKE_library_query.h" #include "BKE_modifier.h" #include "BKE_texture.h" /* Texture masking. */ -#include "depsgraph_private.h" #include "DEG_depsgraph_build.h" +#include "DEG_depsgraph_query.h" #include "MEM_guardedalloc.h" #include "MOD_weightvg_util.h" #include "MOD_modifiertypes.h" - /** * This mixes the old weight with the new weight factor. */ @@ -172,23 +172,6 @@ static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void walk(userData, ob, md, "mask_texture"); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - WeightVGMixModifierData *wmd = (WeightVGMixModifierData *) md; - DagNode *curNode; - - if (wmd->mask_tex_map_obj && wmd->mask_tex_mapping == MOD_DISP_MAP_OBJECT) { - curNode = dag_get_node(ctx->forest, wmd->mask_tex_map_obj); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, - "WeightVGMix Modifier"); - } - - if (wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL) - dag_add_relation(ctx->forest, ctx->obNode, ctx->obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, - "WeightVGMix Modifier"); -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { WeightVGMixModifierData *wmd = (WeightVGMixModifierData *) md; @@ -202,23 +185,21 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte } } -static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(useRenderParams)) { WeightVGMixModifierData *wmd = (WeightVGMixModifierData *) md; /* If no vertex group, bypass. */ return (wmd->defgrp_name_a[0] == '\0'); } -static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh) { + BLI_assert(mesh != NULL); + WeightVGMixModifierData *wmd = (WeightVGMixModifierData *) md; - DerivedMesh *dm = derivedData; + MDeformVert *dvert = NULL; MDeformWeight **dw1, **tdw1, **dw2, **tdw2; - int numVerts; - int defgrp_index, defgrp_index_other = -1; float *org_w; float *new_w; int *tidx, *indices = NULL; @@ -230,37 +211,53 @@ static DerivedMesh *applyModifier( #endif /* Get number of verts. */ - numVerts = dm->getNumVerts(dm); + const int numVerts = mesh->totvert; /* Check if we can just return the original mesh. * Must have verts and therefore verts assigned to vgroups to do anything useful! */ - if ((numVerts == 0) || BLI_listbase_is_empty(&ob->defbase)) - return dm; + if ((numVerts == 0) || BLI_listbase_is_empty(&ctx->object->defbase)) { + return mesh; + } /* Get vgroup idx from its name. */ - defgrp_index = defgroup_name_index(ob, wmd->defgrp_name_a); - if (defgrp_index == -1) - return dm; + const int defgrp_index = defgroup_name_index(ctx->object, wmd->defgrp_name_a); + if (defgrp_index == -1) { + return mesh; + } /* Get second vgroup idx from its name, if given. */ - if (wmd->defgrp_name_b[0] != (char)0) { - defgrp_index_other = defgroup_name_index(ob, wmd->defgrp_name_b); - if (defgrp_index_other == -1) - return dm; + int defgrp_index_other = -1; + if (wmd->defgrp_name_b[0] != '\0') { + defgrp_index_other = defgroup_name_index(ctx->object, wmd->defgrp_name_b); + if (defgrp_index_other == -1) { + return mesh; + } } - dvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MDEFORMVERT, numVerts); + const bool has_mdef = CustomData_has_layer(&mesh->vdata, CD_MDEFORMVERT); /* If no vertices were ever added to an object's vgroup, dvert might be NULL. */ - if (!dvert) { + if (!has_mdef) { /* If not affecting all vertices, just return. */ - if (wmd->mix_set != MOD_WVG_SET_ALL) - return dm; - /* Else, add a valid data layer! */ - dvert = CustomData_add_layer(&dm->vertData, CD_MDEFORMVERT, CD_CALLOC, NULL, numVerts); - /* Ultimate security check. */ - if (!dvert) - return dm; + if (wmd->mix_set != MOD_WVG_SET_ALL) { + return mesh; + } + } + + Mesh *result = mesh; + + if (has_mdef) { + dvert = CustomData_duplicate_referenced_layer(&result->vdata, CD_MDEFORMVERT, numVerts); } + else { + /* Add a valid data layer! */ + dvert = CustomData_add_layer(&result->vdata, CD_MDEFORMVERT, CD_CALLOC, NULL, numVerts); + } + /* Ultimate security check. */ + if (!dvert) { + BKE_id_free(NULL, result); + return mesh; + } + /* Find out which vertices to work on. */ tidx = MEM_malloc_arrayN(numVerts, sizeof(int), "WeightVGMix Modifier, tidx"); tdw1 = MEM_malloc_arrayN(numVerts, sizeof(MDeformWeight *), "WeightVGMix Modifier, tdw1"); @@ -327,7 +324,8 @@ static DerivedMesh *applyModifier( MEM_freeN(tdw1); MEM_freeN(tdw2); MEM_freeN(tidx); - return dm; + BKE_id_free(NULL, result); + return mesh; } if (numIdx != -1) { indices = MEM_malloc_arrayN(numIdx, sizeof(int), "WeightVGMix Modifier, indices"); @@ -361,8 +359,9 @@ static DerivedMesh *applyModifier( } /* Do masking. */ - weightvg_do_mask(numIdx, indices, org_w, new_w, ob, dm, wmd->mask_constant, - wmd->mask_defgrp_name, wmd->modifier.scene, wmd->mask_texture, + struct Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); + weightvg_do_mask(ctx, numIdx, indices, org_w, new_w, ctx->object, result, wmd->mask_constant, + wmd->mask_defgrp_name, scene, wmd->mask_texture, wmd->mask_tex_use_channel, wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name); @@ -382,12 +381,10 @@ static DerivedMesh *applyModifier( MEM_freeN(new_w); MEM_freeN(dw1); MEM_freeN(dw2); - - if (indices) - MEM_freeN(indices); + MEM_SAFE_FREE(indices); /* Return the vgroup-modified mesh. */ - return dm; + return result; } @@ -402,17 +399,25 @@ ModifierTypeInfo modifierType_WeightVGMix = { eModifierTypeFlag_UsesPreview, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ isDisabled, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ dependsOnTime, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 47db0a3371f..88e33f28eaf 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -40,20 +40,24 @@ #include "DNA_modifier_types.h" #include "DNA_object_types.h" -#include "BKE_cdderivedmesh.h" +#include "BKE_bvhutils.h" +#include "BKE_curve.h" +#include "BKE_customdata.h" #include "BKE_deform.h" #include "BKE_library.h" #include "BKE_library_query.h" +#include "BKE_mesh.h" #include "BKE_modifier.h" #include "BKE_texture.h" /* Texture masking. */ -#include "depsgraph_private.h" #include "DEG_depsgraph_build.h" +#include "DEG_depsgraph_query.h" #include "MEM_guardedalloc.h" #include "MOD_weightvg_util.h" #include "MOD_modifiertypes.h" +#include "MOD_util.h" //#define USE_TIMEIT @@ -139,7 +143,7 @@ static void vert2geom_task_cb_ex( static void get_vert2geom_distance( int numVerts, float (*v_cos)[3], float *dist_v, float *dist_e, float *dist_f, - DerivedMesh *target, const SpaceTransform *loc2trgt) + Mesh *target, const SpaceTransform *loc2trgt) { Vert2GeomData data = {0}; Vert2GeomDataChunk data_chunk = {{{0}}}; @@ -150,7 +154,7 @@ static void get_vert2geom_distance( if (dist_v) { /* Create a bvh-tree of the given target's verts. */ - bvhtree_from_mesh_get(&treeData_v, target, BVHTREE_FROM_VERTS, 2); + BKE_bvhtree_from_mesh_get(&treeData_v, target, BVHTREE_FROM_VERTS, 2); if (treeData_v.tree == NULL) { OUT_OF_MEMORY(); return; @@ -158,7 +162,7 @@ static void get_vert2geom_distance( } if (dist_e) { /* Create a bvh-tree of the given target's edges. */ - bvhtree_from_mesh_get(&treeData_e, target, BVHTREE_FROM_EDGES, 2); + BKE_bvhtree_from_mesh_get(&treeData_e, target, BVHTREE_FROM_EDGES, 2); if (treeData_e.tree == NULL) { OUT_OF_MEMORY(); return; @@ -166,7 +170,7 @@ static void get_vert2geom_distance( } if (dist_f) { /* Create a bvh-tree of the given target's faces. */ - bvhtree_from_mesh_get(&treeData_f, target, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&treeData_f, target, BVHTREE_FROM_LOOPTRI, 2); if (treeData_f.tree == NULL) { OUT_OF_MEMORY(); return; @@ -260,13 +264,15 @@ static void do_map(Object *ob, float *weights, const int nidx, const float min_d if (!ELEM(mode, MOD_WVG_MAPPING_NONE, MOD_WVG_MAPPING_CURVE)) { RNG *rng = NULL; - if (mode == MOD_WVG_MAPPING_RANDOM) + if (mode == MOD_WVG_MAPPING_RANDOM) { rng = BLI_rng_new_srandom(BLI_ghashutil_strhash(ob->id.name + 2)); + } weightvg_do_map(nidx, weights, mode, NULL, rng); - if (rng) + if (rng) { BLI_rng_free(rng); + } } } @@ -335,29 +341,6 @@ static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void walk(userData, ob, md, "mask_texture"); } -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData *) md; - DagNode *curNode; - - if (wmd->proximity_ob_target) { - curNode = dag_get_node(ctx->forest, wmd->proximity_ob_target); - dag_add_relation(ctx->forest, curNode, ctx->obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, - "WeightVGProximity Modifier"); - } - - if (wmd->mask_tex_map_obj && wmd->mask_tex_mapping == MOD_DISP_MAP_OBJECT) { - curNode = dag_get_node(ctx->forest, wmd->mask_tex_map_obj); - - dag_add_relation(ctx->forest, curNode, ctx->obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, - "WeightVGProximity Modifier"); - } - - if (wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL) - dag_add_relation(ctx->forest, ctx->obNode, ctx->obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, - "WeightVGProximity Modifier"); -} - static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData *)md; @@ -375,7 +358,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte } } -static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, int UNUSED(useRenderParams)) { WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData *) md; /* If no vertex group, bypass. */ @@ -384,16 +367,15 @@ static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) return (wmd->proximity_ob_target == NULL); } -static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh) { + BLI_assert(mesh != NULL); + WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData *) md; - DerivedMesh *dm = derivedData; MDeformVert *dvert = NULL; MDeformWeight **dw, **tdw; - int numVerts; float (*v_cos)[3] = NULL; /* The vertices coordinates. */ + Object *ob = ctx->object; Object *obr = NULL; /* Our target object. */ int defgrp_index; float *tw = NULL; @@ -412,32 +394,50 @@ static DerivedMesh *applyModifier( #endif /* Get number of verts. */ - numVerts = dm->getNumVerts(dm); + const int numVerts = mesh->totvert; /* Check if we can just return the original mesh. * Must have verts and therefore verts assigned to vgroups to do anything useful! */ - if ((numVerts == 0) || BLI_listbase_is_empty(&ob->defbase)) - return dm; + if ((numVerts == 0) || BLI_listbase_is_empty(&ctx->object->defbase)) { + return mesh; + } /* Get our target object. */ obr = wmd->proximity_ob_target; - if (obr == NULL) - return dm; + if (obr == NULL) { + return mesh; + } /* Get vgroup idx from its name. */ defgrp_index = defgroup_name_index(ob, wmd->defgrp_name); - if (defgrp_index == -1) - return dm; + if (defgrp_index == -1) { + return mesh; + } - dvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MDEFORMVERT, numVerts); - /* If no vertices were ever added to an object's vgroup, dvert might be NULL. - * As this modifier never add vertices to vgroup, just return. */ - if (!dvert) - return dm; + const bool has_mdef = CustomData_has_layer(&mesh->vdata, CD_MDEFORMVERT); + /* If no vertices were ever added to an object's vgroup, dvert might be NULL. */ + /* As this modifier never add vertices to vgroup, just return. */ + if (!has_mdef) { + return mesh; + } - /* Find out which vertices to work on (all vertices in vgroup), and get their relevant weight. - */ + Mesh *result = mesh; + + if (has_mdef) { + dvert = CustomData_duplicate_referenced_layer(&result->vdata, CD_MDEFORMVERT, numVerts); + } + else { + /* Add a valid data layer! */ + dvert = CustomData_add_layer(&result->vdata, CD_MDEFORMVERT, CD_CALLOC, NULL, numVerts); + } + /* Ultimate security check. */ + if (!dvert) { + BKE_id_free(NULL, result); + return mesh; + } + + /* Find out which vertices to work on (all vertices in vgroup), and get their relevant weight. */ tidx = MEM_malloc_arrayN(numVerts, sizeof(int), "WeightVGProximity Modifier, tidx"); tw = MEM_malloc_arrayN(numVerts, sizeof(float), "WeightVGProximity Modifier, tw"); tdw = MEM_malloc_arrayN(numVerts, sizeof(MDeformWeight *), "WeightVGProximity Modifier, tdw"); @@ -454,7 +454,8 @@ static DerivedMesh *applyModifier( MEM_freeN(tidx); MEM_freeN(tw); MEM_freeN(tdw); - return dm; + BKE_id_free(NULL, result); + return mesh; } if (numIdx != numVerts) { indices = MEM_malloc_arrayN(numIdx, sizeof(int), "WeightVGProximity Modifier, indices"); @@ -474,25 +475,24 @@ static DerivedMesh *applyModifier( MEM_freeN(tidx); /* Get our vertex coordinates. */ - v_cos = MEM_malloc_arrayN(numIdx, sizeof(float[3]), "WeightVGProximity Modifier, v_cos"); if (numIdx != numVerts) { - /* XXX In some situations, this code can be up to about 50 times more performant - * than simply using getVertCo for each affected vertex... - */ - float (*tv_cos)[3] = MEM_malloc_arrayN(numVerts, sizeof(float[3]), "WeightVGProximity Modifier, tv_cos"); - dm->getVertCos(dm, tv_cos); - for (i = 0; i < numIdx; i++) + float (*tv_cos)[3] = BKE_mesh_vertexCos_get(result, NULL); + v_cos = MEM_malloc_arrayN(numIdx, sizeof(float[3]), "WeightVGProximity Modifier, v_cos"); + for (i = 0; i < numIdx; i++) { copy_v3_v3(v_cos[i], tv_cos[indices[i]]); + } MEM_freeN(tv_cos); } - else - dm->getVertCos(dm, v_cos); + else { + v_cos = BKE_mesh_vertexCos_get(result, NULL); + } /* Compute wanted distances. */ if (wmd->proximity_mode == MOD_WVG_PROXIMITY_OBJECT) { const float dist = get_ob2ob_distance(ob, obr); - for (i = 0; i < numIdx; i++) + for (i = 0; i < numIdx; i++) { new_w[i] = dist; + } } else if (wmd->proximity_mode == MOD_WVG_PROXIMITY_GEOMETRY) { const bool use_trgt_verts = (wmd->proximity_flags & MOD_WVG_PROXIMITY_GEOM_VERTS) != 0; @@ -500,23 +500,11 @@ static DerivedMesh *applyModifier( const bool use_trgt_faces = (wmd->proximity_flags & MOD_WVG_PROXIMITY_GEOM_FACES) != 0; if (use_trgt_verts || use_trgt_edges || use_trgt_faces) { - DerivedMesh *target_dm = obr->derivedFinal; - bool free_target_dm = false; - if (!target_dm) { - if (ELEM(obr->type, OB_CURVE, OB_SURF, OB_FONT)) - target_dm = CDDM_from_curve(obr); - else if (obr->type == OB_MESH) { - Mesh *me = (Mesh *)obr->data; - if (me->edit_btmesh) - target_dm = CDDM_from_editbmesh(me->edit_btmesh, false, false); - else - target_dm = CDDM_from_mesh(me); - } - free_target_dm = true; - } + bool target_mesh_free; + Mesh *target_mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(obr, &target_mesh_free); - /* We must check that we do have a valid target_dm! */ - if (target_dm) { + /* We must check that we do have a valid target_mesh! */ + if (target_mesh != NULL) { SpaceTransform loc2trgt; float *dists_v = use_trgt_verts ? MEM_malloc_arrayN(numIdx, sizeof(float), "dists_v") : NULL; float *dists_e = use_trgt_edges ? MEM_malloc_arrayN(numIdx, sizeof(float), "dists_e") : NULL; @@ -524,7 +512,7 @@ static DerivedMesh *applyModifier( BLI_SPACE_TRANSFORM_SETUP(&loc2trgt, ob, obr); get_vert2geom_distance(numIdx, v_cos, dists_v, dists_e, dists_f, - target_dm, &loc2trgt); + target_mesh, &loc2trgt); for (i = 0; i < numIdx; i++) { new_w[i] = dists_v ? dists_v[i] : FLT_MAX; if (dists_e) @@ -532,10 +520,14 @@ static DerivedMesh *applyModifier( if (dists_f) new_w[i] = min_ff(dists_f[i], new_w[i]); } - if (free_target_dm) target_dm->release(target_dm); - if (dists_v) MEM_freeN(dists_v); - if (dists_e) MEM_freeN(dists_e); - if (dists_f) MEM_freeN(dists_f); + + MEM_SAFE_FREE(dists_v); + MEM_SAFE_FREE(dists_e); + MEM_SAFE_FREE(dists_f); + + if (target_mesh_free) { + BKE_id_free(NULL, target_mesh); + } } /* Else, fall back to default obj2vert behavior. */ else { @@ -551,8 +543,9 @@ static DerivedMesh *applyModifier( do_map(ob, new_w, numIdx, wmd->min_dist, wmd->max_dist, wmd->falloff_type); /* Do masking. */ - weightvg_do_mask(numIdx, indices, org_w, new_w, ob, dm, wmd->mask_constant, - wmd->mask_defgrp_name, wmd->modifier.scene, wmd->mask_texture, + struct Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); + weightvg_do_mask(ctx, numIdx, indices, org_w, new_w, ob, result, wmd->mask_constant, + wmd->mask_defgrp_name, scene, wmd->mask_texture, wmd->mask_tex_use_channel, wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name); @@ -569,16 +562,15 @@ static DerivedMesh *applyModifier( MEM_freeN(org_w); MEM_freeN(new_w); MEM_freeN(dw); - if (indices) - MEM_freeN(indices); MEM_freeN(v_cos); + MEM_SAFE_FREE(indices); #ifdef USE_TIMEIT TIMEIT_END(perf); #endif /* Return the vgroup-modified mesh. */ - return dm; + return result; } @@ -593,17 +585,25 @@ ModifierTypeInfo modifierType_WeightVGProximity = { eModifierTypeFlag_UsesPreview, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ isDisabled, - /* updateDepgraph */ updateDepgraph, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ dependsOnTime, /* dependsOnNormals */ NULL, diff --git a/source/blender/modifiers/intern/MOD_wireframe.c b/source/blender/modifiers/intern/MOD_wireframe.c index 84a507cd35c..cc846d08040 100644 --- a/source/blender/modifiers/intern/MOD_wireframe.c +++ b/source/blender/modifiers/intern/MOD_wireframe.c @@ -23,12 +23,13 @@ * \ingroup modifiers */ +#include "DNA_mesh_types.h" #include "DNA_object_types.h" #include "BLI_utildefines.h" -#include "BKE_cdderivedmesh.h" #include "BKE_deform.h" +#include "BKE_mesh.h" #include "MOD_modifiertypes.h" @@ -60,14 +61,22 @@ static bool dependsOnNormals(ModifierData *UNUSED(md)) return true; } -static DerivedMesh *WireframeModifier_do(WireframeModifierData *wmd, Object *ob, DerivedMesh *dm) +static Mesh *WireframeModifier_do(WireframeModifierData *wmd, Object *ob, Mesh *mesh) { - DerivedMesh *result; + Mesh *result; BMesh *bm; const int defgrp_index = defgroup_name_index(ob, wmd->defgrp_name); - bm = DM_to_bmesh(dm, true); + bm = BKE_mesh_to_bmesh_ex( + mesh, + &(struct BMeshCreateParams){0}, + &(struct BMeshFromMeshParams){ + .calc_face_normal = true, + .add_key_index = false, + .use_shapekey = true, + .active_shapekey = ob->shapenr, + }); BM_mesh_wireframe( bm, @@ -84,18 +93,21 @@ static DerivedMesh *WireframeModifier_do(WireframeModifierData *wmd, Object *ob, MAX2(ob->totcol - 1, 0), false); - result = CDDM_from_bmesh(bm, true); + result = BKE_bmesh_to_mesh_nomain(bm, &(struct BMeshToMeshParams){0}); BM_mesh_free(bm); - result->dirty |= DM_DIRTY_NORMALS; + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; return result; } -static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm, ModifierApplyFlag UNUSED(flag)) +static Mesh *applyModifier( + ModifierData *md, + const struct ModifierEvalContext *ctx, + struct Mesh *mesh) { - return WireframeModifier_do((WireframeModifierData *)md, ob, dm); + return WireframeModifier_do((WireframeModifierData *)md, ctx->object, mesh); } @@ -108,18 +120,26 @@ ModifierTypeInfo modifierType_Wireframe = { eModifierTypeFlag_SupportsEditmode, /* copyData */ modifier_copyData_generic, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, + /* deformVerts */ NULL, /* deformMatrices */ NULL, /* deformVertsEM */ NULL, /* deformMatricesEM */ NULL, /* applyModifier */ applyModifier, /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, /* isDisabled */ NULL, /* updateDepgraph */ NULL, - /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, /* dependsOnNormals */ dependsOnNormals, /* foreachObjectLink */ NULL, |