Revision: 19729
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19729
Author:   aligorith
Date:     2009-04-15 14:04:10 +0200 (Wed, 15 Apr 2009)

Log Message:
-----------
PoseLib: Interactively browsing poses with Ctrl-L now mostly works again

This (most important part) of PoseLib now mostly works again. It even works for 
PoseLibs saved with the old animation system.

However, there are a few annoying bugs that need to be addressed still:
* When 'confirming' poses, the pose changes to the next one before PoseLib 
exits. I'm not quite sure where this is coming from yet...
* There are still a few minor bugs in the search-string code that will get 
ironed out
* AutoKeyframing doesn't work yet for this

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/animation/keyingsets.c
    
branches/blender2.5/blender/source/blender/editors/armature/armature_intern.h
    branches/blender2.5/blender/source/blender/editors/armature/armature_ops.c
    branches/blender2.5/blender/source/blender/editors/armature/poselib.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_anim_types.h

Modified: 
branches/blender2.5/blender/source/blender/editors/animation/keyingsets.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/keyingsets.c   
2009-04-15 10:57:28 UTC (rev 19728)
+++ branches/blender2.5/blender/source/blender/editors/animation/keyingsets.c   
2009-04-15 12:04:10 UTC (rev 19729)
@@ -1076,6 +1076,9 @@
                                char *path = NULL;
                                int arraylen, i;
                                
+                               /* set initial group name */
+                               groupname= (cks->id) ? cks->id->name : NULL;
+                               
                                /* construct the path */
                                // FIXME: this currently only works with a few 
hardcoded cases
                                if ((ksp->templates & KSP_TEMPLATE_PCHAN) && 
(cks->pchan)) {
@@ -1083,12 +1086,18 @@
                                        BLI_dynstr_append(pathds, 
"pose.pose_channels[\"");
                                        BLI_dynstr_append(pathds, 
cks->pchan->name);
                                        BLI_dynstr_append(pathds, "\"]");
+                                       
+                                       /* override default group name */
+                                       groupname= cks->pchan->name;
                                }
                                if ((ksp->templates & KSP_TEMPLATE_CONSTRAINT) 
&& (cks->con)) {
                                        /* add basic constraint path access */
                                        BLI_dynstr_append(pathds, 
"constraints[\"");
                                        BLI_dynstr_append(pathds, 
cks->con->name);
                                        BLI_dynstr_append(pathds, "\"]");
+                                       
+                                       /* override default group name */
+                                       groupname= cks->con->name;
                                }
                                {
                                        /* add property stored in KeyingSet 
Path */
@@ -1101,13 +1110,17 @@
                                        BLI_dynstr_free(pathds);
                                }
                                
-                               /* get pointer to name of group to add channels 
to */
-                               if (ksp->groupmode == KSP_GROUP_NONE)
-                                       groupname= NULL;
-                               else if (ksp->groupmode == KSP_GROUP_KSNAME)
-                                       groupname= ks->name;
-                               else
-                                       groupname= ksp->group;
+                               /* if the group name settings have not been 
overriden for the entire KeyingSet,
+                                * get pointer to name of group to add channels 
to 
+                                */
+                               if ((ks->flag & 
KEYINGSET_GROUPNAMES_OVERRIDE)==0) {
+                                       if (ksp->groupmode == KSP_GROUP_NONE)
+                                               groupname= NULL;
+                                       else if (ksp->groupmode == 
KSP_GROUP_KSNAME)
+                                               groupname= ks->name;
+                                       else
+                                               groupname= ksp->group;
+                               }
                                
                                /* init arraylen and i - arraylen should be 
greater than i so that
                                 * normal non-array entries get keyframed 
correctly

Modified: 
branches/blender2.5/blender/source/blender/editors/armature/armature_intern.h
===================================================================
--- 
branches/blender2.5/blender/source/blender/editors/armature/armature_intern.h   
    2009-04-15 10:57:28 UTC (rev 19728)
+++ 
branches/blender2.5/blender/source/blender/editors/armature/armature_intern.h   
    2009-04-15 12:04:10 UTC (rev 19729)
@@ -73,6 +73,7 @@
 void POSELIB_OT_pose_add(struct wmOperatorType *ot);
 void POSELIB_OT_pose_remove(struct wmOperatorType *ot);
 void POSELIB_OT_pose_rename(struct wmOperatorType *ot);
+void POSELIB_OT_browse_interactive(struct wmOperatorType *ot);
 
 /* editarmature.c */
 struct bArmature;

Modified: 
branches/blender2.5/blender/source/blender/editors/armature/armature_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/armature/armature_ops.c  
2009-04-15 10:57:28 UTC (rev 19728)
+++ branches/blender2.5/blender/source/blender/editors/armature/armature_ops.c  
2009-04-15 12:04:10 UTC (rev 19729)
@@ -155,6 +155,8 @@
        WM_operatortype_append(POSE_OT_select_linked);
        
        /* POSELIB */
