Revision: 17368
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17368
Author:   theeth
Date:     2008-11-08 23:05:11 +0100 (Sat, 08 Nov 2008)

Log Message:
-----------
Generalized unique_editbone_name to be useable if a name change after the bone 
has been added to the list (this could probably simplify some code in 
editarmature, I haven't done that yet).

First pass for retargetting template's renaming magic. For now, in new 
retargetted bone's name: %S (side) and %N (number) will be replaced by user 
defined strings.

Will need to experiment on how useful that is and how it could be better.

Modified Paths:
--------------
    branches/etch-a-ton/source/blender/include/BIF_editarmature.h
    branches/etch-a-ton/source/blender/include/BIF_retarget.h
    branches/etch-a-ton/source/blender/makesdna/DNA_scene_types.h
    branches/etch-a-ton/source/blender/python/api2_2x/Armature.c
    branches/etch-a-ton/source/blender/python/api2_2x/Bone.c
    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/gpencil.c

Modified: branches/etch-a-ton/source/blender/include/BIF_editarmature.h
===================================================================
--- branches/etch-a-ton/source/blender/include/BIF_editarmature.h       
2008-11-08 14:25:08 UTC (rev 17367)
+++ branches/etch-a-ton/source/blender/include/BIF_editarmature.h       
2008-11-08 22:05:11 UTC (rev 17368)
@@ -133,7 +133,7 @@
 void   armature_select_hierarchy(short direction, short add_to_sel);
 
 void   setflag_armature(short mode);
-void    unique_editbone_name (struct ListBase *ebones, char *name);
+void   unique_editbone_name (struct ListBase *ebones, char *name, EditBone 
*bone); /* if bone is already in list, pass it as param to ignore it */
 
 void   auto_align_armature(short mode);
 void   switch_direction_armature(void);

Modified: branches/etch-a-ton/source/blender/include/BIF_retarget.h
===================================================================
--- branches/etch-a-ton/source/blender/include/BIF_retarget.h   2008-11-08 
14:25:08 UTC (rev 17367)
+++ branches/etch-a-ton/source/blender/include/BIF_retarget.h   2008-11-08 
22:05:11 UTC (rev 17368)
@@ -113,16 +113,21 @@
 } RigEdge;
 
 /* Control flags */
-#define RIG_CTRL_DONE                  1
-#define RIG_CTRL_PARENT_DEFORM 2
-#define RIG_CTRL_FIT_ROOT              4
-#define RIG_CTRL_FIT_BONE              8
+#define RIG_CTRL_HEAD_DONE             1
+#define RIG_CTRL_TAIL_DONE             2
+#define RIG_CTRL_PARENT_DEFORM 4
+#define RIG_CTRL_FIT_ROOT              8
+#define RIG_CTRL_FIT_BONE              16
 
