Commit: dc4d03c519f85f83cc0817a5f9420b6305aa6994
Author: Lukas Tönne
Date:   Wed May 20 12:48:28 2015 +0200
Branches: alembic
https://developer.blender.org/rBdc4d03c519f85f83cc0817a5f9420b6305aa6994

Removed the complicated optional refdata handling from the generic
shape key eval function.

This now goes to a dedicated strands function which can be cleaned up
properly, all the old code can function as before.

===================================================================

M       source/blender/blenkernel/BKE_key.h
M       source/blender/blenkernel/intern/key.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_key.h 
b/source/blender/blenkernel/BKE_key.h
index eb665f2..4258901 100644
--- a/source/blender/blenkernel/BKE_key.h
+++ b/source/blender/blenkernel/BKE_key.h
@@ -97,8 +97,8 @@ float **BKE_keyblock_strands_get_per_block_weights(struct 
Strands *strands, stru
 void BKE_keyblock_free_per_block_weights(struct Key *key, float 
**per_keyblock_weights, struct WeightsArrayCache *cache);
 void BKE_key_evaluate_relative(const int start, int end, const int tot, char 
*basispoin, struct Key *key, struct KeyBlock *actkb,
                                float **per_keyblock_weights, const int mode);
-void BKE_key_evaluate_relative_ex(const int start, int end, const int tot, 
char *basispoin, struct Key *key, struct KeyBlock *actkb,
-                                  float **per_keyblock_weights, const int 
mode, char *refdata);
+void BKE_key_evaluate_strands_relative(const int start, int end, const int 
tot, char *basispoin, struct Key *key, struct KeyBlock *actkb,
+                                       float **per_keyblock_weights, const int 
mode, char *refdata);
 
 /* conversion functions */
 /* Note: 'update_from' versions do not (re)allocate mem in kb, while 
'convert_from' do. */
diff --git a/source/blender/blenkernel/intern/key.c 
b/source/blender/blenkernel/intern/key.c
index 7b82cb1..01726ea7 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -765,8 +765,112 @@ static void cp_cu_key(Curve *cu, Key *key, KeyBlock 
*actkb, KeyBlock *kb, const
        }
 }
 
