fixing minor issues
authorJens Ole Wund <bjornmose@gmx.net>
Mon, 2 Nov 2009 23:42:08 +0000 (23:42 +0000)
committerJens Ole Wund <bjornmose@gmx.net>
Mon, 2 Nov 2009 23:42:08 +0000 (23:42 +0000)
such as ignoring forward timing rule

source/blender/blenkernel/intern/softbody.c

index a17b4b0be68118e8e5d1923e9a8baa0363ad3510..599630fe0a0228fbef781184061ac55bf3e3f66d 100644 (file)
@@ -3769,7 +3769,13 @@ static void softbody_step(Scene *scene, Object *ob, SoftBody *sb, float dtime)
 {
        /* the simulator */
        float forcetime;
-       double sct,sst=PIL_check_seconds_timer();
+       double sct,sst;
+               
+               
+       sst=PIL_check_seconds_timer();
+       /* integration back in time is possible in theory, but pretty useless here 
+       so refuse to do so */
+       if(dtime < 0) return; 
        
        ccd_update_deflector_hash(scene, ob, sb->scratch->colliderhash);
 
@@ -3784,8 +3790,8 @@ static void softbody_step(Scene *scene, Object *ob, SoftBody *sb, float dtime)
                /* special case of 2nd order Runge-Kutta type AKA Heun */
                int mid_flags=0;
                float err = 0;
-               float forcetimemax = 1.0f;
-               float forcetimemin = 0.001f;
+               float forcetimemax = 1.0f; /* set defaults guess we shall do one frame */
+               float forcetimemin = 0.01f; /* set defaults guess 1/100 is tight enough */
                float timedone =0.0; /* how far did we get without violating error condition */
                                                         /* loops = counter for emergency brake
                                                         * we don't want to lock up the system if physics fail
@@ -3793,13 +3799,12 @@ static void softbody_step(Scene *scene, Object *ob, SoftBody *sb, float dtime)
                int loops =0 ; 
                
                SoftHeunTol = sb->rklimit; /* humm .. this should be calculated from sb parameters and sizes */
-               if (sb->minloops > 0) forcetimemax = 1.0f / sb->minloops;
-               
-               if (sb->maxloops > 0) forcetimemin = 1.0f / sb->maxloops;
+               /* adjust loop limits */
+               if (sb->minloops > 0) forcetimemax = dtime / sb->minloops;
+               if (sb->maxloops > 0) forcetimemin = dtime / sb->maxloops;
 
                if(sb->solver_ID>0) mid_flags |= MID_PRESERVE;
                
-               //forcetime = dtime; /* hope for integrating in one step */
                forcetime =forcetimemax; /* hope for integrating in one step */
                while ( (ABS(timedone) < ABS(dtime)) && (loops < 2000) )
                {