Bugfix:
authorJoshua Leung <aligorith@gmail.com>
Tue, 30 Sep 2008 11:52:59 +0000 (11:52 +0000)
committerJoshua Leung <aligorith@gmail.com>
Tue, 30 Sep 2008 11:52:59 +0000 (11:52 +0000)
Keyframing from Buttons Window was broken for Materials/Lamps/Worlds due to a mixup regarding the correct adrcodes for texture-slots.

source/blender/blenkernel/intern/ipo.c
source/blender/include/BIF_keyframing.h
source/blender/src/editipo.c
source/blender/src/keyframing.c

index 8211899b7ce5856e2155a1bf6dc24fe36fea19e1..a115ac39e1ab94ba394ff4131710000061013e34 100644 (file)
@@ -1903,7 +1903,7 @@ static void *give_tex_poin (Tex *tex, int adrcode, int *type )
 }
 
 /* get texture-slot/mapping channel */
-void *give_mtex_poin (MTex *mtex, int adrcode )
+void *give_mtex_poin (MTex *mtex, int adrcode)
 {
        void *poin= NULL;
        
index 7989e6adb45a7a23a8338ddb4d774a6f3443ad29..5d43a50efec3729428e95605df6883509ee18007 100644 (file)
@@ -49,13 +49,17 @@ int insert_bezt_icu(struct IpoCurve *icu, struct BezTriple *bezt);
 void insert_vert_icu(struct IpoCurve *icu, float x, float y, short flag);
 
 
-/* flags for use in insert_key(), and insert_vert_icu() */
+/* flags for use by keyframe creation/deletion calls */
 enum {
+               /* used by isnertkey() and insert_vert_icu() */
        INSERTKEY_NEEDED        = (1<<0),       /* only insert keyframes where they're needed */
        INSERTKEY_MATRIX        = (1<<1),       /* insert 'visual' keyframes where possible/needed */
        INSERTKEY_FAST          = (1<<2),       /* don't recalculate handles,etc. after adding key */
        INSERTKEY_FASTR         = (1<<3),       /* don't realloc mem (or increase count, as array has already been set out) */
        INSERTKEY_REPLACE       = (1<<4),       /* only replace an existing keyframe (this overrides INSERTKEY_NEEDED) */
+       
+               /* used by common_*key() functions */
+       COMMONKEY_ADDMAP        = (1<<10),      /* common key: add texture-slot offset bitflag to adrcode before use */
 } eInsertKeyFlags;
 
 /* -------- */
index 9a7f8e652a7bcfa1565fc04b86494e677da0a112..617683a6ab45d61364c2779cdb6f73c6723b7df2 100644 (file)
@@ -2022,12 +2022,9 @@ IpoCurve *verify_ipocurve(ID *from, short blocktype, char *actname, char *constn
        /* creates ipo too (if add) */
        ipo= verify_ipo(from, blocktype, actname, constname, bonename, add);
        
-       if (ipo && ipo->id.lib==NULL && from->lib==NULL) {
+       if ((ipo) && (ipo->id.lib==NULL) && (from->lib==NULL)) {
                /* try to find matching curve */
-               for (icu= ipo->curve.first; icu; icu= icu->next) {
-                       if (icu->adrcode==adrcode) 
-                               break;
-               }
+               icu= find_ipocurve(ipo, adrcode);
                
                /* make a new one if none found (and can add) */
                if ((icu==NULL) && (add)) {
index 3c8a06786acd79c21f4eb61f6eadc2332f4143b0..299c5f8e31acccef6caf6bccd4fb2de5521815d6 100644 (file)
@@ -334,7 +334,7 @@ void insert_vert_icu (IpoCurve *icu, float x, float y, short fast)
 
 /* Get pointer to use to get values from */
 // FIXME: this should not be possible with Data-API
-static void *get_context_ipo_poin(ID *id, int blocktype, char *actname, char *constname, IpoCurve *icu, int *vartype)
+static void *get_context_ipo_poin (ID *id, int blocktype, char *actname, char *constname, IpoCurve *icu, int *vartype)
 {
        switch (blocktype) {
                case ID_PO:  /* posechannel */
@@ -755,7 +755,10 @@ short insertkey (ID *id, int blocktype, char *actname, char *constname, int adrc
                
                /* get pointer to data to read from */
                poin= get_context_ipo_poin(id, blocktype, actname, constname, icu, &vartype);
-               if (poin == NULL) return 0;
+               if (poin == NULL) {
+                       printf("Insert Key: No pointer to variable obtained \n");
+                       return 0;
+               }
                
                /* obtain value to give keyframe */
                if ( (flag & INSERTKEY_MATRIX) && 
@@ -1049,10 +1052,10 @@ bKeyingSet defks_buts_shading_mat[] =
        
        {NULL, "%l", 0, -1, 0, {0}}, // separator
        
-       {NULL, "Ofs", ID_MA, 0, 3, {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z}},
-       {NULL, "Size", ID_MA, 0, 3, {MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z}},
+       {NULL, "Ofs", ID_MA, COMMONKEY_ADDMAP, 3, {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z}},
+       {NULL, "Size", ID_MA, COMMONKEY_ADDMAP, 3, {MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z}},
        
-       {NULL, "All Mapping", ID_MA, 0, 14, 
+       {NULL, "All Mapping", ID_MA, COMMONKEY_ADDMAP, 14, 
                {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z,
                 MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z,
                 MAP_R,MAP_G,MAP_B,MAP_DVAR,
@@ -1080,10 +1083,10 @@ bKeyingSet defks_buts_shading_wo[] =
        
        {NULL, "%l", 0, -1, 0, {0}}, // separator
        
-       {NULL, "Ofs", ID_WO, 0, 3, {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z}},
-       {NULL, "Size", ID_WO, 0, 3, {MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z}},
+       {NULL, "Ofs", ID_WO, COMMONKEY_ADDMAP, 3, {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z}},
+       {NULL, "Size", ID_WO, COMMONKEY_ADDMAP, 3, {MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z}},
        
-       {NULL, "All Mapping", ID_WO, 0, 14, 
+       {NULL, "All Mapping", ID_WO, COMMONKEY_ADDMAP, 14, 
                {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z,
                 MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z,
                 MAP_R,MAP_G,MAP_B,MAP_DVAR,
@@ -1106,10 +1109,10 @@ bKeyingSet defks_buts_shading_la[] =
        
        {NULL, "%l", 0, -1, 0, {0}}, // separator
        
-       {NULL, "Ofs", ID_LA, 0, 3, {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z}},
-       {NULL, "Size", ID_LA, 0, 3, {MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z}},
+       {NULL, "Ofs", ID_LA, COMMONKEY_ADDMAP, 3, {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z}},
+       {NULL, "Size", ID_LA, COMMONKEY_ADDMAP, 3, {MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z}},
        
-       {NULL, "All Mapping", ID_LA, 0, 14, 
+       {NULL, "All Mapping", ID_LA, COMMONKEY_ADDMAP, 14, 
                {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z,
                 MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z,
                 MAP_R,MAP_G,MAP_B,MAP_DVAR,
@@ -1362,71 +1365,79 @@ static void commonkey_context_getsbuts (ListBase *sources, bKeyingContext **ksc)
                        {
                                Material *ma= editnode_get_active_material(G.buts->lockpoin);
                                
-                               /* add new keyframing destination */
-                               cks= MEM_callocN(sizeof(bCommonKeySrc), "bCommonKeySrc");
-                               BLI_addtail(sources, cks); 
-                               
-                               /* set data */
-                               cks->id= (ID *)ma;
-                               cks->ipo= ma->ipo;
-                               cks->map= texchannel_to_adrcode(ma->texact);
-                               
-                               /* set keyingsets */
-                               *ksc= &ks_contexts[KSC_BUTS_MAT];
-                               return;
+                               if (ma) {
+                                       /* add new keyframing destination */
+                                       cks= MEM_callocN(sizeof(bCommonKeySrc), "bCommonKeySrc");
+                                       BLI_addtail(sources, cks); 
+                                       
+                                       /* set data */
+                                       cks->id= (ID *)ma;
+                                       cks->ipo= ma->ipo;
+                                       cks->map= texchannel_to_adrcode(ma->texact);
+                                       
+                                       /* set keyingsets */
+                                       *ksc= &ks_contexts[KSC_BUTS_MAT];
+                                       return;
+                               }
                        }
                                break;
                        case TAB_SHADING_WORLD: /* >------------- World Tab -------------< */
                        {
                                World *wo= G.buts->lockpoin;
                                
-                               /* add new keyframing destination */
-                               cks= MEM_callocN(sizeof(bCommonKeySrc), "bCommonKeySrc");
-                               BLI_addtail(sources, cks); 
-                               
-                               /* set data */
-                               cks->id= (ID *)wo;
-                               cks->ipo= wo->ipo;
-                               cks->map= texchannel_to_adrcode(wo->texact);
-                               
-                               /* set keyingsets */
-                               *ksc= &ks_contexts[KSC_BUTS_WO];
-                               return;
+                               if (wo) {
+                                       /* add new keyframing destination */
+                                       cks= MEM_callocN(sizeof(bCommonKeySrc), "bCommonKeySrc");
+                                       BLI_addtail(sources, cks); 
+                                       
+                                       /* set data */
+                                       cks->id= (ID *)wo;
+                                       cks->ipo= wo->ipo;
+                                       cks->map= texchannel_to_adrcode(wo->texact);
+                                       
+                                       /* set keyingsets */
+                                       *ksc= &ks_contexts[KSC_BUTS_WO];
+                                       return;
+                               }
                        }
                                break;
                        case TAB_SHADING_LAMP: /* >------------- Lamp Tab -------------< */
                        {
                                Lamp *la= G.buts->lockpoin;
                                
-                               /* add new keyframing destination */
-                               cks= MEM_callocN(sizeof(bCommonKeySrc), "bCommonKeySrc");
-                               BLI_addtail(sources, cks); 
-                               
-                               /* set data */
-                               cks->id= (ID *)la;
-                               cks->ipo= la->ipo;
-                               cks->map= texchannel_to_adrcode(la->texact);
-                               
-                               /* set keyingsets */
-                               *ksc= &ks_contexts[KSC_BUTS_LA];
-                               return;
+                               if (la) {
+                                       /* add new keyframing destination */
+                                       cks= MEM_callocN(sizeof(bCommonKeySrc), "bCommonKeySrc");
+                                       BLI_addtail(sources, cks); 
+                                       
+                                       /* set data */
+                                       cks->id= (ID *)la;
+                                       cks->ipo= la->ipo;
+                                       cks->map= texchannel_to_adrcode(la->texact);
+                                       
+                                       /* set keyingsets */
+                                       *ksc= &ks_contexts[KSC_BUTS_LA];
+                                       return;
+                               }
                        }
                                break;
                        case TAB_SHADING_TEX: /* >------------- Texture Tab -------------< */
                        {
                                Tex *tex= G.buts->lockpoin;
                                
-                               /* add new keyframing destination */
-                               cks= MEM_callocN(sizeof(bCommonKeySrc), "bCommonKeySrc");
-                               BLI_addtail(sources, cks); 
-                               
-                               /* set data */
-                               cks->id= (ID *)tex;
-                               cks->ipo= tex->ipo;
-                               
-                               /* set keyingsets */
-                               *ksc= &ks_contexts[KSC_BUTS_TEX];
-                               return;
+                               if (tex) {
+                                       /* add new keyframing destination */
+                                       cks= MEM_callocN(sizeof(bCommonKeySrc), "bCommonKeySrc");
+                                       BLI_addtail(sources, cks); 
+                                       
+                                       /* set data */
+                                       cks->id= (ID *)tex;
+                                       cks->ipo= tex->ipo;
+                                       
+                                       /* set keyingsets */
+                                       *ksc= &ks_contexts[KSC_BUTS_TEX];
+                                       return;
+                               }
                        }
                                break;
                }
@@ -1785,7 +1796,7 @@ void common_modifykey (short mode)
                                 *      - certain adrcodes (for MTEX channels need special offsets)     // BAD CRUFT!!!
                                 */
                                adrcode= ks->adrcodes[i];
-                               if (ELEM3(ks->blocktype, ID_MA, ID_LA, ID_WO)) {
+                               if (ELEM3(ks->blocktype, ID_MA, ID_LA, ID_WO) && (ks->flag & COMMONKEY_ADDMAP)) {
                                        switch (adrcode) {
                                                case MAP_OFS_X: case MAP_OFS_Y: case MAP_OFS_Z:
                                                case MAP_SIZE_X: case MAP_SIZE_Y: case MAP_SIZE_Z:
@@ -1800,6 +1811,7 @@ void common_modifykey (short mode)
                                if (mode == COMMONKEY_MODE_DELETE) {
                                        /* local flags only add on to global flags */
                                        flag = 0;
+                                       //flag &= ~COMMONKEY_ADDMAP;
                                        
                                        /* delete keyframe */
                                        success += deletekey(cks->id, ks->blocktype, cks->actname, cks->constname, adrcode, flag);
@@ -1810,6 +1822,7 @@ void common_modifykey (short mode)
                                        if (IS_AUTOKEY_FLAG(AUTOMATKEY)) flag |= INSERTKEY_MATRIX;
                                        if (IS_AUTOKEY_FLAG(INSERTNEEDED)) flag |= INSERTKEY_NEEDED;
                                        // if (IS_AUTOKEY_MODE(EDITKEYS)) flag |= INSERTKEY_REPLACE;
+                                       flag &= ~COMMONKEY_ADDMAP;
                                        
                                        /* insert keyframe */
                                        success += insertkey(cks->id, ks->blocktype, cks->actname, cks->constname, adrcode, flag);