Blender V5.0
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
47#define UV_PINNED_NAME "pn"
48
55 int uv;
56 int pin;
57};
58
60#define BMUVOFFSETS_NONE {-1, -1}
61
64 unsigned char data[64];
65};
66
73
75#define ORIGINDEX_NONE -1
76
77/* Initializes a CustomData object with the same layer setup as source and
78 * memory space for totelem elements. mask must be an array of length
79 * CD_NUMTYPES elements, that indicate if a layer can be copied. */
80
91
92inline eCustomDataMask CD_TYPE_AS_MASK(eCustomDataType type)
93{
94 return eCustomDataMask(1) << eCustomDataMask(type);
95}
96
98
99using cd_interp = void (*)(const void **sources, const float *weights, int count, void *dest);
100using cd_copy = void (*)(const void *source, void *dest, int count);
101using cd_set_default_value = void (*)(void *data, int count);
102using cd_free = void (*)(void *data, int count);
103using cd_validate = bool (*)(void *item, uint totitems, bool do_fixes);
104
109 const CustomData_MeshMasks *mask_src);
114 const CustomData_MeshMasks *mask_required);
115
120bool CustomData_layer_has_math(const CustomData *data, int layer_n);
121bool CustomData_layer_has_interp(const CustomData *data, int layer_n);
122
132
138void CustomData_data_copy_value(eCustomDataType type, const void *source, void *dest);
140
146 eCustomDataType type, const void *source, void *dest, int mixmode, float mixfactor);
147
153bool CustomData_data_equals(eCustomDataType type, const void *data1, const void *data2);
154void CustomData_data_initminmax(eCustomDataType type, void *min, void *max);
155void CustomData_data_dominmax(eCustomDataType type, const void *data, void *min, void *max);
156void CustomData_data_multiply(eCustomDataType type, void *data, float fac);
157void CustomData_data_add(eCustomDataType type, void *data1, const void *data2);
158
167void CustomData_init_from(const CustomData *source,
168 CustomData *dest,
169 eCustomDataMask mask,
170 int totelem);
178void CustomData_init_layout_from(const CustomData *source,
179 CustomData *dest,
180 eCustomDataMask mask,
181 eCDAllocType alloctype,
182 int totelem);
183
188
192bool CustomData_merge(const CustomData *source,
193 CustomData *dest,
194 eCustomDataMask mask,
195 int totelem);
200bool CustomData_merge_layout(const CustomData *source,
201 CustomData *dest,
202 eCustomDataMask mask,
203 eCDAllocType alloctype,
204 int totelem);
205
212 int old_size,
213 int new_size,
214 eCDAllocType alloctype = CD_CONSTRUCT);
215
222 CustomData *dest,
223 eCustomDataMask mask,
224 eCDAllocType alloctype,
225 BMesh *bm,
226 char htype);
227
234 eCustomDataMask mask);
235
242
247
254 eCustomDataType type,
255 eCDAllocType alloctype,
256 int totelem);
257
263 eCustomDataType type,
264 void *layer_data,
265 int totelem,
266 const blender::ImplicitSharingInfo *sharing_info);
267
272 eCustomDataType type,
273 eCDAllocType alloctype,
274 int totelem,
276
278 eCustomDataType type,
279 void *layer_data,
280 int totelem,
282 const blender::ImplicitSharingInfo *sharing_info);
283
292
300
305
311 eCustomDataType type,
313
319int CustomData_number_of_layers_typemask(const CustomData *data, eCustomDataMask mask);
320
325void CustomData_set_only_copy(const CustomData *data, eCustomDataMask mask);
326
340 const CustomData *source, CustomData *dest, int source_index, int dest_index, int count);
341void CustomData_copy_data_layer(const CustomData *source,
342 CustomData *dest,
343 int src_layer_index,
344 int dst_layer_index,
345 int src_index,
346 int dst_index,
347 int count);
349 const void *src_data,
350 void *dst_data,
351 int count);
352
357void CustomData_bmesh_copy_block(CustomData &data, void *src_block, void **dst_block);
358
389
392 const CustomData &dst,
393 eCustomDataMask mask_exclude = 0);
394
400 const BMCustomDataCopyMap &map,
401 const void *src_block,
402 void **dst_block);
403
408 CustomData *destination,
409 eCustomDataType type,
410 int source_index,
411 int destination_index,
412 int count);
413
418void CustomData_free_elem(CustomData *data, int index, int count);
419
430void CustomData_interp(const CustomData *source,
431 CustomData *dest,
432 const int *src_indices,
433 const float *weights,
434 int count,
435 int dest_index);
441 const void **src_blocks,
442 const float *weights,
443 int count,
444 void *dst_block_ofs,
445 int n);
447 CustomData *data, const void **src_blocks, const float *weights, int count, void *dst_block);
448
456void CustomData_swap_corners(CustomData *data, int index, const int *corner_indices);
457
462void CustomData_ensure_data_is_mutable(CustomDataLayer *layer, int totelem);
464
469void *CustomData_get_for_write(CustomData *data, int index, eCustomDataType type, int totelem);
475 CustomData *data, eCustomDataType type, int index, int n, int totelem);
476
477/* BMesh Custom Data Functions.
478 * Should replace edit-mesh ones with these as well, due to more efficient memory alloc. */
479
480void *CustomData_bmesh_get(const CustomData *data, void *block, eCustomDataType type);
481void *CustomData_bmesh_get_n(const CustomData *data, void *block, eCustomDataType type, int n);
482
487void *CustomData_bmesh_get_layer_n(const CustomData *data, void *block, int n);
488
490 eCustomDataType type,
491 int n,
493const char *CustomData_get_layer_name(const CustomData *data, eCustomDataType type, int n);
494
499const void *CustomData_get_layer(const CustomData *data, eCustomDataType type);
501
506const void *CustomData_get_layer_n(const CustomData *data, eCustomDataType type, int n);
507void *CustomData_get_layer_n_for_write(CustomData *data, eCustomDataType type, int n, int totelem);
508
514 eCustomDataType type,
517 eCustomDataType type,
519 int totelem);
520
523 eCustomDataType type,
526
530 eCustomDataType type,
538 eCustomDataType type,
544
550
556
558
560 CustomData *data, void *block, eCustomDataType type, int n, const void *source);
561
569
577
582
583void CustomData_bmesh_set_default(CustomData *data, void **block);
584void CustomData_bmesh_free_block(CustomData *data, void **block);
585void CustomData_bmesh_alloc_block(CustomData *data, void **block);
586
591
593
612
615
620
622 eCustomDataType type,
624 char *outname);
625
631
632/* BMesh specific custom-data stuff. */
633
634void CustomData_bmesh_init_pool(CustomData *data, int totelem, char htype);
635
642bool CustomData_layer_validate(CustomDataLayer *layer, uint totitems, bool do_fixes);
643
644/* External file storage */
645
647 CustomData *data, ID *id, eCustomDataType type, int totelem, const char *filepath);
648void CustomData_external_remove(CustomData *data, ID *id, eCustomDataType type, int totelem);
650
652 CustomData *data, ID *id, eCustomDataMask mask, int totelem, int free);
653void CustomData_external_read(CustomData *data, ID *id, eCustomDataMask mask, int totelem);
654void CustomData_external_reload(CustomData *data, ID *id, eCustomDataMask mask, int totelem);
655
656/* Mesh-to-mesh transfer data. */
657
659 void *dest,
660 const void **sources,
661 const float *weights,
662 int count,
663 float mix_factor);
664
665enum {
666 ME_VERT = 1 << 0,
667 ME_EDGE = 1 << 1,
668 ME_POLY = 1 << 2,
669 ME_LOOP = 1 << 3,
670};
671
704
708void CustomData_data_transfer(const MeshPairRemap *me_remap,
709 const CustomDataTransferLayerMap *laymap);
710
711/* .blend file I/O */
712
727 int domain_size,
730
736 blender::Span<CustomDataLayer> layers_to_write,
737 int count,
738 eCustomDataMask cddata_mask,
739 ID *id);
740
742
743size_t CustomData_get_elem_size(const CustomDataLayer *layer);
744
745void CustomData_count_memory(const CustomData &data, int totelem, blender::MemoryCounter &memory);
746
747#ifndef NDEBUG
748struct DynStr;
750void CustomData_debug_info_from_layers(const CustomData *data, const char *indent, DynStr *dynstr);
751#endif /* !NDEBUG */
752
753namespace blender::bke {
754std::optional<VolumeGridType> custom_data_type_to_volume_grid_type(eCustomDataType type);
755std::optional<eCustomDataType> volume_grid_type_to_custom_data_type(VolumeGridType type);
756} // 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(*)(const void **sources, const float *weights, int count, void *dest) cd_interp
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)
@ ME_VERT
@ ME_POLY
@ ME_LOOP
@ ME_EDGE
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)
eCustomDataMask CD_TYPE_AS_MASK(eCustomDataType type)
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:96
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
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_copy_elements(eCustomDataType type, const void *src_data, void *dst_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)
void CustomData_bmesh_interp_n(CustomData *data, const void **src_blocks, const float *weights, int count, void *dst_block_ofs, int n)
int CustomData_layertype_layers_max(eCustomDataType type)
void CustomData_data_dominmax(eCustomDataType type, const void *data, void *min, void *max)
void CustomData_interp(const CustomData *source, CustomData *dest, const int *src_indices, const float *weights, int count, int dest_index)
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)
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 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)
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_bmesh_interp(CustomData *data, const void **src_blocks, const float *weights, int count, void *dst_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)
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)
const char * name
#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:414
max
Definition text_draw.cc:251
uint8_t flag
Definition wm_window.cc:145