Simulation Nodes: bake simulation states to disk #106937

Merged
Jacques Lucke merged 116 commits from JacquesLucke/blender:sim-bake into geometry-nodes-simulation 2023-04-22 14:48:56 +02:00
3 changed files with 23 additions and 22 deletions
Showing only changes of commit 8f2f0a55e9 - Show all commits

View File

@ -32,8 +32,8 @@ class BDataWriter {
void serialize_modifier_simulation_state(const ModifierSimulationState &state,
BDataWriter &bdata_writer,
std::ostream &stream);
void deserialize_modifier_simulation_state(std::istream &stream,
io::serialize::DictionaryValue &r_io_root);
void deserialize_modifier_simulation_state(const io::serialize::DictionaryValue &io_root,
const BDataReader &bdata_reader,
ModifierSimulationState &r_state);

View File

@ -569,11 +569,10 @@ static std::shared_ptr<io::serialize::DictionaryValue> serialize_geometry_set(
void serialize_modifier_simulation_state(const ModifierSimulationState &state,
BDataWriter &bdata_writer,
std::ostream &stream)
io::serialize::DictionaryValue &r_io_root)
{
io::serialize::DictionaryValue io_root;
io_root.append_int("version", 1);
auto io_zones = io_root.append_array("zones");
r_io_root.append_int("version", 1);
auto io_zones = r_io_root.append_array("zones");
for (const auto item : state.zone_states_.items()) {
const SimulationZoneID &zone_id = item.key;
@ -607,32 +606,21 @@ void serialize_modifier_simulation_state(const ModifierSimulationState &state,
}
}
}
io::serialize::JsonFormatter json_formatter;
json_formatter.serialize(stream, io_root);
}
void deserialize_modifier_simulation_state(std::istream &stream,
void deserialize_modifier_simulation_state(const io::serialize::DictionaryValue &io_root,
const BDataReader &bdata_reader,
ModifierSimulationState &r_state)
{
io::serialize::JsonFormatter formatter;
std::unique_ptr<io::serialize::Value> io_root_value = formatter.deserialize(stream);
if (!io_root_value) {
return;
}
const io::serialize::DictionaryValue *io_root = io_root_value->as_dictionary_value();
if (!io_root) {
return;
}
const std::optional<int> version = io_root->lookup_int("version");
const std::optional<int> version = io_root.lookup_int("version");
if (!version) {
return;
}
if (*version != 1) {
return;
}
const io::serialize::ArrayValue *io_zones = io_root->lookup_array("zones");
const io::serialize::ArrayValue *io_zones = io_root.lookup_array("zones");
if (!io_zones) {
return;
}

View File

@ -183,7 +183,16 @@ void load_simulation_state(const StringRefNull meta_path,
{
const MyBDataReader bdata_reader{bdata_dir};
fstream meta_file{meta_path.c_str(), std::ios::in};
bke::sim::deserialize_modifier_simulation_state(meta_file, bdata_reader, r_state);
io::serialize::JsonFormatter formatter;
std::shared_ptr<io::serialize::Value> io_root_value = formatter.deserialize(meta_file);
if (!io_root_value) {
return;
}
const io::serialize::DictionaryValue *io_root = io_root_value->as_dictionary_value();
if (!io_root) {
return;
}
bke::sim::deserialize_modifier_simulation_state(*io_root, bdata_reader, r_state);
}
static bool bake_simulation_poll(bContext *C)
@ -293,9 +302,13 @@ static int bake_simulation_exec(bContext *C, wmOperator * /*op*/)
fstream bdata_file{bdata_path, std::ios::out | std::ios::binary};
MyBDataWriter bdata_writer{bdata_file_name, bdata_file, 0, modifier_bake_data.shared_data};
io::serialize::DictionaryValue io_root;
bke::sim::serialize_modifier_simulation_state(*sim_state, bdata_writer, io_root);
BLI_make_existing_file(meta_path);
fstream meta_file{meta_path, std::ios::out};
bke::sim::serialize_modifier_simulation_state(*sim_state, bdata_writer, meta_file);
io::serialize::JsonFormatter formatter;
formatter.serialize(meta_file, io_root);
}
}
}