00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "ExCAnimation.h"
00025
00026 ExCAnimation::ExCAnimation()
00027 {
00028 Guard(ExCAnimation::ExCAnimation())
00029 ExCObject3D::ExCObject3D();
00030 SetName("ExCAnimation");
00031 SetType(typeid(this).name());
00032 m_Time=0;
00033 m_CurrentAnimation=0;
00034 m_Pause=false;
00035 UnGuard
00036 }
00037
00038 ExCAnimation::~ExCAnimation()
00039 {
00040 Guard(ExCAnimation::~ExCAnimation())
00041 UnGuard
00042 }
00043
00044
00045 void ExCAnimation::Draw(void)
00046 {
00047 Guard(void ExCAnimation::Draw(void))
00048
00049 for(unsigned int i=0;i<m_VecAnimation.size();i++)
00050 {
00051 m_VecAnimation.at(i).m_Line.Draw();
00052
00053 if(m_ShowPath)
00054 {
00055 ExCVec3D PositionAngle;
00056 glColor3f(0,0,1);
00057 glPushMatrix();
00058 PositionAngle=m_VecAnimation.at(i).m_Line.PointOnCurve(0.25);
00059 glTranslatef(PositionAngle.GetX(),PositionAngle.GetY(),PositionAngle.GetZ());
00060 glutWireSphere(5,8,8);
00061 glPopMatrix();
00062
00063 glPushMatrix();
00064 PositionAngle=m_VecAnimation.at(i).m_Line.PointOnCurve(0.5);
00065 glTranslatef(PositionAngle.GetX(),PositionAngle.GetY(),PositionAngle.GetZ());
00066 glutWireSphere(5,8,8);
00067 glPopMatrix();
00068
00069 glPushMatrix();
00070 PositionAngle=m_VecAnimation.at(i).m_Line.PointOnCurve(0.75);
00071 glTranslatef(PositionAngle.GetX(),PositionAngle.GetY(),PositionAngle.GetZ());
00072 glutWireSphere(5,8,8);
00073 glPopMatrix();
00074 }
00075 }
00076 float AgX,AgY,AgZ;
00077
00078 m_Object->m_Position=m_VecAnimation.at(m_CurrentAnimation).m_Line.PointOnCurve(m_Time);
00079
00080 if(!m_Pause)
00081 {
00082
00083 float nbriterprc;
00084 nbriterprc=m_VecAnimation.at(m_CurrentAnimation).m_NumberIter/4;
00085 if(m_Time==0)
00086 {
00087 m_Object->m_Angle.SetValue(m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint0.GetX(),
00088 m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint0.GetY(),
00089 m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint0.GetZ());
00090
00091 }else
00092 {
00093 if(m_Time<=0.25)
00094 {
00095 AgX=(m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint0.GetX()-m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint1.GetX())/nbriterprc;
00096 AgY=(m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint0.GetY()-m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint1.GetY())/nbriterprc;
00097 AgZ=(m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint0.GetZ()-m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint1.GetZ())/nbriterprc;
00098 m_Object->m_Angle.DecX(AgX);
00099 m_Object->m_Angle.DecY(AgY);
00100 m_Object->m_Angle.DecZ(AgZ);
00101
00102 }
00103 if(m_Time>0.25&&m_Time<0.5)
00104 {
00105
00106 AgX=(m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint1.GetX()-m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint2.GetX())/nbriterprc;
00107 AgY=(m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint1.GetY()-m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint2.GetY())/nbriterprc;
00108 AgZ=(m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint1.GetZ()-m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint2.GetZ())/nbriterprc;
00109 m_Object->m_Angle.DecX(AgX);
00110 m_Object->m_Angle.DecY(AgY);
00111 m_Object->m_Angle.DecZ(AgZ);
00112 }
00113 if(m_Time>0.5&&m_Time<0.75)
00114 {
00115 AgX=(m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint2.GetX()-m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint3.GetX())/nbriterprc;
00116 AgY=(m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint2.GetY()-m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint3.GetY())/nbriterprc;
00117 AgZ=(m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint2.GetZ()-m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint3.GetZ())/nbriterprc;
00118 m_Object->m_Angle.DecX(AgX);
00119 m_Object->m_Angle.DecY(AgY);
00120 m_Object->m_Angle.DecZ(AgZ);
00121 }
00122 if(m_Time>0.75&&m_Time<1)
00123 {
00124 AgX=(m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint3.GetX()-m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint4.GetX())/nbriterprc;
00125 AgY=(m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint3.GetY()-m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint4.GetY())/nbriterprc;
00126 AgZ=(m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint3.GetZ()-m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint4.GetZ())/nbriterprc;
00127 m_Object->m_Angle.DecX(AgX);
00128 m_Object->m_Angle.DecY(AgY);
00129 m_Object->m_Angle.DecZ(AgZ);
00130 }
00131
00132
00133 }
00134
00135
00136 if(m_Loop)m_Time=m_Time+m_VecAnimation.at(m_CurrentAnimation).m_Speed;
00137 if (m_Time>1)
00138 {
00139
00140 if(m_VecAnimation.at(m_CurrentAnimation).m_EndAction.m_Action!=0)
00141 {
00142 FluxAction->Push(m_VecAnimation.at(m_CurrentAnimation).m_EndAction);
00143 }
00144 m_Time=0;
00145 m_CurrentAnimation++;
00146 if(m_CurrentAnimation>=m_VecAnimation.size())
00147 {
00148 if(m_Loop)
00149 {
00150 m_CurrentAnimation=0;
00151 }
00152 }
00153 }
00154 }
00155 UnGuard
00156 }
00157
00158 void ExCAnimation::SetShowPathState(bool state)
00159 {
00160 m_ShowPath=state;
00161 for(unsigned int i=0;i<m_VecAnimation.size();i++)
00162 {
00163 m_VecAnimation.at(i).m_Line.SetVisibleState(m_ShowPath);
00164 }
00165 }
00166
00167 bool ExCAnimation::LoadFile(std::string FileName)
00168 {
00169 Guard(bool ExCAnimation::LoadFile(std::string FileName))
00170 m_VecAnimation.clear();
00171 SetFileName(FileName);
00172 SetName(FileName);
00173 char buffer[255];
00174 sprintf(buffer, "../Data/Animation/%s", FileName.data());
00175 std::ifstream fin;
00176 std::string buffstring;
00177 char b[256];
00178 fin.open(buffer,std::ios::in);
00179
00180 AnimationStruct Anim;
00181 int tmpNumber;
00182 if(fin.is_open())
00183 {
00184 try
00185 {
00186
00187 memset(b,0,255);
00188 fin.getline(b,256,'\n');
00189
00190 memset(b,0,255);
00191 fin.getline(b,256,'\n');
00192 m_Loop=ExNihilo::ExtractIntValueFromSring(b,"<Loop>","<#Loop>");
00193
00194 memset(b,0,255);
00195 fin.getline(b,256,'\n');
00196 m_TargetObjectType=ExNihilo::ExtracValueFromSring(b,"<TargetObjectType>","<#TargetObjectType>");
00197
00198 memset(b,0,255);
00199 fin.getline(b,256,'\n');
00200 m_TargetObjectName=ExNihilo::ExtracValueFromSring(b,"<TargetObjectName>","<#TargetObjectName>");
00201
00202 memset(b,0,255);
00203 fin.getline(b,256,'\n');
00204 m_ShowPath=(bool)ExNihilo::ExtractIntValueFromSring(b,"<ShowPath>","<#ShowPath>");
00205
00206 memset(b,0,255);
00207 fin.getline(b,256,'\n');
00208 tmpNumber=ExNihilo::ExtractIntValueFromSring(b,"<NumberOfBezier>","<#NumberOfBezier>");
00209
00210 for(int i=0;i<tmpNumber;i++)
00211 {
00212
00213 memset(b,0,255);
00214 fin.getline(b,256,'\n');
00215 Anim.m_Line.LoadFile(ExNihilo::ExtracValueFromSring(b,"<BezierFile>","<#BezierFile>"));
00216
00217 memset(b,0,255);
00218 fin.getline(b,256,'\n');
00219 Anim.m_Speed=ExNihilo::ExtractFloatValueFromSring(b,"<Speed>","<#Speed>");
00220
00221 memset(b,0,255);
00222 fin.getline(b,256,'\n');
00223
00224 buffstring=ExNihilo::ExtracValueFromSring(b,"<Exec_Action>","<#Exec_Action>");
00225 Anim.m_EndAction.m_Action=ExNihilo::ExtractIntValueFromSring(buffstring,"<Action>","<#Action>");
00226 Anim.m_EndAction.m_Param=ExNihilo::ExtracValueFromSring(buffstring,"<Param>","<#Param>");
00227 Anim.m_EndAction.m_Param1=ExNihilo::ExtracValueFromSring(buffstring,"<Param1>","<#Param1>");
00228 Anim.m_EndAction.m_Param2=ExNihilo::ExtracValueFromSring(buffstring,"<Param2>","<#Param2>");
00229 Anim.m_EndAction.m_ExecutingLife=ExNihilo::ExtractIntValueFromSring(buffstring,"<Timer>","<#Timer>");
00230 Anim.m_EndAction.m_StartingLife=(double)((double)glutGet(GLUT_ELAPSED_TIME)/1000);
00231
00232
00233 memset(b,0,255);
00234 fin.getline(b,256,'\n');
00235 buffstring=ExNihilo::ExtracValueFromSring(b,"<CtrlPoint0Angle>","<#CtrlPoint0Angle>");
00236 Anim.m_AngleCtrlPoint0.SetValue(ExNihilo::ExtractFloatValueFromSring(buffstring,"<X>","<#X>"),
00237 ExNihilo::ExtractFloatValueFromSring(buffstring,"<Y>","<#Y>"),
00238 ExNihilo::ExtractFloatValueFromSring(buffstring,"<Z>","<#Z>"));
00239
00240 memset(b,0,255);
00241 fin.getline(b,256,'\n');
00242 buffstring=ExNihilo::ExtracValueFromSring(b,"<CtrlPoint1Angle>","<#CtrtPoint1Angle>");
00243 Anim.m_AngleCtrlPoint1.SetValue(ExNihilo::ExtractFloatValueFromSring(buffstring,"<X>","<#X>"),
00244 ExNihilo::ExtractFloatValueFromSring(buffstring,"<Y>","<#Y>"),
00245 ExNihilo::ExtractFloatValueFromSring(buffstring,"<Z>","<#Z>"));
00246
00247 memset(b,0,255);
00248 fin.getline(b,256,'\n');
00249 buffstring=ExNihilo::ExtracValueFromSring(b,"<CtrlPoint2Angle>","<#CtrlPoint2Angle>");
00250 Anim.m_AngleCtrlPoint2.SetValue(ExNihilo::ExtractFloatValueFromSring(buffstring,"<X>","<#X>"),
00251 ExNihilo::ExtractFloatValueFromSring(buffstring,"<Y>","<#Y>"),
00252 ExNihilo::ExtractFloatValueFromSring(buffstring,"<Z>","<#Z>"));
00253
00254 memset(b,0,255);
00255 fin.getline(b,256,'\n');
00256 buffstring=ExNihilo::ExtracValueFromSring(b,"<CtrlPoint3Angle>","<#CtrlPoint3Angle>");
00257 Anim.m_AngleCtrlPoint3.SetValue(ExNihilo::ExtractFloatValueFromSring(buffstring,"<X>","<#X>"),
00258 ExNihilo::ExtractFloatValueFromSring(buffstring,"<Y>","<#Y>"),
00259 ExNihilo::ExtractFloatValueFromSring(buffstring,"<Z>","<#Z>"));
00260
00261 memset(b,0,255);
00262 fin.getline(b,256,'\n');
00263 buffstring=ExNihilo::ExtracValueFromSring(b,"<CtrlPoint4Angle>","<#CtrlPoint4Angle>");
00264 Anim.m_AngleCtrlPoint4.SetValue(ExNihilo::ExtractFloatValueFromSring(buffstring,"<X>","<#X>"),
00265 ExNihilo::ExtractFloatValueFromSring(buffstring,"<Y>","<#Y>"),
00266 ExNihilo::ExtractFloatValueFromSring(buffstring,"<Z>","<#Z>"));
00267
00268 Anim.m_NumberIter=1/Anim.m_Speed;
00269 m_VecAnimation.push_back(Anim);
00270 }
00271 fin.close();
00272 }
00273 catch(ExCExpStringNotFound)
00274 {
00275 std::cout<<"ExCExpStringNotFound"<<std::endl;
00276 }
00277 catch(...)
00278 {
00279 std::cout<<"ExCExpFileReadError"<<std::endl;
00280 throw ExCExpFileReadError();
00281 }
00282 }else throw ExCExpFileNotFound();
00283 SetShowPathState(m_ShowPath);
00284
00285
00286 try
00287 {
00288
00289 if(strcmpi(ManagerId->GetObjectManagerType(m_TargetObjectType).data(),"ExManagerCamera")==0)
00290 {
00291 m_Object=ManagerCamera->GetObject(ManagerId->GetObjectId(m_TargetObjectName,m_TargetObjectType));
00292
00293 }
00294 if(strcmpi(ManagerId->GetObjectManagerType(m_TargetObjectType).data(),"ExManagerModel")==0)
00295 {
00296 m_Object=ManagerModel->GetObject(ManagerId->GetObjectId(m_TargetObjectName,m_TargetObjectType));
00297
00298 }
00299 if(strcmpi(ManagerId->GetObjectManagerType(m_TargetObjectType).data(),"ExManagerEntity")==0)
00300 {
00301 m_Object=ManagerEntity->GetObject(ManagerId->GetObjectId(m_TargetObjectName,m_TargetObjectType));
00302
00303 }
00304 m_Object->m_Angle.SetValue(m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint0.GetX(),
00305 m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint0.GetY(),
00306 m_VecAnimation.at(m_CurrentAnimation).m_AngleCtrlPoint0.GetZ());
00307 return true;
00308 }catch (...)
00309 {
00310 std::cout<<"Wrong animation object chek name or object type in your anim file"<<std::endl;
00311 return false;
00312 }
00313 return false;
00314 UnGuard
00315 }
00316
00317