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:
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user