209
213
/* malloc the path blocks */
210
214
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
211
215
if(pchan->bone && (pchan->bone->flag & BONE_SELECTED)) {
212
pchan->pathlen= EFRA-SFRA;
214
MEM_freeN(pchan->path);
215
pchan->path= MEM_callocN(3*pchan->pathlen*sizeof(float), "pchan path");
216
if(arm->layer & pchan->bone->layer) {
217
pchan->pathlen= EFRA-SFRA;
219
MEM_freeN(pchan->path);
220
pchan->path= MEM_callocN(3*pchan->pathlen*sizeof(float), "pchan path");
231
237
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
232
238
if(pchan->bone && (pchan->bone->flag & BONE_SELECTED)) {
234
fp= pchan->path+3*(CFRA-SFRA);
235
VECCOPY(fp, pchan->pose_tail);
236
Mat4MulVecfl(ob->obmat, fp);
239
if(arm->layer & pchan->bone->layer) {
241
fp= pchan->path+3*(CFRA-SFRA);
242
VECCOPY(fp, pchan->pose_tail);
243
Mat4MulVecfl(ob->obmat, fp);
276
285
if(ob==G.obedit || (ob->flag & OB_POSEMODE)==0) return;
278
287
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
279
if(pchan->bone->flag & (BONE_ACTIVE|BONE_SELECTED)) {
281
for(con= pchan->constraints.first; con; con= con->next) {
283
Object *target= get_constraint_target(con, &subtarget);
288
if(arm->layer & pchan->bone->layer) {
289
if(pchan->bone->flag & (BONE_ACTIVE|BONE_SELECTED)) {
287
bPoseChannel *pchanc= get_pose_channel(ob->pose, subtarget);
288
pchanc->bone->flag |= BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
291
for(con= pchan->constraints.first; con; con= con->next) {
293
Object *target= get_constraint_target(con, &subtarget);
297
bPoseChannel *pchanc= get_pose_channel(ob->pose, subtarget);
298
pchanc->bone->flag |= BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
351
363
if(okee("Remove IK constraint(s)")==0) return;
353
365
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
354
if(pchan->bone->flag & (BONE_ACTIVE|BONE_SELECTED)) {
356
for(con= pchan->constraints.first; con; con= next) {
358
if(con->type==CONSTRAINT_TYPE_KINEMATIC) {
359
BLI_remlink(&pchan->constraints, con);
360
free_constraint_data(con);
366
if(arm->layer & pchan->bone->layer) {
367
if(pchan->bone->flag & (BONE_ACTIVE|BONE_SELECTED)) {
369
for(con= pchan->constraints.first; con; con= next) {
371
if(con->type==CONSTRAINT_TYPE_KINEMATIC) {
372
BLI_remlink(&pchan->constraints, con);
373
free_constraint_data(con);
377
pchan->constflag &= ~(PCHAN_HAS_IK|PCHAN_HAS_TARGET);
364
pchan->constflag &= ~(PCHAN_HAS_IK|PCHAN_HAS_TARGET);
422
440
if(pchan==NULL) return;
425
nr= pupmenu("Copy Pose Attributes %t|Location%x1|Rotation%x2|Size%x3|Constraints");
443
nr= pupmenu("Copy Pose Attributes %t|Location%x1|Rotation%x2|Scale%x3|Constraints");
427
445
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
428
if(pchan->bone->flag & BONE_SELECTED) {
429
if(pchan!=pchanact) {
431
VECCOPY(pchan->loc, pchanact->loc);
434
QUATCOPY(pchan->quat, pchanact->quat);
437
VECCOPY(pchan->size, pchanact->size);
440
free_constraints(&pchan->constraints);
441
copy_constraints(&pchan->constraints, &pchanact->constraints);
442
pchan->constflag = pchanact->constflag;
446
if(arm->layer & pchan->bone->layer) {
447
if(pchan->bone->flag & BONE_SELECTED) {
448
if(pchan!=pchanact) {
450
VECCOPY(pchan->loc, pchanact->loc);
453
QUATCOPY(pchan->quat, pchanact->quat);
456
VECCOPY(pchan->size, pchanact->size);
459
free_constraints(&pchan->constraints);
460
copy_constraints(&pchan->constraints, &pchanact->constraints);
461
pchan->constflag = pchanact->constflag;
630
651
for(pchan= poseobj->pose->chanbase.first; pchan; pchan= pchan->next) {
631
652
bone= pchan->bone;
632
if(bone->flag & (BONE_SELECTED)) {
634
/* check if mesh has vgroups */
635
dg= get_named_vertexgroup(meshobj, bone->name);
637
dg= add_defgroup_name(meshobj, bone->name);
640
if(Gwp.flag & VP_MIRROR_X) {
643
BLI_strncpy(name, dg->name, 32);
644
bone_flip_name(name, 0); // 0 = don't strip off number extensions
646
for (curdef = meshobj->defbase.first; curdef; curdef=curdef->next)
647
if (!strcmp(curdef->name, name))
651
else map.dgflip= NULL;
653
/* get the root of the bone in global coords */
654
VECCOPY(map.head, bone->arm_head);
655
Mat4MulVecfl(poseobj->obmat, map.head);
657
/* get the tip of the bone in global coords */
658
VECCOPY(map.tail, bone->arm_tail);
659
Mat4MulVecfl(poseobj->obmat, map.tail);
661
/* use the optimal vertices instead of mverts */
664
if(dm->foreachMappedVert)
665
dm->foreachMappedVert(dm, pose_adds_vgroups__mapFunc, (void*) &map);
667
Mesh *me= meshobj->data;
669
for(i=0; i<me->totvert; i++)
670
pose_adds_vgroups__mapFunc(&map, i, (me->mvert+i)->co, NULL, NULL);
653
if(arm->layer & pchan->bone->layer) {
654
if(bone->flag & (BONE_SELECTED)) {
656
/* check if mesh has vgroups */
657
dg= get_named_vertexgroup(meshobj, bone->name);
659
dg= add_defgroup_name(meshobj, bone->name);
662
if(Gwp.flag & VP_MIRROR_X) {
665
BLI_strncpy(name, dg->name, 32);
666
bone_flip_name(name, 0); // 0 = don't strip off number extensions
668
for (curdef = meshobj->defbase.first; curdef; curdef=curdef->next)
669
if (!strcmp(curdef->name, name))
673
else map.dgflip= NULL;
675
/* get the root of the bone in global coords */
676
VECCOPY(map.head, bone->arm_head);
677
Mat4MulVecfl(poseobj->obmat, map.head);
679
/* get the tip of the bone in global coords */
680
VECCOPY(map.tail, bone->arm_tail);
681
Mat4MulVecfl(poseobj->obmat, map.tail);
683
/* use the optimal vertices instead of mverts */
686
if(dm->foreachMappedVert)
687
dm->foreachMappedVert(dm, pose_adds_vgroups__mapFunc, (void*) &map);
689
Mesh *me= meshobj->data;
691
for(i=0; i<me->totvert; i++)
692
pose_adds_vgroups__mapFunc(&map, i, (me->mvert+i)->co, NULL, NULL);
696
720
if(ob==G.obedit || (ob->flag & OB_POSEMODE)==0) return;
698
722
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
699
if(pchan->bone->flag & (BONE_ACTIVE|BONE_SELECTED)) {
700
BLI_strncpy(newname, pchan->name, sizeof(newname));
701
bone_flip_name(newname, 1); // 1 = do strip off number extensions
702
armature_bone_rename(ob->data, pchan->name, newname);
723
if(arm->layer & pchan->bone->layer) {
724
if(pchan->bone->flag & (BONE_ACTIVE|BONE_SELECTED)) {
725
BLI_strncpy(newname, pchan->name, sizeof(newname));
726
bone_flip_name(newname, 1); // 1 = do strip off number extensions
727
armature_bone_rename(ob->data, pchan->name, newname);
792
void pose_movetolayer(void)
801
if(ob->flag & OB_POSEMODE) {
804
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
805
if(arm->layer & pchan->bone->layer) {
806
if(pchan->bone->flag & BONE_SELECTED)
807
lay |= pchan->bone->layer;
812
if( movetolayer_short_buts(&lay)==0 ) return;
815
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
816
if(arm->layer & pchan->bone->layer) {
817
if(pchan->bone->flag & BONE_SELECTED)
818
pchan->bone->layer= lay;
822
allqueue(REDRAWVIEW3D, 0);
823
allqueue(REDRAWACTION, 0);
824
allqueue(REDRAWBUTSEDIT, 0);