Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/cdderivedmesh.cc
| Show All 36 Lines | struct CDDerivedMesh { | ||||
| DerivedMesh dm; | DerivedMesh dm; | ||||
| /* these point to data in the DerivedMesh custom data layers, | /* these point to data in the DerivedMesh custom data layers, | ||||
| * they are only here for efficiency and convenience */ | * they are only here for efficiency and convenience */ | ||||
| float (*vert_positions)[3]; | float (*vert_positions)[3]; | ||||
| const float (*vert_normals)[3]; | const float (*vert_normals)[3]; | ||||
| MEdge *medge; | MEdge *medge; | ||||
| MFace *mface; | MFace *mface; | ||||
| MLoop *mloop; | int *corner_verts; | ||||
| int *corner_edges; | |||||
| MPoly *mpoly; | MPoly *mpoly; | ||||
| /* Cached */ | /* Cached */ | ||||
| struct PBVH *pbvh; | struct PBVH *pbvh; | ||||
| bool pbvh_draw; | bool pbvh_draw; | ||||
| /* Mesh connectivity */ | /* Mesh connectivity */ | ||||
| MeshElemMap *pmap; | MeshElemMap *pmap; | ||||
| Show All 28 Lines | |||||
| } | } | ||||
| static void cdDM_copyEdgeArray(DerivedMesh *dm, MEdge *r_edge) | static void cdDM_copyEdgeArray(DerivedMesh *dm, MEdge *r_edge) | ||||
| { | { | ||||
| CDDerivedMesh *cddm = (CDDerivedMesh *)dm; | CDDerivedMesh *cddm = (CDDerivedMesh *)dm; | ||||
| memcpy(r_edge, cddm->medge, sizeof(*r_edge) * dm->numEdgeData); | memcpy(r_edge, cddm->medge, sizeof(*r_edge) * dm->numEdgeData); | ||||
| } | } | ||||
| static void cdDM_copyLoopArray(DerivedMesh *dm, MLoop *r_loop) | static void cdDM_copyCornerVertArray(DerivedMesh *dm, int *r_corner_verts) | ||||
| { | { | ||||
| CDDerivedMesh *cddm = (CDDerivedMesh *)dm; | CDDerivedMesh *cddm = (CDDerivedMesh *)dm; | ||||
| memcpy(r_loop, cddm->mloop, sizeof(*r_loop) * dm->numLoopData); | 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, MPoly *r_poly) | static void cdDM_copyPolyArray(DerivedMesh *dm, MPoly *r_poly) | ||||
| { | { | ||||
| CDDerivedMesh *cddm = (CDDerivedMesh *)dm; | CDDerivedMesh *cddm = (CDDerivedMesh *)dm; | ||||
| memcpy(r_poly, cddm->mpoly, sizeof(*r_poly) * dm->numPolyData); | memcpy(r_poly, cddm->mpoly, sizeof(*r_poly) * dm->numPolyData); | ||||
| } | } | ||||
| Show All 14 Lines | |||||
| { | { | ||||
| CDDerivedMesh *cddm = (CDDerivedMesh *)dm; | CDDerivedMesh *cddm = (CDDerivedMesh *)dm; | ||||
| const uint totpoly = dm->numPolyData; | const uint totpoly = dm->numPolyData; | ||||
| const uint totloop = dm->numLoopData; | const uint totloop = dm->numLoopData; | ||||
| DM_ensure_looptri_data(dm); | DM_ensure_looptri_data(dm); | ||||
| BLI_assert(totpoly == 0 || cddm->dm.looptris.array_wip != NULL); | BLI_assert(totpoly == 0 || cddm->dm.looptris.array_wip != NULL); | ||||
| BKE_mesh_recalc_looptri(cddm->mloop, | BKE_mesh_recalc_looptri(cddm->corner_verts, | ||||
| cddm->mpoly, | cddm->mpoly, | ||||
| cddm->vert_positions, | cddm->vert_positions, | ||||
| totloop, | totloop, | ||||
| totpoly, | totpoly, | ||||
| cddm->dm.looptris.array_wip); | cddm->dm.looptris.array_wip); | ||||
| BLI_assert(cddm->dm.looptris.array == NULL); | BLI_assert(cddm->dm.looptris.array == NULL); | ||||
| atomic_cas_ptr( | atomic_cas_ptr( | ||||
| Show All 29 Lines | static CDDerivedMesh *cdDM_create(const char *desc) | ||||
| dm->getNumVerts = cdDM_getNumVerts; | dm->getNumVerts = cdDM_getNumVerts; | ||||
| dm->getNumEdges = cdDM_getNumEdges; | dm->getNumEdges = cdDM_getNumEdges; | ||||
| dm->getNumLoops = cdDM_getNumLoops; | dm->getNumLoops = cdDM_getNumLoops; | ||||
| dm->getNumPolys = cdDM_getNumPolys; | dm->getNumPolys = cdDM_getNumPolys; | ||||
| dm->copyVertArray = cdDM_copyVertArray; | dm->copyVertArray = cdDM_copyVertArray; | ||||
| dm->copyEdgeArray = cdDM_copyEdgeArray; | dm->copyEdgeArray = cdDM_copyEdgeArray; | ||||
| dm->copyLoopArray = cdDM_copyLoopArray; | dm->copyCornerVertArray = cdDM_copyCornerVertArray; | ||||
| dm->copyCornerEdgeArray = cdDM_copyCornerEdgeArray; | |||||
| dm->copyPolyArray = cdDM_copyPolyArray; | dm->copyPolyArray = cdDM_copyPolyArray; | ||||
| dm->getVertDataArray = DM_get_vert_data_layer; | dm->getVertDataArray = DM_get_vert_data_layer; | ||||
| dm->getEdgeDataArray = DM_get_edge_data_layer; | dm->getEdgeDataArray = DM_get_edge_data_layer; | ||||
| dm->recalcLoopTri = cdDM_recalc_looptri; | dm->recalcLoopTri = cdDM_recalc_looptri; | ||||
| dm->getVertCo = cdDM_getVertCo; | dm->getVertCo = cdDM_getVertCo; | ||||
| ▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | static DerivedMesh *cdDM_from_mesh_ex(Mesh *mesh, | ||||
| cddm->vert_positions = static_cast<float(*)[3]>(CustomData_get_layer_named_for_write( | cddm->vert_positions = static_cast<float(*)[3]>(CustomData_get_layer_named_for_write( | ||||
| &dm->vertData, CD_PROP_FLOAT3, "position", mesh->totvert)); | &dm->vertData, CD_PROP_FLOAT3, "position", mesh->totvert)); | ||||
| /* Though this may be an unnecessary calculation, simply retrieving the layer may return nothing | /* Though this may be an unnecessary calculation, simply retrieving the layer may return nothing | ||||
| * or dirty normals. */ | * or dirty normals. */ | ||||
| cddm->vert_normals = BKE_mesh_vertex_normals_ensure(mesh); | cddm->vert_normals = BKE_mesh_vertex_normals_ensure(mesh); | ||||
| cddm->medge = static_cast<MEdge *>( | cddm->medge = static_cast<MEdge *>( | ||||
| CustomData_get_layer_for_write(&dm->edgeData, CD_MEDGE, mesh->totedge)); | CustomData_get_layer_for_write(&dm->edgeData, CD_MEDGE, mesh->totedge)); | ||||
| cddm->mloop = static_cast<MLoop *>( | cddm->corner_verts = static_cast<int *>(CustomData_get_layer_named_for_write( | ||||
| CustomData_get_layer_for_write(&dm->loopData, CD_MLOOP, mesh->totloop)); | &dm->loopData, CD_PROP_INT32, ".corner_vert", mesh->totloop)); | ||||
| cddm->corner_edges = static_cast<int *>(CustomData_get_layer_named_for_write( | |||||
| &dm->loopData, CD_PROP_INT32, ".corner_edge", mesh->totloop)); | |||||
| cddm->mpoly = static_cast<MPoly *>( | cddm->mpoly = static_cast<MPoly *>( | ||||
| CustomData_get_layer_for_write(&dm->polyData, CD_MPOLY, mesh->totpoly)); | CustomData_get_layer_for_write(&dm->polyData, CD_MPOLY, mesh->totpoly)); | ||||
| #if 0 | #if 0 | ||||
| cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE); | cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE); | ||||
| #else | #else | ||||
| cddm->mface = NULL; | cddm->mface = NULL; | ||||
| #endif | #endif | ||||
| Show All 13 Lines | |||||