diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-10-09 08:52:46 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-10-09 09:48:28 +0300 |
commit | 1b910082a0effdeb06653203b1d773094a2068e5 (patch) | |
tree | 3657576cafbcdf82f32b44c2ea64710c263074eb /source/blender/blenkernel | |
parent | 79ca13a7456e34ab961ae2fd46c96b9bc6c03f91 (diff) |
Edit Mesh: replace DerivedMesh w/ Mesh
DerivedMesh is now removed from edit-mesh modifier evaluation.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_DerivedMesh.h | 10 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_cdderivedmesh.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_editmesh.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 72 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 26 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/crazyspace.c | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/editderivedmesh.c | 7 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/editmesh.c | 16 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object_dupli.c | 4 |
10 files changed, 47 insertions, 105 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 3db032da1b1..db918bb0fbd 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -514,7 +514,7 @@ void DM_interp_poly_data( * In use now by vertex/weight paint and particles */ DMCoNo *mesh_get_mapped_verts_nors(struct Scene *scene, struct Object *ob); #endif -void mesh_get_mapped_verts_coords(DerivedMesh *dm, float (*r_cos)[3], const int totcos); +void mesh_get_mapped_verts_coords(struct Mesh *me_eval, float (*r_cos)[3], const int totcos); /* */ @@ -537,15 +537,13 @@ DerivedMesh *mesh_create_derived_no_deform_render( struct Object *ob, float (*vertCos)[3], CustomDataMask dataMask); -DerivedMesh *editbmesh_get_derived_cage( +struct Mesh *editbmesh_get_eval_cage( struct Depsgraph *depsgraph, struct Scene *scene, struct Object *, struct BMEditMesh *em, CustomDataMask dataMask); -DerivedMesh *editbmesh_get_derived_cage_and_final( +struct Mesh *editbmesh_get_eval_cage_and_final( struct Depsgraph *depsgraph, struct Scene *scene, struct Object *, struct BMEditMesh *em, CustomDataMask dataMask, - DerivedMesh **r_final); - -DerivedMesh *object_get_derived_final(struct Object *ob, const bool for_render); + struct Mesh **r_final); float (*editbmesh_get_vertex_cos(struct BMEditMesh *em, int *r_numVerts))[3]; bool editbmesh_modifier_is_enabled(struct Scene *scene, struct ModifierData *md, bool has_prev_mesh); diff --git a/source/blender/blenkernel/BKE_cdderivedmesh.h b/source/blender/blenkernel/BKE_cdderivedmesh.h index b31a3548a1e..6d96bd6ab7c 100644 --- a/source/blender/blenkernel/BKE_cdderivedmesh.h +++ b/source/blender/blenkernel/BKE_cdderivedmesh.h @@ -178,6 +178,4 @@ void CDDM_set_mface(struct DerivedMesh *dm, struct MFace *mface); void CDDM_set_mloop(struct DerivedMesh *dm, struct MLoop *mloop); void CDDM_set_mpoly(struct DerivedMesh *dm, struct MPoly *mpoly); -void CDDM_to_mesh__fast_borrow(struct DerivedMesh *dm, struct Mesh *me, const struct Mesh *me_reference); - #endif diff --git a/source/blender/blenkernel/BKE_editmesh.h b/source/blender/blenkernel/BKE_editmesh.h index 65c2caa4d78..de4efaf37b0 100644 --- a/source/blender/blenkernel/BKE_editmesh.h +++ b/source/blender/blenkernel/BKE_editmesh.h @@ -64,8 +64,9 @@ typedef struct BMEditMesh { struct BMLoop *(*looptris)[3]; int tottri; + struct Mesh *mesh_eval_final, *mesh_eval_cage; + /*derivedmesh stuff*/ - struct DerivedMesh *derivedFinal, *derivedCage; CustomDataMask lastDataMask; unsigned char (*derivedVertColor)[4]; int derivedVertColorLen; diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 4fb99008e8c..444dd3c0db3 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -60,6 +60,7 @@ #include "BKE_material.h" #include "BKE_modifier.h" #include "BKE_mesh.h" +#include "BKE_mesh_iterators.h" #include "BKE_mesh_mapping.h" #include "BKE_mesh_runtime.h" #include "BKE_mesh_tangent.h" @@ -2307,24 +2308,16 @@ static void editbmesh_build_data( depsgraph, scene, obedit, em, dataMask, &me_cage, &me_final); - /* TODO(campbell): remove derived mesh conversion. */ - em->derivedFinal = CDDM_from_mesh_ex(me_final, CD_DUPLICATE, CD_MASK_MESH); - BKE_id_free(NULL, me_final); - if (me_cage != me_final) { - em->derivedCage = CDDM_from_mesh_ex(me_cage, CD_DUPLICATE, CD_MASK_MESH); - BKE_id_free(NULL, me_cage); - } - else { - em->derivedCage = em->derivedFinal; - } + em->mesh_eval_final = me_final; + em->mesh_eval_cage = me_cage; +#if 0 DM_set_object_boundbox(obedit, em->derivedFinal); +#endif em->lastDataMask = dataMask; - em->derivedFinal->needsFree = 0; - em->derivedCage->needsFree = 0; - BLI_assert(!(em->derivedFinal->dirty & DM_DIRTY_NORMALS)); + BLI_assert(!(em->mesh_eval_final->runtime.cd_dirty_vert & DM_DIRTY_NORMALS)); } static CustomDataMask object_get_datamask(const Depsgraph *depsgraph, Object *ob, bool *r_need_mapping) @@ -2559,29 +2552,29 @@ DerivedMesh *mesh_create_derived_no_deform( /***/ -DerivedMesh *editbmesh_get_derived_cage_and_final( +Mesh *editbmesh_get_eval_cage_and_final( struct Depsgraph *depsgraph, Scene *scene, Object *obedit, BMEditMesh *em, CustomDataMask dataMask, /* return args */ - DerivedMesh **r_final) + Mesh **r_final) { /* if there's no derived mesh or the last data mask used doesn't include * the data we need, rebuild the derived mesh */ dataMask |= object_get_datamask(depsgraph, obedit, NULL); - if (!em->derivedCage || + if (!em->mesh_eval_cage || (em->lastDataMask & dataMask) != dataMask) { editbmesh_build_data(depsgraph, scene, obedit, em, dataMask); } - *r_final = em->derivedFinal; - if (em->derivedFinal) { BLI_assert(!(em->derivedFinal->dirty & DM_DIRTY_NORMALS)); } - return em->derivedCage; + *r_final = em->mesh_eval_final; + if (em->mesh_eval_final) { BLI_assert(!(em->mesh_eval_final->runtime.cd_dirty_vert & DM_DIRTY_NORMALS)); } + return em->mesh_eval_cage; } -DerivedMesh *editbmesh_get_derived_cage( +Mesh *editbmesh_get_eval_cage( struct Depsgraph *depsgraph, Scene *scene, Object *obedit, BMEditMesh *em, CustomDataMask dataMask) { @@ -2590,40 +2583,17 @@ DerivedMesh *editbmesh_get_derived_cage( */ dataMask |= object_get_datamask(depsgraph, obedit, NULL); - if (!em->derivedCage || + if (!em->mesh_eval_cage || (em->lastDataMask & dataMask) != dataMask) { editbmesh_build_data(depsgraph, scene, obedit, em, dataMask); } - return em->derivedCage; + return em->mesh_eval_cage; } /***/ -/* get derived mesh from an object, using editbmesh if available. */ -DerivedMesh *object_get_derived_final(Object *ob, const bool for_render) -{ - if (for_render) { - /* TODO(sergey): use proper derived render here in the future. */ - return ob->derivedFinal; - } - - /* only return the editmesh if its from this object because - * we don't a mesh from another object's modifier stack: T43122 */ - if (ob->type == OB_MESH) { - Mesh *me = ob->data; - BMEditMesh *em = me->edit_btmesh; - if (em && (em->ob == ob)) { - DerivedMesh *dm = em->derivedFinal; - return dm; - } - } - - return ob->derivedFinal; -} - - /* UNUSED */ #if 0 @@ -2705,20 +2675,20 @@ static void make_vertexcos__mapFunc( } } -void mesh_get_mapped_verts_coords(DerivedMesh *dm, float (*r_cos)[3], const int totcos) +void mesh_get_mapped_verts_coords(Mesh *me_eval, float (*r_cos)[3], const int totcos) { - if (dm->foreachMappedVert) { + if (me_eval->runtime.deformed_only == false) { MappedUserData userData; memset(r_cos, 0, sizeof(*r_cos) * totcos); userData.vertexcos = r_cos; userData.vertex_visit = BLI_BITMAP_NEW(totcos, "vertexcos flags"); - dm->foreachMappedVert(dm, make_vertexcos__mapFunc, &userData, DM_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert(me_eval, make_vertexcos__mapFunc, &userData, MESH_FOREACH_NOP); MEM_freeN(userData.vertex_visit); } else { - int i; - for (i = 0; i < totcos; i++) { - dm->getVertCo(dm, i, r_cos[i]); + MVert *mv = me_eval->mvert; + for (int i = 0; i < totcos; i++, mv++) { + copy_v3_v3(r_cos[i], mv->co); } } } diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 83424da3a3d..9043460562d 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -2258,29 +2258,3 @@ void CDDM_set_mpoly(DerivedMesh *dm, MPoly *mpoly) cddm->mpoly = mpoly; } - -/** Hack to fill in an empty (non library mesh struct) with CDDM values. */ -void CDDM_to_mesh__fast_borrow(DerivedMesh *dm, Mesh *me, const Mesh *me_reference) -{ - CDDerivedMesh *cddm = (CDDerivedMesh *)dm; - me->totvert = cddm->dm.numVertData; - me->totedge = cddm->dm.numEdgeData; - me->totloop = cddm->dm.numLoopData; - me->totpoly = cddm->dm.numPolyData; - - me->mvert = cddm->mvert; - me->medge = cddm->medge; - me->mface = cddm->mface; - me->mloop = cddm->mloop; - me->mpoly = cddm->mpoly; - - me->vdata = dm->vertData; - me->edata = dm->edgeData; - me->ldata = dm->loopData; - me->pdata = dm->polyData; - - if (me_reference) { - me->mat = me_reference->mat; - me->totcol = me_reference->totcol; - } -} diff --git a/source/blender/blenkernel/intern/crazyspace.c b/source/blender/blenkernel/intern/crazyspace.c index 55a62e4981f..bfb6fbd897c 100644 --- a/source/blender/blenkernel/intern/crazyspace.c +++ b/source/blender/blenkernel/intern/crazyspace.c @@ -104,7 +104,7 @@ float (*BKE_crazyspace_get_mapped_editverts( struct Depsgraph *depsgraph, Scene *scene, Object *obedit))[3] { Mesh *me = obedit->data; - DerivedMesh *dm; + Mesh *me_eval; float (*vertexcos)[3]; int nverts = me->edit_btmesh->bm->totvert; @@ -117,11 +117,9 @@ float (*BKE_crazyspace_get_mapped_editverts( /* now get the cage */ vertexcos = MEM_mallocN(sizeof(*vertexcos) * nverts, "vertexcos map"); - dm = editbmesh_get_derived_cage(depsgraph, scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH); - - mesh_get_mapped_verts_coords(dm, vertexcos, nverts); + me_eval = editbmesh_get_eval_cage(depsgraph, scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH); - dm->release(dm); + mesh_get_mapped_verts_coords(me_eval, vertexcos, nverts); /* set back the flag, no new cage needs to be built, transform does it */ modifiers_disable_subsurf_temporary(obedit); diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c index 5ca8bcfd74d..e6873e66c91 100644 --- a/source/blender/blenkernel/intern/editderivedmesh.c +++ b/source/blender/blenkernel/intern/editderivedmesh.c @@ -51,6 +51,7 @@ #include "BKE_cdderivedmesh.h" #include "BKE_deform.h" #include "BKE_mesh.h" +#include "BKE_mesh_iterators.h" #include "BKE_editmesh.h" #include "BKE_editmesh_bvh.h" #include "BKE_editmesh_cache.h" @@ -528,12 +529,12 @@ static void cage_mapped_verts_callback( float (*BKE_editmesh_vertexCos_get(struct Depsgraph *depsgraph, BMEditMesh *em, Scene *scene, int *r_numVerts))[3] { - DerivedMesh *cage, *final; + Mesh *cage, *final; BLI_bitmap *visit_bitmap; struct CageUserData data; float (*cos_cage)[3]; - cage = editbmesh_get_derived_cage_and_final(depsgraph, scene, em->ob, em, CD_MASK_BAREMESH, &final); + cage = editbmesh_get_eval_cage_and_final(depsgraph, scene, em->ob, em, CD_MASK_BAREMESH, &final); cos_cage = MEM_callocN(sizeof(*cos_cage) * em->bm->totvert, "bmbvh cos_cage"); /* when initializing cage verts, we only want the first cage coordinate for each vertex, @@ -544,7 +545,7 @@ float (*BKE_editmesh_vertexCos_get(struct Depsgraph *depsgraph, BMEditMesh *em, data.cos_cage = cos_cage; data.visit_bitmap = visit_bitmap; - cage->foreachMappedVert(cage, cage_mapped_verts_callback, &data, DM_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert(cage, cage_mapped_verts_callback, &data, MESH_FOREACH_NOP); MEM_freeN(visit_bitmap); diff --git a/source/blender/blenkernel/intern/editmesh.c b/source/blender/blenkernel/intern/editmesh.c index 9e1713dc805..0d09f4be39f 100644 --- a/source/blender/blenkernel/intern/editmesh.c +++ b/source/blender/blenkernel/intern/editmesh.c @@ -39,6 +39,7 @@ #include "BKE_editmesh.h" #include "BKE_cdderivedmesh.h" +#include "BKE_library.h" BMEditMesh *BKE_editmesh_create(BMesh *bm, const bool do_tessellate) @@ -58,7 +59,7 @@ BMEditMesh *BKE_editmesh_copy(BMEditMesh *em) BMEditMesh *em_copy = MEM_callocN(sizeof(BMEditMesh), __func__); *em_copy = *em; - em_copy->derivedCage = em_copy->derivedFinal = NULL; + em_copy->mesh_eval_cage = em_copy->mesh_eval_final = NULL; em_copy->derivedVertColor = NULL; em_copy->derivedVertColorLen = 0; @@ -169,16 +170,13 @@ void BKE_editmesh_tessface_calc(BMEditMesh *em) void BKE_editmesh_free_derivedmesh(BMEditMesh *em) { - if (em->derivedCage) { - em->derivedCage->needsFree = 1; - em->derivedCage->release(em->derivedCage); + if (em->mesh_eval_cage) { + BKE_id_free(NULL, em->mesh_eval_cage); } - if (em->derivedFinal && em->derivedFinal != em->derivedCage) { - em->derivedFinal->needsFree = 1; - em->derivedFinal->release(em->derivedFinal); + if (em->mesh_eval_final && em->mesh_eval_final != em->mesh_eval_cage) { + BKE_id_free(NULL, em->mesh_eval_final); } - - em->derivedCage = em->derivedFinal = NULL; + em->mesh_eval_cage = em->mesh_eval_final = NULL; } /*does not free the BMEditMesh struct itself*/ diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 71cf08e267d..b1d994b6e18 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -2052,7 +2052,11 @@ static void give_parvert(Object *par, int nr, float vec[3]) BMEditMesh *em = me->edit_btmesh; DerivedMesh *dm; +#if 0 /* FIXME(campbell): use mesh for both. */ dm = (em) ? em->derivedFinal : par->derivedFinal; +#else + dm = par->derivedFinal; +#endif if (dm) { int count = 0; diff --git a/source/blender/blenkernel/intern/object_dupli.c b/source/blender/blenkernel/intern/object_dupli.c index 6d9520dad1e..d9aa6407474 100644 --- a/source/blender/blenkernel/intern/object_dupli.c +++ b/source/blender/blenkernel/intern/object_dupli.c @@ -488,7 +488,7 @@ static void make_duplis_verts(const DupliContext *ctx) /* We do not need any render-smecific handling anymore, depsgraph takes care of that. */ if (vdd.edit_btmesh != NULL) { - /* XXX TODO replace with equivalent of editbmesh_get_derived_cage when available. */ + /* XXX TODO replace with equivalent of editbmesh_get_eval_cage when available. */ vdd.me_eval = mesh_get_eval_deform(ctx->depsgraph, scene, parent, dm_mask); } else { @@ -758,7 +758,7 @@ static void make_duplis_faces(const DupliContext *ctx) /* We do not need any render-smecific handling anymore, depsgraph takes care of that. */ if (em != NULL) { - /* XXX TODO replace with equivalent of editbmesh_get_derived_cage when available. */ + /* XXX TODO replace with equivalent of editbmesh_get_eval_cage when available. */ fdd.me_eval = mesh_get_eval_deform(ctx->depsgraph, scene, parent, dm_mask); } else { |