Skeleton Class Reference

#include <Skeleton.h>

Collaboration diagram for Skeleton:

Collaboration graph
[legend]

List of all members.

Public Member Functions

 Skeleton ()
 Skeleton (const Skeleton &)
 ~Skeleton ()
int get_N_joint ()
Jointget_root ()
int add_joint_number ()
int read_reccursive_joint (Joint *current, int *k_joint, Joint **T_joint)
int load_bind_name (int N_name, char **name_bind_pose)
char * get_bone_name (int k_name)
int look_for_bone_index (char *name_bone)
int set_size_time (int k_bone, int size)
int get_size_time (int k_bone)
int set_time (int k_bone, int k_time, double val)
int set_angle (int k_bone, int k_time, int k_axis, double val)
int set_translate (int k_bone, int k_time, double tx, double ty, double tz)
int set_anim_matrix (int k_bone, int k_time, int k_dim, double value)
double get_angle (int k_bone, int k_time, int k_axis)
int deform_skeleton (double t, Skeleton *output)
int deform_reccursive_joint (Joint *current, double t, Joint *to_deform)
int init_time ()
int fix_init_bind_pose ()
int precalculate_matrix ()
int add_new_joint (double x, double y, double z, int father_number)
int read_anim ()
int cout_skeleton ()
int read_skeleton ()
int create_list_name ()
int reccursive_list_name_fill (Joint *current, int *k_bone)
Matrix get_rotation_animation (int k_bone, double t)
int fill_bones_number ()
int translate (double tx, double ty, double tz)
int translate (double *t)
int scale (double sx, double sy, double sz)
int scale (double *s)
int scale (double s)
Skeletonoperator= (const Skeleton &skeleton)
Jointget_joint (int k_bone)
Matrix get_position (int k_bone)
int change_father (int k_bone)
int new_father (double x, double y, double z)
int subsample_skeleton ()
int find_closest_joint (double x, double y, double z, double radius)
V_3D get_world_position_of_bone (int k_bone)
int reccursive_destroy ()
int get_access_number_of_joint_named (std::string &name_joint)
int get_access_number_of_joint_named (const char *name_joint)
int init_time_animation ()
int is_animated_section (int k_bone)
double get_first_anim_time (int k_bone)
double get_last_anim_time (int k_bone)
int unitize_time_variation ()
int add_anim_angle (int index_bone, int axis, double offset_angle)

Private Member Functions

int destroy ()
int copy_reccursive_joint (Joint *current, Joint *to_copy)
int read_reccursive_joint_cout (Joint *current, Joint *father, int *count, int *access_number)
int reccursive_fill_bones_access_number (Joint *current, int *count)
int reccursive_bone_looking_for (Joint *current, int *counter, Joint **joint, int k_bone)
int reccursive_bone_looking_for_position (Joint *current, Matrix M, int *counter, int k_bone, Matrix *P)
int recursive_bind_pose_fixing (Matrix D, Joint *current)
int reccursive_matrix_precalculation (Matrix D, Joint *current)
int reccursive_set_name_access_number (Joint *current)
int reccursive_look_for_new_father (int k_bone, Joint *current, Joint **new_root, Matrix temp_D, Matrix *D_init, int *is_good)
int add_reccursive_child (Joint *new_joint, Joint *old_joint, int forbidden_index)
int reccursive_destroy (Joint **current)
int cout_reccursive_joint (Joint *current, Joint *father, int *level, int *access_number)
int reccursive_subsample_skeleton (int k_delete, Joint **current)
int reccursive_scale (Joint *current, double *s)
int fill_joint_vector ()
int reccursive_fill_joint_vector (Joint *current)

Private Attributes

int N_joint
Jointjoint_root
int N_list_bones
std::vector
< Animation_transformation
anim
std::vector< Joint * > joint_access


Detailed Description

Definition at line 32 of file Skeleton.h.


Constructor & Destructor Documentation

Skeleton::Skeleton (  ) 

Definition at line 7 of file Skeleton.cpp.

References joint_access, joint_root, N_joint, and N_list_bones.

00008 {
00009   N_joint = 0;
00010   N_list_bones = 0;
00011   joint_root=NULL;
00012   joint_root=new Joint;
00013 
00014   if(joint_root==NULL)
00015     {
00016       cout<<"error allocation joint in Skeleton"<<endl;
00017       exit(-1);
00018     }
00019 
00020   joint_access.resize(0);
00021 
00022 }

Skeleton::Skeleton ( const Skeleton skeleton  ) 

Definition at line 1082 of file Skeleton.cpp.

References anim, copy_reccursive_joint(), joint_root, N_joint, N_list_bones, and read_skeleton().

01083 {
01084   
01085 
01086 
01087   joint_root = new Joint();
01088 
01089   N_joint = skeleton.N_joint;
01090 
01091   int k=0;
01092 
01093 
01094   N_list_bones = skeleton.N_list_bones;
01095   
01096   Joint *to_copy;
01097   to_copy= skeleton.joint_root;
01098   copy_reccursive_joint(joint_root,to_copy);
01099 
01100 
01101   anim.resize(skeleton.anim.size());
01102   for(k=0;k<(int)skeleton.anim.size();k++)
01103     anim[k] = skeleton.anim[k];
01104 
01105 //   joint_access.resize(skeleton.joint_access.size());
01106 //   for(k=0;k<(int)skeleton.joint_access.size();k++)
01107 //     joint_access[k] = skeleton.joint_access[k];
01108 
01109 
01110   read_skeleton();
01111 
01112 
01113 
01114 
01115 }

Here is the call graph for this function:

Skeleton::~Skeleton (  ) 

Definition at line 26 of file Skeleton.cpp.

References destroy(), and reccursive_destroy().

00027 {
00028   reccursive_destroy();
00029   destroy();
00030 }

Here is the call graph for this function:


Member Function Documentation

int Skeleton::get_N_joint (  ) 

Joint * Skeleton::get_root (  ) 

Definition at line 55 of file Skeleton.cpp.

References joint_root.

Referenced by deform_skeleton(), File_parser::load_collada_skeleton(), and File_parser::load_old_sk_skeleton().

00056 {
00057   if(joint_root==NULL)
00058     joint_root=new Joint;
00059   return joint_root;
00060 }

Here is the caller graph for this function:

