30#include <fmt/format.h>
35# include <openvdb/io/Stream.h>
36# include <openvdb/openvdb.h>
43using namespace io::serialize;
48 auto io_slice = std::make_shared<DictionaryValue>();
49 io_slice->append_str(
"name", this->
name);
50 io_slice->append_int(
"start",
range.start());
51 io_slice->append_int(
"size",
range.size());
57 const std::optional<StringRefNull>
name = io_slice.
lookup_str(
"name");
58 const std::optional<int64_t> start = io_slice.
lookup_int(
"start");
70 std::ostringstream stream{std::ios::binary};
72 std::string
data = stream.rdbuf()->str();
73 return this->
write(data.data(),
data.size());
81 if (!this->
read(slice, buffer.data())) {
84 std::istringstream stream{buffer, std::ios::binary};
100 BLI_path_join(blob_path,
sizeof(blob_path), blobs_dir_.c_str(), slice.
name.c_str());
102 std::lock_guard
lock{mutex_};
103 std::unique_ptr<fstream> &blob_file = open_input_streams_.lookup_or_add_cb_as(blob_path, [&]() {
104 return std::make_unique<fstream>(blob_path, std::ios::in | std::ios::binary);
107 blob_file->read(
static_cast<char *
>(r_data), slice.
range.
size());
108 if (blob_file->gcount() != slice.
range.
size()) {
115 : blob_dir_(std::move(blob_dir)), base_name_(std::move(base_name))
117 blob_name_ = base_name_ +
".blob";
122 if (!blob_stream_.is_open()) {
124 BLI_path_join(blob_path,
sizeof(blob_path), blob_dir_.c_str(), blob_name_.c_str());
126 blob_stream_.open(blob_path, std::ios::out | std::ios::binary);
129 const int64_t old_offset = current_offset_;
130 blob_stream_.write(
static_cast<const char *
>(
data),
size);
131 current_offset_ +=
size;
133 return {blob_name_, {old_offset,
size}};
137 const int file_index,
140 return fmt::format(
"{}_file_{}{}", base_name, file_index, extension);
147 independent_file_count_++;
149 base_name_, independent_file_count_, file_extension);
152 BLI_path_join(path,
sizeof(path), blob_dir_.c_str(), file_name.c_str());
154 std::fstream stream{path, std::ios::out | std::ios::binary};
156 const int64_t written_bytes_num = stream.tellg();
158 return {file_name, {0, written_bytes_num}};
163 blob_by_name_.add(name, blob);
176 memcpy(r_data, copy_src, slice.
range.
size());
182 blob_name_ = base_name_ +
".blob";
183 stream_by_name_.add(blob_name_, {std::make_unique<std::ostringstream>(std::ios::binary)});
188 OutputStream &stream = stream_by_name_.lookup(blob_name_);
200 independent_file_count_++;
202 base_name_, independent_file_count_, file_extension);
203 OutputStream stream{std::make_unique<std::ostringstream>(std::ios::binary)};
206 stream_by_name_.add_new(name, std::move(stream));
214 sharing_info->remove_weak_user_and_delete_if_last();
221 if (value.sharing_info) {
222 value.sharing_info->remove_user_and_delete_if_last();
230 if (sharing_info ==
nullptr) {
233 return stored_by_runtime_.add_or_modify(
236 [&](StoredByRuntimeValue *value) {
237 new (value) StoredByRuntimeValue();
238 value->io_data = write_fn();
239 value->sharing_info_version = sharing_info->
version();
241 return value->io_data;
244 [&](StoredByRuntimeValue *value) {
246 BLI_assert(value->sharing_info_version <= new_version);
247 if (value->sharing_info_version < new_version) {
248 value->io_data = write_fn();
249 value->sharing_info_version = new_version;
251 return value->io_data;
258 const uint64_t content_hash = XXH3_64bits(
data, size_in_bytes);
259 const BlobSlice slice = slice_by_content_hash_.lookup_or_add_cb(
260 content_hash, [&]() {
return writer.
write(
data, size_in_bytes); });
266 FunctionRef<std::optional<ImplicitSharingInfoAndData>()> read_fn)
const
268 std::lock_guard
lock{mutex_};
271 std::stringstream ss;
273 const std::string key = ss.str();
276 shared_data->sharing_info->add_user();
279 std::optional<ImplicitSharingInfoAndData>
data = read_fn();
283 if (
data->sharing_info !=
nullptr) {
284 data->sharing_info->add_user();
285 runtime_by_stored_.add_new(key, *
data);
301 const char *io_name =
"unknown";
308 const char *io_name =
"unknown";
360 if (slice->range.size() != element_size * elements_num) {
363 if (!blob_reader.
read(*slice, r_data)) {
368 const bool need_endian_switch = stored_endian != current_endian;
369 if (need_endian_switch) {
370 switch (element_size) {
408 if (slice->range.size() != bytes_num) {
411 return blob_reader.
read(*slice, r_data);
424 blob_writer, blob_sharing,
data.data(),
data.size_in_bytes());
438 blob_reader, io_data, type.
size, r_data.
size(), r_data.
data());
442 blob_reader, io_data,
sizeof(
int32_t), r_data.
size() * 2, r_data.
data());
446 blob_reader, io_data,
sizeof(
short), r_data.
size() * 2, r_data.
data());
450 blob_reader, io_data,
sizeof(
float), r_data.
size() * 3, r_data.
data());
454 blob_reader, io_data,
sizeof(
float), r_data.
size() * 16, r_data.
data());
458 blob_reader, io_data,
sizeof(
float), r_data.
size() * 4, r_data.
data());
462 blob_reader, io_data,
sizeof(
float), r_data.
size() * 4, r_data.
data());
485 const char *func = __func__;
486 const std::optional<ImplicitSharingInfoAndData> sharing_info_and_data = blob_sharing.
read_shared(
487 io_data, [&]() -> std::optional<ImplicitSharingInfoAndData> {
495 if (!sharing_info_and_data) {
496 *r_sharing_info =
nullptr;
499 *r_sharing_info = sharing_info_and_data->sharing_info;
500 return sharing_info_and_data->data;
513 return *r_data !=
nullptr;
517 std::unique_ptr<BakeMaterialsList> &materials)
519 if (io_materials.
elements().is_empty()) {
522 materials = std::make_unique<BakeMaterialsList>();
523 for (
const auto &io_material_value : io_materials.
elements()) {
525 materials->append(std::nullopt);
528 const auto *io_material = io_material_value->as_dictionary_value();
532 std::optional<std::string>
id_name = io_material->lookup_str(
"name");
536 std::string lib_name = io_material->lookup_str(
"lib_name").value_or(
"");
547 for (
const auto &io_attribute_value : io_attributes.
elements()) {
548 const auto *io_attribute = io_attribute_value->as_dictionary_value();
552 const std::optional<StringRefNull> name = io_attribute->lookup_str(
"name");
553 const std::optional<StringRefNull> domain_str = io_attribute->lookup_str(
"domain");
554 const std::optional<StringRefNull> type_str = io_attribute->lookup_str(
"type");
555 const auto *io_data = io_attribute->
lookup_dict(
"data");
556 if (!name || !domain_str || !type_str || !io_data) {
562 if (!domain || !data_type) {
569 const int domain_size = attributes.
domain_size(*domain);
572 *io_data, blob_reader, blob_sharing, *cpp_type, domain_size, &attribute_sharing_info);
573 if (!attribute_data) {
581 *name, *domain, *data_type);
590 if (!attributes.
add(*name,
607 if (!io_pointcloud) {
611 if (!io_attributes) {
614 const int points_num = io_pointcloud->
lookup_int(
"num_points").value_or(0);
617 auto cancel = [&]() {
623 if (!
load_attributes(*io_attributes, attributes, blob_reader, blob_sharing)) {
640 if (!io_attributes) {
649 if (
curves.curves_num() > 0) {
650 const auto *io_curve_offsets = io_curves.
lookup_dict(
"curve_offsets");
651 if (!io_curve_offsets) {
659 &
curves.runtime->curve_offsets_sharing_info))
666 if (!
load_attributes(*io_attributes, attributes, blob_reader, blob_sharing)) {
676 curves.update_curve_types();
690 if (!io_attributes) {
695 *io_curves, blob_reader, blob_sharing);
703 auto cancel = [&]() {
722 if (!io_grease_pencil) {
733 if (!io_layer_attributes) {
738 auto cancel = [&]() {
743 const int layers_num = io_layers->
elements().size();
744 grease_pencil->add_layers_with_empty_drawings_for_eval(layers_num);
746 for (
const int layer_i : io_layers->
elements().index_range()) {
747 const auto &io_layer_value = io_layers->
elements()[layer_i];
756 const std::optional<std::string> layer_name = io_layer->
lookup_str(
"name");
761 layer.set_name(*layer_name);
763 *io_strokes, blob_reader, blob_sharing);
772 if (!
load_attributes(*io_layer_attributes, attributes, blob_reader, blob_sharing)) {
778 if (!io_layer_opacities ||
787 *io_layer_blend_modes,
796 *io_layer_transforms,
802 for (
const int layer_i :
IndexRange(layers_num)) {
804 layer.
opacity = layer_opacities[layer_i];
805 layer.
blend_mode = layer_blend_modes[layer_i];
816 return grease_pencil;
829 if (!io_attributes) {
838 mesh->verts_num = io_mesh->
lookup_int(
"num_vertices").value_or(0);
840 mesh->faces_num = io_mesh->
lookup_int(
"num_polygons").value_or(0);
841 mesh->corners_num = io_mesh->
lookup_int(
"num_corners").value_or(0);
843 auto cancel = [&]() {
848 if (
mesh->faces_num > 0) {
849 const auto *io_poly_offsets = io_mesh->
lookup_dict(
"poly_offsets");
850 if (!io_poly_offsets) {
857 &
mesh->face_offset_indices,
858 &
mesh->runtime->face_offsets_sharing_info))
866 if (
const auto *io_attributes = io_mesh->
lookup_array(
"vertex_group_names")) {
867 for (
const std::shared_ptr<Value> &value : io_attributes->
elements()) {
872 STRNCPY(defgroup->
name, value->as_string_value()->value().c_str());
878 if (!
load_attributes(*io_attributes, attributes, blob_reader, blob_sharing)) {
892 const BlobReader &blob_reader,
893 const BlobReadSharing &blob_sharing);
903 const int num_instances = io_instances->
lookup_int(
"num_instances").value_or(0);
904 if (num_instances == 0) {
908 if (!io_attributes) {
912 if (!io_references) {
916 std::unique_ptr<Instances> instances = std::make_unique<Instances>();
917 instances->resize(num_instances);
919 for (
const auto &io_reference_value : io_references->
elements()) {
923 reference_geometry =
load_geometry(*io_reference, blob_reader, blob_sharing);
925 instances->add_new_reference(std::move(reference_geometry));
929 if (!
load_attributes(*io_attributes, attributes, blob_reader, blob_sharing)) {
933 if (!attributes.
contains(
".reference_index")) {
936 const auto *io_handles = io_instances->
lookup_dict(
"handles");
941 blob_reader, *io_handles, instances->reference_handles_for_write()))
947 if (!attributes.
contains(
"instance_transform")) {
950 const auto *io_handles = io_instances->
lookup_dict(
"transforms");
963static Volume *try_load_volume(
const DictionaryValue &io_geometry,
const BlobReader &blob_reader)
965 const DictionaryValue *io_volume = io_geometry.lookup_dict(
"volume");
969 const auto *io_vdb = io_volume->lookup_dict(
"vdb");
973 openvdb::GridPtrVecPtr vdb_grids;
975 if (!blob_reader.read_as_stream(*vdb_slice, [&](std::istream &stream) {
977 openvdb::io::Stream vdb_stream{stream};
978 vdb_grids = vdb_stream.getGrids();
990 auto cancel = [&]() {
995 for (openvdb::GridBase::Ptr &vdb_grid : *vdb_grids) {
997 bke::GVolumeGrid grid{std::move(vdb_grid)};
1001 if (
const io::serialize::ArrayValue *io_materials = io_volume->lookup_array(
"materials")) {
1021 geometry.replace_volume(try_load_volume(io_geometry, blob_reader));
1027 const std::unique_ptr<BakeMaterialsList> &materials)
1029 auto io_materials = std::make_shared<io::serialize::ArrayValue>();
1031 return io_materials;
1033 for (
const std::optional<BakeDataBlockID> &material : *materials) {
1035 auto io_material = io_materials->append_dict();
1036 io_material->append_str(
"name", material->id_name);
1037 if (!material->lib_name.empty()) {
1038 io_material->append_str(
"lib_name", material->lib_name);
1042 io_materials->append_null();
1045 return io_materials;
1054 auto io_attributes = std::make_shared<io::serialize::ArrayValue>();
1061 auto io_attribute = io_attributes->append_dict();
1063 io_attribute->append_str(
"name", iter.
name);
1066 io_attribute->append_str(
"domain", domain_name);
1069 io_attribute->append_str(
"type", type_name);
1073 io_attribute->append(
"data",
1080 return io_attributes;
1091 if (
curves.curve_num > 0) {
1092 io_curves.
append(
"curve_offsets",
1096 curves.runtime->curve_offsets_sharing_info));
1100 io_curves.
append(
"attributes", io_attributes);
1107 auto io_geometry = std::make_shared<DictionaryValue>();
1110 auto io_mesh = io_geometry->append_dict(
"mesh");
1112 io_mesh->append_int(
"num_vertices",
mesh.verts_num);
1113 io_mesh->append_int(
"num_edges",
mesh.edges_num);
1114 io_mesh->append_int(
"num_polygons",
mesh.faces_num);
1115 io_mesh->append_int(
"num_corners",
mesh.corners_num);
1117 if (
mesh.faces_num > 0) {
1118 io_mesh->append(
"poly_offsets",
1121 mesh.face_offsets(),
1122 mesh.runtime->face_offsets_sharing_info));
1126 io_mesh->append(
"materials", io_materials);
1129 auto io_vertex_group_names = io_mesh->append_array(
"vertex_group_names");
1131 io_vertex_group_names->append_str(defgroup->name);
1136 io_mesh->append(
"attributes", io_attributes);
1140 auto io_pointcloud = io_geometry->append_dict(
"pointcloud");
1142 io_pointcloud->append_int(
"num_points", pointcloud.
totpoint);
1145 io_pointcloud->append(
"materials", io_materials);
1148 pointcloud.
attributes(), blob_writer, blob_sharing, {});
1149 io_pointcloud->append(
"attributes", io_attributes);
1155 auto io_curves = io_geometry->append_dict(
"curves");
1160 io_curves->append(
"materials", io_materials);
1162 if (
geometry.has_grease_pencil()) {
1164 auto io_grease_pencil = io_geometry->append_dict(
"grease_pencil");
1165 auto io_layers = io_grease_pencil->append_array(
"layers");
1171 auto io_layer = io_layers->append_dict();
1172 io_layer->append_str(
"name", layer->name());
1173 auto io_strokes = io_layer->append_dict(
"strokes");
1182 layer_opacities.
append(layer->opacity);
1183 layer_blend_modes.
append(layer->blend_mode);
1184 layer_transforms.
append(layer->local_transform());
1187 io_grease_pencil->
append(
1190 io_grease_pencil->append(
1193 io_grease_pencil->append(
1198 grease_pencil.attributes(), blob_writer, blob_sharing, {});
1199 io_grease_pencil->append(
"layer_attributes", io_layer_attributes);
1202 io_grease_pencil->append(
"materials", io_materials);
1209 auto io_volume = io_geometry->append_dict(
"volume");
1210 auto io_vdb = blob_writer
1212 [&](std::ostream &stream) {
1213 openvdb::GridCPtrVec vdb_grids;
1219 vdb_grids.push_back(grid->grid_ptr(tree_tokens.
last()));
1222 openvdb::io::Stream vdb_stream(stream);
1223 vdb_stream.write(vdb_grids);
1226 io_volume->append(
"vdb", std::move(io_vdb));
1229 io_volume->append(
"materials", io_materials);
1234 auto io_instances = io_geometry->append_dict(
"instances");
1236 io_instances->append_int(
"num_instances", instances.
instances_num());
1238 auto io_references = io_instances->append_array(
"references");
1251 instances.
attributes(), blob_writer, blob_sharing, {});
1252 io_instances->append(
"attributes", io_attributes);
1259 auto io_value = std::make_shared<io::serialize::ArrayValue>();
1260 for (
const float value : values) {
1261 io_value->append_double(value);
1268 auto io_value = std::make_shared<io::serialize::ArrayValue>();
1269 for (
const int value : values) {
1270 io_value->append_int(value);
1278 switch (data_type) {
1280 const float value = *
static_cast<const float *
>(value_ptr);
1281 return std::make_shared<io::serialize::DoubleValue>(value);
1284 const float2 value = *
static_cast<const float2 *
>(value_ptr);
1288 const float3 value = *
static_cast<const float3 *
>(value_ptr);
1292 const bool value = *
static_cast<const bool *
>(value_ptr);
1293 return std::make_shared<io::serialize::BooleanValue>(value);
1296 const int value = *
static_cast<const int *
>(value_ptr);
1297 return std::make_shared<io::serialize::IntValue>(value);
1300 const int2 value =
int2(*
static_cast<const short2 *
>(value_ptr));
1304 const int2 value = *
static_cast<const int2 *
>(value_ptr);
1309 const int4 value_int{&value.
r};
1346 std::optional<T>
element =
fn(io_element);
1359 return std::nullopt;
1362 if (value < std::numeric_limits<T>::lowest()) {
1363 return std::nullopt;
1365 if (value > std::numeric_limits<T>::max()) {
1366 return std::nullopt;
1374 return io_double->value();
1377 return io_int->value();
1379 return std::nullopt;
1392 static_assert(std::is_integral_v<T>);
1406 *
static_cast<float *
>(r_value) = *value;
1417 *
static_cast<bool *
>(r_value) = io_value_boolean->value();
1427 *
static_cast<int *
>(r_value) = *value;
1459 if (!item.
name.empty()) {
1462 if (
const auto *geometry_state_item =
dynamic_cast<const GeometryBakeItem *
>(&item)) {
1467 r_io_item.
append(
"data", io_geometry);
1469 else if (
const auto *attribute_state_item =
dynamic_cast<const AttributeBakeItem *
>(&item)) {
1471 r_io_item.
append_str(
"name", attribute_state_item->name());
1474 else if (
const auto *grid_state_item =
dynamic_cast<const VolumeGridBakeItem *
>(&item)) {
1476 const GVolumeGrid &grid = *grid_state_item->grid;
1477 auto io_vdb = blob_writer
1479 [&](std::ostream &stream) {
1480 openvdb::GridCPtrVec vdb_grids;
1481 bke::VolumeTreeAccessToken tree_token;
1482 vdb_grids.push_back(grid->grid_ptr(tree_token));
1483 openvdb::io::Stream vdb_stream(stream);
1484 vdb_stream.write(vdb_grids);
1487 r_io_item.
append(
"vdb", std::move(io_vdb));
1490 else if (
const auto *string_state_item =
dynamic_cast<const StringBakeItem *
>(&item)) {
1494 const int64_t blob_threshold = 100;
1495 if (
str.size() < blob_threshold) {
1496 r_io_item.
append_str(
"data", string_state_item->value());
1503 else if (
const auto *primitive_state_item =
dynamic_cast<const PrimitiveBakeItem *
>(&item)) {
1507 r_io_item.
append(
"data", std::move(io_data));
1509 else if (
const auto *bundle_state_item =
dynamic_cast<const BundleBakeItem *
>(&item)) {
1530 const std::optional<StringRefNull> state_item_type = io_item.
lookup_str(
"type");
1531 if (!state_item_type) {
1534 if (*state_item_type ==
StringRef(
"GEOMETRY")) {
1540 return std::make_unique<GeometryBakeItem>(std::move(
geometry));
1542 if (*state_item_type ==
StringRef(
"ATTRIBUTE")) {
1544 if (!io_attribute) {
1547 std::optional<StringRefNull> name = io_attribute->
lookup_str(
"name");
1551 return std::make_unique<AttributeBakeItem>(std::move(*name));
1554 if (*state_item_type ==
StringRef(
"GRID")) {
1564 openvdb::GridPtrVecPtr vdb_grids;
1565 if (!blob_reader.
read_as_stream(*vdb_slice, [&](std::istream &stream) {
1567 openvdb::io::Stream vdb_stream{stream};
1568 vdb_grids = vdb_stream.getGrids();
1578 if (vdb_grids->size() != 1) {
1581 std::shared_ptr<openvdb::GridBase> vdb_grid = std::move((*vdb_grids)[0]);
1582 GVolumeGrid grid{std::move(vdb_grid)};
1583 return std::make_unique<VolumeGridBakeItem>(std::make_unique<GVolumeGrid>(grid));
1586 if (*state_item_type ==
StringRef(
"STRING")) {
1587 const std::shared_ptr<io::serialize::Value> *io_data = io_item.
lookup(
"data");
1592 const io::serialize::StringValue &io_string = *io_data->get()->as_string_value();
1593 return std::make_unique<StringBakeItem>(io_string.value());
1595 if (
const io::serialize::DictionaryValue *io_string = io_data->get()->as_dictionary_value()) {
1596 const std::optional<int64_t>
size = io_string->lookup_int(
"size");
1605 return std::make_unique<StringBakeItem>(std::move(
str));
1608 if (*state_item_type == StringRef(
"BUNDLE")) {
1609 const ArrayValue *io_items = io_item.lookup_array(
"items");
1613 auto bundle = std::make_unique<BundleBakeItem>();
1614 for (
const auto &io_item_ : io_items->elements()) {
1615 const DictionaryValue *io_item = io_item_->as_dictionary_value();
1619 const ArrayValue *io_key = io_item->lookup_array(
"key");
1624 for (
const auto &io_key_value : io_key->elements()) {
1625 const StringValue *io_key_string = io_key_value->as_string_value();
1626 if (!io_key_string) {
1629 key.
append(io_key_string->value());
1631 const std::optional<StringRefNull> socket_idname = io_item->lookup_str(
"socket_idname");
1632 if (!socket_idname) {
1635 const DictionaryValue *io_item_value = io_item->lookup_dict(
"value");
1637 *io_item_value, blob_reader, blob_sharing);
1641 bundle->items.append(BundleBakeItem::Item{
1642 nodes::SocketInterfaceKey{std::move(key)}, *socket_idname, std::move(value)});
1646 const std::shared_ptr<io::serialize::Value> *io_data = io_item.lookup(
"data");
1658 return std::make_unique<PrimitiveBakeItem>(cpp_type, buffer);
1668 std::ostream &r_stream)
1673 for (
auto item : bake_state.
items_by_id.items()) {
1687 std::unique_ptr<io::serialize::Value> io_root_value;
1692 return std::nullopt;
1694 if (!io_root_value) {
1695 return std::nullopt;
1699 return std::nullopt;
1701 const std::optional<int> version = io_root->
lookup_int(
"version");
1703 return std::nullopt;
1707 return std::nullopt;
1710 for (
const auto &io_item_value : io_items->
elements()) {
1713 return std::nullopt;
1717 id = std::stoi(io_item_value.first);
1720 return std::nullopt;
1723 return std::nullopt;
1726 *io_item, blob_reader, blob_sharing);
1728 return std::nullopt;
1730 bake_state.
items_by_id.add_new(
id, std::move(bake_item));
Low-level operations for curves.
CustomData interface, see also DNA_customdata_types.h.
bool CustomData_free_layer_named(CustomData *data, blender::StringRef name)
Low-level operations for grease pencil.
GreasePencil * BKE_grease_pencil_new_nomain()
void BKE_id_free(Main *bmain, void *idv)
void * BKE_id_new_nomain(short type, const char *name)
Mesh * BKE_mesh_new_nomain(int verts_num, int edges_num, int faces_num, int corners_num)
General operations for point clouds.
void BKE_volume_grid_add(Volume *volume, const blender::bke::VolumeGridData &grid)
int BKE_volume_num_grids(const Volume *volume)
const blender::bke::VolumeGridData * BKE_volume_grid_get(const Volume *volume, int grid_index)
#define BLI_assert_unreachable()
#define BUFFER_FOR_CPP_TYPE_VALUE(type, variable_name)
void BLI_endian_switch_uint16_array(unsigned short *val, int size) ATTR_NONNULL(1)
void BLI_endian_switch_uint64_array(uint64_t *val, int size) ATTR_NONNULL(1)
void BLI_endian_switch_uint32_array(unsigned int *val, int size) ATTR_NONNULL(1)
bool BLI_file_ensure_parent_dir_exists(const char *filepath) ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define BLI_SCOPED_DEFER(function_to_defer)
#define BLI_path_join(...)
char * STRNCPY(char(&dst)[N], const char *src)
struct CurvesGeometry CurvesGeometry
Object is a sort of wrapper for general info.
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const void * element
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
virtual bool serialize(void *o_alignedDataBuffer, unsigned i_dataBufferSize, bool i_swapEndian) const
Data buffer MUST be 16 byte aligned.
void destruct(void *ptr) const
void append(const T &value)
MutableSpan< T > as_mutable_span()
static const CPPType & get()
void copy_assign_n(const void *src, void *dst, int64_t n) const
int64_t size_in_bytes() const
const CPPType & type() const
void add_weak_user() const
void remove_user_and_delete_if_last() const
constexpr int64_t size() const
constexpr bool is_empty() const
static constexpr IndexRange from_begin_size(const int64_t begin, const int64_t size)
constexpr int64_t start() const
constexpr bool contains(int64_t value) const
constexpr int64_t size() const
constexpr IndexRange index_range() const
bool contains_as(const ForwardKey &key) const
constexpr Span slice(int64_t start, int64_t size) const
constexpr const T * data() const
constexpr IndexRange index_range() const
constexpr bool startswith(StringRef prefix) const
constexpr const char * c_str() const
void append(const T &value)
const T & last(const int64_t n=0) const
Span< T > as_span() const
void append_as(ForwardValue &&...value)
void foreach_attribute(const FunctionRef< void(const AttributeIter &)> fn) const
bool contains(StringRef attribute_id) const
int domain_size(const AttrDomain domain) const
eCustomDataType data_type
GAttributeReader get() const
Span< InstanceReference > references() const
bke::AttributeAccessor attributes() const
int instances_num() const
bool add(const StringRef attribute_id, const AttrDomain domain, const eCustomDataType data_type, const AttributeInit &initializer)
GSpanAttributeWriter lookup_or_add_for_write_only_span(StringRef attribute_id, AttrDomain domain, eCustomDataType data_type)
std::optional< ImplicitSharingInfoAndData > read_shared(const io::serialize::DictionaryValue &io_data, FunctionRef< std::optional< ImplicitSharingInfoAndData >()> read_fn) const
virtual bool read_as_stream(const BlobSlice &slice, FunctionRef< bool(std::istream &)> fn) const
virtual bool read(const BlobSlice &slice, void *r_data) const =0
std::shared_ptr< io::serialize::DictionaryValue > write_implicitly_shared(const ImplicitSharingInfo *sharing_info, FunctionRef< std::shared_ptr< io::serialize::DictionaryValue >()> write_fn)
std::shared_ptr< io::serialize::DictionaryValue > write_deduplicated(BlobWriter &writer, const void *data, int64_t size_in_bytes)
virtual BlobSlice write(const void *data, int64_t size)=0
virtual BlobSlice write_as_stream(StringRef file_extension, FunctionRef< void(std::ostream &)> fn)
int64_t total_written_size_
bool read(const BlobSlice &slice, void *r_data) const override
DiskBlobReader(std::string blobs_dir)
DiskBlobWriter(std::string blob_dir, std::string base_name)
BlobSlice write_as_stream(StringRef file_extension, FunctionRef< void(std::ostream &)> fn) override
BlobSlice write(const void *data, int64_t size) override
void add(StringRef name, Span< std::byte > blob)
bool read(const BlobSlice &slice, void *r_data) const override
MemoryBlobWriter(std::string base_name)
BlobSlice write(const void *data, int64_t size) override
BlobSlice write_as_stream(StringRef file_extension, FunctionRef< void(std::ostream &)> fn) override
bke::CurvesGeometry & strokes_for_write()
const bke::CurvesGeometry & strokes() const
void set_local_transform(const float4x4 &transform)
Span< std::shared_ptr< Value > > elements() const
void append_str(std::string value)
std::shared_ptr< DictionaryValue > append_dict()
const std::shared_ptr< Value > * lookup(StringRef key) const
void append(std::string key, std::shared_ptr< Value > value)
std::optional< StringRefNull > lookup_str(StringRef key) const
void append_str(std::string key, std::string value)
std::shared_ptr< DictionaryValue > append_dict(std::string key)
std::optional< int64_t > lookup_int(StringRef key) const
Span< Item > elements() const
void append_int(std::string key, int64_t value)
std::shared_ptr< ArrayValue > append_array(std::string key)
const DictionaryValue * lookup_dict(StringRef key) const
const ArrayValue * lookup_array(StringRef key) const
const BooleanValue * as_boolean_value() const
const ArrayValue * as_array_value() const
const IntValue * as_int_value() const
const DoubleValue * as_double_value() const
const DictionaryValue * as_dictionary_value() const
Span< std::string > identifiers() const
std::string id_name(void *id)
void * MEM_mallocN_aligned(size_t len, size_t alignment, const char *str)
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
static bool deserialize_typed_array(const io::serialize::Value &io_value, FunctionRef< std::optional< T >(const io::serialize::Value &io_element)> fn, MutableSpan< T > r_values)
static StringRefNull get_domain_io_name(const AttrDomain domain)
static constexpr int bake_file_version
static bool read_blob_shared_simple_span(const DictionaryValue &io_data, const BlobReader &blob_reader, const BlobReadSharing &blob_sharing, const int size, T **r_data, const ImplicitSharingInfo **r_sharing_info)
static std::optional< AttrDomain > get_domain_from_io_name(const StringRefNull io_name)
static std::optional< eCustomDataType > get_data_type_from_io_name(const StringRefNull io_name)
static bool deserialize_int_array(const io::serialize::Value &io_value, MutableSpan< T > r_values)
static bool read_blob_simple_gspan(const BlobReader &blob_reader, const DictionaryValue &io_data, GMutableSpan r_data)
static std::shared_ptr< io::serialize::ArrayValue > serialize_int_array(const Span< int > values)
std::shared_ptr< DictionaryValue > DictionaryValuePtr
static bool read_blob_raw_bytes(const BlobReader &blob_reader, const DictionaryValue &io_data, const int64_t bytes_num, void *r_data)
static StringRefNull get_data_type_io_name(const eCustomDataType data_type)
static bool load_materials(const io::serialize::ArrayValue &io_materials, std::unique_ptr< BakeMaterialsList > &materials)
static StringRefNull get_endian_io_name(const int endian)
static std::optional< CurvesGeometry > try_load_curves_geometry(const DictionaryValue &io_curves, const BlobReader &blob_reader, const BlobReadSharing &blob_sharing)
static std::optional< float > deserialize_float(const io::serialize::Value &io_value)
static std::optional< T > deserialize_int(const io::serialize::Value &io_value)
static std::shared_ptr< io::serialize::Value > serialize_primitive_value(const eCustomDataType data_type, const void *value_ptr)
static bool load_attributes(const io::serialize::ArrayValue &io_attributes, MutableAttributeAccessor &attributes, const BlobReader &blob_reader, const BlobReadSharing &blob_sharing)
void serialize_bake(const BakeState &bake_state, BlobWriter &blob_writer, BlobWriteSharing &blob_sharing, std::ostream &r_stream)
static void serialize_curves_geometry(DictionaryValue &io_curves, const CurvesGeometry &curves, BlobWriter &blob_writer, BlobWriteSharing &blob_sharing)
static std::shared_ptr< DictionaryValue > write_blob_raw_bytes(BlobWriter &blob_writer, BlobWriteSharing &blob_sharing, const void *data, const int64_t size_in_bytes)
static std::shared_ptr< DictionaryValue > serialize_geometry_set(const GeometrySet &geometry, BlobWriter &blob_writer, BlobWriteSharing &blob_sharing)
static Curves * try_load_curves(const DictionaryValue &io_geometry, const BlobReader &blob_reader, const BlobReadSharing &blob_sharing)
static std::shared_ptr< DictionaryValue > write_blob_shared_simple_gspan(BlobWriter &blob_writer, BlobWriteSharing &blob_sharing, const GSpan data, const ImplicitSharingInfo *sharing_info)
static GeometrySet load_geometry(const DictionaryValue &io_geometry, const BlobReader &blob_reader, const BlobReadSharing &blob_sharing)
static void serialize_bake_item(const BakeItem &item, BlobWriter &blob_writer, BlobWriteSharing &blob_sharing, DictionaryValue &r_io_item)
static Mesh * try_load_mesh(const DictionaryValue &io_geometry, const BlobReader &blob_reader, const BlobReadSharing &blob_sharing)
static std::unique_ptr< BakeItem > deserialize_bake_item(const DictionaryValue &io_item, const BlobReader &blob_reader, const BlobReadSharing &blob_sharing)
static PointCloud * try_load_pointcloud(const DictionaryValue &io_geometry, const BlobReader &blob_reader, const BlobReadSharing &blob_sharing)
std::optional< BakeState > deserialize_bake(std::istream &stream, const BlobReader &blob_reader, const BlobReadSharing &blob_sharing)
static bool deserialize_primitive_value(const io::serialize::Value &io_value, const eCustomDataType type, void *r_value)
static std::shared_ptr< DictionaryValue > write_blob_simple_gspan(BlobWriter &blob_writer, BlobWriteSharing &blob_sharing, const GSpan data)
static GreasePencil * try_load_grease_pencil(const DictionaryValue &io_geometry, const BlobReader &blob_reader, const BlobReadSharing &blob_sharing)
static const void * read_blob_shared_simple_gspan(const DictionaryValue &io_data, const BlobReader &blob_reader, const BlobReadSharing &blob_sharing, const CPPType &cpp_type, const int size, const ImplicitSharingInfo **r_sharing_info)
static std::unique_ptr< Instances > try_load_instances(const DictionaryValue &io_geometry, const BlobReader &blob_reader, const BlobReadSharing &blob_sharing)
static bool deserialize_float_array(const io::serialize::Value &io_value, MutableSpan< float > r_values)
static std::shared_ptr< DictionaryValue > write_blob_raw_data_with_endian(BlobWriter &blob_writer, BlobWriteSharing &blob_sharing, const void *data, const int64_t size_in_bytes)
static std::string make_independent_file_name(const StringRef base_name, const int file_index, const StringRef extension)
static std::shared_ptr< io::serialize::ArrayValue > serialize_float_array(const Span< float > values)
static std::shared_ptr< io::serialize::ArrayValue > serialize_attributes(const AttributeAccessor &attributes, BlobWriter &blob_writer, BlobWriteSharing &blob_sharing, const Set< std::string > &attributes_to_ignore)
static std::shared_ptr< io::serialize::ArrayValue > serialize_materials(const std::unique_ptr< BakeMaterialsList > &materials)
static bool read_blob_raw_data_with_endian(const BlobReader &blob_reader, const DictionaryValue &io_data, const int64_t element_size, const int64_t elements_num, void *r_data)
bool attribute_name_is_anonymous(const StringRef name)
eCustomDataType cpp_type_to_custom_data_type(const CPPType &type)
const CPPType * custom_data_type_to_cpp_type(eCustomDataType type)
PointCloud * pointcloud_new_no_attributes(int totpoint)
Curves * curves_new_nomain(int points_num, int curves_num)
const ImplicitSharingInfo * info_for_mem_free(void *data)
PrimitiveValue< int64_t, eValueType::Int > IntValue
PrimitiveValue< bool, eValueType::Boolean > BooleanValue
PrimitiveValue< double, eValueType::Double > DoubleValue
QuaternionBase< float > Quaternion
VecBase< int32_t, 4 > int4
MatBase< float, 4, 4 > float4x4
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
VecBase< float, 3 > float3
blender::VecBase< int16_t, 2 > short2
ColorSceneLinearByteEncoded4b< eAlpha::Premultiplied > ColorGeometry4b
bool RNA_enum_id_from_value(const EnumPropertyItem *item, int value, const char **r_identifier)
bool RNA_enum_value_from_identifier(const EnumPropertyItem *item, const char *identifier, int *r_value)
const EnumPropertyItem rna_enum_attribute_domain_items[]
const EnumPropertyItem rna_enum_attribute_type_items[]
GreasePencilRuntimeHandle * runtime
PointCloudRuntimeHandle * runtime
VolumeRuntimeHandle * runtime
static constexpr int col_len
static constexpr int row_len
const T * base_ptr() const
const ImplicitSharingInfo * sharing_info
Map< int, std::unique_ptr< BakeItem > > items_by_id
std::shared_ptr< io::serialize::DictionaryValue > serialize() const
static std::optional< BlobSlice > deserialize(const io::serialize::DictionaryValue &io_slice)
nodes::SocketInterfaceKey key
std::string socket_idname
std::unique_ptr< BakeItem > value
std::unique_ptr< std::ostringstream > stream