+       WM_operatortype_append(POSELIB_OT_browse_interactive);
+       
        WM_operatortype_append(POSELIB_OT_pose_add);
        WM_operatortype_append(POSELIB_OT_pose_remove);
        WM_operatortype_append(POSELIB_OT_pose_rename);
@@ -258,6 +260,8 @@
        
        /* Pose -> PoseLib ------------- */
        /* only set in posemode, by space_view3d listener */
+       WM_keymap_add_item(keymap, "POSELIB_OT_browse_interactive", LKEY, 
KM_PRESS, KM_CTRL, 0);
+       
        WM_keymap_add_item(keymap, "POSELIB_OT_pose_add", LKEY, KM_PRESS, 
KM_SHIFT, 0);
        WM_keymap_add_item(keymap, "POSELIB_OT_pose_remove", LKEY, KM_PRESS, 
KM_ALT, 0);
        WM_keymap_add_item(keymap, "POSELIB_OT_pose_rename", LKEY, KM_PRESS, 
KM_CTRL|KM_SHIFT, 0);

Modified: branches/blender2.5/blender/source/blender/editors/armature/poselib.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/armature/poselib.c       
2009-04-15 10:57:28 UTC (rev 19728)
+++ branches/blender2.5/blender/source/blender/editors/armature/poselib.c       
2009-04-15 12:04:10 UTC (rev 19729)
@@ -86,18 +86,9 @@
 
 static void BIF_undo_push() {}
 static void error() {}
-static int qtest() {return 0;}
-static int extern_qread_ext() {return 0;}
-static void persptoetsen() {}
-static void headerprint() {}
 
-static void remake_action_ipos() {} // xxx depreceated
-//static void verify_pchan2achan_grouping() {} // xxx depreceated
 static void action_set_activemarker() {}
 
-/* ******* XXX ********** */
-
-
 /* ************************************************************* */
 /* == POSE-LIBRARY TOOL FOR BLENDER == 
  *     
@@ -222,6 +213,7 @@
 /* This tool automagically generates/validates poselib data so that it 
corresponds to the data 
  * in the action. This is for use in making existing actions usable as 
poselibs.
  */
+// TODO: operatorfy me!
 void poselib_validate_act (bAction *act)
 {
        ListBase keys = {NULL, NULL};
@@ -401,6 +393,10 @@
        /* make sure we've got KeyingSets to use */
        poselib_get_builtin_keyingsets();
        
+       /* turn on group-name overrides temporarily (only here) */
+       poselib_ks_locrotscale->flag |= KEYINGSET_GROUPNAMES_OVERRIDE;
+       poselib_ks_locrotscale2->flag |= KEYINGSET_GROUPNAMES_OVERRIDE;
+       
        /* init common-key-source for use by KeyingSets */
        memset(&cks, 0, sizeof(bCommonKeySrc));
        cks.id= &ob->id;
@@ -422,6 +418,10 @@
                }
        }
        
+       /* turn off group-name overrides so they don't affect the KeyingSets 
when used elsewhere */
+       poselib_ks_locrotscale->flag &= ~KEYINGSET_GROUPNAMES_OVERRIDE;
+       poselib_ks_locrotscale2->flag &= ~KEYINGSET_GROUPNAMES_OVERRIDE;
+       
        /* store new 'active' pose number */
        act->active_marker= BLI_countlist(&act->markers);
        
@@ -603,7 +603,10 @@
        ListBase backups;               /* tPoseLib_Backup structs for 
restoring poses */
        ListBase searchp;               /* LinkData structs storing list of 
poses which match the current search-string */
        
-       PointerRNA *rna_ptr;    /* RNA-Pointer to Object 'ob' */
+       Scene *scene;                   /* active scene */
+       ScrArea *sa;                    /* active area */
+       
+       PointerRNA rna_ptr;             /* RNA-Pointer to Object 'ob' */
        Object *ob;                             /* object to work on */
        bArmature *arm;                 /* object's armature data */
        bPose *pose;                    /* object's pose */
@@ -706,7 +709,7 @@
  */
 static void poselib_apply_pose (tPoseLib_PreviewData *pld)
 {
-       PointerRNA *ptr= pld->rna_ptr;
+       PointerRNA *ptr= &pld->rna_ptr;
        bArmature *arm= pld->arm;
        bPose *pose= pld->pose;
        bPoseChannel *pchan;
@@ -715,13 +718,15 @@
        
        BeztEditData bed;
        BeztEditFunc group_ok_cb;
-       int frame;
+       int frame= 1;
        
        /* get the frame */
        if (pld->marker)
                frame= pld->marker->frame;
        else
                return; 
+               
+       printf("apply pose ---> %d \n", frame); 
        
        /* init settings for testing groups for keyframes */
        group_ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE);