int Skeleton::add_joint_number (  ) 

Definition at line 65 of file Skeleton.cpp.

References N_joint.

00066 {
00067   N_joint++;
00068   return 0;
00069 }

int Skeleton::read_reccursive_joint ( Joint current,
int *  k_joint,
Joint **  T_joint 
)

Definition at line 74 of file Skeleton.cpp.

References Joint::get_N_son(), and Joint::get_son().

00075 {
00076   (*k_joint)++;
00077 
00078   //get tree
00079   if(current->get_N_son()>0)
00080     {
00081       T_joint[*k_joint]=current;
00082       for(int k=0;k<current->get_N_son();k++)
00083         read_reccursive_joint(current->get_son(k),k_joint,T_joint);
00084     }
00085   //get leaf
00086   if(current->get_N_son()==0)
00087     T_joint[*k_joint]=current;
00088 
00089   
00090   return 0;
00091 }

Here is the call graph for this function:

int Skeleton::load_bind_name ( int  N_name,
char **  name_bind_pose 
)

char* Skeleton::get_bone_name ( int  k_name  ) 

int Skeleton::look_for_bone_index ( char *  name_bone  ) 

int Skeleton::set_size_time ( int  k_bone,
int  size 
)

Definition at line 98 of file Skeleton.cpp.

References anim.

Referenced by init_time(), init_time_animation(), File_parser::load_collada_animation(), load_model_1(), load_model_2(), and load_model_3().

00099 {
00100   int ok=0;
00101   if(anim.size()<=(unsigned int)k_bone)
00102       anim.resize(k_bone+1);
00103 
00104   ok += anim[k_bone].set_size_time(size);
00105   ok += anim[k_bone].set_size_angle(size);
00106 
00107   return ok;
00108 }

Here is the caller graph for this function:

int Skeleton::get_size_time ( int  k_bone  ) 

Definition at line 110 of file Skeleton.cpp.

References anim.

00111 {
00112 
00113   return anim[k_bone].get_size();
00114 }

int Skeleton::set_time ( int  k_bone,
int  k_time,
double  val 
)

Definition at line 116 of file Skeleton.cpp.

References anim.

Referenced by init_time(), init_time_animation(), File_parser::load_collada_animation(), load_model_1(), load_model_2(), and load_model_3().

00117 {
00118   int ok=0;
00119   ok += anim[k_bone].set_time(k_time,val);
00120   return ok;
00121 }

Here is the caller graph for this function:

int Skeleton::set_angle ( int  k_bone,
int  k_time,
int  k_axis,
double  val 
)

Definition at line 123 of file Skeleton.cpp.

References anim.

Referenced by add_anim_angle(), File_parser::load_collada_animation(), load_model_1(), load_model_2(), and load_model_3().

00124 {
00125   int ok=0;
00126   ok += anim[k_bone].set_angle(k_time,k_axis,val);
00127   return ok;
00128 }

Here is the caller graph for this function:

int Skeleton::set_translate ( int  k_bone,
int  k_time,
double  tx,
double  ty,
double  tz 
)

Definition at line 130 of file Skeleton.cpp.

References anim.

Referenced by File_parser::load_collada_animation().

00131 {
00132   int ok=0;
00133   ok += anim[k_bone].set_translation(k_time,tx,ty,tz);
00134   return ok;
00135 }

Here is the caller graph for this function:

int Skeleton::set_anim_matrix ( int  k_bone,
int  k_time,
int  k_dim,
double  value 
)

Definition at line 136 of file Skeleton.cpp.

References anim.

Referenced by File_parser::load_collada_animation().

00137 {
00138   int ok=0;
00139   ok += anim[k_bone].set_anim_matrix(k_time,k_dim,value);
00140   return 0;
00141 }

Here is the caller graph for this function:

double Skeleton::get_angle ( int  k_bone,
int  k_time,
int  k_axis 
)

Definition at line 388 of file Skeleton.cpp.

References anim.

Referenced by add_anim_angle().

00389 {
00390   return anim[k_bone].get_angle(k_time,k_axis);
00391 }

Here is the caller graph for this function:

int Skeleton::deform_skeleton ( double  t,
Skeleton output 
)

Definition at line 462 of file Skeleton.cpp.

References deform_reccursive_joint(), get_root(), joint_root, and precalculate_matrix().

Referenced by evolve(), load_model_1(), load_model_2(), and load_model_3().

