diff options
Diffstat (limited to 'source/blender/modifiers')
63 files changed, 3866 insertions, 2681 deletions
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt index 80a67083582..522e15be856 100644 --- a/source/blender/modifiers/CMakeLists.txt +++ b/source/blender/modifiers/CMakeLists.txt @@ -100,6 +100,7 @@ set(SRC intern/MOD_uvproject.c intern/MOD_warp.c intern/MOD_wave.c + intern/MOD_weighted_normal.c intern/MOD_weightvg_util.c intern/MOD_weightvgedit.c intern/MOD_weightvgmix.c @@ -113,10 +114,6 @@ set(SRC intern/MOD_weightvg_util.h ) -if(WITH_LEGACY_DEPSGRAPH) - add_definitions(-DWITH_LEGACY_DEPSGRAPH) -endif() - if(WITH_ALEMBIC) add_definitions(-DWITH_ALEMBIC) list(APPEND INC @@ -147,8 +144,11 @@ if(WITH_INTERNATIONAL) add_definitions(-DWITH_INTERNATIONAL) endif() -if(WITH_OPENSUBDIV) - add_definitions(-DWITH_OPENSUBDIV) +if(WITH_OPENSUBDIV_MODIFIER) + add_definitions(-DWITH_OPENSUBDIV_MODIFIER) endif() +# So we can have special tricks in modifier system. +add_definitions(${GL_DEFINITIONS}) + blender_add_lib(bf_modifiers "${SRC}" "${INC}" "${INC_SYS}") diff --git a/source/blender/modifiers/MOD_modifiertypes.h b/source/blender/modifiers/MOD_modifiertypes.h index bf121af2bd1..3511b0edbec 100644 --- a/source/blender/modifiers/MOD_modifiertypes.h +++ b/source/blender/modifiers/MOD_modifiertypes.h @@ -86,6 +86,7 @@ extern ModifierTypeInfo modifierType_NormalEdit; extern ModifierTypeInfo modifierType_CorrectiveSmooth; extern ModifierTypeInfo modifierType_MeshSequenceCache; extern ModifierTypeInfo modifierType_SurfaceDeform; +extern ModifierTypeInfo modifierType_WeightedNormal; /* MOD_util.c */ void modifier_type_init(ModifierTypeInfo *types[]); diff --git a/source/blender/modifiers/intern/MOD_armature.c b/source/blender/modifiers/intern/MOD_armature.c index 5b5e139d33a..c44b65dffec 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" @@ -62,14 +64,14 @@ static void initData(ModifierData *md) amd->deformflag = ARM_DEF_VGROUP; } -static void copyData(const ModifierData *md, ModifierData *target) +static void copyData(const ModifierData *md, ModifierData *target, const int flag) { #if 0 const ArmatureModifierData *amd = (const ArmatureModifierData *) md; #endif ArmatureModifierData *tamd = (ArmatureModifierData *) target; - modifier_copyData_generic(md, target); + modifier_copyData_generic(md, target, flag); tamd->prevCos = NULL; } @@ -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, bool 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 */ + MOD_previous_vcos_store(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 = MOD_get_mesh_eval(ctx->object, em, mesh, NULL, false, false); - modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */ + MOD_previous_vcos_store(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 = MOD_get_mesh_eval(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 = MOD_get_mesh_eval(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..085f21fe138 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,15 +456,10 @@ 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) { + CurveCache *curve_cache = amd->curve_ob->runtime.curve_cache; + if (curve_cache != NULL && curve_cache->path != NULL) { float scale_fac = mat4_to_scale(amd->curve_ob->obmat); - length = scale_fac * amd->curve_ob->curve_cache->path->totdist; + length = scale_fac * curve_cache->path->totdist; } } } @@ -536,8 +490,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 +500,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 +525,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 +551,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 +613,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 +649,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 +674,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 +721,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 +739,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 +771,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..a961208755d 100644 --- a/source/blender/modifiers/intern/MOD_bevel.c +++ b/source/blender/modifiers/intern/MOD_bevel.c @@ -32,14 +32,20 @@ * \ingroup modifiers */ +#include "MEM_guardedalloc.h" + +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "BLI_utildefines.h" +#include "BLI_linklist_stack.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" @@ -47,6 +53,8 @@ #include "bmesh.h" #include "bmesh_tools.h" +#include "DEG_depsgraph_query.h" + static void initData(ModifierData *md) { BevelModifierData *bmd = (BevelModifierData *) md; @@ -57,10 +65,23 @@ static void initData(ModifierData *md) bmd->val_flags = MOD_BEVEL_AMT_OFFSET; bmd->lim_flags = 0; bmd->e_flags = 0; + bmd->edge_flags = 0; bmd->mat = -1; bmd->profile = 0.5f; bmd->bevel_angle = DEG2RADF(30.0f); bmd->defgrp_name[0] = '\0'; + bmd->hnmode = MOD_BEVEL_HN_NONE; + bmd->hn_strength = 0.5f; + bmd->clnordata.faceHash = NULL; +} + +static void copyData(const ModifierData *md_src, ModifierData *md_dst, const int UNUSED(flag)) +{ + BevelModifierData *bmd_src = (BevelModifierData *)md_src; + BevelModifierData *bmd_dst = (BevelModifierData *)md_dst; + + *bmd_dst = *bmd_src; + bmd_dst->clnordata.faceHash = NULL; } static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) @@ -74,15 +95,260 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) return dataMask; } +static void bevel_set_weighted_normal_face_strength(BMesh *bm, Scene *scene) +{ + BMFace *f; + BMIter fiter; + const char *wn_layer_id = MOD_WEIGHTEDNORMALS_FACEWEIGHT_CDLAYER_ID; + int cd_prop_int_idx = CustomData_get_named_layer_index(&bm->pdata, CD_PROP_INT, wn_layer_id); + + if (cd_prop_int_idx == -1) { + BM_data_layer_add_named(bm, &bm->pdata, CD_PROP_INT, wn_layer_id); + cd_prop_int_idx = CustomData_get_named_layer_index(&bm->pdata, CD_PROP_INT, wn_layer_id); + } + cd_prop_int_idx -= CustomData_get_layer_index(&bm->pdata, CD_PROP_INT); + const int cd_prop_int_offset = CustomData_get_n_offset(&bm->pdata, CD_PROP_INT, cd_prop_int_idx); + + const int face_strength = scene->toolsettings->face_strength; + + BM_ITER_MESH(f, &fiter, bm, BM_FACES_OF_MESH) { + if (BM_elem_flag_test(f, BM_ELEM_TAG)) { + int *strength = BM_ELEM_CD_GET_VOID_P(f, cd_prop_int_offset); + *strength = face_strength; + } + } +} + +static void bevel_mod_harden_normals( + BevelModifierData *bmd, BMesh *bm, const float hn_strength, + const int hnmode, MDeformVert *dvert, int vgroup) +{ + if (bmd->res > 20 || bmd->value == 0) + return; + + BM_mesh_normals_update(bm); + BM_lnorspace_update(bm); + BM_normals_loops_edges_tag(bm, true); + + const bool vertex_only = (bmd->flags & MOD_BEVEL_VERT) != 0; + const int cd_clnors_offset = CustomData_get_offset(&bm->ldata, CD_CUSTOMLOOPNORMAL); + const bool do_normal_to_recon = (hn_strength == 1.0f); + + BMFace *f; + BMLoop *l, *l_cur, *l_first; + BMIter fiter; + GHash *faceHash = bmd->clnordata.faceHash; + + /* Iterate throught all loops of a face */ + BM_ITER_MESH(f, &fiter, bm, BM_FACES_OF_MESH) { + + l_cur = l_first = BM_FACE_FIRST_LOOP(f); + do { + if ((!BM_elem_flag_test(l_cur->e, BM_ELEM_TAG)) || + (!BM_elem_flag_test(l_cur, BM_ELEM_TAG) && BM_loop_check_cyclic_smooth_fan(l_cur))) + { + + /* previous and next edge is sharp, accumulate face normals into loop */ + if (!BM_elem_flag_test(l_cur->e, BM_ELEM_TAG) && !BM_elem_flag_test(l_cur->prev->e, BM_ELEM_TAG)) { + const int loop_index = BM_elem_index_get(l_cur); + short *clnors = BM_ELEM_CD_GET_VOID_P(l_cur, cd_clnors_offset); + BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[loop_index], f->no, clnors); + } + else { + BMVert *v_pivot = l_cur->v; + BMEdge *e_next; + const BMEdge *e_org = l_cur->e; + BMLoop *lfan_pivot, *lfan_pivot_next; + UNUSED_VARS_NDEBUG(v_pivot); + + lfan_pivot = l_cur; + e_next = lfan_pivot->e; + BLI_SMALLSTACK_DECLARE(loops, BMLoop *); + float cn_wght[3] = { 0.0f, 0.0f, 0.0f }; + int recon_face_count = 0; /* Counts number of reconstructed faces current vert is connected to */ + BMFace *recon_face = NULL; /* Reconstructed face */ + + while (true) { + lfan_pivot_next = BM_vert_step_fan_loop(lfan_pivot, &e_next); + if (lfan_pivot_next) { + BLI_assert(lfan_pivot_next->v == v_pivot); + } + else { + e_next = (lfan_pivot->e == e_next) ? lfan_pivot->prev->e : lfan_pivot->e; + } + + BLI_SMALLSTACK_PUSH(loops, lfan_pivot); + + if (bmd->lim_flags & MOD_BEVEL_WEIGHT) { + int weight = BM_elem_float_data_get(&bm->edata, lfan_pivot->f, CD_BWEIGHT); + if (weight) { + if (hnmode == MOD_BEVEL_HN_FACE) { + float cur[3]; //Add area weighted face normals + mul_v3_v3fl(cur, lfan_pivot->f->no, BM_face_calc_area(lfan_pivot->f)); + add_v3_v3(cn_wght, cur); + } + else + add_v3_v3(cn_wght, lfan_pivot->f->no); //Else simply add face normals + } + else + add_v3_v3(cn_wght, lfan_pivot->f->no); + + } + else if (bmd->lim_flags & MOD_BEVEL_VGROUP) { + const bool has_vgroup = dvert != NULL; + const bool vert_of_group = ( + has_vgroup && + (defvert_find_index(&dvert[BM_elem_index_get(l->v)], vgroup) != NULL)); + + if (vert_of_group && hnmode == MOD_BEVEL_HN_FACE) { + float cur[3]; + mul_v3_v3fl(cur, lfan_pivot->f->no, BM_face_calc_area(lfan_pivot->f)); + add_v3_v3(cn_wght, cur); + } + else + add_v3_v3(cn_wght, lfan_pivot->f->no); + } + else { + float cur[3]; + mul_v3_v3fl(cur, lfan_pivot->f->no, BM_face_calc_area(lfan_pivot->f)); + add_v3_v3(cn_wght, cur); + } + if (!BLI_ghash_haskey(faceHash, lfan_pivot->f)) { + recon_face = f; + recon_face_count++; + } + if (!BM_elem_flag_test(e_next, BM_ELEM_TAG) || (e_next == e_org)) { + break; + } + lfan_pivot = lfan_pivot_next; + } + + normalize_v3(cn_wght); + mul_v3_fl(cn_wght, hn_strength); + float n_final[3]; + + while ((l = BLI_SMALLSTACK_POP(loops))) { + const int l_index = BM_elem_index_get(l); + short *clnors = BM_ELEM_CD_GET_VOID_P(l, cd_clnors_offset); + + /* If vertex is edge vert with 1 reconnected face */ + if (recon_face_count == 1 || (recon_face != NULL && do_normal_to_recon)) { + BKE_lnor_space_custom_normal_to_data( + bm->lnor_spacearr->lspacearr[l_index], recon_face->no, clnors); + } + else if (vertex_only == false || recon_face_count == 0) { + copy_v3_v3(n_final, l->f->no); + mul_v3_fl(n_final, 1.0f - hn_strength); + add_v3_v3(n_final, cn_wght); + normalize_v3(n_final); + BKE_lnor_space_custom_normal_to_data( + bm->lnor_spacearr->lspacearr[l_index], n_final, clnors); + } + else if (BLI_ghash_haskey(faceHash, l->f)) { + BKE_lnor_space_custom_normal_to_data( + bm->lnor_spacearr->lspacearr[l_index], l->v->no, clnors); + } + } + } + } + } while ((l_cur = l_cur->next) != l_first); + } +} + +static void bevel_fix_normal_shading_continuity(BevelModifierData *bmd, BMesh *bm) +{ + const bool vertex_only = (bmd->flags & MOD_BEVEL_VERT) != 0; + if (bmd->value == 0 || (bmd->clnordata.faceHash == NULL && vertex_only)) + return; + + BM_mesh_normals_update(bm); + BM_lnorspace_update(bm); + + GHash *faceHash = bmd->clnordata.faceHash; + BMEdge *e; + BMLoop *l; + BMIter liter, eiter; + + const int cd_clnors_offset = CustomData_get_offset(&bm->ldata, CD_CUSTOMLOOPNORMAL); + const float hn_strength = bmd->hn_strength; + float ref = 10.0f; + + BM_ITER_MESH(e, &eiter, bm, BM_EDGES_OF_MESH) { + BMFace *f_a, *f_b; + BM_edge_face_pair(e, &f_a, &f_b); + + bool has_f_a = false, has_f_b = false; + if (f_a) + has_f_a = BLI_ghash_haskey(faceHash, f_a); + if (f_b) + has_f_b = BLI_ghash_haskey(faceHash, f_b); + if (has_f_a ^ has_f_b) { + /* If one of both faces is present in faceHash then we are at a border + * between new vmesh created and reconstructed face */ + + for (int i = 0; i < 2; i++) { + BMVert *v = (i == 0) ? e->v1 : e->v2; + BM_ITER_ELEM(l, &liter, v, BM_LOOPS_OF_VERT) { + + if (l->f == f_a || l->f == f_b) { + const int l_index = BM_elem_index_get(l); + short *clnors = BM_ELEM_CD_GET_VOID_P(l, cd_clnors_offset); + float n_final[3], pow_a[3], pow_b[3]; + + zero_v3(n_final); + copy_v3_v3(pow_a, f_a->no); + copy_v3_v3(pow_b, f_b->no); + if (has_f_a) { + mul_v3_fl(pow_a, bmd->res / ref); + mul_v3_fl(pow_b, ref / bmd->res); + } + else { + mul_v3_fl(pow_b, bmd->res / ref); + mul_v3_fl(pow_a, ref / bmd->res); + } + add_v3_v3(n_final, pow_a); + add_v3_v3(n_final, pow_b); + normalize_v3(n_final); + + BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[l_index], n_final, clnors); + } + } + } + } + else if (has_f_a == true && has_f_b == true) { + /* Else if both faces are present we assign clnor corresponding + * to vert normal and face normal */ + for (int i = 0; i < 2; i++) { + BMVert *v = (i == 0) ? e->v1 : e->v2; + BM_ITER_ELEM(l, &liter, v, BM_LOOPS_OF_VERT) { + + if (l->f == f_a || l->f == f_b) { + const int l_index = BM_elem_index_get(l); + short *clnors = BM_ELEM_CD_GET_VOID_P(l, cd_clnors_offset); + float n_final[3], cn_wght[3]; + + copy_v3_v3(n_final, v->no); + mul_v3_fl(n_final, hn_strength); + + copy_v3_v3(cn_wght, l->f->no); + mul_v3_fl(cn_wght, 1.0f - hn_strength); + + add_v3_v3(n_final, cn_wght); + normalize_v3(n_final); + BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[l_index], n_final, clnors); + } + } + } + } + } +} + /* * 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 +361,26 @@ 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; + const bool mark_seam = (bmd->edge_flags & MOD_BEVEL_MARK_SEAM); + const bool mark_sharp = (bmd->edge_flags & MOD_BEVEL_MARK_SHARP); + const bool set_wn_strength = (bmd->flags & MOD_BEVEL_SET_WN_STR); + + struct Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); + + 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, + }); - bm = DM_to_bmesh(dm, true); if ((bmd->lim_flags & MOD_BEVEL_VGROUP) && bmd->defgrp_name[0]) - modifier_get_vgroup(ob, dm, bmd->defgrp_name, &dvert, &vgroup); + MOD_get_vgroup(ctx->object, mesh, bmd->defgrp_name, &dvert, &vgroup); if (vertex_only) { BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { @@ -158,16 +438,27 @@ static DerivedMesh *applyModifier( BM_mesh_bevel(bm, bmd->value, offset_type, bmd->res, bmd->profile, vertex_only, bmd->lim_flags & MOD_BEVEL_WEIGHT, do_clamp, - dvert, vgroup, mat, loop_slide); + dvert, vgroup, mat, loop_slide, mark_seam, mark_sharp, bmd->hnmode, &bmd->clnordata); + + if (bmd->hnmode != BEVEL_HN_FIX_SHA && bmd->hnmode != MOD_BEVEL_HN_NONE) { + bevel_mod_harden_normals(bmd, bm, bmd->hn_strength, bmd->hnmode, dvert, vgroup); + } + if (bmd->hnmode == BEVEL_HN_FIX_SHA) + bevel_fix_normal_shading_continuity(bmd, bm); + if (set_wn_strength) + bevel_set_weighted_normal_face_strength(bm, scene); - 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; + if (bmd->clnordata.faceHash) + BLI_ghash_free(bmd->clnordata.faceHash, NULL, NULL); + + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; return result; } @@ -184,20 +475,29 @@ ModifierTypeInfo modifierType_Bevel = { /* type */ eModifierTypeType_Constructive, /* flags */ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode | - eModifierTypeFlag_EnableInEditmode, + eModifierTypeFlag_EnableInEditmode | + eModifierTypeFlag_AcceptsCVs, + + /* copyData */ copyData, + + /* deformVerts_DM */ NULL, + /* deformMatrices_DM */ NULL, + /* deformVertsEM_DM */ NULL, + /* deformMatricesEM_DM*/NULL, + /* applyModifier_DM */ NULL, + /* applyModifierEM_DM */NULL, - /* copyData */ modifier_copyData_generic, /* 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..db1078fa677 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, bool 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..a0901b6d838 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, bool 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); + MOD_get_vgroup(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); + MOD_get_vgroup(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 = MOD_get_mesh_eval(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 = MOD_get_mesh_eval(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 ef41c5a270c..53e71bfc1a4 100644 --- a/source/blender/modifiers/intern/MOD_cloth.c +++ b/source/blender/modifiers/intern/MOD_cloth.c @@ -36,24 +36,27 @@ #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" #include "MEM_guardedalloc.h" +#include "BLI_listbase.h" #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_physics.h" +#include "DEG_depsgraph_query.h" #include "MOD_util.h" @@ -73,11 +76,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 +92,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 = MOD_get_mesh_eval(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,50 +113,32 @@ 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); + BKE_mesh_apply_vert_coords(mesh_src, vertexCos); - clothModifier_do(clmd, md->scene, ob, dm, vertexCos); - - dm->release(dm); -} + clothModifier_do(clmd, ctx->depsgraph, scene, ctx->object, mesh_src, vertexCos); -static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - ClothModifierData *clmd = (ClothModifierData *) md; - - 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) { 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_forcefield_relations(ctx->node, ctx->scene, ctx->object, clmd->sim_parms->effector_weights, true, 0, "Cloth Field"); + DEG_add_collision_relations(ctx->node, ctx->object, clmd->coll_parms->group, eModifierType_Collision, NULL, "Cloth Collision"); + DEG_add_forcefield_relations(ctx->node, ctx->object, clmd->sim_parms->effector_weights, true, 0, "Cloth Field"); } } @@ -158,7 +156,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) return dataMask; } -static void copyData(const ModifierData *md, ModifierData *target) +static void copyData(const ModifierData *md, ModifierData *target, const int flag) { const ClothModifierData *clmd = (const ClothModifierData *) md; ClothModifierData *tclmd = (ClothModifierData *) target; @@ -173,14 +171,21 @@ static void copyData(const ModifierData *md, ModifierData *target) MEM_freeN(tclmd->coll_parms); BKE_ptcache_free_list(&tclmd->ptcaches); - tclmd->point_cache = NULL; + if (flag & LIB_ID_CREATE_NO_MAIN) { + /* Share the cache with the original object's modifier. */ + tclmd->modifier.flag |= eModifierFlag_SharedCaches; + tclmd->ptcaches = clmd->ptcaches; + tclmd->point_cache = clmd->point_cache; + } + else { + tclmd->point_cache = BKE_ptcache_add(&tclmd->ptcaches); + tclmd->point_cache->step = 1; + } tclmd->sim_parms = MEM_dupallocN(clmd->sim_parms); if (clmd->sim_parms->effector_weights) tclmd->sim_parms->effector_weights = MEM_dupallocN(clmd->sim_parms->effector_weights); tclmd->coll_parms = MEM_dupallocN(clmd->coll_parms); - tclmd->point_cache = BKE_ptcache_add(&tclmd->ptcaches); - tclmd->point_cache->step = 1; tclmd->clothObject = NULL; tclmd->hairdata = NULL; tclmd->solver_result = NULL; @@ -209,7 +214,12 @@ static void freeData(ModifierData *md) if (clmd->coll_parms) MEM_freeN(clmd->coll_parms); - BKE_ptcache_free_list(&clmd->ptcaches); + if (md->flag & eModifierFlag_SharedCaches) { + BLI_listbase_clear(&clmd->ptcaches); + } + else { + BKE_ptcache_free_list(&clmd->ptcaches); + } clmd->point_cache = NULL; if (clmd->hairdata) @@ -245,17 +255,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..5a73d62433b 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 = MOD_get_mesh_eval(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..d59360896e8 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" @@ -80,12 +80,12 @@ static void initData(ModifierData *md) } -static void copyData(const ModifierData *md, ModifierData *target) +static void copyData(const ModifierData *md, ModifierData *target, const int flag) { const CorrectiveSmoothModifierData *csmd = (const CorrectiveSmoothModifierData *)md; CorrectiveSmoothModifierData *tcsmd = (CorrectiveSmoothModifierData *)target; - modifier_copyData_generic(md, target); + modifier_copyData_generic(md, target, flag); if (csmd->bind_coords) { tcsmd->bind_coords = MEM_dupallocN(csmd->bind_coords); @@ -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); + MOD_get_vgroup(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 = MOD_get_mesh_eval(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 = MOD_get_mesh_eval(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..b74b63e2478 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, bool 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 = MOD_get_mesh_eval(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 = MOD_get_mesh_eval(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..ac45ce8732d 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, bool 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..9e35746c0a3 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); + MOD_get_vgroup(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..1b8b7120058 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, bool 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; + MOD_get_vgroup(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); + MOD_get_texture_coords((MappingInfoModifierData *)dmd, ob, mesh, vertexCos, tex_co); - modifier_init_texture(dmd->modifier.scene, dmd->texture); + MOD_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 = MOD_get_mesh_eval(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 = MOD_get_mesh_eval(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..61219096b43 100644 --- a/source/blender/modifiers/intern/MOD_dynamicpaint.c +++ b/source/blender/modifiers/intern/MOD_dynamicpaint.c @@ -36,14 +36,15 @@ #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_physics.h" +#include "DEG_depsgraph_query.h" #include "MOD_modifiertypes.h" @@ -56,7 +57,7 @@ static void initData(ModifierData *md) pmd->type = MOD_DYNAMICPAINT_TYPE_CANVAS; } -static void copyData(const ModifierData *md, ModifierData *target) +static void copyData(const ModifierData *md, ModifierData *target, const int UNUSED(flag)) { const DynamicPaintModifierData *pmd = (const DynamicPaintModifierData *)md; DynamicPaintModifierData *tpmd = (DynamicPaintModifierData *)target; @@ -82,7 +83,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 +97,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 +119,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; @@ -152,11 +126,11 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte if (pmd->canvas != NULL) { for (DynamicPaintSurface *surface = pmd->canvas->surfaces.first; surface; surface = surface->next) { if (surface->effect & MOD_DPAINT_EFFECT_DO_DRIP) { - DEG_add_forcefield_relations(ctx->node, ctx->scene, ctx->object, surface->effector_weights, true, 0, "Dynamic Paint Field"); + DEG_add_forcefield_relations(ctx->node, ctx->object, surface->effector_weights, true, 0, "Dynamic Paint Field"); } /* 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->object, surface->brush_group, eModifierType_DynamicPaint, is_brush_cb, "Dynamic Paint Brush"); } } } @@ -183,9 +157,6 @@ static void foreachIDLink( } } } - if (pmd->brush) { - walk(userData, ob, (ID **)&pmd->brush->mat, IDWALK_CB_USER); - } } static void foreachTexLink( @@ -207,17 +178,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..04bfe96bc59 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" @@ -68,14 +70,14 @@ static void freeData(ModifierData *md) MEM_SAFE_FREE(emd->facepa); } -static void copyData(const ModifierData *md, ModifierData *target) +static void copyData(const ModifierData *md, ModifierData *target, const int flag) { #if 0 const ExplodeModifierData *emd = (const ExplodeModifierData *) md; #endif ExplodeModifierData *temd = (ExplodeModifierData *) target; - modifier_copyData_generic(md, target); + modifier_copyData_generic(md, target, flag); temd->facepa = NULL; } @@ -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..ebea7250d18 100644 --- a/source/blender/modifiers/intern/MOD_fluidsim.c +++ b/source/blender/modifiers/intern/MOD_fluidsim.c @@ -33,17 +33,16 @@ */ +#include "DNA_mesh_types.h" #include "DNA_scene_types.h" #include "DNA_object_fluidsim_types.h" #include "DNA_object_types.h" #include "BLI_utildefines.h" - -#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" @@ -65,70 +64,49 @@ static void freeData(ModifierData *md) fluidsim_free(fluidmd); } -static void copyData(const ModifierData *md, ModifierData *target) +static void copyData(const ModifierData *md, ModifierData *target, const int UNUSED(flag)) { const FluidsimModifierData *fluidmd = (const FluidsimModifierData *) md; FluidsimModifierData *tfluidmd = (FluidsimModifierData *) target; - if (fluidmd->fss) { - tfluidmd->fss = MEM_dupallocN(fluidmd->fss); - if (tfluidmd->fss && (tfluidmd->fss->meshVelocities != NULL)) { - tfluidmd->fss->meshVelocities = MEM_dupallocN(tfluidmd->fss->meshVelocities); - } + /* Free any FSS that was allocated in initData() */ + if (tfluidmd->fss) { + MEM_SAFE_FREE(tfluidmd->fss->meshVelocities); + MEM_freeN(tfluidmd->fss); + } + + if (fluidmd->fss == NULL) { + tfluidmd->fss = NULL; + return; } - /* Seems to never be used, but for sqke of consistency... */ - BLI_assert(fluidmd->point_cache == NULL); - BLI_assert(tfluidmd->point_cache == NULL); - tfluidmd->point_cache = NULL; + tfluidmd->fss = MEM_dupallocN(fluidmd->fss); + if (tfluidmd->fss->meshVelocities != NULL) { + tfluidmd->fss->meshVelocities = MEM_dupallocN(tfluidmd->fss->meshVelocities); + } } -static DerivedMesh *applyModifier( - ModifierData *md, Object *ob, - DerivedMesh *dm, - ModifierApplyFlag flag) +static Mesh *applyModifier( + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *mesh) { FluidsimModifierData *fluidmd = (FluidsimModifierData *) md; - DerivedMesh *result = NULL; + Mesh *result = NULL; /* check for alloc failing */ if (!fluidmd->fss) { initData(md); if (!fluidmd->fss) { - return dm; + return mesh; } } - result = fluidsimModifier_do(fluidmd, md->scene, ob, dm, flag & MOD_APPLY_RENDER, flag & MOD_APPLY_USECACHE); + result = fluidsimModifier_do(fluidmd, ctx, mesh); - 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"); - } - } - } - } - } + return result ? result : mesh; } static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) @@ -136,9 +114,8 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte 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 +126,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte } } } + FOREACH_SCENE_OBJECT_END; } } } @@ -170,17 +148,25 @@ ModifierTypeInfo modifierType_Fluidsim = { eModifierTypeFlag_Single, /* 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 */ 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..44079163de5 100644 --- a/source/blender/modifiers/intern/MOD_fluidsim_util.c +++ b/source/blender/modifiers/intern/MOD_fluidsim_util.c @@ -47,12 +47,15 @@ #include "BLI_utildefines.h" #include "BKE_fluidsim.h" /* ensure definitions here match */ -#include "BKE_cdderivedmesh.h" #include "BKE_main.h" +#include "BKE_mesh.h" #ifdef WITH_MOD_FLUID # include "BKE_global.h" #endif +#include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" + #include "MOD_fluidsim_util.h" #include "MOD_modifiertypes.h" @@ -157,22 +160,18 @@ void fluidsim_free(FluidsimModifierData *fluidmd) MEM_SAFE_FREE(fluidmd->fss); } - /* Seems to never be used, but for sqke of consistency... */ - BLI_assert(fluidmd->point_cache == NULL); - fluidmd->point_cache = NULL; - return; } #ifdef WITH_MOD_FLUID /* read .bobj.gz file into a fluidsimDerivedMesh struct */ -static DerivedMesh *fluidsim_read_obj(const char *filename, const MPoly *mp_example) +static Mesh *fluidsim_read_obj(const char *filename, const MPoly *mp_example) { int wri = 0, i; int gotBytes; gzFile gzf; int numverts = 0, numfaces = 0; - DerivedMesh *dm = NULL; + Mesh *mesh = NULL; MPoly *mp; MLoop *ml; MVert *mv; @@ -221,9 +220,9 @@ static DerivedMesh *fluidsim_read_obj(const char *filename, const MPoly *mp_exam return NULL; } - dm = CDDM_new(numverts, 0, 0, numfaces * 3, numfaces); + mesh = BKE_mesh_new_nomain(numverts, 0, 0, numfaces * 3, numfaces); - if (!dm) { + if (!mesh) { gzclose(gzf); return NULL; } @@ -232,7 +231,7 @@ static DerivedMesh *fluidsim_read_obj(const char *filename, const MPoly *mp_exam gotBytes = gzread(gzf, &wri, sizeof(wri)); /* read vertex position from file */ - mv = CDDM_get_verts(dm); + mv = mesh->mvert; for (i = 0; i < numverts; i++, mv++) gotBytes = gzread(gzf, mv->co, sizeof(float) * 3); @@ -240,16 +239,16 @@ static DerivedMesh *fluidsim_read_obj(const char *filename, const MPoly *mp_exam /* should be the same as numverts */ gotBytes = gzread(gzf, &wri, sizeof(wri)); if (wri != numverts) { - if (dm) - dm->release(dm); + if (mesh) + BKE_id_free(NULL, mesh); gzclose(gzf); return NULL; } normals = MEM_calloc_arrayN(numverts, 3 * sizeof(short), "fluid_tmp_normals"); if (!normals) { - if (dm) - dm->release(dm); + if (mesh) + BKE_id_free(NULL, mesh); gzclose(gzf); return NULL; } @@ -265,16 +264,16 @@ static DerivedMesh *fluidsim_read_obj(const char *filename, const MPoly *mp_exam if (wri != numfaces) { printf("Fluidsim: error in reading data from file.\n"); - if (dm) - dm->release(dm); + if (mesh) + BKE_id_free(NULL, mesh); gzclose(gzf); MEM_freeN(normals); return NULL; } /* read triangles from file */ - mp = CDDM_get_polys(dm); - ml = CDDM_get_loops(dm); + mp = mesh->mpoly; + ml = mesh->mloop; for (i = 0; i < numfaces; i++, mp++, ml += 3) { int face[3]; @@ -295,13 +294,12 @@ static DerivedMesh *fluidsim_read_obj(const char *filename, const MPoly *mp_exam gzclose(gzf); - CDDM_calc_edges(dm); - - CDDM_apply_vert_normals(dm, (short (*)[3])normals); + BKE_mesh_calc_edges(mesh, false, false); + BKE_mesh_apply_vert_normals(mesh, (short (*)[3])normals); MEM_freeN(normals); // CDDM_calc_normals(result); - return dm; + return mesh; } @@ -371,14 +369,14 @@ void fluid_estimate_memory(Object *ob, FluidsimSettings *fss, char *value) /* read zipped fluidsim velocities into the co's of the fluidsimsettings normals struct */ -static void fluidsim_read_vel_cache(FluidsimModifierData *fluidmd, DerivedMesh *dm, char *filename) +static void fluidsim_read_vel_cache(FluidsimModifierData *fluidmd, Mesh *mesh, char *filename) { int wri, i, j; float wrf; gzFile gzf; FluidsimSettings *fss = fluidmd->fss; int len = strlen(filename); - int totvert = dm->getNumVerts(dm); + int totvert = mesh->totvert; FluidVertexVelocity *velarray = NULL; /* mesh and vverts have to be valid from loading... */ @@ -392,7 +390,7 @@ static void fluidsim_read_vel_cache(FluidsimModifierData *fluidmd, DerivedMesh * if (fss->domainNovecgen > 0) return; - fss->meshVelocities = MEM_calloc_arrayN(dm->getNumVerts(dm), sizeof(FluidVertexVelocity), "Fluidsim_velocities"); + fss->meshVelocities = MEM_calloc_arrayN(mesh->totvert, sizeof(FluidVertexVelocity), "Fluidsim_velocities"); fss->totvert = totvert; velarray = fss->meshVelocities; @@ -427,8 +425,8 @@ static void fluidsim_read_vel_cache(FluidsimModifierData *fluidmd, DerivedMesh * gzclose(gzf); } -static DerivedMesh *fluidsim_read_cache( - Object *ob, DerivedMesh *orgdm, +static Mesh *fluidsim_read_cache( + Object *ob, Mesh *orgmesh, FluidsimModifierData *fluidmd, int framenr, int useRenderParams) { int curFrame = framenr /* - 1 */ /*scene->r.sfra*/; /* start with 0 at start frame */ @@ -437,7 +435,7 @@ static DerivedMesh *fluidsim_read_cache( char targetFile[FILE_MAX]; FluidsimSettings *fss = fluidmd->fss; - DerivedMesh *dm = NULL; + Mesh *newmesh = NULL; MPoly *mpoly; MPoly mp_example = {0}; @@ -466,17 +464,17 @@ static DerivedMesh *fluidsim_read_cache( BLI_path_abs(targetFile, modifier_path_relbase_from_global(ob)); BLI_path_frame(targetFile, curFrame, 0); // fixed #frame-no - /* assign material + flags to new dm - * if there's no faces in original dm, keep materials and flags unchanged */ - mpoly = orgdm->getPolyArray(orgdm); + /* assign material + flags to new mesh. + * if there's no faces in original mesh, keep materials and flags unchanged */ + mpoly = orgmesh->mpoly; if (mpoly) { mp_example = *mpoly; } /* else leave NULL'd */ - dm = fluidsim_read_obj(targetFile, &mp_example); + newmesh = fluidsim_read_obj(targetFile, &mp_example); - if (!dm) { + if (!newmesh) { /* switch, abort background rendering when fluidsim mesh is missing */ const char *strEnvName2 = "BLENDER_ELBEEMBOBJABORT"; // from blendercall.cpp @@ -491,7 +489,7 @@ static DerivedMesh *fluidsim_read_cache( } } - /* display org. object upon failure which is in dm */ + /* display org. object upon failure which is in new mesh */ return NULL; } @@ -499,7 +497,7 @@ static DerivedMesh *fluidsim_read_cache( * TODO? use generate flag as loading flag as well? * warning, needs original .bobj.gz mesh loading filename */ if (displaymode == OB_FSDOM_FINAL) { - fluidsim_read_vel_cache(fluidmd, dm, targetFile); + fluidsim_read_vel_cache(fluidmd, newmesh, targetFile); } else { if (fss->meshVelocities) @@ -508,30 +506,33 @@ static DerivedMesh *fluidsim_read_cache( fss->meshVelocities = NULL; } - return dm; + return newmesh; } #endif // WITH_MOD_FLUID -DerivedMesh *fluidsimModifier_do( - FluidsimModifierData *fluidmd, Scene *scene, - Object *ob, - DerivedMesh *dm, - int useRenderParams, int UNUSED(isFinalCalc)) +Mesh *fluidsimModifier_do( + FluidsimModifierData *fluidmd, + const ModifierEvalContext *ctx, + Mesh *mesh) { #ifdef WITH_MOD_FLUID - DerivedMesh *result = NULL; + 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; + Mesh *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)) - return dm; + return mesh; /* sanity check */ if (!fluidmd || !fluidmd->fss) - return dm; + return mesh; fss = fluidmd->fss; @@ -546,17 +547,13 @@ DerivedMesh *fluidsimModifier_do( /* try to read from cache */ /* if the frame is there, fine, otherwise don't do anything */ - if ((result = fluidsim_read_cache(ob, dm, fluidmd, framenr, useRenderParams))) + if ((result = fluidsim_read_cache(ob, mesh, fluidmd, framenr, useRenderParams))) return result; - return dm; + return mesh; #else /* unused */ - (void)fluidmd; - (void)scene; - (void)ob; - (void)dm; - (void)useRenderParams; + UNUSED_VARS(fluidmd, ctx, mesh); return NULL; #endif } diff --git a/source/blender/modifiers/intern/MOD_fluidsim_util.h b/source/blender/modifiers/intern/MOD_fluidsim_util.h index 2bb1da32718..041a67eddbd 100644 --- a/source/blender/modifiers/intern/MOD_fluidsim_util.h +++ b/source/blender/modifiers/intern/MOD_fluidsim_util.h @@ -36,15 +36,16 @@ struct Object; struct Scene; struct FluidsimModifierData; -struct DerivedMesh; +struct Mesh; +struct ModifierEvalContext; /* new fluid-modifier interface */ void fluidsim_init(struct FluidsimModifierData *fluidmd); void fluidsim_free(struct FluidsimModifierData *fluidmd); -struct DerivedMesh *fluidsimModifier_do( +struct Mesh *fluidsimModifier_do( struct FluidsimModifierData *fluidmd, - struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, - int useRenderParams, int isFinalCalc); + const struct ModifierEvalContext *ctx, + struct Mesh *dm); #endif diff --git a/source/blender/modifiers/intern/MOD_hook.c b/source/blender/modifiers/intern/MOD_hook.c index 5bbcaee2caa..a1629d8c1f2 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" @@ -62,12 +63,12 @@ static void initData(ModifierData *md) hmd->flag = 0; } -static void copyData(const ModifierData *md, ModifierData *target) +static void copyData(const ModifierData *md, ModifierData *target, const int flag) { const HookModifierData *hmd = (const HookModifierData *) md; HookModifierData *thmd = (HookModifierData *) target; - modifier_copyData_generic(md, target); + modifier_copyData_generic(md, target, flag); thmd->curfalloff = curvemapping_copy(hmd->curfalloff); @@ -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, bool 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); + MOD_get_vgroup(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 = MOD_get_mesh_eval(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 = MOD_get_mesh_eval(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..2406739e6df 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); + MOD_get_vgroup(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); + MOD_get_vgroup(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); + MOD_get_vgroup(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); } @@ -699,18 +704,18 @@ static void initData(ModifierData *md) lmd->flag = 0; } -static void copyData(const ModifierData *md, ModifierData *target) +static void copyData(const ModifierData *md, ModifierData *target, const int flag) { const LaplacianDeformModifierData *lmd = (const LaplacianDeformModifierData *)md; LaplacianDeformModifierData *tlmd = (LaplacianDeformModifierData *)target; - modifier_copyData_generic(md, target); + modifier_copyData_generic(md, target, flag); tlmd->vertexco = MEM_dupallocN(lmd->vertexco); tlmd->cache_system = NULL; } -static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, bool 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 = MOD_get_mesh_eval(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 = MOD_get_mesh_eval(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..19838a2b637 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, bool 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); + MOD_get_vgroup(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, bool 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 = MOD_get_mesh_eval(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 = MOD_get_mesh_eval(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..3acd39bf19d 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, bool 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 = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false); + MOD_previous_vcos_store(md, vertexCos); /* if next modifier needs original vertices */ - 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 = MOD_get_mesh_eval(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..3263641896f 100644 --- a/source/blender/modifiers/intern/MOD_meshcache.c +++ b/source/blender/modifiers/intern/MOD_meshcache.c @@ -36,12 +36,13 @@ #include "BLI_path_util.h" #include "BLI_math.h" -#include "BKE_DerivedMesh.h" #include "BKE_scene.h" #include "BKE_global.h" #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 +71,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, bool UNUSED(useRenderParams)) { MeshCacheModifierData *mcmd = (MeshCacheModifierData *) md; @@ -80,7 +81,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, float (*vertexCos_Real)[3], int numVerts) { const bool use_factor = mcmd->factor < 1.0f; @@ -88,7 +89,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 +264,28 @@ static void meshcache_do( } static void deformVerts( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, + ModifierData *md, const ModifierEvalContext *ctx, + Mesh *UNUSED(mesh), 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, vertexCos, numVerts); } static void deformVertsEM( - ModifierData *md, Object *ob, struct BMEditMesh *UNUSED(editData), - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) + ModifierData *md, const ModifierEvalContext *ctx, + struct BMEditMesh *UNUSED(editData), + Mesh *UNUSED(mesh), + 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, vertexCos, numVerts); } @@ -295,17 +299,25 @@ ModifierTypeInfo modifierType_MeshCache = { 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 */ 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..9bfbbc4e44e 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__ @@ -78,12 +81,12 @@ static void freeData(ModifierData *md) if (mmd->bindcos) MEM_freeN(mmd->bindcos); /* deprecated */ } -static void copyData(const ModifierData *md, ModifierData *target) +static void copyData(const ModifierData *md, ModifierData *target, const int flag) { const MeshDeformModifierData *mmd = (const MeshDeformModifierData *) md; MeshDeformModifierData *tmmd = (MeshDeformModifierData *) target; - modifier_copyData_generic(md, target); + modifier_copyData_generic(md, target, flag); if (mmd->bindinfluences) tmmd->bindinfluences = MEM_dupallocN(mmd->bindinfluences); if (mmd->bindoffsets) tmmd->bindoffsets = MEM_dupallocN(mmd->bindoffsets); @@ -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, bool 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); + MOD_get_vgroup(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 = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false); - modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */ + MOD_previous_vcos_store(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 = MOD_get_mesh_eval(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..cef55bf467b 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" @@ -56,14 +55,14 @@ static void initData(ModifierData *md) mcmd->read_flag = MOD_MESHSEQ_READ_ALL; } -static void copyData(const ModifierData *md, ModifierData *target) +static void copyData(const ModifierData *md, ModifierData *target, const int flag) { #if 0 const MeshSeqCacheModifierData *mcmd = (const MeshSeqCacheModifierData *)md; #endif MeshSeqCacheModifierData *tmcmd = (MeshSeqCacheModifierData *)target; - modifier_copyData_generic(md, target); + modifier_copyData_generic(md, target, flag); tmcmd->reader = NULL; } @@ -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, bool 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..24495efa08d 100644 --- a/source/blender/modifiers/intern/MOD_multires.c +++ b/source/blender/modifiers/intern/MOD_multires.c @@ -37,6 +37,7 @@ #include "DNA_mesh_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "BLI_utildefines.h" @@ -44,8 +45,11 @@ #include "BKE_mesh.h" #include "BKE_multires.h" #include "BKE_modifier.h" +#include "BKE_subdiv.h" #include "BKE_subsurf.h" +#include "DEG_depsgraph_query.h" + #include "MOD_modifiertypes.h" static void initData(ModifierData *md) @@ -56,17 +60,20 @@ static void initData(ModifierData *md) mmd->sculptlvl = 0; mmd->renderlvl = 0; mmd->totlvl = 0; + mmd->uv_smooth = SUBSURF_UV_SMOOTH_PRESERVE_CORNERS; + mmd->quality = 3; } 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 +93,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); @@ -134,6 +141,42 @@ static DerivedMesh *applyModifier( return result; } +#ifdef WITH_OPENSUBDIV_MODIFIER +static Mesh *applyModifier_subdiv(ModifierData *md, + const ModifierEvalContext *ctx, + Mesh *mesh) +{ + const bool use_render_params = (ctx->flag & MOD_APPLY_RENDER); + const bool ignore_simplify = (ctx->flag & MOD_APPLY_IGNORE_SIMPLIFY); + const Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); + Object *object = ctx->object; + Mesh *result = mesh; + MultiresModifierData *mmd = (MultiresModifierData *)md; + SubdivSettings subdiv_settings; + BKE_multires_subdiv_settings_init(&subdiv_settings, mmd); + SubdivToMeshSettings mesh_settings; + BKE_multires_subdiv_mesh_settings_init( + &mesh_settings, scene, object, mmd, use_render_params, ignore_simplify); + if (subdiv_settings.level == 0 || mesh_settings.resolution < 3) { + /* NOTE: Shouldn't really happen, is supposed to be catched by + * isDisabled() callback. + */ + return result; + } + /* TODO(sergey): Try to re-use subdiv when possible. */ + Subdiv *subdiv = BKE_subdiv_new_from_mesh(&subdiv_settings, mesh); + if (subdiv == NULL) { + /* Happens on bad topology, ut also on empty input mesh. */ + return result; + } + BKE_subdiv_displacement_attach_from_multires(subdiv, mesh, mmd); + result = BKE_subdiv_to_mesh(subdiv, &mesh_settings, mesh); + /* TODO(sergey): Cache subdiv somehow. */ + // BKE_subdiv_stats_print(&subdiv->stats); + BKE_subdiv_free(subdiv); + return result; +} +#endif ModifierTypeInfo modifierType_Multires = { /* name */ "Multires", @@ -145,17 +188,29 @@ 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, +#ifdef WITH_OPENSUBDIV_MODIFIER + /* applyModifier */ applyModifier_subdiv, +#else + /* applyModifier */ NULL, +#endif /* 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..7a6a5b94b8e 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), bool 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..14af389668c 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); + MOD_get_vgroup(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, bool 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 b845e62c530..12845b27166 100644 --- a/source/blender/modifiers/intern/MOD_ocean.c +++ b/source/blender/modifiers/intern/MOD_ocean.c @@ -31,6 +31,7 @@ #include "DNA_customdata_types.h" #include "DNA_object_types.h" +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_scene_types.h" @@ -40,12 +41,14 @@ #include "BLI_task.h" #include "BLI_utildefines.h" -#include "BKE_cdderivedmesh.h" #include "BKE_global.h" #include "BKE_main.h" +#include "BKE_mesh.h" #include "BKE_modifier.h" #include "BKE_ocean.h" +#include "DEG_depsgraph_query.h" + #include "MOD_modifiertypes.h" #ifdef WITH_OCEANSIM @@ -58,38 +61,8 @@ static void init_cache_data(Object *ob, struct OceanModifierData *omd) omd->chop_amount, omd->foam_coverage, omd->foam_fade, omd->resolution); } -static void clear_cache_data(struct OceanModifierData *omd) -{ - BKE_ocean_free_cache(omd->oceancache); - omd->oceancache = NULL; - omd->cached = false; -} - -/* keep in sync with init_ocean_modifier_bake(), object_modifier.c */ -static void init_ocean_modifier(struct OceanModifierData *omd) -{ - int do_heightfield, do_chop, do_normals, do_jacobian; - - if (!omd || !omd->ocean) return; - - do_heightfield = true; - do_chop = (omd->chop_amount > 0); - do_normals = (omd->flag & MOD_OCEAN_GENERATE_NORMALS); - do_jacobian = (omd->flag & MOD_OCEAN_GENERATE_FOAM); - - BKE_ocean_free_data(omd->ocean); - BKE_ocean_init(omd->ocean, omd->resolution * omd->resolution, omd->resolution * omd->resolution, - omd->spatial_size, omd->spatial_size, - omd->wind_velocity, omd->smallest_wave, 1.0, omd->wave_direction, omd->damp, omd->wave_alignment, - omd->depth, omd->time, - do_heightfield, do_chop, do_normals, do_jacobian, - omd->seed); -} - static void simulate_ocean_modifier(struct OceanModifierData *omd) { - if (!omd || !omd->ocean) return; - BKE_ocean_simulate(omd->ocean, omd->time, omd->wave_scale, omd->chop_amount); } #endif /* WITH_OCEANSIM */ @@ -123,8 +96,6 @@ static void initData(ModifierData *md) omd->seed = 0; omd->time = 1.0; - omd->refresh = 0; - omd->size = 1.0; omd->repeat_x = 1; omd->repeat_y = 1; @@ -139,7 +110,7 @@ static void initData(ModifierData *md) omd->foamlayername[0] = '\0'; /* layer name empty by default */ omd->ocean = BKE_ocean_add(); - init_ocean_modifier(omd); + BKE_ocean_init_from_modifier(omd->ocean, omd); simulate_ocean_modifier(omd); #else /* WITH_OCEANSIM */ /* unused */ @@ -161,7 +132,7 @@ static void freeData(ModifierData *md) #endif /* WITH_OCEANSIM */ } -static void copyData(const ModifierData *md, ModifierData *target) +static void copyData(const ModifierData *md, ModifierData *target, const int flag) { #ifdef WITH_OCEANSIM #if 0 @@ -169,21 +140,20 @@ static void copyData(const ModifierData *md, ModifierData *target) #endif OceanModifierData *tomd = (OceanModifierData *) target; - modifier_copyData_generic(md, target); - - tomd->refresh = 0; + modifier_copyData_generic(md, target, flag); - /* XXX todo: copy cache runtime too */ - tomd->cached = 0; + /* The oceancache object will be recreated for this copy + * automatically when cached=true */ tomd->oceancache = NULL; tomd->ocean = BKE_ocean_add(); - init_ocean_modifier(tomd); + BKE_ocean_init_from_modifier(tomd->ocean, tomd); simulate_ocean_modifier(tomd); #else /* WITH_OCEANSIM */ /* unused */ (void)md; (void)target; + (void)flag; #endif /* WITH_OCEANSIM */ } @@ -341,9 +311,9 @@ static void generate_ocean_geometry_uvs( } } -static DerivedMesh *generate_ocean_geometry(OceanModifierData *omd) +static Mesh *generate_ocean_geometry(OceanModifierData *omd) { - DerivedMesh *result; + Mesh *result; GenerateOceanGeometryData gogd; @@ -368,13 +338,13 @@ static DerivedMesh *generate_ocean_geometry(OceanModifierData *omd) gogd.sx /= gogd.rx; gogd.sy /= gogd.ry; - result = CDDM_new(num_verts, 0, 0, num_polys * 4, num_polys); + result = BKE_mesh_new_nomain(num_verts, 0, 0, num_polys * 4, num_polys); - gogd.mverts = CDDM_get_verts(result); - gogd.mpolys = CDDM_get_polys(result); - gogd.mloops = CDDM_get_loops(result); + gogd.mverts = result->mvert; + gogd.mpolys = result->mpoly; + gogd.mloops = result->mloop; - gogd.origindex = CustomData_get_layer(&result->polyData, CD_ORIGINDEX); + gogd.origindex = CustomData_get_layer(&result->pdata, CD_ORIGINDEX); ParallelRangeSettings settings; BLI_parallel_range_settings_defaults(&settings); @@ -386,12 +356,11 @@ static DerivedMesh *generate_ocean_geometry(OceanModifierData *omd) /* create faces */ BLI_task_parallel_range(0, gogd.res_y, &gogd, generate_ocean_geometry_polygons, &settings); - CDDM_calc_edges(result); + BKE_mesh_calc_edges(result, false, false); /* 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 (CustomData_number_of_layers(&result->ldata, CD_MLOOPUV) < MAX_MTFACE) { + gogd.mloopuvs = CustomData_add_layer(&result->ldata, CD_MLOOPUV, CD_CALLOC, NULL, num_polys * 4); if (gogd.mloopuvs) { /* unlikely to fail */ gogd.ix = 1.0 / gogd.rx; @@ -401,24 +370,24 @@ static DerivedMesh *generate_ocean_geometry(OceanModifierData *omd) } } - result->dirty |= DM_DIRTY_NORMALS; + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; return result; } -static DerivedMesh *doOcean( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, - int UNUSED(useRenderParams)) +static Mesh *doOcean(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh) { OceanModifierData *omd = (OceanModifierData *) md; + int cfra_scene = (int)DEG_get_ctime(ctx->depsgraph); + Object *ob = ctx->object; + bool allocated_ocean = false; - DerivedMesh *dm = NULL; + Mesh *result = NULL; OceanResult ocr; MVert *mverts; - int cfra; + int cfra_for_cache; int i, j; /* use cached & inverted value for speed @@ -431,55 +400,57 @@ static DerivedMesh *doOcean( /* can happen in when size is small, avoid bad array lookups later and quit now */ if (!isfinite(size_co_inv)) { - return derivedData; - } - - /* update modifier */ - if (omd->refresh & MOD_OCEAN_REFRESH_RESET) { - init_ocean_modifier(omd); - } - if (omd->refresh & MOD_OCEAN_REFRESH_CLEAR_CACHE) { - clear_cache_data(omd); + return mesh; } - omd->refresh = 0; /* do ocean simulation */ if (omd->cached == true) { if (!omd->oceancache) { init_cache_data(ob, omd); } - BKE_ocean_simulate_cache(omd->oceancache, md->scene->r.cfra); + BKE_ocean_simulate_cache(omd->oceancache, cfra_scene); } else { + /* omd->ocean is NULL on an original object (in contrast to an evaluated one). + * We can create a new one, but we have to free it as well once we're done. + * This function is only called on an original object when applying the modifier + * using the 'Apply Modifier' button, and thus it is not called frequently for + * simulation. */ + allocated_ocean |= BKE_ocean_ensure(omd); simulate_ocean_modifier(omd); } if (omd->geometry_mode == MOD_OCEAN_GEOM_GENERATE) { - dm = generate_ocean_geometry(omd); - DM_ensure_normals(dm); + result = generate_ocean_geometry(omd); + BKE_mesh_ensure_normals(result); } else if (omd->geometry_mode == MOD_OCEAN_GEOM_DISPLACE) { - dm = CDDM_copy(derivedData); + 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); } - cfra = md->scene->r.cfra; - CLAMP(cfra, omd->bakestart, omd->bakeend); - cfra -= omd->bakestart; /* shift to 0 based */ + cfra_for_cache = cfra_scene; + CLAMP(cfra_for_cache, omd->bakestart, omd->bakeend); + cfra_for_cache -= omd->bakestart; /* shift to 0 based */ - mverts = dm->getVertArray(dm); + mverts = result->mvert; /* add vcols before displacement - allows lookup based on position */ if (omd->flag & MOD_OCEAN_GENERATE_FOAM) { - if (CustomData_number_of_layers(&dm->loopData, CD_MLOOPCOL) < MAX_MCOL) { - const int num_polys = dm->getNumPolys(dm); - const int num_loops = dm->getNumLoops(dm); - MLoop *mloops = dm->getLoopArray(dm); + if (CustomData_number_of_layers(&result->ldata, CD_MLOOPCOL) < MAX_MCOL) { + const int num_polys = result->totpoly; + const int num_loops = result->totloop; + MLoop *mloops = result->mloop; MLoopCol *mloopcols = CustomData_add_layer_named( - &dm->loopData, CD_MLOOPCOL, CD_CALLOC, NULL, num_loops, omd->foamlayername); + &result->ldata, CD_MLOOPCOL, CD_CALLOC, NULL, num_loops, omd->foamlayername); if (mloopcols) { /* unlikely to fail */ - MPoly *mpolys = dm->getPolyArray(dm); + MPoly *mpolys = result->mpoly; MPoly *mp; for (i = 0, mp = mpolys; i < num_polys; i++, mp++) { @@ -493,7 +464,7 @@ static DerivedMesh *doOcean( float foam; if (omd->oceancache && omd->cached == true) { - BKE_ocean_cache_eval_uv(omd->oceancache, &ocr, cfra, u, v); + BKE_ocean_cache_eval_uv(omd->oceancache, &ocr, cfra_for_cache, u, v); foam = ocr.foam; CLAMP(foam, 0.0f, 1.0f); } @@ -516,7 +487,7 @@ static DerivedMesh *doOcean( /* Note: tried to parallelized that one and previous foam loop, but gives 20% slower results... odd. */ { - const int num_verts = dm->getNumVerts(dm); + const int num_verts = result->totvert; for (i = 0; i < num_verts; i++) { float *vco = mverts[i].co; @@ -524,7 +495,7 @@ static DerivedMesh *doOcean( const float v = OCEAN_CO(size_co_inv, vco[1]); if (omd->oceancache && omd->cached == true) { - BKE_ocean_cache_eval_uv(omd->oceancache, &ocr, cfra, u, v); + BKE_ocean_cache_eval_uv(omd->oceancache, &ocr, cfra_for_cache, u, v); } else { BKE_ocean_eval_uv(omd->ocean, &ocr, u, v); @@ -539,33 +510,32 @@ static DerivedMesh *doOcean( } } + if (allocated_ocean) { + BKE_ocean_free(omd->ocean); + omd->ocean = NULL; + } + #undef OCEAN_CO - return dm; + return result; } #else /* WITH_OCEANSIM */ -static DerivedMesh *doOcean( - ModifierData *md, Object *UNUSED(ob), - DerivedMesh *derivedData, - int UNUSED(useRenderParams)) +static Mesh *doOcean(ModifierData *UNUSED(md), const ModifierEvalContext *UNUSED(ctx), Mesh *mesh) { - /* unused */ - (void)md; - return derivedData; + return mesh; } #endif /* WITH_OCEANSIM */ -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; - result = doOcean(md, ob, derivedData, 0); + result = doOcean(md, ctx, mesh); - if (result != derivedData) - result->dirty |= DM_DIRTY_NORMALS; + if (result != mesh) + result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; return result; } @@ -581,17 +551,25 @@ ModifierTypeInfo modifierType_Ocean = { eModifierTypeFlag_EnableInEditmode, /* copyData */ copyData, - /* deformMatrices */ NULL, + /* deformMatrices_DM */ NULL, + + /* deformVerts_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 */ 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 d88526e2845..edafcd6fcb9 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, bool 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; @@ -210,13 +197,13 @@ 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; @@ -226,7 +213,7 @@ static DerivedMesh *applyModifier( 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) { @@ -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) { @@ -420,7 +408,7 @@ static DerivedMesh *applyModifier( ChildParticle *cpa = psys->child + (p - psys->totpart); 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); @@ -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..6f9a44cd9e6 100644 --- a/source/blender/modifiers/intern/MOD_particlesystem.c +++ b/source/blender/modifiers/intern/MOD_particlesystem.c @@ -41,34 +41,34 @@ #include "BLI_utildefines.h" -#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; @@ -79,17 +79,17 @@ static void freeData(ModifierData *md) psmd->psys->flag |= PSYS_DELETE; } -static void copyData(const ModifierData *md, ModifierData *target) +static void copyData(const ModifierData *md, ModifierData *target, const int flag) { #if 0 const ParticleSystemModifierData *psmd = (const ParticleSystemModifierData *) md; #endif ParticleSystemModifierData *tpsmd = (ParticleSystemModifierData *) target; - modifier_copyData_generic(md, target); + modifier_copyData_generic(md, target, flag); - 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 +101,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 = MOD_get_mesh_eval(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,66 +144,97 @@ 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; } } -/* disabled particles in editmode for now, until support for proper derivedmesh +/* disabled particles in editmode for now, until support for proper evaluated mesh * updates is coded */ #if 0 static void deformVertsEM( - ModifierData *md, Object *ob, EditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) + ModifierData *md, Object *ob, BMEditMesh *editData, + Mesh *mesh, float (*vertexCos)[3], int numVerts) { - DerivedMesh *dm = derivedData; - - if (!derivedData) dm = CDDM_from_editmesh(editData, ob->data); + const bool do_temp_mesh = (mesh == NULL); + if (do_temp_mesh) { + mesh = BKE_id_new_nomain(ID_ME, ((ID *)ob->data)->name); + BM_mesh_bm_to_me(NULL, editData->bm, mesh, &((BMeshToMeshParams){0})); + } - deformVerts(md, ob, dm, vertexCos, numVerts); + deformVerts(md, ob, mesh, vertexCos, numVerts); - if (!derivedData) dm->release(dm); + if (derivedData) { + BKE_id_free(NULL, mesh); + } } #endif @@ -225,17 +251,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..c54fbcf7f87 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, bool 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 && ctx->object->type == OB_MESH) { + mesh_src = ctx->object->data; } - shrinkwrapModifier_deform((ShrinkwrapModifierData *)md, ob, dm, vertexCos, numVerts, forRender); + BLI_assert(mesh_src == NULL || 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..756ce3c83a9 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); + MOD_get_vgroup(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 = MOD_get_mesh_eval(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 = MOD_get_mesh_eval(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 5f6d5ba58b5..a15c4169df3 100644 --- a/source/blender/modifiers/intern/MOD_smoke.c +++ b/source/blender/modifiers/intern/MOD_smoke.c @@ -37,7 +37,7 @@ #include "MEM_guardedalloc.h" -#include "DNA_group_types.h" +#include "DNA_collection_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_smoke_types.h" @@ -46,14 +46,17 @@ #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_physics.h" +#include "DEG_depsgraph_query.h" #include "MOD_modifiertypes.h" @@ -68,7 +71,7 @@ static void initData(ModifierData *md) smd->time = -1; } -static void copyData(const ModifierData *md, ModifierData *target) +static void copyData(const ModifierData *md, ModifierData *target, const int UNUSED(flag)) { const SmokeModifierData *smd = (const SmokeModifierData *)md; SmokeModifierData *tsmd = (SmokeModifierData *)target; @@ -102,16 +105,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,32 +135,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_forcefield_relations(ctx->node, ctx->scene, ctx->object, smd->domain->effector_weights, true, PFIELD_SMOKEFLOW, "Smoke Force Field"); + DEG_add_collision_relations(ctx->node, ctx->object, smd->domain->fluid_group, eModifierType_Smoke, is_flow_cb, "Smoke Flow"); + DEG_add_collision_relations(ctx->node, ctx->object, smd->domain->coll_group, eModifierType_Smoke, is_coll_cb, "Smoke Coll"); + DEG_add_forcefield_relations(ctx->node, ctx->object, smd->domain->effector_weights, true, PFIELD_SMOKEFLOW, "Smoke Force Field"); } } @@ -191,17 +177,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..29508524f9c 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, bool 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); + MOD_get_vgroup(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..55df32b0e18 100644 --- a/source/blender/modifiers/intern/MOD_softbody.c +++ b/source/blender/modifiers/intern/MOD_softbody.c @@ -35,27 +35,30 @@ #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_physics.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,27 +66,12 @@ 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_forcefield_relations(ctx->node, ctx->scene, ctx->object, ctx->object->soft->effector_weights, true, 0, "Softbody Field"); + DEG_add_collision_relations(ctx->node, ctx->object, ctx->object->soft->collision_group, eModifierType_Collision, NULL, "Softbody Collision"); + DEG_add_forcefield_relations(ctx->node, 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..1fac637a9ef 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); + MOD_get_vgroup(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((numEdges == 0) || (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 5a965c86a22..a6e85bfb813 100644 --- a/source/blender/modifiers/intern/MOD_subsurf.c +++ b/source/blender/modifiers/intern/MOD_subsurf.c @@ -35,21 +35,20 @@ #include <stddef.h> -#include "DNA_scene_types.h" #include "DNA_object_types.h" - -#ifdef WITH_OPENSUBDIV -# include "DNA_userdef_types.h" -#endif +#include "DNA_scene_types.h" +#include "DNA_mesh_types.h" #include "BLI_utildefines.h" - #include "BKE_cdderivedmesh.h" -#include "BKE_depsgraph.h" #include "BKE_scene.h" +#include "BKE_subdiv.h" #include "BKE_subsurf.h" +#include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" + #include "MOD_modifiertypes.h" #include "intern/CCGSubSurf.h" @@ -60,17 +59,18 @@ static void initData(ModifierData *md) smd->levels = 1; smd->renderLevels = 2; - smd->flags |= eSubsurfModifierFlag_SubsurfUv; + smd->uv_smooth = SUBSURF_UV_SMOOTH_PRESERVE_CORNERS; + smd->quality = 3; } -static void copyData(const ModifierData *md, ModifierData *target) +static void copyData(const ModifierData *md, ModifierData *target, const int flag) { #if 0 const SubsurfModifierData *smd = (const SubsurfModifierData *) md; #endif SubsurfModifierData *tsmd = (SubsurfModifierData *) target; - modifier_copyData_generic(md, target); + modifier_copyData_generic(md, target, flag); tsmd->emCache = tsmd->mCache = NULL; } @@ -89,108 +89,123 @@ static void freeData(ModifierData *md) } } -static bool isDisabled(ModifierData *md, int useRenderParams) +static bool isDisabled(const Scene *scene, ModifierData *md, bool 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; -#endif bool do_cddm_convert = useRenderParams || !isFinalCalc; if (useRenderParams) 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 - /* TODO(sergey): Not entirely correct, modifiers on top of subsurf - * could be disabled. - */ - if (md->next == NULL && - allow_gpu && - do_cddm_convert == false && - smd->use_opensubdiv) - { - 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) { - 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) { - subsurf_flags |= SUBSURF_USE_GPU_BACKEND; - do_cddm_convert = false; - } - else { - modifier_setError(md, "OpenSubdiv is disabled due to dependencies"); - } - } -#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; } + (void) do_cddm_convert; + 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); -#ifdef WITH_OPENSUBDIV - const bool allow_gpu = (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); + SubsurfFlags ss_flags = (ctx->flag & MOD_APPLY_ORCO) ? 0 : (SUBSURF_FOR_EDIT_MODE | SUBSURF_IN_EDIT_MODE); + result = subsurf_make_derived_from_derived(derivedData, smd, scene, NULL, ss_flags); return result; } -static bool dependsOnNormals(ModifierData *md) +#ifdef WITH_OPENSUBDIV_MODIFIER +static int subdiv_levels_for_modifier_get(const SubsurfModifierData *smd, + const ModifierEvalContext *ctx) { -#ifdef WITH_OPENSUBDIV + Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); + const bool use_render_params = (ctx->flag & MOD_APPLY_RENDER); + const int requested_levels = (use_render_params) ? smd->renderLevels + : smd->levels; + return get_render_subsurf_level(&scene->r, + requested_levels, + use_render_params); +} + +static void subdiv_settings_init(SubdivSettings *settings, + const SubsurfModifierData *smd) +{ + settings->is_simple = (smd->subdivType == SUBSURF_TYPE_SIMPLE); + settings->is_adaptive = !settings->is_simple; + settings->level = smd->quality; + settings->fvar_linear_interpolation = + BKE_subdiv_fvar_interpolation_from_uv_smooth(smd->uv_smooth); +} + +static void subdiv_mesh_settings_init(SubdivToMeshSettings *settings, + const SubsurfModifierData *smd, + const ModifierEvalContext *ctx) +{ + const int level = subdiv_levels_for_modifier_get(smd, ctx); + settings->resolution = (1 << level) + 1; +} + +static Mesh *applyModifier_subdiv(ModifierData *md, + const ModifierEvalContext *ctx, + Mesh *mesh) +{ + Mesh *result = mesh; SubsurfModifierData *smd = (SubsurfModifierData *) md; - if (smd->use_opensubdiv && md->next == NULL) { - return true; + SubdivSettings subdiv_settings; + subdiv_settings_init(&subdiv_settings, smd); + SubdivToMeshSettings mesh_settings; + subdiv_mesh_settings_init(&mesh_settings, smd, ctx); + if (subdiv_settings.level == 0 || mesh_settings.resolution < 3) { + /* NOTE: Shouldn't really happen, is supposed to be catched by + * isDisabled() callback. + */ + return result; } -#else - UNUSED_VARS(md); -#endif - return false; + /* TODO(sergey): Try to re-use subdiv when possible. */ + Subdiv *subdiv = BKE_subdiv_new_from_mesh(&subdiv_settings, mesh); + if (subdiv == NULL) { + /* Happens on bad topology, ut also on empty input mesh. */ + return result; + } + result = BKE_subdiv_to_mesh(subdiv, &mesh_settings, mesh); + /* TODO(sergey): Cache subdiv somehow. */ + // BKE_subdiv_stats_print(&subdiv->stats); + BKE_subdiv_free(subdiv); + return result; } +#endif ModifierTypeInfo modifierType_Subsurf = { /* name */ "Subsurf", @@ -204,20 +219,32 @@ 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, +#ifdef WITH_OPENSUBDIV_MODIFIER + /* applyModifier */ applyModifier_subdiv, +#else + /* applyModifier */ NULL, +#endif + /* applyModifierEM */ NULL, + /* initData */ initData, /* requiredDataMask */ NULL, /* freeData */ freeData, /* isDisabled */ isDisabled, - /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, - /* dependsOnNormals */ dependsOnNormals, + /* dependsOnNormals */ NULL, /* foreachObjectLink */ NULL, /* foreachIDLink */ NULL, /* foreachTexLink */ NULL, diff --git a/source/blender/modifiers/intern/MOD_surface.c b/source/blender/modifiers/intern/MOD_surface.c index a64e05ffe1e..33a6fbe6c78 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 = MOD_get_mesh_eval(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..6dbeed9b4c8 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" @@ -132,12 +136,12 @@ static void freeData(ModifierData *md) } } -static void copyData(const ModifierData *md, ModifierData *target) +static void copyData(const ModifierData *md, ModifierData *target, const int flag) { const SurfaceDeformModifierData *smd = (const SurfaceDeformModifierData *)md; SurfaceDeformModifierData *tsmd = (SurfaceDeformModifierData *)target; - modifier_copyData_generic(md, target); + modifier_copyData_generic(md, target, flag); if (smd->verts) { tsmd->verts = MEM_dupallocN(smd->verts); @@ -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, bool 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..721474a62f3 100644 --- a/source/blender/modifiers/intern/MOD_util.c +++ b/source/blender/modifiers/intern/MOD_util.c @@ -34,43 +34,55 @@ #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" #include "BLI_utildefines.h" +#include "BLI_bitmap.h" #include "BLI_math_vector.h" #include "BLI_math_matrix.h" -#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 MOD_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); } } -void get_texture_coords( - MappingInfoModifierData *dmd, Object *ob, - DerivedMesh *dm, - float (*co)[3], float (*texco)[3], - int numVerts) +/* 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 MOD_get_texture_coords( + 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]; @@ -84,18 +96,17 @@ void get_texture_coords( /* UVs need special handling, since they come from faces */ if (texmapping == MOD_DISP_MAP_UV) { - if (CustomData_has_layer(&dm->loopData, CD_MLOOPUV)) { - MPoly *mpoly = dm->getPolyArray(dm); + if (CustomData_has_layer(&mesh->ldata, CD_MLOOPUV)) { + MPoly *mpoly = mesh->mpoly; MPoly *mp; - MLoop *mloop = dm->getLoopArray(dm); - char *done = MEM_calloc_arrayN(numVerts, sizeof(*done), - "get_texture_coords done"); - int numPolys = dm->getNumPolys(dm); + 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(&dm->loopData, CD_MLOOPUV, dmd->uvlayer_name, uvname); - mloop_uv = CustomData_get_layer_named(&dm->loopData, CD_MLOOPUV, uvname); + 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) { @@ -105,11 +116,11 @@ void get_texture_coords( unsigned int lidx = mp->loopstart + fidx; unsigned int vidx = mloop[lidx].v; - if (done[vidx] == 0) { + if (!BLI_BITMAP_TEST(done, vidx)) { /* remap UVs from [0, 1] to [-1, 1] */ - texco[vidx][0] = (mloop_uv[lidx].uv[0] * 2.0f) - 1.0f; - texco[vidx][1] = (mloop_uv[lidx].uv[1] * 2.0f) - 1.0f; - done[vidx] = 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--); @@ -118,27 +129,33 @@ void get_texture_coords( MEM_freeN(done); return; } - else /* if there are no UVs, default to local */ + else { + /* if there are no UVs, default to local */ texmapping = MOD_DISP_MAP_LOCAL; + } } - for (i = 0; i < numVerts; ++i, ++co, ++texco) { + MVert *mv = mesh->mvert; + for (i = 0; i < numVerts; ++i, ++mv, ++r_texco) { switch (texmapping) { case MOD_DISP_MAP_LOCAL: - copy_v3_v3(*texco, *co); + copy_v3_v3(*r_texco, cos != NULL ? *cos : mv->co); break; case MOD_DISP_MAP_GLOBAL: - mul_v3_m4v3(*texco, ob->obmat, *co); + mul_v3_m4v3(*r_texco, ob->obmat, cos != NULL ? *cos : mv->co); break; case MOD_DISP_MAP_OBJECT: - mul_v3_m4v3(*texco, ob->obmat, *co); - mul_m4_v3(mapob_imat, *texco); + mul_v3_m4v3(*r_texco, ob->obmat, cos != NULL ? *cos : mv->co); + mul_m4_v3(mapob_imat, *r_texco); break; } + if (cos != NULL) { + cos++; + } } } -void modifier_vgroup_cache(ModifierData *md, float (*vertexCos)[3]) +void MOD_previous_vcos_store(ModifierData *md, float (*vertexCos)[3]) { while ((md = md->next) && md->type == eModifierType_Armature) { ArmatureModifierData *amd = (ArmatureModifierData *) md; @@ -150,75 +167,58 @@ void modifier_vgroup_cache(ModifierData *md, float (*vertexCos)[3]) /* lattice/mesh modifier too */ } -/* returns a cdderivedmesh if dm == NULL or is another type of derivedmesh */ -DerivedMesh *get_cddm(Object *ob, struct BMEditMesh *em, DerivedMesh *dm, float (*vertexCos)[3], bool use_normals) -{ - if (dm) { - if (dm->type != DM_TYPE_CDDM) { - dm = CDDM_copy(dm); - } - CDDM_apply_vert_coords(dm, vertexCos); - - if (use_normals) { - DM_ensure_normals(dm); - } - } - else { - dm = get_dm(ob, em, dm, vertexCos, use_normals, false); - } - - return dm; -} - -/* returns a derived mesh if dm == NULL, for deforming modifiers that need it */ -DerivedMesh *get_dm( - Object *ob, struct BMEditMesh *em, DerivedMesh *dm, +/* returns a mesh if mesh == NULL, for deforming modifiers that need it */ +Mesh *MOD_get_mesh_eval( + Object *ob, struct BMEditMesh *em, Mesh *mesh, float (*vertexCos)[3], bool use_normals, bool use_orco) { - if (dm) { + if (mesh) { /* pass */ } else if (ob->type == OB_MESH) { - if (em) dm = CDDM_from_editbmesh(em, false, false); - else dm = CDDM_from_mesh((struct Mesh *)(ob->data)); + 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) { - CDDM_apply_vert_coords(dm, vertexCos); - dm->dirty |= DM_DIRTY_NORMALS; + BKE_mesh_apply_vert_coords(mesh, vertexCos); + mesh->runtime.cd_dirty_vert |= CD_MASK_NORMAL; } if (use_orco) { - DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, BKE_mesh_orco_verts_get(ob)); + 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)) { - dm = CDDM_from_curve(ob); + /* 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(dm)) { - DM_ensure_normals(dm); + if (LIKELY(mesh)) { + BKE_mesh_ensure_normals(mesh); } } - return dm; -} - -/* Get derived mesh for other object, which is used as an operand for the modifier, - * i.e. second operand for boolean modifier. - */ -DerivedMesh *get_dm_for_modifier(Object *ob, ModifierApplyFlag flag) -{ - if (flag & MOD_APPLY_RENDER) { - /* TODO(sergey): Use proper derived render in the future. */ - return ob->derivedFinal; - } - else { - return ob->derivedFinal; - } + return mesh; } -void modifier_get_vgroup(Object *ob, DerivedMesh *dm, const char *name, MDeformVert **dvert, int *defgrp_index) +void MOD_get_vgroup(Object *ob, struct Mesh *mesh, const char *name, MDeformVert **dvert, int *defgrp_index) { *defgrp_index = defgroup_name_index(ob, name); *dvert = NULL; @@ -226,8 +226,8 @@ void modifier_get_vgroup(Object *ob, DerivedMesh *dm, const char *name, MDeformV if (*defgrp_index != -1) { if (ob->type == OB_LATTICE) *dvert = BKE_lattice_deform_verts_get(ob); - else if (dm) - *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); + else if (mesh) + *dvert = mesh->dvert; } } @@ -290,5 +290,6 @@ void modifier_type_init(ModifierTypeInfo *types[]) INIT_TYPE(CorrectiveSmooth); INIT_TYPE(MeshSequenceCache); INIT_TYPE(SurfaceDeform); + INIT_TYPE(WeightedNormal); #undef INIT_TYPE } diff --git a/source/blender/modifiers/intern/MOD_util.h b/source/blender/modifiers/intern/MOD_util.h index 0414b8e6d52..bb15fc32b6b 100644 --- a/source/blender/modifiers/intern/MOD_util.h +++ b/source/blender/modifiers/intern/MOD_util.h @@ -33,27 +33,30 @@ #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 get_texture_coords( - struct MappingInfoModifierData *dmd, struct Object *ob, struct DerivedMesh *dm, - float (*co)[3], float (*texco)[3], int numVerts); -void modifier_vgroup_cache(struct ModifierData *md, float (*vertexCos)[3]); -struct DerivedMesh *get_cddm( - struct Object *ob, struct BMEditMesh *em, struct DerivedMesh *dm, - float (*vertexCos)[3], bool use_normals); -struct DerivedMesh *get_dm( - struct Object *ob, struct BMEditMesh *em, struct DerivedMesh *dm, +void MOD_init_texture(const struct Depsgraph *depsgraph, struct Tex *texture); +void MOD_get_texture_coords( + struct MappingInfoModifierData *dmd, + struct Object *ob, + struct Mesh *mesh, + float (*cos)[3], + float (*r_texco)[3]); + +void MOD_previous_vcos_store(struct ModifierData *md, float (*vertexCos)[3]); + +struct Mesh *MOD_get_mesh_eval( + 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, + +void MOD_get_vgroup( + 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..4046e0c2142 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); + MOD_get_vgroup(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..a8f305bcc13 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" @@ -61,12 +65,12 @@ static void initData(ModifierData *md) wmd->flag = 0; } -static void copyData(const ModifierData *md, ModifierData *target) +static void copyData(const ModifierData *md, ModifierData *target, const int flag) { const WarpModifierData *wmd = (const WarpModifierData *) md; WarpModifierData *twmd = (WarpModifierData *) target; - modifier_copyData_generic(md, target); + modifier_copyData_generic(md, target, flag); twmd->curfalloff = curvemapping_copy(wmd->curfalloff); } @@ -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, bool 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); + MOD_get_vgroup(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); + MOD_get_texture_coords((MappingInfoModifierData *)wmd, ob, mesh, vertexCos, tex_co); - modifier_init_texture(wmd->modifier.scene, wmd->texture); + MOD_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..c569ef1554e 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); + MOD_get_vgroup(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); + MOD_get_texture_coords((MappingInfoModifierData *)wmd, ob, mesh, vertexCos, tex_co); - modifier_init_texture(wmd->modifier.scene, wmd->texture); + MOD_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 = MOD_get_mesh_eval(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 = MOD_get_mesh_eval(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 = MOD_get_mesh_eval(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 = MOD_get_mesh_eval(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_weighted_normal.c b/source/blender/modifiers/intern/MOD_weighted_normal.c new file mode 100644 index 00000000000..69c71d34dbc --- /dev/null +++ b/source/blender/modifiers/intern/MOD_weighted_normal.c @@ -0,0 +1,671 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ***** END GPL LICENSE BLOCK ***** + * + */ + +/** \file blender/modifiers/intern/MOD_weighted_normal.c + * \ingroup modifiers + */ + +#include "MEM_guardedalloc.h" + +#include "DNA_mesh_types.h" +#include "DNA_object_types.h" +#include "DNA_scene_types.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_deform.h" +#include "BKE_library.h" +#include "BKE_library_query.h" +#include "BKE_mesh.h" + +#include "BLI_math.h" +#include "BLI_linklist.h" + +#include "MOD_modifiertypes.h" +#include "MOD_util.h" + +#define CLNORS_VALID_VEC_LEN (1e-6f) + +typedef struct ModePair { + float val; /* Contains mode based value (face area / corner angle). */ + int index; /* Index value per poly or per loop. */ +} ModePair; + +/* Sorting function used in modifier, sorts in decreasing order. */ +static int modepair_cmp_by_val_inverse(const void *p1, const void *p2) +{ + ModePair *r1 = (ModePair *)p1; + ModePair *r2 = (ModePair *)p2; + + return (r1->val < r2->val) ? 1 : ((r1->val > r2->val) ? -1 : 0); +} + +/* There will be one of those per vertex (simple case, computing one normal per vertex), or per smooth fan. */ +typedef struct WeightedNormalDataAggregateItem { + float normal[3]; + + int num_loops; /* Count number of loops using this item so far. */ + float curr_val; /* Current max val for this item. */ + int curr_strength; /* Current max strength encountered for this item. */ +} WeightedNormalDataAggregateItem; + +#define NUM_CACHED_INVERSE_POWERS_OF_WEIGHT 128 + +typedef struct WeightedNormalData { + const int numVerts; + const int numEdges; + const int numLoops; + const int numPolys; + + MVert *mvert; + MEdge *medge; + + MLoop *mloop; + short (*clnors)[2]; + const bool has_clnors; /* True if clnors already existed, false if we had to create them. */ + const float split_angle; + + MPoly *mpoly; + float (*polynors)[3]; + int *poly_strength; + + MDeformVert *dvert; + const int defgrp_index; + const bool use_invert_vgroup; + + const float weight; + const short mode; + + /* Lower-level, internal processing data. */ + float cached_inverse_powers_of_weight[NUM_CACHED_INVERSE_POWERS_OF_WEIGHT]; + + WeightedNormalDataAggregateItem *items_data; + + ModePair *mode_pair; + + int *loop_to_poly; +} WeightedNormalData; + +/* Check strength of given poly compared to those found so far for that given item (vertex or smooth fan), + * and reset matching item_data in case we get a stronger new strength. */ +static bool check_item_poly_strength( + WeightedNormalData *wn_data, WeightedNormalDataAggregateItem *item_data, const int mp_index) +{ + BLI_assert (wn_data->poly_strength != NULL); + + const int mp_strength = wn_data->poly_strength[mp_index]; + + if (mp_strength > item_data->curr_strength) { + item_data->curr_strength = mp_strength; + item_data->curr_val = 0.0f; + item_data->num_loops = 0; + zero_v3(item_data->normal); + } + + return mp_strength == item_data->curr_strength; +} + +static void aggregate_item_normal( + WeightedNormalModifierData *wnmd, WeightedNormalData *wn_data, + WeightedNormalDataAggregateItem *item_data, + const int mv_index, const int mp_index, + const float curr_val, const bool use_face_influence) +{ + float (*polynors)[3] = wn_data->polynors; + + MDeformVert *dvert = wn_data->dvert; + const int defgrp_index = wn_data->defgrp_index; + const bool use_invert_vgroup = wn_data->use_invert_vgroup; + + const float weight = wn_data->weight; + + float *cached_inverse_powers_of_weight = wn_data->cached_inverse_powers_of_weight; + + const bool has_vgroup = dvert != NULL; + const bool vert_of_group = has_vgroup && defvert_find_index(&dvert[mv_index], defgrp_index) != NULL; + + if (has_vgroup && ((vert_of_group && use_invert_vgroup) || (!vert_of_group && !use_invert_vgroup))) { + return; + } + + if (use_face_influence && !check_item_poly_strength(wn_data, item_data, mp_index)) { + return; + } + + /* If item's curr_val is 0 init it to present value. */ + if (item_data->curr_val == 0.0f) { + item_data->curr_val = curr_val; + } + if (!compare_ff(item_data->curr_val, curr_val, wnmd->thresh)) { + /* item's curr_val and present value differ more than threshold, update. */ + item_data->num_loops++; + item_data->curr_val = curr_val; + } + + /* Exponentially divided weight for each normal (since a few values will be used by most cases, we cache those). */ + const int num_loops = item_data->num_loops; + if (num_loops < NUM_CACHED_INVERSE_POWERS_OF_WEIGHT && cached_inverse_powers_of_weight[num_loops] == 0.0f) { + cached_inverse_powers_of_weight[num_loops] = 1.0f / powf(weight, num_loops); + } + const float inverted_n_weight = num_loops < NUM_CACHED_INVERSE_POWERS_OF_WEIGHT ? + cached_inverse_powers_of_weight[num_loops] : 1.0f / powf(weight, num_loops); + + madd_v3_v3fl(item_data->normal, polynors[mp_index], curr_val * inverted_n_weight); +} + +static void apply_weights_vertex_normal(WeightedNormalModifierData *wnmd, WeightedNormalData *wn_data) +{ + const int numVerts = wn_data->numVerts; + const int numEdges = wn_data->numEdges; + const int numLoops = wn_data->numLoops; + const int numPolys = wn_data->numPolys; + + MVert *mvert = wn_data->mvert; + MEdge *medge = wn_data->medge; + + MLoop *mloop = wn_data->mloop; + short (*clnors)[2] = wn_data->clnors; + int *loop_to_poly = wn_data->loop_to_poly; + + MPoly *mpoly = wn_data->mpoly; + float (*polynors)[3] = wn_data->polynors; + int *poly_strength = wn_data->poly_strength; + + MDeformVert *dvert = wn_data->dvert; + + const short mode = wn_data->mode; + ModePair *mode_pair = wn_data->mode_pair; + + const bool has_clnors = wn_data->has_clnors; + const float split_angle = wn_data->split_angle; + MLoopNorSpaceArray lnors_spacearr = {NULL}; + + const bool keep_sharp = (wnmd->flag & MOD_WEIGHTEDNORMAL_KEEP_SHARP) != 0; + const bool use_face_influence = (wnmd->flag & MOD_WEIGHTEDNORMAL_FACE_INFLUENCE) != 0 && poly_strength != NULL; + const bool has_vgroup = dvert != NULL; + + float (*loop_normals)[3] = NULL; + + WeightedNormalDataAggregateItem *items_data = NULL; + int num_items = 0; + if (keep_sharp) { + BLI_bitmap *done_loops = BLI_BITMAP_NEW(numLoops, __func__); + + /* This will give us loop normal spaces, we do not actually care about computed loop_normals for now... */ + loop_normals = MEM_calloc_arrayN((size_t)numLoops, sizeof(*loop_normals), __func__); + BKE_mesh_normals_loop_split(mvert, numVerts, medge, numEdges, + mloop, loop_normals, numLoops, mpoly, polynors, numPolys, + true, split_angle, &lnors_spacearr, has_clnors ? clnors : NULL, loop_to_poly); + + num_items = lnors_spacearr.num_spaces; + items_data = MEM_calloc_arrayN((size_t)num_items, sizeof(*items_data), __func__); + + /* In this first loop, we assign each WeightedNormalDataAggregateItem + * to its smooth fan of loops (aka lnor space). */ + MPoly *mp; + int mp_index; + int item_index; + for (mp = mpoly, mp_index = 0, item_index = 0; mp_index < numPolys; mp++, mp_index++) { + int ml_index = mp->loopstart; + const int ml_end_index = ml_index + mp->totloop; + + for (; ml_index < ml_end_index; ml_index++) { + if (BLI_BITMAP_TEST(done_loops, ml_index)) { + /* Smooth fan of this loop has already been processed, skip it. */ + continue; + } + BLI_assert(item_index < num_items); + + WeightedNormalDataAggregateItem *itdt = &items_data[item_index]; + itdt->curr_strength = FACE_STRENGTH_WEAK; + + MLoopNorSpace *lnor_space = lnors_spacearr.lspacearr[ml_index]; + lnor_space->user_data = itdt; + + if (!(lnor_space->flags & MLNOR_SPACE_IS_SINGLE)) { + for (LinkNode *lnode = lnor_space->loops; lnode; lnode = lnode->next) { + const int ml_fan_index = GET_INT_FROM_POINTER(lnode->link); + BLI_BITMAP_ENABLE(done_loops, ml_fan_index); + } + } + else { + BLI_BITMAP_ENABLE(done_loops, ml_index); + } + + item_index++; + } + } + + MEM_freeN(done_loops); + } + else { + num_items = numVerts; + items_data = MEM_calloc_arrayN((size_t)num_items, sizeof(*items_data), __func__); + if (use_face_influence) { + for (int item_index = 0; item_index < num_items; item_index++) { + items_data[item_index].curr_strength = FACE_STRENGTH_WEAK; + } + } + } + wn_data->items_data = items_data; + + switch (mode) { + case MOD_WEIGHTEDNORMAL_MODE_FACE: + for (int i = 0; i < numPolys; i++) { + const int mp_index = mode_pair[i].index; + const float mp_val = mode_pair[i].val; + + int ml_index = mpoly[mp_index].loopstart; + const int ml_index_end = ml_index + mpoly[mp_index].totloop; + for (; ml_index < ml_index_end; ml_index++) { + const int mv_index = mloop[ml_index].v; + WeightedNormalDataAggregateItem *item_data = keep_sharp ? + lnors_spacearr.lspacearr[ml_index]->user_data: + &items_data[mv_index]; + + aggregate_item_normal(wnmd, wn_data, item_data, mv_index, mp_index, mp_val, use_face_influence); + } + } + break; + case MOD_WEIGHTEDNORMAL_MODE_ANGLE: + case MOD_WEIGHTEDNORMAL_MODE_FACE_ANGLE: + BLI_assert(loop_to_poly != NULL); + + for (int i = 0; i < numLoops; i++) { + const int ml_index = mode_pair[i].index; + const float ml_val = mode_pair[i].val; + + const int mp_index = loop_to_poly[ml_index]; + const int mv_index = mloop[ml_index].v; + WeightedNormalDataAggregateItem *item_data = keep_sharp ? + lnors_spacearr.lspacearr[ml_index]->user_data: + &items_data[mv_index]; + + aggregate_item_normal(wnmd, wn_data, item_data, mv_index, mp_index, ml_val, use_face_influence); + } + break; + default: + BLI_assert(0); + } + + /* Validate computed weighted normals. */ + for (int item_index = 0; item_index < num_items; item_index++) { + if (normalize_v3(items_data[item_index].normal) < CLNORS_VALID_VEC_LEN) { + zero_v3(items_data[item_index].normal); + } + } + + if (keep_sharp) { + /* Set loop normals for normal computed for each lnor space (smooth fan). + * Note that loop_normals is already populated with clnors (before this modifier is applied, at start of + * this function), so no need to recompute them here. */ + for (int ml_index = 0; ml_index < numLoops; ml_index++) { + WeightedNormalDataAggregateItem *item_data = lnors_spacearr.lspacearr[ml_index]->user_data; + if (!is_zero_v3(item_data->normal)) { + copy_v3_v3(loop_normals[ml_index], item_data->normal); + } + } + + BKE_mesh_normals_loop_custom_set(mvert, numVerts, medge, numEdges, + mloop, loop_normals, numLoops, mpoly, polynors, numPolys, clnors); + } + else { + /* TODO: Ideally, we could add an option to BKE_mesh_normals_loop_custom_[from_vertices_]set() to keep current + * clnors instead of resetting them to default autocomputed ones, when given new custom normal is zero-vec. + * But this is not exactly trivial change, better to keep this optimization for later... + */ + if (!has_vgroup) { + /* Note: in theory, we could avoid this extra allocation & copying... But think we can live with it for now, + * and it makes code simpler & cleaner. */ + float (*vert_normals)[3] = MEM_calloc_arrayN((size_t)numVerts, sizeof(*loop_normals), __func__); + + for (int ml_index = 0; ml_index < numLoops; ml_index++) { + const int mv_index = mloop[ml_index].v; + copy_v3_v3(vert_normals[mv_index], items_data[mv_index].normal); + } + + BKE_mesh_normals_loop_custom_from_vertices_set(mvert, vert_normals, numVerts, medge, numEdges, + mloop, numLoops, mpoly, polynors, numPolys, clnors); + + MEM_freeN(vert_normals); + } + else { + loop_normals = MEM_calloc_arrayN((size_t)numLoops, sizeof(*loop_normals), __func__); + + BKE_mesh_normals_loop_split(mvert, numVerts, medge, numEdges, + mloop, loop_normals, numLoops, mpoly, polynors, numPolys, + true, split_angle, NULL, has_clnors ? clnors : NULL, loop_to_poly); + + for (int ml_index = 0; ml_index < numLoops; ml_index++) { + const int item_index = mloop[ml_index].v; + if (!is_zero_v3(items_data[item_index].normal)) { + copy_v3_v3(loop_normals[ml_index], items_data[item_index].normal); + } + } + + BKE_mesh_normals_loop_custom_set(mvert, numVerts, medge, numEdges, + mloop, loop_normals, numLoops, mpoly, polynors, numPolys, clnors); + } + } + + if (keep_sharp) { + BKE_lnor_spacearr_free(&lnors_spacearr); + } + MEM_SAFE_FREE(loop_normals); +} + +static void wn_face_area(WeightedNormalModifierData *wnmd, WeightedNormalData *wn_data) +{ + const int numPolys = wn_data->numPolys; + + MVert *mvert = wn_data->mvert; + MLoop *mloop = wn_data->mloop; + MPoly *mpoly = wn_data->mpoly; + + MPoly *mp; + int mp_index; + + ModePair *face_area = MEM_malloc_arrayN((size_t)numPolys, sizeof(*face_area), __func__); + + ModePair *f_area = face_area; + for (mp_index = 0, mp = mpoly; mp_index < numPolys; mp_index++, mp++, f_area++) { + f_area->val = BKE_mesh_calc_poly_area(mp, &mloop[mp->loopstart], mvert); + f_area->index = mp_index; + } + + qsort(face_area, numPolys, sizeof(*face_area), modepair_cmp_by_val_inverse); + + wn_data->mode_pair = face_area; + apply_weights_vertex_normal(wnmd, wn_data); +} + +static void wn_corner_angle(WeightedNormalModifierData *wnmd, WeightedNormalData *wn_data) +{ + const int numLoops = wn_data->numLoops; + const int numPolys = wn_data->numPolys; + + MVert *mvert = wn_data->mvert; + MLoop *mloop = wn_data->mloop; + MPoly *mpoly = wn_data->mpoly; + + MPoly *mp; + int mp_index; + + int *loop_to_poly = MEM_malloc_arrayN((size_t)numLoops, sizeof(*loop_to_poly), __func__); + + ModePair *corner_angle = MEM_malloc_arrayN((size_t)numLoops, sizeof(*corner_angle), __func__); + + for (mp_index = 0, mp = mpoly; mp_index < numPolys; mp_index++, mp++) { + MLoop *ml_start = &mloop[mp->loopstart]; + + float *index_angle = MEM_malloc_arrayN((size_t)mp->totloop, sizeof(*index_angle), __func__); + BKE_mesh_calc_poly_angles(mp, ml_start, mvert, index_angle); + + ModePair *c_angl = &corner_angle[mp->loopstart]; + float *angl = index_angle; + for (int ml_index = mp->loopstart; ml_index < mp->loopstart + mp->totloop; ml_index++, c_angl++, angl++) { + c_angl->val = (float)M_PI - *angl; + c_angl->index = ml_index; + + loop_to_poly[ml_index] = mp_index; + } + MEM_freeN(index_angle); + } + + qsort(corner_angle, numLoops, sizeof(*corner_angle), modepair_cmp_by_val_inverse); + + wn_data->loop_to_poly = loop_to_poly; + wn_data->mode_pair = corner_angle; + apply_weights_vertex_normal(wnmd, wn_data); +} + +static void wn_face_with_angle(WeightedNormalModifierData *wnmd, WeightedNormalData *wn_data) +{ + const int numLoops = wn_data->numLoops; + const int numPolys = wn_data->numPolys; + + MVert *mvert = wn_data->mvert; + MLoop *mloop = wn_data->mloop; + MPoly *mpoly = wn_data->mpoly; + + MPoly *mp; + int mp_index; + + int *loop_to_poly = MEM_malloc_arrayN((size_t)numLoops, sizeof(*loop_to_poly), __func__); + + ModePair *combined = MEM_malloc_arrayN((size_t)numLoops, sizeof(*combined), __func__); + + for (mp_index = 0, mp = mpoly; mp_index < numPolys; mp_index++, mp++) { + MLoop *ml_start = &mloop[mp->loopstart]; + + float face_area = BKE_mesh_calc_poly_area(mp, ml_start, mvert); + float *index_angle = MEM_malloc_arrayN((size_t)mp->totloop, sizeof(*index_angle), __func__); + BKE_mesh_calc_poly_angles(mp, ml_start, mvert, index_angle); + + ModePair *cmbnd = &combined[mp->loopstart]; + float *angl = index_angle; + for (int ml_index = mp->loopstart; ml_index < mp->loopstart + mp->totloop; ml_index++, cmbnd++, angl++) { + /* In this case val is product of corner angle and face area. */ + cmbnd->val = ((float)M_PI - *angl) * face_area; + cmbnd->index = ml_index; + + loop_to_poly[ml_index] = mp_index; + } + MEM_freeN(index_angle); + } + + qsort(combined, numLoops, sizeof(*combined), modepair_cmp_by_val_inverse); + + wn_data->loop_to_poly = loop_to_poly; + wn_data->mode_pair = combined; + apply_weights_vertex_normal(wnmd, wn_data); +} + +static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh) +{ + WeightedNormalModifierData *wnmd = (WeightedNormalModifierData *)md; + Object *ob = ctx->object; + + /* 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 *)wnmd, "Enable 'Auto Smooth' option in mesh settings"); + return mesh; + } + + Mesh *result; + 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); + + const int numVerts = result->totvert; + const int numEdges = result->totedge; + const int numLoops = result->totloop; + const int numPolys = result->totpoly; + + MEdge *medge = result->medge; + MPoly *mpoly = result->mpoly; + MVert *mvert = result->mvert; + MLoop *mloop = result->mloop; + + /* Right now: + * If weight = 50 then all faces are given equal weight. + * If weight > 50 then more weight given to faces with larger vals (face area / corner angle). + * If weight < 50 then more weight given to faces with lesser vals. However current calculation + * does not converge to min/max. + */ + float weight = ((float)wnmd->weight) / 50.0f; + if (wnmd->weight == 100) { + weight = (float)SHRT_MAX; + } + else if (wnmd->weight == 1) { + weight = 1 / (float)SHRT_MAX; + } + else if ((weight - 1) * 25 > 1) { + weight = (weight - 1) * 25; + } + + CustomData *pdata = &result->pdata; + float (*polynors)[3] = CustomData_get_layer(pdata, CD_NORMAL); + if (!polynors) { + polynors = CustomData_add_layer(pdata, CD_NORMAL, CD_CALLOC, NULL, numPolys); + } + BKE_mesh_calc_normals_poly(mvert, NULL, numVerts, mloop, mpoly, numLoops, numPolys, polynors, false); + + + const float split_angle = mesh->smoothresh; + short (*clnors)[2]; + CustomData *ldata = &result->ldata; + clnors = CustomData_get_layer(ldata, CD_CUSTOMLOOPNORMAL); + + /* Keep info whether we had clnors, it helps when generating clnor spaces and default normals. */ + const bool has_clnors = clnors != NULL; + if (!clnors) { + clnors = CustomData_add_layer(ldata, CD_CUSTOMLOOPNORMAL, CD_CALLOC, NULL, numLoops); + clnors = CustomData_get_layer(ldata, CD_CUSTOMLOOPNORMAL); + } + + MDeformVert *dvert; + int defgrp_index; + MOD_get_vgroup(ctx->object, mesh, wnmd->defgrp_name, &dvert, &defgrp_index); + + WeightedNormalData wn_data = { + .numVerts = numVerts, + .numEdges = numEdges, + .numLoops = numLoops, + .numPolys = numPolys, + + .mvert = mvert, + .medge = medge, + + .mloop = mloop, + .clnors = clnors, + .has_clnors = has_clnors, + .split_angle = split_angle, + + .mpoly = mpoly, + .polynors = polynors, + .poly_strength = CustomData_get_layer_named( + &result->pdata, CD_PROP_INT, + MOD_WEIGHTEDNORMALS_FACEWEIGHT_CDLAYER_ID), + + .dvert = dvert, + .defgrp_index = defgrp_index, + .use_invert_vgroup = (wnmd->flag & MOD_WEIGHTEDNORMAL_INVERT_VGROUP) != 0, + + .weight = weight, + .mode = wnmd->mode, + }; + + switch (wnmd->mode) { + case MOD_WEIGHTEDNORMAL_MODE_FACE: + wn_face_area(wnmd, &wn_data); + break; + case MOD_WEIGHTEDNORMAL_MODE_ANGLE: + wn_corner_angle(wnmd, &wn_data); + break; + case MOD_WEIGHTEDNORMAL_MODE_FACE_ANGLE: + wn_face_with_angle(wnmd, &wn_data); + break; + } + + MEM_SAFE_FREE(wn_data.loop_to_poly); + MEM_SAFE_FREE(wn_data.mode_pair); + MEM_SAFE_FREE(wn_data.items_data); + + return result; +} + +static void initData(ModifierData *md) +{ + WeightedNormalModifierData *wnmd = (WeightedNormalModifierData *)md; + wnmd->mode = MOD_WEIGHTEDNORMAL_MODE_FACE; + wnmd->weight = 50; + wnmd->thresh = 1e-2f; + wnmd->flag = 0; +} + +static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) +{ + WeightedNormalModifierData *wnmd = (WeightedNormalModifierData *)md; + CustomDataMask dataMask = CD_CUSTOMLOOPNORMAL; + + if (wnmd->defgrp_name[0]) { + dataMask |= CD_MASK_MDEFORMVERT; + } + + if (wnmd->flag & MOD_WEIGHTEDNORMAL_FACE_INFLUENCE) { + dataMask |= CD_MASK_PROP_INT; + } + + return dataMask; +} + +static bool dependsOnNormals(ModifierData *UNUSED(md)) +{ + return true; +} + +ModifierTypeInfo modifierType_WeightedNormal = { + /* name */ "Weighted Normal", + /* structName */ "WeightedNormalModifierData", + /* structSize */ sizeof(WeightedNormalModifierData), + /* type */ eModifierTypeType_Constructive, + /* flags */ eModifierTypeFlag_AcceptsMesh | + 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 */ NULL, + /* updateDepsgraph */ NULL, + /* dependsOnTime */ NULL, + /* dependsOnNormals */ dependsOnNormals, + /* foreachObjectLink */ NULL, + /* foreachIDLink */ NULL, + /* foreachTexLink */ NULL, +}; diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c index e512c3fdc95..eed0c41e374 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); + MOD_get_texture_coords(&t_map, ob, mesh, NULL, tex_co); - modifier_init_texture(scene, texture); + MOD_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..47379dec99a 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" @@ -81,12 +81,12 @@ static void freeData(ModifierData *md) curvemapping_free(wmd->cmap_curve); } -static void copyData(const ModifierData *md, ModifierData *target) +static void copyData(const ModifierData *md, ModifierData *target, const int flag) { const WeightVGEditModifierData *wmd = (const WeightVGEditModifierData *) md; WeightVGEditModifierData *twmd = (WeightVGEditModifierData *) target; - modifier_copyData_generic(md, target); + modifier_copyData_generic(md, target, flag); twmd->cmap_curve = curvemapping_copy(wmd->cmap_curve); } @@ -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, bool 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,31 +179,42 @@ 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; + } + } + + if (has_mdef) { + dvert = CustomData_duplicate_referenced_layer(&mesh->vdata, CD_MDEFORMVERT, numVerts); + } + else { + /* Add a valid data layer! */ + dvert = CustomData_add_layer(&mesh->vdata, CD_MDEFORMVERT, CD_CALLOC, NULL, numVerts); + } + /* Ultimate security check. */ + if (!dvert) { + return mesh; } + mesh->dvert = dvert; /* Get org weights, assuming 0.0 for vertices not in given vgroup. */ org_w = MEM_malloc_arrayN(numVerts, sizeof(float), "WeightVGEdit Modifier, org_w"); @@ -238,18 +234,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, mesh, 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 +268,7 @@ static DerivedMesh *applyModifier( MEM_freeN(dw); /* Return the vgroup-modified mesh. */ - return dm; + return mesh; } @@ -284,17 +283,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..ea401d01f66 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, bool 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,51 @@ 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; + } + } + + if (has_mdef) { + dvert = CustomData_duplicate_referenced_layer(&mesh->vdata, CD_MDEFORMVERT, numVerts); + } + else { + /* Add a valid data layer! */ + dvert = CustomData_add_layer(&mesh->vdata, CD_MDEFORMVERT, CD_CALLOC, NULL, numVerts); + } + /* Ultimate security check. */ + if (!dvert) { + return mesh; } + mesh->dvert = dvert; + /* 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 +322,7 @@ static DerivedMesh *applyModifier( MEM_freeN(tdw1); MEM_freeN(tdw2); MEM_freeN(tidx); - return dm; + return mesh; } if (numIdx != -1) { indices = MEM_malloc_arrayN(numIdx, sizeof(int), "WeightVGMix Modifier, indices"); @@ -361,8 +356,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, mesh, 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 +378,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 mesh; } @@ -402,17 +396,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..4a5a54642ef 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, bool 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,42 @@ 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. - */ + dvert = CustomData_duplicate_referenced_layer(&mesh->vdata, CD_MDEFORMVERT, numVerts); + /* Ultimate security check. */ + if (!dvert) { + return mesh; + } + mesh->dvert = dvert; + + /* 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 +446,7 @@ static DerivedMesh *applyModifier( MEM_freeN(tidx); MEM_freeN(tw); MEM_freeN(tdw); - return dm; + return mesh; } if (numIdx != numVerts) { indices = MEM_malloc_arrayN(numIdx, sizeof(int), "WeightVGProximity Modifier, indices"); @@ -474,25 +466,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(mesh, 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(mesh, 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 +491,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 +503,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 +511,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 +534,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, mesh, 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 +553,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 mesh; } @@ -593,17 +576,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, |