@@ -729,10 +734,13 @@
        bed.f1= ((float)frame) - 0.5f;
        bed.f2= ((float)frame) + 0.5f;
        
+       
        /* start applying - only those channels which have a key at this point 
in time! */
        for (agrp= act->groups.first; agrp; agrp= agrp->next) {
                /* check if group has any keyframes */
                if (ANIM_animchanneldata_keys_bezier_loop(&bed, agrp, 
ALE_GROUP, NULL, group_ok_cb, NULL, 0)) {
+                       printf("\tact group %s ok \n", agrp->name);
+                       
                        /* has keyframe on this frame, so try to get a 
PoseChannel with this name */
                        pchan= get_pose_channel(pose, agrp->name);
                        
@@ -753,10 +761,13 @@
                                }
                                
                                if (ok) {
+                                       printf("\t\tevaluating... \n");
                                        animsys_evaluate_action_group(ptr, act, 
agrp, NULL, (float)frame);
                                }
                        }
                }
+               else
+                       printf("\tact group %s not ok \n", agrp->name);
        }
 }
 
@@ -766,13 +777,13 @@
        bPose *pose= pld->pose;
        bPoseChannel *pchan;
        bAction *act= pld->act;
-       bActionChannel *achan;
+       bActionGroup *agrp;
        
        /* start tagging/keying */
-       for (achan= act->chanbase.first; achan; achan= achan->next) {
+       for (agrp= act->groups.first; agrp; agrp= agrp->next) {
                /* only for selected action channels */
-               if (achan->flag & ACHAN_SELECTED) {
-                       pchan= get_pose_channel(pose, achan->name);
+               if (agrp->flag & AGRP_SELECTED) {
+                       pchan= get_pose_channel(pose, agrp->name);
                        
                        if (pchan) {
 #if 0 // XXX old animation system      
@@ -808,11 +819,86 @@
                                                pchan->bone->flag |= 
BONE_UNKEYED;
                                }
 #endif // XXX old animation system     
+               
                        }
                }
        }
 }
 
+/* Apply the relevant changes to the pose */
+static void poselib_preview_apply (bContext *C, wmOperator *op)
+{
+       tPoseLib_PreviewData *pld= (tPoseLib_PreviewData *)op->customdata;
+       
+       printf("do apply(C, op) \n");
+       
+       /* only recalc pose (and its dependencies) if pose has changed */
+       if (pld->redraw == PL_PREVIEW_REDRAWALL) {
+               printf("\tupdate pose \n");
+               
+               /* don't clear pose if firsttime */
+               if ((pld->flag & PL_PREVIEW_FIRSTTIME)==0)
+                       poselib_backup_restore(pld);
+               else
+                       pld->flag &= ~PL_PREVIEW_FIRSTTIME;
+                       
+               /* pose should be the right one to draw (unless we're 
temporarily not showing it) */
+               if ((pld->flag & PL_PREVIEW_SHOWORIGINAL)==0)
+                       poselib_apply_pose(pld);
+               
+               /* old optimize trick... this enforces to bypass the depgraph 
+                *      - note: code copied from transform_generics.c -> 
recalcData()
+                */
+               // FIXME: shouldn't this use the builtin stuff?
+               if ((pld->arm->flag & ARM_DELAYDEFORM)==0)
+                       DAG_object_flush_update(pld->scene, pld->ob, 
OB_RECALC_DATA);  /* sets recalc flags */
+               else
+                       where_is_pose(pld->scene, pld->ob);
+       }
+       
+       /* do header print - if interactively previewing */
+       if (pld->state == PL_PREVIEW_RUNNING) {
+               if (pld->flag & PL_PREVIEW_SHOWORIGINAL) {
+                       sprintf(pld->headerstr, "PoseLib Previewing Pose: 
[Showing Original Pose] | Use Tab to start previewing poses again");
+                       ED_area_headerprint(pld->sa, pld->headerstr);
+               }
+               else if (pld->searchstr[0]) {
+                       char tempstr[65];
+                       char markern[64];
+                       short index;
+                       
+                       /* get search-string */
+                       index= pld->search_cursor;
+                       
+                       if (IN_RANGE(index, 0, 64)) {
+                               memcpy(&tempstr[0], &pld->searchstr[0], index);
+                               tempstr[index]= '|';
+                               memcpy(&tempstr[index+1], 
&pld->searchstr[index], 64-index);
+                       }
+                       else {
+                               strncpy(tempstr, pld->searchstr, 64);
+                       }
+                       
+                       /* get marker name */
+                       if (pld->marker)

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to