Revision: 17536
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17536
Author:   theeth
Date:     2008-11-22 18:58:49 +0100 (Sat, 22 Nov 2008)

Log Message:
-----------
Cache the armature template graph while in editmode.
Display the number of joints in the selected template in the sketch panel
When using selected bones as template, turn off Connected if bone has a parent 
that is not copied.

Modified Paths:
--------------
    branches/etch-a-ton/source/blender/include/BIF_retarget.h
    branches/etch-a-ton/source/blender/include/BIF_sketch.h
    branches/etch-a-ton/source/blender/src/drawview.c
    branches/etch-a-ton/source/blender/src/editarmature.c
    branches/etch-a-ton/source/blender/src/editarmature_retarget.c
    branches/etch-a-ton/source/blender/src/editarmature_sketch.c

Modified: branches/etch-a-ton/source/blender/include/BIF_retarget.h
===================================================================
--- branches/etch-a-ton/source/blender/include/BIF_retarget.h   2008-11-22 
15:10:47 UTC (rev 17535)
+++ branches/etch-a-ton/source/blender/include/BIF_retarget.h   2008-11-22 
17:58:49 UTC (rev 17536)
@@ -31,6 +31,9 @@
 
 #include "reeb.h"
 
+struct Object;
+struct bArmature;
+
 struct EditBone;
 
 struct RigJoint;
@@ -65,7 +68,7 @@
        GHash *bones_map;       /* map of editbones by name */
        GHash *controls_map;    /* map of rigcontrols by bone pointer */
        
-       Object *ob;
+       struct Object *ob;
 } RigGraph;
 
 typedef struct RigNode {
@@ -109,7 +112,7 @@
        float length;
        float angle; /* angle to next edge */
        float up_angle; /* angle between up_axis and the joint normal (defined 
as Previous edge CrossProduct Current edge */
-       EditBone *bone;
+       struct EditBone *bone;
        float up_axis[3];
 } RigEdge;
 
@@ -132,9 +135,9 @@
 typedef struct RigControl {
        struct RigControl *next, *prev;
        float head[3], tail[3];
-       EditBone *bone;
-       EditBone *link;
-       EditBone *link_tail;
+       struct EditBone *bone;
+       struct EditBone *link;
+       struct EditBone *link_tail;
        float   up_axis[3];
        float   offset[3];
        float   qrot[4]; /* for dual linked bones, store the rotation of the 
linked bone for the finalization */
@@ -142,6 +145,9 @@
        LinkTailMode tail_mode;
 } RigControl;
 
-void BIF_retargetArc(ReebArc *earc);
+void BIF_retargetArc(ReebArc *earc, RigGraph *template_rigg);
+RigGraph *RIG_graphFromArmature(struct Object *ob, struct bArmature *arm);
+int RIG_nbJoints(RigGraph *rg);
+void RIG_freeRigGraph(BGraph *rg);
 
 #endif /* BIF_RETARGET_H */

Modified: branches/etch-a-ton/source/blender/include/BIF_sketch.h
===================================================================
--- branches/etch-a-ton/source/blender/include/BIF_sketch.h     2008-11-22 
15:10:47 UTC (rev 17535)
+++ branches/etch-a-ton/source/blender/include/BIF_sketch.h     2008-11-22 
17:58:49 UTC (rev 17536)
@@ -36,6 +36,7 @@
 char *BIF_listTemplates();
 int   BIF_currentTemplate();
 void  BIF_freeTemplates();
-void  BIF_setTemplate(int);    
+void  BIF_setTemplate(int);
+int   BIF_nbJointsTemplate();  
 
 #endif /* BIF_SKETCH_H */

Modified: branches/etch-a-ton/source/blender/src/drawview.c
===================================================================
--- branches/etch-a-ton/source/blender/src/drawview.c   2008-11-22 15:10:47 UTC 
(rev 17535)
+++ branches/etch-a-ton/source/blender/src/drawview.c   2008-11-22 17:58:49 UTC 
(rev 17536)
@@ -2291,10 +2291,11 @@
 static void view3d_panel_bonesketch_spaces(short cntrl)
 {
        static int template_index;
+       static char joint_label[32];
        uiBlock *block;
        uiBut *but;
        int yco = 70, height = 140;
-//     int index;
+       int nb_joints;
 
        /* replace with check call to sketching lib */
        if (G.obedit && G.obedit->type == OB_ARMATURE)
@@ -2366,11 +2367,23 @@
                uiDefBut(block, TEX,0,"S:",                                     
                10,  yco, 90, 20, G.scene->toolsettings->skgen_side_string, 
0.0, 8.0, 0, 0, "Text to replace &S with");
                uiDefBut(block, TEX,0,"N:",                                     
                100, yco, 90, 20, G.scene->toolsettings->skgen_num_string, 0.0, 
8.0, 0, 0, "Text to replace &N with");
                uiDefIconButBitC(block, TOG, SK_RETARGET_AUTONAME, B_DIFF, 
ICON_AUTO,190,yco,20,20, &G.scene->toolsettings->skgen_retarget_options, 0, 0, 
0, 0, "Use Auto Naming");     
+               yco -= 20;
 
                /* auto renaming magic */
-
                uiBlockEndAlign(block);
+               
+               nb_joints = BIF_nbJointsTemplate();
 
+               if (nb_joints == -1)
+               {
+                       nb_joints = G.totvertsel;
+               }
+               
+               BLI_snprintf(joint_label, 32, "%i joints", nb_joints);
+               
+               uiDefBut(block, LABEL, 1, joint_label,                          
        10, yco, 200, 20, NULL, 0.0, 0.0, 0, 0, "");
+               
+
                if(yco < 0) uiNewPanelHeight(block, height-yco);
        }
 }

