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
4 changed files with 81 additions and 78 deletions
Showing only changes of commit d317cd6b94 - Show all commits

View File

@ -6,6 +6,8 @@
#include "BLI_serialize.hh"
struct ModifierData;
namespace blender::bke::sim {
struct BDataSlice {
@ -30,6 +32,10 @@ class BDataWriter {
const FunctionRef<std::shared_ptr<io::serialize::DictionaryValue>()> write_fn) = 0;
};
std::string get_bake_directory(const Main &bmain, const Object &object, const ModifierData &md);
std::string get_bdata_directory(const Main &bmain, const Object &object, const ModifierData &md);
std::string get_meta_directory(const Main &bmain, const Object &object, const ModifierData &md);
void serialize_modifier_simulation_state(const ModifierSimulationState &state,
BDataWriter &bdata_writer,
io::serialize::DictionaryValue &r_io_root);

View File

@ -3,21 +3,89 @@
#include "BKE_curves.hh"
#include "BKE_instances.hh"
#include "BKE_lib_id.h"
#include "BKE_main.h"
#include "BKE_mesh.hh"
#include "BKE_pointcloud.h"
#include "BKE_simulation_state_serialize.hh"
#include "DNA_material_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "BLI_endian_defines.h"
#include "BLI_endian_switch.h"
#include "BLI_math_matrix_types.hh"
#include "BLI_path_util.h"
#include "RNA_access.h"
#include "RNA_enum_types.h"
namespace blender::bke::sim {
static std::string escape_name(StringRef name)
{
std::stringstream ss;
for (const char c : name) {
if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) {
ss << c;
}
else {
ss << int(c);
}
}
return ss.str();
}
static std::string get_blendcache_directory(const Main &bmain)
{
StringRefNull blend_file_path = BKE_main_blendfile_path(&bmain);
char blend_directory[FILE_MAX];
char blend_name[FILE_MAX];
BLI_split_dirfile(blend_file_path.c_str(),
blend_directory,
blend_name,
sizeof(blend_directory),
sizeof(blend_name));
blend_name[StringRef(blend_name).rfind(".")] = '\0';
const std::string blendcache_name = "blendcache_" + StringRef(blend_name);
char blendcache_dir[FILE_MAX];
BLI_path_join(blendcache_dir, sizeof(blendcache_dir), blend_directory, blendcache_name.c_str());
return blendcache_dir;
}
static std::string get_modifier_sim_name(const Object &object, const ModifierData &md)
{
const std::string object_name_escaped = escape_name(object.id.name + 2);
const std::string modifier_name_escaped = escape_name(md.name);
return "sim_" + object_name_escaped + "_" + modifier_name_escaped;
}
std::string get_bake_directory(const Main &bmain, const Object &object, const ModifierData &md)
{
char bdata_dir[FILE_MAX];
BLI_path_join(bdata_dir,
sizeof(bdata_dir),
get_blendcache_directory(bmain).c_str(),
get_modifier_sim_name(object, md).c_str());
return bdata_dir;
}
std::string get_bdata_directory(const Main &bmain, const Object &object, const ModifierData &md)
{
char bdata_dir[FILE_MAX];
BLI_path_join(
bdata_dir, sizeof(bdata_dir), get_bake_directory(bmain, object, md).c_str(), "bdata");
return bdata_dir;
}
std::string get_meta_directory(const Main &bmain, const Object &object, const ModifierData &md)
{
char meta_dir[FILE_MAX];
BLI_path_join(meta_dir, sizeof(meta_dir), get_bake_directory(bmain, object, md).c_str(), "meta");
return meta_dir;
}
std::shared_ptr<io::serialize::DictionaryValue> BDataSlice::serialize() const
{
auto io_slice = std::make_shared<io::serialize::DictionaryValue>();

View File

@ -46,69 +46,6 @@
namespace blender::ed::object::bake_simulation {
static std::string escape_name(StringRef name)
{
std::stringstream ss;
for (const char c : name) {
if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) {
ss << c;
}
else {
ss << int(c);
}
}
return ss.str();
}
static std::string get_blendcache_directory(const Main &bmain)
{
StringRefNull blend_file_path = BKE_main_blendfile_path(&bmain);
char blend_directory[FILE_MAX];
char blend_name[FILE_MAX];
BLI_split_dirfile(blend_file_path.c_str(),
blend_directory,
blend_name,
sizeof(blend_directory),
sizeof(blend_name));
blend_name[StringRef(blend_name).rfind(".")] = '\0';
const std::string blendcache_name = "blendcache_" + StringRef(blend_name);
char blendcache_dir[FILE_MAX];
BLI_path_join(blendcache_dir, sizeof(blendcache_dir), blend_directory, blendcache_name.c_str());
return blendcache_dir;
}
static std::string get_modifier_sim_name(const Object &ob, const ModifierData &md)
{
const std::string object_name_escaped = escape_name(ob.id.name + 2);
const std::string modifier_name_escaped = escape_name(md.name);
return "sim_" + object_name_escaped + "_" + modifier_name_escaped;
}
std::string get_bdata_directory(const Main &bmain, const Object &ob, const ModifierData &md);
std::string get_bdata_directory(const Main &bmain, const Object &ob, const ModifierData &md)
{
char bdata_dir[FILE_MAX];
BLI_path_join(bdata_dir,
sizeof(bdata_dir),
get_blendcache_directory(bmain).c_str(),
get_modifier_sim_name(ob, md).c_str(),
"bdata");
return bdata_dir;
}
std::string get_meta_directory(const Main &bmain, const Object &ob, const ModifierData &md);
std::string get_meta_directory(const Main &bmain, const Object &ob, const ModifierData &md)
{
char meta_dir[FILE_MAX];
BLI_path_join(meta_dir,
sizeof(meta_dir),
get_blendcache_directory(bmain).c_str(),
get_modifier_sim_name(ob, md).c_str(),
"meta");
return meta_dir;
}
class MyBDataReader : public bke::sim::BDataReader {
private:
std::string bdata_dir_;
@ -250,8 +187,8 @@ static int bake_simulation_exec(bContext *C, wmOperator * /*op*/)
nmd->simulation_cache->reset();
}
bake_data.modifiers.append({nmd,
get_meta_directory(*bmain, *object, *md),
get_bdata_directory(*bmain, *object, *md)});
bke::sim::get_meta_directory(*bmain, *object, *md),
bke::sim::get_bdata_directory(*bmain, *object, *md)});
}
}
objects_to_bake.append(std::move(bake_data));
@ -338,12 +275,8 @@ static int delete_baked_simulation_exec(bContext *C, wmOperator * /*op*/)
LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
if (md->type == eModifierType_Nodes) {
NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
char bake_directory[FILE_MAX];
BLI_path_join(bake_directory,
sizeof(bake_directory),
get_blendcache_directory(*bmain).c_str(),
get_modifier_sim_name(*object, *md).c_str());
BLI_delete(bake_directory, true, true);
const std::string bake_directory = bke::sim::get_bake_directory(*bmain, *object, *md);
BLI_delete(bake_directory.c_str(), true, true);
if (nmd->simulation_cache != nullptr) {
nmd->simulation_cache->reset();
}

View File

@ -55,6 +55,7 @@
#include "BKE_screen.h"
#include "BKE_simulation.h"
#include "BKE_simulation_state.hh"
#include "BKE_simulation_state_serialize.hh"
#include "BKE_workspace.h"
#include "BLO_read_write.h"
@ -98,11 +99,6 @@ namespace lf = blender::fn::lazy_function;
namespace geo_log = blender::nodes::geo_eval_log;
using blender::bke::sim::SubFrame;
namespace blender::ed::object::bake_simulation {
std::string get_bdata_directory(const Main &bmain, const Object &ob, const ModifierData &md);
std::string get_meta_directory(const Main &bmain, const Object &ob, const ModifierData &md);
} // namespace blender::ed::object::bake_simulation
namespace blender {
static void initData(ModifierData *md)
@ -1219,8 +1215,8 @@ static GeometrySet compute_geometry(const bNodeTree &btree,
if (nmd_orig->simulation_cache->cache_state() != bke::sim::CacheState::Baked) {
nmd_orig->simulation_cache->try_discover_bake(
ed::object::bake_simulation::get_meta_directory(*bmain, *ctx->object, nmd->modifier),
ed::object::bake_simulation::get_bdata_directory(*bmain, *ctx->object, nmd->modifier));
bke::sim::get_meta_directory(*bmain, *ctx->object, nmd->modifier),
bke::sim::get_bdata_directory(*bmain, *ctx->object, nmd->modifier));
}
if (nmd_orig->simulation_cache->cache_state() == bke::sim::CacheState::Invalid &&