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