Modified: branches/etch-a-ton/source/blender/src/editarmature.c
===================================================================
--- branches/etch-a-ton/source/blender/src/editarmature.c       2008-11-22 
15:10:47 UTC (rev 17535)
+++ branches/etch-a-ton/source/blender/src/editarmature.c       2008-11-22 
17:58:49 UTC (rev 17536)
@@ -1740,6 +1740,8 @@
        if (!arm) return;
        
        make_boneList(&G.edbo, &arm->bonebase,NULL);
+       
+       BIF_freeTemplates(); /* force template update when entering editmode */
 }
 
 /* put EditMode back in Object */

Modified: branches/etch-a-ton/source/blender/src/editarmature_retarget.c
===================================================================
--- branches/etch-a-ton/source/blender/src/editarmature_retarget.c      
2008-11-22 15:10:47 UTC (rev 17535)
+++ branches/etch-a-ton/source/blender/src/editarmature_retarget.c      
2008-11-22 17:58:49 UTC (rev 17536)
@@ -613,12 +613,22 @@
                                EditBone *bone;
                                
                                updateDuplicateSubtargetObjects(edge->bone, 
src->editbones, src->ob, rg->ob);
-                               
-                               bone = BLI_ghash_lookup(ptr_hash, 
edge->bone->parent);
-       
-                               if (bone != NULL)
-                               {
-                                       edge->bone->parent = bone;
+
+                               if (edge->bone->parent)
+                               {                               
+                                       bone = BLI_ghash_lookup(ptr_hash, 
edge->bone->parent);
+               
+                                       if (bone != NULL)
+                                       {
+                                               edge->bone->parent = bone;
+                                       }
+                                       else
+                                       {
+                                               /* disconnect since parent 
isn't cloned
+                                                * this will only happen when 
cloning from selected bones 
+                                                * */
+                                               edge->bone->flag &= 
~BONE_CONNECTED;
+                                       }
                                }
                        }
                }
@@ -630,11 +640,21 @@
                
                updateDuplicateSubtargetObjects(ctrl->bone, src->editbones, 
src->ob, rg->ob);
 
-               bone = BLI_ghash_lookup(ptr_hash, ctrl->bone->parent);
-               
-               if (bone != NULL)
+               if (ctrl->bone->parent)
                {
-                       ctrl->bone->parent = bone;
+                       bone = BLI_ghash_lookup(ptr_hash, ctrl->bone->parent);
+                       
+                       if (bone != NULL)
+                       {
+                               ctrl->bone->parent = bone;
+                       }
+                       else
+                       {
+                               /* disconnect since parent isn't cloned
+                                * this will only happen when cloning from 
selected bones 
+                                * */
+                               ctrl->bone->flag &= ~BONE_CONNECTED;
+                       }
                }
 
                ctrl->link = BLI_ghash_lookup(ptr_hash, ctrl->link);
@@ -1507,7 +1527,7 @@
 
 
/*******************************************************************************************************/
 
-RigGraph *armatureToGraph(Object *ob, bArmature *arm)
+RigGraph *RIG_graphFromArmature(Object *ob, bArmature *arm)
 {
        EditBone *ebone;
        RigGraph *rg;
@@ -2958,6 +2978,20 @@
        editbones_to_armature(rigg->editbones, rigg->ob);
 }
 
+int RIG_nbJoints(RigGraph *rg)
+{
+       RigArc *arc;
+       int total = 0;
+       
+       total += BLI_countlist(&rg->nodes);
+       
+       for (arc = rg->arcs.first; arc; arc = arc->next)
+       {
+               total += BLI_countlist(&arc->edges) - 1; /* -1 because end 
nodes are already counted */
+       }
+       
+       return total;
+}
 
 void BIF_retargetArmature()
 {
@@ -2995,7 +3029,7 @@
                        
                                start_time = PIL_check_seconds_timer();
        
-                               rigg = armatureToGraph(ob, arm);
+                               rigg = RIG_graphFromArmature(ob, arm);
                                
                                end_time = PIL_check_seconds_timer();
                                rig_time = end_time - start_time;
@@ -3040,20 +3074,17 @@
        allqueue(REDRAWVIEW3D, 0);
 }
 
