Revision: 16602
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16602
Author:   theeth
Date:     2008-09-18 23:45:57 +0200 (Thu, 18 Sep 2008)

Log Message:
-----------
Memoization: Remove need to keep full position lists on each node.

Modified Paths:
--------------
    branches/harmonic-skeleton/source/blender/src/autoarmature.c

Modified: branches/harmonic-skeleton/source/blender/src/autoarmature.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/autoarmature.c        
2008-09-18 21:18:53 UTC (rev 16601)
+++ branches/harmonic-skeleton/source/blender/src/autoarmature.c        
2008-09-18 21:45:57 UTC (rev 16602)
@@ -168,7 +168,7 @@
 
 typedef struct MemoNode {
        float   weight;
-       int             *positions;
+       int     next;
 } MemoNode;
 
 typedef struct RetargetParam {
@@ -1931,17 +1931,26 @@
        return 1;
 }
 
-static void copyMemoNode(MemoNode *dst, MemoNode *src, int size)
+static int indexMemoNode(int nb_positions, int previous, int current, int 
joints_left)
 {
-       if (size > 0)
-       {
-               memcpy(dst->positions + 1, src->positions, size * sizeof(int));
-       }
+       return joints_left * nb_positions * nb_positions + current * 
nb_positions + previous;
 }
 
-static int indexMemoNode(int nb_positions, int previous, int current, int 
joints_done)
+static void copyMemoPositions(int *positions, MemoNode *table, int 
nb_positions, int joints_left)
 {
-       return joints_done * nb_positions * nb_positions + current * 
nb_positions + previous;
+       int previous = 0, current = 0;
+       int i = 0;
+       
+       for (i = 0; joints_left > 0; joints_left--, i++)
+       {
+               MemoNode *node;
+               node = table + indexMemoNode(nb_positions, previous, current, 
joints_left);
+               
+               positions[i] = node->next;
+               
+               previous = current;
+               current = node->next;
+       }
 }
 
 static MemoNode * solveJoints(MemoNode *table, ReebArcIterator *iter, float 
**vec_cache, int nb_joints, int nb_positions, int previous, int current, 
RigEdge *edge, int joints_left)
@@ -2001,15 +2010,12 @@
                
                if (min_node)
                {
-                       node->positions = MEM_callocN(sizeof(int) * 
joints_left, "Memoization indexes array");
                        node->weight = min_weight;
-                       copyMemoNode(node, min_node, joints_left - 1);
-                       node->positions[0] = min_next;
+                       node->next = min_next;
                        return node;
                }
                else
                {
-                       node->positions = MEM_callocN(sizeof(int) * 
joints_left, "Memoization indexes array");
                        node->weight = MAX_COST;
                        return node;
                }
@@ -2112,16 +2118,8 @@
                result = solveJoints(table, &iter, positions_cache, nb_joints, 
earc->bcount, 0, 0, iarc->edges.first, nb_joints);
                
                min_cost = result->weight;
-               memcpy(best_positions, result->positions, sizeof(int) * 
nb_joints);
+               copyMemoPositions(best_positions, table, earc->bcount, 
nb_joints);
                
-               for ( i = 0; i < nb_memo_nodes; i++)
-               {
-                       if (table[i].positions)
-                       {
-                               MEM_freeN(table[i].positions);
-                       }
-               }
-               
                MEM_freeN(table);
                MEM_freeN(positions_cache);
        }


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

Reply via email to