Geometry Nodes: store path to simulation bake in modifier #108201

Merged
Jacques Lucke merged 5 commits from JacquesLucke/blender:store-bake-path into blender-v3.6-release 2023-05-24 08:45:39 +02:00
8 changed files with 25 additions and 20 deletions
Showing only changes of commit bf84b18a73 - Show all commits

View File

@ -162,7 +162,7 @@ class ModifierSimulationCache {
CacheState cache_state_ = CacheState::Valid;
bool failed_finding_bake_ = false;
void try_discover_bake(StringRefNull bake_dir);
void try_discover_bake(StringRefNull absolute_bake_dir);
bool has_state_at_frame(const SubFrame &frame) const;
bool has_states() const;

View File

@ -143,8 +143,7 @@ class DiskBDataWriter : public BDataWriter {
};
/**
* Get the directory that contains all baked simulation data for the given modifier. This is a
* parent directory of the two directories below.
* Get the directory that contains all baked simulation data for the given modifier.
*/
std::string get_default_modifier_bake_directory(const Main &bmain,
const Object &object,

View File

@ -37,16 +37,16 @@ StringSimulationStateItem::StringSimulationStateItem(std::string value) : value_
{
}
void ModifierSimulationCache::try_discover_bake(const StringRefNull bake_dir)
void ModifierSimulationCache::try_discover_bake(const StringRefNull absolute_bake_dir)
{
if (failed_finding_bake_) {
return;
}
char meta_dir[FILE_MAX];
BLI_path_join(meta_dir, sizeof(meta_dir), bake_dir.c_str(), "meta");
BLI_path_join(meta_dir, sizeof(meta_dir), absolute_bake_dir.c_str(), "meta");
char bdata_dir[FILE_MAX];
BLI_path_join(bdata_dir, sizeof(bdata_dir), bake_dir.c_str(), "bdata");
BLI_path_join(bdata_dir, sizeof(bdata_dir), absolute_bake_dir.c_str(), "bdata");
if (!BLI_is_dir(meta_dir) || !BLI_is_dir(bdata_dir)) {
failed_finding_bake_ = true;

View File

@ -68,6 +68,7 @@ std::string get_default_modifier_bake_directory(const Main &bmain,
const ModifierData &md)
{
char dir[FILE_MAX];
/* Make path that's relative to the .blend file. */
BLI_path_join(dir,
sizeof(dir),
"//",

View File

@ -4492,12 +4492,12 @@ void blo_do_versions_300(FileData *fd, Library * /*lib*/, Main *bmain)
continue;
}
NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
if (nmd->bake_directory) {
if (nmd->simulation_bake_directory) {
continue;
}
const std::string bake_dir = blender::bke::sim::get_default_modifier_bake_directory(
*bmain, *ob, *md);
nmd->bake_directory = BLI_strdup(bake_dir.c_str());
nmd->simulation_bake_directory = BLI_strdup(bake_dir.c_str());
}
}
}

View File

@ -254,12 +254,12 @@ static void bake_simulation_job_startjob(void *customdata,
if (nmd->simulation_cache != nullptr) {
nmd->simulation_cache->reset();
}
if (StringRef(nmd->bake_directory).is_empty()) {
nmd->bake_directory = BLI_strdup(
if (StringRef(nmd->simulation_bake_directory).is_empty()) {
nmd->simulation_bake_directory = BLI_strdup(
bke::sim::get_default_modifier_bake_directory(*job.bmain, *object, *md).c_str());
}
char absolute_bake_dir[FILE_MAX];
STRNCPY(absolute_bake_dir, nmd->bake_directory);
STRNCPY(absolute_bake_dir, nmd->simulation_bake_directory);
BLI_path_abs(absolute_bake_dir, base_path);
bake_data.modifiers.append({nmd, absolute_bake_dir, std::make_unique<BDataSharing>()});
}
@ -444,11 +444,11 @@ static int delete_baked_simulation_exec(bContext *C, wmOperator *op)
if (nmd->simulation_cache != nullptr) {
nmd->simulation_cache->reset();
}
if (StringRef(nmd->bake_directory).is_empty()) {
if (StringRef(nmd->simulation_bake_directory).is_empty()) {
continue;
}
char absolute_bake_dir[FILE_MAX];
STRNCPY(absolute_bake_dir, nmd->bake_directory);
STRNCPY(absolute_bake_dir, nmd->simulation_bake_directory);
BLI_path_abs(absolute_bake_dir, base_path);
if (BLI_exists(absolute_bake_dir)) {
if (BLI_delete(absolute_bake_dir, true, true)) {

View File

@ -2319,7 +2319,10 @@ typedef struct NodesModifierData {
ModifierData modifier;
struct bNodeTree *node_group;
struct NodesModifierSettings settings;
char *bake_directory;
/**
* Directory where baked simulation states are stored. This may be relative to the .blend file.
*/
char *simulation_bake_directory;
void *_pad;
/**

View File

@ -1153,10 +1153,10 @@ static void prepare_simulation_states_for_evaluation(const NodesModifierData &nm
if (nmd_orig.simulation_cache->cache_state() != bke::sim::CacheState::Baked &&
!bmain_path.is_empty())
{
if (!StringRef(nmd.bake_directory).is_empty()) {
if (!StringRef(nmd.simulation_bake_directory).is_empty()) {
if (const char *base_path = ID_BLEND_PATH(bmain, &ctx.object->id)) {
char absolute_bake_dir[FILE_MAX];
STRNCPY(absolute_bake_dir, nmd.bake_directory);
STRNCPY(absolute_bake_dir, nmd.simulation_bake_directory);
BLI_path_abs(absolute_bake_dir, base_path);
nmd_orig.simulation_cache->try_discover_bake(absolute_bake_dir);
}
@ -2001,7 +2001,7 @@ static void blendWrite(BlendWriter *writer, const ID * /*id_owner*/, const Modif
BLO_write_struct(writer, NodesModifierData, nmd);
BLO_write_string(writer, nmd->bake_directory);
BLO_write_string(writer, nmd->simulation_bake_directory);
if (nmd->settings.properties != nullptr) {
Map<IDProperty *, IDPropertyUIDataBool *> boolean_props;
@ -2041,7 +2041,7 @@ static void blendWrite(BlendWriter *writer, const ID * /*id_owner*/, const Modif
static void blendRead(BlendDataReader *reader, ModifierData *md)
{
NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
BLO_read_data_address(reader, &nmd->bake_directory);
BLO_read_data_address(reader, &nmd->simulation_bake_directory);
if (nmd->node_group == nullptr) {
nmd->settings.properties = nullptr;
}
@ -2062,7 +2062,9 @@ static void copyData(const ModifierData *md, ModifierData *target, const int fla
tnmd->runtime_eval_log = nullptr;
tnmd->simulation_cache = nullptr;
tnmd->bake_directory = nmd->bake_directory ? BLI_strdup(nmd->bake_directory) : nullptr;
tnmd->simulation_bake_directory = nmd->simulation_bake_directory ?
BLI_strdup(nmd->simulation_bake_directory) :
nullptr;
if (nmd->settings.properties != nullptr) {
tnmd->settings.properties = IDP_CopyProperty_ex(nmd->settings.properties, flag);
@ -2078,7 +2080,7 @@ static void freeData(ModifierData *md)
}
MEM_delete(nmd->simulation_cache);
MEM_SAFE_FREE(nmd->bake_directory);
MEM_SAFE_FREE(nmd->simulation_bake_directory);
clear_runtime_data(nmd);
}