diff options
author | Ton Roosendaal <ton@blender.org> | 2005-07-17 21:36:54 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2005-07-17 21:36:54 +0400 |
commit | fdaf1c6eac741fedced835298f04d40c6974d19c (patch) | |
tree | 55a4a37c3381c51439fdcbef85f7460afc3edf48 /source/blender | |
parent | 099b3e786c7a8609812385aefe3eb0c108e42882 (diff) |
Three fixes, thanks to irc reporting of Basse & Sten;
- Bone points for B-Bone drawing were not adjusted for size of Bone, now
they draw same size as for other bone type
- Deleting bones in editmode didn't check for constraints in Pose, causing
weird collapsed poses or even crashes
- ALT+S scaling on B-Bones in editmode didn't correct for the Object scale.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/src/drawarmature.c | 16 | ||||
-rw-r--r-- | source/blender/src/editarmature.c | 41 | ||||
-rwxr-xr-x | source/blender/src/transform.c | 2 |
3 files changed, 41 insertions, 18 deletions
diff --git a/source/blender/src/drawarmature.c b/source/blender/src/drawarmature.c index 13085f17484..395cfb7340f 100644 --- a/source/blender/src/drawarmature.c +++ b/source/blender/src/drawarmature.c @@ -332,7 +332,7 @@ static void draw_bone_solid_octahedral(void) /* *************** Armature drawing, bones ******************* */ -static void draw_bone_points(int dt, int armflag, unsigned int boneflag, int id, float length) +static void draw_bone_points(int dt, int armflag, unsigned int boneflag, int id) { /* Draw root point if we have no IK parent */ if (!(boneflag & BONE_IK_TOPARENT)){ @@ -366,12 +366,11 @@ static void draw_bone_points(int dt, int armflag, unsigned int boneflag, int id, BIF_ThemeColor(TH_BONE_SOLID); } - glTranslatef(0.0, length, 0.0); + glTranslatef(0.0, 1.0, 0.0); if(dt>OB_WIRE) draw_bonevert_solid(); else draw_bonevert(); - glTranslatef(0.0, -length, 0.0); + glTranslatef(0.0, -1.0, 0.0); - if(length > 0.05f) length-= 0.05f; // make vertices visible } static void draw_b_bone_boxes(int dt, bPoseChannel *pchan, float xwidth, float length, float zwidth) @@ -418,7 +417,12 @@ static void draw_b_bone(int dt, int armflag, int boneflag, int constflag, unsign /* draw points only if... */ if(armflag & ARM_EDITMODE) { - draw_bone_points(dt, armflag, boneflag, id, length); + /* move to unitspace */ + glPushMatrix(); + glScalef(length, length, length); + draw_bone_points(dt, armflag, boneflag, id); + glPopMatrix(); + length*= 0.95f; // make vertices visible } /* colors for modes */ @@ -507,7 +511,7 @@ static void draw_bone(int dt, int armflag, int boneflag, int constflag, unsigned } - draw_bone_points(dt, armflag, boneflag, id, 1.0); + draw_bone_points(dt, armflag, boneflag, id); /* now draw the bone itself */ diff --git a/source/blender/src/editarmature.c b/source/blender/src/editarmature.c index f0bd9e08429..e575c112746 100644 --- a/source/blender/src/editarmature.c +++ b/source/blender/src/editarmature.c @@ -795,7 +795,6 @@ static EditBone * get_nearest_editbonepoint (int findunsel, int *selmask) static void delete_bone(EditBone* exBone) { EditBone *curBone; - bPoseChannel *chan; /* Find any bones that refer to this bone */ for (curBone=G.edbo.first;curBone;curBone=curBone->next){ @@ -805,27 +804,47 @@ static void delete_bone(EditBone* exBone) } } - /* Erase any associated pose channel */ - if (G.obedit->pose){ - for (chan=G.obedit->pose->chanbase.first; chan; chan=chan->next){ - if (!strcmp (chan->name, exBone->name)){ - free_constraints(&chan->constraints); - BLI_freelinkN (&G.obedit->pose->chanbase, chan); - break; - } - } - } BLI_freelinkN (&G.edbo,exBone); } +static EditBone *editbone_name_exists (char *name); // proto for below + /* only editmode! */ void delete_armature(void) { EditBone *curBone, *next; + bConstraint *con; TEST_EDITARMATURE; if(okee("Erase selected bone(s)")==0) return; + /* First rase any associated pose channel */ + if (G.obedit->pose){ + bPoseChannel *chan, *next; + for (chan=G.obedit->pose->chanbase.first; chan; chan=next) { + next= chan->next; + curBone = editbone_name_exists (chan->name); + + if (curBone && (curBone->flag&BONE_SELECTED)) { + free_constraints(&chan->constraints); + BLI_freelinkN (&G.obedit->pose->chanbase, chan); + } + else { + for(con= chan->constraints.first; con; con= con->next) { + char *subtarget = get_con_subtarget_name(con, G.obedit); + if (subtarget) { + curBone = editbone_name_exists (subtarget); + if (curBone && (curBone->flag&BONE_SELECTED)) { + con->flag |= CONSTRAINT_DISABLE; + subtarget[0]= 0; + } + } + } + } + } + } + + for (curBone=G.edbo.first;curBone;curBone=next){ next=curBone->next; if (curBone->flag&BONE_SELECTED) diff --git a/source/blender/src/transform.c b/source/blender/src/transform.c index 13945db6057..e114d13bbf4 100755 --- a/source/blender/src/transform.c +++ b/source/blender/src/transform.c @@ -2227,7 +2227,7 @@ static void ElementBoneSize(TransInfo *t, TransData *td, float mat[3][3]) /* we've tucked the scale in loc */ oldy= td->iloc[1]; SizeToMat3(td->iloc, sizemat); - Mat3MulMat3(tmat, smat, sizemat); + Mat3MulMat3(tmat, tmat, sizemat); Mat3ToSize(tmat, td->loc); td->loc[1]= oldy; } |