56 const Mesh *me_settings)
64 mesh->runtime->cd_mask_extra = *cd_mask_extra;
68 mesh->runtime->is_original_bmesh =
true;
71 mesh->runtime->deformed_only =
true;
73 mesh->runtime->edit_mesh = std::move(em);
77 mesh->verts_num = INT_MAX;
78 mesh->edges_num = INT_MAX;
79 mesh->faces_num = INT_MAX;
80 mesh->corners_num = INT_MAX;
85 mesh->corners_num = 0;
101 case ME_WRAPPER_TYPE_MDATA:
102 case ME_WRAPPER_TYPE_SUBD: {
109 mesh->corners_num = 0;
111 BLI_assert(mesh->runtime->edit_mesh !=
nullptr);
112 BLI_assert(mesh->runtime->edit_data !=
nullptr);
114 BMEditMesh *em = mesh->runtime->edit_mesh.get();
129 mesh->vert_positions_for_write().copy_from(edit_data.
vert_positions);
130 mesh->runtime->is_original_bmesh =
false;
133 mesh->runtime->edit_data.reset();
150 switch (mesh->runtime->wrapper_type) {
152 return mesh->runtime->edit_data->vert_positions;
155 return mesh->vert_positions();
163 switch (mesh->runtime->wrapper_type) {
166 *mesh->runtime->edit_data);
169 return mesh->face_normals();
177 switch (mesh->runtime->wrapper_type) {
180 edit_data->vert_normals = {};
181 edit_data->face_centers = {};
182 edit_data->face_normals = {};
187 mesh->tag_positions_changed();
194 switch (mesh->runtime->wrapper_type) {
196 BMesh *
bm = mesh->runtime->edit_mesh->bm;
213 positions.copy_from(mesh->vert_positions());
221 float (*vert_coords)[3],
223 const float mat[4][4])
225 switch (mesh->runtime->wrapper_type) {
227 BMesh *
bm = mesh->runtime->edit_mesh->bm;
231 for (
int i = 0; i < vert_coords_len; i++) {
247 BLI_assert(vert_coords_len == mesh->verts_num);
249 for (
int i = 0; i < vert_coords_len; i++) {
266 switch (mesh->runtime->wrapper_type) {
268 return mesh->runtime->edit_mesh->bm->totvert;
271 return mesh->verts_num;
279 switch (mesh->runtime->wrapper_type) {
281 return mesh->runtime->edit_mesh->bm->totedge;
284 return mesh->edges_num;
292 switch (mesh->runtime->wrapper_type) {
294 return mesh->runtime->edit_mesh->bm->totloop;
297 return mesh->corners_num;
305 switch (mesh->runtime->wrapper_type) {
307 return mesh->runtime->edit_mesh->bm->totface;
310 return mesh->faces_num;
326 if (runtime_data ==
nullptr || runtime_data->
settings.
level == 0) {
342 runtime_data, mesh,
false);
343 if (subdiv ==
nullptr) {
353 memcpy(data, mesh->corner_normals().data(), mesh->corner_normals().size_in_bytes());
356 Mesh *subdiv_mesh = subdiv::subdiv_to_mesh(subdiv, &mesh_settings, mesh);
366 subdiv::free(subdiv);
369 if (subdiv_mesh != mesh) {
370 if (mesh->runtime->mesh_eval !=
nullptr) {
373 mesh->runtime->mesh_eval = subdiv_mesh;
377 return mesh->runtime->mesh_eval;
385 return mesh->runtime->mesh_eval;
void CustomData_free_layers(CustomData *data, eCustomDataType type, int totelem)
void * CustomData_get_layer_for_write(CustomData *data, eCustomDataType type, int totelem)
void * CustomData_add_layer(CustomData *data, eCustomDataType type, eCDAllocType alloctype, int totelem)
blender::Span< blender::float3 > BKE_editmesh_cache_ensure_face_normals(BMEditMesh &em, blender::bke::EditMeshData &emd)
void BKE_id_free(Main *bmain, void *idv)
void * BKE_id_new_nomain(short type, const char *name)
void BKE_mesh_copy_parameters_for_eval(Mesh *me_dst, const Mesh *me_src)
void BKE_mesh_set_custom_normals(Mesh *mesh, float(*r_custom_loop_normals)[3])
void BKE_mesh_ensure_default_orig_index_customdata_no_check(Mesh *mesh)
void BKE_mesh_runtime_ensure_edit_data(Mesh *mesh)
General operations, lookup, etc. for blender objects.
blender::bke::subdiv::Subdiv * BKE_subsurf_modifier_subdiv_descriptor_ensure(SubsurfRuntimeData *runtime_data, const Mesh *mesh, bool for_draw_code)
#define BLI_assert_unreachable()
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
#define BM_ITER_MESH_INDEX(ele, iter, bm, itype, indexvar)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_mesh_bm_to_me_for_eval(BMesh &bm, Mesh &mesh, const CustomData_MeshMasks *cd_mask_extra)
ATTR_WARN_UNUSED_RESULT const BMVert * v
Span< float3 > BKE_mesh_wrapper_vert_coords(const Mesh *mesh)
Span< float3 > BKE_mesh_wrapper_face_normals(Mesh *mesh)
static Mesh * mesh_wrapper_ensure_subdivision(Mesh *mesh)
void BKE_mesh_wrapper_vert_coords_copy(const Mesh *mesh, blender::MutableSpan< float3 > positions)
Mesh * BKE_mesh_wrapper_from_editmesh(std::shared_ptr< BMEditMesh > em, const CustomData_MeshMasks *cd_mask_extra, const Mesh *me_settings)
int BKE_mesh_wrapper_loop_len(const Mesh *mesh)
int BKE_mesh_wrapper_vert_len(const Mesh *mesh)
void BKE_mesh_wrapper_ensure_mdata(Mesh *mesh)
int BKE_mesh_wrapper_edge_len(const Mesh *mesh)
void BKE_mesh_wrapper_tag_positions_changed(Mesh *mesh)
void BKE_mesh_wrapper_vert_coords_copy_with_mat4(const Mesh *mesh, float(*vert_coords)[3], int vert_coords_len, const float mat[4][4])
int BKE_mesh_wrapper_face_len(const Mesh *mesh)
Mesh * BKE_mesh_wrapper_ensure_subdivision(Mesh *mesh)
void isolate_task(const Function &function)
MeshRuntimeHandle * runtime
blender::bke::subdiv::Settings settings
blender::bke::subdiv::Subdiv * subdiv_cpu
blender::bke::subdiv::Subdiv * subdiv_gpu
Array< float3 > vert_positions