diff options
Diffstat (limited to 'source/blender/modifiers')
-rw-r--r-- | source/blender/modifiers/CMakeLists.txt | 11 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_boolean.c | 106 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_boolean_util.c | 790 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_boolean_util.h | 46 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_build.c | 14 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_dynamicpaint.c | 2 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_fluidsim.c | 2 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_fluidsim_util.c | 2 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_meshdeform.c | 4 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_multires.c | 6 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_shrinkwrap.c | 8 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_skin.c | 2 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_smoke.c | 2 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_softbody.c | 2 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_subsurf.c | 6 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_surfacedeform.c | 30 |
16 files changed, 50 insertions, 983 deletions
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt index d6a7b94505f..397a3263e22 100644 --- a/source/blender/modifiers/CMakeLists.txt +++ b/source/blender/modifiers/CMakeLists.txt @@ -107,7 +107,6 @@ set(SRC intern/MOD_wireframe.c MOD_modifiertypes.h - intern/MOD_boolean_util.h intern/MOD_fluidsim_util.h intern/MOD_meshcache_util.h intern/MOD_util.h @@ -121,16 +120,6 @@ if(WITH_ALEMBIC) ) endif() -if(WITH_MOD_BOOLEAN) - add_definitions(-DWITH_MOD_BOOLEAN) - list(APPEND SRC - intern/MOD_boolean_util.c - ) - list(APPEND INC - ../../../extern/carve - ) -endif() - if(WITH_MOD_REMESH) add_definitions(-DWITH_MOD_REMESH) list(APPEND INC diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c index 0554fbb0317..7f79c941770 100644 --- a/source/blender/modifiers/intern/MOD_boolean.c +++ b/source/blender/modifiers/intern/MOD_boolean.c @@ -33,10 +33,6 @@ */ // #ifdef DEBUG_TIME -#define USE_BMESH -#ifdef WITH_MOD_BOOLEAN -# define USE_CARVE WITH_MOD_BOOLEAN -#endif #include <stdio.h> @@ -49,11 +45,9 @@ #include "BKE_library_query.h" #include "BKE_modifier.h" -#include "MOD_boolean_util.h" #include "MOD_util.h" -#ifdef USE_BMESH #include "BLI_alloca.h" #include "BLI_math_geom.h" #include "BKE_material.h" @@ -63,18 +57,16 @@ #include "bmesh.h" #include "bmesh_tools.h" #include "tools/bmesh_intersect.h" -#endif #ifdef DEBUG_TIME -#include "PIL_time.h" -#include "PIL_time_utildefines.h" +# include "PIL_time.h" +# include "PIL_time_utildefines.h" #endif static void initData(ModifierData *md) { BooleanModifierData *bmd = (BooleanModifierData *)md; - bmd->solver = eBooleanModifierSolver_BMesh; bmd->double_threshold = 1e-6f; } @@ -118,8 +110,6 @@ static void updateDepsgraph(ModifierData *md, DEG_add_object_relation(node, ob, DEG_OB_COMP_TRANSFORM, "Boolean Modifier"); } -#if defined(USE_CARVE) || defined(USE_BMESH) - static DerivedMesh *get_quick_derivedMesh( Object *ob_self, DerivedMesh *dm_self, Object *ob_other, DerivedMesh *dm_other, @@ -166,13 +156,7 @@ static DerivedMesh *get_quick_derivedMesh( return result; } -#endif /* defined(USE_CARVE) || defined(USE_BMESH) */ - -/* -------------------------------------------------------------------- */ -/* BMESH */ - -#ifdef USE_BMESH /* has no meaning for faces, do this so we can tell which face is which */ #define BM_FACE_TAG BM_ELEM_DRAW @@ -185,8 +169,8 @@ 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_bmesh( - ModifierData *md, Object *ob, +static DerivedMesh *applyModifier( + ModifierData *md, const struct EvaluationContext *UNUSED(eval_ctx), Object *ob, DerivedMesh *dm, ModifierApplyFlag flag) { @@ -354,66 +338,6 @@ static DerivedMesh *applyModifier_bmesh( return dm; } -#endif /* USE_BMESH */ - - -/* -------------------------------------------------------------------- */ -/* CARVE */ - -#ifdef USE_CARVE -static DerivedMesh *applyModifier_carve( - ModifierData *md, Object *ob, - DerivedMesh *derivedData, - ModifierApplyFlag flag) -{ - BooleanModifierData *bmd = (BooleanModifierData *) md; - DerivedMesh *dm; - - if (!bmd->object) - return derivedData; - - dm = get_dm_for_modifier(bmd->object, flag); - - if (dm) { - DerivedMesh *result; - - /* 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, derivedData, bmd->object, dm, bmd->operation); - - if (result == NULL) { -#ifdef DEBUG_TIME - TIMEIT_START(boolean_carve); -#endif - - result = NewBooleanDerivedMesh(dm, bmd->object, derivedData, ob, - 1 + bmd->operation); -#ifdef DEBUG_TIME - TIMEIT_END(boolean_carve); -#endif - } - - /* if new mesh returned, return it; otherwise there was - * an error, so delete the modifier object */ - if (result) - return result; - else - modifier_setError(md, "Cannot execute boolean operation"); - } - - return derivedData; -} -#endif /* USE_CARVE */ - - -static DerivedMesh *applyModifier_nop( - ModifierData *UNUSED(md), Object *UNUSED(ob), - DerivedMesh *derivedData, - ModifierApplyFlag UNUSED(flag)) -{ - return derivedData; -} static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md)) { @@ -424,28 +348,6 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED( return dataMask; } -static DerivedMesh *applyModifier( - ModifierData *md, const struct EvaluationContext *UNUSED(eval_ctx), - Object *ob, DerivedMesh *derivedData, - ModifierApplyFlag flag) -{ - BooleanModifierData *bmd = (BooleanModifierData *)md; - - switch (bmd->solver) { -#ifdef USE_CARVE - case eBooleanModifierSolver_Carve: - return applyModifier_carve(md, ob, derivedData, flag); -#endif -#ifdef USE_BMESH - case eBooleanModifierSolver_BMesh: - return applyModifier_bmesh(md, ob, derivedData, flag); -#endif - default: - return applyModifier_nop(md, ob, derivedData, flag); - } -} - - ModifierTypeInfo modifierType_Boolean = { /* name */ "Boolean", /* structName */ "BooleanModifierData", diff --git a/source/blender/modifiers/intern/MOD_boolean_util.c b/source/blender/modifiers/intern/MOD_boolean_util.c deleted file mode 100644 index 49010664aa8..00000000000 --- a/source/blender/modifiers/intern/MOD_boolean_util.c +++ /dev/null @@ -1,790 +0,0 @@ -/* - * ***** 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. - * - * The Original Code is Copyright (C) Blender Foundation - * All rights reserved. - * - * Contributor(s): Sergey Sharybin. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** \file blender/modifiers/intern/MOD_boolean_util.c - * \ingroup modifiers - */ - -#include "MEM_guardedalloc.h" - -#include "DNA_material_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_object_types.h" - -#include "BLI_utildefines.h" -#include "BLI_alloca.h" -#include "BLI_ghash.h" -#include "BLI_math.h" - -#include "BKE_cdderivedmesh.h" -#include "BKE_material.h" - -#include "MOD_boolean_util.h" - -#include "carve-capi.h" - -/* Adopted from BM_loop_interp_from_face(), - * - * Transform matrix is used in cases when target coordinate needs - * to be converted to source space (namely when interpolating - * boolean result loops from second operand). - * - * TODO(sergey): Consider making it a generic function in DerivedMesh.c. - */ -static void DM_loop_interp_from_poly(DerivedMesh *source_dm, - MVert *source_mverts, - MLoop *source_mloops, - MPoly *source_poly, - DerivedMesh *target_dm, - MVert *target_mverts, - MLoop *target_mloop, - float transform[4][4], - int target_loop_index) -{ - float (*cos_3d)[3] = BLI_array_alloca(cos_3d, source_poly->totloop); - int *source_indices = BLI_array_alloca(source_indices, source_poly->totloop); - float *weights = BLI_array_alloca(weights, source_poly->totloop); - int i; - int target_vert_index = target_mloop[target_loop_index].v; - float coord[3]; - - for (i = 0; i < source_poly->totloop; ++i) { - MLoop *mloop = &source_mloops[source_poly->loopstart + i]; - source_indices[i] = source_poly->loopstart + i; - copy_v3_v3(cos_3d[i], source_mverts[mloop->v].co); - } - - if (transform) { - mul_v3_m4v3(coord, transform, target_mverts[target_vert_index].co); - } - else { - copy_v3_v3(coord, target_mverts[target_vert_index].co); - } - - interp_weights_poly_v3(weights, cos_3d, source_poly->totloop, coord); - - DM_interp_loop_data(source_dm, target_dm, source_indices, weights, - source_poly->totloop, target_loop_index); -} - -typedef struct DMArrays { - MVert *mvert; - MEdge *medge; - MLoop *mloop; - MPoly *mpoly; - bool mvert_allocated; - bool medge_allocated; - bool mloop_allocated; - bool mpoly_allocated; -} DMArrays; - -static void dm_arrays_get(DerivedMesh *dm, DMArrays *arrays) -{ - arrays->mvert = DM_get_vert_array(dm, &arrays->mvert_allocated); - arrays->medge = DM_get_edge_array(dm, &arrays->medge_allocated); - arrays->mloop = DM_get_loop_array(dm, &arrays->mloop_allocated); - arrays->mpoly = DM_get_poly_array(dm, &arrays->mpoly_allocated); -} - -static void dm_arrays_free(DMArrays *arrays) -{ - if (arrays->mvert_allocated) { - MEM_freeN(arrays->mvert); - } - if (arrays->medge_allocated) { - MEM_freeN(arrays->medge); - } - if (arrays->mloop_allocated) { - MEM_freeN(arrays->mloop); - } - if (arrays->mpoly_allocated) { - MEM_freeN(arrays->mpoly); - } -} - -/* **** Importer from derived mesh to Carve **** */ - -typedef struct ImportMeshData { - DerivedMesh *dm; - float obmat[4][4]; - MVert *mvert; - MEdge *medge; - MLoop *mloop; - MPoly *mpoly; -} ImportMeshData; - -/* Get number of vertices. */ -static int importer_GetNumVerts(ImportMeshData *import_data) -{ - DerivedMesh *dm = import_data->dm; - return dm->getNumVerts(dm); -} - -/* Get number of edges. */ -static int importer_GetNumEdges(ImportMeshData *import_data) -{ - DerivedMesh *dm = import_data->dm; - return dm->getNumEdges(dm); -} - -/* Get number of loops. */ -static int importer_GetNumLoops(ImportMeshData *import_data) -{ - DerivedMesh *dm = import_data->dm; - return dm->getNumLoops(dm); -} - -/* Get number of polys. */ -static int importer_GetNumPolys(ImportMeshData *import_data) -{ - DerivedMesh *dm = import_data->dm; - return dm->getNumPolys(dm); -} - -/* Get 3D coordinate of vertex with given index. */ -static void importer_GetVertCoord(ImportMeshData *import_data, int vert_index, float coord[3]) -{ - MVert *mvert = import_data->mvert; - - BLI_assert(vert_index >= 0 && vert_index < import_data->dm->getNumVerts(import_data->dm)); - - mul_v3_m4v3(coord, import_data->obmat, mvert[vert_index].co); -} - -/* Get index of vertices which are adjucent to edge specified by it's index. */ -static void importer_GetEdgeVerts(ImportMeshData *import_data, int edge_index, int *v1, int *v2) -{ - MEdge *medge = &import_data->medge[edge_index]; - - BLI_assert(edge_index >= 0 && edge_index < import_data->dm->getNumEdges(import_data->dm)); - - *v1 = medge->v1; - *v2 = medge->v2; -} - -/* Get number of adjucent vertices to the poly specified by it's index. */ -static int importer_GetPolyNumVerts(ImportMeshData *import_data, int poly_index) -{ - MPoly *mpoly = import_data->mpoly; - - BLI_assert(poly_index >= 0 && poly_index < import_data->dm->getNumPolys(import_data->dm)); - - return mpoly[poly_index].totloop; -} - -/* Get list of adjucent vertices to the poly specified by it's index. */ -static void importer_GetPolyVerts(ImportMeshData *import_data, int poly_index, int *verts) -{ - MPoly *mpoly = &import_data->mpoly[poly_index]; - MLoop *mloop = import_data->mloop + mpoly->loopstart; - int i; - BLI_assert(poly_index >= 0 && poly_index < import_data->dm->getNumPolys(import_data->dm)); - for (i = 0; i < mpoly->totloop; i++, mloop++) { - verts[i] = mloop->v; - } -} - -// Triangulate 2D polygon. -#if 0 -static int importer_triangulate2DPoly(ImportMeshData *UNUSED(import_data), - const float (*vertices)[2], int num_vertices, - unsigned int (*triangles)[3]) -{ - // TODO(sergey): Currently import_data is unused but in the future we could - // put memory arena there which will reduce amount of allocations happening - // over the triangulation period. - // - // However that's not so much straighforward to do it right now because we - // also are tu consider threaded import/export. - - BLI_assert(num_vertices > 3); - - BLI_polyfill_calc(vertices, num_vertices, triangles); - - return num_vertices - 2; -} -#endif - -static CarveMeshImporter MeshImporter = { - importer_GetNumVerts, - importer_GetNumEdges, - importer_GetNumLoops, - importer_GetNumPolys, - importer_GetVertCoord, - importer_GetEdgeVerts, - importer_GetPolyNumVerts, - importer_GetPolyVerts, - - /* TODO(sergey): We don't use BLI_polyfill_calc() because it tends - * to generate degenerated geometry which is fatal for booleans. - * - * For now we stick to Carve's triangulation. - */ - NULL, /* importer_triangulate2DPoly */ -}; - -/* **** Exporter from Carve to derived mesh **** */ - -typedef struct ExportMeshData { - DerivedMesh *dm; - float obimat[4][4]; - MVert *mvert; - MEdge *medge; - MLoop *mloop; - MPoly *mpoly; - int *vert_origindex; - int *edge_origindex; - int *poly_origindex; - int *loop_origindex; - - /* Objects and derived meshes of left and right operands. - * Used for custom data merge and interpolation. - */ - Object *ob_left; - Object *ob_right; - DerivedMesh *dm_left; - DerivedMesh *dm_right; - MVert *mvert_left; - MEdge *medge_left; - MLoop *mloop_left; - MPoly *mpoly_left; - MVert *mvert_right; - MEdge *medge_right; - MLoop *mloop_right; - MPoly *mpoly_right; - - float left_to_right_mat[4][4]; - - /* Hash to map materials from right object to result. */ - GHash *material_hash; -} ExportMeshData; - -BLI_INLINE Object *which_object(ExportMeshData *export_data, int which_mesh) -{ - Object *object = NULL; - switch (which_mesh) { - case CARVE_MESH_LEFT: - object = export_data->ob_left; - break; - case CARVE_MESH_RIGHT: - object = export_data->ob_right; - break; - } - return object; -} - -BLI_INLINE DerivedMesh *which_dm(ExportMeshData *export_data, int which_mesh) -{ - DerivedMesh *dm = NULL; - switch (which_mesh) { - case CARVE_MESH_LEFT: - dm = export_data->dm_left; - break; - case CARVE_MESH_RIGHT: - dm = export_data->dm_right; - break; - } - return dm; -} - -BLI_INLINE MVert *which_mvert(ExportMeshData *export_data, int which_mesh) -{ - MVert *mvert = NULL; - switch (which_mesh) { - case CARVE_MESH_LEFT: - mvert = export_data->mvert_left; - break; - case CARVE_MESH_RIGHT: - mvert = export_data->mvert_right; - break; - } - return mvert; -} - -BLI_INLINE MEdge *which_medge(ExportMeshData *export_data, int which_mesh) -{ - MEdge *medge = NULL; - switch (which_mesh) { - case CARVE_MESH_LEFT: - medge = export_data->medge_left; - break; - case CARVE_MESH_RIGHT: - medge = export_data->medge_right; - break; - } - return medge; -} - -BLI_INLINE MLoop *which_mloop(ExportMeshData *export_data, int which_mesh) -{ - MLoop *mloop = NULL; - switch (which_mesh) { - case CARVE_MESH_LEFT: - mloop = export_data->mloop_left; - break; - case CARVE_MESH_RIGHT: - mloop = export_data->mloop_right; - break; - } - return mloop; -} - -BLI_INLINE MPoly *which_mpoly(ExportMeshData *export_data, int which_mesh) -{ - MPoly *mpoly = NULL; - switch (which_mesh) { - case CARVE_MESH_LEFT: - mpoly = export_data->mpoly_left; - break; - case CARVE_MESH_RIGHT: - mpoly = export_data->mpoly_right; - break; - } - return mpoly; -} - -/* Create new external mesh */ -static void exporter_InitGeomArrays(ExportMeshData *export_data, - int num_verts, int num_edges, - int num_loops, int num_polys) -{ - DerivedMesh *dm = CDDM_new(num_verts, num_edges, 0, - num_loops, num_polys); - DerivedMesh *dm_left = export_data->dm_left, - *dm_right = export_data->dm_right; - - /* Mask for custom data layers to be merged from operands. */ - CustomDataMask merge_mask = CD_MASK_DERIVEDMESH & ~CD_MASK_ORIGINDEX; - - export_data->dm = dm; - export_data->mvert = dm->getVertArray(dm); - export_data->medge = dm->getEdgeArray(dm); - export_data->mloop = dm->getLoopArray(dm); - export_data->mpoly = dm->getPolyArray(dm); - - /* Merge custom data layers from operands. - * - * Will only create custom data layers for all the layers which appears in - * the operand. Data for those layers will not be allocated or initialized. - */ - - CustomData_merge(&dm_left->vertData, &dm->vertData, merge_mask, CD_DEFAULT, num_verts); - CustomData_merge(&dm_right->vertData, &dm->vertData, merge_mask, CD_DEFAULT, num_verts); - - CustomData_merge(&dm_left->loopData, &dm->loopData, merge_mask, CD_DEFAULT, num_loops); - CustomData_merge(&dm_right->loopData, &dm->loopData, merge_mask, CD_DEFAULT, num_loops); - - CustomData_merge(&dm_left->polyData, &dm->polyData, merge_mask, CD_DEFAULT, num_polys); - CustomData_merge(&dm_right->polyData, &dm->polyData, merge_mask, CD_DEFAULT, num_polys); - - CustomData_merge(&dm_left->edgeData, &dm->edgeData, merge_mask, CD_DEFAULT, num_edges); - CustomData_merge(&dm_right->edgeData, &dm->edgeData, merge_mask, CD_DEFAULT, num_edges); - - export_data->vert_origindex = dm->getVertDataArray(dm, CD_ORIGINDEX); - export_data->edge_origindex = dm->getEdgeDataArray(dm, CD_ORIGINDEX); - export_data->poly_origindex = dm->getPolyDataArray(dm, CD_ORIGINDEX); - export_data->loop_origindex = dm->getLoopDataArray(dm, CD_ORIGINDEX); -} - -/* Set coordinate of vertex with given index. */ -static void exporter_SetVert(ExportMeshData *export_data, - int vert_index, float coord[3], - int which_orig_mesh, int orig_vert_index) -{ - DerivedMesh *dm = export_data->dm; - DerivedMesh *dm_orig; - MVert *mvert = export_data->mvert; - - BLI_assert(vert_index >= 0 && vert_index <= dm->getNumVerts(dm)); - - dm_orig = which_dm(export_data, which_orig_mesh); - if (dm_orig) { - BLI_assert(orig_vert_index >= 0 && orig_vert_index < dm_orig->getNumVerts(dm_orig)); - mvert[vert_index] = which_mvert(export_data, which_orig_mesh)[orig_vert_index]; - CustomData_copy_data(&dm_orig->vertData, &dm->vertData, orig_vert_index, vert_index, 1); - } - - /* Set original index of the vertex. */ - if (export_data->vert_origindex) { - if (which_orig_mesh == CARVE_MESH_LEFT) { - export_data->vert_origindex[vert_index] = orig_vert_index; - } - else { - export_data->vert_origindex[vert_index] = ORIGINDEX_NONE; - } - } - - mul_v3_m4v3(mvert[vert_index].co, export_data->obimat, coord); -} - -/* Set vertices which are adjucent to the edge specified by it's index. */ -static void exporter_SetEdge(ExportMeshData *export_data, - int edge_index, int v1, int v2, - int which_orig_mesh, int orig_edge_index) -{ - DerivedMesh *dm = export_data->dm; - MEdge *medge = &export_data->medge[edge_index]; - DerivedMesh *dm_orig; - - BLI_assert(edge_index >= 0 && edge_index < dm->getNumEdges(dm)); - BLI_assert(v1 >= 0 && v1 < dm->getNumVerts(dm)); - BLI_assert(v2 >= 0 && v2 < dm->getNumVerts(dm)); - - dm_orig = which_dm(export_data, which_orig_mesh); - if (dm_orig) { - BLI_assert(orig_edge_index >= 0 && orig_edge_index < dm_orig->getNumEdges(dm_orig)); - - *medge = which_medge(export_data, which_orig_mesh)[orig_edge_index]; - - /* Copy all edge layers, including medge. */ - CustomData_copy_data(&dm_orig->edgeData, &dm->edgeData, orig_edge_index, edge_index, 1); - } - - /* Set original index of the edge. */ - if (export_data->edge_origindex) { - if (which_orig_mesh == CARVE_MESH_LEFT) { - export_data->edge_origindex[edge_index] = orig_edge_index; - } - else { - export_data->edge_origindex[edge_index] = ORIGINDEX_NONE; - } - } - - medge->v1 = v1; - medge->v2 = v2; - - medge->flag |= ME_EDGEDRAW | ME_EDGERENDER; -} - -static void setMPolyMaterial(ExportMeshData *export_data, - MPoly *mpoly, - int which_orig_mesh) -{ - Object *orig_object; - GHash *material_hash; - Material *orig_mat; - - if (which_orig_mesh == CARVE_MESH_LEFT) { - /* No need to change materian index for faces from left operand */ - return; - } - - material_hash = export_data->material_hash; - orig_object = which_object(export_data, which_orig_mesh); - - /* Set material, based on lookup in hash table. */ - orig_mat = give_current_material(orig_object, mpoly->mat_nr + 1); - - if (orig_mat) { - /* For faces from right operand check if there's requested material - * in the left operand. And if it is, use index of that material, - * otherwise fallback to first material (material with index=0). - */ - if (!BLI_ghash_haskey(material_hash, orig_mat)) { - int a, mat_nr; - - mat_nr = 0; - for (a = 0; a < export_data->ob_left->totcol; a++) { - if (give_current_material(export_data->ob_left, a + 1) == orig_mat) { - mat_nr = a; - break; - } - } - - BLI_ghash_insert(material_hash, orig_mat, SET_INT_IN_POINTER(mat_nr)); - - mpoly->mat_nr = mat_nr; - } - else - mpoly->mat_nr = GET_INT_FROM_POINTER(BLI_ghash_lookup(material_hash, orig_mat)); - } - else { - mpoly->mat_nr = 0; - } -} - -/* Set list of adjucent loops to the poly specified by it's index. */ -static void exporter_SetPoly(ExportMeshData *export_data, - int poly_index, int start_loop, int num_loops, - int which_orig_mesh, int orig_poly_index) -{ - DerivedMesh *dm = export_data->dm; - MPoly *mpoly = &export_data->mpoly[poly_index]; - DerivedMesh *dm_orig; - int i; - - /* Poly is always to be either from left or right operand. */ - dm_orig = which_dm(export_data, which_orig_mesh); - - BLI_assert(poly_index >= 0 && poly_index < dm->getNumPolys(dm)); - BLI_assert(start_loop >= 0 && start_loop <= dm->getNumLoops(dm) - num_loops); - BLI_assert(num_loops >= 3); - BLI_assert(dm_orig != NULL); - BLI_assert(orig_poly_index >= 0 && orig_poly_index < dm_orig->getNumPolys(dm_orig)); - - /* Copy all poly layers, including mpoly. */ - *mpoly = which_mpoly(export_data, which_orig_mesh)[orig_poly_index]; - CustomData_copy_data(&dm_orig->polyData, &dm->polyData, orig_poly_index, poly_index, 1); - - /* Set material of the curren poly. - * This would re-map materials from right operand to materials from the - * left one as well. - */ - setMPolyMaterial(export_data, mpoly, which_orig_mesh); - - /* Set original index of the poly. */ - if (export_data->poly_origindex) { - if (which_orig_mesh == CARVE_MESH_LEFT) { - export_data->poly_origindex[poly_index] = orig_poly_index; - } - else { - export_data->poly_origindex[poly_index] = ORIGINDEX_NONE; - } - } - - /* Set poly data itself. */ - mpoly->loopstart = start_loop; - mpoly->totloop = num_loops; - - /* Interpolate data for poly loops. */ - { - MVert *source_mverts = which_mvert(export_data, which_orig_mesh); - MLoop *source_mloops = which_mloop(export_data, which_orig_mesh); - MPoly *source_mpolys = which_mpoly(export_data, which_orig_mesh); - MPoly *source_poly = &source_mpolys[orig_poly_index]; - MVert *target_mverts = export_data->mvert; - MLoop *target_mloops = export_data->mloop; - float (*transform)[4] = NULL; - - if (which_orig_mesh == CARVE_MESH_RIGHT) { - transform = export_data->left_to_right_mat; - } - - for (i = 0; i < mpoly->totloop; i++) { - DM_loop_interp_from_poly(dm_orig, - source_mverts, - source_mloops, - source_poly, - dm, - target_mverts, - target_mloops, - transform, - i + mpoly->loopstart); - } - } -} - -/* Set list vertex and edge which are adjucent to loop with given index. */ -static void exporter_SetLoop(ExportMeshData *export_data, - int loop_index, int vertex, int edge, - int which_orig_mesh, int orig_loop_index) -{ - DerivedMesh *dm = export_data->dm; - MLoop *mloop = &export_data->mloop[loop_index]; - DerivedMesh *dm_orig; - - BLI_assert(loop_index >= 0 && loop_index < dm->getNumLoops(dm)); - BLI_assert(vertex >= 0 && vertex < dm->getNumVerts(dm)); - BLI_assert(edge >= 0 && vertex < dm->getNumEdges(dm)); - - dm_orig = which_dm(export_data, which_orig_mesh); - if (dm_orig) { - BLI_assert(orig_loop_index >= 0 && orig_loop_index < dm_orig->getNumLoops(dm_orig)); - - /* Copy all loop layers, including mloop. */ - *mloop = which_mloop(export_data, which_orig_mesh)[orig_loop_index]; - CustomData_copy_data(&dm_orig->loopData, &dm->loopData, orig_loop_index, loop_index, 1); - } - - /* Set original index of the loop. */ - if (export_data->loop_origindex) { - if (which_orig_mesh == CARVE_MESH_LEFT) { - export_data->loop_origindex[loop_index] = orig_loop_index; - } - else { - export_data->loop_origindex[loop_index] = ORIGINDEX_NONE; - } - } - - mloop->v = vertex; - mloop->e = edge; -} - -/* Edge index from a loop index for a given original mesh. */ -static int exporter_MapLoopToEdge(ExportMeshData *export_data, - int which_mesh, int loop_index) -{ - DerivedMesh *dm = which_dm(export_data, which_mesh); - MLoop *mloop = which_mloop(export_data, which_mesh); - - (void) dm; /* Unused in release builds. */ - - BLI_assert(dm != NULL); - BLI_assert(loop_index >= 0 && loop_index < dm->getNumLoops(dm)); - - return mloop[loop_index].e; -} - -static CarveMeshExporter MeshExporter = { - exporter_InitGeomArrays, - exporter_SetVert, - exporter_SetEdge, - exporter_SetPoly, - exporter_SetLoop, - exporter_MapLoopToEdge -}; - -static int operation_from_optype(int int_op_type) -{ - int operation; - - switch (int_op_type) { - case 1: - operation = CARVE_OP_INTERSECTION; - break; - case 2: - operation = CARVE_OP_UNION; - break; - case 3: - operation = CARVE_OP_A_MINUS_B; - break; - default: - BLI_assert(!"Should not happen"); - operation = -1; - break; - } - - return operation; -} - -static void prepare_import_data(Object *object, - DerivedMesh *dm, - const DMArrays *dm_arrays, - ImportMeshData *import_data) -{ - import_data->dm = dm; - copy_m4_m4(import_data->obmat, object->obmat); - import_data->mvert = dm_arrays->mvert; - import_data->medge = dm_arrays->medge; - import_data->mloop = dm_arrays->mloop; - import_data->mpoly = dm_arrays->mpoly; -} - -static struct CarveMeshDescr *carve_mesh_from_dm(Object *object, - DerivedMesh *dm, - const DMArrays *dm_arrays) -{ - ImportMeshData import_data; - prepare_import_data(object, dm, dm_arrays, &import_data); - return carve_addMesh(&import_data, &MeshImporter); -} - -static void prepare_export_data(Object *object_left, DerivedMesh *dm_left, const DMArrays *dm_left_arrays, - Object *object_right, DerivedMesh *dm_right, const DMArrays *dm_right_arrays, - ExportMeshData *export_data) -{ - float object_right_imat[4][4]; - - invert_m4_m4(export_data->obimat, object_left->obmat); - - export_data->ob_left = object_left; - export_data->ob_right = object_right; - - export_data->dm_left = dm_left; - export_data->dm_right = dm_right; - - export_data->mvert_left = dm_left_arrays->mvert; - export_data->medge_left = dm_left_arrays->medge; - export_data->mloop_left = dm_left_arrays->mloop; - export_data->mpoly_left = dm_left_arrays->mpoly; - export_data->mvert_right = dm_right_arrays->mvert; - export_data->medge_right = dm_right_arrays->medge; - export_data->mloop_right = dm_right_arrays->mloop; - export_data->mpoly_right = dm_right_arrays->mpoly; - - export_data->material_hash = BLI_ghash_ptr_new("CSG_mat gh"); - - /* Matrix to convert coord from left object's loca; space to - * right object's local space. - */ - invert_m4_m4(object_right_imat, object_right->obmat); - mul_m4_m4m4(export_data->left_to_right_mat, object_left->obmat, - object_right_imat); -} - -DerivedMesh *NewBooleanDerivedMesh(DerivedMesh *dm, struct Object *ob, - DerivedMesh *dm_select, struct Object *ob_select, - int int_op_type) -{ - - struct CarveMeshDescr *left, *right, *output = NULL; - DerivedMesh *output_dm = NULL; - int operation; - bool result; - DMArrays dm_left_arrays, dm_right_arrays; - - if (dm == NULL || dm_select == NULL) { - return NULL; - } - - operation = operation_from_optype(int_op_type); - if (operation == -1) { - return NULL; - } - - dm_arrays_get(dm_select, &dm_left_arrays); - dm_arrays_get(dm, &dm_right_arrays); - - left = carve_mesh_from_dm(ob_select, dm_select, &dm_left_arrays); - right = carve_mesh_from_dm(ob, dm, &dm_right_arrays); - - result = carve_performBooleanOperation(left, right, operation, &output); - - carve_deleteMesh(left); - carve_deleteMesh(right); - - if (result) { - ExportMeshData export_data; - - prepare_export_data(ob_select, dm_select, &dm_left_arrays, - ob, dm, &dm_right_arrays, - &export_data); - - carve_exportMesh(output, &MeshExporter, &export_data); - output_dm = export_data.dm; - - /* Free memory used by export mesh. */ - BLI_ghash_free(export_data.material_hash, NULL, NULL); - - output_dm->cd_flag |= dm->cd_flag | dm_select->cd_flag; - output_dm->dirty |= DM_DIRTY_NORMALS; - carve_deleteMesh(output); - } - - dm_arrays_free(&dm_left_arrays); - dm_arrays_free(&dm_right_arrays); - - return output_dm; -} diff --git a/source/blender/modifiers/intern/MOD_boolean_util.h b/source/blender/modifiers/intern/MOD_boolean_util.h deleted file mode 100644 index 00d7c37b266..00000000000 --- a/source/blender/modifiers/intern/MOD_boolean_util.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * ***** 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. - * - * The Original Code is Copyright (C) Blender Foundation. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** \file blender/modifiers/intern/MOD_boolean_util.h - * \ingroup modifiers - */ - - -#ifndef __MOD_BOOLEAN_UTIL_H__ -#define __MOD_BOOLEAN_UTIL_H__ - -struct Object; -struct DerivedMesh; - -/* Performs a boolean between two mesh objects, it is assumed that both objects - * are in fact mesh object. On success returns a DerivedMesh. On failure - * returns NULL and reports an error. */ - -struct DerivedMesh *NewBooleanDerivedMesh(struct DerivedMesh *dm, struct Object *ob, - struct DerivedMesh *dm_select, struct Object *ob_select, int int_op_type); - -#endif /* MOD_BOOLEAN_UTILS */ diff --git a/source/blender/modifiers/intern/MOD_build.c b/source/blender/modifiers/intern/MOD_build.c index 7a52ede8838..2e0b13b0603 100644 --- a/source/blender/modifiers/intern/MOD_build.c +++ b/source/blender/modifiers/intern/MOD_build.c @@ -154,7 +154,7 @@ static DerivedMesh *applyModifier(ModifierData *md, const struct EvaluationConte numLoops_dst += mp->totloop; } - BLI_assert(hash_num == BLI_ghash_size(vertHash)); + BLI_assert(hash_num == BLI_ghash_len(vertHash)); /* get the set of edges that will be in the new mesh (i.e. all edges * that have both verts in the new mesh) @@ -187,7 +187,7 @@ static DerivedMesh *applyModifier(ModifierData *md, const struct EvaluationConte */ medge = medge_src; hash_num = 0; - BLI_assert(hash_num == BLI_ghash_size(vertHash)); + BLI_assert(hash_num == BLI_ghash_len(vertHash)); for (i = 0; i < numEdges_dst; i++) { void **val_p; me = medge + edgeMap[i]; @@ -201,11 +201,11 @@ static DerivedMesh *applyModifier(ModifierData *md, const struct EvaluationConte hash_num++; } } - BLI_assert(hash_num == BLI_ghash_size(vertHash)); + BLI_assert(hash_num == BLI_ghash_len(vertHash)); /* get the set of edges that will be in the new mesh */ for (i = 0; i < numEdges_dst; i++) { - j = BLI_ghash_size(edgeHash); + j = BLI_ghash_len(edgeHash); BLI_ghash_insert(edgeHash, SET_INT_IN_POINTER(j), SET_INT_IN_POINTER(edgeMap[i])); @@ -232,8 +232,8 @@ static DerivedMesh *applyModifier(ModifierData *md, const struct EvaluationConte /* now we know the number of verts, edges and faces, we can create * the mesh */ - result = CDDM_from_template(dm, BLI_ghash_size(vertHash), - BLI_ghash_size(edgeHash), 0, numLoops_dst, numFaces_dst); + result = CDDM_from_template(dm, BLI_ghash_len(vertHash), + BLI_ghash_len(edgeHash), 0, numLoops_dst, numFaces_dst); /* copy the vertices across */ GHASH_ITER (gh_iter, vertHash) { @@ -250,7 +250,7 @@ static DerivedMesh *applyModifier(ModifierData *md, const struct EvaluationConte } /* copy the edges across, remapping indices */ - for (i = 0; i < BLI_ghash_size(edgeHash); i++) { + for (i = 0; i < BLI_ghash_len(edgeHash); i++) { MEdge source; MEdge *dest; int oldIndex = GET_INT_FROM_POINTER(BLI_ghash_lookup(edgeHash, SET_INT_IN_POINTER(i))); diff --git a/source/blender/modifiers/intern/MOD_dynamicpaint.c b/source/blender/modifiers/intern/MOD_dynamicpaint.c index cf3f84364ea..da5d9a29be5 100644 --- a/source/blender/modifiers/intern/MOD_dynamicpaint.c +++ b/source/blender/modifiers/intern/MOD_dynamicpaint.c @@ -29,7 +29,7 @@ #include "DNA_dynamicpaint_types.h" #include "DNA_object_types.h" -#include "DNA_object_force.h" +#include "DNA_object_force_types.h" #include "DNA_scene_types.h" #include "BLI_utildefines.h" diff --git a/source/blender/modifiers/intern/MOD_fluidsim.c b/source/blender/modifiers/intern/MOD_fluidsim.c index f9e7f10653b..75f57de2a37 100644 --- a/source/blender/modifiers/intern/MOD_fluidsim.c +++ b/source/blender/modifiers/intern/MOD_fluidsim.c @@ -34,7 +34,7 @@ #include "DNA_scene_types.h" -#include "DNA_object_fluidsim.h" +#include "DNA_object_fluidsim_types.h" #include "DNA_object_types.h" #include "BLI_utildefines.h" diff --git a/source/blender/modifiers/intern/MOD_fluidsim_util.c b/source/blender/modifiers/intern/MOD_fluidsim_util.c index c9f475ad228..65f45c9af64 100644 --- a/source/blender/modifiers/intern/MOD_fluidsim_util.c +++ b/source/blender/modifiers/intern/MOD_fluidsim_util.c @@ -40,7 +40,7 @@ #include "DNA_scene_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "DNA_object_fluidsim.h" +#include "DNA_object_fluidsim_types.h" #include "BLI_blenlib.h" #include "BLI_math.h" diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c index da233a18d0a..e8fc832b597 100644 --- a/source/blender/modifiers/intern/MOD_meshdeform.c +++ b/source/blender/modifiers/intern/MOD_meshdeform.c @@ -49,6 +49,8 @@ #include "MEM_guardedalloc.h" +#include "DEG_depsgraph.h" + #include "MOD_util.h" #ifdef __SSE2__ @@ -300,7 +302,7 @@ static void meshdeformModifier_do( * * We'll support this case once granular dependency graph is landed. */ - if (mmd->object == md->scene->obedit) { + if (mmd->object == OBEDIT_FROM_EVAL_CTX(eval_ctx)) { BMEditMesh *em = BKE_editmesh_from_object(mmd->object); tmpdm = editbmesh_get_derived_cage_and_final(eval_ctx, md->scene, mmd->object, em, 0, &cagedm); if (tmpdm) diff --git a/source/blender/modifiers/intern/MOD_multires.c b/source/blender/modifiers/intern/MOD_multires.c index 2b675d36140..6704526ea03 100644 --- a/source/blender/modifiers/intern/MOD_multires.c +++ b/source/blender/modifiers/intern/MOD_multires.c @@ -48,6 +48,8 @@ #include "MOD_modifiertypes.h" +#include "DEG_depsgraph.h" + static void initData(ModifierData *md) { MultiresModifierData *mmd = (MultiresModifierData *)md; @@ -67,7 +69,7 @@ static void copyData(ModifierData *md, ModifierData *target) modifier_copyData_generic(md, target); } -static DerivedMesh *applyModifier(ModifierData *md, const struct EvaluationContext *UNUSED(eval_ctx), Object *ob, +static DerivedMesh *applyModifier(ModifierData *md, const struct EvaluationContext *eval_ctx, Object *ob, DerivedMesh *dm, ModifierApplyFlag flag) { MultiresModifierData *mmd = (MultiresModifierData *)md; @@ -94,7 +96,7 @@ static DerivedMesh *applyModifier(ModifierData *md, const struct EvaluationConte 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, ob, flags, eval_ctx->object_mode); if (result == dm) return dm; diff --git a/source/blender/modifiers/intern/MOD_shrinkwrap.c b/source/blender/modifiers/intern/MOD_shrinkwrap.c index c87fdd321ab..8b9a7c42eb2 100644 --- a/source/blender/modifiers/intern/MOD_shrinkwrap.c +++ b/source/blender/modifiers/intern/MOD_shrinkwrap.c @@ -103,7 +103,7 @@ static void foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk, walk(userData, ob, &smd->auxTarget, IDWALK_CB_NOP); } -static void deformVerts(ModifierData *md, const struct EvaluationContext *UNUSED(eval_ctx), +static void deformVerts(ModifierData *md, const struct EvaluationContext *eval_ctx, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts, @@ -118,13 +118,13 @@ static void deformVerts(ModifierData *md, const struct EvaluationContext *UNUSED dm = get_cddm(ob, NULL, dm, vertexCos, dependsOnNormals(md)); } - shrinkwrapModifier_deform((ShrinkwrapModifierData *)md, ob, dm, vertexCos, numVerts, forRender); + shrinkwrapModifier_deform(eval_ctx, (ShrinkwrapModifierData *)md, ob, dm, vertexCos, numVerts, forRender); if (dm != derivedData) dm->release(dm); } -static void deformVertsEM(ModifierData *md, const struct EvaluationContext *UNUSED(eval_ctx), Object *ob, +static void deformVertsEM(ModifierData *md, const struct EvaluationContext *eval_ctx, Object *ob, struct BMEditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) { @@ -136,7 +136,7 @@ static void deformVertsEM(ModifierData *md, const struct EvaluationContext *UNUS dm = get_cddm(ob, editData, dm, vertexCos, dependsOnNormals(md)); } - shrinkwrapModifier_deform((ShrinkwrapModifierData *)md, ob, dm, vertexCos, numVerts, false); + shrinkwrapModifier_deform(eval_ctx, (ShrinkwrapModifierData *)md, ob, dm, vertexCos, numVerts, false); if (dm != derivedData) dm->release(dm); diff --git a/source/blender/modifiers/intern/MOD_skin.c b/source/blender/modifiers/intern/MOD_skin.c index 97afe6d5e87..d2d8da289b7 100644 --- a/source/blender/modifiers/intern/MOD_skin.c +++ b/source/blender/modifiers/intern/MOD_skin.c @@ -1470,7 +1470,7 @@ static void hull_merge_triangles(SkinOutput *so, const SkinModifierData *smd) while (!BLI_heap_is_empty(heap)) { BMFace *adj[2]; - e = BLI_heap_popmin(heap); + e = BLI_heap_pop_min(heap); if (BM_edge_face_pair(e, &adj[0], &adj[1])) { /* If both triangles still free, and if they don't already diff --git a/source/blender/modifiers/intern/MOD_smoke.c b/source/blender/modifiers/intern/MOD_smoke.c index e66afe07841..9881d7ee9b9 100644 --- a/source/blender/modifiers/intern/MOD_smoke.c +++ b/source/blender/modifiers/intern/MOD_smoke.c @@ -41,7 +41,7 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_smoke_types.h" -#include "DNA_object_force.h" +#include "DNA_object_force_types.h" #include "BLI_utildefines.h" diff --git a/source/blender/modifiers/intern/MOD_softbody.c b/source/blender/modifiers/intern/MOD_softbody.c index 020dd3da6a5..d0b1d7361cc 100644 --- a/source/blender/modifiers/intern/MOD_softbody.c +++ b/source/blender/modifiers/intern/MOD_softbody.c @@ -35,7 +35,7 @@ #include <stdio.h> #include "DNA_scene_types.h" -#include "DNA_object_force.h" +#include "DNA_object_force_types.h" #include "BLI_utildefines.h" diff --git a/source/blender/modifiers/intern/MOD_subsurf.c b/source/blender/modifiers/intern/MOD_subsurf.c index a09923d6dfe..8fd510a6662 100644 --- a/source/blender/modifiers/intern/MOD_subsurf.c +++ b/source/blender/modifiers/intern/MOD_subsurf.c @@ -117,7 +117,7 @@ static DerivedMesh *applyModifier(ModifierData *md, const EvaluationContext *eva subsurf_flags |= SUBSURF_USE_RENDER_PARAMS; if (isFinalCalc) subsurf_flags |= SUBSURF_IS_FINAL_CALC; - if (ob->mode & OB_MODE_EDIT) + if (eval_ctx->object_mode & OB_MODE_EDIT) subsurf_flags |= SUBSURF_IN_EDIT_MODE; #ifdef WITH_OPENSUBDIV @@ -132,7 +132,7 @@ static DerivedMesh *applyModifier(ModifierData *md, const EvaluationContext *eva if (U.opensubdiv_compute_type == USER_OPENSUBDIV_COMPUTE_NONE) { modifier_setError(md, "OpenSubdiv is disabled in User Preferences"); } - else if ((ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT)) != 0) { + else if ((eval_ctx->object_mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT)) != 0) { modifier_setError(md, "OpenSubdiv is not supported in paint modes"); } else if ((DEG_get_eval_flags_for_id(eval_ctx->depsgraph, &ob->id) & DAG_EVAL_NEED_CPU) == 0) { @@ -143,6 +143,8 @@ static DerivedMesh *applyModifier(ModifierData *md, const EvaluationContext *eva modifier_setError(md, "OpenSubdiv is disabled due to dependencies"); } } +#else + UNUSED_VARS(ob); #endif result = subsurf_make_derived_from_derived(derivedData, smd, NULL, subsurf_flags); diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c index 046a0ab27bf..85347288872 100644 --- a/source/blender/modifiers/intern/MOD_surfacedeform.c +++ b/source/blender/modifiers/intern/MOD_surfacedeform.c @@ -11,6 +11,8 @@ #include "BKE_library_query.h" #include "BKE_modifier.h" +#include "DEG_depsgraph.h" + #include "MEM_guardedalloc.h" #include "MOD_util.h" @@ -1097,7 +1099,9 @@ static void deformVert( } } -static void surfacedeformModifier_do(ModifierData *md, float (*vertexCos)[3], unsigned int numverts, Object *ob) +static void surfacedeformModifier_do( + ModifierData *md, const EvaluationContext *eval_ctx, + float (*vertexCos)[3], unsigned int numverts, Object *ob) { SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md; DerivedMesh *tdm; @@ -1110,7 +1114,7 @@ static void surfacedeformModifier_do(ModifierData *md, float (*vertexCos)[3], un } /* Handle target mesh both in and out of edit mode */ - if (smd->target == md->scene->obedit) { + if (smd->target == OBEDIT_FROM_EVAL_CTX(eval_ctx)) { BMEditMesh *em = BKE_editmesh_from_object(smd->target); tdm = em->derivedFinal; } @@ -1180,20 +1184,22 @@ static void surfacedeformModifier_do(ModifierData *md, float (*vertexCos)[3], un } } -static void deformVerts(ModifierData *md, const struct EvaluationContext *UNUSED(eval_ctx), - Object *ob, DerivedMesh *UNUSED(derivedData), - float (*vertexCos)[3], int numVerts, - ModifierApplyFlag UNUSED(flag)) +static void deformVerts( + ModifierData *md, const struct EvaluationContext *eval_ctx, + Object *ob, DerivedMesh *UNUSED(derivedData), + float (*vertexCos)[3], int numVerts, + ModifierApplyFlag UNUSED(flag)) { - surfacedeformModifier_do(md, vertexCos, numVerts, ob); + surfacedeformModifier_do(md, eval_ctx, vertexCos, numVerts, ob); } -static void deformVertsEM(ModifierData *md, const struct EvaluationContext *UNUSED(eval_ctx), - Object *ob, struct BMEditMesh *UNUSED(editData), - DerivedMesh *UNUSED(derivedData), - float (*vertexCos)[3], int numVerts) +static void deformVertsEM( + ModifierData *md, const struct EvaluationContext *eval_ctx, + Object *ob, struct BMEditMesh *UNUSED(editData), + DerivedMesh *UNUSED(derivedData), + float (*vertexCos)[3], int numVerts) { - surfacedeformModifier_do(md, vertexCos, numVerts, ob); + surfacedeformModifier_do(md, eval_ctx, vertexCos, numVerts, ob); } static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) |