00463 {
00464   int ok=0;
00465   
00466   Joint *current=joint_root;
00467   Joint *to_deform = output->get_root();
00468 
00469   deform_reccursive_joint(current,t,to_deform);
00470 
00471   ok += output->precalculate_matrix();
00472 
00473   return ok;
00474 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::deform_reccursive_joint ( Joint current,
double  t,
Joint to_deform 
)

Definition at line 477 of file Skeleton.cpp.

References anim, Joint::get_access_number(), Joint::get_matrix(), Joint::get_N_son(), Joint::get_son(), Matrix::invert(), and Joint::set_matrix().

Referenced by deform_skeleton().

00478 {
00479   int index_bone = current->get_access_number();
00480   Matrix R;
00481   Matrix T;
00482   Matrix M;
00483 
00484   Matrix R0 = anim[index_bone].get_rotation(0);
00485   Matrix R0m1 = R0.invert();
00486 
00487 
00488   R = anim[index_bone].get_rotation(t);
00489   T = anim[index_bone].get_translation(t);
00490   M = anim[index_bone].get_matrix(t);
00491 
00492 
00493 
00494 
00495   to_deform->set_matrix(current->get_matrix()*(T*R));
00496   //to_deform -> set_matrix(M*current->get_matrix());
00497   //to_deform -> set_matrix(M);
00498 
00499 
00500   int N_son=current->get_N_son();
00501   if(N_son>0)
00502     for(int k=0;k<N_son;k++)
00503       deform_reccursive_joint(current->get_son(N_son-k-1),t,to_deform->get_son(N_son-k-1));
00504 
00505   return 0;
00506 
00507 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::init_time (  ) 

Definition at line 509 of file Skeleton.cpp.

References N_joint, set_size_time(), and set_time().

Referenced by File_parser::load_old_sk_skeleton().

00510 {
00511   if(N_joint==0)
00512     {
00513       cout<<"Warning N_joint=0 in Seleton::init_time !!"<<endl;
00514       exit(-1);
00515     }
00516   for(int k=0;k<N_joint;k++)
00517     {
00518       set_size_time(k,2);
00519       set_time(k,0,0.0);
00520       set_time(k,1,1.0);
00521     }
00522   return 0;
00523 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::fix_init_bind_pose (  ) 

Definition at line 525 of file Skeleton.cpp.

References joint_root, and recursive_bind_pose_fixing().

Referenced by add_new_joint(), change_father(), load_model_1(), load_model_2(), load_model_3(), File_parser::load_old_sk_skeleton(), scale(), and translate().

00526 {
00527   int ok=0;
00528 
00529   Joint *current = joint_root;
00530   Matrix D;
00531 
00532   ok += recursive_bind_pose_fixing(D,current);
00533 
00534   return ok;
00535 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::precalculate_matrix (  ) 

int Skeleton::add_new_joint ( double  x,
double  y,
double  z,
int  father_number 
)

Definition at line 894 of file Skeleton.cpp.

References Joint::add_son(), fix_init_bind_pose(), get_joint(), Joint::get_son(), Joint::get_world_matrix(), Matrix::invert(), joint_root, precalculate_matrix(), read_skeleton(), reccursive_set_name_access_number(), Joint::set_matrix(), and Matrix::set_translation().

00895 {
00896   int ok=0;
00897 
00898   Joint *father = get_joint(father_number);
00899   father->add_son();
00900   Joint *current = father->get_son(0);
00901   //current = new Joint();
00902   if(current==NULL)
00903     printf("Error allocating Joint in add_new_joint\n");
00904 
00905   Matrix current_world_matrix;
00906   current_world_matrix.set_translation(x,y,z);
00907   Matrix current_local;
00908   
00909   current_local = (father->get_world_matrix().invert())*current_world_matrix;
00910 
00911   current->set_matrix(current_local);
00912 
00913 
00914   
00915 
00916   ok += fix_init_bind_pose();
00917   ok += read_skeleton();
00918   ok += reccursive_set_name_access_number(joint_root);
00919   ok += precalculate_matrix();
00920 
00921 
00922 
00923 //   if(father->get_N_son()>0)
00924 //     {
00925 //       int N_son = father->get_N_son();
00926 //       int k_son = 0;
00927 
00928 //       for(k_son=0;k_son<N_son;k_son++)
00929 //      {
00930 //        current->add_son();
00931 //        current->get_son(0) = father->get_son(N_son-k+1);
00932 //        current->set_father(father);
00933 //      }
00934 
00935 //     }
00936 
00937   return ok;
00938 }

int Skeleton::read_anim (  ) 

Definition at line 150 of file Skeleton.cpp.

References anim.

00151 {
00152   int k;
00153   cout<<"Size anim :"<<anim.size()<<endl;
00154   for(k=0;(unsigned int)k<anim.size();k++)
00155     {
00156       cout<<"anim "<<k<<":"<<" size= "<<anim[k].get_size()<<endl;
00157     }
00158   return 0;
00159 }

int Skeleton::cout_skeleton (  ) 

Definition at line 728 of file Skeleton.cpp.

References cout_reccursive_joint(), joint_root, and N_joint.

00729 {
00730   Joint *current=joint_root;
00731   Joint *father=joint_root;
00732   int k=0;
00733 
00734   N_joint=0;
00735   int access_number=0;
00736   cout_reccursive_joint(current,father,&k,&access_number);
00737 
00738   return 0;
00739 }

Here is the call graph for this function:

int Skeleton::read_skeleton (  ) 

Definition at line 236 of file Skeleton.cpp.

References joint_root, N_joint, and read_reccursive_joint_cout().

Referenced by add_new_joint(), change_father(), get_N_joint(), File_parser::load_collada_skeleton(), load_model_1(), load_model_2(), load_model_3(), File_parser::load_old_sk_skeleton(), new_father(), operator=(), File_parser::save_skeleton_sk(), scale(), Skeleton(), and subsample_skeleton().

00237 {
00238   Joint *current=joint_root;
00239   Joint *father=joint_root;
00240   int k=0;
00241 
00242   N_joint=0;
00243   int access_number=0;
00244   read_reccursive_joint_cout(current,father,&k,&access_number);
00245 
00246   return 0;
00247 }

Here is the call graph for this function:

int Skeleton::create_list_name (  ) 

int Skeleton::reccursive_list_name_fill ( Joint current,
int *  k_bone 
)

Matrix Skeleton::get_rotation_animation ( int  k_bone,
double  t 
)

Definition at line 270 of file Skeleton.cpp.

References anim.

00271 {
00272   return anim[k_bone].get_rotation(t);
00273 }

int Skeleton::fill_bones_number (  ) 

Definition at line 276 of file Skeleton.cpp.

References joint_root, and reccursive_fill_bones_access_number().

00277 {
00278   int ok=0;
00279   Joint *current = joint_root;
00280 
00281   int count=0;
00282   ok += reccursive_fill_bones_access_number(current,&count);
00283 
00284   return ok;
00285 }

Here is the call graph for this function:

int Skeleton::translate ( double  tx,
double  ty,
double  tz 
)

Definition at line 315 of file Skeleton.cpp.

00316 {
00317   double t[3]={tx,ty,tz};
00318   return translate(t);
00319 }

int Skeleton::translate ( double *  t  ) 

Definition at line 300 of file Skeleton.cpp.

References fix_init_bind_pose(), Joint::get_matrix(), joint_root, precalculate_matrix(), Joint::set_matrix(), Matrix::set_value(), and Matrix::value().

00301 {
00302   int k_dim=0;
00303   Matrix D=joint_root->get_matrix();
00304   for(k_dim=0;k_dim<3;k_dim++)
00305     D.set_value(D.value(3,k_dim)+t[k_dim],3,k_dim);
00306   joint_root->set_matrix(D);
00307 
00308 
00309   fix_init_bind_pose();
00310   precalculate_matrix();
00311 
00312   return 0;
00313 }

Here is the call graph for this function:

int Skeleton::scale ( double  sx,
double  sy,
double  sz 
)

Definition at line 357 of file Skeleton.cpp.

Referenced by load_model_1(), and scale().

00358 {
00359   double s[3]={sx,sy,sz};
00360   return scale(s);
00361 }

Here is the caller graph for this function:

int Skeleton::scale ( double *  s  ) 

Definition at line 338 of file Skeleton.cpp.

References fix_init_bind_pose(), joint_root, precalculate_matrix(), read_skeleton(), and reccursive_scale().

00339 {
00340 
00341 
00342   reccursive_scale(joint_root,s);
00343 
00344 
00345   fix_init_bind_pose();
00346   read_skeleton();
00347   precalculate_matrix();
00348 
00349 //   Matrix D=joint_root->get_matrix();
00350 //   for(k_dim=0;k_dim<3;k_dim++)
00351 //     D.set_value(D.value(3,k_dim)*s[k_dim],3,k_dim);
00352 //   joint_root->set_matrix(D);
00353 
00354   return 0;
00355 }

Here is the call graph for this function:

int Skeleton::scale ( double  s  ) 

Definition at line 363 of file Skeleton.cpp.

References scale().

00364 {
00365   double _s[3]={s,s,s};
00366   return scale(_s);
00367 }

Here is the call graph for this function:

Skeleton & Skeleton::operator= ( const Skeleton skeleton  ) 

Definition at line 161 of file Skeleton.cpp.

References anim, copy_reccursive_joint(), joint_access, joint_root, N_joint, N_list_bones, read_skeleton(), and reccursive_destroy().

00162 {
00163 
00164 
00165   
00166   reccursive_destroy(&joint_root);
00167   joint_root = new Joint();
00168 
00169   //  joint_root = new Joint();
00170   N_joint = skeleton.N_joint;
00171 
00172   int k=0;
00173 
00174 
00175   N_list_bones = skeleton.N_list_bones;
00176   
00177   Joint *to_copy=NULL;
00178   to_copy= skeleton.joint_root;
00179   copy_reccursive_joint(joint_root,to_copy);
00180 
00181 
00182   anim.resize(skeleton.anim.size());
00183   for(k=0;k<(int)skeleton.anim.size();k++)
00184     anim[k] = skeleton.anim[k];
00185 
00186   joint_access.resize(skeleton.joint_access.size());
00187   for(k=0;k<(int)skeleton.joint_access.size();k++)
00188     joint_access[k] = skeleton.joint_access[k];
00189 
00190 
00191   read_skeleton();
00192 
00193   return *this;
00194 }

Here is the call graph for this function:

Joint * Skeleton::get_joint ( int  k_bone  ) 

Definition at line 393 of file Skeleton.cpp.

References joint_access.

Referenced by add_new_joint(), OpenGL_drawer::draw_skeleton(), find_closest_joint(), get_access_number_of_joint_named(), Skinned::get_vertex_to_bone_distance(), get_world_position_of_bone(), File_parser::load_collada_skining_attribute(), File_parser::save_skeleton_sk(), and Skinned::skinning().

00394 {
00395 
00396   if(k_bone<0 || k_bone>=(int)joint_access.size())
00397     {printf("Error in get_joint in Skeleton, k_bone[%d] (size=%d) is not correct\n",k_bone,joint_access.size());exit(-1);}
00398   return joint_access[k_bone];
00399 
00400 //   if(k_bone<0 || k_bone>N_joint){printf("ERROR in get_joint in Skeleton, this joint does not exists [%d]\n",k_bone);exit(-1);}
00401 
00402 //   Joint *current = joint_root;
00403 //   Joint *joint=NULL;
00404 //   int counter=0;
00405 
00406 //   reccursive_bone_looking_for(current,&counter,&joint,k_bone);
00407 //   return joint;
00408 }

Here is the caller graph for this function:

Matrix Skeleton::get_position ( int  k_bone  ) 

Definition at line 431 of file Skeleton.cpp.

References counter, joint_root, and reccursive_bone_looking_for_position().

00432 {
00433 
00434   Matrix P;
00435 
00436   Joint *current = joint_root;
00437   int counter=0;
00438   Matrix M;
00439   reccursive_bone_looking_for_position(current,M,&counter,k_bone,&P);
00440   return P;
00441 }

Here is the call graph for this function:

int Skeleton::change_father ( int  k_bone  ) 

Definition at line 578 of file Skeleton.cpp.

References add_reccursive_child(), Joint::add_son(), fix_init_bind_pose(), Joint::get_access_number(), Joint::get_father(), Joint::get_matrix(), Joint::get_N_son(), Joint::get_son(), Matrix::invert(), joint_root, precalculate_matrix(), read_skeleton(), reccursive_destroy(), reccursive_look_for_new_father(), reccursive_set_name_access_number(), and Joint::set_matrix().

00579 {
00580 
00581   int ok=0;
00582 
00583   Joint *current = joint_root;
00584   Joint *new_root = NULL;
00585   Matrix D_init;
00586   Matrix temp_D;
00587 
00588   int is_good=0;
00589   ok += reccursive_set_name_access_number(joint_root);
00590   ok += reccursive_look_for_new_father(k_bone,current,&new_root,temp_D,&D_init,&is_good);
00591 
00592 
00593 
00594 
00595   Joint *futur_root = new Joint();
00596   *futur_root = *new_root;
00597   ok += add_reccursive_child(futur_root,new_root,-1);  
00598   //cout<<" ns :"<<futur_root->get_N_son()<<endl;
00599 
00600   Joint *futur_current = futur_root;
00601   current = new_root;
00602   Joint *save_current=NULL;
00603   int N_son=0;
00604   int k_son=0;
00605 
00606   int son_index=0;
00607   while(current->get_father()!=current)//old root node
00608     {
00609 
00610       son_index = current->get_access_number();
00611       save_current = current;
00612 
00613       current = current->get_father();
00614 
00615   
00616       //old father become new son
00617       futur_current->add_son();
00618       futur_current = futur_current->get_son(0);
00619       *futur_current=*current;
00620       futur_current->set_matrix(save_current->get_matrix().invert());
00621 
00622       //add son branch
00623       N_son=current->get_N_son();
00624       if(current->get_N_son()>1)
00625         //do not change the matrix comming from a father
00626         for(k_son=0;k_son<N_son;k_son++)
00627           if(current->get_son(N_son-k_son-1)->get_access_number()!=son_index)//this index must not be added
00628             {
00629               futur_current->add_son();
00630               ok += add_reccursive_child(futur_current->get_son(0),current->get_son(N_son-k_son-1),son_index);
00631             }
00632 
00633     }
00634   ok += reccursive_destroy(&joint_root);
00635   joint_root = futur_root;
00636   joint_root->set_matrix(D_init);
00637 
00638   read_skeleton();
00639   fix_init_bind_pose();
00640 
00641   Matrix Id;
00642   //futur_root->set_matrix(Id);
00643 
00644   ok += read_skeleton();
00645   ok += reccursive_set_name_access_number(joint_root);//name = access number
00646   ok += precalculate_matrix();
00647 
00648   return ok;
00649 }

int Skeleton::new_father ( double  x,
double  y,
double  z 
)

Definition at line 969 of file Skeleton.cpp.

References destroy(), joint_root, N_joint, precalculate_matrix(), read_skeleton(), reccursive_set_name_access_number(), and Joint::set_position().

00970 {
00971   destroy();
00972 
00973   N_joint=1;
00974   joint_root = new Joint;
00975   joint_root->set_position(x,y,z);
00976 
00977 
00978   read_skeleton();
00979   reccursive_set_name_access_number(joint_root);//name = access number
00980   precalculate_matrix();
00981 
00982   return 0;
00983 }

Here is the call graph for this function:

int Skeleton::subsample_skeleton (  ) 

Definition at line 767 of file Skeleton.cpp.

References joint_root, precalculate_matrix(), read_skeleton(), and reccursive_subsample_skeleton().

00768 {
00769   int ok=0;
00770   int k_delete=0;
00771   Joint *current = joint_root;
00772 
00773   ok += read_skeleton();
00774   ok += precalculate_matrix();
00775 
00776   ok += reccursive_subsample_skeleton(k_delete,&current);
00777 
00778   ok += read_skeleton();
00779   ok += precalculate_matrix();
00780 
00781   return ok;
00782 }

Here is the call graph for this function:

int Skeleton::find_closest_joint ( double  x,
double  y,
double  z,
double  radius 
)

Definition at line 863 of file Skeleton.cpp.

References get_joint(), Matrix::get_position(), Joint::get_world_matrix(), N_joint, and V_3D::set().

00864 {
00865   Joint *current=NULL;
00866   int k_joint=0;
00867 
00868   V_3D P1;P1.set(x,y,z);
00869   V_3D P2;double p[3];
00870 
00871   double distance=0.0;
00872   double distance_min=99.9;
00873   int k_closest=-1;
00874 
00875   for(k_joint=0;k_joint<N_joint;k_joint++)
00876     {
00877       current = get_joint(k_joint);
00878       current->get_world_matrix().get_position(p);
00879       P2.set(p);
00880 
00881       distance = (P1-P2).norm();
00882       //printf("%d : %f\n",k_joint,distance);
00883       if(distance_min>distance && distance<radius)
00884         {
00885           k_closest=k_joint;
00886           distance_min = distance;
00887         }
00888     }
00889 
00890   return k_closest;
00891 }

Here is the call graph for this function:

V_3D Skeleton::get_world_position_of_bone ( int  k_bone  ) 

Definition at line 943 of file Skeleton.cpp.

References get_joint(), Matrix::get_position(), and Joint::get_world_matrix().

Referenced by OpenGL_drawer::draw_skeleton(), and Skinned::get_vertex_to_bone_distance().

00944 {
00945   return get_joint(k_bone)->get_world_matrix().get_position();
00946 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::reccursive_destroy (  ) 

Definition at line 719 of file Skeleton.cpp.

References joint_root.

Referenced by change_father(), File_parser::load_collada_skeleton(), operator=(), reccursive_destroy(), and ~Skeleton().

00720 {
00721   if(joint_root!=NULL)
00722     reccursive_destroy(&joint_root);
00723   return 0;
00724 }

Here is the caller graph for this function:

int Skeleton::get_access_number_of_joint_named ( std::string &  name_joint  ) 

Definition at line 987 of file Skeleton.cpp.

References Joint::get_access_number(), get_joint(), get_N_joint(), Joint::get_name(), Joint::get_weight_name(), and joint_root.

Referenced by get_access_number_of_joint_named(), File_parser::load_collada_animation(), and File_parser::load_collada_skining_attribute().

00988 {
00989 
00990 
00991   int count=0;
00992   Joint *current=joint_root;
00993   if(current==NULL)
00994     {printf("Error joint_root is null in get_access_number_of_joint_named in Skeleton\n");exit(-1);}
00995 
00996   
00997   for(count=0;count<get_N_joint()-1 && (name_joint != current->get_name()) && (name_joint != current->get_weight_name()) ;count++)
00998     current = get_joint(count+1);
00999 
01000   if(current==NULL || ((name_joint != current->get_name())&&(name_joint != current->get_weight_name())))
01001     {printf("WARNING cannot find joint [%s] in get_access_number_of_joint_named in skeleton\n",name_joint.data());return(-1);};//exit(-1);}
01002 
01003   return current->get_access_number();
01004 
01005 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::get_access_number_of_joint_named ( const char *  name_joint  ) 

Definition at line 1006 of file Skeleton.cpp.

References get_access_number_of_joint_named().

01007 {
01008   std::string name;
01009   name = name_joint;
01010   return get_access_number_of_joint_named(name);
01011 }

Here is the call graph for this function:

int Skeleton::init_time_animation (  ) 

Definition at line 1013 of file Skeleton.cpp.

References get_N_joint(), set_size_time(), and set_time().

Referenced by File_parser::load_collada_skeleton().

01014 {
01015   for(int k=0;k<get_N_joint();k++)
01016     {
01017       set_size_time(k,2);
01018       set_time(k,0,0.0);
01019       set_time(k,1,2000.0);
01020     }
01021 
01022   return 0;
01023 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::is_animated_section ( int  k_bone  ) 

Definition at line 1025 of file Skeleton.cpp.

References anim.

01026 {
01027   if(k_bone >= (int)anim.size())
01028     {printf("error k_bone too large in is_animated_section\n");exit(-1);}
01029 
01030   if(anim[k_bone].get_size()==2)
01031     return 0;
01032   else
01033     return 1;
01034 
01035 }

double Skeleton::get_first_anim_time ( int  k_bone  ) 

Definition at line 1037 of file Skeleton.cpp.

References anim.

01038 {
01039   if(k_bone >= (int)anim.size())
01040     {printf("error k_bone too large in is_animated_section\n");exit(-1);}
01041 
01042   return anim[k_bone].get_time(0);
01043 }

double Skeleton::get_last_anim_time ( int  k_bone  ) 

Definition at line 1044 of file Skeleton.cpp.

References anim.

01045 {
01046   if(k_bone >= (int)anim.size())
01047     {printf("error k_bone too large in is_animated_section\n");exit(-1);}
01048 
01049   return anim[k_bone].get_time(anim[k_bone].get_size()-1);
01050 }

int Skeleton::unitize_time_variation (  ) 

Definition at line 1052 of file Skeleton.cpp.

References anim, and get_N_joint().

01053 {
01054   int k_bone=0;
01055   int k_t=0;
01056   double current_t=0.0;
01057   double t_min=0.0,t_max=0.0;
01058   for(k_bone=0;k_bone<get_N_joint();k_bone++)
01059     {
01060       t_min = anim[k_bone].get_time(0);
01061       t_max = anim[k_bone].get_time(anim[k_bone].get_size()-1);
01062 
01063       for(k_t=0;k_t<anim[k_bone].get_size();k_t++)
01064         {
01065           current_t = anim[k_bone].get_time(k_t);
01066           anim[k_bone].set_time(k_t,(current_t-t_min)/(t_max-t_min));
01067         }
01068     }
01069 
01070   return 0;
01071 }

Here is the call graph for this function:

int Skeleton::add_anim_angle ( int  index_bone,
int  axis,
double  offset_angle 
)

Definition at line 1073 of file Skeleton.cpp.

References anim, get_angle(), and set_angle().

01074 {
01075   int k_time;
01076   for(k_time=0;k_time<anim[index_bone].get_size();k_time++)
01077     anim[index_bone].set_angle(k_time,axis,offset_angle+anim[index_bone].get_angle(k_time,axis));
01078 
01079   return 0;
01080 }

Here is the call graph for this function:

int Skeleton::destroy (  )  [private]

Definition at line 34 of file Skeleton.cpp.

References joint_root.

Referenced by new_father(), and ~Skeleton().

00035 {
00036   int ok=0;
00037 
00038 
00039   if(joint_root!=NULL)
00040     delete joint_root;
00041 
00042 
00043   return ok;
00044 }

Here is the caller graph for this function:

int Skeleton::copy_reccursive_joint ( Joint current,
Joint to_copy 
) [private]

Definition at line 196 of file Skeleton.cpp.

References Joint::add_son(), Joint::get_access_number(), Joint::get_bind_pose(), Joint::get_father(), Joint::get_matrix(), Joint::get_N_son(), Joint::get_name(), Joint::get_orientation(), Joint::get_son(), Joint::set_access_number(), Joint::set_bind_pose(), Joint::set_father(), Joint::set_matrix(), Joint::set_name(), and Joint::set_orientation().

Referenced by operator=(), and Skeleton().

00197 {
00198   int ok=0;
00199 
00200   current->set_name(to_copy->get_name());
00201   double orientation[3];
00202   to_copy->get_orientation(orientation);
00203   current->set_orientation(orientation);
00204   current->set_bind_pose(to_copy->get_bind_pose());
00205   current->set_matrix(to_copy->get_matrix());
00206   current->set_access_number(to_copy->get_access_number());
00207 
00208   //  cout<<current->get_matrix()<<endl;
00209 
00210   Joint *father = current;
00211   int k_son=0;
00212 
00213   int N_son = to_copy->get_N_son();
00214   if(N_son>0)
00215     {
00216       for(k_son=0;k_son<N_son;k_son++)
00217         {
00218 
00219           current->add_son();
00220           current = current->get_son(0);
00221 
00222           //      cout<<N_son-k_son-1<<", "<<N_son<<endl;
00223 
00224           //to_copy = to_copy->get_son(k_son);
00225           current->set_father(father);
00226           ok += copy_reccursive_joint(current,to_copy->get_son(N_son-k_son-1));
00227           //ok += copy_reccursive_joint(current,to_copy->get_son(k_son));
00228           current = current->get_father();
00229         }
00230     }
00231 
00232   return ok;
00233 }

Here is the caller graph for this function:

int Skeleton::read_reccursive_joint_cout ( Joint current,
Joint father,
int *  count,
int *  access_number 
) [private]

Definition at line 249 of file Skeleton.cpp.

References Joint::get_N_son(), Joint::get_son(), N_joint, Joint::set_access_number(), and Joint::set_level().

Referenced by read_skeleton().

00250 {
00251   //cout<<"l."<<*level<<" joint :"<<current->get_name()<<"("<<current->get_access_number()<<") father: "<<father->get_name()<<"("<<father->get_access_number()<<") number of son: "<<current->get_N_son()<<endl;
00252 
00253   current->set_access_number(*access_number);
00254   current->set_level(*level);
00255   *access_number=*access_number+1;
00256 
00257   father = current;
00258   for(int k=0;k<current->get_N_son();k++)
00259     {
00260       //      current = current->get_son(k);
00261       *level=*level+1;
00262       read_reccursive_joint_cout(current->get_son(current->get_N_son()-k-1),father,level,access_number);
00263       *level=*level-1;
00264     }
00265   N_joint++;
00266   return 0;
00267 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::reccursive_fill_bones_access_number ( Joint current,
int *  count 
) [private]

Definition at line 287 of file Skeleton.cpp.

References Joint::get_N_son(), and Joint::get_son().

Referenced by fill_bones_number().

00288 {
00289   int ok=0;
00290   //ok += current->set_access_number(look_for_bone_index(current->get_name()));
00291   
00292   *count = *count+1;
00293   int k_son=0;
00294   for(k_son=0;k_son<current->get_N_son();k_son++)
00295     reccursive_fill_bones_access_number(current->get_son(k_son),count);
00296 
00297   return ok;
00298 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::reccursive_bone_looking_for ( Joint current,
int *  counter,
Joint **  joint,
int  k_bone 
) [private]

Definition at line 410 of file Skeleton.cpp.

References Joint::get_N_son(), and Joint::get_son().

00411 {
00412   int N_son=current->get_N_son();
00413 
00414   if(*counter==k_bone)
00415     *joint = current;
00416 
00417 
00418   *counter = *counter+1;
00419   for(int k_son=0;*counter<=k_bone && k_son<N_son;k_son++)
00420     reccursive_bone_looking_for(current->get_son(N_son-k_son-1),counter,joint,k_bone);
00421 
00422 
00423   return 0;
00424 
00425 
00426 }

Here is the call graph for this function:

int Skeleton::reccursive_bone_looking_for_position ( Joint current,
Matrix  M,
int *  counter,
int  k_bone,
Matrix P 
) [private]

Definition at line 443 of file Skeleton.cpp.

References Joint::get_matrix(), Joint::get_N_son(), Joint::get_son(), and Matrix::multiply().

Referenced by get_position().

00444 {
00445   M = M.multiply(current->get_matrix());
00446   if(*counter==k_bone)
00447     *P=M;
00448 
00449   *counter = *counter+1;
00450   if(*counter<=k_bone)
00451     for(int k_son=0;*counter<=k_bone && k_son<current->get_N_son();k_son++)
00452       {
00453         reccursive_bone_looking_for_position(current->get_son(k_son),M,counter,k_bone,P);
00454       }
00455   return 0;
00456 
00457 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::recursive_bind_pose_fixing ( Matrix  D,
Joint current 
) [private]

Definition at line 537 of file Skeleton.cpp.

References Joint::get_matrix(), Joint::get_N_son(), Joint::get_son(), Matrix::invert(), and Joint::set_bind_pose().

Referenced by fix_init_bind_pose().

00538 {
00539 
00540   D = D*current->get_matrix();
00541 
00542   current->set_bind_pose(D.invert());
00543   for(int k=0;k<current->get_N_son();k++)
00544     recursive_bind_pose_fixing(D,current->get_son(current->get_N_son()-k-1));
00545 
00546   return 0;
00547 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::reccursive_matrix_precalculation ( Matrix  D,
Joint current 
) [private]

Definition at line 562 of file Skeleton.cpp.

References Joint::get_bind_pose(), Joint::get_matrix(), Joint::get_N_son(), Joint::get_son(), Joint::set_T(), and Joint::set_world_matrix().

Referenced by precalculate_matrix().

00563 {
00564   D = D*current->get_matrix();
00565   current->set_world_matrix(D);
00566   current->set_T(D*current->get_bind_pose());
00567 
00568 //   cout<<current->get_access_number()<<endl;
00569 //   cout<<current->get_world_matrix()<<endl;
00570 
00571   int k=0;
00572   for(k=0;k<current->get_N_son();k++)
00573     reccursive_matrix_precalculation(D,current->get_son(current->get_N_son()-k-1));
00574   return 0;
00575 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::reccursive_set_name_access_number ( Joint current  )  [private]

Definition at line 651 of file Skeleton.cpp.

References Joint::get_access_number(), Joint::get_N_son(), Joint::get_son(), and Joint::set_name().

Referenced by add_new_joint(), change_father(), and new_father().

00652 {
00653   char value[10];
00654   sprintf(value,"%d",current->get_access_number());
00655   current->set_name(value);
00656   for(int k_son=0;k_son<current->get_N_son();k_son++)
00657     reccursive_set_name_access_number(current->get_son(current->get_N_son()-k_son-1));
00658   return 0;
00659 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::reccursive_look_for_new_father ( int  k_bone,
Joint current,
Joint **  new_root,
Matrix  temp_D,
Matrix D_init,
int *  is_good 
) [private]

Definition at line 661 of file Skeleton.cpp.

References Joint::get_access_number(), Joint::get_matrix(), Joint::get_N_son(), and Joint::get_son().

Referenced by change_father().

00662 {
00663 
00664   int k_son=0;
00665 
00666 
00667   if(*is_good==0)
00668     temp_D = temp_D*current->get_matrix();
00669   if(current->get_access_number()==k_bone)
00670   {
00671     *new_root = current;
00672     *is_good=1;
00673     (*D_init) = temp_D;
00674   }
00675   else
00676     for(k_son=0;*is_good==0 && k_son<current->get_N_son();k_son++)
00677       reccursive_look_for_new_father(k_bone,current->get_son(current->get_N_son()-k_son-1),new_root,temp_D,D_init,is_good);
00678 
00679   return 0;
00680 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::add_reccursive_child ( Joint new_joint,
Joint old_joint,
int  forbidden_index 
) [private]

Definition at line 683 of file Skeleton.cpp.

References Joint::add_son(), Joint::get_access_number(), Joint::get_N_son(), and Joint::get_son().

Referenced by change_father().

00684 {
00685   int k_son=0;
00686   int N_son = old_joint->get_N_son();
00687 
00688   *new_joint = *old_joint;
00689   //cout<<"b"<<new_joint->get_access_number()<<endl;
00690   for(k_son=0;k_son<N_son;k_son++)
00691     {
00692       if(old_joint->get_son(N_son-k_son-1)->get_access_number()!=forbidden_index)//this index must not be added
00693         {
00694           new_joint->add_son();
00695           add_reccursive_child(new_joint->get_son(0),old_joint->get_son(N_son-k_son-1),forbidden_index);
00696         }
00697     }
00698 
00699 
00700 
00701   return 0;
00702   
00703 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::reccursive_destroy ( Joint **  current  )  [private]

Definition at line 705 of file Skeleton.cpp.

References Joint::get_son(), and reccursive_destroy().

00706 {
00707   Joint *child;
00708   for(int k_son=0;k_son<(*current)->get_N_son();k_son++)
00709     {
00710       child =  (*current)->get_son((*current)->get_N_son()-k_son-1);
00711       reccursive_destroy(&child);
00712     }
00713 
00714   delete *current;
00715   *current=NULL;
00716   return 0;
00717 }

Here is the call graph for this function:

int Skeleton::cout_reccursive_joint ( Joint current,
Joint father,
int *  level,
int *  access_number 
) [private]

Definition at line 741 of file Skeleton.cpp.

References Joint::get_access_number(), Joint::get_father(), Joint::get_N_son(), Joint::get_name(), Joint::get_son(), and N_joint.

Referenced by cout_skeleton().

00742 {
00743   cout<<"lev."<<*level<<" joint :"<<current->get_name()<<"("<<current->get_access_number()<<") father: "<<current->get_father()->get_name()<<"("<<current->get_father()->get_access_number()<<") number of son: "<<current->get_N_son();
00744   cout<<" [";
00745   for(int k=0;k<current->get_N_son()-1;k++)
00746     printf("%d,",current->get_son(current->get_N_son()-k-1)->get_access_number());
00747   if(current->get_N_son()>0)
00748     printf("%d",current->get_son(0)->get_access_number());
00749   cout<<"]"<<endl;
00750 
00751   //current->set_access_number(*access_number);
00752   *access_number=*access_number+1;
00753 
00754   father = current;
00755   for(int k=0;k<current->get_N_son();k++)
00756     {
00757       //      current = current->get_son(k);
00758       *level=*level+1;
00759       cout_reccursive_joint(current->get_son(current->get_N_son()-k-1),father,level,access_number);
00760       *level=*level-1;
00761     }
00762   N_joint++;
00763   return 0;
00764 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::reccursive_subsample_skeleton ( int  k_delete,
Joint **  current 
) [private]

Definition at line 784 of file Skeleton.cpp.

References Joint::get_matrix(), Joint::get_son(), PI, Joint::set_father(), and Joint::set_matrix().

Referenced by subsample_skeleton().

00785 {
00786   int k_son=0;
00787   int N_son = (*current)->get_N_son();
00788   int is_deleted = 0;
00789 
00790   double L_max=0.15*5;//size max between two joints
00791   double angle_max = 20;
00792 
00793   if(N_son==1 && (*current)->get_father()->get_N_son()==1)
00794     {
00795 
00796       
00797       //calculate angle
00798       double X0[3],X1[3],X2[3];
00799       
00800       (*current)->get_father()->get_world_matrix().get_position(X0);
00801       (*current)->get_world_matrix().get_position(X1);
00802       (*current)->get_son(0)->get_world_matrix().get_position(X2);
00803       
00804       
00805       int k_dim=0;
00806       double L=0.0;
00807       for(k_dim=0;k_dim<3;k_dim++)
00808         L += (X2[k_dim]-X0[k_dim])*(X2[k_dim]-X0[k_dim]);
00809       L = powf(L,0.5);
00810       
00811 
00812 
00813       double V1[3],V2[3];
00814       double proj=0.0;
00815       double n_v1=0.0,n_v2=0.0;
00816       double angle=0.0;
00817       
00818       for(k_dim=0;k_dim<3;V1[k_dim]=X1[k_dim]-X0[k_dim],V2[k_dim]=X2[k_dim]-X1[k_dim],k_dim++);
00819       for(k_dim=0,proj=0.0,n_v1=0.0,n_v2=0.0;k_dim<3;k_dim++)
00820         {
00821           proj += V1[k_dim]*V2[k_dim];
00822           n_v1 += V1[k_dim]*V1[k_dim];
00823           n_v2 += V2[k_dim]*V2[k_dim];
00824         }
00825       n_v1 = powf(n_v1,0.5);
00826       n_v2 = powf(n_v2,0.5);
00827       
00828       
00829       angle = acos(proj/(n_v1*n_v2));
00830       
00831       if( (*current)->get_access_number()!=0 && (((angle*180/PI<angle_max) && L<L_max)  || L<L_max/10.0 ))//bellow size min L_max/10 the angle does not account
00832         {
00833           
00834           is_deleted = 1;
00835           (*current)->get_father()->set_son(0,(*current)->get_son(0));
00836           
00837           Joint *current_son=(*current)->get_son(0);
00838           
00839           current_son->set_father((*current)->get_father());
00840           current_son->set_matrix((*current)->get_matrix()*current_son->get_matrix());
00841           
00842           
00843         }
00844     }
00845   
00846   Joint *son=NULL;
00847   for(k_son=0;k_son<N_son;k_son++)
00848     {
00849       son = (*current)->get_son(N_son-k_son-1);
00850       reccursive_subsample_skeleton(k_delete, &son );
00851     }
00852 
00853   if(is_deleted==1)
00854     delete *current;
00855 
00856   
00857 
00858 
00859 
00860   return 0;
00861 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::reccursive_scale ( Joint current,
double *  s 
) [private]

Definition at line 369 of file Skeleton.cpp.

References Joint::get_matrix(), Joint::get_N_son(), Joint::get_son(), Joint::set_matrix(), Matrix::set_value(), and Matrix::value().

Referenced by scale().

00370 {
00371   int ok=0;
00372 
00373   int k_dim=0;
00374   Matrix D=current->get_matrix();
00375   for(k_dim=0;k_dim<3;k_dim++)
00376     D.set_value(D.value(3,k_dim)*s[k_dim],3,k_dim);
00377   current->set_matrix(D);
00378     
00379   int k_son=0;
00380   for(k_son=0;k_son<current->get_N_son();k_son++)
00381     reccursive_scale(current->get_son(current->get_N_son()-k_son-1),s);
00382 
00383   return ok;
00384 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::fill_joint_vector (  )  [private]

Definition at line 948 of file Skeleton.cpp.

References joint_access, joint_root, and reccursive_fill_joint_vector().

Referenced by precalculate_matrix().

00949 {
00950   joint_access.resize(0);
00951   reccursive_fill_joint_vector(joint_root);
00952 
00953   return 0;
00954 }

Here is the call graph for this function:

Here is the caller graph for this function:

int Skeleton::reccursive_fill_joint_vector ( Joint current  )  [private]

Definition at line 956 of file Skeleton.cpp.

References Joint::get_N_son(), Joint::get_son(), and joint_access.

Referenced by fill_joint_vector().

00957 {
00958   int k_son=0;
00959   int N_son=current->get_N_son();
00960 
00961   joint_access.push_back(current);
00962   for(k_son=0;k_son<N_son;k_son++)
00963     reccursive_fill_joint_vector(current->get_son(N_son-k_son-1));
00964 
00965   return 0;
00966 }

Here is the call graph for this function:

Here is the caller graph for this function:


Member Data Documentation

int Skeleton::N_joint [private]

int Skeleton::N_list_bones [private]

Definition at line 158 of file Skeleton.h.

Referenced by operator=(), and Skeleton().

std::vector<Animation_transformation> Skeleton::anim [private]

std::vector<Joint*> Skeleton::joint_access [private]


The documentation for this class was generated from the following files:

Generated on Mon Mar 30 16:58:35 2009 by  doxygen 1.5.6