28#include <fmt/format.h>
33# include <openvdb/io/Stream.h>
34# include <openvdb/openvdb.h>
41using namespace io::serialize;
46 auto io_slice = std::make_shared<DictionaryValue>();
47 io_slice->append_str(
"name", this->
name);
48 io_slice->append_int(
"start",
range.start());
49 io_slice->append_int(
"size",
range.size());
55 const std::optional<StringRefNull>
name = io_slice.
lookup_str(
"name");
56 const std::optional<int64_t> start = io_slice.
lookup_int(
"start");
68 std::ostringstream stream{std::ios::binary};
70 std::string
data = stream.rdbuf()->str();
71 return this->
write(data.data(),
data.size());
79 if (!this->
read(slice, buffer.data())) {
82 std::istringstream stream{buffer, std::ios::binary};
98 BLI_path_join(blob_path,
sizeof(blob_path), blobs_dir_.c_str(), slice.
name.c_str());
100 std::lock_guard
lock{mutex_};
101 std::unique_ptr<fstream> &blob_file = open_input_streams_.lookup_or_add_cb_as(blob_path, [&]() {
102 return std::make_unique<fstream>(blob_path, std::ios::in | std::ios::binary);
105 blob_file->read(
static_cast<char *
>(r_data), slice.
range.
size());
106 if (blob_file->gcount() != slice.
range.
size()) {
113 : blob_dir_(std::move(blob_dir)), base_name_(std::move(base_name))
115 blob_name_ = base_name_ +
".blob";
120 if (!blob_stream_.is_open()) {
122 BLI_path_join(blob_path,
sizeof(blob_path), blob_dir_.c_str(), blob_name_.c_str());
124 blob_stream_.open(blob_path, std::ios::out | std::ios::binary);
127 const int64_t old_offset = current_offset_;
128 blob_stream_.write(
static_cast<const char *
>(
data),
size);
129 current_offset_ +=
size;
131 return {blob_name_, {old_offset,
size}};
135 const int file_index,
138 return fmt::format(
"{}_file_{}{}", base_name, file_index, extension);
145 independent_file_count_++;
147 base_name_, independent_file_count_, file_extension);
150 BLI_path_join(path,
sizeof(path), blob_dir_.c_str(), file_name.c_str());
152 std::fstream stream{path, std::ios::out | std::ios::binary};
154 const int64_t written_bytes_num = stream.tellg();
156 return {file_name, {0, written_bytes_num}};
161 blob_by_name_.add(name, blob);
174 memcpy(r_data, copy_src, slice.
range.
size());
180 blob_name_ = base_name_ +
".blob";
181 stream_by_name_.add(blob_name_, {std::make_unique<std::ostringstream>(std::ios::binary)});
186 OutputStream &stream = stream_by_name_.lookup(blob_name_);
198 independent_file_count_++;
200 base_name_, independent_file_count_, file_extension);
201 OutputStream stream{std::make_unique<std::ostringstream>(std::ios::binary)};
204 stream_by_name_.add_new(name, std::move(stream));
212 sharing_info->remove_weak_user_and_delete_if_last();
219 if (value.sharing_info) {
220 value.sharing_info->remove_user_and_delete_if_last();
228 if (sharing_info ==
nullptr) {
231 return stored_by_runtime_.add_or_modify(
234 [&](StoredByRuntimeValue *value) {
235 new (value) StoredByRuntimeValue();
236 value->io_data = write_fn();
237 value->sharing_info_version = sharing_info->
version();
239 return value->io_data;
242 [&](StoredByRuntimeValue *value) {
244 BLI_assert(value->sharing_info_version <= new_version);
245 if (value->sharing_info_version < new_version) {
246 value->io_data = write_fn();
247 value->sharing_info_version = new_version;
249 return value->io_data;
256 const uint64_t content_hash = XXH3_64bits(
data, size_in_bytes);
257 const BlobSlice slice = slice_by_content_hash_.lookup_or_add_cb(
258 content_hash, [&]() {
return writer.
write(
data, size_in_bytes); });
264 FunctionRef<std::optional<ImplicitSharingInfoAndData>()> read_fn)
const
266 std::lock_guard
lock{mutex_};
269 std::stringstream ss;
271 const std::string key = ss.str();
274 shared_data->sharing_info->add_user();
277 std::optional<ImplicitSharingInfoAndData>
data = read_fn();
281 if (
data->sharing_info !=
nullptr) {
282 data->sharing_info->add_user();
283 runtime_by_stored_.add_new(key, *
data);
299 const char *io_name =
"unknown";
306 const char *io_name =
"unknown";
358 if (slice->range.size() != element_size * elements_num) {
361 if (!blob_reader.
read(*slice, r_data)) {
366 const bool need_endian_switch = stored_endian != current_endian;
367 if (need_endian_switch) {
368 switch (element_size) {
406 if (slice->range.size() != bytes_num) {
409 return blob_reader.
read(*slice, r_data);
422 blob_writer, blob_sharing,
data.data(),
data.size_in_bytes());
436 blob_reader, io_data, type.
size(), r_data.
size(), r_data.
data());
440 blob_reader, io_data,
sizeof(
int32_t), r_data.
size() * 2, r_data.
data());
444 blob_reader, io_data,
sizeof(
float), r_data.
size() * 3, r_data.
data());
448 blob_reader, io_data,
sizeof(
float), r_data.
size() * 16, r_data.
data());
452 blob_reader, io_data,
sizeof(
float), r_data.
size() * 4, r_data.
data());
456 blob_reader, io_data,
sizeof(
float), r_data.
size() * 4, r_data.
data());
479 const char *func = __func__;
480 const std::optional<ImplicitSharingInfoAndData> sharing_info_and_data = blob_sharing.
read_shared(
481 io_data, [&]() -> std::optional<ImplicitSharingInfoAndData> {
489 if (!sharing_info_and_data) {
490 *r_sharing_info =
nullptr;
493 *r_sharing_info = sharing_info_and_data->sharing_info;
494 return sharing_info_and_data->data;
507 return *r_data !=
nullptr;
511 std::unique_ptr<BakeMaterialsList> &materials)
513 if (io_materials.
elements().is_empty()) {
516 materials = std::make_unique<BakeMaterialsList>();
517 for (
const auto &io_material_value : io_materials.
elements()) {
519 materials->append(std::nullopt);
522 const auto *io_material = io_material_value->as_dictionary_value();
526 std::optional<std::string>
id_name = io_material->lookup_str(
"name");
530 std::string lib_name = io_material->lookup_str(
"lib_name").value_or(
"");
541 for (
const auto &io_attribute_value : io_attributes.
elements()) {
542 const auto *io_attribute = io_attribute_value->as_dictionary_value();
546 const std::optional<StringRefNull> name = io_attribute->lookup_str(
"name");
547 const std::optional<StringRefNull> domain_str = io_attribute->lookup_str(
"domain");
548 const std::optional<StringRefNull> type_str = io_attribute->lookup_str(
"type");
549 const auto *io_data = io_attribute->
lookup_dict(
"data");
550 if (!name || !domain_str || !type_str || !io_data) {
556 if (!domain || !data_type) {
563 const int domain_size = attributes.
domain_size(*domain);
566 *io_data, blob_reader, blob_sharing, *cpp_type, domain_size, &attribute_sharing_info);
567 if (!attribute_data) {
575 *name, *domain, *data_type);
584 if (!attributes.
add(*name,
601 if (!io_pointcloud) {
605 if (!io_attributes) {
612 auto cancel = [&]() {
618 if (!
load_attributes(*io_attributes, attributes, blob_reader, blob_sharing)) {
635 if (!io_attributes) {
644 if (
curves.curves_num() > 0) {
645 const auto *io_curve_offsets = io_curves.
lookup_dict(
"curve_offsets");
646 if (!io_curve_offsets) {
654 &
curves.runtime->curve_offsets_sharing_info))
661 if (!
load_attributes(*io_attributes, attributes, blob_reader, blob_sharing)) {
671 curves.update_curve_types();
685 if (!io_attributes) {
690 *io_curves, blob_reader, blob_sharing);
698 auto cancel = [&]() {
717 if (!io_grease_pencil) {
728 if (!io_layer_attributes) {
733 auto cancel = [&]() {
738 const int layers_num = io_layers->
elements().size();
739 grease_pencil->add_layers_with_empty_drawings_for_eval(layers_num);
741 for (
const int layer_i : io_layers->
elements().index_range()) {
742 const auto &io_layer_value = io_layers->
elements()[layer_i];
751 const std::optional<std::string> layer_name = io_layer->
lookup_str(
"name");
756 layer.set_name(*layer_name);
758 *io_strokes, blob_reader, blob_sharing);
767 if (!
load_attributes(*io_layer_attributes, attributes, blob_reader, blob_sharing)) {
773 if (!io_layer_opacities ||
782 *io_layer_blend_modes,
791 *io_layer_transforms,
797 for (
const int layer_i :
IndexRange(layers_num)) {
799 layer.
opacity = layer_opacities[layer_i];
800 layer.
blend_mode = layer_blend_modes[layer_i];
811 return grease_pencil;
824 if (!io_attributes) {
833 mesh->verts_num = io_mesh->
lookup_int(
"num_vertices").value_or(0);
835 mesh->faces_num = io_mesh->
lookup_int(
"num_polygons").value_or(0);
836 mesh->corners_num = io_mesh->
lookup_int(
"num_corners").value_or(0);
838 auto cancel = [&]() {
843 if (
mesh->faces_num > 0) {
844 const auto *io_poly_offsets = io_mesh->
lookup_dict(
"poly_offsets");
845 if (!io_poly_offsets) {
852 &
mesh->face_offset_indices,
853 &
mesh->runtime->face_offsets_sharing_info))
860 if (!
load_attributes(*io_attributes, attributes, blob_reader, blob_sharing)) {
874 const BlobReader &blob_reader,
875 const BlobReadSharing &blob_sharing);
885 const int num_instances = io_instances->
lookup_int(
"num_instances").value_or(0);
886 if (num_instances == 0) {
890 if (!io_attributes) {
894 if (!io_references) {
898 std::unique_ptr<Instances> instances = std::make_unique<Instances>();
899 instances->resize(num_instances);
901 for (
const auto &io_reference_value : io_references->
elements()) {
905 reference_geometry =
load_geometry(*io_reference, blob_reader, blob_sharing);
907 instances->add_new_reference(std::move(reference_geometry));
911 if (!
load_attributes(*io_attributes, attributes, blob_reader, blob_sharing)) {
915 if (!attributes.
contains(
".reference_index")) {
918 const auto *io_handles = io_instances->
lookup_dict(
"handles");
923 blob_reader, *io_handles, instances->reference_handles_for_write()))
929 if (!attributes.
contains(
"instance_transform")) {
932 const auto *io_handles = io_instances->
lookup_dict(
"transforms");
945static Volume *try_load_volume(
const DictionaryValue &io_geometry,
const BlobReader &blob_reader)
947 const DictionaryValue *io_volume = io_geometry.lookup_dict(
"volume");
951 const auto *io_vdb = io_volume->lookup_dict(
"vdb");
955 openvdb::GridPtrVecPtr vdb_grids;
957 if (!blob_reader.read_as_stream(*vdb_slice, [&](std::istream &stream) {
959 openvdb::io::Stream vdb_stream{stream};
960 vdb_grids = vdb_stream.getGrids();
972 auto cancel = [&]() {
977 for (openvdb::GridBase::Ptr &vdb_grid : *vdb_grids) {
979 bke::GVolumeGrid grid{std::move(vdb_grid)};
983 if (
const io::serialize::ArrayValue *io_materials = io_volume->lookup_array(
"materials")) {
1003 geometry.replace_volume(try_load_volume(io_geometry, blob_reader));
1009 const std::unique_ptr<BakeMaterialsList> &materials)
1011 auto io_materials = std::make_shared<io::serialize::ArrayValue>();
1013 return io_materials;
1015 for (
const std::optional<BakeDataBlockID> &material : *materials) {
1017 auto io_material = io_materials->append_dict();
1018 io_material->append_str(
"name", material->id_name);
1019 if (!material->lib_name.empty()) {
1020 io_material->append_str(
"lib_name", material->lib_name);
1024 io_materials->append_null();
1027 return io_materials;
1036 auto io_attributes = std::make_shared<io::serialize::ArrayValue>();
1043 auto io_attribute = io_attributes->append_dict();
1045 io_attribute->append_str(
"name", iter.
name);
1048 io_attribute->append_str(
"domain", domain_name);
1051 io_attribute->append_str(
"type", type_name);
1055 io_attribute->append(
"data",
1062 return io_attributes;
1073 if (
curves.curve_num > 0) {
1074 io_curves.
append(
"curve_offsets",
1078 curves.runtime->curve_offsets_sharing_info));
1082 io_curves.
append(
"attributes", io_attributes);
1089 auto io_geometry = std::make_shared<DictionaryValue>();
1092 auto io_mesh = io_geometry->append_dict(
"mesh");
1094 io_mesh->append_int(
"num_vertices",
mesh.verts_num);
1095 io_mesh->append_int(
"num_edges",
mesh.edges_num);
1096 io_mesh->append_int(
"num_polygons",
mesh.faces_num);
1097 io_mesh->append_int(
"num_corners",
mesh.corners_num);
1099 if (
mesh.faces_num > 0) {
1100 io_mesh->append(
"poly_offsets",
1103 mesh.face_offsets(),
1104 mesh.runtime->face_offsets_sharing_info));
1108 io_mesh->append(
"materials", io_materials);
1111 io_mesh->append(
"attributes", io_attributes);
1115 auto io_pointcloud = io_geometry->append_dict(
"pointcloud");
1117 io_pointcloud->append_int(
"num_points", pointcloud.
totpoint);
1120 io_pointcloud->append(
"materials", io_materials);
1123 pointcloud.
attributes(), blob_writer, blob_sharing, {});
1124 io_pointcloud->append(
"attributes", io_attributes);
1130 auto io_curves = io_geometry->append_dict(
"curves");
1135 io_curves->append(
"materials", io_materials);
1137 if (
geometry.has_grease_pencil()) {
1139 auto io_grease_pencil = io_geometry->append_dict(
"grease_pencil");
1140 auto io_layers = io_grease_pencil->append_array(
"layers");
1146 auto io_layer = io_layers->append_dict();
1147 io_layer->append_str(
"name", layer->name());
1148 auto io_strokes = io_layer->append_dict(
"strokes");
1157 layer_opacities.
append(layer->opacity);
1158 layer_blend_modes.
append(layer->blend_mode);
1159 layer_transforms.
append(layer->local_transform());
1162 io_grease_pencil->append(
1165 io_grease_pencil->append(
1168 io_grease_pencil->append(
1173 grease_pencil.attributes(), blob_writer, blob_sharing, {});
1174 io_grease_pencil->append(
"layer_attributes", io_layer_attributes);
1177 io_grease_pencil->append(
"materials", io_materials);
1184 auto io_volume = io_geometry->append_dict(
"volume");
1185 auto io_vdb = blob_writer
1187 [&](std::ostream &stream) {
1188 openvdb::GridCPtrVec vdb_grids;
1194 vdb_grids.push_back(grid->grid_ptr(tree_tokens.
last()));
1197 openvdb::io::Stream vdb_stream(stream);
1198 vdb_stream.write(vdb_grids);
1201 io_volume->append(
"vdb", std::move(io_vdb));
1204 io_volume->append(
"materials", io_materials);
1209 auto io_instances = io_geometry->append_dict(
"instances");
1211 io_instances->append_int(
"num_instances", instances.
instances_num());
1213 auto io_references = io_instances->append_array(
"references");
1226 instances.
attributes(), blob_writer, blob_sharing, {});
1227 io_instances->append(
"attributes", io_attributes);
1234 auto io_value = std::make_shared<io::serialize::ArrayValue>();
1235 for (
const float value : values) {
1236 io_value->append_double(value);
1243 auto io_value = std::make_shared<io::serialize::ArrayValue>();
1244 for (
const int value : values) {
1245 io_value->append_int(value);
1253 switch (data_type) {
1255 const float value = *
static_cast<const float *
>(value_ptr);
1256 return std::make_shared<io::serialize::DoubleValue>(value);
1259 const float2 value = *
static_cast<const float2 *
>(value_ptr);
1263 const float3 value = *
static_cast<const float3 *
>(value_ptr);
1267 const bool value = *
static_cast<const bool *
>(value_ptr);
1268 return std::make_shared<io::serialize::BooleanValue>(value);
1271 const int value = *
static_cast<const int *
>(value_ptr);
1272 return std::make_shared<io::serialize::IntValue>(value);
1275 const int2 value = *
static_cast<const int2 *
>(value_ptr);
1280 const int4 value_int{&value.
r};
1317 std::optional<T>
element =
fn(io_element);
1321 r_values[i] = std::move(*
element);
1330 return std::nullopt;
1333 if (value < std::numeric_limits<T>::lowest()) {
1334 return std::nullopt;
1336 if (value > std::numeric_limits<T>::max()) {
1337 return std::nullopt;
1345 return io_double->value();
1348 return io_int->value();
1350 return std::nullopt;
1363 static_assert(std::is_integral_v<T>);
1377 *
static_cast<float *
>(r_value) = *value;
1388 *
static_cast<bool *
>(r_value) = io_value_boolean->value();
1398 *
static_cast<int *
>(r_value) = *value;
1427 if (!item.
name.empty()) {
1430 if (
const auto *geometry_state_item =
dynamic_cast<const GeometryBakeItem *
>(&item)) {
1435 r_io_item.
append(
"data", io_geometry);
1437 else if (
const auto *attribute_state_item =
dynamic_cast<const AttributeBakeItem *
>(&item)) {
1439 r_io_item.
append_str(
"name", attribute_state_item->name());
1442 else if (
const auto *grid_state_item =
dynamic_cast<const VolumeGridBakeItem *
>(&item)) {
1444 const GVolumeGrid &grid = *grid_state_item->grid;
1445 auto io_vdb = blob_writer
1447 [&](std::ostream &stream) {
1448 openvdb::GridCPtrVec vdb_grids;
1449 bke::VolumeTreeAccessToken tree_token;
1450 vdb_grids.push_back(grid->grid_ptr(tree_token));
1451 openvdb::io::Stream vdb_stream(stream);
1452 vdb_stream.write(vdb_grids);
1455 r_io_item.
append(
"vdb", std::move(io_vdb));
1458 else if (
const auto *string_state_item =
dynamic_cast<const StringBakeItem *
>(&item)) {
1462 const int64_t blob_threshold = 100;
1463 if (
str.size() < blob_threshold) {
1464 r_io_item.
append_str(
"data", string_state_item->value());
1471 else if (
const auto *primitive_state_item =
dynamic_cast<const PrimitiveBakeItem *
>(&item)) {
1475 r_io_item.
append(
"data", std::move(io_data));
1484 const std::optional<StringRefNull> state_item_type = io_item.
lookup_str(
"type");
1485 if (!state_item_type) {
1488 if (*state_item_type ==
StringRef(
"GEOMETRY")) {
1494 return std::make_unique<GeometryBakeItem>(std::move(
geometry));
1496 if (*state_item_type ==
StringRef(
"ATTRIBUTE")) {
1498 if (!io_attribute) {
1501 std::optional<StringRefNull> name = io_attribute->
lookup_str(
"name");
1505 return std::make_unique<AttributeBakeItem>(std::move(*name));
1508 if (*state_item_type ==
StringRef(
"GRID")) {
1518 openvdb::GridPtrVecPtr vdb_grids;
1519 if (!blob_reader.
read_as_stream(*vdb_slice, [&](std::istream &stream) {
1521 openvdb::io::Stream vdb_stream{stream};
1522 vdb_grids = vdb_stream.getGrids();
1532 if (vdb_grids->size() != 1) {
1535 std::shared_ptr<openvdb::GridBase> vdb_grid = std::move((*vdb_grids)[0]);
1536 GVolumeGrid grid{std::move(vdb_grid)};
1537 return std::make_unique<VolumeGridBakeItem>(std::make_unique<GVolumeGrid>(grid));
1540 if (*state_item_type ==
StringRef(
"STRING")) {
1541 const std::shared_ptr<io::serialize::Value> *io_data = io_item.
lookup(
"data");
1546 const io::serialize::StringValue &io_string = *io_data->get()->as_string_value();
1547 return std::make_unique<StringBakeItem>(io_string.value());
1549 if (
const io::serialize::DictionaryValue *io_string = io_data->get()->as_dictionary_value()) {
1550 const std::optional<int64_t>
size = io_string->lookup_int(
"size");
1559 return std::make_unique<StringBakeItem>(std::move(
str));
1562 const std::shared_ptr<io::serialize::Value> *io_data = io_item.lookup(
"data");
1574 return std::make_unique<PrimitiveBakeItem>(cpp_type, buffer);
1584 std::ostream &r_stream)
1589 for (
auto item : bake_state.
items_by_id.items()) {
1603 std::unique_ptr<io::serialize::Value> io_root_value;
1608 return std::nullopt;
1610 if (!io_root_value) {
1611 return std::nullopt;
1615 return std::nullopt;
1617 const std::optional<int> version = io_root->
lookup_int(
"version");
1619 return std::nullopt;
1623 return std::nullopt;
1626 for (
const auto &io_item_value : io_items->
elements()) {
1629 return std::nullopt;
1633 id = std::stoi(io_item_value.first);
1636 return std::nullopt;
1639 return std::nullopt;
1642 *io_item, blob_reader, blob_sharing);
1644 return std::nullopt;
1646 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, const int totelem)
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.
PointCloud * BKE_pointcloud_new_nomain(int totpoint)
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 BLI_SCOPED_DEFER(function_to_defer)
#define BLI_path_join(...)
struct CurvesGeometry CurvesGeometry
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between and object coordinate space Combine Create a color from its and value channels Color Retrieve a color attribute
ATTR_WARN_UNUSED_RESULT const void * element
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.
MutableSpan< T > as_mutable_span()
static const CPPType & get()
void copy_assign_n(const void *src, void *dst, int64_t n) const
int64_t alignment() 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
int domain_size(const AttrDomain domain) const
bool contains(const StringRef attribute_id) 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(std::string key, std::shared_ptr< Value > value)
const std::shared_ptr< Value > * lookup(const StringRef key) const
void append_str(std::string key, std::string value)
std::shared_ptr< DictionaryValue > append_dict(std::string key)
const DictionaryValue * lookup_dict(const StringRef key) const
Span< Item > elements() const
void append_int(std::string key, int64_t value)
const ArrayValue * lookup_array(const StringRef key) const
std::optional< int64_t > lookup_int(const StringRef key) const
std::optional< StringRefNull > lookup_str(const 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
std::string id_name(void *id)
void * MEM_mallocN_aligned(size_t len, size_t alignment, 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)
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
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[]
unsigned __int64 uint64_t
GreasePencilRuntimeHandle * runtime
PointCloudRuntimeHandle * runtime
VolumeRuntimeHandle * runtime
static constexpr int col_len
static constexpr int row_len
const T * base_ptr() const
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)
std::unique_ptr< std::ostringstream > stream