-void BKE_key_evaluate_relative_ex(const int start, int end, const int tot, 
char *basispoin, Key *key, KeyBlock *actkb,
-                                  float **per_keyblock_weights, const int 
mode, char *refdata)
+void BKE_key_evaluate_relative(const int start, int end, const int tot, char 
*basispoin, Key *key, KeyBlock *actkb,
+                               float **per_keyblock_weights, const int mode)
+{
+       KeyBlock *kb;
+       int *ofsp, ofs[3], elemsize, b;
+       char *poin, *reffrom, *from;
+       char elemstr[8];
+       int poinsize, keyblock_index;
+
+       /* currently always 0, in future key_pointer_size may assign */
+       ofs[1] = 0;
+
+       if (!key_pointer_size(key, mode, &poinsize, &ofs[0]))
+               return;
+
+       if (end > tot) end = tot;
+
+       /* in case of beztriple */
+       elemstr[0] = 1;              /* nr of ipofloats */
+       elemstr[1] = IPO_BEZTRIPLE;
+       elemstr[2] = 0;
+
+       /* just here, not above! */
+       elemsize = key->elemsize;
+       if (mode == KEY_MODE_BEZTRIPLE) elemsize *= 3;
+
+       /* step 1 init */
+       cp_key(start, end, tot, basispoin, key, actkb, key->refkey, NULL, mode, 
NULL);
+       
+       /* step 2: do it */
+       
+       for (kb = key->block.first, keyblock_index = 0; kb; kb = kb->next, 
keyblock_index++) {
+               if (kb != key->refkey) {
+                       float icuval = kb->curval;
+                       
+                       /* only with value, and no difference allowed */
+                       if (!(kb->flag & KEYBLOCK_MUTE) && icuval != 0.0f && 
kb->totelem == tot) {
+                               float weight, *weights = per_keyblock_weights ? 
per_keyblock_weights[keyblock_index] : NULL;
+                               char *freefrom = NULL, *freereffrom = NULL;
+
+                               poin = basispoin;
+                               from = key_block_get_data(key, actkb, kb, 
&freefrom);
+                               {
+                                       /* reference now can be any block */
+                                       KeyBlock *refb = 
BLI_findlink(&key->block, kb->relative);
+                                       if (refb == NULL) continue;
+                                       
+                                       reffrom = key_block_get_data(key, 
actkb, refb, &freereffrom);
+                               }
+
+                               poin += start * poinsize;
+                               reffrom += key->elemsize * start;  // key 
elemsize yes!
+                               from += key->elemsize * start;
+                               
+                               for (b = start; b < end; b++) {
+                                       char *cp;
+                               
+                                       weight = weights ? (*weights * icuval) 
: icuval;
+                                       
+                                       cp = key->elemstr;
+                                       if (mode == KEY_MODE_BEZTRIPLE) cp = 
elemstr;
+                                       
+                                       ofsp = ofs;
+                                       
+                                       while (cp[0]) {  /* (cp[0] == amount) */
+                                               
+                                               switch (cp[1]) {
+                                                       case IPO_FLOAT:
+                                                               rel_flerp(3, 
(float *)poin, (float *)reffrom, (float *)from, weight);
+                                                               break;
+                                                       case IPO_BPOINT:
+                                                               rel_flerp(4, 
(float *)poin, (float *)reffrom, (float *)from, weight);
+                                                               break;
+                                                       case IPO_BEZTRIPLE:
+                                                               rel_flerp(12, 
(float *)poin, (float *)reffrom, (float *)from, weight);
+                                                               break;
+                                                       default:
+                                                               /* should never 
happen */
+                                                               if (freefrom) 
MEM_freeN(freefrom);
+                                                               if 
(freereffrom) MEM_freeN(freereffrom);
+                                                               
BLI_assert(!"invalid 'cp[1]'");
+                                                               return;
+                                               }
+
+                                               poin += *ofsp;
+                                               
+                                               cp += 2;
+                                               ofsp++;
+                                       }
+                                       
+                                       reffrom += elemsize;
+                                       from += elemsize;
+                                       
+                                       if (mode == KEY_MODE_BEZTRIPLE) b += 2;
+                                       if (weights) weights++;
+                               }
+
+                               if (freefrom) MEM_freeN(freefrom);
+                               if (freereffrom) MEM_freeN(freereffrom);
+                       }
+               }
+       }
+}
+
+void BKE_key_evaluate_strands_relative(const int start, int end, const int 
tot, char *basispoin, Key *key, KeyBlock *actkb,
+                                       float **per_keyblock_weights, const int 
mode, char *refdata)
 {
        KeyBlock *kb;
        int *ofsp, ofs[3], elemsize, b;
@@ -884,12 +988,6 @@ void BKE_key_evaluate_relative_ex(const int start, int 
end, const int tot, char
        if (freekeyreffrom) MEM_freeN(freekeyreffrom);
 }
 
-void BKE_key_evaluate_relative(const int start, int end, const int tot, char 
*basispoin, Key *key, KeyBlock *actkb,
-                               float **per_keyblock_weights, const int mode)
-{
-       BKE_key_evaluate_relative_ex(start, end, tot, basispoin, key, actkb, 
per_keyblock_weights, mode, NULL);
-}
-
 static void do_key(const int start, int end, const int tot, char *poin, Key 
*key, KeyBlock *actkb, KeyBlock **k, float *t, const int mode)
 {
        float k1tot = 0.0, k2tot = 0.0, k3tot = 0.0, k4tot = 0.0;
@@ -1498,7 +1596,7 @@ static void do_strands_key(Strands *strands, Key *key, 
KeyBlock *actkb, char *ou
                WeightsArrayCache cache = {0, NULL};
                float **per_keyblock_weights ;
                per_keyblock_weights = 
BKE_keyblock_strands_get_per_block_weights(strands, key, &cache);
-               BKE_key_evaluate_relative_ex(0, tot, tot, (char *)out, key, 
actkb, per_keyblock_weights, KEY_MODE_DUMMY, out);
+               BKE_key_evaluate_strands_relative(0, tot, tot, (char *)out, 
key, actkb, per_keyblock_weights, KEY_MODE_DUMMY, out);
                BKE_keyblock_free_per_block_weights(key, per_keyblock_weights, 
&cache);
        }
        else {

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

Reply via email to