Blender V4.3
BKE_customdata.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2006 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10#pragma once
11
12#include "BLI_cpp_type.hh"
15#include "BLI_set.hh"
16#include "BLI_span.hh"
17#include "BLI_string_ref.hh"
18#include "BLI_sys_types.h"
19#include "BLI_utildefines.h"
20#include "BLI_vector.hh"
21
22#include "BKE_volume_enums.hh"
23
25
26struct BlendDataReader;
27struct BlendWriter;
28struct BMesh;
30struct CustomData;
32struct ID;
33struct MeshPairRemap;
34
35/* These names are used as prefixes for UV layer names to find the associated boolean
36 * layers. They should never be longer than 2 chars, as #MAX_CUSTOMDATA_LAYER_NAME
37 * has 4 extra bytes above what can be used for the base layer name, and these
38 * prefixes are placed between 2 '.'s at the start of the layer name.
39 * For example The uv vert selection layer of a layer named `UVMap.001`
40 * will be called `.vs.UVMap.001`. */
41#define UV_VERTSEL_NAME "vs"
42#define UV_EDGESEL_NAME "es"
43#define UV_PINNED_NAME "pn"
44
51 int uv;
54 int pin;
55};
56
57/* A data type large enough to hold 1 element from any custom-data layer type. */
59 unsigned char data[64];
60};
61
68
69/* for ORIGINDEX layer type, indicates no original index for this element */
70#define ORIGINDEX_NONE -1
71
72/* initializes a CustomData object with the same layer setup as source and
73 * memory space for totelem elements. mask must be an array of length
74 * CD_NUMTYPES elements, that indicate if a layer can be copied. */
75
86
87#define CD_TYPE_AS_MASK(_type) (eCustomDataMask)((eCustomDataMask)1 << (eCustomDataMask)(_type))
88
90
91using cd_interp = void (*)(
92 const void **sources, const float *weights, const float *sub_weights, int count, void *dest);
93using cd_copy = void (*)(const void *source, void *dest, int count);
94using cd_set_default_value = void (*)(void *data, int count);
95using cd_free = void (*)(void *data, int count);
96using cd_validate = bool (*)(void *item, uint totitems, bool do_fixes);
97
102 const CustomData_MeshMasks *mask_src);
107 const CustomData_MeshMasks *mask_required);
108
113bool CustomData_layer_has_math(const CustomData *data, int layer_n);
114bool CustomData_layer_has_interp(const CustomData *data, int layer_n);
115
119bool CustomData_has_math(const CustomData *data);
120bool CustomData_has_interp(const CustomData *data);
124bool CustomData_bmesh_has_free(const CustomData *data);
125
130
136void CustomData_data_copy_value(eCustomDataType type, const void *source, void *dest);
138
144 eCustomDataType type, const void *source, void *dest, int mixmode, float mixfactor);
145
151bool CustomData_data_equals(eCustomDataType type, const void *data1, const void *data2);
152void CustomData_data_initminmax(eCustomDataType type, void *min, void *max);
153void CustomData_data_dominmax(eCustomDataType type, const void *data, void *min, void *max);
154void CustomData_data_multiply(eCustomDataType type, void *data, float fac);
155void CustomData_data_add(eCustomDataType type, void *data1, const void *data2);
156
165void CustomData_init_from(const CustomData *source,
166 CustomData *dest,
167 eCustomDataMask mask,
168 int totelem);
176void CustomData_init_layout_from(const CustomData *source,
177 CustomData *dest,
178 eCustomDataMask mask,
179 eCDAllocType alloctype,
180 int totelem);
181
182/* BMESH_TODO, not really a public function but `readfile.cc` needs it. */
184
188bool CustomData_merge(const CustomData *source,
189 CustomData *dest,
190 eCustomDataMask mask,
191 int totelem);
196bool CustomData_merge_layout(const CustomData *source,
197 CustomData *dest,
198 eCustomDataMask mask,
199 eCDAllocType alloctype,
200 int totelem);
201
208 int old_size,
209 int new_size,
210 eCDAllocType alloctype = CD_CONSTRUCT);
211
218 CustomData *dest,
219 eCustomDataMask mask,
220 eCDAllocType alloctype,
221 BMesh *bm,
222 char htype);
223
230 eCustomDataMask mask);
231
237void CustomData_reset(CustomData *data);
238
242void CustomData_free(CustomData *data, int totelem);
243
247void CustomData_free_typemask(CustomData *data, int totelem, eCustomDataMask mask);
248
255 eCustomDataType type,
256 eCDAllocType alloctype,
257 int totelem);
258
264 eCustomDataType type,
265 void *layer_data,
266 int totelem,
267 const blender::ImplicitSharingInfo *sharing_info);
268
273 eCustomDataType type,
274 eCDAllocType alloctype,
275 int totelem,
276 blender::StringRef name);
277
279 eCustomDataType type,
280 void *layer_data,
281 int totelem,
283 const blender::ImplicitSharingInfo *sharing_info);
284
291bool CustomData_free_layer(CustomData *data, eCustomDataType type, int totelem, int index);
292bool CustomData_free_layer_named(CustomData *data, blender::StringRef name, const int totelem);
293
300bool CustomData_free_layer_active(CustomData *data, eCustomDataType type, int totelem);
301
305void CustomData_free_layers(CustomData *data, eCustomDataType type, int totelem);
306
310bool CustomData_has_layer(const CustomData *data, eCustomDataType type);
312 eCustomDataType type,
313 blender::StringRef name);
314
320int CustomData_number_of_layers_typemask(const CustomData *data, eCustomDataMask mask);
321
326void CustomData_set_only_copy(const CustomData *data, eCustomDataMask mask);
327
334 const CustomData *source, CustomData *dest, int source_index, int dest_index, int count);
335void CustomData_copy_data_layer(const CustomData *source,
336 CustomData *dest,
337 int src_layer_index,
338 int dst_layer_index,
339 int src_index,
340 int dst_index,
341 int count);
343 const CustomData *source, CustomData *dest, int source_index, int dest_index, int count);
345 void *src_data_ofs,
346 void *dst_data_ofs,
347 int count);
348
353void CustomData_bmesh_copy_block(CustomData &data, void *src_block, void **dst_block);
354
385
388 const CustomData &dst,
389 eCustomDataMask mask_exclude = 0);
390
396 const BMCustomDataCopyMap &map,
397 const void *src_block,
398 void **dst_block);
399
404 CustomData *destination,
405 eCustomDataType type,
406 int source_index,
407 int destination_index,
408 int count);
409
414void CustomData_free_elem(CustomData *data, int index, int count);
415
428void CustomData_interp(const CustomData *source,
429 CustomData *dest,
430 const int *src_indices,
431 const float *weights,
432 const float *sub_weights,
433 int count,
434 int dest_index);
440 const void **src_blocks,
441 const float *weights,
442 const float *sub_weights,
443 int count,
444 void *dst_block_ofs,
445 int n);
447 const void **src_blocks,
448 const float *weights,
449 const float *sub_weights,
450 int count,
451 void *dst_block);
452
460void CustomData_swap_corners(CustomData *data, int index, const int *corner_indices);
461
466void CustomData_ensure_data_is_mutable(CustomDataLayer *layer, int totelem);
467void CustomData_ensure_layers_are_mutable(CustomData *data, int totelem);
468
473void *CustomData_get_for_write(CustomData *data, int index, eCustomDataType type, int totelem);
479 CustomData *data, eCustomDataType type, int index, int n, int totelem);
480
481/* BMesh Custom Data Functions.
482 * Should replace edit-mesh ones with these as well, due to more efficient memory alloc. */
483
484void *CustomData_bmesh_get(const CustomData *data, void *block, eCustomDataType type);
485void *CustomData_bmesh_get_n(const CustomData *data, void *block, eCustomDataType type, int n);
486
491void *CustomData_bmesh_get_layer_n(const CustomData *data, void *block, int n);
492
494 eCustomDataType type,
495 int n,
496 blender::StringRef name);
497const char *CustomData_get_layer_name(const CustomData *data, eCustomDataType type, int n);
498
503const void *CustomData_get_layer(const CustomData *data, eCustomDataType type);
504void *CustomData_get_layer_for_write(CustomData *data, eCustomDataType type, int totelem);
505
510const void *CustomData_get_layer_n(const CustomData *data, eCustomDataType type, int n);
511void *CustomData_get_layer_n_for_write(CustomData *data, eCustomDataType type, int n, int totelem);
512
517const void *CustomData_get_layer_named(const CustomData *data,
518 eCustomDataType type,
519 blender::StringRef name);
521 eCustomDataType type,
523 int totelem);
524
527 eCustomDataType type,
528 blender::StringRef name);
529int CustomData_get_n_offset(const CustomData *data, eCustomDataType type, int n);
530
532int CustomData_get_layer_index_n(const CustomData *data, eCustomDataType type, int n);
534 eCustomDataType type,
535 blender::StringRef name);
542 eCustomDataType type,
543 blender::StringRef name);
548
553const char *CustomData_get_active_layer_name(const CustomData *data, eCustomDataType type);
554
559const char *CustomData_get_render_layer_name(const CustomData *data, eCustomDataType type);
560
561bool CustomData_layer_is_anonymous(const CustomData *data, eCustomDataType type, int n);
562
564 CustomData *data, void *block, eCustomDataType type, int n, const void *source);
565
573
582
588
589void CustomData_bmesh_set_default(CustomData *data, void **block);
590void CustomData_bmesh_free_block(CustomData *data, void **block);
591void CustomData_bmesh_alloc_block(CustomData *data, void **block);
592
596void CustomData_bmesh_free_block_data(CustomData *data, void *block);
601 void *block,
602 eCustomDataMask mask_exclude);
603
608 const char **r_struct_name,
609 int *r_struct_num);
611
630
633
637void CustomData_set_layer_unique_name(CustomData *data, int index);
638
640 eCustomDataType type,
642 char *outname);
643
648bool CustomData_verify_versions(CustomData *data, int index);
649
650/* BMesh specific custom-data stuff. */
651
652void CustomData_bmesh_init_pool(CustomData *data, int totelem, char htype);
653
660bool CustomData_layer_validate(CustomDataLayer *layer, uint totitems, bool do_fixes);
661
662/* External file storage */
663
665 CustomData *data, ID *id, eCustomDataType type, int totelem, const char *filepath);
666void CustomData_external_remove(CustomData *data, ID *id, eCustomDataType type, int totelem);
668
670 CustomData *data, ID *id, eCustomDataMask mask, int totelem, int free);
671void CustomData_external_read(CustomData *data, ID *id, eCustomDataMask mask, int totelem);
672void CustomData_external_reload(CustomData *data, ID *id, eCustomDataMask mask, int totelem);
673
674/* Mesh-to-mesh transfer data. */
675
677 void *dest,
678 const void **sources,
679 const float *weights,
680 int count,
681 float mix_factor);
682
686enum {
687 CD_FAKE = 1 << 8,
688
689 /* Vertices. */
690 CD_FAKE_MDEFORMVERT = CD_FAKE | CD_MDEFORMVERT, /* *sigh* due to how vgroups are stored :(. */
692 CD_SHAPEKEY, /* Not available as real CD layer in non-bmesh context. */
693
694 /* Edges. */
695 CD_FAKE_SEAM = CD_FAKE | 100, /* UV seam flag for edges. */
696
697 /* Multiple types of mesh elements... */
698 CD_FAKE_UV =
699 CD_FAKE |
700 CD_PROP_FLOAT2, /* UV flag, because we handle both loop's UVs and face's textures. */
701
703 CD_CUSTOMLOOPNORMAL, /* Because we play with clnor and temp lnor layers here. */
704
705 CD_FAKE_SHARP = CD_FAKE | 200, /* Sharp flag for edges, smooth flag for faces. */
706
709};
710
711enum {
712 ME_VERT = 1 << 0,
713 ME_EDGE = 1 << 1,
714 ME_POLY = 1 << 2,
715 ME_LOOP = 1 << 3,
716};
717
721enum {
722 CDT_MIX_NOMIX = -1, /* Special case, only used because we abuse 'copy' CD callback. */
730 /* Etc. */
731};
732
765
769void CustomData_data_transfer(const MeshPairRemap *me_remap,
770 const CustomDataTransferLayerMap *laymap);
771
772/* .blend file I/O */
773
786 const blender::Set<std::string> &skip_names = {});
787
792 CustomData *data,
793 blender::Span<CustomDataLayer> layers_to_write,
794 int count,
795 eCustomDataMask cddata_mask,
796 ID *id);
797
798void CustomData_blend_read(BlendDataReader *reader, CustomData *data, int count);
799
800size_t CustomData_get_elem_size(const CustomDataLayer *layer);
801
802void CustomData_count_memory(const CustomData &data, int totelem, blender::MemoryCounter &memory);
803
804#ifndef NDEBUG
805struct DynStr;
807void CustomData_debug_info_from_layers(const CustomData *data, const char *indent, DynStr *dynstr);
808#endif /* !NDEBUG */
809
810namespace blender::bke {
811std::optional<VolumeGridType> custom_data_type_to_volume_grid_type(eCustomDataType type);
812std::optional<eCustomDataType> volume_grid_type_to_custom_data_type(VolumeGridType type);
813} // namespace blender::bke
void CustomData_data_set_default_value(eCustomDataType type, void *elem)
void CustomData_debug_info_from_layers(const CustomData *data, const char *indent, DynStr *dynstr)
void CustomData_blend_write_prepare(CustomData &data, blender::Vector< CustomDataLayer, 16 > &layers_to_write, const blender::Set< std::string > &skip_names={})
@ ME_VERT
@ ME_POLY
@ ME_LOOP
@ ME_EDGE
void CustomData_count_memory(const CustomData &data, int totelem, blender::MemoryCounter &memory)
void(*)( const void **sources, const float *weights, const float *sub_weights, int count, void *dest) cd_interp
int CustomData_sizeof(eCustomDataType type)
const CustomData_MeshMasks CD_MASK_EVERYTHING
void CustomData_realloc(CustomData *data, int old_size, int new_size, eCDAllocType alloctype=CD_CONSTRUCT)
void * CustomData_get_n_for_write(CustomData *data, eCustomDataType type, int index, int n, int totelem)
int CustomData_get_offset(const CustomData *data, eCustomDataType type)
const char * CustomData_layertype_name(eCustomDataType type)
void * CustomData_get_layer_named_for_write(CustomData *data, eCustomDataType type, blender::StringRef name, int totelem)
int CustomData_get_layer_index_n(const CustomData *data, eCustomDataType type, int n)
void CustomData_set_only_copy(const CustomData *data, eCustomDataMask mask)
int CustomData_get_clone_layer(const CustomData *data, eCustomDataType type)
const void * CustomData_get_layer_n(const CustomData *data, eCustomDataType type, int n)
int CustomData_get_named_layer(const CustomData *data, eCustomDataType type, blender::StringRef name)
@ CDT_MIX_SUB
@ CDT_MIX_REPLACE_BELOW_THRESHOLD
@ CDT_MIX_REPLACE_ABOVE_THRESHOLD
@ CDT_MIX_ADD
@ CDT_MIX_MUL
@ CDT_MIX_TRANSFER
@ CDT_MIX_MIX
@ CDT_MIX_NOMIX
bool CustomData_bmesh_merge_layout(const CustomData *source, CustomData *dest, eCustomDataMask mask, eCDAllocType alloctype, BMesh *bm, char htype)
bool CustomData_free_layer_named(CustomData *data, blender::StringRef name, const int totelem)
void CustomData_set_layer_render_index(CustomData *data, eCustomDataType type, int n)
const void * CustomData_get_layer(const CustomData *data, eCustomDataType type)
void CustomData_external_remove(CustomData *data, ID *id, eCustomDataType type, int totelem)
const CustomData_MeshMasks CD_MASK_BAREMESH_ORIGINDEX
int CustomData_get_named_layer_index_notype(const CustomData *data, blender::StringRef name)
int CustomData_number_of_anonymous_layers(const CustomData *data, eCustomDataType type)
void(*)(const CustomDataTransferLayerMap *laymap, void *dest, const void **sources, const float *weights, int count, float mix_factor) cd_datatransfer_interp
bool CustomData_layer_has_interp(const CustomData *data, int layer_n)
void CustomData_set_layer_flag(CustomData *data, eCustomDataType type, int flag)
int CustomData_get_n_offset(const CustomData *data, eCustomDataType type, int n)
bool CustomData_layer_is_anonymous(const CustomData *data, eCustomDataType type, int n)
eCDAllocType
@ CD_SET_DEFAULT
@ CD_CONSTRUCT
void CustomData_external_read(CustomData *data, ID *id, eCustomDataMask mask, int totelem)
void CustomData_interp(const CustomData *source, CustomData *dest, const int *src_indices, const float *weights, const float *sub_weights, int count, int dest_index)
void CustomData_copy_elements(eCustomDataType type, void *src_data_ofs, void *dst_data_ofs, int count)
void CustomData_bmesh_free_block(CustomData *data, void **block)
const void * CustomData_get_layer_named(const CustomData *data, eCustomDataType type, blender::StringRef name)
void * CustomData_add_layer_named(CustomData *data, eCustomDataType type, eCDAllocType alloctype, int totelem, blender::StringRef name)
BMCustomDataCopyMap CustomData_bmesh_copy_map_calc(const CustomData &src, const CustomData &dst, eCustomDataMask mask_exclude=0)
void CustomData_validate_layer_name(const CustomData *data, eCustomDataType type, blender::StringRef name, char *outname)
void CustomData_data_initminmax(eCustomDataType type, void *min, void *max)
int CustomData_number_of_layers_typemask(const CustomData *data, eCustomDataMask mask)
void CustomData_MeshMasks_update(CustomData_MeshMasks *mask_dst, const CustomData_MeshMasks *mask_src)
Definition customdata.cc:91
void CustomData_bmesh_init_pool(CustomData *data, int totelem, char htype)
void CustomData_set_layer_render(CustomData *data, eCustomDataType type, int n)
void * CustomData_bmesh_get_n(const CustomData *data, void *block, eCustomDataType type, int n)
bool CustomData_free_layer_active(CustomData *data, eCustomDataType type, int totelem)
int CustomData_get_stencil_layer(const CustomData *data, eCustomDataType type)
void(*)(void *data, int count) cd_set_default_value
void CustomData_clear_layer_flag(CustomData *data, eCustomDataType type, int flag)
void customData_mask_layers__print(const CustomData_MeshMasks *mask)
void CustomData_reset(CustomData *data)
int CustomData_get_named_layer_index(const CustomData *data, eCustomDataType type, blender::StringRef name)
bool CustomData_has_layer_named(const CustomData *data, eCustomDataType type, blender::StringRef name)
bool CustomData_layer_has_math(const CustomData *data, int layer_n)
bool CustomData_set_layer_name(CustomData *data, eCustomDataType type, int n, blender::StringRef name)
const char * CustomData_get_layer_name(const CustomData *data, eCustomDataType type, int n)
bool CustomData_MeshMasks_are_matching(const CustomData_MeshMasks *mask_ref, const CustomData_MeshMasks *mask_required)
bool CustomData_free_layer(CustomData *data, eCustomDataType type, int totelem, int index)
int CustomData_get_offset_named(const CustomData *data, eCustomDataType type, blender::StringRef name)
void * CustomData_bmesh_get(const CustomData *data, void *block, eCustomDataType type)
void CustomData_blend_write(BlendWriter *writer, CustomData *data, blender::Span< CustomDataLayer > layers_to_write, int count, eCustomDataMask cddata_mask, ID *id)
void CustomData_copy_data_layer(const CustomData *source, CustomData *dest, int src_layer_index, int dst_layer_index, int src_index, int dst_index, int count)
bool CustomData_has_interp(const CustomData *data)
void CustomData_bmesh_interp(CustomData *data, const void **src_blocks, const float *weights, const float *sub_weights, int count, void *dst_block)
const CustomData_MeshMasks CD_MASK_BAREMESH
int CustomData_get_stencil_layer_index(const CustomData *data, eCustomDataType type)
bool CustomData_layertype_is_dynamic(eCustomDataType type)
int CustomData_get_layer_index(const CustomData *data, eCustomDataType type)
void CustomData_bmesh_free_block_data_exclude_by_type(CustomData *data, void *block, eCustomDataMask mask_exclude)
void CustomData_set_layer_clone_index(CustomData *data, eCustomDataType type, int n)
void CustomData_init_from(const CustomData *source, CustomData *dest, eCustomDataMask mask, int totelem)
void CustomData_free(CustomData *data, int totelem)
void CustomData_set_layer_clone(CustomData *data, eCustomDataType type, int n)
void(*)(void *data, int count) cd_free
bool CustomData_merge(const CustomData *source, CustomData *dest, eCustomDataMask mask, int totelem)
bool CustomData_verify_versions(CustomData *data, int index)
bool CustomData_layer_validate(CustomDataLayer *layer, uint totitems, bool do_fixes)
void CustomData_data_copy_value(eCustomDataType type, const void *source, void *dest)
void CustomData_free_layers(CustomData *data, eCustomDataType type, int totelem)
void CustomData_free_typemask(CustomData *data, int totelem, eCustomDataMask mask)
const CustomData_MeshMasks CD_MASK_BMESH
void CustomData_update_typemap(CustomData *data)
void CustomData_external_add(CustomData *data, ID *id, eCustomDataType type, int totelem, const char *filepath)
void CustomData_blend_read(BlendDataReader *reader, CustomData *data, int count)
void CustomData_bmesh_set_default(CustomData *data, void **block)
void CustomData_bmesh_set_n(CustomData *data, void *block, eCustomDataType type, int n, const void *source)
void CustomData_set_layer_active_index(CustomData *data, eCustomDataType type, int n)
void CustomData_copy_layer_type_data(const CustomData *source, CustomData *destination, eCustomDataType type, int source_index, int destination_index, int count)
void CustomData_bmesh_copy_block(CustomData &data, void *src_block, void **dst_block)
void(*)(const void *source, void *dest, int count) cd_copy
const char * CustomData_get_render_layer_name(const CustomData *data, eCustomDataType type)
int CustomData_layertype_layers_max(eCustomDataType type)
bool CustomData_has_referenced(const CustomData *data)
void CustomData_data_dominmax(eCustomDataType type, const void *data, void *min, void *max)
bool(*)(void *item, uint totitems, bool do_fixes) cd_validate
void CustomData_file_write_info(eCustomDataType type, const char **r_struct_name, int *r_struct_num)
void CustomData_init_layout_from(const CustomData *source, CustomData *dest, eCustomDataMask mask, eCDAllocType alloctype, int totelem)
void CustomData_data_transfer(const MeshPairRemap *me_remap, const CustomDataTransferLayerMap *laymap)
int CustomData_get_active_layer(const CustomData *data, eCustomDataType type)
int CustomData_name_maxncpy_calc(blender::StringRef name)
void * CustomData_get_layer_for_write(CustomData *data, eCustomDataType type, int totelem)
void CustomData_data_multiply(eCustomDataType type, void *data, float fac)
CustomData CustomData_shallow_copy_remove_non_bmesh_attributes(const CustomData *src, eCustomDataMask mask)
void CustomData_set_layer_unique_name(CustomData *data, int index)
bool CustomData_bmesh_has_free(const CustomData *data)
void CustomData_free_elem(CustomData *data, int index, int count)
const void * CustomData_add_layer_with_data(CustomData *data, eCustomDataType type, void *layer_data, int totelem, const blender::ImplicitSharingInfo *sharing_info)
void CustomData_copy_data(const CustomData *source, CustomData *dest, int source_index, int dest_index, int count)
void CustomData_ensure_data_is_mutable(CustomDataLayer *layer, int totelem)
bool CustomData_has_layer(const CustomData *data, eCustomDataType type)
size_t CustomData_get_elem_size(const CustomDataLayer *layer)
@ CD_FAKE_UV
@ CD_FAKE_LNOR
@ CD_FAKE_CREASE
@ CD_FAKE
@ CD_FAKE_SHARP
@ CD_FAKE_BWEIGHT
@ CD_FAKE_MDEFORMVERT
@ CD_FAKE_SHAPEKEY
@ CD_FAKE_SEAM
void CustomData_ensure_layers_are_mutable(CustomData *data, int totelem)
void * CustomData_add_layer(CustomData *data, eCustomDataType type, eCDAllocType alloctype, int totelem)
bool CustomData_layertype_is_singleton(eCustomDataType type)
const CustomData_MeshMasks CD_MASK_DERIVEDMESH
bool CustomData_data_equals(eCustomDataType type, const void *data1, const void *data2)
bool CustomData_merge_layout(const CustomData *source, CustomData *dest, eCustomDataMask mask, eCDAllocType alloctype, int totelem)
int CustomData_get_active_layer_index(const CustomData *data, eCustomDataType type)
const char * CustomData_get_active_layer_name(const CustomData *data, eCustomDataType type)
int CustomData_get_render_layer(const CustomData *data, eCustomDataType type)
void CustomData_external_write(CustomData *data, ID *id, eCustomDataMask mask, int totelem, int free)
const void * CustomData_add_layer_named_with_data(CustomData *data, eCustomDataType type, void *layer_data, int totelem, blender::StringRef name, const blender::ImplicitSharingInfo *sharing_info)
void CustomData_external_reload(CustomData *data, ID *id, eCustomDataMask mask, int totelem)
void CustomData_data_add(eCustomDataType type, void *data1, const void *data2)
void CustomData_set_layer_stencil_index(CustomData *data, eCustomDataType type, int n)
int CustomData_number_of_layers(const CustomData *data, eCustomDataType type)
void CustomData_copy_data_named(const CustomData *source, CustomData *dest, int source_index, int dest_index, int count)
bool CustomData_external_test(CustomData *data, eCustomDataType type)
int CustomData_get_render_layer_index(const CustomData *data, eCustomDataType type)
bool CustomData_has_math(const CustomData *data)
void CustomData_bmesh_alloc_block(CustomData *data, void **block)
void CustomData_set_layer_active(CustomData *data, eCustomDataType type, int n)
void * CustomData_get_layer_n_for_write(CustomData *data, eCustomDataType type, int n, int totelem)
void CustomData_data_mix_value(eCustomDataType type, const void *source, void *dest, int mixmode, float mixfactor)
void * CustomData_bmesh_get_layer_n(const CustomData *data, void *block, int n)
const CustomData_MeshMasks CD_MASK_MESH
void CustomData_bmesh_free_block_data(CustomData *data, void *block)
void * CustomData_get_for_write(CustomData *data, int index, eCustomDataType type, int totelem)
int CustomData_get_clone_layer_index(const CustomData *data, eCustomDataType type)
void CustomData_set_layer_stencil(CustomData *data, eCustomDataType type, int n)
void CustomData_swap_corners(CustomData *data, int index, const int *corner_indices)
void CustomData_bmesh_interp_n(CustomData *data, const void **src_blocks, const float *weights, const float *sub_weights, int count, void *dst_block_ofs, int n)
VolumeGridType
void BLI_kdtree_nd_ free(KDTree *tree)
unsigned int uint
@ CD_CUSTOMLOOPNORMAL
@ CD_MDEFORMVERT
@ CD_PROP_FLOAT2
ATTR_WARN_UNUSED_RESULT BMesh * bm
int count
std::optional< VolumeGridType > custom_data_type_to_volume_grid_type(eCustomDataType type)
std::optional< eCustomDataType > volume_grid_type_to_custom_data_type(VolumeGridType type)
#define min(a, b)
Definition sort.c:32
unsigned __int64 uint64_t
Definition stdint.h:90
blender::Vector< Free > free
blender::Vector< TrivialCopy > trivial_copies
blender::Vector< TrivialDefault > trivial_defaults
blender::Vector< Default > defaults
blender::Vector< Copy > copies
CustomDataTransferLayerMap * prev
CustomDataTransferLayerMap * next
cd_datatransfer_interp interp
Definition DNA_ID.h:413
uint8_t flag
Definition wm_window.cc:138