Blender V4.5
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
197void BKE_mesh_nomain_to_mesh(Mesh *mesh_src, Mesh *mesh_dst, Object *ob);
198void BKE_mesh_nomain_to_meshkey(Mesh *mesh_src, Mesh *mesh_dst, KeyBlock *kb);
199
200/* Vertex level transformations & checks (no evaluated mesh). */
201
202void BKE_mesh_tessface_clear(Mesh *mesh);
203
204void BKE_mesh_mselect_clear(Mesh *mesh);
209int BKE_mesh_mselect_find(const Mesh *mesh, int index, int type);
213int BKE_mesh_mselect_active_get(const Mesh *mesh, int type);
214void BKE_mesh_mselect_active_set(Mesh *mesh, int index, int type);
215
216void BKE_mesh_count_selected_items(const Mesh *mesh, int r_count[3]);
217
218/* *** mesh_normals.cc *** */
219
221bool BKE_mesh_vert_normals_are_dirty(const Mesh *mesh);
222
224bool BKE_mesh_face_normals_are_dirty(const Mesh *mesh);
225
234 float vec_lnor[3];
239 float vec_ref[3];
241 float vec_ortho[3];
258 float ref_beta;
265 char flags;
266};
267
270enum {
272};
273
288
291enum {
294};
295
296/* Low-level custom normals functions. */
297void BKE_lnor_spacearr_init(MLoopNorSpaceArray *lnors_spacearr, int numLoops, char data_type);
298void BKE_lnor_spacearr_clear(MLoopNorSpaceArray *lnors_spacearr);
299void BKE_lnor_spacearr_free(MLoopNorSpaceArray *lnors_spacearr);
300
309 MLoopNorSpaceArray *lnors_spacearr_tls);
315 MLoopNorSpaceArray *lnors_spacearr_tls);
316
318
325void BKE_lnor_space_define(MLoopNorSpace *lnor_space,
326 const float lnor[3],
327 const float vec_ref[3],
328 const float vec_other[3],
329 blender::Span<blender::float3> edge_vectors);
330
340 MLoopNorSpace *lnor_space,
341 int corner,
342 void *bm_loop,
343 bool is_single);
345 const short clnor_data[2],
346 float r_custom_lnor[3]);
348 const float custom_lnor[3],
349 short r_clnor_data[2]);
350
355
356/* *** mesh_evaluate.cc *** */
357
358float BKE_mesh_calc_area(const Mesh *mesh);
359
360bool BKE_mesh_center_median(const Mesh *mesh, float r_cent[3]);
365bool BKE_mesh_center_median_from_faces(const Mesh *mesh, float r_cent[3]);
366bool BKE_mesh_center_of_surface(const Mesh *mesh, float r_cent[3]);
371bool BKE_mesh_center_of_volume(const Mesh *mesh, float r_cent[3]);
372
379void BKE_mesh_calc_volume(const float (*vert_positions)[3],
380 int mverts_num,
381 const blender::int3 *corner_tris,
382 int corner_tris_num,
383 const int *corner_verts,
384 float *r_volume,
385 float r_center[3]);
386
391void BKE_mesh_mdisp_flip(MDisps *md, bool use_loop_mdisp_flip);
392
400
401/* Flush flags. */
402
403/* spatial evaluation */
415void BKE_mesh_calc_relative_deform(const int *face_offsets,
416 int faces_num,
417 const int *corner_verts,
418 int totvert,
419
420 const float (*vert_cos_src)[3],
421 const float (*vert_cos_dst)[3],
422
423 const float (*vert_cos_org)[3],
424 float (*vert_cos_new)[3]);
425
426/* *** mesh_validate.cc *** */
427
433bool BKE_mesh_validate(Mesh *mesh, bool do_verbose, bool cddata_check_mask);
438bool BKE_mesh_is_valid(Mesh *mesh);
444
451 float (*vert_positions)[3],
452 unsigned int verts_num,
453 blender::int2 *edges,
454 unsigned int edges_num,
455 MFace *legacy_faces,
456 unsigned int legacy_faces_num,
457 const int *corner_verts,
458 int *corner_edges,
459 unsigned int corners_num,
460 const int *face_offsets,
461 unsigned int faces_num,
462 MDeformVert *dverts, /* assume totvert length */
463 bool do_verbose,
464 bool do_fixes,
465 bool *r_change);
466
471 uint verts_num,
472 CustomData *edge_data,
473 uint edges_num,
474 CustomData *corner_data,
475 uint corners_num,
476 CustomData *face_data,
477 uint faces_num,
478 bool check_meshmask,
479 bool do_verbose,
480 bool do_fixes,
481 bool *r_change);
482
484
485/* **** Depsgraph evaluation **** */
486
487void BKE_mesh_eval_geometry(Depsgraph *depsgraph, Mesh *mesh);
488
489/* Draw Cache */
491void BKE_mesh_batch_cache_free(void *batch_cache);
492
494extern void (*BKE_mesh_batch_cache_free_cb)(void *batch_cache);
495
496/* `mesh_debug.cc` */
497
498#ifndef NDEBUG
500void BKE_mesh_debug_print(const Mesh *mesh) ATTR_NONNULL(1);
501#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)
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: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_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)
@ MLNOR_SPACEARR_LOOP_INDEX
Definition BKE_mesh.h:292
@ MLNOR_SPACEARR_BMLOOP_PTR
Definition BKE_mesh.h:293
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)
@ MLNOR_SPACE_IS_SINGLE
Definition BKE_mesh.h:271
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
struct LinkNode * loops_pool
Definition BKE_mesh.h:281
struct MemArena * mem
Definition BKE_mesh.h:286
MLoopNorSpace ** lspacearr
Definition BKE_mesh.h:279
float ref_alpha
Definition BKE_mesh.h:249
float vec_ortho[3]
Definition BKE_mesh.h:241
float ref_beta
Definition BKE_mesh.h:258
float vec_ref[3]
Definition BKE_mesh.h:239
float vec_lnor[3]
Definition BKE_mesh.h:234
struct LinkNode * loops
Definition BKE_mesh.h:264
string name
Definition scene.h:117