Blender V5.0
BKE_mesh.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4#pragma once
5
9
10#include <cstdint>
11
12#include "BLI_array.hh"
13#include "BLI_string_ref.hh"
14
15#include "DNA_mesh_types.h"
16
17struct BMesh;
21struct CustomData;
23struct Depsgraph;
24struct KeyBlock;
25struct LinkNode;
26struct ListBase;
27struct MDeformVert;
28struct MDisps;
29struct MFace;
30struct Main;
31struct MemArena;
32struct Mesh;
33struct Object;
34struct Scene;
35
36/* TODO: Move to `BKE_mesh_types.hh` when possible. */
45
46/* `mesh.cc` */
47
49 const BMeshCreateParams *create_params,
50 const BMeshFromMeshParams *convert_params);
56 int active_shapekey,
57 bool add_key_index,
59
62 const Mesh *me_settings);
64 const CustomData_MeshMasks *cd_mask_extra,
65 const Mesh *me_settings);
66
75
81
86
92
93Mesh *BKE_mesh_add(Main *bmain, const char *name);
94
101void BKE_mesh_copy_parameters_for_eval(Mesh *me_dst, const Mesh *me_src);
106void BKE_mesh_copy_parameters(Mesh *me_dst, const Mesh *me_src);
108
111
112Mesh *BKE_mesh_new_nomain(int verts_num, int edges_num, int faces_num, int corners_num);
114 const Mesh *me_src, int verts_num, int edges_num, int faces_num, int corners_num);
116 int verts_num,
117 int edges_num,
118 int tessface_num,
119 int faces_num,
120 int corners_num,
122
126Mesh *BKE_mesh_copy_for_eval(const Mesh &source);
127
134
136
140 bool invert);
141void BKE_mesh_orco_verts_transform(Mesh *mesh, float (*orco)[3], int totvert, bool invert);
142
146void BKE_mesh_orco_ensure(Object *ob, Mesh *mesh);
147
149void BKE_mesh_assign_object(Main *bmain, Object *ob, Mesh *mesh);
150void BKE_mesh_to_curve_nurblist(const Mesh *mesh, ListBase *nurblist, int edge_users_test);
151void BKE_mesh_to_curve(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob);
152void BKE_mesh_to_pointcloud(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob);
153void BKE_pointcloud_to_mesh(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob);
154void BKE_mesh_material_index_remove(Mesh *mesh, short index);
155bool BKE_mesh_material_index_used(Mesh *mesh, short index);
157void BKE_mesh_material_remap(Mesh *mesh, const unsigned int *remap, unsigned int remap_len);
158
159void BKE_mesh_texspace_calc(Mesh *mesh);
161void BKE_mesh_texspace_get(Mesh *mesh, float r_texspace_location[3], float r_texspace_size[3]);
163 char **r_texspace_flag,
164 float **r_texspace_location,
165 float **r_texspace_size);
166
178 Object *object,
179 bool preserve_all_data_layers,
180 bool preserve_origindex,
181 bool ensure_subdivision);
182
189 Depsgraph *depsgraph,
190 Object *object,
191 bool preserve_all_data_layers);
192
201void BKE_mesh_nomain_to_mesh(Mesh *mesh_src,
202 Mesh *mesh_dst,
203 Object *ob,
204 bool process_shape_keys = true);
205void BKE_mesh_nomain_to_meshkey(Mesh *mesh_src, Mesh *mesh_dst, KeyBlock *kb);
206
207/* Vertex level transformations & checks (no evaluated mesh). */
208
209void BKE_mesh_tessface_clear(Mesh *mesh);
210
211void BKE_mesh_mselect_clear(Mesh *mesh);
216int BKE_mesh_mselect_find(const Mesh *mesh, int index, int type);
220int BKE_mesh_mselect_active_get(const Mesh *mesh, int type);
221void BKE_mesh_mselect_active_set(Mesh *mesh, int index, int type);
222
223void BKE_mesh_count_selected_items(const Mesh *mesh, int r_count[3]);
224
225/* *** mesh_normals.cc *** */
226
228bool BKE_mesh_vert_normals_are_dirty(const Mesh *mesh);
229
231bool BKE_mesh_face_normals_are_dirty(const Mesh *mesh);
232
241 float vec_lnor[3];
246 float vec_ref[3];
248 float vec_ortho[3];
265 float ref_beta;
272 char flags;
273};
274
277enum {
279};
280
295
298enum {
301};
302
303/* Low-level custom normals functions. */
304void BKE_lnor_spacearr_init(MLoopNorSpaceArray *lnors_spacearr, int numLoops, char data_type);
305void BKE_lnor_spacearr_clear(MLoopNorSpaceArray *lnors_spacearr);
306void BKE_lnor_spacearr_free(MLoopNorSpaceArray *lnors_spacearr);
307
316 MLoopNorSpaceArray *lnors_spacearr_tls);
322 MLoopNorSpaceArray *lnors_spacearr_tls);
323
325
332void BKE_lnor_space_define(MLoopNorSpace *lnor_space,
333 const float lnor[3],
334 const float vec_ref[3],
335 const float vec_other[3],
336 blender::Span<blender::float3> edge_vectors);
337
347 MLoopNorSpace *lnor_space,
348 int corner,
349 void *bm_loop,
350 bool is_single);
352 const short clnor_data[2],
353 float r_custom_lnor[3]);
355 const float custom_lnor[3],
356 short r_clnor_data[2]);
357
362
363/* *** mesh_evaluate.cc *** */
364
365float BKE_mesh_calc_area(const Mesh *mesh);
366
367bool BKE_mesh_center_median(const Mesh *mesh, float r_cent[3]);
372bool BKE_mesh_center_median_from_faces(const Mesh *mesh, float r_cent[3]);
373bool BKE_mesh_center_of_surface(const Mesh *mesh, float r_cent[3]);
378bool BKE_mesh_center_of_volume(const Mesh *mesh, float r_cent[3]);
379
386void BKE_mesh_calc_volume(const float (*vert_positions)[3],
387 int mverts_num,
388 const blender::int3 *corner_tris,
389 int corner_tris_num,
390 const int *corner_verts,
391 float *r_volume,
392 float r_center[3]);
393
398void BKE_mesh_mdisp_flip(MDisps *md, bool use_loop_mdisp_flip);
399
407
408/* Flush flags. */
409
410/* spatial evaluation */
422void BKE_mesh_calc_relative_deform(const int *face_offsets,
423 int faces_num,
424 const int *corner_verts,
425 int totvert,
426
427 const float (*vert_cos_src)[3],
428 const float (*vert_cos_dst)[3],
429
430 const float (*vert_cos_org)[3],
431 float (*vert_cos_new)[3]);
432
433/* *** mesh_validate.cc *** */
434
440bool BKE_mesh_validate(Mesh *mesh, bool do_verbose, bool cddata_check_mask);
445bool BKE_mesh_is_valid(Mesh *mesh);
451
458 float (*vert_positions)[3],
459 unsigned int verts_num,
460 blender::int2 *edges,
461 unsigned int edges_num,
462 MFace *legacy_faces,
463 unsigned int legacy_faces_num,
464 const int *corner_verts,
465 int *corner_edges,
466 unsigned int corners_num,
467 const int *face_offsets,
468 unsigned int faces_num,
469 MDeformVert *dverts, /* assume totvert length */
470 bool do_verbose,
471 bool do_fixes,
472 bool *r_change);
473
478 uint verts_num,
479 CustomData *edge_data,
480 uint edges_num,
481 CustomData *corner_data,
482 uint corners_num,
483 CustomData *face_data,
484 uint faces_num,
485 bool check_meshmask,
486 bool do_verbose,
487 bool do_fixes,
488 bool *r_change);
489
491
492/* **** Depsgraph evaluation **** */
493
494void BKE_mesh_eval_geometry(Depsgraph *depsgraph, Mesh *mesh);
495
496/* Draw Cache */
498void BKE_mesh_batch_cache_free(void *batch_cache);
499
501extern void (*BKE_mesh_batch_cache_free_cb)(void *batch_cache);
502
503/* `mesh_debug.cc` */
504
505#ifndef NDEBUG
507void BKE_mesh_debug_print(const Mesh *mesh) ATTR_NONNULL(1);
508#endif
void BKE_mesh_batch_cache_dirty_tag(Mesh *mesh, eMeshBatchDirtyMode mode)
void BKE_lnor_space_custom_data_to_normal(const MLoopNorSpace *lnor_space, const short clnor_data[2], float r_custom_lnor[3])
MLoopNorSpace * BKE_lnor_space_create(MLoopNorSpaceArray *lnors_spacearr)
Mesh * BKE_mesh_new_nomain_from_curve(const Object *ob)
void BKE_mesh_mselect_clear(Mesh *mesh)
bool BKE_mesh_center_of_surface(const Mesh *mesh, float r_cent[3])
void BKE_mesh_to_curve_nurblist(const Mesh *mesh, ListBase *nurblist, int edge_users_test)
bool BKE_mesh_attribute_required(blender::StringRef name)
void BKE_mesh_strip_loose_faces(Mesh *mesh)
void(* BKE_mesh_batch_cache_free_cb)(void *batch_cache)
void BKE_mesh_copy_parameters_for_eval(Mesh *me_dst, const Mesh *me_src)
void BKE_mesh_tessface_clear(Mesh *mesh)
void BKE_mesh_to_curve(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob)
Mesh * BKE_mesh_new_nomain_from_template(const Mesh *me_src, int verts_num, int edges_num, int faces_num, int corners_num)
void BKE_mesh_ensure_skin_customdata(Mesh *mesh)
void BKE_mesh_calc_volume(const float(*vert_positions)[3], int mverts_num, const blender::int3 *corner_tris, int corner_tris_num, const int *corner_verts, float *r_volume, float r_center[3])
blender::Array< blender::float3 > BKE_mesh_orco_verts_get(const Object *ob)
bool BKE_mesh_validate_material_indices(Mesh *mesh)
Mesh * BKE_mesh_from_bmesh_nomain(BMesh *bm, const BMeshToMeshParams *params, const Mesh *me_settings)
@ MLNOR_SPACE_IS_SINGLE
Definition BKE_mesh.h:278
void BKE_mesh_clear_geometry_and_metadata(Mesh *mesh)
bool BKE_mesh_validate(Mesh *mesh, bool do_verbose, bool cddata_check_mask)
void BKE_mesh_to_pointcloud(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob)
void BKE_mesh_orco_verts_transform(Mesh *mesh, blender::MutableSpan< blender::float3 > orco, bool invert)
void BKE_lnor_space_custom_normal_to_data(const MLoopNorSpace *lnor_space, const float custom_lnor[3], short r_clnor_data[2])
@ MLNOR_SPACEARR_LOOP_INDEX
Definition BKE_mesh.h:299
@ MLNOR_SPACEARR_BMLOOP_PTR
Definition BKE_mesh.h:300
bool BKE_mesh_vert_normals_are_dirty(const Mesh *mesh)
int BKE_mesh_mselect_active_get(const Mesh *mesh, int type)
void BKE_mesh_nomain_to_meshkey(Mesh *mesh_src, Mesh *mesh_dst, KeyBlock *kb)
bool BKE_mesh_validate_all_customdata(CustomData *vert_data, uint verts_num, CustomData *edge_data, uint edges_num, CustomData *corner_data, uint corners_num, CustomData *face_data, uint faces_num, bool check_meshmask, bool do_verbose, bool do_fixes, bool *r_change)
void BKE_mesh_orco_ensure(Object *ob, Mesh *mesh)
void BKE_pointcloud_to_mesh(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob)
void BKE_mesh_count_selected_items(const Mesh *mesh, int r_count[3])
Mesh * BKE_mesh_new_nomain(int verts_num, int edges_num, int faces_num, int corners_num)
bool BKE_mesh_has_custom_loop_normals(Mesh *mesh)
void BKE_mesh_material_remap(Mesh *mesh, const unsigned int *remap, unsigned int remap_len)
void BKE_mesh_texspace_ensure(Mesh *mesh)
void BKE_lnor_space_add_loop(MLoopNorSpaceArray *lnors_spacearr, MLoopNorSpace *lnor_space, int corner, void *bm_loop, bool is_single)
void BKE_mesh_mselect_active_set(Mesh *mesh, int index, int type)
void BKE_mesh_debug_print(const Mesh *mesh) ATTR_NONNULL(1)
Definition mesh_debug.cc:73
Mesh * BKE_mesh_add(Main *bmain, const char *name)
void BKE_mesh_assign_object(Main *bmain, Object *ob, Mesh *mesh)
bool BKE_mesh_material_index_used(Mesh *mesh, short index)
void BKE_lnor_spacearr_clear(MLoopNorSpaceArray *lnors_spacearr)
Mesh * BKE_mesh_new_nomain_from_curve_displist(const Object *ob, const ListBase *dispbase)
void BKE_mesh_nomain_to_mesh(Mesh *mesh_src, Mesh *mesh_dst, Object *ob, bool process_shape_keys=true)
void BKE_lnor_spacearr_init(MLoopNorSpaceArray *lnors_spacearr, int numLoops, char data_type)
void BKE_mesh_merge_customdata_for_apply_modifier(Mesh *mesh)
void BKE_mesh_calc_relative_deform(const int *face_offsets, int faces_num, const int *corner_verts, int totvert, const float(*vert_cos_src)[3], const float(*vert_cos_dst)[3], const float(*vert_cos_org)[3], float(*vert_cos_new)[3])
void BKE_mesh_copy_parameters(Mesh *me_dst, const Mesh *me_src)
Mesh * BKE_mesh_copy_for_eval(const Mesh &source)
eMeshBatchDirtyMode
Definition BKE_mesh.h:37
@ BKE_MESH_BATCH_DIRTY_UVEDIT_ALL
Definition BKE_mesh.h:42
@ BKE_MESH_BATCH_DIRTY_SELECT_PAINT
Definition BKE_mesh.h:40
@ BKE_MESH_BATCH_DIRTY_SHADING
Definition BKE_mesh.h:41
@ BKE_MESH_BATCH_DIRTY_UVEDIT_SELECT
Definition BKE_mesh.h:43
@ BKE_MESH_BATCH_DIRTY_ALL
Definition BKE_mesh.h:38
@ BKE_MESH_BATCH_DIRTY_SELECT
Definition BKE_mesh.h:39
void BKE_mesh_mselect_validate(Mesh *mesh)
void(* BKE_mesh_batch_cache_dirty_tag_cb)(Mesh *mesh, eMeshBatchDirtyMode mode)
void BKE_mesh_batch_cache_free(void *batch_cache)
bool BKE_mesh_face_normals_are_dirty(const Mesh *mesh)
Mesh * BKE_mesh_from_bmesh_for_eval_nomain(BMesh *bm, const CustomData_MeshMasks *cd_mask_extra, const Mesh *me_settings)
float BKE_mesh_calc_area(const Mesh *mesh)
Mesh * BKE_mesh_from_object(Object *ob)
int BKE_mesh_mselect_find(const Mesh *mesh, int index, int type)
bool BKE_mesh_is_valid(Mesh *mesh)
void BKE_mesh_texspace_get(Mesh *mesh, float r_texspace_location[3], float r_texspace_size[3])
Mesh * BKE_mesh_new_from_object(Depsgraph *depsgraph, Object *object, bool preserve_all_data_layers, bool preserve_origindex, bool ensure_subdivision)
bool BKE_mesh_center_median(const Mesh *mesh, float r_cent[3])
void BKE_mesh_material_index_clear(Mesh *mesh)
void BKE_mesh_mdisp_flip(MDisps *md, bool use_loop_mdisp_flip)
void BKE_lnor_space_define(MLoopNorSpace *lnor_space, const float lnor[3], const float vec_ref[3], const float vec_other[3], blender::Span< blender::float3 > edge_vectors)
void BKE_lnor_spacearr_free(MLoopNorSpaceArray *lnors_spacearr)
char * BKE_mesh_debug_info(const Mesh *mesh) ATTR_NONNULL(1) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
Definition mesh_debug.cc:28
bool BKE_mesh_validate_arrays(Mesh *mesh, float(*vert_positions)[3], unsigned int verts_num, blender::int2 *edges, unsigned int edges_num, MFace *legacy_faces, unsigned int legacy_faces_num, const int *corner_verts, int *corner_edges, unsigned int corners_num, const int *face_offsets, unsigned int faces_num, MDeformVert *dverts, bool do_verbose, bool do_fixes, bool *r_change)
BMesh * BKE_mesh_to_bmesh(Mesh *mesh, int active_shapekey, bool add_key_index, const BMeshCreateParams *params)
void BKE_mesh_material_index_remove(Mesh *mesh, short index)
void BKE_mesh_texspace_get_reference(Mesh *mesh, char **r_texspace_flag, float **r_texspace_location, float **r_texspace_size)
void BKE_mesh_eval_geometry(Depsgraph *depsgraph, Mesh *mesh)
void BKE_mesh_clear_geometry(Mesh *mesh)
Mesh * BKE_mesh_new_nomain_from_template_ex(const Mesh *me_src, int verts_num, int edges_num, int tessface_num, int faces_num, int corners_num, CustomData_MeshMasks mask)
void BKE_mesh_face_offsets_ensure_alloc(Mesh *mesh)
void BKE_lnor_spacearr_tls_join(MLoopNorSpaceArray *lnors_spacearr, MLoopNorSpaceArray *lnors_spacearr_tls)
BMesh * BKE_mesh_to_bmesh_ex(const Mesh *mesh, const BMeshCreateParams *create_params, const BMeshFromMeshParams *convert_params)
Mesh * BKE_mesh_new_from_object_to_bmain(Main *bmain, Depsgraph *depsgraph, Object *object, bool preserve_all_data_layers)
void BKE_mesh_ensure_default_orig_index_customdata(Mesh *mesh)
bool BKE_mesh_center_median_from_faces(const Mesh *mesh, float r_cent[3])
void BKE_mesh_ensure_default_orig_index_customdata_no_check(Mesh *mesh)
void BKE_lnor_spacearr_tls_init(MLoopNorSpaceArray *lnors_spacearr, MLoopNorSpaceArray *lnors_spacearr_tls)
bool BKE_mesh_center_of_volume(const Mesh *mesh, float r_cent[3])
void BKE_mesh_texspace_calc(Mesh *mesh)
#define ATTR_WARN_UNUSED_RESULT
#define ATTR_MALLOC
#define ATTR_NONNULL(...)
unsigned int uint
BMesh * bm
BPy_StructRNA * depsgraph
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
CCL_NAMESPACE_BEGIN ccl_device float invert(const float color, const float factor)
Definition invert.h:11
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
VecBase< int32_t, 2 > int2
VecBase< int32_t, 3 > int3
const char * name
struct LinkNode * loops_pool
Definition BKE_mesh.h:288
struct MemArena * mem
Definition BKE_mesh.h:293
MLoopNorSpace ** lspacearr
Definition BKE_mesh.h:286
float ref_alpha
Definition BKE_mesh.h:256
float vec_ortho[3]
Definition BKE_mesh.h:248
float ref_beta
Definition BKE_mesh.h:265
float vec_ref[3]
Definition BKE_mesh.h:246
float vec_lnor[3]
Definition BKE_mesh.h:241
struct LinkNode * loops
Definition BKE_mesh.h:271