Geometry Nodes: store bake item names on disk

Bake items are generally identified by their (generated) identifier.
This allows changing the name and reordering sockets without breaking
baked data.

In the future we want to have some kind of Import Bake node that
ideally automatically creates its output sockets and names them correctly.
For that to work, the baked data has to contain the user-defined names
for each socket. Those names are not used yet.
This commit is contained in:
Jacques Lucke
2024-02-02 10:02:25 +01:00
parent 31df006b39
commit 7d3003be4d
6 changed files with 21 additions and 0 deletions
@@ -17,6 +17,12 @@ namespace blender::bke::bake {
*/
class BakeItem {
public:
/**
* User-defined name. This is not necessarily unique and might change over time. It's purpose is
* to make bakes more inspectable.
*/
std::string name;
virtual ~BakeItem() = default;
};
@@ -24,6 +24,8 @@ struct BakeSocketConfig {
* for some socket types).
*/
Vector<AttrDomain> domains;
/** User-defined name of every socket. */
Vector<StringRef> names;
/**
* Determines which geometries a field socket should be evaluated on. This can be used to
* implement rules like a field should only be evaluated on the preceding or on all geometries.
@@ -1010,6 +1010,9 @@ static void serialize_bake_item(const BakeItem &item,
BlobSharing &blob_sharing,
DictionaryValue &r_io_item)
{
if (!item.name.empty()) {
r_io_item.append_str("name", item.name);
}
if (const auto *geometry_state_item = dynamic_cast<const GeometryBakeItem *>(&item)) {
r_io_item.append_str("type", "GEOMETRY");
@@ -101,6 +101,12 @@ Array<std::unique_ptr<BakeItem>> move_socket_values_to_bake_items(const Span<voi
GeometryBakeItem::prepare_geometry_for_bake(geometry, data_block_map);
}
for (const int i : bake_items.index_range()) {
if (std::unique_ptr<BakeItem> &item = bake_items[i]) {
item->name = config.names[i];
}
}
return bake_items;
}
@@ -117,6 +117,7 @@ static bake::BakeSocketConfig make_bake_socket_config(const Span<NodeGeometryBak
bake::BakeSocketConfig config;
const int items_num = bake_items.size();
config.domains.resize(items_num);
config.names.resize(items_num);
config.types.resize(items_num);
config.geometries_by_attribute.resize(items_num);
@@ -124,6 +125,7 @@ static bake::BakeSocketConfig make_bake_socket_config(const Span<NodeGeometryBak
for (const int item_i : bake_items.index_range()) {
const NodeGeometryBakeItem &item = bake_items[item_i];
config.types[item_i] = eNodeSocketDatatype(item.socket_type);
config.names[item_i] = item.name;
config.domains[item_i] = AttrDomain(item.attribute_domain);
if (item.socket_type == SOCK_GEOMETRY) {
last_geometry_index = item_i;
@@ -72,6 +72,7 @@ static bke::bake::BakeSocketConfig make_bake_socket_config(
bke::bake::BakeSocketConfig config;
const int items_num = node_simulation_items.size();
config.domains.resize(items_num);
config.names.resize(items_num);
config.types.resize(items_num);
config.geometries_by_attribute.resize(items_num);
@@ -79,6 +80,7 @@ static bke::bake::BakeSocketConfig make_bake_socket_config(
for (const int item_i : node_simulation_items.index_range()) {
const NodeSimulationItem &item = node_simulation_items[item_i];
config.types[item_i] = eNodeSocketDatatype(item.socket_type);
config.names[item_i] = item.name;
config.domains[item_i] = AttrDomain(item.attribute_domain);
if (item.socket_type == SOCK_GEOMETRY) {
last_geometry_index = item_i;