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); }
/** * Builds a bvh tree where nodes are the looptri faces of the given dm * * \note for editmesh this is currently a duplicate of bvhtree_from_mesh_faces */ BVHTree *bvhtree_from_mesh_looptri(BVHTreeFromMesh *data, DerivedMesh *dm, float epsilon, int tree_type, int axis) { BMEditMesh *em = data->em_evil; const int bvhcache_type = em ? BVHTREE_FROM_FACES_EDITMESH : BVHTREE_FROM_LOOPTRI; BVHTree *tree; MVert *mvert = NULL; MLoop *mloop = NULL; const MLoopTri *looptri = NULL; bool vert_allocated = false; bool loop_allocated = false; bool looptri_allocated = false; BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_READ); tree = bvhcache_find(&dm->bvhCache, bvhcache_type); BLI_rw_mutex_unlock(&cache_rwlock); if (em == NULL) { MPoly *mpoly; bool poly_allocated = false; mvert = DM_get_vert_array(dm, &vert_allocated); mpoly = DM_get_poly_array(dm, &poly_allocated); mloop = DM_get_loop_array(dm, &loop_allocated); looptri = DM_get_looptri_array( dm, mvert, mpoly, dm->getNumPolys(dm), mloop, dm->getNumLoops(dm), &looptri_allocated); if (poly_allocated) { MEM_freeN(mpoly); } } /* Not in cache */ if (tree == NULL) { BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_WRITE); tree = bvhcache_find(&dm->bvhCache, bvhcache_type); if (tree == NULL) { int looptri_num; /* BMESH specific check that we have tessfaces, * we _could_ tessellate here but rather not - campbell * * this assert checks we have tessfaces, * if not caller should use DM_ensure_tessface() */ if (em) { looptri_num = em->tottri; } else { looptri_num = dm->getNumLoopTri(dm); BLI_assert(!(looptri_num == 0 && dm->getNumPolys(dm) != 0)); } tree = bvhtree_from_mesh_looptri_create_tree( epsilon, tree_type, axis, em, mvert, mloop, looptri, looptri_num, NULL, -1); if (tree) { /* Save on cache for later use */ /* printf("BVHTree built and saved on cache\n"); */ bvhcache_insert(&dm->bvhCache, tree, bvhcache_type); } } BLI_rw_mutex_unlock(&cache_rwlock); } else { /* printf("BVHTree is already build, using cached tree\n"); */ } /* Setup BVHTreeFromMesh */ bvhtree_from_mesh_looptri_setup_data( data, tree, true, epsilon, em, mvert, vert_allocated, mloop, loop_allocated, looptri, looptri_allocated); return data->tree; }