-void BIF_retargetArc(ReebArc *earc)
+void BIF_retargetArc(ReebArc *earc, RigGraph *template_rigg)
 {
        Object *ob;
-       RigGraph *template_rigg;
        RigGraph *rigg;
        RigArc *iarc;
        bArmature *arm;
        
-       if (G.scene->toolsettings->skgen_template &&
-               G.scene->toolsettings->skgen_template->type == OB_ARMATURE)
+       if (template_rigg)
        {
-               ob = G.scene->toolsettings->skgen_template;     
+               ob = template_rigg->ob;         
                arm = ob->data;
-               template_rigg = armatureToGraph(ob, arm);
        }
        else
        {
@@ -3080,7 +3111,11 @@
        
        finishRetarget(rigg);
        
-       RIG_freeRigGraph((BGraph*)template_rigg);
+       /* free template if it comes from the edit armature */
+       if (ob == G.obedit)
+       {
+               RIG_freeRigGraph((BGraph*)template_rigg);
+       }
        RIG_freeRigGraph((BGraph*)rigg);
        
        allqueue(REDRAWVIEW3D, 0);

Modified: branches/etch-a-ton/source/blender/src/editarmature_sketch.c
===================================================================
--- branches/etch-a-ton/source/blender/src/editarmature_sketch.c        
2008-11-22 15:10:47 UTC (rev 17535)
+++ branches/etch-a-ton/source/blender/src/editarmature_sketch.c        
2008-11-22 17:58:49 UTC (rev 17536)
@@ -142,6 +142,7 @@
 char  *TEMPLATES_MENU = NULL;
 int    TEMPLATES_CURRENT = 0;
 GHash *TEMPLATES_HASH = NULL;
+RigGraph *TEMPLATE_RIGG = NULL;
 
 void BIF_makeListTemplates()
 {
@@ -230,17 +231,67 @@
        return TEMPLATES_CURRENT;
 }
 
+RigGraph* sk_makeTemplateGraph(Object *ob)
+{
+       if (ob == G.obedit)
+       {
+               return NULL;
+       }
+       
+       if (ob != NULL)
+       {
+               if (TEMPLATE_RIGG && TEMPLATE_RIGG->ob != ob)
+               {
+                       RIG_freeRigGraph((BGraph*)TEMPLATE_RIGG);
+                       TEMPLATE_RIGG = NULL;
+               }
+               
+               if (TEMPLATE_RIGG == NULL)
+               {
+                       bArmature *arm;
+
+                       arm = ob->data;
+                       
+                       TEMPLATE_RIGG = RIG_graphFromArmature(ob, arm);
+               }
+       }
+       
+       return TEMPLATE_RIGG;
+}
+
+int BIF_nbJointsTemplate()
+{
+       RigGraph *rg = 
sk_makeTemplateGraph(G.scene->toolsettings->skgen_template);
+       
+       if (rg)
+       {
+               return RIG_nbJoints(rg);
+       }
+       else
+       {
+               return -1; 
+       }
+}
+
 void  BIF_freeTemplates()
 {
        if (TEMPLATES_MENU != NULL)
        {
                MEM_freeN(TEMPLATES_MENU);
+               TEMPLATES_MENU = NULL;
        }
        
        if (TEMPLATES_HASH != NULL)
        {
                BLI_ghash_free(TEMPLATES_HASH, NULL, NULL);
+               TEMPLATES_HASH = NULL;
        }
+       
+       if (TEMPLATE_RIGG != NULL)
+       {
+               RIG_freeRigGraph((BGraph*)TEMPLATE_RIGG);
+               TEMPLATE_RIGG = NULL;
+       }
 }
 
 void  BIF_setTemplate(int index)
@@ -252,6 +303,12 @@
        else
        {
                G.scene->toolsettings->skgen_template = NULL;
+               
+               if (TEMPLATE_RIGG != NULL)
+               {
+                       RIG_freeRigGraph((BGraph*)TEMPLATE_RIGG);
+               }
+               TEMPLATE_RIGG = NULL;
        }
 }      
 
@@ -565,6 +622,7 @@
        float imat[4][4];
        float tmat[3][3];
        ReebArc *arc;
+       RigGraph *rg;
        
        Mat4Invert(imat, G.obedit->obmat);
        
@@ -574,8 +632,10 @@
        arc = sk_strokeToArc(stk, imat, tmat);
        
        sk_autoname(arc);
+       
+       rg = sk_makeTemplateGraph(G.scene->toolsettings->skgen_template);
 
-       BIF_retargetArc(arc);
+       BIF_retargetArc(arc, rg);
        
        sk_autoname(NULL);
        


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

Reply via email to