Revision: 15492
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15492
Author:   theeth
Date:     2008-07-08 21:34:20 +0200 (Tue, 08 Jul 2008)

Log Message:
-----------
Rename some struct members to reduce confusion
Proper flag clearing for retarget on multi resolution

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

Modified: branches/harmonic-skeleton/source/blender/include/reeb.h
===================================================================
--- branches/harmonic-skeleton/source/blender/include/reeb.h    2008-07-08 
18:32:42 UTC (rev 15491)
+++ branches/harmonic-skeleton/source/blender/include/reeb.h    2008-07-08 
19:34:20 UTC (rev 15492)
@@ -51,7 +51,7 @@
        int resolution;
        int totnodes;
        struct EdgeHash *emap;
-       struct ReebGraph *link; /* for multi resolution filtering, points to 
higher levels */
+       struct ReebGraph *link_up; /* for multi resolution filtering, points to 
higher levels */
 } ReebGraph;
 
 typedef struct EmbedBucket {
@@ -75,6 +75,7 @@
 
        int index;
        float weight;
+       struct ReebNode *link_down; /* for multi resolution filtering, points 
to lower levels, if present */
 } ReebNode;
 
 typedef struct ReebEdge {
@@ -103,7 +104,7 @@
 
        struct GHash *faces;    
        float angle;
-       struct ReebArc *link; /* for multi resolution filtering, points to 
higher levels */
+       struct ReebArc *link_up; /* for multi resolution filtering, points to 
higher levels */
 } ReebArc;
 
 typedef struct ReebArcIterator {
@@ -159,12 +160,14 @@
 /*********************** PUBLIC *********************************/
 ReebGraph *BIF_ReebGraphFromEditMesh(void);
 ReebGraph *BIF_ReebGraphMultiFromEditMesh(void);
+void BIF_flagMultiArcs(ReebGraph *rg, int flag);
 
 void BIF_GlobalReebGraphFromEditMesh(void);
 void BIF_GlobalReebFree(void);
 
 ReebNode *BIF_otherNodeFromIndex(ReebArc *arc, ReebNode *node);
 
+
 void REEB_freeGraph(ReebGraph *rg);
 void REEB_exportGraph(ReebGraph *rg, int count);
 void REEB_draw();

Modified: branches/harmonic-skeleton/source/blender/src/autoarmature.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/autoarmature.c        
2008-07-08 18:32:42 UTC (rev 15491)
+++ branches/harmonic-skeleton/source/blender/src/autoarmature.c        
2008-07-08 19:34:20 UTC (rev 15492)
@@ -81,7 +81,7 @@
        /*********************************/
 
        struct RigNode *head;
-       ReebGraph *link;
+       ReebGraph *link_mesh;
 } RigGraph;
 
 typedef struct RigNode {
@@ -97,7 +97,7 @@
        float symmetry_axis[3];
        /*********************************/
 
-       ReebNode *link;
+       ReebNode *link_mesh;
 } RigNode;
 
 typedef struct RigArc {
@@ -114,7 +114,7 @@
        
        ListBase edges;
        int count;
-       ReebArc *link;
+       ReebArc *link_mesh;
 } RigArc;
 
 typedef struct RigEdge {
@@ -387,7 +387,7 @@
                        {
                                RigEdge *edge = arc->edges.last;
                                
-                               if (edge->bone->flag & BONESEL_ANY)
+                               if (edge->bone->flag & 
(BONE_TIPSEL|BONE_SELECTED))
                                {
                                        rg->head = arc->tail;
                                        break;
@@ -514,7 +514,7 @@
 static RetargetMode detectArcRetargetMode(RigArc *iarc)
 {
        RetargetMode mode = RETARGET_AGGRESSIVE;
-       ReebArc *earc = iarc->link;
+       ReebArc *earc = iarc->link_mesh;
        RigEdge *edge;
        int large_angle = 0;
        float avg_angle = 0;
@@ -738,7 +738,7 @@
        RigEdge *edge;
        EmbedBucket *bucket = NULL;
        ReebNode *node_start, *node_end;
-       ReebArc *earc = iarc->link;
+       ReebArc *earc = iarc->link_mesh;
        float min_cost = FLT_MAX;
        float *vec0, *vec1, *vec2;
        float **vec_cache;
@@ -1074,7 +1074,7 @@
 static void retargetArctoArcLength(RigArc *iarc)
 {
        ReebArcIterator iter;
-       ReebArc *earc = iarc->link;
+       ReebArc *earc = iarc->link_mesh;
        ReebNode *node_start, *node_end;
        RigEdge *edge;
        EmbedBucket *bucket = NULL;
@@ -1203,7 +1203,7 @@
 
 static void retargetArctoArc(RigArc *iarc)
 {
-       ReebArc *earc = iarc->link;
+       ReebArc *earc = iarc->link_mesh;
        
        if (BLI_countlist(&iarc->edges) == 1)
        {
@@ -1247,27 +1247,27 @@
        ishape = BLI_subtreeShape((BNode*)start_node, (BArc*)next_iarc, 1) % 
MAGIC_NUMBER;
        eshape = BLI_subtreeShape((BNode*)enode, (BArc*)next_earc, 1) % 
MAGIC_NUMBER;
        
-       while (ishape > eshape && next_earc->link)
+       while (ishape > eshape && next_earc->link_up)
        {
-               next_earc = next_earc->link;
+               next_earc = next_earc->link_up;
                enode = next_earc->head;
                eshape = BLI_subtreeShape((BNode*)enode, (BArc*)next_earc, 1) % 
MAGIC_NUMBER;
        } 
 
        next_earc->flag = 1; // mark as taken
-       next_iarc->link = next_earc;
+       next_iarc->link_mesh = next_earc;
 }
 
 static void findCorrespondingArc(RigArc *start_arc, RigNode *start_node, 
RigArc *next_iarc)
 {
-       ReebNode *enode = start_node->link;
+       ReebNode *enode = start_node->link_mesh;
        ReebArc *next_earc;
        int symmetry_level = next_iarc->symmetry_level;
        int symmetry_group = next_iarc->symmetry_group;
        int symmetry_flag = next_iarc->symmetry_flag;
        int i;
        
-       next_iarc->link = NULL;
+       next_iarc->link_mesh = NULL;
                
        for(i = 0; i < enode->degree; i++)
        {
@@ -1288,7 +1288,7 @@
        }
        
 
-       if (next_iarc->link == NULL)
+       if (next_iarc->link_mesh == NULL)
        {
                printf("--------------------------\n");
                printf("NO CORRESPONDING ARC FOUND\n");
@@ -1310,9 +1310,9 @@
 static void retargetSubgraph(RigGraph *rigg, RigArc *start_arc, RigNode 
*start_node)
 {
        RigArc *iarc = start_arc;
-       ReebArc *earc = start_arc->link;
+       ReebArc *earc = start_arc->link_mesh;
        RigNode *inode = start_node;
-       ReebNode *enode = start_node->link;
+       ReebNode *enode = start_node->link_mesh;
        int i;
                
        retargetArctoArc(iarc);
@@ -1320,7 +1320,7 @@
        enode = BIF_otherNodeFromIndex(earc, enode);
        inode = (RigNode*)BLI_otherNode((BArc*)iarc, (BNode*)inode);
        
-       inode->link = enode;
+       inode->link_mesh = enode;
        
        for(i = 0; i < inode->degree; i++)
        {
@@ -1330,7 +1330,7 @@
                if (next_iarc != iarc)
                {
                        findCorrespondingArc(iarc, inode, next_iarc);
-                       if (next_iarc->link)
+                       if (next_iarc->link_mesh)
                        {
                                retargetSubgraph(rigg, next_iarc, inode);
                        }
@@ -1340,28 +1340,28 @@
 
 static void retargetGraphs(RigGraph *rigg)
 {
-       ReebGraph *reebg = rigg->link;
+       ReebGraph *reebg = rigg->link_mesh;
        ReebArc *earc;
        RigArc *iarc;
        ReebNode *enode;
        RigNode *inode;
        
        /* flag all ReebArcs as not taken */
-       for (earc = reebg->arcs.first; earc; earc = earc->next)
-       {
-               earc->flag = 0;
-       }
+       BIF_flagMultiArcs(reebg, 0);
        
+       /* return to first level */
+       reebg = rigg->link_mesh;
+       
        earc = reebg->arcs.first;
        iarc = (RigArc*)rigg->head->arcs[0];
        inode = iarc->tail;
        
        matchMultiResolutionArc(inode, iarc, earc);
 
-       earc = iarc->link; /* find might have changed it */
+       earc = iarc->link_mesh; /* find might have changed it */
        enode = earc->head;
 
-       inode->link = enode;
+       inode->link_mesh = enode;
 
        retargetSubgraph(rigg, iarc, inode);
 }
@@ -1372,9 +1372,6 @@
        Base *base;
        ReebGraph *reebg;
        
-       //reebg = BIF_ReebGraphFromEditMesh();
-       //BLI_markdownSymmetry((BGraph*)reebg, reebg->nodes.first, 
G.scene->toolsettings->skgen_symmetry_limit);
-       
        reebg = BIF_ReebGraphMultiFromEditMesh();
        
        
@@ -1406,7 +1403,7 @@
                
                                RIG_printGraph(rigg);
                                
-                               rigg->link = reebg;
+                               rigg->link_mesh = reebg;
                                
                                printf("retargetting %s\n", ob->id.name);
                                

Modified: branches/harmonic-skeleton/source/blender/src/reeb.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/reeb.c        2008-07-08 
18:32:42 UTC (rev 15491)
+++ branches/harmonic-skeleton/source/blender/src/reeb.c        2008-07-08 
19:34:20 UTC (rev 15492)
@@ -145,9 +145,9 @@
        BLI_edgehash_free(rg->emap, NULL);
        
        /* free linked graph */
-       if (rg->link)
+       if (rg->link_up)
        {
-               REEB_freeGraph(rg->link);
+               REEB_freeGraph(rg->link_up);
        }
        
        MEM_freeN(rg);
@@ -170,6 +170,14 @@
        return rg;
 }
 
+void BIF_flagMultiArcs(ReebGraph *rg, int flag)
+{
+       for ( ; rg; rg = rg->link_up)
+       {
+               BLI_flagArcs((BGraph*)rg, flag);
+       }
+}
+
 ReebNode * addNode(ReebGraph *rg, EditVert *eve, float weight)
 {
        ReebNode *node = NULL;
@@ -208,6 +216,28 @@
        return cp_node; 
 }
 
+void relinkNodes(ReebGraph *low_rg, ReebGraph *high_rg)
+{
+       ReebNode *low_node, *high_node;
+       
+       if (low_rg == NULL || high_rg == NULL)
+       {
+               return;
+       }
+       
+       for (low_node = low_rg->nodes.first; low_node; low_node = 
low_node->next)
+       {
+               for (high_node = high_rg->nodes.first; high_node; high_node = 
high_node->next)
+               {
+                       if (low_node->index == high_node->index)
+                       {
+                               high_node->link_down = low_node;
+                               break;
+                       }
+               }
+       }
+}
+
 ReebNode *BIF_otherNodeFromIndex(ReebArc *arc, ReebNode *node)
 {
        return (arc->head->index == node->index) ? arc->tail : arc->head;
@@ -222,7 +252,7 @@
 
        memcpy(cp_arc, arc, sizeof(ReebArc));
        
-       cp_arc->link = arc;
+       cp_arc->link_up = arc;
        
        cp_arc->head = NULL;
        cp_arc->tail = NULL;
@@ -266,7 +296,7 @@
        ReebGraph *cp_rg = newReebGraph();
        
        cp_rg->resolution = rg->resolution;
-       cp_rg->link = rg;
+       cp_rg->link_up = rg;
 
        /* Copy nodes */        
        for (node = rg->nodes.first; node; node = node->next)
@@ -438,7 +468,7 @@
 void verifyMultiResolutionLinks(ReebGraph *rg)
 {
 #ifdef DEBUG_REEB
-       ReebGraph *lower_rg = rg->link;
+       ReebGraph *lower_rg = rg->link_up;
        
        if (lower_rg)
        {
@@ -446,9 +476,9 @@
                
                for (arc = rg->arcs.first; arc; arc = arc->next)
                {
-                       if (BLI_findindex(&lower_rg->arcs, arc->link) == -1)
+                       if (BLI_findindex(&lower_rg->arcs, arc->link_up) == -1)
                        {
-                               printf("missing arc %p\n", arc->link);
+                               printf("missing arc %p\n", arc->link_up);
                        }
                }
                
@@ -2874,7 +2904,7 @@
 {
        EditMesh *em = G.editMesh;
        ReebGraph *rg = NULL;
-       ReebGraph *rgi;
+       ReebGraph *rgi, *previous;
        int i, nb_levels = 5;
        
        if (em == NULL)
@@ -2912,10 +2942,10 @@
                rg = copyReebGraph(rg);
        }
        
-       for (rgi = rg, i = nb_levels; rgi; rgi = rgi->link, i--)
+       for (rgi = rg, i = nb_levels, previous = NULL; rgi; previous = rgi, rgi 
= rgi->link_up, i--)
        {
                /* don't fully filter last level */
-               if (rgi->link)
+               if (rgi->link_up)
                {
                        float internal_threshold = 
G.scene->toolsettings->skgen_threshold_internal * (i / (float)nb_levels);
                        float external_threshold = 
G.scene->toolsettings->skgen_threshold_external * (i / (float)nb_levels);
@@ -2930,6 +2960,8 @@
                finalizeGraph(rgi, G.scene->toolsettings->skgen_postpro_passes, 
G.scene->toolsettings->skgen_postpro);
 
                BLI_markdownSymmetry((BGraph*)rgi, rgi->nodes.first, 
G.scene->toolsettings->skgen_symmetry_limit);
+               
+               relinkNodes(previous, rgi);
        }
        
        verifyMultiResolutionLinks(rg);
@@ -3033,15 +3065,15 @@
                return;
        }
        
-       if (GLOBAL_RG->link && G.scene->toolsettings->skgen_options & 
SKGEN_DISP_ORIG)
+       if (GLOBAL_RG->link_up && G.scene->toolsettings->skgen_options & 
SKGEN_DISP_ORIG)
        {
-               for (rg = GLOBAL_RG; rg->link; rg = rg->link) ;
+               for (rg = GLOBAL_RG; rg->link_up; rg = rg->link_up) ;
        }
        else
        {
                i = G.scene->toolsettings->skgen_multi_level;
                
-               for (rg = GLOBAL_RG; i && rg->link; i--, rg = rg->link) ;
+               for (rg = GLOBAL_RG; i && rg->link_up; i--, rg = rg->link_up) ;
        }
        

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to