Orange's buglist!

- Action Editor: hotkeys V and H for handles were invisible, added menus
- NLA strips: when current frame is exactly on the strip end, it didn't
  include that action... needs a rounding correction for it.
- Action/NLA: deleting keys in Action, which results in only 1 key left,
  resulted in zero sized strip length. Now the strips are defaulted to be
  1 frame in size minimal.
- NLA editor: ALT+C "Convert to strip" didn't increment Action user count
- 3D Window: CTRL+P make parent to Bone still gave the insane menu with all
  bone names. With unified PoseMode select it can just parent to the
  active Bone. Note; this now requires the Armature to be in PoseMode to
  work.
- Rotation Constraint; the new options to only map to X,Y,Z rotation, did
  set the not mapped rotation axes to zero. These should remain unchanged.
- AutoKey optionn for Actions; should not insert action keys on ESC

And added a fix myself:

- When SHIFT+selecting a Bone in PoseMode, and the Armature was not selected
  or active yet, it doesn't extend-select/deselect the Bone anymore.
  This case is only useful when you try to add IK or Constraint, so the
  shift+selection should only activate the clicked Bone.
This commit is contained in:
2005-10-29 10:15:36 +00:00
parent 8162961d31
commit 3635bde6f4
11 changed files with 105 additions and 158 deletions

View File

@@ -111,9 +111,7 @@ struct bAction *copy_action(struct bAction *src);
/**
* Some kind of bounding box operation on the action.
*/
float calc_action_start(const struct bAction *act);
float calc_action_end(const struct bAction *act);
void calc_action_range(const struct bAction *act, float *start, float *end);
/**
* Set the pose channels from the given action.

View File

@@ -406,73 +406,48 @@ void blend_poses(bPose *dst, const bPose *src, float srcweight, short mode)
}
float calc_action_start(const bAction *act)
void calc_action_range(const bAction *act, float *start, float *end)
{
const bActionChannel *chan;
const bConstraintChannel *conchan;
const IpoCurve *icu;
float size=999999999.0f;
float min=999999999.0f, max=-999999999.0;
int i;
int foundvert=0;
const bConstraintChannel *conchan;
if (!act)
return 0;
for (chan=act->chanbase.first; chan; chan=chan->next) {
if(chan->ipo) {
for (icu=chan->ipo->curve.first; icu; icu=icu->next) {
for (i=0; i<icu->totvert; i++){
size = MIN2 (size, icu->bezt[i].vec[1][0]);
foundvert=1;
}
}
}
for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next) {
if(conchan->ipo) {
for (icu=conchan->ipo->curve.first; icu; icu=icu->next) {
for (i=0; i<icu->totvert; i++){
size = MIN2 (size, icu->bezt[i].vec[1][0]);
if(act) {
for (chan=act->chanbase.first; chan; chan=chan->next) {
if(chan->ipo) {
for (icu=chan->ipo->curve.first; icu; icu=icu->next) {
for (i=0; i<icu->totvert; i++) {
min = MIN2 (min, icu->bezt[i].vec[1][0]);
max = MAX2 (max, icu->bezt[i].vec[1][0]);
foundvert=1;
}
}
}
}
}
if (!foundvert)
return 0;
else
return size;
}
float calc_action_end(const bAction *act)
{
const bActionChannel *chan;
const bConstraintChannel *conchan;
const IpoCurve *icu;
float size=0;
int i;
if (!act)
return 0;
for (chan=act->chanbase.first; chan; chan=chan->next) {
if(chan->ipo) {
for (icu=chan->ipo->curve.first; icu; icu=icu->next)
for (i=0; i<icu->totvert; i++)
size = MAX2 (size, icu->bezt[i].vec[1][0]);
}
for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next){
if(conchan->ipo) {
for (icu=conchan->ipo->curve.first; icu; icu=icu->next)
for (i=0; i<icu->totvert; i++)
size = MAX2 (size, icu->bezt[i].vec[1][0]);
for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next) {
if(conchan->ipo) {
for (icu=conchan->ipo->curve.first; icu; icu=icu->next) {
for (i=0; i<icu->totvert; i++){
min = MIN2 (min, icu->bezt[i].vec[1][0]);
max = MAX2 (max, icu->bezt[i].vec[1][0]);
foundvert=1;
}
}
}
}
}
}
if (foundvert) {
if(min==max) max+= 1.0f;
*start= min;
*end= max;
}
else {
*start= 0.0f;
*end= 1.0f;
}
return size;
}
/* Copy the data from the action-pose (src) into the pose */
@@ -798,11 +773,12 @@ static void do_nla(Object *ob, int blocktype)
}
}
}
/* Handle repeat */
else if (striptime < 1.0) {
/* Handle repeat, we add 1 frame extra to make sure the last frame is included */
else if (striptime < 1.0f + 1.0f/length) {
/* Mod to repeat */
striptime*=strip->repeat;
striptime = (float)fmod (striptime, 1.0);
striptime*= strip->repeat;
striptime = (float)fmod (striptime, 1.0f + 1.0f/length);
frametime = (striptime * actlength) + strip->actstart;
frametime= nla_time(frametime, (float)strip->repeat);

View File

@@ -1055,12 +1055,14 @@ void evaluate_constraint (bConstraint *constraint, Object *ob, short ownertype,
Mat3Ortho(tmat);
if(data->flag != (ROTLIKE_X|ROTLIKE_Y|ROTLIKE_Z)) {
float eul[3];
float obeul[3], eul[3], obmat[3][3];
Mat3ToEul(tmat, eul);
if(!(data->flag & ROTLIKE_X)) eul[0]= 0.0f;
if(!(data->flag & ROTLIKE_Y)) eul[1]= 0.0f;
if(!(data->flag & ROTLIKE_Z)) eul[2]= 0.0f;
Mat3CpyMat4(obmat, ob->obmat);
Mat3ToEul(obmat, obeul);
if(!(data->flag & ROTLIKE_X)) eul[0]= obeul[0];
if(!(data->flag & ROTLIKE_Y)) eul[1]= obeul[1];
if(!(data->flag & ROTLIKE_Z)) eul[2]= obeul[2];
EulToMat3(eul, tmat);
}