Blender V4.3
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
10#include "BLI_array.hh"
11#include "BLI_compiler_attrs.h"
12#include "BLI_compiler_compat.h"
13#include "BLI_utildefines.h"
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);
52 Object *ob,
53 bool add_key_index,
55
58 const Mesh *me_settings);
60 const CustomData_MeshMasks *cd_mask_extra,
61 const Mesh *me_settings);
62
71
77
83
88
94
95Mesh *BKE_mesh_add(Main *bmain, const char *name);
96
98
105void BKE_mesh_copy_parameters_for_eval(Mesh *me_dst, const Mesh *me_src);
110void BKE_mesh_copy_parameters(Mesh *me_dst, const Mesh *me_src);
112
115
116Mesh *BKE_mesh_new_nomain(int verts_num, int edges_num, int faces_num, int corners_num);
118 const Mesh *me_src, int verts_num, int edges_num, int faces_num, int corners_num);
120 int verts_num,
121 int edges_num,
122 int tessface_num,
123 int faces_num,
124 int corners_num,
126
130Mesh *BKE_mesh_copy_for_eval(const Mesh &source);
131
138
139bool BKE_mesh_attribute_required(const char *name);
140
144 bool invert);
145void BKE_mesh_orco_verts_transform(Mesh *mesh, float (*orco)[3], int totvert, bool invert);
146
150void BKE_mesh_orco_ensure(Object *ob, Mesh *mesh);
151
153void BKE_mesh_assign_object(Main *bmain, Object *ob, Mesh *mesh);
154void BKE_mesh_to_curve_nurblist(const Mesh *mesh, ListBase *nurblist, int edge_users_test);
155void BKE_mesh_to_curve(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob);
156void BKE_mesh_to_pointcloud(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob);
157void BKE_pointcloud_to_mesh(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob);
158void BKE_mesh_material_index_remove(Mesh *mesh, short index);
159bool BKE_mesh_material_index_used(Mesh *mesh, short index);
161void BKE_mesh_material_remap(Mesh *mesh, const unsigned int *remap, unsigned int remap_len);
162
163void BKE_mesh_texspace_calc(Mesh *mesh);
165void BKE_mesh_texspace_get(Mesh *mesh, float r_texspace_location[3], float r_texspace_size[3]);
167 char **r_texspace_flag,
168 float **r_texspace_location,
169 float **r_texspace_size);
170
182 Object *object,
183 bool preserve_all_data_layers,
184 bool preserve_origindex);
185
192 Depsgraph *depsgraph,
193 Object *object,
194 bool preserve_all_data_layers);
195
200void BKE_mesh_nomain_to_mesh(Mesh *mesh_src, Mesh *mesh_dst, Object *ob);
201void BKE_mesh_nomain_to_meshkey(Mesh *mesh_src, Mesh *mesh_dst, KeyBlock *kb);
202
203/* Vertex level transformations & checks (no evaluated mesh). */
204
205/* basic vertex data functions */
206void BKE_mesh_transform(Mesh *mesh, const float mat[4][4], bool do_keys);
207void BKE_mesh_translate(Mesh *mesh, const float offset[3], bool do_keys);
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
238 float vec_lnor[3];
240 float vec_ref[3];
242 float vec_ortho[3];
246 float ref_beta;
252 char flags;
253};
257enum {
259};
260
265 MLoopNorSpace **lspacearr; /* Face corner aligned array */
266 struct LinkNode
267 *loops_pool; /* Allocated once, avoids to call BLI_linklist_prepend_arena() for each loop! */
268 char data_type; /* Whether we store loop indices, or pointers to BMLoop. */
269 int spaces_num; /* Number of clnors spaces defined in this array. */
270 struct MemArena *mem;
271};
275enum {
278};
279
280/* Low-level custom normals functions. */
281void BKE_lnor_spacearr_init(MLoopNorSpaceArray *lnors_spacearr, int numLoops, char data_type);
282void BKE_lnor_spacearr_clear(MLoopNorSpaceArray *lnors_spacearr);
283void BKE_lnor_spacearr_free(MLoopNorSpaceArray *lnors_spacearr);
284
293 MLoopNorSpaceArray *lnors_spacearr_tls);
299 MLoopNorSpaceArray *lnors_spacearr_tls);
300
302
309void BKE_lnor_space_define(MLoopNorSpace *lnor_space,
310 const float lnor[3],
311 const float vec_ref[3],
312 const float vec_other[3],
313 blender::Span<blender::float3> edge_vectors);
314
324 MLoopNorSpace *lnor_space,
325 int corner,
326 void *bm_loop,
327 bool is_single);
329 const short clnor_data[2],
330 float r_custom_lnor[3]);
332 const float custom_lnor[3],
333 short r_clnor_data[2]);
334
341void BKE_mesh_normals_loop_to_vertex(int numVerts,
342 const int *corner_verts,
343 int numLoops,
344 const float (*clnors)[3],
345 float (*r_vert_clnors)[3]);
346
351
359void BKE_mesh_set_custom_normals(Mesh *mesh, float (*r_custom_loop_normals)[3]);
360void BKE_mesh_set_custom_normals_normalized(Mesh *mesh, float (*r_custom_loop_normals)[3]);
368void BKE_mesh_set_custom_normals_from_verts(Mesh *mesh, float (*r_custom_vert_normals)[3]);
370 float (*r_custom_vert_normals)[3]);
371
372/* *** mesh_evaluate.cc *** */
373
374float BKE_mesh_calc_area(const Mesh *mesh);
375
376bool BKE_mesh_center_median(const Mesh *mesh, float r_cent[3]);
381bool BKE_mesh_center_median_from_faces(const Mesh *mesh, float r_cent[3]);
382bool BKE_mesh_center_of_surface(const Mesh *mesh, float r_cent[3]);
387bool BKE_mesh_center_of_volume(const Mesh *mesh, float r_cent[3]);
388
395void BKE_mesh_calc_volume(const float (*vert_positions)[3],
396 int mverts_num,
397 const blender::int3 *corner_tris,
398 int corner_tris_num,
399 const int *corner_verts,
400 float *r_volume,
401 float r_center[3]);
402
407void BKE_mesh_mdisp_flip(MDisps *md, bool use_loop_mdisp_flip);
408
416
417/* Flush flags. */
418
419/* spatial evaluation */
431void BKE_mesh_calc_relative_deform(const int *face_offsets,
432 int faces_num,
433 const int *corner_verts,
434 int totvert,
435
436 const float (*vert_cos_src)[3],
437 const float (*vert_cos_dst)[3],
438
439 const float (*vert_cos_org)[3],
440 float (*vert_cos_new)[3]);
441
442/* *** mesh_validate.cc *** */
443
449bool BKE_mesh_validate(Mesh *mesh, bool do_verbose, bool cddata_check_mask);
454bool BKE_mesh_is_valid(Mesh *mesh);
460
467 float (*vert_positions)[3],
468 unsigned int verts_num,
469 blender::int2 *edges,
470 unsigned int edges_num,
471 MFace *legacy_faces,
472 unsigned int legacy_faces_num,
473 const int *corner_verts,
474 int *corner_edges,
475 unsigned int corners_num,
476 const int *face_offsets,
477 unsigned int faces_num,
478 MDeformVert *dverts, /* assume totvert length */
479 bool do_verbose,
480 bool do_fixes,
481 bool *r_change);
482
487 uint verts_num,
488 CustomData *edge_data,
489 uint edges_num,
490 CustomData *corner_data,
491 uint corners_num,
492 CustomData *face_data,
493 uint faces_num,
494 bool check_meshmask,
495 bool do_verbose,
496 bool do_fixes,
497 bool *r_change);
498
500
501/* **** Depsgraph evaluation **** */
502
503void BKE_mesh_eval_geometry(Depsgraph *depsgraph, Mesh *mesh);
504
505/* Draw Cache */
507void BKE_mesh_batch_cache_free(void *batch_cache);
508
510extern void (*BKE_mesh_batch_cache_free_cb)(void *batch_cache);
511
512/* `mesh_debug.cc` */
513
514#ifndef NDEBUG
516void BKE_mesh_debug_print(const Mesh *mesh) ATTR_NONNULL(1);
517#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)
bool BKE_mesh_attribute_required(const char *name)
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)
@ MLNOR_SPACE_IS_SINGLE
Definition BKE_mesh.h:258
void BKE_mesh_strip_loose_faces(Mesh *mesh)
void(* BKE_mesh_batch_cache_free_cb)(void *batch_cache)
@ MLNOR_SPACEARR_LOOP_INDEX
Definition BKE_mesh.h:276
@ MLNOR_SPACEARR_BMLOOP_PTR
Definition BKE_mesh.h:277
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_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)
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])
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_nomain_to_mesh(Mesh *mesh_src, Mesh *mesh_dst, Object *ob)
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:76
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_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)
void BKE_mesh_translate(Mesh *mesh, const float offset[3], bool do_keys)
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)
Mesh * BKE_mesh_new_from_object(Depsgraph *depsgraph, Object *object, bool preserve_all_data_layers, bool preserve_origindex)
bool BKE_mesh_face_normals_are_dirty(const Mesh *mesh)
void BKE_mesh_free_editmesh(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)
BMesh * BKE_mesh_to_bmesh(Mesh *mesh, Object *ob, bool add_key_index, const BMeshCreateParams *params)
bool BKE_mesh_is_valid(Mesh *mesh)
void BKE_mesh_texspace_get(Mesh *mesh, float r_texspace_location[3], float r_texspace_size[3])
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_normals_loop_to_vertex(int numVerts, const int *corner_verts, int numLoops, const float(*clnors)[3], float(*r_vert_clnors)[3])
void BKE_mesh_set_custom_normals_from_verts_normalized(Mesh *mesh, float(*r_custom_vert_normals)[3])
void BKE_mesh_set_custom_normals_normalized(Mesh *mesh, float(*r_custom_loop_normals)[3])
bool BKE_mesh_center_median(const Mesh *mesh, float r_cent[3])
void BKE_mesh_set_custom_normals_from_verts(Mesh *mesh, float(*r_custom_vert_normals)[3])
void BKE_mesh_material_index_clear(Mesh *mesh)
void BKE_mesh_free_data_for_undo(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:31
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)
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)
void BKE_mesh_transform(Mesh *mesh, const float mat[4][4], bool do_keys)
#define ATTR_WARN_UNUSED_RESULT
#define ATTR_MALLOC
#define ATTR_NONNULL(...)
unsigned int uint
ATTR_WARN_UNUSED_RESULT BMesh * bm
const Depsgraph * depsgraph
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
CCL_NAMESPACE_BEGIN ccl_device float invert(float color, float factor)
Definition invert.h:9
struct LinkNode * loops_pool
Definition BKE_mesh.h:266
struct MemArena * mem
Definition BKE_mesh.h:270
MLoopNorSpace ** lspacearr
Definition BKE_mesh.h:265
float ref_alpha
Definition BKE_mesh.h:244
float vec_ortho[3]
Definition BKE_mesh.h:242
float ref_beta
Definition BKE_mesh.h:246
float vec_ref[3]
Definition BKE_mesh.h:240
float vec_lnor[3]
Definition BKE_mesh.h:238
struct LinkNode * loops
Definition BKE_mesh.h:251