Feature: Sofbody bake "Local"
authorTon Roosendaal <ton@blender.org>
Wed, 1 Mar 2006 23:45:25 +0000 (23:45 +0000)
committerTon Roosendaal <ton@blender.org>
Wed, 1 Mar 2006 23:45:25 +0000 (23:45 +0000)
Sofbody simulation happens in global coordinate space, and this was also
used for baking softbodies. Too bad you cannot re-use or further animate
the baked softbody then... :)

If you now use the new "Local" button in the Bake menu, it will allow to
animate or move the baked object.

source/blender/blenkernel/intern/softbody.c
source/blender/makesdna/DNA_object_force.h
source/blender/src/buttons_object.c

index 40f0f0ec6bb9d17ef017a95f0ba5089b939daf83..0bbd7d3496da998f61822eb52f399b3cd4336ee7 100644 (file)
@@ -1570,7 +1570,7 @@ static void curve_surf_to_softbody(Object *ob)
 
 
 /* copies softbody result back in object */
-static void softbody_to_object(Object *ob, float (*vertexCos)[3], int numVerts)
+static void softbody_to_object(Object *ob, float (*vertexCos)[3], int numVerts, int local)
 {
        BodyPoint *bp= ob->soft->bpoint;
        int a;
@@ -1580,7 +1580,8 @@ static void softbody_to_object(Object *ob, float (*vertexCos)[3], int numVerts)
        
        for(a=0; a<numVerts; a++, bp++) {
                VECCOPY(vertexCos[a], bp->pos);
-               Mat4MulVecfl(ob->imat, vertexCos[a]);   /* softbody is in global coords */
+               if(local==0) 
+                       Mat4MulVecfl(ob->imat, vertexCos[a]);   /* softbody is in global coords, baked optionally not */
        }
 }
 
@@ -1637,7 +1638,7 @@ static int softbody_baked_step(Object *ob, float framenr, float (*vertexCos)[3],
                bp->pos[2]= data[0]*key0->vec[2] +  data[1]*key1->vec[2] + data[2]*key2->vec[2] + data[3]*key3->vec[2];
        }
        
-       softbody_to_object(ob, vertexCos, numVerts);
+       softbody_to_object(ob, vertexCos, numVerts, sb->local);
        
        return 1;
 }
@@ -1666,6 +1667,9 @@ static void softbody_baked_add(Object *ob, float framenr)
                sb->keys= MEM_callocN( sizeof(void *)*sb->totkey, "sb keys");
        }
        
+       /* inverse matrix might not be uptodate... */
+       Mat4Invert(ob->imat, ob->obmat);
+       
        /* now find out if we have to store a key */
        
        /* offset in keys array */
@@ -1685,6 +1689,8 @@ static void softbody_baked_add(Object *ob, float framenr)
                        
                        for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++, key++) {
                                VECCOPY(key->vec, bp->pos);
+                               if(sb->local)
+                                       Mat4MulVecfl(ob->imat, key->vec);
                        }
                }
        }
@@ -1924,7 +1930,7 @@ void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3], int numVerts
                free_sumo_handles();
        }
 
-       softbody_to_object(ob, vertexCos, numVerts);
+       softbody_to_object(ob, vertexCos, numVerts, 0);
        sb->ctime= ctime;
 
        
index 03487f478f9680277eda84b73afb82b2aa47834f..35cb4ecbf8bc46eb94a7d31fd044da3449188572 100644 (file)
@@ -92,7 +92,8 @@ typedef struct SoftBody {
        
        /* baking */
        int sfra, efra;
-       int interval, pad2;
+       int interval;
+       short local, pad2;              /* local==1: use local coords for baking */
        
        SBVertex **keys;                        /* array of size totpointkey */
        int totpointkey, totkey;        /* if totpointkey != totpoint or totkey!- (efra-sfra)/interval -> free keys */
index f584109db8177c0229ba7c05ded132cd4a492ecc..76c09fac7eb80233c8217a40df5322c7db42af85 100644 (file)
@@ -2056,10 +2056,13 @@ static void object_softbodies(Object *ob)
                        uiDefButI(block, NUM, B_DIFF, "Start:",                 10, 170,100,20, &sb->sfra, 1.0, 10000.0, 10, 0, "Start frame for baking");
                        uiDefButI(block, NUM, B_DIFF, "End:",                   110, 170,100,20, &sb->efra, 1.0, 10000.0, 10, 0, "End frame for baking");
                        uiDefButI(block, NUM, B_DIFF, "Interval:",              210, 170,100,20, &sb->interval, 1.0, 10.0, 10, 0, "Interval in frames between baked keys");
+                       uiBlockEndAlign(block);
                        
-                       uiClearButLock();
+                       uiDefButS(block, TOG, B_DIFF, "Local",                  10, 145,100,20, &sb->local, 0.0, 0.0, 0, 0, "Use local coordinates for baking");
                        
+                       uiClearButLock();
                        uiBlockBeginAlign(block);
+                       
                        if(sb->keys) {
                                char str[128];
                                uiDefIconTextBut(block, BUT, B_SOFTBODY_BAKE_FREE, ICON_X, "FREE BAKE", 10, 120,300,20, NULL, 0.0, 0.0, 0, 0, "Free baked result");