diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c index 50fe1f7a433..4eb26e81ae2 100644 --- a/source/blender/blenkernel/intern/anim.c +++ b/source/blender/blenkernel/intern/anim.c @@ -69,7 +69,6 @@ #include "BKE_depsgraph.h" #include "BKE_anim.h" #include "BKE_report.h" -#include "BKE_rigidbody.h" // XXX bad level call... @@ -327,39 +326,38 @@ static void motionpaths_calc_optimise_depsgraph(Scene *scene, ListBase *targets) static void motionpaths_calc_update_scene(Scene *scene) { #if 1 // 'production' optimizations always on - Base *base, *last = NULL; - float ctime = BKE_scene_frame_get(scene); - - /* only stuff that moves or needs display still */ - DAG_scene_update_flags(G.main, scene, scene->lay, TRUE); - - /* find the last object with the tag - * - all those afterwards are assumed to not be relevant for our calculations - */ - /* optimize further by moving out... */ - for (base = scene->base.first; base; base = base->next) { - if (base->object->flag & BA_TEMP_TAG) - last = base; + + /* rigid body simulation needs complete update to work correctly for now */ + /* RB_TODO investigate if we could avoid updating everything */ + if (BKE_scene_check_rigidbody_active(scene)) { + BKE_scene_update_for_newframe(G.main, scene, scene->lay); } - - /* run rigidbody sim - * NOTE: keep in sync with BKE_scene_update_for_newframe() in scene.c - */ - // XXX: this position may still change, objects not being updated correctly before simulation is run - // NOTE: current position is so that rigidbody sim affects other objects - if (BKE_scene_check_rigidbody_active(scene)) - BKE_rigidbody_do_simulation(scene, ctime); - - /* perform updates for tagged objects */ - /* XXX: this will break if rigs depend on scene or other data that - * is animated but not attached to/updatable from objects */ - for (base = scene->base.first; base; base = base->next) { - /* update this object */ - BKE_object_handle_update(scene, base->object); + else { /* otherwise we can optimize by restricting updates */ + Base *base, *last = NULL; - /* if this is the last one we need to update, let's stop to save some time */ - if (base == last) - break; + /* only stuff that moves or needs display still */ + DAG_scene_update_flags(G.main, scene, scene->lay, TRUE); + + /* find the last object with the tag + * - all those afterwards are assumed to not be relevant for our calculations + */ + /* optimize further by moving out... */ + for (base = scene->base.first; base; base = base->next) { + if (base->object->flag & BA_TEMP_TAG) + last = base; + } + + /* perform updates for tagged objects */ + /* XXX: this will break if rigs depend on scene or other data that + * is animated but not attached to/updatable from objects */ + for (base = scene->base.first; base; base = base->next) { + /* update this object */ + BKE_object_handle_update(scene, base->object); + + /* if this is the last one we need to update, let's stop to save some time */ + if (base == last) + break; + } } #else // original, 'always correct' version /* do all updates