Fix #107956: Simulation reset on fps change
Resets simulation cache when frame rate changes, so we don't get inconsistent accumulations when frame rate is changed in the middle of the simulation. Pull Request: https://projects.blender.org/blender/blender/pulls/108004
This commit is contained in:
parent
c8ed927eac
commit
397663a7cb
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user