Blender V4.5
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
9
10#pragma once
11
12#include <optional>
13
16#include "BLI_span.hh"
17#include "BLI_string_ref.hh"
18#include "BLI_sys_types.h"
19#include "BLI_vector.hh"
20
22#include "BKE_volume_enums.hh"
23
25
26struct BlendDataReader;
27struct BlendWriter;
28struct BMesh;
30struct CustomData;
32struct ID;
33struct MeshPairRemap;
34
35namespace blender::bke {
36enum class AttrDomain : int8_t;
37}
38
39/* These names are used as prefixes for UV layer names to find the associated boolean
40 * layers. They should never be longer than 2 chars, as #MAX_CUSTOMDATA_LAYER_NAME
41 * has 4 extra bytes above what can be used for the base layer name, and these
42 * prefixes are placed between 2 '.'s at the start of the layer name.
43 * For example The uv vert selection layer of a layer named `UVMap.001`
44 * will be called `.vs.UVMap.001`. */
45#define UV_VERTSEL_NAME "vs"
46#define UV_EDGESEL_NAME "es"
47#define UV_PINNED_NAME "pn"
48
55 int uv;
58 int pin;
59};
60
61/* A data type large enough to hold 1 element from any custom-data layer type. */
63 unsigned char data[64];
64};
65
72
73/* for ORIGINDEX layer type, indicates no original index for this element */
74#define ORIGINDEX_NONE -1
75
76/* initializes a CustomData object with the same layer setup as source and
77 * memory space for totelem elements. mask must be an array of length
78 * CD_NUMTYPES elements, that indicate if a layer can be copied. */
79
90
91#define CD_TYPE_AS_MASK(_type) (eCustomDataMask)((eCustomDataMask)1 << (eCustomDataMask)(_type))
92
94
95using cd_interp = void (*)(
96 const void **sources, const float *weights, const float *sub_weights, int count, void *dest);
97using cd_copy = void (*)(const void *source, void *dest, int count);
98using cd_set_default_value = void (*)(void *data, int count);
99using cd_free = void (*)(void *data, int count);
100using cd_validate = bool (*)(void *item, uint totitems, bool do_fixes);
101
106 const CustomData_MeshMasks *mask_src);
111 const CustomData_MeshMasks *mask_required);
112
117bool CustomData_layer_has_math(const CustomData *data, int layer_n);
118bool CustomData_layer_has_interp(const CustomData *data, int layer_n);
119
129
135void CustomData_data_copy_value(eCustomDataType type, const void *source, void *dest);
137
143 eCustomDataType type, const void *source, void *dest, int mixmode, float mixfactor);
144
150bool CustomData_data_equals(eCustomDataType type, const void *data1, const void *data2);
151void CustomData_data_initminmax(eCustomDataType type, void *min, void *max);
152void CustomData_data_dominmax(eCustomDataType type, const void *data, void *min, void *max);
153void CustomData_data_multiply(eCustomDataType type, void *data, float fac);
154void CustomData_data_add(eCustomDataType type, void *data1, const void *data2);
155
164void CustomData_init_from(const CustomData *source,
165 CustomData *dest,
166 eCustomDataMask mask,
167 int totelem);
175void CustomData_init_layout_from(const CustomData *source,
176 CustomData *dest,
177 eCustomDataMask mask,
178 eCDAllocType alloctype,
179 int totelem);
180
181/* BMESH_TODO, not really a public function but `readfile.cc` needs it. */
183
187bool CustomData_merge(const CustomData *source,
188 CustomData *dest,
189 eCustomDataMask mask,
190 int totelem);
195bool CustomData_merge_layout(const CustomData *source,
196 CustomData *dest,
197 eCustomDataMask mask,
198 eCDAllocType alloctype,
199 int totelem);
200
207 int old_size,
208 int new_size,
209 eCDAllocType alloctype = CD_CONSTRUCT);
210
217 CustomData *dest,
218 eCustomDataMask mask,
219 eCDAllocType alloctype,
220 BMesh *bm,
221 char htype);
222
229 eCustomDataMask mask);
230
237
242
249 eCustomDataType type,
250 eCDAllocType alloctype,
251 int totelem);
252
258 eCustomDataType type,
259 void *layer_data,
260 int totelem,
261 const blender::ImplicitSharingInfo *sharing_info);
262
267 eCustomDataType type,
268 eCDAllocType alloctype,
269 int totelem,
270 blender::StringRef name);
271
273 eCustomDataType type,
274 void *layer_data,
275 int totelem,
277 const blender::ImplicitSharingInfo *sharing_info);
278
287
295
300
306 eCustomDataType type,
307 blender::StringRef name);
308
314int CustomData_number_of_layers_typemask(const CustomData *data, eCustomDataMask mask);
315
320void CustomData_set_only_copy(const CustomData *data, eCustomDataMask mask);
321
335 const CustomData *source, CustomData *dest, int source_index, int dest_index, int count);
336void CustomData_copy_data_layer(const CustomData *source,
337 CustomData *dest,
338 int src_layer_index,
339 int dst_layer_index,
340 int src_index,
341 int dst_index,
342 int count);
344 const CustomData *source, CustomData *dest, int source_index, int dest_index, int count);
346 void *src_data_ofs,
347 void *dst_data_ofs,
348 int count);
349
354void CustomData_bmesh_copy_block(CustomData &data, void *src_block, void **dst_block);
355
386
389 const CustomData &dst,
390 eCustomDataMask mask_exclude = 0);
391
397 const BMCustomDataCopyMap &map,
398 const void *src_block,
399 void **dst_block);
400
405 CustomData *destination,
406 eCustomDataType type,
407 int source_index,
408 int destination_index,
409 int count);
410
415void CustomData_free_elem(CustomData *data, int index, int count);
416
429void CustomData_interp(const CustomData *source,
430 CustomData *dest,
431 const int *src_indices,
432 const float *weights,
433 const float *sub_weights,
434 int count,
435 int dest_index);
441 const void **src_blocks,
442 const float *weights,
443 const float *sub_weights,
444 int count,
445 void *dst_block_ofs,
446 int n);
448 const void **src_blocks,
449 const float *weights,
450 const float *sub_weights,
451 int count,
452 void *dst_block);
453
461void CustomData_swap_corners(CustomData *data, int index, const int *corner_indices);
462
467void CustomData_ensure_data_is_mutable(CustomDataLayer *layer, int totelem);
469
474void *CustomData_get_for_write(CustomData *data, int index, eCustomDataType type, int totelem);
480 CustomData *data, eCustomDataType type, int index, int n, int totelem);
481
482/* BMesh Custom Data Functions.
483 * Should replace edit-mesh ones with these as well, due to more efficient memory alloc. */
484
485void *CustomData_bmesh_get(const CustomData *data, void *block, eCustomDataType type);
486void *CustomData_bmesh_get_n(const CustomData *data, void *block, eCustomDataType type, int n);
487
492void *CustomData_bmesh_get_layer_n(const CustomData *data, void *block, int n);
493
495 eCustomDataType type,
496 int n,
497 blender::StringRef name);
498const char *CustomData_get_layer_name(const CustomData *data, eCustomDataType type, int n);
499
504const void *CustomData_get_layer(const CustomData *data, eCustomDataType type);
506
511const void *CustomData_get_layer_n(const CustomData *data, eCustomDataType type, int n);
512void *CustomData_get_layer_n_for_write(CustomData *data, eCustomDataType type, int n, int totelem);
513
519 eCustomDataType type,
520 blender::StringRef name);
522 eCustomDataType type,
524 int totelem);
525
528 eCustomDataType type,
529 blender::StringRef name);
531
535 eCustomDataType type,
536 blender::StringRef name);
543 eCustomDataType type,
544 blender::StringRef name);
549
555
561
563
565 CustomData *data, void *block, eCustomDataType type, int n, const void *source);
566
574
582
587
588void CustomData_bmesh_set_default(CustomData *data, void **block);
589void CustomData_bmesh_free_block(CustomData *data, void **block);
590void CustomData_bmesh_alloc_block(CustomData *data, void **block);
591
596
598
617
620
625
627 eCustomDataType type,
629 char *outname);
630
636
637/* BMesh specific custom-data stuff. */
638
639void CustomData_bmesh_init_pool(CustomData *data, int totelem, char htype);
640
647bool CustomData_layer_validate(CustomDataLayer *layer, uint totitems, bool do_fixes);
648
649/* External file storage */
650
652 CustomData *data, ID *id, eCustomDataType type, int totelem, const char *filepath);
653void CustomData_external_remove(CustomData *data, ID *id, eCustomDataType type, int totelem);
655
657 CustomData *data, ID *id, eCustomDataMask mask, int totelem, int free);
658void CustomData_external_read(CustomData *data, ID *id, eCustomDataMask mask, int totelem);
659void CustomData_external_reload(CustomData *data, ID *id, eCustomDataMask mask, int totelem);
660
661/* Mesh-to-mesh transfer data. */
662
664 void *dest,
665 const void **sources,
666 const float *weights,
667 int count,
668 float mix_factor);
669
670enum {
671 ME_VERT = 1 << 0,
672 ME_EDGE = 1 << 1,
673 ME_POLY = 1 << 2,
674 ME_LOOP = 1 << 3,
675};
676
709
713void CustomData_data_transfer(const MeshPairRemap *me_remap,
714 const CustomDataTransferLayerMap *laymap);
715
716/* .blend file I/O */
717
732 int domain_size,
735
741 blender::Span<CustomDataLayer> layers_to_write,
742 int count,
743 eCustomDataMask cddata_mask,
744 ID *id);
745
747
748size_t CustomData_get_elem_size(const CustomDataLayer *layer);
749
750void CustomData_count_memory(const CustomData &data, int totelem, blender::MemoryCounter &memory);
751
752#ifndef NDEBUG
753struct DynStr;
755void CustomData_debug_info_from_layers(const CustomData *data, const char *indent, DynStr *dynstr);
756#endif /* !NDEBUG */
757
758namespace blender::bke {
759std::optional<VolumeGridType> custom_data_type_to_volume_grid_type(eCustomDataType type);
760std::optional<eCustomDataType> volume_grid_type_to_custom_data_type(VolumeGridType type);
761} // 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::bke::AttrDomain domain, int domain_size, blender::Vector< CustomDataLayer, 16 > &layers_to_write, blender::bke::AttributeStorage::BlendWriteData &write_data)
void CustomData_count_memory(const CustomData &data, int totelem, blender::MemoryCounter &memory)
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)
bool CustomData_bmesh_merge_layout(const CustomData *source, CustomData *dest, eCustomDataMask mask, eCDAllocType alloctype, BMesh *bm, char htype)
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)
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:94
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(CustomData *data, eCustomDataType type, int index)
int CustomData_get_stencil_layer(const CustomData *data, eCustomDataType type)
void(*)(void *data, int count) cd_set_default_value
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)
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(*)(const CustomDataTransferLayerMap *laymap, void *dest, const void **sources, const float *weights, int count, float mix_factor) cd_datatransfer_interp
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)
void CustomData_free(CustomData *data)
int CustomData_get_layer_index(const CustomData *data, eCustomDataType type)
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_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)
void CustomData_free_layers(CustomData *data, eCustomDataType type)
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)
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)
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_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)
@ ME_VERT
@ ME_POLY
@ ME_LOOP
@ ME_EDGE
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)
void(*)( const void **sources, const float *weights, const float *sub_weights, int count, void *dest) cd_interp
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)
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_free_layer_named(CustomData *data, blender::StringRef name)
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)
bool CustomData_free_layer_active(CustomData *data, eCustomDataType type)
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
BMesh const char void * data
BMesh * bm
unsigned long long int uint64_t
int count
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
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.cc:36
blender::Vector< Free > free
blender::Vector< TrivialCopy > trivial_copies
blender::Vector< TrivialDefault > trivial_defaults
blender::Vector< Default > defaults
blender::Vector< Copy > copies
unsigned char data[64]
CustomDataTransferLayerMap * prev
CustomDataTransferLayerMap * next
cd_datatransfer_interp interp
Definition DNA_ID.h:404
max
Definition text_draw.cc:251
uint8_t flag
Definition wm_window.cc:139