diff options
Diffstat (limited to 'src/Skeleton.cpp')
-rw-r--r-- | src/Skeleton.cpp | 176 |
1 files changed, 10 insertions, 166 deletions
diff --git a/src/Skeleton.cpp b/src/Skeleton.cpp index 2624efd..7315fac 100644 --- a/src/Skeleton.cpp +++ b/src/Skeleton.cpp @@ -458,175 +458,19 @@ void Skeleton::FindRotationMuscle(int which) extern Skeleton testskeleton; -void Animation::Load(char *fileName) +void Animation::load(const char* name) { - files.OpenFile(fileName); - if(files.sFile){ - ReadInt(files.sFile, 1, &numframes); - for(int i=0;i<numframes;i++){ - for(int j=0;j<max_joints;j++){ - ReadXYZ(files.sFile, 1, &position[j][i]); - } - for(int j=0;j<max_joints;j++){ - ReadFloat(files.sFile, 1, &twist[j][i]); - } - for(int j=0;j<max_joints;j++){ - ReadBool(files.sFile, 1, &onground[j][i]); - } - ReadFloat(files.sFile, 1, &speed[i]); - ReadFloat(files.sFile, 1, &gunrotation[i]); - } - for(int i=0;i<numframes;i++){ - for(int j=0;j<max_joints;j++){ - ReadFloat(files.sFile, 1, &twist2[j][i]); - } - } - } - - files.EndLoad(); - - for(int j=0;j<numframes;j++){ - for(int i=0;i<testskeleton.num_joints;i++){ - testskeleton.joints[i].position=position[i][j]; - } - //Find forward vectors - CrossProduct(testskeleton.joints[testskeleton.forwardjoints[1]].position-testskeleton.joints[testskeleton.forwardjoints[0]].position,testskeleton.joints[testskeleton.forwardjoints[2]].position-testskeleton.joints[testskeleton.forwardjoints[0]].position,&testskeleton.forward); - Normalise(&testskeleton.forward); - - CrossProduct(testskeleton.joints[testskeleton.lowforwardjoints[1]].position-testskeleton.joints[testskeleton.lowforwardjoints[0]].position,testskeleton.joints[testskeleton.lowforwardjoints[2]].position-testskeleton.joints[testskeleton.lowforwardjoints[0]].position,&testskeleton.lowforward); - Normalise(&testskeleton.lowforward); - - //Special forwards - testskeleton.specialforward[0]=testskeleton.forward; - - testskeleton.specialforward[1]=testskeleton.joints[testskeleton.jointlabels[rightshoulder]].position+testskeleton.joints[testskeleton.jointlabels[rightwrist]].position; - testskeleton.specialforward[1]=testskeleton.joints[testskeleton.jointlabels[rightelbow]].position-testskeleton.specialforward[1]/2; - testskeleton.specialforward[1]+=testskeleton.forward*.2; - Normalise(&testskeleton.specialforward[1]); - testskeleton.specialforward[2]=testskeleton.joints[testskeleton.jointlabels[leftshoulder]].position+testskeleton.joints[testskeleton.jointlabels[leftwrist]].position; - testskeleton.specialforward[2]=testskeleton.joints[testskeleton.jointlabels[leftelbow]].position-testskeleton.specialforward[2]/2; - testskeleton.specialforward[2]+=testskeleton.forward*.2; - Normalise(&testskeleton.specialforward[2]); - - testskeleton.specialforward[3]=testskeleton.joints[testskeleton.jointlabels[righthip]].position+testskeleton.joints[testskeleton.jointlabels[rightankle]].position; - testskeleton.specialforward[3]=testskeleton.specialforward[3]/2-testskeleton.joints[testskeleton.jointlabels[rightknee]].position; - testskeleton.specialforward[3]+=testskeleton.lowforward*.2; - Normalise(&testskeleton.specialforward[3]); - testskeleton.specialforward[4]=testskeleton.joints[testskeleton.jointlabels[lefthip]].position+testskeleton.joints[testskeleton.jointlabels[leftankle]].position; - testskeleton.specialforward[4]=testskeleton.specialforward[4]/2-testskeleton.joints[testskeleton.jointlabels[leftknee]].position; - testskeleton.specialforward[4]+=testskeleton.lowforward*.2; - Normalise(&testskeleton.specialforward[4]); - - //Find joint rotations - for(int i=0;i<testskeleton.num_joints;i++){ - if(testskeleton.joints[i].hasparent&&testskeleton.joints[i].visible) - { - testskeleton.FindRotationJoint(i); - } - } - for(int i=0;i<testskeleton.num_muscles;i++){ - if(testskeleton.muscles[i].visible) - { - testskeleton.FindRotationMuscle(i); - } - } - for(int i=0;i<testskeleton.num_muscles;i++){ - if(testskeleton.muscles[i].visible) - { - mrotate1[i][j]=testskeleton.muscles[i].rotate1; - mrotate2[i][j]=testskeleton.muscles[i].rotate2; - mrotate3[i][j]=testskeleton.muscles[i].rotate3; - if(j!=0&&mrotate3[i][j]>mrotate3[i][j-1]+180)mrotate3[i][j]-=360; - if(j!=0&&mrotate3[i][j]<mrotate3[i][j-1]-180)mrotate3[i][j]+=360; - if(j!=0&&mrotate2[i][j]>mrotate2[i][j-1]+180)mrotate2[i][j]-=360; - if(j!=0&&mrotate2[i][j]<mrotate2[i][j-1]-180)mrotate2[i][j]+=360; - if(j!=0&&mrotate1[i][j]>mrotate1[i][j-1]+180)mrotate1[i][j]-=360; - if(j!=0&&mrotate1[i][j]<mrotate1[i][j-1]-180)mrotate1[i][j]+=360; - } - } - for(int i=0;i<testskeleton.num_joints;i++){ - if(testskeleton.joints[i].hasparent&&testskeleton.joints[i].visible) - { - rotate1[i][j]=testskeleton.joints[i].rotate1; - rotate2[i][j]=testskeleton.joints[i].rotate2; - rotate3[i][j]=testskeleton.joints[i].rotate3; - if(j!=0&&rotate3[i][j]>rotate3[i][j-1]+180)rotate3[i][j]-=360; - if(j!=0&&rotate3[i][j]<rotate3[i][j-1]-180)rotate3[i][j]+=360; - if(j!=0&&rotate2[i][j]>rotate2[i][j-1]+180)rotate2[i][j]-=360; - if(j!=0&&rotate2[i][j]<rotate2[i][j-1]-180)rotate2[i][j]+=360; - if(j!=0&&rotate1[i][j]>rotate1[i][j-1]+180)rotate1[i][j]-=360; - if(j!=0&&rotate1[i][j]<rotate1[i][j-1]-180)rotate1[i][j]+=360; - } - } - } - - for(int k=0;k<2;k++) - for(int j=0;j<numframes;j++){ - for(int i=0;i<testskeleton.num_muscles;i++){ - if(testskeleton.muscles[i].visible) - { - if(j!=0&&mrotate3[i][j]>mrotate3[i][j-1]+180)mrotate3[i][j]-=360; - if(j!=0&&mrotate3[i][j]<mrotate3[i][j-1]-180)mrotate3[i][j]+=360; - if(j!=0&&mrotate2[i][j]>mrotate2[i][j-1]+180)mrotate2[i][j]-=360; - if(j!=0&&mrotate2[i][j]<mrotate2[i][j-1]-180)mrotate2[i][j]+=360; - if(j!=0&&mrotate1[i][j]>mrotate1[i][j-1]+180)mrotate1[i][j]-=360; - if(j!=0&&mrotate1[i][j]<mrotate1[i][j-1]-180)mrotate1[i][j]+=360; - - if(j==0&&mrotate3[i][j]>mrotate3[i][numframes-1]+180)mrotate3[i][j]-=360; - if(j==0&&mrotate3[i][j]<mrotate3[i][numframes-1]-180)mrotate3[i][j]+=360; - if(j==0&&mrotate2[i][j]>mrotate2[i][numframes-1]+180)mrotate2[i][j]-=360; - if(j==0&&mrotate2[i][j]<mrotate2[i][numframes-1]-180)mrotate2[i][j]+=360; - if(j==0&&mrotate1[i][j]>mrotate1[i][numframes-1]+180)mrotate1[i][j]-=360; - if(j==0&&mrotate1[i][j]<mrotate1[i][numframes-1]-180)mrotate1[i][j]+=360; - } - } - for(int i=0;i<testskeleton.num_joints;i++){ - if(testskeleton.joints[i].hasparent&&testskeleton.joints[i].visible) - { - if(j!=0&&rotate3[i][j]>rotate3[i][j-1]+180)rotate3[i][j]-=360; - if(j!=0&&rotate3[i][j]<rotate3[i][j-1]-180)rotate3[i][j]+=360; - if(j!=0&&rotate2[i][j]>rotate2[i][j-1]+180)rotate2[i][j]-=360; - if(j!=0&&rotate2[i][j]<rotate2[i][j-1]-180)rotate2[i][j]+=360; - if(j!=0&&rotate1[i][j]>rotate1[i][j-1]+180)rotate1[i][j]-=360; - if(j!=0&&rotate1[i][j]<rotate1[i][j-1]-180)rotate1[i][j]+=360; - - if(j==0&&rotate3[i][j]>rotate3[i][numframes-1]+180)rotate3[i][j]-=360; - if(j==0&&rotate3[i][j]<rotate3[i][numframes-1]-180)rotate3[i][j]+=360; - if(j==0&&rotate2[i][j]>rotate2[i][numframes-1]+180)rotate2[i][j]-=360; - if(j==0&&rotate2[i][j]<rotate2[i][numframes-1]-180)rotate2[i][j]+=360; - if(j==0&&rotate1[i][j]>rotate1[i][numframes-1]+180)rotate1[i][j]-=360; - if(j==0&&rotate1[i][j]<rotate1[i][numframes-1]-180)rotate1[i][j]+=360; - } - } - } -} - -void Animation::Load(char *fileName, float rotate) -{ - files.OpenFile(fileName); - if(files.sFile){ - ReadInt(files.sFile, 1, &numframes); - for(int i=0;i<numframes;i++){ - for(int j=0;j<max_joints;j++){ - ReadXYZ(files.sFile, 1, &position[j][i]); - position[j][i]=DoRotation(position[j][i],0,rotate,0); - } - for(int j=0;j<max_joints;j++){ - ReadFloat(files.sFile, 1, &twist[j][i]); - } - for(int j=0;j<max_joints;j++){ - ReadBool(files.sFile, 1, &onground[j][i]); - } - ReadFloat(files.sFile, 1, &speed[i]); - ReadFloat(files.sFile, 1, &gunrotation[i]); - } - for(int i=0;i<numframes;i++){ - for(int j=0;j<max_joints;j++){ - ReadFloat(files.sFile, 1, &twist2[j][i]); - } + auto data = loadAnimation(name); + numframes = data.len; + for (size_t i = 0; i < numframes; ++i) { + for (size_t j = 0; j < max_joints; ++j) { + position[j][i].x = data.ptr[i].joints[j].x; + position[j][i].y = data.ptr[i].joints[j].y; + position[j][i].z = data.ptr[i].joints[j].z; } + speed[i] = data.ptr[i].speed; } - files.EndLoad(); + free(data.ptr); for(int j=0;j<numframes;j++){ for(int i=0;i<testskeleton.num_joints;i++){ |