Commit: 1a1341c38779311ad315c6cd48a62279c7667887 Author: Bastien Montagne Date: Wed Nov 16 17:05:12 2022 +0100 Branches: blender-v3.4-release https://developer.blender.org/rB1a1341c38779311ad315c6cd48a62279c7667887
Fix T101326: Missing updates when updating ID file paths. This code mainly tags IDs with `ID_RECALC_SOURCE` when one of their file paths is modified by `BKE_bpath_foreach_path_id`. In addition, a check is added to `BKE_sound_evaluate` to call similar code as when `ID_RECALC_AUDIO` is used. Finally, Sergey added some changes to relations buildings between components for Sound IDs in the depsgraph, linking `PARAMETER` to `AUDIO`. Maniphest Tasks: T101326 Differential Revision: https://developer.blender.org/D16528 =================================================================== M source/blender/blenkernel/BKE_bpath.h M source/blender/blenkernel/intern/bpath.c M source/blender/blenkernel/intern/sound.c M source/blender/depsgraph/intern/builder/deg_builder_relations.cc =================================================================== diff --git a/source/blender/blenkernel/BKE_bpath.h b/source/blender/blenkernel/BKE_bpath.h index 5b1dea0833a..555cddd34bd 100644 --- a/source/blender/blenkernel/BKE_bpath.h +++ b/source/blender/blenkernel/BKE_bpath.h @@ -90,6 +90,13 @@ typedef struct BPathForeachPathData { /** The root to use as base for relative paths. Only set if `BKE_BPATH_FOREACH_PATH_ABSOLUTE` * flag is set, NULL otherwise. */ const char *absolute_base_path; + + /** ID owning the path being processed. */ + struct ID *owner_id; + + /** IDTypeInfo callbacks are responsible to set this boolean if they modified one or more paths. + */ + bool is_path_modified; } BPathForeachPathData; /** Run `bpath_data.callback_function` on all paths contained in `id`. */ diff --git a/source/blender/blenkernel/intern/bpath.c b/source/blender/blenkernel/intern/bpath.c index 6bf121675bc..61893ca25ed 100644 --- a/source/blender/blenkernel/intern/bpath.c +++ b/source/blender/blenkernel/intern/bpath.c @@ -52,6 +52,8 @@ #include "BLI_blenlib.h" #include "BLI_utildefines.h" +#include "DEG_depsgraph.h" + #include "BKE_idtype.h" #include "BKE_image.h" #include "BKE_lib_id.h" @@ -84,6 +86,8 @@ void BKE_bpath_foreach_path_id(BPathForeachPathData *bpath_data, ID *id) ID_BLEND_PATH(bpath_data->bmain, id) : NULL; bpath_data->absolute_base_path = absbase; + bpath_data->owner_id = id; + bpath_data->is_path_modified = false; if ((flag & BKE_BPATH_FOREACH_PATH_SKIP_LINKED) && ID_IS_LINKED(id)) { return; @@ -107,6 +111,10 @@ void BKE_bpath_foreach_path_id(BPathForeachPathData *bpath_data, ID *id) } id_type->foreach_path(id, bpath_data); + + if (bpath_data->is_path_modified) { + DEG_id_tag_update(id, ID_RECALC_SOURCE | ID_RECALC_COPY_ON_WRITE); + } } void BKE_bpath_foreach_path_main(BPathForeachPathData *bpath_data) @@ -140,6 +148,7 @@ bool BKE_bpath_foreach_path_fixed_process(BPathForeachPathData *bpath_data, char if (bpath_data->callback_function(bpath_data, path_dst, path_src)) { BLI_strncpy(path, path_dst, FILE_MAX); + bpath_data->is_path_modified = true; return true; } @@ -166,6 +175,7 @@ bool BKE_bpath_foreach_path_dirfile_fixed_process(BPathForeachPathData *bpath_da if (bpath_data->callback_function(bpath_data, path_dst, (const char *)path_src)) { BLI_split_dirfile(path_dst, path_dir, path_file, FILE_MAXDIR, FILE_MAXFILE); + bpath_data->is_path_modified = true; return true; } @@ -192,6 +202,7 @@ bool BKE_bpath_foreach_path_allocated_process(BPathForeachPathData *bpath_data, if (bpath_data->callback_function(bpath_data, path_dst, path_src)) { MEM_freeN(*path); (*path) = BLI_strdup(path_dst); + bpath_data->is_path_modified = true; return true; } diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c index 1aef42ef037..86f558474cb 100644 --- a/source/blender/blenkernel/intern/sound.c +++ b/source/blender/blenkernel/intern/sound.c @@ -1519,6 +1519,12 @@ void BKE_sound_jack_scene_update(Scene *scene, int mode, double time) void BKE_sound_evaluate(Depsgraph *depsgraph, Main *bmain, bSound *sound) { DEG_debug_print_eval(depsgraph, __func__, sound->id.name, sound); + if (sound->id.recalc & ID_RECALC_SOURCE) { + /* Sequencer checks this flag to see if the strip sound is to be updated from the Audaspace + * side. */ + sound->id.recalc |= ID_RECALC_AUDIO; + } + if (sound->id.recalc & ID_RECALC_AUDIO) { BKE_sound_load(bmain, sound); return; diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index b657d39df69..0e5bcd349c8 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -2970,6 +2970,11 @@ void DepsgraphRelationBuilder::build_sound(bSound *sound) build_idproperties(sound->id.properties); build_animdata(&sound->id); build_parameters(&sound->id); + + const ComponentKey parameters_key(&sound->id, NodeType::PARAMETERS); + const ComponentKey audio_key(&sound->id, NodeType::AUDIO); + + add_relation(parameters_key, audio_key, "Parameters -> Audio"); } void DepsgraphRelationBuilder::build_simulation(Simulation *simulation) _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
