From ce104c33d6e1257869f32ee4dbaf74bbe808e81d Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 20 May 2024 11:45:57 -0400 Subject: [PATCH] Cleanup: Move CDDerivedMesh to new legacy file Grouping the legacy DerivedMesh code in the same place helps keep the actively maintained code clearer and clarifies what we are hoping to remove in the future. --- source/blender/blenkernel/BKE_DerivedMesh.hh | 6 + source/blender/blenkernel/BKE_cdderivedmesh.h | 31 --- source/blender/blenkernel/CMakeLists.txt | 2 - .../blenkernel/intern/cdderivedmesh.cc | 196 ------------------ .../intern/mesh_legacy_derived_mesh.cc | 176 ++++++++++++++++ source/blender/blenkernel/intern/multires.cc | 2 +- .../blender/blenkernel/intern/shrinkwrap.cc | 1 - .../blender/blenkernel/intern/subsurf_ccg.cc | 2 +- source/blender/editors/object/object_bake.cc | 1 - 9 files changed, 184 insertions(+), 233 deletions(-) delete mode 100644 source/blender/blenkernel/BKE_cdderivedmesh.h delete mode 100644 source/blender/blenkernel/intern/cdderivedmesh.cc diff --git a/source/blender/blenkernel/BKE_DerivedMesh.hh b/source/blender/blenkernel/BKE_DerivedMesh.hh index 234362405fe..cc71356800c 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.hh +++ b/source/blender/blenkernel/BKE_DerivedMesh.hh @@ -175,6 +175,12 @@ void DM_release(DerivedMesh *dm); */ void DM_set_only_copy(DerivedMesh *dm, const CustomData_MeshMasks *mask); +/* creates a CDDerivedMesh from the given Mesh, this will reference the + * original data in Mesh, but it is safe to apply vertex coordinates or + * calculate normals as those functions will automatically create new + * data to not overwrite the original. */ +DerivedMesh *CDDM_from_mesh(Mesh *mesh); + /* -------------------------------------------------------------------- */ /** \name Custom Data Layer Access Functions * diff --git a/source/blender/blenkernel/BKE_cdderivedmesh.h b/source/blender/blenkernel/BKE_cdderivedmesh.h deleted file mode 100644 index 762b01850fe..00000000000 --- a/source/blender/blenkernel/BKE_cdderivedmesh.h +++ /dev/null @@ -1,31 +0,0 @@ -/* SPDX-FileCopyrightText: 2006 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup bke - * \section aboutcdderivedmesh CDDerivedMesh interface - * CDDerivedMesh (CD = Custom Data) is a DerivedMesh backend which stores - * mesh elements (vertices, edges and faces) as layers of custom element data. - * - * \note This is deprecated & should eventually be removed. - */ - -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -struct DerivedMesh; -struct Mesh; - -/* creates a CDDerivedMesh from the given Mesh, this will reference the - * original data in Mesh, but it is safe to apply vertex coordinates or - * calculate normals as those functions will automatically create new - * data to not overwrite the original. */ -struct DerivedMesh *CDDM_from_mesh(struct Mesh *mesh); - -#ifdef __cplusplus -} -#endif diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index fe2abf34233..7b8cb3489c2 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -89,7 +89,6 @@ set(SRC intern/cachefile.cc intern/callbacks.cc intern/camera.cc - intern/cdderivedmesh.cc intern/cloth.cc intern/collection.cc intern/collision.cc @@ -360,7 +359,6 @@ set(SRC BKE_callbacks.hh BKE_camera.h BKE_ccg.h - BKE_cdderivedmesh.h BKE_cloth.hh BKE_collection.hh BKE_collision.h diff --git a/source/blender/blenkernel/intern/cdderivedmesh.cc b/source/blender/blenkernel/intern/cdderivedmesh.cc deleted file mode 100644 index dda11c71d08..00000000000 --- a/source/blender/blenkernel/intern/cdderivedmesh.cc +++ /dev/null @@ -1,196 +0,0 @@ -/* SPDX-FileCopyrightText: 2006 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup bke - * Implementation of #CDDerivedMesh. - * BKE_cdderivedmesh.h contains the function prototypes for this file. - */ - -#include -#include -#include - -#include "BLI_utildefines.h" - -#include "BKE_DerivedMesh.hh" -#include "BKE_cdderivedmesh.h" -#include "BKE_editmesh.hh" -#include "BKE_mesh_mapping.hh" -#include "BKE_pbvh.hh" - -#include "DNA_curve_types.h" /* for Curve */ -#include "DNA_mesh_types.h" - -#include "MEM_guardedalloc.h" - -struct CDDerivedMesh { - DerivedMesh dm; - - /* these point to data in the DerivedMesh custom data layers, - * they are only here for efficiency and convenience */ - float (*vert_positions)[3]; - blender::int2 *medge; - MFace *mface; - int *corner_verts; - int *corner_edges; - - /* Cached */ - PBVH *pbvh; - bool pbvh_draw; - - /* Mesh connectivity */ - MeshElemMap *pmap; - int *pmap_mem; -}; - -/**************** DerivedMesh interface functions ****************/ -static int cdDM_getNumVerts(DerivedMesh *dm) -{ - return dm->numVertData; -} - -static int cdDM_getNumEdges(DerivedMesh *dm) -{ - return dm->numEdgeData; -} - -static int cdDM_getNumLoops(DerivedMesh *dm) -{ - return dm->numLoopData; -} - -static int cdDM_getNumPolys(DerivedMesh *dm) -{ - return dm->numPolyData; -} - -static void cdDM_copyVertArray(DerivedMesh *dm, float (*r_positions)[3]) -{ - CDDerivedMesh *cddm = (CDDerivedMesh *)dm; - memcpy(r_positions, cddm->vert_positions, sizeof(float[3]) * dm->numVertData); -} - -static void cdDM_copyEdgeArray(DerivedMesh *dm, blender::int2 *r_edge) -{ - CDDerivedMesh *cddm = (CDDerivedMesh *)dm; - memcpy(r_edge, cddm->medge, sizeof(*r_edge) * dm->numEdgeData); -} - -static void cdDM_copyCornerVertArray(DerivedMesh *dm, int *r_corner_verts) -{ - CDDerivedMesh *cddm = (CDDerivedMesh *)dm; - memcpy(r_corner_verts, cddm->corner_verts, sizeof(*r_corner_verts) * dm->numLoopData); -} - -static void cdDM_copyCornerEdgeArray(DerivedMesh *dm, int *r_corner_edges) -{ - CDDerivedMesh *cddm = (CDDerivedMesh *)dm; - memcpy(r_corner_edges, cddm->corner_edges, sizeof(*r_corner_edges) * dm->numLoopData); -} - -static void cdDM_copyPolyArray(DerivedMesh *dm, int *r_face_offsets) -{ - memcpy(r_face_offsets, dm->face_offsets, sizeof(int) * (dm->numPolyData + 1)); -} - -static void cdDM_free_internal(CDDerivedMesh *cddm) -{ - if (cddm->pmap) { - MEM_freeN(cddm->pmap); - } - if (cddm->pmap_mem) { - MEM_freeN(cddm->pmap_mem); - } -} - -static void cdDM_release(DerivedMesh *dm) -{ - CDDerivedMesh *cddm = (CDDerivedMesh *)dm; - - DM_release(dm); - cdDM_free_internal(cddm); - MEM_freeN(cddm); -} - -/**************** CDDM interface functions ****************/ -static CDDerivedMesh *cdDM_create(const char *desc) -{ - CDDerivedMesh *cddm = MEM_cnew(desc); - DerivedMesh *dm = &cddm->dm; - - dm->getNumVerts = cdDM_getNumVerts; - dm->getNumEdges = cdDM_getNumEdges; - dm->getNumLoops = cdDM_getNumLoops; - dm->getNumPolys = cdDM_getNumPolys; - - dm->copyVertArray = cdDM_copyVertArray; - dm->copyEdgeArray = cdDM_copyEdgeArray; - dm->copyCornerVertArray = cdDM_copyCornerVertArray; - dm->copyCornerEdgeArray = cdDM_copyCornerEdgeArray; - dm->copyPolyArray = cdDM_copyPolyArray; - - dm->getVertDataArray = DM_get_vert_data_layer; - dm->getEdgeDataArray = DM_get_edge_data_layer; - - dm->release = cdDM_release; - - return cddm; -} - -static DerivedMesh *cdDM_from_mesh_ex(Mesh *mesh, const CustomData_MeshMasks *mask) -{ - CDDerivedMesh *cddm = cdDM_create(__func__); - DerivedMesh *dm = &cddm->dm; - CustomData_MeshMasks cddata_masks = *mask; - - cddata_masks.lmask &= ~CD_MASK_MDISPS; - - /* this does a referenced copy, with an exception for fluidsim */ - - DM_init(dm, - DM_TYPE_CDDM, - mesh->verts_num, - mesh->edges_num, - 0 /* `mesh->totface` */, - mesh->corners_num, - mesh->faces_num); - - CustomData_merge(&mesh->vert_data, &dm->vertData, cddata_masks.vmask, mesh->verts_num); - CustomData_merge(&mesh->edge_data, &dm->edgeData, cddata_masks.emask, mesh->edges_num); - CustomData_merge(&mesh->fdata_legacy, - &dm->faceData, - cddata_masks.fmask | CD_MASK_ORIGINDEX, - 0 /* `mesh->totface` */); - CustomData_merge(&mesh->corner_data, &dm->loopData, cddata_masks.lmask, mesh->corners_num); - CustomData_merge(&mesh->face_data, &dm->polyData, cddata_masks.pmask, mesh->faces_num); - - cddm->vert_positions = static_cast(CustomData_get_layer_named_for_write( - &dm->vertData, CD_PROP_FLOAT3, "position", mesh->verts_num)); - cddm->medge = static_cast(CustomData_get_layer_named_for_write( - &dm->edgeData, CD_PROP_INT32_2D, ".edge_verts", mesh->edges_num)); - cddm->corner_verts = static_cast(CustomData_get_layer_named_for_write( - &dm->loopData, CD_PROP_INT32, ".corner_vert", mesh->corners_num)); - cddm->corner_edges = static_cast(CustomData_get_layer_named_for_write( - &dm->loopData, CD_PROP_INT32, ".corner_edge", mesh->corners_num)); - dm->face_offsets = static_cast(MEM_dupallocN(mesh->face_offset_indices)); -#if 0 - cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE); -#else - cddm->mface = nullptr; -#endif - - /* commented since even when CD_ORIGINDEX was first added this line fails - * on the default cube, (after editmode toggle too) - campbell */ -#if 0 - BLI_assert(CustomData_has_layer(&cddm->dm.faceData, CD_ORIGINDEX)); -#endif - - return dm; -} - -DerivedMesh *CDDM_from_mesh(Mesh *mesh) -{ - return cdDM_from_mesh_ex(mesh, &CD_MASK_MESH); -} diff --git a/source/blender/blenkernel/intern/mesh_legacy_derived_mesh.cc b/source/blender/blenkernel/intern/mesh_legacy_derived_mesh.cc index e1ba4f3856d..7ae471df790 100644 --- a/source/blender/blenkernel/intern/mesh_legacy_derived_mesh.cc +++ b/source/blender/blenkernel/intern/mesh_legacy_derived_mesh.cc @@ -4,9 +4,15 @@ #include "BLI_math_vector.h" +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" + #include "BKE_DerivedMesh.hh" #include "BKE_customdata.hh" +struct MeshElemMap; +struct PBVH; + /* -------------------------------------------------------------------- */ static float *dm_getVertArray(DerivedMesh *dm) @@ -204,3 +210,173 @@ void DM_interp_vert_data(const DerivedMesh *source, CustomData_interp( &source->vertData, &dest->vertData, src_indices, weights, nullptr, count, dest_index); } + +struct CDDerivedMesh { + DerivedMesh dm; + + /* these point to data in the DerivedMesh custom data layers, + * they are only here for efficiency and convenience */ + float (*vert_positions)[3]; + blender::int2 *medge; + MFace *mface; + int *corner_verts; + int *corner_edges; + + /* Cached */ + PBVH *pbvh; + bool pbvh_draw; + + /* Mesh connectivity */ + MeshElemMap *pmap; + int *pmap_mem; +}; + +/**************** DerivedMesh interface functions ****************/ +static int cdDM_getNumVerts(DerivedMesh *dm) +{ + return dm->numVertData; +} + +static int cdDM_getNumEdges(DerivedMesh *dm) +{ + return dm->numEdgeData; +} + +static int cdDM_getNumLoops(DerivedMesh *dm) +{ + return dm->numLoopData; +} + +static int cdDM_getNumPolys(DerivedMesh *dm) +{ + return dm->numPolyData; +} + +static void cdDM_copyVertArray(DerivedMesh *dm, float (*r_positions)[3]) +{ + CDDerivedMesh *cddm = (CDDerivedMesh *)dm; + memcpy(r_positions, cddm->vert_positions, sizeof(float[3]) * dm->numVertData); +} + +static void cdDM_copyEdgeArray(DerivedMesh *dm, blender::int2 *r_edge) +{ + CDDerivedMesh *cddm = (CDDerivedMesh *)dm; + memcpy(r_edge, cddm->medge, sizeof(*r_edge) * dm->numEdgeData); +} + +static void cdDM_copyCornerVertArray(DerivedMesh *dm, int *r_corner_verts) +{ + CDDerivedMesh *cddm = (CDDerivedMesh *)dm; + memcpy(r_corner_verts, cddm->corner_verts, sizeof(*r_corner_verts) * dm->numLoopData); +} + +static void cdDM_copyCornerEdgeArray(DerivedMesh *dm, int *r_corner_edges) +{ + CDDerivedMesh *cddm = (CDDerivedMesh *)dm; + memcpy(r_corner_edges, cddm->corner_edges, sizeof(*r_corner_edges) * dm->numLoopData); +} + +static void cdDM_copyPolyArray(DerivedMesh *dm, int *r_face_offsets) +{ + memcpy(r_face_offsets, dm->face_offsets, sizeof(int) * (dm->numPolyData + 1)); +} + +static void cdDM_free_internal(CDDerivedMesh *cddm) +{ + if (cddm->pmap) { + MEM_freeN(cddm->pmap); + } + if (cddm->pmap_mem) { + MEM_freeN(cddm->pmap_mem); + } +} + +static void cdDM_release(DerivedMesh *dm) +{ + CDDerivedMesh *cddm = (CDDerivedMesh *)dm; + + DM_release(dm); + cdDM_free_internal(cddm); + MEM_freeN(cddm); +} + +/**************** CDDM interface functions ****************/ +static CDDerivedMesh *cdDM_create(const char *desc) +{ + CDDerivedMesh *cddm = MEM_cnew(desc); + DerivedMesh *dm = &cddm->dm; + + dm->getNumVerts = cdDM_getNumVerts; + dm->getNumEdges = cdDM_getNumEdges; + dm->getNumLoops = cdDM_getNumLoops; + dm->getNumPolys = cdDM_getNumPolys; + + dm->copyVertArray = cdDM_copyVertArray; + dm->copyEdgeArray = cdDM_copyEdgeArray; + dm->copyCornerVertArray = cdDM_copyCornerVertArray; + dm->copyCornerEdgeArray = cdDM_copyCornerEdgeArray; + dm->copyPolyArray = cdDM_copyPolyArray; + + dm->getVertDataArray = DM_get_vert_data_layer; + dm->getEdgeDataArray = DM_get_edge_data_layer; + + dm->release = cdDM_release; + + return cddm; +} + +static DerivedMesh *cdDM_from_mesh_ex(Mesh *mesh, const CustomData_MeshMasks *mask) +{ + CDDerivedMesh *cddm = cdDM_create(__func__); + DerivedMesh *dm = &cddm->dm; + CustomData_MeshMasks cddata_masks = *mask; + + cddata_masks.lmask &= ~CD_MASK_MDISPS; + + /* this does a referenced copy, with an exception for fluidsim */ + + DM_init(dm, + DM_TYPE_CDDM, + mesh->verts_num, + mesh->edges_num, + 0 /* `mesh->totface` */, + mesh->corners_num, + mesh->faces_num); + + CustomData_merge(&mesh->vert_data, &dm->vertData, cddata_masks.vmask, mesh->verts_num); + CustomData_merge(&mesh->edge_data, &dm->edgeData, cddata_masks.emask, mesh->edges_num); + CustomData_merge(&mesh->fdata_legacy, + &dm->faceData, + cddata_masks.fmask | CD_MASK_ORIGINDEX, + 0 /* `mesh->totface` */); + CustomData_merge(&mesh->corner_data, &dm->loopData, cddata_masks.lmask, mesh->corners_num); + CustomData_merge(&mesh->face_data, &dm->polyData, cddata_masks.pmask, mesh->faces_num); + + cddm->vert_positions = static_cast(CustomData_get_layer_named_for_write( + &dm->vertData, CD_PROP_FLOAT3, "position", mesh->verts_num)); + cddm->medge = static_cast(CustomData_get_layer_named_for_write( + &dm->edgeData, CD_PROP_INT32_2D, ".edge_verts", mesh->edges_num)); + cddm->corner_verts = static_cast(CustomData_get_layer_named_for_write( + &dm->loopData, CD_PROP_INT32, ".corner_vert", mesh->corners_num)); + cddm->corner_edges = static_cast(CustomData_get_layer_named_for_write( + &dm->loopData, CD_PROP_INT32, ".corner_edge", mesh->corners_num)); + dm->face_offsets = static_cast(MEM_dupallocN(mesh->face_offset_indices)); +#if 0 + cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE); +#else + cddm->mface = nullptr; +#endif + + /* commented since even when CD_ORIGINDEX was first added this line fails + * on the default cube, (after editmode toggle too) - campbell */ +#if 0 + BLI_assert(CustomData_has_layer(&cddm->dm.faceData, CD_ORIGINDEX)); +#endif + + return dm; +} + +DerivedMesh *CDDM_from_mesh(Mesh *mesh) +{ + return cdDM_from_mesh_ex(mesh, &CD_MASK_MESH); +} diff --git a/source/blender/blenkernel/intern/multires.cc b/source/blender/blenkernel/intern/multires.cc index 1569de0f99f..b29ac02820a 100644 --- a/source/blender/blenkernel/intern/multires.cc +++ b/source/blender/blenkernel/intern/multires.cc @@ -21,8 +21,8 @@ #include "BLI_task.h" #include "BLI_utildefines.h" +#include "BKE_DerivedMesh.hh" #include "BKE_ccg.h" -#include "BKE_cdderivedmesh.h" #include "BKE_editmesh.hh" #include "BKE_mesh.hh" #include "BKE_mesh_runtime.hh" diff --git a/source/blender/blenkernel/intern/shrinkwrap.cc b/source/blender/blenkernel/intern/shrinkwrap.cc index 529b3a28106..3e7bf951003 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.cc +++ b/source/blender/blenkernel/intern/shrinkwrap.cc @@ -27,7 +27,6 @@ #include "BKE_DerivedMesh.hh" #include "BKE_attribute.hh" -#include "BKE_cdderivedmesh.h" #include "BKE_modifier.hh" #include "BKE_shrinkwrap.hh" diff --git a/source/blender/blenkernel/intern/subsurf_ccg.cc b/source/blender/blenkernel/intern/subsurf_ccg.cc index c738d7aeb71..13573766b82 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.cc +++ b/source/blender/blenkernel/intern/subsurf_ccg.cc @@ -31,8 +31,8 @@ #include "BLI_utildefines.h" #include "BLI_vector.hh" +#include "BKE_DerivedMesh.hh" #include "BKE_ccg.h" -#include "BKE_cdderivedmesh.h" #include "BKE_customdata.hh" #include "BKE_mesh_mapping.hh" #include "BKE_multires.hh" diff --git a/source/blender/editors/object/object_bake.cc b/source/blender/editors/object/object_bake.cc index 001986e50ca..2412eed14b0 100644 --- a/source/blender/editors/object/object_bake.cc +++ b/source/blender/editors/object/object_bake.cc @@ -20,7 +20,6 @@ #include "BKE_DerivedMesh.hh" #include "BKE_attribute.hh" -#include "BKE_cdderivedmesh.h" #include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_global.hh"