+#define RIG_CTRL_DONE  (RIG_CTRL_HEAD_DONE|RIG_CTRL_TAIL_DONE)
+
+
 typedef struct RigControl {
        struct RigControl *next, *prev;
        float head[3], tail[3];
        EditBone *bone;
        EditBone *link;
+       EditBone *link_tail;
        float   up_axis[3];
        float   offset[3];
        int             flag;

Modified: branches/etch-a-ton/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- branches/etch-a-ton/source/blender/makesdna/DNA_scene_types.h       
2008-11-08 14:25:08 UTC (rev 17367)
+++ branches/etch-a-ton/source/blender/makesdna/DNA_scene_types.h       
2008-11-08 22:05:11 UTC (rev 17368)
@@ -448,6 +448,8 @@
        char bone_sketching_convert;
        char skgen_subdivision_number;
        char skgen_retarget_options;
+       char skgen_side_string[8];
+       char skgen_num_string[8];
        
        /* Alt+RMB option */
        char edge_mode;

Modified: branches/etch-a-ton/source/blender/python/api2_2x/Armature.c
===================================================================
--- branches/etch-a-ton/source/blender/python/api2_2x/Armature.c        
2008-11-08 14:25:08 UTC (rev 17367)
+++ branches/etch-a-ton/source/blender/python/api2_2x/Armature.c        
2008-11-08 22:05:11 UTC (rev 17368)
@@ -280,7 +280,7 @@
                //create a new editbone
                editbone = MEM_callocN(sizeof(EditBone), "eBone");
                BLI_strncpy(editbone->name, key_str, 32);
-               unique_editbone_name(NULL, editbone->name);
+               unique_editbone_name(NULL, editbone->name, NULL);
                editbone->dist = ((BPy_EditBone*)value)->dist;
                editbone->ease1 = ((BPy_EditBone*)value)->ease1;
                editbone->ease2 = ((BPy_EditBone*)value)->ease2;

Modified: branches/etch-a-ton/source/blender/python/api2_2x/Bone.c
===================================================================
--- branches/etch-a-ton/source/blender/python/api2_2x/Bone.c    2008-11-08 
14:25:08 UTC (rev 17367)
+++ branches/etch-a-ton/source/blender/python/api2_2x/Bone.c    2008-11-08 
22:05:11 UTC (rev 17368)
@@ -832,7 +832,7 @@
        //otherwise this will act as a py_object
        py_editBone->editbone = NULL;
 
-       unique_editbone_name(NULL, name);
+       unique_editbone_name(NULL, name, NULL);
        BLI_strncpy(py_editBone->name, name, 32);
        py_editBone->parent = NULL;
        py_editBone->weight= 1.0f;

Modified: branches/etch-a-ton/source/blender/src/drawview.c
===================================================================
--- branches/etch-a-ton/source/blender/src/drawview.c   2008-11-08 14:25:08 UTC 
(rev 17367)
+++ branches/etch-a-ton/source/blender/src/drawview.c   2008-11-08 22:05:11 UTC 
(rev 17368)
@@ -2361,6 +2361,9 @@
                uiDefButF(block, NUM, B_DIFF,                                   
                "Len:",                 60, yco, 50,19, 
&G.scene->toolsettings->skgen_retarget_length_weight, 0, 10, 1, 0,              
"Length Weight");
                uiDefButF(block, NUM, B_DIFF,                                   
                "Dist:",                110,yco, 50,19, 
&G.scene->toolsettings->skgen_retarget_distance_weight, 0, 10, 1, 0,            
"Distance Weight");
                yco -= 20;
+               
+               uiDefBut(block, TEX,0,"S:",                                     
                10, yco, 75, 20, G.scene->toolsettings->skgen_side_string, 0.0, 
8.0, 0, 0, "Text to replace %S with");
+               uiDefBut(block, TEX,0,"N:",                                     
                85, yco, 75, 20, G.scene->toolsettings->skgen_num_string, 0.0, 
8.0, 0, 0, "Text to replace %N with");
 
                uiBlockEndAlign(block);
 

Modified: branches/etch-a-ton/source/blender/src/editarmature.c
===================================================================
--- branches/etch-a-ton/source/blender/src/editarmature.c       2008-11-08 
14:25:08 UTC (rev 17367)
+++ branches/etch-a-ton/source/blender/src/editarmature.c       2008-11-08 
22:05:11 UTC (rev 17368)
@@ -699,7 +699,7 @@
                                        curbone= editbone_name_exists(&eblist, 
pchan->name);
                                        
                                        /* Get new name */
-                                       unique_editbone_name(&ebbase, 
curbone->name);
+                                       unique_editbone_name(&ebbase, 
curbone->name, NULL);
                                        
                                        /* Transform the bone */
                                        {
@@ -1999,7 +1999,7 @@
        EditBone *bone= MEM_callocN(sizeof(EditBone), "eBone");
        
        BLI_strncpy(bone->name, name, 32);
-       unique_editbone_name(ebones, bone->name);
+       unique_editbone_name(ebones, bone->name, NULL);
        
        BLI_addtail(ebones, bone);
        
@@ -2298,7 +2298,7 @@
        curBone->temp = eBone;
        eBone->temp = curBone;
 
-       unique_editbone_name(editbones, eBone->name);
+       unique_editbone_name(editbones, eBone->name, NULL);
        BLI_addtail(editbones, eBone);
        
        /* Lets duplicate the list of constraints that the
@@ -2388,7 +2388,7 @@
                                curBone->temp = eBone;
                                eBone->temp = curBone;
                                
-                               unique_editbone_name(&G.edbo, eBone->name);
+                               unique_editbone_name(&G.edbo, eBone->name, 
NULL);
                                BLI_addtail(&G.edbo, eBone);
                                if (!firstDup)
                                        firstDup=eBone;
@@ -3152,13 +3152,16 @@
 }
 
 /* note: there's a unique_bone_name() too! */
-void unique_editbone_name (ListBase *ebones, char *name)
+void unique_editbone_name (ListBase *ebones, char *name, EditBone *bone)
 {
+       EditBone *dupli;
        char            tempname[64];
        int                     number;
        char            *dot;
        
-       if (editbone_name_exists(ebones, name)) {
+       dupli = editbone_name_exists(ebones, name); 
+       
+       if (dupli && bone != dupli) {
                /*      Strip off the suffix, if it's a number */
                number= strlen(name);
                if (number && isdigit(name[number-1])) {
@@ -3279,7 +3282,7 @@
                                                        else 
strcat(newbone->name, "_R");
                                                }
                                        }
-                                       unique_editbone_name(&G.edbo, 
newbone->name);
+                                       unique_editbone_name(&G.edbo, 
newbone->name, NULL);
                                        
                                        /* Add the new bone to the list */
                                        BLI_addtail(&G.edbo, newbone);
@@ -3366,7 +3369,7 @@
                                                        
                                                        newbone->flag |= 
BONE_CONNECTED;
                                                        
-                                                       unique_editbone_name 
(&G.edbo, newbone->name);
+                                                       unique_editbone_name 
(&G.edbo, newbone->name, NULL);
                                                        
                                                        /* correct parent bones 
*/
                                                        for (tbone = 
G.edbo.first; tbone; tbone=tbone->next) {
@@ -4400,7 +4403,7 @@
                        
                        eBone= editbone_name_exists(&G.edbo, oldname);
                        if (eBone) {
-                               unique_editbone_name(&G.edbo, newname);
+                               unique_editbone_name(&G.edbo, newname, NULL);
                                BLI_strncpy(eBone->name, newname, MAXBONENAME);
                        }
                        else return;

Modified: branches/etch-a-ton/source/blender/src/editarmature_retarget.c
===================================================================
--- branches/etch-a-ton/source/blender/src/editarmature_retarget.c      
2008-11-08 14:25:08 UTC (rev 17367)
+++ branches/etch-a-ton/source/blender/src/editarmature_retarget.c      
2008-11-08 22:05:11 UTC (rev 17368)
@@ -400,6 +400,44 @@
 }
 /************************************** CLONING TEMPLATES 
**********************************************/
 
+static void renameTemplateBone(EditBone *bone, char *template_name, ListBase 
*editbones)
+{
+       char *side_string = G.scene->toolsettings->skgen_side_string;
+       char *num_string = G.scene->toolsettings->skgen_num_string;
+       int i, j;
+       
+       for (i = 0, j = 0; template_name[i] != '\0' && i < 31 && j < 31; i++)
+       {
+               if (template_name[i] == '%')
+               {
+                       if (template_name[i+1] == 'S')
+                       {
+                               j += sprintf(bone->name + j, side_string);
+                               i++;
+                       }
+                       else if (template_name[i+1] == 'N')
+                       {
+                               j += sprintf(bone->name + j, num_string);
+                               i++;
+                       }
+                       else
+                       {
+                               bone->name[j] = template_name[i];
+                               j++;
+                       }
+               }
+               else
+               {
+                       bone->name[j] = template_name[i];
+                       j++;
+               }
+       }
+       
+       bone->name[j] = '\0';
+       
+       unique_editbone_name(editbones, bone->name, bone);
+}
+
 static RigControl *cloneControl(RigGraph *rg, RigGraph *src_rg, RigControl 
*src_ctrl, GHash *ptr_hash)
 {
        RigControl *ctrl;
@@ -414,6 +452,7 @@
        ctrl->flag = src_ctrl->flag;
 
        ctrl->bone = duplicateEditBoneObjects(src_ctrl->bone, rg->editbones, 
src_rg->ob, rg->ob);
+       renameTemplateBone(ctrl->bone, src_ctrl->bone->name, rg->editbones);
        ctrl->bone->flag &= 
~(BONE_TIPSEL|BONE_SELECTED|BONE_ROOTSEL|BONE_ACTIVE);
        BLI_ghash_insert(ptr_hash, src_ctrl->bone, ctrl->bone);
        
@@ -455,6 +494,7 @@
                if (src_edge->bone != NULL)
                {
                        edge->bone = duplicateEditBoneObjects(src_edge->bone, 
rg->editbones, src_rg->ob, rg->ob);
+                       renameTemplateBone(edge->bone, src_edge->bone->name, 
rg->editbones);
                        edge->bone->flag &= 
~(BONE_TIPSEL|BONE_SELECTED|BONE_ROOTSEL|BONE_ACTIVE);
                        BLI_ghash_insert(ptr_hash, src_edge->bone, edge->bone);
                }
@@ -1456,7 +1496,7 @@
        EditBone *bone= MEM_callocN(sizeof(EditBone), "eBone");
        
        BLI_strncpy(bone->name, name, 32);
-       unique_editbone_name(list, bone->name);
+       unique_editbone_name(list, bone->name, NULL);
        
        BLI_addtail(list, bone);
        
@@ -1624,35 +1664,53 @@
 
 /************************************ RETARGETTING 
*****************************************************/
 
+static void repositionControl(RigGraph *rigg, RigControl *ctrl, float head[3], 
float tail[3], float qrot[4], float resize);
+
+
+static void finalizeControl(RigGraph *rigg, RigControl *ctrl, float qrot[4], 
float resize)
+{
+       if ((ctrl->flag & RIG_CTRL_DONE) == RIG_CTRL_DONE)
+       {
+               RigControl *ctrl_child;
+               
+               ctrl->bone->roll = rollBoneByQuat(ctrl->bone, ctrl->up_axis, 
qrot);
+       
+               /* Cascade to connected control bones */
+               for (ctrl_child = rigg->controls.first; ctrl_child; ctrl_child 
= ctrl_child->next)
+               {
+                       if (ctrl_child->link == ctrl->bone)
+                       {
+                               repositionControl(rigg, ctrl_child, 
ctrl->bone->head, ctrl->bone->tail, qrot, resize);
+                       }
+               }
+       }       
+}
+

@@ 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