/**> HEADER FILES <**/ #include "Skeleton.h" #include "Serialize.h" extern double multiplier; extern unsigned int gSourceID[100]; extern unsigned int gSampleSet[100]; extern int visions; extern float rad2deg; extern Camera camera; extern float soundscalefactor; extern XYZ vel; extern XYZ midp; extern XYZ newpoint1,newpoint2; extern float oldlength; extern float relaxlength; extern float friction; extern int numrepeats; extern float groundlevel; extern float offset; extern XYZ impact; extern XYZ overpoint; extern XYZ underpoint; extern int whichtri; extern XYZ normalrotated; extern bool groundish; void Joint::DoConstraint() { if(hasparent){ //Find midpoint midp=(position+parent->position)/2; //Find vector from midpoint to second vector vel=parent->position-midp; //Change to unit vector Normalise(&vel); //Apply velocity change velocity+=((midp-vel*length/2)-position); parent->velocity+=((midp+vel*length/2)-parent->position); //Move child point to within certain distance of parent point if(!locked)position=midp-vel*length/2; if(!parent->locked)parent->position=midp+vel*length/2; } } void Muscle::DoConstraint(int broken) { oldlength=length; relaxlength=findDistance(parent1->position,parent2->position); if(type==boneconnect)strength=1; if(type==constraint)strength=0; if(strength<0)strength=0; if(strength>1)strength=1; length-=(length-relaxlength)*(1-strength)*multiplier*multiplier*10000; length-=(length-targetlength)*(strength)*multiplier*multiplier*10000; if(strength==0)length=relaxlength; if((relaxlength-length>0&&relaxlength-oldlength<0)||(relaxlength-length<0&&relaxlength-oldlength>0))length=relaxlength; if(lengthmaxlength&&!broken)length=maxlength; //Find midpoint midp=(parent1->position+parent2->position)/2; //Find vector from midpoint to second vector vel=parent2->position-midp; //Change to unit vector Normalise(&vel); //Apply velocity change newpoint1=midp-vel*length/2; newpoint2=midp+vel*length/2; parent1->velocity+=(newpoint1-parent1->position); parent2->velocity+=(newpoint2-parent2->position); //Move child point to within certain distance of parent point if(!parent1->locked)parent1->position=newpoint1; if(!parent2->locked)parent2->position=newpoint2; } void Skeleton::DoConstraints() { numrepeats=3; for(int j=0; jy+=.35; for(int j=0; jLineCheck2(overpoint,underpoint,&impact,*move,rotation); if(collide->normals[whichtri].y<=.8)whichtri=collide->LineCheck2(joints[i].realoldposition,joints[i].position,&impact,*move,rotation); if(joints[i].position.y<=groundlevel+offset||whichtri!=-1){ if(whichtri==-1||(whichtri!=-1&&collide->normals[whichtri].y>.8)){ if(whichtri==-1)joints[i].position.y=groundlevel+offset; if(whichtri!=-1){ joints[i].position=impact; joints[i].position.y+=offset; } joints[i].velocity.y*=-.3; joints[i].velocity.x*=.3; joints[i].velocity.z*=.3; } offset=.2; if(whichtri!=-1&&collide->normals[whichtri].y<=.8){ normalrotated=DoRotation(collide->normals[whichtri],0,rotation,0); joints[i].position=impact+normalrotated*offset; ReflectVector(&joints[i].velocity,&normalrotated); joints[i].velocity*=.3; } if(broken<=1){ XYZ avgvelocity; avgvelocity=0; float gLoc[3]; ALint tempint; for(int k=0; k2||findLengthfast(avgvelocity)>2)){ avgvelocity+=joints[i].velocity; gLoc[0]=joints[i].position.x/soundscalefactor; gLoc[1]=joints[i].position.y/soundscalefactor; gLoc[2]=joints[i].position.z/soundscalefactor; #ifdef DEBIAN_NEEDS_TO_UPDATE_THEIR_OPENAL alGetSourceiv(gSourceID[headlandsound], AL_SOURCE_STATE, &tempint); #else alGetSourcei(gSourceID[headlandsound], AL_SOURCE_STATE, &tempint); #endif if (tempint != AL_PLAYING){ alSourcef(gSourceID[headlandsound], AL_MIN_GAIN, ALfloat(findLengthfast(avgvelocity)*2/findDistancefast(joints[i].position,camera.position)*soundscalefactor*2)); alSourcef(gSourceID[headlandsound], AL_MAX_GAIN, ALfloat(findLengthfast(avgvelocity)*2/findDistancefast(joints[i].position,camera.position)*soundscalefactor*2)); alSourcefv(gSourceID[headlandsound], AL_POSITION, gLoc); alSourcePlay(gSourceID[headlandsound]);} } avgvelocity=0; for(int k=0; k2||findLengthfast(avgvelocity)>2)){ avgvelocity+=joints[i].velocity; gLoc[0]=joints[i].position.x/soundscalefactor; gLoc[1]=joints[i].position.y/soundscalefactor; gLoc[2]=joints[i].position.z/soundscalefactor; #ifdef DEBIAN_NEEDS_TO_UPDATE_THEIR_OPENAL alGetSourceiv(gSourceID[bodylandsound], AL_SOURCE_STATE, &tempint); #else alGetSourcei(gSourceID[bodylandsound], AL_SOURCE_STATE, &tempint); #endif if (tempint != AL_PLAYING){ alSourcef(gSourceID[bodylandsound], AL_MIN_GAIN, ALfloat(findLengthfast(joints[i].velocity)*1/findDistancefast(joints[i].position,camera.position)*soundscalefactor*2)); alSourcef(gSourceID[bodylandsound], AL_MAX_GAIN, ALfloat(findLengthfast(joints[i].velocity)*1/findDistancefast(joints[i].position,camera.position)*soundscalefactor*2)); alSourcefv(gSourceID[bodylandsound], AL_POSITION, gLoc); alSourcePlay(gSourceID[bodylandsound]);} } } }} } if(num_muscles) for(int i=0; iblurred); glVertex3f(joints[i].parent->position.x,joints[i].parent->position.y,joints[i].parent->position.z); glColor4f(jointcolor[0],jointcolor[1],jointcolor[2],jointcolor[3]/joints[i].parent->blurred); glVertex3f(joints[i].parent->oldposition.x,joints[i].parent->oldposition.y,joints[i].parent->oldposition.z); glColor4f(jointcolor[0],jointcolor[1],jointcolor[2],jointcolor[3]/joints[i].blurred); glVertex3f(joints[i].oldposition.x,joints[i].oldposition.y,joints[i].oldposition.z); } } for(int i=0; iblurred); glVertex3f(muscles[i].parent1->position.x,muscles[i].parent1->position.y,muscles[i].parent1->position.z); glColor4f(jointcolor[0],jointcolor[1],jointcolor[2],jointcolor[3]/muscles[i].parent2->blurred); glVertex3f(muscles[i].parent2->position.x,muscles[i].parent2->position.y,muscles[i].parent2->position.z); glColor4f(jointcolor[0],jointcolor[1],jointcolor[2],jointcolor[3]/muscles[i].parent2->blurred); glVertex3f(muscles[i].parent2->oldposition.x,muscles[i].parent2->oldposition.y,muscles[i].parent2->oldposition.z); glColor4f(jointcolor[0],jointcolor[1],jointcolor[2],jointcolor[3]/muscles[i].parent1->blurred); glVertex3f(muscles[i].parent1->oldposition.x,muscles[i].parent1->oldposition.y,muscles[i].parent1->oldposition.z); } } glEnd(); glBegin(GL_LINES); for(int i=0; iblurred); glVertex3f(joints[i].parent->position.x,joints[i].parent->position.y,joints[i].parent->position.z); } } for(int i=0; iblurred); glVertex3f(muscles[i].parent1->position.x,muscles[i].parent1->position.y,muscles[i].parent1->position.z); glColor4f(jointcolor[0],jointcolor[1],jointcolor[2],jointcolor[3]/muscles[i].parent2->blurred); glVertex3f(muscles[i].parent2->position.x,muscles[i].parent2->position.y,muscles[i].parent2->position.z); } } glColor3f(.6,.6,0); if(muscleview==1) for(int i=0; iposition.x,muscles[i].parent1->position.y,muscles[i].parent1->position.z); glVertex3f(muscles[i].parent2->position.x,muscles[i].parent2->position.y,muscles[i].parent2->position.z); } } glEnd(); if(muscleview!=2){ glPointSize(3); glBegin(GL_POINTS); for(int i=0; i=num_joints||which<0)joints[num_joints].hasparent=0; if(which=0){ joints[num_joints].parent=&joints[which]; joints[num_joints].hasparent=1; joints[num_joints].length=findDistance(joints[num_joints].position,joints[num_joints].parent->position); } num_joints++; } } void Skeleton::DeleteJoint(int whichjoint) { if(whichjoint=0){ for(int i=0;i=num_joints||which<0)joints[whichjoint].hasparent=0; if(which=0){ joints[whichjoint].parent=&joints[which]; joints[whichjoint].hasparent=1; joints[whichjoint].length=findDistance(joints[whichjoint].position,joints[whichjoint].parent->position); } } } void Skeleton::AddMuscle(int attach1,int attach2,float minlength,float maxlength,int type) { if(num_muscles=0&attach2=0&&attach1!=attach2){ muscles[num_muscles].parent1=&joints[attach1]; muscles[num_muscles].parent2=&joints[attach2]; muscles[num_muscles].length=findDistance(muscles[num_muscles].parent1->position,muscles[num_muscles].parent2->position); muscles[num_muscles].targetlength=findDistance(muscles[num_muscles].parent1->position,muscles[num_muscles].parent2->position); muscles[num_muscles].strength=.7; muscles[num_muscles].type=type; muscles[num_muscles].minlength=minlength; muscles[num_muscles].maxlength=maxlength; num_muscles++; } } void Skeleton::MusclesSet() { for(int i=0;iposition,muscles[i].parent2->position); } } void Skeleton::FindRotationJoint(int which) { XYZ temppoint1,temppoint2,tempforward; float distance; temppoint1=joints[which].position; temppoint2=joints[which].parent->position; distance=findDistance(temppoint1,temppoint2); joints[which].rotate2=asin((temppoint1.y-temppoint2.y)/distance)*rad2deg; temppoint1.y=0; temppoint2.y=0; joints[which].rotate1=acos((temppoint1.z-temppoint2.z)/findDistance(temppoint1,temppoint2))*rad2deg; if(temppoint1.x>temppoint2.x)joints[which].rotate1=360-joints[which].rotate1; if(joints[which].label==head)tempforward=specialforward[0]; else if(joints[which].label==rightshoulder||joints[which].label==rightelbow||joints[which].label==rightwrist||joints[which].label==righthand)tempforward=specialforward[1]; else if(joints[which].label==leftshoulder||joints[which].label==leftelbow||joints[which].label==leftwrist||joints[which].label==lefthand)tempforward=specialforward[2]; else if(joints[which].label==righthip||joints[which].label==rightknee||joints[which].label==rightankle)tempforward=specialforward[3]; else if(joints[which].label==lefthip||joints[which].label==leftknee||joints[which].label==leftankle)tempforward=specialforward[4]; else if(!joints[which].lower)tempforward=forward; else if(joints[which].lower)tempforward=lowforward; tempforward=DoRotation(tempforward,0,joints[which].rotate1-90,0); tempforward=DoRotation(tempforward,0,0,joints[which].rotate2-90); tempforward.y=0; Normalise(&tempforward); joints[which].rotate3=acos(0-tempforward.z)*rad2deg; if(0>tempforward.x)joints[which].rotate3=360-joints[which].rotate3; } void Skeleton::FindRotationMuscle(int which) { XYZ temppoint1,temppoint2,tempforward; float distance; temppoint1=muscles[which].parent1->position; temppoint2=muscles[which].parent2->position; distance=findDistance(temppoint1,temppoint2); muscles[which].rotate2=asin((temppoint1.y-temppoint2.y)/distance)*rad2deg; temppoint1.y=0; temppoint2.y=0; muscles[which].rotate1=acos((temppoint1.z-temppoint2.z)/findDistance(temppoint1,temppoint2)); muscles[which].rotate1*=360/6.28; if(temppoint1.x>temppoint2.x)muscles[which].rotate1=360-muscles[which].rotate1; if(muscles[which].parent1->label==head)tempforward=specialforward[0]; else if(muscles[which].parent1->label==rightshoulder||muscles[which].parent1->label==rightelbow||muscles[which].parent1->label==rightwrist)tempforward=specialforward[1]; else if(muscles[which].parent1->label==leftshoulder||muscles[which].parent1->label==leftelbow||muscles[which].parent1->label==leftwrist)tempforward=specialforward[2]; else if(muscles[which].parent1->label==righthip||muscles[which].parent1->label==rightknee||muscles[which].parent1->label==rightankle)tempforward=specialforward[3]; else if(muscles[which].parent1->label==lefthip||muscles[which].parent1->label==leftknee||muscles[which].parent1->label==leftankle)tempforward=specialforward[4]; else if(!muscles[which].parent1->lower)tempforward=forward; else if(muscles[which].parent1->lower)tempforward=lowforward; tempforward=DoRotation(tempforward,0,muscles[which].rotate1-90,0); tempforward=DoRotation(tempforward,0,0,muscles[which].rotate2-90); tempforward.y=0; Normalise(&tempforward); muscles[which].rotate3=acos(0-tempforward.z)*rad2deg; for(int i=0;itempforward.x)muscles[which].rotate3=360-muscles[which].rotate3; } extern Skeleton testskeleton; void Animation::Load(char *fileName) { files.OpenFile((unsigned char*)fileName); if(files.sFile){ ReadInt(files.sFile, 1, &numframes); for(int i=0;imrotate3[i][j-1]+180)mrotate3[i][j]-=360; if(j!=0&&mrotate3[i][j]mrotate2[i][j-1]+180)mrotate2[i][j]-=360; if(j!=0&&mrotate2[i][j]mrotate1[i][j-1]+180)mrotate1[i][j]-=360; if(j!=0&&mrotate1[i][j]rotate3[i][j-1]+180)rotate3[i][j]-=360; if(j!=0&&rotate3[i][j]rotate2[i][j-1]+180)rotate2[i][j]-=360; if(j!=0&&rotate2[i][j]rotate1[i][j-1]+180)rotate1[i][j]-=360; if(j!=0&&rotate1[i][j]mrotate3[i][j-1]+180)mrotate3[i][j]-=360; if(j!=0&&mrotate3[i][j]mrotate2[i][j-1]+180)mrotate2[i][j]-=360; if(j!=0&&mrotate2[i][j]mrotate1[i][j-1]+180)mrotate1[i][j]-=360; if(j!=0&&mrotate1[i][j]mrotate3[i][numframes-1]+180)mrotate3[i][j]-=360; if(j==0&&mrotate3[i][j]mrotate2[i][numframes-1]+180)mrotate2[i][j]-=360; if(j==0&&mrotate2[i][j]mrotate1[i][numframes-1]+180)mrotate1[i][j]-=360; if(j==0&&mrotate1[i][j]rotate3[i][j-1]+180)rotate3[i][j]-=360; if(j!=0&&rotate3[i][j]rotate2[i][j-1]+180)rotate2[i][j]-=360; if(j!=0&&rotate2[i][j]rotate1[i][j-1]+180)rotate1[i][j]-=360; if(j!=0&&rotate1[i][j]rotate3[i][numframes-1]+180)rotate3[i][j]-=360; if(j==0&&rotate3[i][j]rotate2[i][numframes-1]+180)rotate2[i][j]-=360; if(j==0&&rotate2[i][j]rotate1[i][numframes-1]+180)rotate1[i][j]-=360; if(j==0&&rotate1[i][j]mrotate3[i][j-1]+180)mrotate3[i][j]-=360; if(j!=0&&mrotate3[i][j]mrotate2[i][j-1]+180)mrotate2[i][j]-=360; if(j!=0&&mrotate2[i][j]mrotate1[i][j-1]+180)mrotate1[i][j]-=360; if(j!=0&&mrotate1[i][j]rotate3[i][j-1]+180)rotate3[i][j]-=360; if(j!=0&&rotate3[i][j]rotate2[i][j-1]+180)rotate2[i][j]-=360; if(j!=0&&rotate2[i][j]rotate1[i][j-1]+180)rotate1[i][j]-=360; if(j!=0&&rotate1[i][j]mrotate3[i][j-1]+180)mrotate3[i][j]-=360; if(j!=0&&mrotate3[i][j]mrotate2[i][j-1]+180)mrotate2[i][j]-=360; if(j!=0&&mrotate2[i][j]mrotate1[i][j-1]+180)mrotate1[i][j]-=360; if(j!=0&&mrotate1[i][j]mrotate3[i][numframes-1]+180)mrotate3[i][j]-=360; if(j==0&&mrotate3[i][j]mrotate2[i][numframes-1]+180)mrotate2[i][j]-=360; if(j==0&&mrotate2[i][j]mrotate1[i][numframes-1]+180)mrotate1[i][j]-=360; if(j==0&&mrotate1[i][j]rotate3[i][j-1]+180)rotate3[i][j]-=360; if(j!=0&&rotate3[i][j]rotate2[i][j-1]+180)rotate2[i][j]-=360; if(j!=0&&rotate2[i][j]rotate1[i][j-1]+180)rotate1[i][j]-=360; if(j!=0&&rotate1[i][j]rotate3[i][numframes-1]+180)rotate3[i][j]-=360; if(j==0&&rotate3[i][j]rotate2[i][numframes-1]+180)rotate2[i][j]-=360; if(j==0&&rotate2[i][j]rotate1[i][numframes-1]+180)rotate1[i][j]-=360; if(j==0&&rotate1[i][j]