diff --git a/source/blender/blenkernel/BKE_simulation.h b/source/blender/blenkernel/BKE_simulation.h index 3d6ac8ffc2e..a300a299cea 100644 --- a/source/blender/blenkernel/BKE_simulation.h +++ b/source/blender/blenkernel/BKE_simulation.h @@ -17,6 +17,8 @@ void BKE_simulation_data_update(struct Depsgraph *depsgraph, struct Scene *scene, struct Simulation *simulation); +void BKE_simulation_reset_scene(Scene *scene); + #ifdef __cplusplus } #endif diff --git a/source/blender/blenkernel/BKE_simulation_state.hh b/source/blender/blenkernel/BKE_simulation_state.hh index 63d514d3a91..5becf216c2c 100644 --- a/source/blender/blenkernel/BKE_simulation_state.hh +++ b/source/blender/blenkernel/BKE_simulation_state.hh @@ -162,6 +162,8 @@ class ModifierSimulationCache { CacheState cache_state_ = CacheState::Valid; bool failed_finding_bake_ = false; + float last_fps_ = 0.0f; + void try_discover_bake(StringRefNull absolute_bake_dir); bool has_state_at_frame(const SubFrame &frame) const; diff --git a/source/blender/blenkernel/intern/simulation.cc b/source/blender/blenkernel/intern/simulation.cc index 9b234bbc524..342596a3346 100644 --- a/source/blender/blenkernel/intern/simulation.cc +++ b/source/blender/blenkernel/intern/simulation.cc @@ -10,6 +10,7 @@ #include "DNA_ID.h" #include "DNA_defaults.h" +#include "DNA_modifier_types.h" #include "DNA_scene_types.h" #include "DNA_simulation_types.h" @@ -24,15 +25,18 @@ #include "BKE_anim_data.h" #include "BKE_animsys.h" +#include "BKE_collection.h" #include "BKE_customdata.h" #include "BKE_idtype.h" #include "BKE_lib_id.h" #include "BKE_lib_query.h" #include "BKE_lib_remap.h" #include "BKE_main.h" +#include "BKE_modifier.h" #include "BKE_node.hh" #include "BKE_pointcache.h" #include "BKE_simulation.h" +#include "BKE_simulation_state.hh" #include "NOD_geometry.h" @@ -181,3 +185,17 @@ void BKE_simulation_data_update(Depsgraph * /*depsgraph*/, Simulation * /*simulation*/) { } + +void BKE_simulation_reset_scene(Scene *scene) +{ + FOREACH_SCENE_OBJECT_BEGIN (scene, ob) { + LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) { + if (md->type != eModifierType_Nodes) { + continue; + } + NodesModifierData *nmd = (NodesModifierData *)md; + nmd->simulation_cache->reset(); + } + } + FOREACH_SCENE_OBJECT_END; +} diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 6b6783ba593..7f5bb7e678c 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -712,6 +712,7 @@ static const EnumPropertyItem snap_to_items[] = { # include "BKE_pointcache.h" # include "BKE_scene.h" # include "BKE_screen.h" +# include "BKE_simulation.h" # include "BKE_unit.h" # include "NOD_composite.h" @@ -930,6 +931,8 @@ static void rna_Scene_fps_update(Main *bmain, Scene *UNUSED(active_scene), Point * however, changes in FPS actually modifies an original skip length, * so this we take care about here. */ SEQ_sound_update_length(bmain, scene); + /* Reset simulation states because new frame interval doesn't apply anymore. */ + BKE_simulation_reset_scene(scene); } static void rna_Scene_listener_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)