key_framer.cpp
00001 #include <config.h>
00002 #include "key_framer.h"
00003 #include <fstream>
00004
00005 namespace util
00006 {
00007
00008 using std::ifstream;
00009 using std::ofstream;
00010
00011 KeyFramer::KeyFramer(){
00012
00013 sel_frame=0;
00014 sel_time=0;
00015 max_u=10;
00016 max_v=10;
00017 time_interval[0]=0;
00018 time_interval[1]=1.0;
00019 min[0]=-0.95;
00020 min[1]=-0.20;
00021 max[0]=0.95;
00022 max[1]=0.20;
00023 Frame t;
00024
00025 keys.push_back(t);
00026 keys.push_back(t);
00027
00028 keys[0].time=0;
00029 keys[1].time=1.0;
00030 keys[0].name=NULL;
00031 keys[1].name=NULL;
00032
00033 keys[0].scale=1.0;
00034 keys[1].scale=2.0;
00035
00036 u_prec=v_prec=24;
00037
00038 gl_context=NULL;
00039 }
00040
00041 KeyFramer::KeyFramer(const KeyFramer& copy)
00042 : FileObject(copy)
00043 {
00044 }
00045
00046 KeyFramer::~KeyFramer()
00047 {
00048 }
00049
00050 bool KeyFramer::Load(const char* fname)
00051 {
00052 bool file_loaded=false;
00053 char *p_name;
00054 p_name=new char[80];
00055 double time;
00056 double scale;
00057 keys.clear();
00058 ifstream File;
00059
00060 File.open(fname);
00061 while(!File.eof() && !File.fail()){
00062
00063 if(File.peek()=='#' || File.peek()=='\n' || File.peek()==' '){
00064 File.ignore(256,'\n');
00065
00066 } else {
00067 Frame F;
00068 File>>time;
00069 File>>p_name;
00070 File>>scale;
00071
00072 if(time<0 || scale<=0)
00073 std::cout<<"Error in "<<fname<<", invalid time or scale value\n";
00074 else if(!File.eof() && !File.fail()){
00075
00076 F.key.LoadPatch(p_name);
00077 F.name=p_name;
00078 p_name=new char[80];
00079 F.scale=scale;
00080 F.time=time;
00081
00082 unsigned int i=0;
00083 while(i<keys.size() && F.time>keys[i].time)
00084 i++;
00085
00086 if(i==keys.size() || F.time != keys[i].time)
00087 keys.insert(keys.begin()+i,F);
00088 else{
00089 std::cout<<"Error in "<<fname<<", two frames placed at time "<<F.time<<"."<<std::endl;
00090 std::cout<<keys[i].time<<std::endl;
00091 }
00092 file_loaded=true;
00093
00094 if(F.key.DimU()>max_u)
00095 max_u=F.key.DimU();
00096 if(F.key.DimV()>max_v)
00097 max_v=F.key.DimV();
00098 }
00099 }
00100 }
00101 File.close();
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111 time_interval[1]=keys[keys.size()-1].time;
00112 return file_loaded;
00113 }
00114
00115 bool KeyFramer::Save(const char* fname)
00116 {
00117 bool file_saved=false;
00118 ofstream File;
00119
00120 File.open(fname);
00121
00122 if(!File.fail()){
00123
00124 File<<"#Keyframe Animation generated using frameEdit"<<std::endl;
00125
00126 for(unsigned int i=0;i<keys.size();i++){
00127 if(keys[i].name!=NULL)
00128 File<<keys[i].time<<" "<<keys[i].name<<" "<<keys[i].scale<<"\n";
00129 }
00130 }
00131 return file_saved;
00132 }
00133
00134 int KeyFramer::FindFrame(double time)
00135 {
00136 int frame;
00137
00138 if(time<0)
00139 frame=0;
00140 else if(time> keys[keys.size()-1].time)
00141 frame=(int)keys.size()-1;
00142 else{
00143 frame=0;
00144 while(keys[frame+1].time<time)
00145 frame++;
00146 }
00147 return frame;
00148 }
00149
00150 double KeyFramer::FindTime(unsigned int frame)
00151 {
00152 double time;
00153
00154 if(frame> keys.size()-1)
00155 time=keys.size()-1;
00156 else
00157 time=keys[frame].time;
00158
00159 return time;
00160 }
00161
00162 void KeyFramer::SetTime(double time)
00163 {
00164 if(time<0)
00165 sel_time=0;
00166 else if(time> keys[keys.size()-1].time){
00167 sel_time=time;
00168 sel_frame=(int)keys.size()-1;
00169 }
00170 else{
00171 sel_time=time;
00172 sel_frame=0;
00173 while(keys[sel_frame+1].time<time)
00174 sel_frame++;
00175 }
00176 }
00177
00178 void KeyFramer::SelectClosest(Point3d pos)
00179 {
00180 double time=(pos[0]-min[0])/(max[0]-min[0])*time_interval[1];
00181
00182 if(time<0){
00183 sel_time=0;
00184 sel_frame=0;
00185 }
00186 else if(time> keys[keys.size()-1].time){
00187 sel_time=time;
00188 sel_frame=(int)keys.size()-1;
00189
00190 } else {
00191 sel_time=time;
00192 sel_frame=0;
00193 while(sel_frame<keys.size()-1 && fabs(keys[sel_frame+1].time-time)<fabs(keys[sel_frame].time-time))
00194 sel_frame++;
00195 }
00196
00197
00198
00199 }
00200
00201 void KeyFramer::MoveSelect(Point3d pos){
00202
00203 double time=(pos[0]-min[0])/(max[0]-min[0])*time_interval[1];
00204
00205 Frame temp;
00206 keys[sel_frame].time=time;
00207
00208 while(sel_frame && keys[sel_frame].time<keys[sel_frame-1].time){
00209 temp=keys[sel_frame-1];
00210 keys[sel_frame-1]=keys[sel_frame];
00211 keys[sel_frame]=temp;
00212 sel_frame--;
00213 }
00214
00215
00216
00217 while(sel_frame<keys.size()-1 && keys[sel_frame].time>=keys[sel_frame+1].time){
00218 temp=keys[sel_frame+1];
00219 keys[sel_frame+1]=keys[sel_frame];
00220 keys[sel_frame]=temp;
00221 sel_frame++;
00222 }
00223
00224
00225
00226 if(sel_frame==0){
00227
00228 for(unsigned int i=0;i<keys.size();i++)
00229 keys[i].time-=sel_time;
00230
00231 time_interval[1]-=sel_time;
00232 sel_time=0;
00233 }
00234
00235
00236 }
00237
00238 void KeyFramer::SetFrame(unsigned int frame)
00239 {
00240 if(frame>keys.size()-1)
00241 frame=(int)keys.size()-1;
00242 sel_frame=frame;
00243 sel_time=keys[frame].time;
00244
00245 }
00246
00247 void KeyFramer::AddFrame()
00248 {
00249 if(fabs(keys[sel_frame].time-sel_time)>0.001){
00250 Frame t;
00251 t.key=GetSurfaceTime();
00252 t.time=sel_time;
00253 t.scale=1.0;
00254 t.name=NULL;
00255 keys.insert(keys.begin()+sel_frame+1,t);
00256
00257 sel_frame++;
00258
00259 if(sel_time>time_interval[1])
00260 time_interval[1]=sel_time;
00261 }
00262 }
00263
00264 void KeyFramer::DeleteFrame()
00265 {
00266 if(keys.size()>2){
00267
00268 if(sel_frame==0){
00269
00270 for(unsigned int i=0;i<keys.size();i++)
00271 keys[i].time-=sel_time;
00272
00273 time_interval[1]-=sel_time;
00274 sel_time=0;
00275
00276 }
00277 keys.erase(keys.begin()+sel_frame);
00278 }
00279 }
00280
00281 void KeyFramer::LoadSurface(const char* fname){
00282
00283 if(keys[sel_frame].name==NULL)
00284 keys[sel_frame].name=new char[80];
00285
00286 keys[sel_frame].key.LoadPatch(fname);
00287 strcpy(keys[sel_frame].name,fname);
00288 }
00289
00290 void KeyFramer::DisplayTime(double time){
00291 double ttime=sel_time;
00292 SetTime(time);
00293
00294 if(sel_frame==keys.size()-1 || keys[sel_frame].time==sel_time)
00295 keys[sel_frame].key.Draw(u_prec,v_prec);
00296 else{
00297 double t= (sel_time-keys[sel_frame].time) / (keys[sel_frame+1].time-keys[sel_frame].time);
00298
00299 BSplineSurface k=keys[sel_frame].key*keys[sel_frame].scale*(1-t)+keys[sel_frame+1].key*keys[sel_frame+1].scale*t;
00300 k.Draw(u_prec,v_prec);
00301
00302 }
00303 SetTime(ttime);
00304 }
00305
00306 void KeyFramer::DisplayFrame(unsigned int frame)
00307 {
00308 BSplineSurface k=keys[frame].key*keys[frame].scale;
00309
00310 k.Draw(u_prec,v_prec);
00311 }
00312
00313 void KeyFramer::DisplayTimeline()
00314 {
00315 glLineWidth(2.0);
00316 glBegin(GL_LINES);
00317 glColor3d(1.0,0.0,0.0);
00318 glVertex2d(sel_time/time_interval[1]*(max[0]-min[0])+min[0],max[1]);
00319 glVertex2d(sel_time/time_interval[1]*(max[0]-min[0])+min[0],min[1]);
00320 glEnd();
00321
00322 glBegin(GL_LINE_STRIP);
00323 for(unsigned int i=0;i<keys.size();i++){
00324
00325 if(i==sel_frame)
00326 glColor3f(1.0,1.0,0.0);
00327 else
00328 glColor3f(1.0,1.0,1.0);
00329 glVertex2f(keys[i].time/time_interval[1]*(max[0]-min[0])+min[0],0);
00330 glVertex2f(keys[i].time/time_interval[1]*(max[0]-min[0])+min[0],max[1]);
00331 glVertex2f(keys[i].time/time_interval[1]*(max[0]-min[0])+min[0],min[1]);
00332 glVertex2f(keys[i].time/time_interval[1]*(max[0]-min[0])+min[0],0);
00333 }
00334 glEnd();
00335
00336 if(gl_context){
00337 QFont k("Times",50,50);
00338 QFont l("Times",10,50);
00339 char p[10];
00340
00341 for(unsigned int i=0;i<keys.size();i++){
00342
00343 if(i==sel_frame)
00344 glColor3f(1.0,1.0,0.0);
00345 else
00346 glColor3f(1.0,1.0,1.0);
00347
00348 sprintf(p,"%d",i+1);
00349
00350 gl_context->renderText(keys[i].time/time_interval[1]*(max[0]-min[0])+min[0]-0.02,
00351 max[1]+0.01,0,p,k );
00352
00353 sprintf(p,"%4.2f",keys[i].time);
00354
00355 gl_context->renderText(keys[i].time/time_interval[1]*(max[0]-min[0])+min[0]-0.02,
00356 min[1]-0.05,0,p,l );
00357 }
00358 }
00359 }
00360
00361
00362 void KeyFramer::SetBoundingBox(Point2d min, Point2d max)
00363 {
00364 min=max;
00365 }
00366
00367 BSplineSurface KeyFramer::GetSurfaceFrame(unsigned int frame)
00368 {
00369 return keys[frame].key*keys[frame].scale;
00370 }
00371
00372 BSplineSurface KeyFramer::GetSurfaceTime(double time)
00373 {
00374 BSplineSurface k;
00375
00376
00377
00378 if(sel_frame==keys.size()-1 || keys[sel_frame].time==time)
00379 k=keys[sel_frame].key*keys[sel_frame].scale;
00380 else {
00381 double t= (time-keys[sel_frame].time) / (keys[sel_frame+1].time-keys[sel_frame].time);
00382
00383 k=keys[sel_frame].key*keys[sel_frame].scale*(1-t)+keys[sel_frame+1].key*keys[sel_frame+1].scale*t;
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409 }
00410 return k;
00411 }
00412
00413 BSplineSurface KeyFramer::GetSurfaceFrame()
00414 {
00415 return keys[sel_frame].key*keys[sel_frame].scale;
00416 }
00417
00418 BSplineSurface KeyFramer::GetSurfaceTime()
00419 {
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433 double t=sel_time;
00434 unsigned int f=sel_frame;
00435 BSplineSurface k;
00436
00437 SetTime(sel_time);
00438 k=GetSurfaceTime(sel_time);
00439 sel_time=t;
00440 sel_frame=f;
00441 return k;
00442 }
00443
00444 void KeyFramer::SetTime(Point3d pos)
00445 {
00446 SetTime((pos[0]-min[0])/(max[0]-min[0])*time_interval[1]);
00447 }
00448
00449 void KeyFramer::AdvanceTime(double time_increment)
00450 {
00451 if(sel_frame!=keys.size()-1){
00452 sel_time+=time_increment;
00453
00454
00455 while(sel_frame!=keys.size()-1 && sel_time>=keys[sel_frame].time)
00456 sel_frame++;
00457 }
00458 }
00459
00460 }