rigidbody: Fix motion paths calculation being incorrect for rigid bodies

For the simulation to work properly the limited update the motion paths
calculation did wasn't enough so you got different results for for
motion paths than for the actual simulation.
Now do full frame update if rigid body sim is active.

TODO investigate if we can still limit this.
This commit is contained in:
Sergej Reich 2013-02-23 23:04:10 +00:00
parent c82213359a
commit 92f9db6628

@ -69,7 +69,6 @@
#include "BKE_depsgraph.h" #include "BKE_depsgraph.h"
#include "BKE_anim.h" #include "BKE_anim.h"
#include "BKE_report.h" #include "BKE_report.h"
#include "BKE_rigidbody.h"
// XXX bad level call... // 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) static void motionpaths_calc_update_scene(Scene *scene)
{ {
#if 1 // 'production' optimizations always on #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 */ /* rigid body simulation needs complete update to work correctly for now */
DAG_scene_update_flags(G.main, scene, scene->lay, TRUE); /* RB_TODO investigate if we could avoid updating everything */
if (BKE_scene_check_rigidbody_active(scene)) {
/* find the last object with the tag BKE_scene_update_for_newframe(G.main, scene, scene->lay);
* - 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;
} }
else { /* otherwise we can optimize by restricting updates */
Base *base, *last = NULL;
/* run rigidbody sim /* only stuff that moves or needs display still */
* NOTE: keep in sync with BKE_scene_update_for_newframe() in scene.c DAG_scene_update_flags(G.main, scene, scene->lay, TRUE);
*/
// 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 */ /* find the last object with the tag
/* XXX: this will break if rigs depend on scene or other data that * - all those afterwards are assumed to not be relevant for our calculations
* is animated but not attached to/updatable from objects */ */
for (base = scene->base.first; base; base = base->next) { /* optimize further by moving out... */
/* update this object */ for (base = scene->base.first; base; base = base->next) {
BKE_object_handle_update(scene, base->object); if (base->object->flag & BA_TEMP_TAG)
last = base;
}
/* if this is the last one we need to update, let's stop to save some time */ /* perform updates for tagged objects */
if (base == last) /* XXX: this will break if rigs depend on scene or other data that
break; * 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 #else // original, 'always correct' version
/* do all updates /* do all updates