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       //if(strcmp(p_name,"INTERPOLATE"))
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   //   std::cout<<max_u<<" "<<max_v<<std::endl;
00104    
00105 /*  for(unsigned int i=0;i<keys.size();i++){
00106     keys[i].key.Resize(max_u,max_v);
00107       keys[i].key.SetPrecision(u_prec,v_prec);
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 //Not implemented;
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   //  Set_time(time);
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 //Hermite interpolation of key-frames
00386 
00387    double t= (time-keys[sel_frame].time) / (keys[sel_frame+1].time-keys[sel_frame].time);
00388  
00389    double h1 = 2*t*t*t -3*t*t +1;
00390    double h2 = -2*t*t*t +3*t*t ;
00391    double h3 = t*t*t -2*t*t +t;
00392    double h4 = t*t*t -t*t ;
00393    
00394 
00395    //Tangents estimated as in Catmull-Rom splines
00396    int s1 = sel_frame+1; 
00397    int s2 = (sel_frame+3>keys.size()) ? keys.size()-1 : sel_frame+2;
00398    int s3 = sel_frame;
00399    int s4 = (sel_frame<1) ? 0 : sel_frame-1; 
00400 
00401    BSplineSurface T1=(keys[s1].key*(keys[s1].scale)+keys[s4].key*(-keys[s4].scale));
00402    BSplineSurface T2=(keys[s2].key*(keys[s2].scale)+keys[s3].key*(-keys[s3].scale));
00403    h3*=0.5;
00404    h4*=0.5;
00405    h1*=keys[s3].scale;
00406    h2*=keys[s1].scale;
00407    k=keys[s3].key*h1 +keys[s1].key*h2 + T1*h3 + T2*h4;
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   BSplineSurface k;
00422 
00423  if(sel_frame==keys.size()-1 || keys[sel_frame].time==sel_time)
00424    k=keys[sel_frame].key*keys[sel_frame].scale;
00425   else{
00426     double t= (sel_time-keys[sel_frame].time) / (keys[sel_frame+1].time-keys[sel_frame].time);
00427 
00428     k=keys[sel_frame].key*keys[sel_frame].scale*(1-t)+keys[sel_frame+1].key*keys[sel_frame+1].scale*t;
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     //something is amiss here
00455     while(sel_frame!=keys.size()-1 && sel_time>=keys[sel_frame].time)
00456       sel_frame++;
00457   }
00458 }
00459 
00460 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
Generated on Fri May 31 15:37:53 2013 for VVE by  doxygen 1.6.3