Timline goodies;
- Mkey while ALT+A inserts markers. Note for Matt; You forgot to check for 'val'. The delay in tuho I brought back to max 1 frame. Delays are common in realtime gfx apps, the picture you see is old, and its possible you press a key while next frame is already drawing, and then it has to increase the frame value still... :) - RMB escapes from anim playback - on activate object, Timeline redraws too - Added keyline drawing for Material Ipos. The CTRL+Page keys work with it. Softbody: - Renamed buttons to call "Spring constant" now "Stiff(ness)" and the "Friction" became "Damping".
This commit is contained in:
@@ -2071,6 +2071,20 @@ void make_cfra_list(Ipo *ipo, ListBase *elems)
|
||||
icu= icu->next;
|
||||
}
|
||||
}
|
||||
else {
|
||||
for(icu= ipo->curve.first; icu; icu= icu->next) {
|
||||
if(icu->flag & IPO_VISIBLE) {
|
||||
bezt= icu->bezt;
|
||||
if(bezt) {
|
||||
a= icu->totvert;
|
||||
while(a--) {
|
||||
add_to_cfra_elem(elems, bezt);
|
||||
bezt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(ipo->showkey==0) {
|
||||
/* deselect all keys */
|
||||
|
||||
@@ -1644,8 +1644,8 @@ static void object_softbodies(Object *ob)
|
||||
}
|
||||
MEM_freeN (menustr);
|
||||
|
||||
uiDefButF(block, NUM, B_DIFF, "GSpring:", 10,80,150,20, &sb->goalspring, 0.0, 0.999, 10, 0, "Goal (vertex target position) Spring Constant");
|
||||
uiDefButF(block, NUM, B_DIFF, "GFrict:", 160,80,150,20, &sb->goalfrict , 0.0, 10.0, 10, 0, "Goal (vertex target position) Friction Constant");
|
||||
uiDefButF(block, NUM, B_DIFF, "G Stiff:", 10,80,150,20, &sb->goalspring, 0.0, 0.999, 10, 0, "Goal (vertex target position) spring stiffness");
|
||||
uiDefButF(block, NUM, B_DIFF, "G Damp:", 160,80,150,20, &sb->goalfrict , 0.0, 10.0, 10, 0, "Goal (vertex target position) friction");
|
||||
uiDefButF(block, NUM, B_SOFTBODY_CHANGE, "G Min:", 10,60,150,20, &sb->mingoal, 0.0, 1.0, 10, 0, "Min Goal bound");
|
||||
uiDefButF(block, NUM, B_SOFTBODY_CHANGE, "G Max:", 160,60,150,20, &sb->maxgoal, 0.0, 1.0, 10, 0, "Max Goal bound");
|
||||
uiBlockEndAlign(block);
|
||||
@@ -1654,8 +1654,8 @@ static void object_softbodies(Object *ob)
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButBitS(block, TOG, OB_SB_EDGES, B_SOFTBODY_CHANGE, "Use Edges", 10,30,150,20, &ob->softflag, 0, 0, 0, 0, "Use Robust 2nd order solver");
|
||||
uiDefButBitS(block, TOG, OB_SB_QUADS, B_SOFTBODY_CHANGE, "Stiff Quads", 160,30,150,20, &ob->softflag, 0, 0, 0, 0, "Sets object to have diagonal springs on 4-gons");
|
||||
uiDefButF(block, NUM, B_DIFF, "ESpring:", 10,10,150,20, &sb->inspring, 0.0, 0.999, 10, 0, "Edge Spring Constant");
|
||||
uiDefButF(block, NUM, B_DIFF, "EFrict:", 160,10,150,20, &sb->infrict, 0.0, 10.0, 10, 0, "Edge Friction Constant");
|
||||
uiDefButF(block, NUM, B_DIFF, "E Stiff:", 10,10,150,20, &sb->inspring, 0.0, 0.999, 10, 0, "Edge spring stiffness");
|
||||
uiDefButF(block, NUM, B_DIFF, "E Damp:", 160,10,150,20, &sb->infrict, 0.0, 10.0, 10, 0, "Edge friction");
|
||||
uiBlockEndAlign(block);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,12 +43,14 @@
|
||||
#include "DNA_action_types.h"
|
||||
#include "DNA_ipo_types.h"
|
||||
#include "DNA_object_types.h"
|
||||
#include "DNA_material_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
#include "DNA_space_types.h"
|
||||
#include "DNA_screen_types.h"
|
||||
|
||||
#include "BKE_ipo.h"
|
||||
#include "BKE_object.h"
|
||||
#include "BKE_material.h"
|
||||
#include "BKE_utildefines.h"
|
||||
#include "BKE_global.h"
|
||||
|
||||
@@ -200,7 +202,8 @@ static void draw_ob_keys()
|
||||
Object *ob;
|
||||
bActionChannel *achan;
|
||||
bAction *act;
|
||||
int ipoflag;
|
||||
ListBase elems;
|
||||
int a;
|
||||
char col[3];
|
||||
|
||||
if (OBACT) {
|
||||
@@ -210,27 +213,14 @@ static void draw_ob_keys()
|
||||
if(ob!=G.obedit) {
|
||||
if(ob->ipo) {
|
||||
/* convert the ipo to a list of 'current frame elements' */
|
||||
ListBase elems;
|
||||
|
||||
elems.first= elems.last= NULL;
|
||||
make_cfra_list(ob->ipo, &elems);
|
||||
|
||||
/* disable time offset for the purposes of drawing the frame ticks */
|
||||
ipoflag= ob->ipoflag;
|
||||
ob->ipoflag &= ~OB_OFFS_OB;
|
||||
|
||||
set_no_parent_ipo(1);
|
||||
disable_speed_curve(1);
|
||||
|
||||
/* draw the list of current frame elements */
|
||||
col[0] = 0xDD; col[1] = 0xD7; col[2] = 0x00;
|
||||
draw_key_list(elems, col);
|
||||
|
||||
set_no_parent_ipo(0);
|
||||
disable_speed_curve(0);
|
||||
|
||||
ob->ipoflag= ipoflag;
|
||||
|
||||
BLI_freelistN(&elems);
|
||||
}
|
||||
|
||||
@@ -240,7 +230,6 @@ static void draw_ob_keys()
|
||||
/* go through each channel in the action */
|
||||
for (achan=act->chanbase.first; achan; achan=achan->next){
|
||||
/* convert the ipo to a list of 'current frame elements' */
|
||||
ListBase elems;
|
||||
|
||||
elems.first= elems.last= NULL;
|
||||
make_cfra_list(achan->ipo, &elems);
|
||||
@@ -251,6 +240,21 @@ static void draw_ob_keys()
|
||||
BLI_freelistN(&elems);
|
||||
}
|
||||
}
|
||||
|
||||
for(a=0; a<ob->totcol; a++) {
|
||||
Material *ma= give_current_material(ob, a+1);
|
||||
|
||||
if(ma && ma->ipo) {
|
||||
elems.first= elems.last= NULL;
|
||||
make_cfra_list(ma->ipo, &elems);
|
||||
|
||||
col[0] = 0xDD; col[1] = 0xA7; col[2] = 0x00;
|
||||
draw_key_list(elems, col);
|
||||
|
||||
BLI_freelistN(&elems);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,12 +110,13 @@
|
||||
#include "BDR_editobject.h"
|
||||
#include "BDR_vpaint.h"
|
||||
|
||||
#include "BSE_view.h"
|
||||
#include "BSE_drawview.h"
|
||||
#include "BSE_filesel.h"
|
||||
#include "BSE_headerbuttons.h"
|
||||
#include "BSE_seqaudio.h"
|
||||
#include "BSE_filesel.h"
|
||||
#include "BSE_trans_types.h"
|
||||
#include "BSE_time.h"
|
||||
#include "BSE_view.h"
|
||||
|
||||
#include "RE_renderconverter.h"
|
||||
|
||||
@@ -2389,12 +2390,10 @@ int play_anim(int mode)
|
||||
|
||||
while(TRUE) {
|
||||
|
||||
inner_play_anim_loop(0, 0);
|
||||
|
||||
screen_swapbuffers();
|
||||
|
||||
while(qtest()) {
|
||||
|
||||
/* we test events first because of MKEY event */
|
||||
|
||||
event= extern_qread(&val);
|
||||
if(event==ESCKEY) break;
|
||||
else if(event==MIDDLEMOUSE) {
|
||||
@@ -2409,8 +2408,14 @@ int play_anim(int mode)
|
||||
else viewmove(0);
|
||||
}
|
||||
}
|
||||
else if(event==MKEY) {
|
||||
if(val) add_timeline_marker(CFRA-1);
|
||||
}
|
||||
if(event==ESCKEY || event==SPACEKEY) break;
|
||||
}
|
||||
if(ELEM3(event, ESCKEY, SPACEKEY, RIGHTMOUSE)) break;
|
||||
|
||||
inner_play_anim_loop(0, 0);
|
||||
screen_swapbuffers();
|
||||
|
||||
if((mode > 1) && CFRA==EFRA) break; /* no replay */
|
||||
}
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
#include "DNA_action_types.h"
|
||||
#include "DNA_ipo_types.h"
|
||||
#include "DNA_object_types.h"
|
||||
#include "DNA_material_types.h"
|
||||
#include "DNA_space_types.h"
|
||||
#include "DNA_screen_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
@@ -57,6 +58,7 @@
|
||||
#include "BKE_utildefines.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_material.h"
|
||||
#include "BKE_library.h"
|
||||
|
||||
#include "BIF_space.h"
|
||||
@@ -221,15 +223,38 @@ static int float_to_frame(float frame)
|
||||
return to;
|
||||
}
|
||||
|
||||
static float find_closest_cfra_elem(ListBase elems, int dir, float closest)
|
||||
{
|
||||
CfraElem *ce;
|
||||
|
||||
for(ce= elems.first; ce; ce= ce->next) {
|
||||
if (dir==-1) {
|
||||
if( float_to_frame(ce->cfra)<CFRA) {
|
||||
if ((ce->cfra > closest) || (closest == CFRA)) {
|
||||
closest= ce->cfra;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(float_to_frame(ce->cfra)>CFRA) {
|
||||
if ((ce->cfra < closest) || (closest == CFRA)) {
|
||||
closest= ce->cfra;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return closest;
|
||||
}
|
||||
|
||||
void nextprev_timeline_key(short dir)
|
||||
{
|
||||
/*mostly copied from drawobject.c, draw_object() AND editipo.c, movekey_obipo() */
|
||||
Object *ob;
|
||||
bActionChannel *achan;
|
||||
bAction *act;
|
||||
CfraElem *ce;
|
||||
ListBase elems;
|
||||
float closest= CFRA;
|
||||
int a;
|
||||
float toframe= CFRA;
|
||||
|
||||
if (OBACT) {
|
||||
ob = OBACT;
|
||||
@@ -238,37 +263,12 @@ void nextprev_timeline_key(short dir)
|
||||
if(ob!=G.obedit) {
|
||||
if(ob->ipo) {
|
||||
/* convert the ipo to a list of 'current frame elements' */
|
||||
ListBase elems;
|
||||
|
||||
elems.first= elems.last= 0;
|
||||
elems.first= elems.last= NULL;
|
||||
make_cfra_list(ob->ipo, &elems);
|
||||
|
||||
/* disable time offset for the purposes of drawing the frame ticks */
|
||||
/* ipoflag= ob->ipoflag;
|
||||
ob->ipoflag &= ~OB_OFFS_OB;
|
||||
closest= find_closest_cfra_elem(elems, dir, closest);
|
||||
|
||||
set_no_parent_ipo(1);
|
||||
disable_speed_curve(1); */
|
||||
|
||||
/* go through the list and decide if we can find a new keyframe to visit */
|
||||
if(elems.first) {
|
||||
ce= elems.first;
|
||||
if (dir==-1) {
|
||||
while (ce && float_to_frame(ce->cfra)<CFRA) {
|
||||
toframe= ce->cfra;
|
||||
ce= ce->next;
|
||||
}
|
||||
} else {
|
||||
while (ce && float_to_frame(ce->cfra)<=CFRA) {
|
||||
ce= ce->next;
|
||||
}
|
||||
if (ce) toframe= ce->cfra;
|
||||
}
|
||||
}
|
||||
/*set_no_parent_ipo(0);
|
||||
disable_speed_curve(0);
|
||||
|
||||
ob->ipoflag= ipoflag; */
|
||||
BLI_freelistN(&elems);
|
||||
}
|
||||
|
||||
@@ -277,38 +277,31 @@ void nextprev_timeline_key(short dir)
|
||||
/* go through each channel in the action */
|
||||
for (achan=act->chanbase.first; achan; achan=achan->next){
|
||||
/* convert the ipo to a list of 'current frame elements' */
|
||||
ListBase elems;
|
||||
|
||||
elems.first= elems.last= 0;
|
||||
elems.first= elems.last= NULL;
|
||||
make_cfra_list(achan->ipo, &elems);
|
||||
|
||||
/* go through the list and decide if we can find a new keyframe to visit */
|
||||
if(elems.first) {
|
||||
ce= elems.first;
|
||||
if (dir==-1) {
|
||||
while (ce && float_to_frame(ce->cfra)<CFRA) {
|
||||
if ((ce->cfra > toframe) || (toframe == CFRA)) {
|
||||
toframe= ce->cfra;
|
||||
}
|
||||
ce= ce->next;
|
||||
}
|
||||
} else {
|
||||
while (ce && float_to_frame(ce->cfra)<=CFRA) {
|
||||
ce= ce->next;
|
||||
}
|
||||
if (ce) {
|
||||
if ((ce->cfra < toframe) || (toframe == CFRA))
|
||||
toframe= ce->cfra;
|
||||
}
|
||||
closest= find_closest_cfra_elem(elems, dir, closest);
|
||||
|
||||
BLI_freelistN(&elems);
|
||||
}
|
||||
}
|
||||
|
||||
for(a=0; a<ob->totcol; a++) {
|
||||
Material *ma= give_current_material(ob, a+1);
|
||||
if(ma && ma->ipo) {
|
||||
elems.first= elems.last= NULL;
|
||||
make_cfra_list(ma->ipo, &elems);
|
||||
|
||||
closest= find_closest_cfra_elem(elems, dir, closest);
|
||||
|
||||
BLI_freelistN(&elems);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
a= float_to_frame(toframe);
|
||||
a= float_to_frame(closest);
|
||||
|
||||
if (a!=CFRA) {
|
||||
CFRA= a;
|
||||
|
||||
@@ -1170,6 +1170,7 @@ void mouse_select(void)
|
||||
allqueue(REDRAWBUTSOBJECT, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWHEADERS, 0); /* To force display update for the posebutton */
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user