Revision: 26543
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26543
Author:   campbellbarton
Date:     2010-02-02 12:10:02 +0100 (Tue, 02 Feb 2010)

Log Message:
-----------
editing the basis shape now updates others when relative is enabled.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/mesh/editmesh.c

Modified: trunk/blender/source/blender/editors/mesh/editmesh.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh.c        2010-02-02 
06:11:35 UTC (rev 26542)
+++ trunk/blender/source/blender/editors/mesh/editmesh.c        2010-02-02 
11:10:02 UTC (rev 26543)
@@ -1195,11 +1195,40 @@
                KeyBlock *currkey;
                KeyBlock *actkey= BLI_findlink(&me->key->block, em->shapenr-1);
 
+               float (*ofs)[3] = NULL;
+
+               /* editing the base key should update others */
+               if(me->key->type==KEY_RELATIVE && oldverts) {
+                       int act_is_basis = 0;
+                       /* find if this key is a basis for any others */
+                       for(currkey = me->key->block.first; currkey; currkey= 
currkey->next) {
+                               if(em->shapenr-1 == currkey->relative) {
+                                       act_is_basis = 1;
+                                       break;
+                               }
+                       }
+
+                       if(act_is_basis) { /* active key is a base */
+                               i=0;
+                               ofs= MEM_callocN(sizeof(float) * 3 * 
em->totvert,  "currkey->data");
+                               eve= em->verts.first;
+                               mvert = me->mvert;
+                               while(eve) {
+                                       VECSUB(ofs[i], mvert->co, 
oldverts[eve->keyindex].co);
+                                       eve= eve->next;
+                                       i++;
+                                       mvert++;
+                               }
+                       }
+               }
+
+
                /* Lets reorder the key data so that things line up roughly
                 * with the way things were before editmode */
                currkey = me->key->block.first;
                while(currkey) {
-                       
+                       int apply_offset = (ofs && (currkey != actkey) && 
(em->shapenr-1 == currkey->relative));
+
                        fp= newkey= MEM_callocN(me->key->elemsize*em->totvert,  
"currkey->data");
                        oldkey = currkey->data;
 
@@ -1229,6 +1258,12 @@
                                else {
                                        VECCOPY(fp, mvert->co);
                                }
+
+                               /* propagate edited basis offsets to other 
shapes */
+                               if(apply_offset) {
+                                       VECADD(fp, fp, ofs[i]);
+                               }
+
                                fp+= 3;
                                ++i;
                                ++mvert;
@@ -1240,6 +1275,8 @@
                        
                        currkey= currkey->next;
                }
+
+               if(ofs) MEM_freeN(ofs);
        }
 
        if(oldverts) MEM_freeN(oldverts);


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to