diff options
Diffstat (limited to 'src/Person.cpp')
-rw-r--r-- | src/Person.cpp | 1045 |
1 files changed, 1045 insertions, 0 deletions
diff --git a/src/Person.cpp b/src/Person.cpp new file mode 100644 index 0000000..43aa873 --- /dev/null +++ b/src/Person.cpp @@ -0,0 +1,1045 @@ +/**> HEADER FILES <**/ +#include "Person.h" + +extern double multiplier; +extern unsigned int gSourceID[100]; +extern unsigned int gSampleSet[100]; +extern Animation animation[30]; +extern int thirdperson; +extern int visions; +extern Camera camera; +extern float rad2deg; +extern Model gunmodels[10]; +extern Model skeletonmodels[10]; +extern Sprites sprites; +extern float soundscalefactor; +extern int slomo; + +extern int forwardskey; +extern int backwardskey; +extern int leftkey; +extern int rightkey; +extern int aimkey; +extern int psychicaimkey; +extern int psychickey; + +HitStruct Person::BulletCollideWithPlayer(int who, XYZ start, XYZ end){ + float damage=20; + XYZ tempbulletloc[2]; + XYZ collisionpoint; + XYZ sparkpos; + GLfloat M[16]; + int collide; + float howfar; + XYZ average; + XYZ facing; + int howmany; + float distancemax; + HitStruct hitstruct; + hitstruct.collision=0; + //Make bounding sphere + average=0; + howmany=0; + for(int j=0;j<skeleton.num_joints;j++){ + average.x=average.x+skeleton.joints[j].position.x; + average.y=average.y+skeleton.joints[j].position.y; + average.z=average.z+skeleton.joints[j].position.z; + howmany++; + } + average=average/howmany; + distancemax=0; + for(int j=0;j<skeleton.num_joints;j++){ + if(findDistancefast(average,skeleton.joints[j].position)>distancemax){ + distancemax=findDistancefast(average,skeleton.joints[j].position); + } + } + distancemax=fast_sqrt(distancemax); + //Collide with player + if(skeleton.free<1){ + start=start-playercoords; + end=end-playercoords; + if(playerrotation)start=DoRotation(start,0,-playerrotation,0); + if(playerrotation)end=DoRotation(end,0,-playerrotation,0); + } + tempbulletloc[0]=start; + tempbulletloc[1]=end; + if(sphere_line_intersection(tempbulletloc[0].x,tempbulletloc[0].y,tempbulletloc[0].z, + tempbulletloc[1].x,tempbulletloc[1].y,tempbulletloc[1].z, + average.x, average.y, average.z, distancemax)){ + for(int j=0;j<skeleton.num_joints;j++){ + if(skeleton.joints[j].hasparent&&skeleton.joints[j].visible){ + tempbulletloc[0]=start; + tempbulletloc[1]=end; + glPushMatrix(); + glLoadIdentity(); + glScalef(1,1/skeleton.joints[j].length,1); + glRotatef(skeleton.joints[j].rotate2-90,0,0,1); + glRotatef(skeleton.joints[j].rotate1-90,0,1,0); + glTranslatef( (-(skeleton.joints[j].position.x+skeleton.joints[j].parent->position.x)/2), + (-(skeleton.joints[j].position.y+skeleton.joints[j].parent->position.y)/2), + (-(skeleton.joints[j].position.z+skeleton.joints[j].parent->position.z)/2)); + glTranslatef(tempbulletloc[0].x,tempbulletloc[0].y,tempbulletloc[0].z); + glGetFloatv(GL_MODELVIEW_MATRIX,M); + tempbulletloc[0].x=M[12]; + tempbulletloc[0].y=M[13]; + tempbulletloc[0].z=M[14]; + glPopMatrix(); + glPushMatrix(); + glLoadIdentity(); + glScalef(1,1/skeleton.joints[j].length,1); + glRotatef(skeleton.joints[j].rotate2-90,0,0,1); + glRotatef(skeleton.joints[j].rotate1-90,0,1,0); + glTranslatef( (-(skeleton.joints[j].position.x+skeleton.joints[j].parent->position.x)/2), + (-(skeleton.joints[j].position.y+skeleton.joints[j].parent->position.y)/2), + (-(skeleton.joints[j].position.z+skeleton.joints[j].parent->position.z)/2)); + glTranslatef(tempbulletloc[1].x,tempbulletloc[1].y,tempbulletloc[1].z); + glGetFloatv(GL_MODELVIEW_MATRIX,M); + tempbulletloc[1].x=M[12]; + tempbulletloc[1].y=M[13]; + tempbulletloc[1].z=M[14]; + glPopMatrix(); + collide=skeletonmodels[skeleton.joints[j].modelnum].LineCheck(tempbulletloc[0],tempbulletloc[1],&collisionpoint); + if(collide!=-1) + { + glPushMatrix(); + glLoadIdentity(); + glTranslatef( (skeleton.joints[j].position.x+skeleton.joints[j].parent->position.x)/2, + (skeleton.joints[j].position.y+skeleton.joints[j].parent->position.y)/2, + (skeleton.joints[j].position.z+skeleton.joints[j].parent->position.z)/2); + glRotatef(-skeleton.joints[j].rotate1+90,0,1,0); + glRotatef(-skeleton.joints[j].rotate2+90,0,0,1); + glScalef(1,skeleton.joints[j].length,1); + glTranslatef(collisionpoint.x,collisionpoint.y,collisionpoint.z); + glGetFloatv(GL_MODELVIEW_MATRIX,M); + collisionpoint.x=M[12]; + collisionpoint.y=M[13]; + collisionpoint.z=M[14]; + glPopMatrix(); + hitstruct.collision=1; + hitstruct.hitlocation=collisionpoint; + hitstruct.joint1=&skeleton.joints[j]; + hitstruct.joint2=skeleton.joints[j].parent; + } + } + } + for(int j=0;j<skeleton.num_muscles;j++){ + if(skeleton.muscles[j].visible){ + tempbulletloc[0]=start; + tempbulletloc[1]=end; + glPushMatrix(); + glLoadIdentity(); + glScalef(1,1/skeleton.muscles[j].length,1); + glRotatef(skeleton.muscles[j].rotate3,0,1,0); + glRotatef(skeleton.muscles[j].rotate2-90,0,0,1); + glRotatef(skeleton.muscles[j].rotate1-90,0,1,0); + glTranslatef( (-(skeleton.muscles[j].parent1->position.x+skeleton.muscles[j].parent2->position.x)/2), + (-(skeleton.muscles[j].parent1->position.y+skeleton.muscles[j].parent2->position.y)/2), + (-(skeleton.muscles[j].parent1->position.z+skeleton.muscles[j].parent2->position.z)/2)); + + glTranslatef(tempbulletloc[0].x,tempbulletloc[0].y,tempbulletloc[0].z); + glGetFloatv(GL_MODELVIEW_MATRIX,M); + tempbulletloc[0].x=M[12]; + tempbulletloc[0].y=M[13]; + tempbulletloc[0].z=M[14]; + glPopMatrix(); + glPushMatrix(); + glLoadIdentity(); + glScalef(1,1/skeleton.muscles[j].length,1); + glRotatef(skeleton.muscles[j].rotate3,0,1,0); + glRotatef(skeleton.muscles[j].rotate2-90,0,0,1); + glRotatef(skeleton.muscles[j].rotate1-90,0,1,0); + + glTranslatef( (-(skeleton.muscles[j].parent1->position.x+skeleton.muscles[j].parent2->position.x)/2), + (-(skeleton.muscles[j].parent1->position.y+skeleton.muscles[j].parent2->position.y)/2), + (-(skeleton.muscles[j].parent1->position.z+skeleton.muscles[j].parent2->position.z)/2)); + glTranslatef(tempbulletloc[1].x,tempbulletloc[1].y,tempbulletloc[1].z); + glGetFloatv(GL_MODELVIEW_MATRIX,M); + tempbulletloc[1].x=M[12]; + tempbulletloc[1].y=M[13]; + tempbulletloc[1].z=M[14]; + glPopMatrix(); + collide=skeletonmodels[skeleton.muscles[j].parent1->modelnum].LineCheck(tempbulletloc[0],tempbulletloc[1],&collisionpoint); + if(collide!=-1) + { + glPushMatrix(); + glLoadIdentity(); + glTranslatef( (skeleton.muscles[j].parent1->position.x+skeleton.muscles[j].parent2->position.x)/2, + (skeleton.muscles[j].parent1->position.y+skeleton.muscles[j].parent2->position.y)/2, + (skeleton.muscles[j].parent1->position.z+skeleton.muscles[j].parent2->position.z)/2); + glRotatef(-skeleton.muscles[j].rotate1+90,0,1,0); + glRotatef(-skeleton.muscles[j].rotate2+90,0,0,1); + glRotatef(-skeleton.muscles[j].rotate3,0,1,0); + glScalef(1,findDistance(skeleton.muscles[j].parent1->position,skeleton.muscles[j].parent2->position),1); + glTranslatef(collisionpoint.x,collisionpoint.y,collisionpoint.z); + glGetFloatv(GL_MODELVIEW_MATRIX,M); + collisionpoint.x=M[12]; + collisionpoint.y=M[13]; + collisionpoint.z=M[14]; + glPopMatrix(); + hitstruct.collision=1; + hitstruct.hitlocation=collisionpoint; + hitstruct.joint1=skeleton.muscles[j].parent1; + hitstruct.joint2=skeleton.muscles[j].parent2; + } + } + } + } + if(skeleton.free<1){ + if(playerrotation)hitstruct.hitlocation=DoRotation(hitstruct.hitlocation,0,playerrotation,0); + hitstruct.hitlocation=hitstruct.hitlocation+playercoords; + } + return hitstruct; +} + +extern float camerashake; +extern int cycle; +void Person::DoAnimations(int who){ + + if(target>1&&!skeleton.free){ + //Footstep sounds + if(who==0&&slomo==0&&(targetanimation==joganim||targetanimation==walkanim)&&(targetframe==0||targetframe==8)&&visions==0&&(onground||abs(velocity.y)<1)){ + int whichsound; + float gLoc[3]; + gLoc[0]=playercoords.x/soundscalefactor; + gLoc[1]=playercoords.y/soundscalefactor; + gLoc[2]=playercoords.z/soundscalefactor; + whichsound=footstepsound+abs(Random())%5; + alSourcefv(gSourceID[whichsound], AL_POSITION, gLoc); + alSourcePlay(gSourceID[whichsound]); + } + if(targetanimation==zombieeatanim&&(targetframe==3)){ + int whichsound; + float gLoc[3]; + XYZ soundpoint=(DoRotation(skeleton.joints[skeleton.jointlabels[head]].position,0,playerrotation,0)+playercoords); + gLoc[0]=soundpoint.x/soundscalefactor; + gLoc[1]=soundpoint.y/soundscalefactor; + gLoc[2]=soundpoint.z/soundscalefactor; + alSourcefv(gSourceID[bodyhitsound], AL_POSITION, gLoc); + alSourcePlay(gSourceID[bodyhitsound]); + bleeding=1; + bleeddelay=1; + bjoint1=&skeleton.joints[skeleton.jointlabels[head]]; + bjoint2=&skeleton.joints[skeleton.jointlabels[neck]]; + } + targetframe=currentframe; + currentanimation=targetanimation; + if(!backwardsanim){targetframe++; + if(targetframe>animation[currentanimation].numframes-1)targetframe=0;} + if(backwardsanim){targetframe--; + if(targetframe<0)targetframe=animation[currentanimation].numframes-1;} + target=0; + if((currentanimation==getupfrontanim||currentanimation==getupbackanim)&&targetframe==0){ + targetanimation=idleanim; + } + if(targetanimation==diveanim&¤tanimation==diveanim&&targetframe==0){ + targetanimation=getupfrontanim; + float gLoc[3]; + XYZ soundpoint=(DoRotation(skeleton.joints[skeleton.jointlabels[head]].position,0,playerrotation,0)+playercoords); + gLoc[0]=soundpoint.x/soundscalefactor; + gLoc[1]=soundpoint.y/soundscalefactor; + gLoc[2]=soundpoint.z/soundscalefactor; + alSourcefv(gSourceID[bodywhacksound], AL_POSITION, gLoc); + alSourcePlay(gSourceID[bodywhacksound]); + } + if(currentanimation==throwanim&&targetframe==0){ + targetanimation=idleanim; + } + if(currentanimation==thrownanim&&targetframe==0){ + skeleton.offset=0; + skeleton.free=1; + longdead=1; + for(int j=0;j<skeleton.num_joints;j++){ + skeleton.joints[j].position+=skeleton.joints[j].offset; + skeleton.joints[j].position=DoRotation(skeleton.joints[j].position,0,playerrotation,0); + skeleton.joints[j].position+=playercoords; + skeleton.joints[j].realoldposition=skeleton.joints[j].position; + skeleton.joints[j].velocity=DoRotation(skeleton.joints[j].velocity,0,playerrotation,0); + } + } + } + + if(!skeleton.free){ + if(currentanimation!=lyinganim){ + if(animation[targetanimation].speed[currentframe]>animation[currentanimation].speed[currentframe]) + target+=multiplier*animation[targetanimation].speed[currentframe]*speed; + if(animation[targetanimation].speed[currentframe]<=animation[currentanimation].speed[currentframe]) + target+=multiplier*animation[currentanimation].speed[currentframe]*speed; + } + if(currentanimation==lyinganim){ + target+=multiplier*animation[targetanimation].speed[targetframe]*speed; + } + if(((currentanimation==crouchanim)&&(targetanimation!=crouchanim))||((currentanimation!=crouchanim)&&(targetanimation==crouchanim)))target+=multiplier*animation[crouchanim].speed[0]*2; + if(currentanimation==idleanim&&targetanimation==idleanim)target-=multiplier*animation[idleanim].speed[0]/2; + + if(target>1)currentframe=targetframe; + + for(int i=0;i<skeleton.num_joints;i++){ + if(currentanimation!=lyinganim){ + skeleton.joints[i].velocity=((animation[currentanimation].position[i][currentframe]*(1-target)+animation[targetanimation].position[i][targetframe]*(target))-(skeleton.joints[i].position))/multiplier; + skeleton.joints[i].position=animation[currentanimation].position[i][currentframe]*(1-target)+animation[targetanimation].position[i][targetframe]*(target); + if(skeleton.joints[i].hasparent&&skeleton.joints[i].visible) + { + skeleton.joints[i].rotate1=animation[currentanimation].rotate1[i][currentframe]*(1-target)+animation[targetanimation].rotate1[i][targetframe]*(target); + skeleton.joints[i].rotate2=animation[currentanimation].rotate2[i][currentframe]*(1-target)+animation[targetanimation].rotate2[i][targetframe]*(target); + skeleton.joints[i].rotate3=animation[currentanimation].rotate3[i][currentframe]*(1-target)+animation[targetanimation].rotate3[i][targetframe]*(target); + } + if(skeleton.muscles[i].visible) + { + skeleton.muscles[i].rotate1=animation[currentanimation].mrotate1[i][currentframe]*(1-target)+animation[targetanimation].mrotate1[i][targetframe]*(target); + skeleton.muscles[i].rotate2=animation[currentanimation].mrotate2[i][currentframe]*(1-target)+animation[targetanimation].mrotate2[i][targetframe]*(target); + skeleton.muscles[i].rotate3=animation[currentanimation].mrotate3[i][currentframe]*(1-target)+animation[targetanimation].mrotate3[i][targetframe]*(target); + } + } + if(currentanimation==lyinganim){ + skeleton.joints[i].velocity=((tempanimation.position[i][0]*(1-target)+animation[targetanimation].position[i][targetframe]*(target))-(skeleton.joints[i].position))/multiplier; + skeleton.joints[i].position=tempanimation.position[i][0]*(1-target)+animation[targetanimation].position[i][targetframe]*(target); + } + } + } + + //Look up+down + if(!skeleton.free&&(whichgun!=nogun||who==0)&&health==100&¤tanimation!=lyinganim&¤tanimation!=getupfrontanim&¤tanimation!=getupbackanim&¤tanimation!=diveanim&&targetanimation!=diveanim&&targetanimation!=throwanim&&targetanimation!=thrownanim){ + XYZ facing; + XYZ facingdown; + XYZ facinghalf; + XYZ facingright; + int oldanimation=currentanimation; + if(who==0){ + playerrotation2=camera.rotation2; + //Facing + facing=0; + facing.z=1; + + facinghalf=DoRotation(facing,playerrotation2/2,0,0); + facinghalf=DoRotation(facinghalf,0,-7,0); + facing=DoRotation(facing,playerrotation2,0,0); + facingright=DoRotation(facing,0,-90,0); + facingdown=DoRotation(facing,90,0,0); + } + if(who!=0){ + //Facing + facing=0; + facing.z=1; + + facinghalf=DoRotation(facing,playerrotation2/2,0,0); + facinghalf=DoRotation(facinghalf,0,-7,0); + facing=DoRotation(facing,playerrotation2,0,0); + facingright=DoRotation(facing,0,-90,0); + facingdown=DoRotation(facing,90,0,0); + } + XYZ rotatearound; + XYZ oldpos; + if(whichgun==sniperrifle){ + for(int i=0;i<skeleton.num_joints;i++){ + if(skeleton.joints[i].label!=righthand&&skeleton.joints[i].label!=rightelbow&&skeleton.joints[i].label!=rightwrist&&skeleton.joints[i].label!=lefthand&&skeleton.joints[i].label!=leftelbow&&skeleton.joints[i].label!=leftwrist){ + }else{ + skeleton.joints[i].position=animation[rifleholdanim].position[i][0]; + if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[skeleton.jointlabels[neck]][0]-skeleton.joints[skeleton.jointlabels[neck]].position); + } + } + } + if(whichgun==shotgun){ + for(int i=0;i<skeleton.num_joints;i++){ + if(skeleton.joints[i].label!=righthand&&skeleton.joints[i].label!=rightelbow&&skeleton.joints[i].label!=rightwrist&&skeleton.joints[i].label!=lefthand&&skeleton.joints[i].label!=leftelbow&&skeleton.joints[i].label!=leftwrist){ + }else{ + skeleton.joints[i].position=animation[rifleholdanim].position[i][0]; + if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[skeleton.jointlabels[neck]][0]-skeleton.joints[skeleton.jointlabels[neck]].position); + } + } + } + if(whichgun==assaultrifle){ + for(int i=0;i<skeleton.num_joints;i++){ + if(skeleton.joints[i].label!=righthand&&skeleton.joints[i].label!=rightelbow&&skeleton.joints[i].label!=rightwrist&&skeleton.joints[i].label!=lefthand&&skeleton.joints[i].label!=leftelbow&&skeleton.joints[i].label!=leftwrist){ + }else{ + skeleton.joints[i].position=animation[rifleholdanim].position[i][0]; + if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[skeleton.jointlabels[neck]][0]-skeleton.joints[skeleton.jointlabels[neck]].position); + } + } + } + if((aiming||aimamount>0||whichgun==grenade)&&whichgun!=nogun){ + if(aiming&&targetanimation!=joganim){ + if(aimamount<1)aimamount+=multiplier*4; + if(aimamount>1)aimamount=1; + } + if(!aiming||targetanimation==joganim){ + if(aimamount>0)aimamount-=multiplier*4; + if(aimamount<0)aimamount=0; + } + if(grenphase==1){ + if(grenamount<1)grenamount+=multiplier*4; + if(grenamount>1)grenamount=1; + } + if(grenphase==0){ + if(grenamount>0)grenamount-=multiplier*4; + if(grenamount<0)grenamount=0; + } + rotatearound=skeleton.joints[skeleton.jointlabels[neck]].position; + for(int i=0;i<skeleton.num_joints;i++){ + if(skeleton.joints[i].label!=righthand&&skeleton.joints[i].label!=rightelbow&&skeleton.joints[i].label!=rightwrist&&skeleton.joints[i].label!=lefthand&&skeleton.joints[i].label!=leftelbow&&skeleton.joints[i].label!=leftwrist){ + }else{ + if(whichgun==sniperrifle){ + oldpos=skeleton.joints[i].position; + skeleton.joints[i].position=animation[rifleaimanim].position[i][0]; + if(currentanimation==crouchanim||targetanimation==crouchanim){ + skeleton.joints[i].position-=(animation[idleanim].position[skeleton.jointlabels[neck]][0]-skeleton.joints[skeleton.jointlabels[neck]].position); + } + skeleton.joints[i].position+=facingright*0.1; + skeleton.joints[i].position=rotatearound+DoRotation(skeleton.joints[i].position-rotatearound,(playerrotation2/2-10)*aimamount,0,0); + skeleton.joints[i].position=skeleton.joints[i].position*(aimamount)+oldpos*(1-aimamount); + } + if(whichgun==shotgun){ + oldpos=skeleton.joints[i].position; + skeleton.joints[i].position=animation[assaultrifleaimanim].position[i][0]; + if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[skeleton.jointlabels[neck]][0]-skeleton.joints[skeleton.jointlabels[neck]].position); + skeleton.joints[i].position=rotatearound+DoRotation(skeleton.joints[i].position-rotatearound,(playerrotation2/2)*aimamount,0,0); + if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position+=facingdown*.2; + else skeleton.joints[i].position-=facingdown*.02; + if(skeleton.joints[i].label==righthand)skeleton.joints[i].position=skeleton.joints[skeleton.jointlabels[lefthand]].position-facinghalf*2; + skeleton.joints[i].position=skeleton.joints[i].position*(aimamount)+oldpos*(1-aimamount); + } + if(whichgun==assaultrifle){ + oldpos=skeleton.joints[i].position; + skeleton.joints[i].position=animation[assaultrifleaimanim].position[i][0]; + if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[skeleton.jointlabels[neck]][0]-skeleton.joints[skeleton.jointlabels[neck]].position); + skeleton.joints[i].position=rotatearound+DoRotation(skeleton.joints[i].position-rotatearound,(playerrotation2/2)*aimamount,0,0); + if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position+=facingdown*.2; + else skeleton.joints[i].position-=facingdown*.02; + if(skeleton.joints[i].label==righthand)skeleton.joints[i].position=skeleton.joints[skeleton.jointlabels[lefthand]].position-facinghalf*2; + skeleton.joints[i].position=skeleton.joints[i].position*(aimamount)+oldpos*(1-aimamount); + } + if(whichgun==handgun1){ + oldpos=skeleton.joints[i].position; + skeleton.joints[i].position=animation[pistolaimanim].position[i][0]; + if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[skeleton.jointlabels[neck]][0]-skeleton.joints[skeleton.jointlabels[neck]].position); + skeleton.joints[i].position=rotatearound+DoRotation(skeleton.joints[i].position-rotatearound,(playerrotation2/2)*aimamount,0,0); + if(currentanimation==crouchanim||targetanimation==crouchanim){skeleton.joints[i].position+=facingright*.15;skeleton.joints[i].position+=facingdown*.3;} + else skeleton.joints[i].position-=facingdown*.1; + skeleton.joints[i].position=skeleton.joints[i].position*(aimamount)+oldpos*(1-aimamount); + } + if(whichgun==handgun2){ + oldpos=skeleton.joints[i].position; + skeleton.joints[i].position=animation[pistolaimanim].position[i][0]; + if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[skeleton.jointlabels[neck]][0]-skeleton.joints[skeleton.jointlabels[neck]].position); + skeleton.joints[i].position=rotatearound+DoRotation(skeleton.joints[i].position-rotatearound,(playerrotation2/2)*aimamount,0,0); + if(currentanimation==crouchanim||targetanimation==crouchanim){skeleton.joints[i].position+=facingright*.15;skeleton.joints[i].position+=facingdown*.3;} + else skeleton.joints[i].position-=facingdown*.1; + skeleton.joints[i].position=skeleton.joints[i].position*(aimamount)+oldpos*(1-aimamount); + } + if(whichgun==grenade){ + aimamount=1; + oldpos=skeleton.joints[i].position; + skeleton.joints[i].position=animation[grenadeaimanim].position[i][0]; + if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[skeleton.jointlabels[neck]][0]-skeleton.joints[skeleton.jointlabels[neck]].position); + skeleton.joints[i].position=skeleton.joints[i].position*(aimamount)+oldpos*(1-aimamount); + } + if(whichgun==grenade&&grenamount>0){ + oldpos=skeleton.joints[i].position; + skeleton.joints[i].position=animation[grenadechargeanim].position[i][0]; + if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[skeleton.jointlabels[neck]][0]-skeleton.joints[skeleton.jointlabels[neck]].position); + skeleton.joints[i].position=skeleton.joints[i].position*(grenamount)+oldpos*(1-grenamount); + } + if(thirdperson||who!=0)skeleton.joints[i].position+=facingdown*.4; + if(currentanimation!=crouchanim)skeleton.joints[i].position-=facinghalf*recoil*.35; + if(currentanimation==crouchanim)skeleton.joints[i].position-=facinghalf*recoil*.1; + } + } + } + //Whack + if(attackframe>-1&&whichgun!=grenade){ + for(int i=0;i<skeleton.num_joints;i++){ + if(!skeleton.joints[i].lower){ + if(attackframe==animation[riflehitanim].numframes)skeleton.joints[i].position=skeleton.joints[i].position*(attacktarget)+animation[riflehitanim].position[i][attackframe-1]*(1-attacktarget); + if(attackframe>0&&attackframe<animation[riflehitanim].numframes)skeleton.joints[i].position=animation[riflehitanim].position[i][attackframe-1]*(1-attacktarget)+animation[riflehitanim].position[i][attackframe]*(attacktarget); + if(attackframe==0)skeleton.joints[i].position=skeleton.joints[i].position*(1-attacktarget)+animation[riflehitanim].position[i][attackframe]*(attacktarget); + } + } + if(attackframe==0)attacktarget+=multiplier*animation[riflehitanim].speed[attackframe]*2; + if(attackframe>0)attacktarget+=multiplier*animation[riflehitanim].speed[attackframe-1]*2; + if(attacktarget>1){ + attacktarget=0; + attackframe++; + if(attackframe>animation[riflehitanim].numframes)attackframe=-1; + } + } + //Throw grenade + if(attackframe>-1&&whichgun==grenade&&ammo>0){ + for(int i=0;i<skeleton.num_joints;i++){ + if(!skeleton.joints[i].lower){ + if(attackframe==animation[grenadethrowanim].numframes)skeleton.joints[i].position=skeleton.joints[i].position*(attacktarget)+animation[grenadethrowanim].position[i][attackframe-1]*(1-attacktarget); + if(attackframe>0&&attackframe<animation[grenadethrowanim].numframes)skeleton.joints[i].position=animation[grenadethrowanim].position[i][attackframe-1]*(1-attacktarget)+animation[grenadethrowanim].position[i][attackframe]*(attacktarget); + if(attackframe==0)skeleton.joints[i].position=skeleton.joints[i].position*(1-attacktarget)+animation[grenadethrowanim].position[i][attackframe]*(attacktarget); + } + } + if(attackframe==0)attacktarget+=multiplier*animation[grenadethrowanim].speed[attackframe]*2; + if(attackframe>0)attacktarget+=multiplier*animation[grenadethrowanim].speed[attackframe-1]*2; + if(attacktarget>1){ + attacktarget=0; + attackframe++; + if(attackframe>animation[grenadethrowanim].numframes){ + attackframe=-1; + } + if(attackframe==animation[grenadethrowanim].numframes-1&&ammo>0){ + ammo=-1; + sprites.MakeSprite(grenadesprite, 1, 1, 1, 1, DoRotation(skeleton.joints[skeleton.jointlabels[righthand]].position,0,playerrotation,0)+playercoords, DoRotation(facing,0,playerrotation,0)*30+velocity, 1); + sprites.MakeSprite(spoonsprite, 1, 1, 1, 1, DoRotation(skeleton.joints[skeleton.jointlabels[righthand]].position,0,playerrotation,0)+playercoords, DoRotation(facing,0,playerrotation,0)*10+velocity, 1); + sprites.MakeSprite(pinsprite, 1, 1, 1, 1, DoRotation(skeleton.joints[skeleton.jointlabels[lefthand]].position,0,playerrotation,0)+playercoords, facing*.1+velocity, 1); + XYZ soundsource=DoRotation(skeleton.joints[skeleton.jointlabels[righthand]].position,0,playerrotation,0)+playercoords; + float gLoc[3]; + gLoc[0]=soundsource.x/soundscalefactor; + gLoc[1]=soundsource.y/soundscalefactor; + gLoc[2]=soundsource.z/soundscalefactor; + alSourcefv(gSourceID[grenadethrowsound], AL_POSITION, gLoc); + alSourcePlay(gSourceID[grenadethrowsound]); + } + } + } + + rotatearound=skeleton.joints[skeleton.jointlabels[abdomen]].position; + if(who==0) + for(int i=0;i<skeleton.num_joints;i++){ + if(skeleton.joints[i].lower==0) + skeleton.joints[i].position=rotatearound+DoRotation(skeleton.joints[i].position-rotatearound,playerrotation2/2,0,0); + } + if(who==0) + for(int i=0;i<skeleton.num_joints;i++){ + if(skeleton.joints[i].lower==1&&skeleton.joints[i].label!=groin) + skeleton.joints[i].position=DoRotation(skeleton.joints[i].position,0,playerlowrotation-playerrotation,0); + } + //head facing + if(who==0){ + rotatearound=skeleton.joints[skeleton.jointlabels[neck]].position; + skeleton.joints[skeleton.jointlabels[head]].position=rotatearound+DoRotation(skeleton.joints[skeleton.jointlabels[head]].position-rotatearound,playerrotation2/2,0,0); + } + + skeleton.DoConstraints(); + + //Reload + if(whichgun!=nogun&&whichgun!=knife){ + if(reloading>0){ + aiming=0; + reloading-=multiplier; + } + if(ammo<0&&reloads[whichgun]>0&&reloading<=0){ + if(whichgun!=grenade){ + float gLoc[3]; + ALint tempint; + gLoc[0]=playercoords.x/soundscalefactor; + gLoc[1]=playercoords.y/soundscalefactor; + gLoc[2]=playercoords.z/soundscalefactor; +#ifdef DEBIAN_NEEDS_TO_UPDATE_THEIR_OPENAL + alGetSourceiv(gSourceID[reloadsound], AL_SOURCE_STATE, &tempint); +#else + alGetSourcei(gSourceID[reloadsound], AL_SOURCE_STATE, &tempint); +#endif + + if (tempint != AL_PLAYING){ + alSourcefv(gSourceID[reloadsound], AL_POSITION, gLoc); + alSourcePlay(gSourceID[reloadsound]); + } + } + reloading=3; + aiming=0; + if(whichgun==sniperrifle)ammo=5; + if(whichgun==assaultrifle)ammo=25; + if(whichgun==handgun1)ammo=12; + if(whichgun==handgun2)ammo=16; + if(whichgun==grenade){ammo=1; reloading=1;} + if(whichgun==shotgun)ammo=6; + reloads[whichgun]--; + } + if(reloads[whichgun]==0&&whichgun==grenade&&ammo<=0){ + whichgun=nogun; + } + if(reloading<0){ + reloading=0; + aiming=1; + } + } + } +} + +void Person::DoAnimationslite(int who){ + + int oldanimation=currentanimation; + if(target>1&&!skeleton.free){ + //Footstep sounds + if(who==0&&(targetanimation==joganim||targetanimation==walkanim)&&(targetframe==0||targetframe==8)&&visions==0&&(onground||abs(velocity.y)<1)){ + int whichsound; + float gLoc[3]; + gLoc[0]=playercoords.x/soundscalefactor; + gLoc[1]=playercoords.y/soundscalefactor; + gLoc[2]=playercoords.z/soundscalefactor; + whichsound=footstepsound+abs(Random())%5; + alSourcefv(gSourceID[whichsound], AL_POSITION, gLoc); + alSourcePlay(gSourceID[whichsound]); + } + if(targetanimation==zombieeatanim&&(targetframe==3)){ + int whichsound; + float gLoc[3]; + XYZ soundpoint=(DoRotation(skeleton.joints[skeleton.jointlabels[head]].position,0,playerrotation,0)+playercoords); + gLoc[0]=soundpoint.x/soundscalefactor; + gLoc[1]=soundpoint.y/soundscalefactor; + gLoc[2]=soundpoint.z/soundscalefactor; + alSourcefv(gSourceID[bodyhitsound], AL_POSITION, gLoc); + alSourcePlay(gSourceID[bodyhitsound]); + bleeding=1; + bleeddelay=1; + bjoint1=&skeleton.joints[skeleton.jointlabels[head]]; + bjoint2=&skeleton.joints[skeleton.jointlabels[neck]]; + } + targetframe=currentframe; + currentanimation=targetanimation; + if(!backwardsanim){targetframe++; + if(targetframe>animation[currentanimation].numframes-1)targetframe=0;} + if(backwardsanim){targetframe--; + if(targetframe<0)targetframe=animation[currentanimation].numframes-1;} + target=0; + if((currentanimation==getupfrontanim||currentanimation==getupbackanim)&&targetframe==0){ + targetanimation=idleanim; + } + } + + if(!skeleton.free){ + if(currentanimation!=lyinganim){ + if(animation[targetanimation].speed[currentframe]>animation[currentanimation].speed[currentframe]) + target+=multiplier*animation[targetanimation].speed[currentframe]*speed; + if(animation[targetanimation].speed[currentframe]<=animation[currentanimation].speed[currentframe]) + target+=multiplier*animation[currentanimation].speed[currentframe]*speed; + } + if(currentanimation==lyinganim){ + target+=multiplier*animation[targetanimation].speed[targetframe]*speed; + } + if(((currentanimation==crouchanim)&&(targetanimation!=crouchanim))||((currentanimation!=crouchanim)&&(targetanimation==crouchanim)))target+=multiplier*animation[crouchanim].speed[0]*2; + if(currentanimation==idleanim&&targetanimation==idleanim)target-=multiplier*animation[idleanim].speed[0]/2; + + if(target>1)currentframe=targetframe; + } +} + +void Person::DoStuff(int who){ + int moveanim; + + if((targetanimation!=idleanim&&targetanimation!=crouchanim)||visions==1)playerlowrotation=playerrotation; + if(targetanimation!=crouchanim&¤tanimation!=crouchanim){ + if(playerrotation>playerlowrotation+50){playerlowrotation=playerrotation-50; targetanimation=walkanim; targetframe=0; target=0;} + if(playerrotation<playerlowrotation-50){playerlowrotation=playerrotation+50; targetanimation=walkanim; targetframe=0; target=0;} + } + if(targetanimation==crouchanim||currentanimation==crouchanim){ + if(playerrotation>playerlowrotation+70){playerrotation=playerlowrotation+70;} + if(playerrotation<playerlowrotation-70){playerrotation=playerlowrotation-70;} + } + if(who==0)camera.rotation=180-playerrotation; + + if(who!=0&&visions==0){ + if(targetanimation!=walkanim&&targetanimation!=zombiewalkanim)speed=1.0*speedmult; + if(targetanimation==walkanim||targetanimation==zombiewalkanim)speed=1.8*speedmult; + playerlowrotation=playerrotation; + } + + //Do controls + if(who==0&&targetanimation!=diveanim&&targetanimation!=throwanim&&targetanimation!=thrownanim&¤tanimation!=diveanim&¤tanimation!=getupfrontanim){ + backwardsanim=0; + if(visions==1)speed=40; + if(visions==0&&targetanimation==joganim)speed=2.2; + if(visions==0&&targetanimation!=joganim)speed=1.3; + if(visions==0&&targetanimation==walkanim)speed=2.5; + unsigned char theKeyMap[16]; + GetKeys( ( unsigned long * )theKeyMap ); + + if(IsKeyDown( theKeyMap, MAC_SHIFT_KEY )||visions==1){ + moveanim=joganim; + }else{ + moveanim=walkanim; + } + if(IsKeyDown( theKeyMap, MAC_CONTROL_KEY )&¤tanimation==idleanim&&targetanimation==idleanim){ + targetanimation=crouchanim; + target=0; + } + if(!IsKeyDown( theKeyMap, MAC_CONTROL_KEY )&¤tanimation==crouchanim&&targetanimation==crouchanim){ + targetanimation=idleanim; + target=0; + } + if((onground||(who==0&&visions==1))&¤tanimation!=crouchanim){ + if ( IsKeyDown( theKeyMap, forwardskey )&&!( IsKeyDown( theKeyMap, backwardskey ))){ + if(targetanimation!=moveanim)targetframe=0; + targetanimation=moveanim; + } + if ( IsKeyDown( theKeyMap, rightkey )&&!( IsKeyDown( theKeyMap, leftkey ))){ + if(targetanimation!=moveanim)targetframe=0; + targetanimation=moveanim; + playerlowrotation-=90; + if(IsKeyDown( theKeyMap, forwardskey ))playerlowrotation+=45; + if(IsKeyDown( theKeyMap, backwardskey ))playerlowrotation-=235; + } + if ( IsKeyDown( theKeyMap, leftkey )&&!( IsKeyDown( theKeyMap, rightkey ))){ + if(targetanimation!=moveanim)targetframe=0; + targetanimation=moveanim; + playerlowrotation+=90; + if(IsKeyDown( theKeyMap, forwardskey ))playerlowrotation-=45; + if(IsKeyDown( theKeyMap, backwardskey ))playerlowrotation+=235; + } + if ( IsKeyDown( theKeyMap, backwardskey )){ + if(targetanimation!=moveanim)targetframe=0; + targetanimation=moveanim; + backwardsanim=1; + } + } + //air control + if(!onground){ + float oldplayerrotation=playerrotation; + if ( IsKeyDown( theKeyMap, forwardskey )&&!( IsKeyDown( theKeyMap, backwardskey ))){ + facing=0; + facing.z=1; + facing=DoRotation(facing,0,playerrotation,0); + velocity=velocity+facing*multiplier*4; + } + if ( IsKeyDown( theKeyMap, rightkey )&&!( IsKeyDown( theKeyMap, leftkey ))){ + playerrotation-=90; + if(IsKeyDown( theKeyMap, forwardskey ))playerrotation+=45; + if(IsKeyDown( theKeyMap, backwardskey ))playerrotation-=45; + facing=0; + facing.z=1; + facing=DoRotation(facing,0,playerrotation,0); + velocity=velocity+facing*multiplier*4; + } + if ( IsKeyDown( theKeyMap, leftkey )&&!( IsKeyDown( theKeyMap, rightkey ))){ + playerrotation+=90; + if(IsKeyDown( theKeyMap, forwardskey ))playerrotation-=45; + if(IsKeyDown( theKeyMap, backwardskey ))playerrotation+=45; + facing=0; + facing.z=1; + facing=DoRotation(facing,0,playerrotation,0); + velocity=velocity+facing*multiplier*4; + } + if ( IsKeyDown( theKeyMap, backwardskey )&&!IsKeyDown( theKeyMap, forwardskey )&&!IsKeyDown( theKeyMap, leftkey )&&!IsKeyDown( theKeyMap, rightkey )){ + playerrotation+=180; + facing=0; + facing.z=1; + facing=DoRotation(facing,0,playerrotation,0); + velocity=velocity+facing*multiplier*4; + } + playerrotation=oldplayerrotation; + } + if(!IsKeyDown( theKeyMap, forwardskey )&&!IsKeyDown( theKeyMap, leftkey )&&!IsKeyDown( theKeyMap, rightkey )&&!IsKeyDown( theKeyMap, backwardskey )&&(targetanimation==joganim||targetanimation==walkanim)){ + if(!(targetanimation==walkanim&&(targetframe==0||targetframe==2))){ + targetanimation=idleanim; + targetframe=0; + target=0; + } + } + } + + + facing=0; + facing.z=1; + + facing=DoRotation(facing,0,playerlowrotation,0); + if(backwardsanim)facing*=-1; + + if(onground){ + velocity=0; + } + if(((currentanimation==joganim||currentanimation==zombiejoganim||currentanimation==diveanim)&&onground)||(who==0&&visions==1&&((currentanimation==joganim||currentanimation==walkanim||currentanimation==diveanim)||(currentanimation==zombiejoganim||currentanimation==zombiewalkanim)))){ + playercoords+=facing*multiplier*15*speed; + velocity.x=facing.x*15*speed; + velocity.z=facing.z*15*speed; + } + if((currentanimation==walkanim||currentanimation==zombiewalkanim)&&onground&&(who!=0||visions==0)){ + playercoords+=facing*multiplier*4*speed; + velocity.x=facing.x*4*speed; + velocity.z=facing.z*4*speed; + } +} + +void Person::FindRotationGun(XYZ start, XYZ target) +{ + XYZ temppoint1,temppoint2,tempforward; + float distance; + + temppoint1=start; + temppoint2=target; + distance=findDistance(temppoint1,temppoint2); + gunrotate2=asin((temppoint1.y-temppoint2.y)/distance)*rad2deg; + temppoint1.y=0; + temppoint2.y=0; + gunrotate1=acos((temppoint1.z-temppoint2.z)/findDistance(temppoint1,temppoint2))*rad2deg; + if(temppoint1.x>temppoint2.x)gunrotate1=360-gunrotate1; + tempforward=target-start; + tempforward=DoRotation(tempforward,-90,0,0); + tempforward=DoRotation(tempforward,0,gunrotate1-90,0); + tempforward=DoRotation(tempforward,0,0,gunrotate2-90); + tempforward.y=0; + Normalise(&tempforward); + gunrotate3=acos(0-tempforward.z)*rad2deg; + if(0>tempforward.x)gunrotate3=360-gunrotate3; +} + +extern Model skeletonmodels[10]; +extern Costume costume[2]; +int Person::DrawSkeleton(int who){ + GLfloat M[16]; + //Guns + if(whichgun==sniperrifle){ + FindRotationGun(skeleton.joints[skeleton.jointlabels[righthand]].position,skeleton.joints[skeleton.jointlabels[lefthand]].position); + glPushMatrix(); + glTranslatef( skeleton.joints[skeleton.jointlabels[righthand]].position.x, + skeleton.joints[skeleton.jointlabels[righthand]].position.y, + skeleton.joints[skeleton.jointlabels[righthand]].position.z); + glRotatef(-gunrotate1+90,0,1,0); + glRotatef(-gunrotate2+90,0,0,1); + glRotatef(-gunrotate3,0,1,0); + gunmodels[sniperriflemodel].draw(); + glPopMatrix(); + } + + if(whichgun==shotgun){ + FindRotationGun(skeleton.joints[skeleton.jointlabels[righthand]].position,skeleton.joints[skeleton.jointlabels[lefthand]].position); + glPushMatrix(); + glTranslatef( skeleton.joints[skeleton.jointlabels[righthand]].position.x, + skeleton.joints[skeleton.jointlabels[righthand]].position.y, + skeleton.joints[skeleton.jointlabels[righthand]].position.z); + glRotatef(2,1,0,0); + glRotatef(-gunrotate1+90+1,0,1,0); + glRotatef(-gunrotate2+90,0,0,1); + glRotatef(-gunrotate3,0,1,0); + glTranslatef(0,-.4,0); + gunmodels[shotgunmodel].draw(); + glPopMatrix(); + } + + if(whichgun==assaultrifle){ + FindRotationGun(skeleton.joints[skeleton.jointlabels[righthand]].position,skeleton.joints[skeleton.jointlabels[lefthand]].position); + glPushMatrix(); + glTranslatef( skeleton.joints[skeleton.jointlabels[righthand]].position.x, + skeleton.joints[skeleton.jointlabels[righthand]].position.y, + skeleton.joints[skeleton.jointlabels[righthand]].position.z); + glRotatef(-gunrotate1+90,0,1,0); + glRotatef(-gunrotate2+90,0,0,1); + glRotatef(-gunrotate3,0,1,0); + gunmodels[assaultriflemodel].draw(); + glPopMatrix(); + } + + if(whichgun==handgun1){ + if(!thirdperson&&who==0)FindRotationGun(skeleton.joints[skeleton.jointlabels[righthand]].position,(skeleton.joints[skeleton.jointlabels[head]].position*.65+skeleton.joints[skeleton.jointlabels[neck]].position*.35)); + if(thirdperson||who!=0)FindRotationGun(skeleton.joints[skeleton.jointlabels[righthand]].position,(skeleton.joints[skeleton.jointlabels[head]].position*.35+skeleton.joints[skeleton.jointlabels[neck]].position*.65)); + glPushMatrix(); + glTranslatef( skeleton.joints[skeleton.jointlabels[righthand]].position.x, + skeleton.joints[skeleton.jointlabels[righthand]].position.y, + skeleton.joints[skeleton.jointlabels[righthand]].position.z); + glRotatef(-gunrotate1+90-1.5,0,1,0); + glRotatef(-gunrotate2+90,0,0,1); + glRotatef(-gunrotate3,0,1,0); + glTranslatef(0,0,.15); + gunmodels[handgunbasemodel].draw(); + glTranslatef(0,-recoil*.3,0); + gunmodels[handgunslidemodel].draw(); + glPopMatrix(); + } + + if(whichgun==handgun2){ + if(!thirdperson&&who==0)FindRotationGun(skeleton.joints[skeleton.jointlabels[righthand]].position,(skeleton.joints[skeleton.jointlabels[head]].position*.65+skeleton.joints[skeleton.jointlabels[neck]].position*.35)); + if(thirdperson||who!=0)FindRotationGun(skeleton.joints[skeleton.jointlabels[righthand]].position,(skeleton.joints[skeleton.jointlabels[head]].position*.35+skeleton.joints[skeleton.jointlabels[neck]].position*.65)); + glPushMatrix(); + glTranslatef( skeleton.joints[skeleton.jointlabels[righthand]].position.x, + skeleton.joints[skeleton.jointlabels[righthand]].position.y, + skeleton.joints[skeleton.jointlabels[righthand]].position.z); + glRotatef(-gunrotate1+90-1.5,0,1,0); + glRotatef(-gunrotate2+90,0,0,1); + glRotatef(-gunrotate3,0,1,0); + glTranslatef(0,0,.15); + gunmodels[handgun2basemodel].draw(); + glTranslatef(0,-recoil*.3,0); + gunmodels[handgun2slidemodel].draw(); + glPopMatrix(); + } + + if(whichgun==grenade){ + glPushMatrix(); + glTranslatef( skeleton.joints[skeleton.jointlabels[righthand]].position.x, + skeleton.joints[skeleton.jointlabels[righthand]].position.y, + skeleton.joints[skeleton.jointlabels[righthand]].position.z); + glRotatef(-90,1,0,0); + glTranslatef(0,0,.05); + if(reloading<=0){ + gunmodels[grenadebasemodel].draw(); + if(grenphase==0)gunmodels[grenadepinmodel].draw(); + glTranslatef(0,0,.005); + gunmodels[grenadespoonmodel].draw(); + } + glPopMatrix(); + } + + if(whichgun==grenade){ + glPushMatrix(); + glTranslatef( skeleton.joints[skeleton.jointlabels[lefthand]].position.x, + skeleton.joints[skeleton.jointlabels[lefthand]].position.y, + skeleton.joints[skeleton.jointlabels[lefthand]].position.z); + glRotatef(-90,1,0,0); + glTranslatef(0,0,-.15); + if(reloading<=0){ + if(grenphase==1)gunmodels[grenadepinmodel].draw(); + } + glPopMatrix(); + } + if(!litup){ + glDisable(GL_LIGHT1); + } + if(litup){ + GLfloat LightAmbient[]= { 0,0,0, 1.0f}; + GLfloat LightDiffuse[]= { 1,1,1, 1.0f }; + XYZ lightpoint; + lightpoint=skeleton.joints[skeleton.jointlabels[lefthand]].position; + GLfloat LightPosition[]= {lightpoint.x,lightpoint.y,lightpoint.z,0}; + glLightfv(GL_LIGHT1, GL_POSITION, LightPosition); + glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); + glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); + glEnable(GL_LIGHT1); + + litup=0; + } + + //Find forward vectors + if(who==0||skeleton.free!=0||skeleton.offset!=0||whichgun!=nogun||currentanimation==lyinganim||((currentanimation==getupfrontanim||currentanimation==getupbackanim)&&targetanimation==idleanim)){ + if(!(skeleton.free==1&&longdead<=0)){ + if(skeleton.offset&&skeleton.free<1){ + XYZ normal; + skeleton.offset=0; + for(int i=0;i<skeleton.num_joints;i++){ + skeleton.joints[i].oldposition=skeleton.joints[i].position; + skeleton.joints[i].position+=skeleton.joints[i].offset; + if(findLengthfast(skeleton.joints[i].offset)<multiplier*multiplier*25)skeleton.joints[i].offset=0; + else{ + normal=skeleton.joints[i].offset; + Normalise(&normal); + skeleton.offset=1; + skeleton.joints[i].offset-=normal*multiplier*5; + } + } + skeleton.DoConstraints(); + } + CrossProduct(skeleton.joints[skeleton.forwardjoints[1]].position-skeleton.joints[skeleton.forwardjoints[0]].position,skeleton.joints[skeleton.forwardjoints[2]].position-skeleton.joints[skeleton.forwardjoints[0]].position,&skeleton.forward); + Normalise(&skeleton.forward); + + CrossProduct(skeleton.joints[skeleton.lowforwardjoints[1]].position-skeleton.joints[skeleton.lowforwardjoints[0]].position,skeleton.joints[skeleton.lowforwardjoints[2]].position-skeleton.joints[skeleton.lowforwardjoints[0]].position,&skeleton.lowforward); + Normalise(&skeleton.lowforward); + + //Special forwards + skeleton.specialforward[0]=skeleton.forward; + + skeleton.specialforward[1]=skeleton.joints[skeleton.jointlabels[rightshoulder]].position+skeleton.joints[skeleton.jointlabels[rightwrist]].position; + skeleton.specialforward[1]=skeleton.joints[skeleton.jointlabels[rightelbow]].position-skeleton.specialforward[1]/2; + skeleton.specialforward[1]+=skeleton.forward*.2; + Normalise(&skeleton.specialforward[1]); + skeleton.specialforward[2]=skeleton.joints[skeleton.jointlabels[leftshoulder]].position+skeleton.joints[skeleton.jointlabels[leftwrist]].position; + skeleton.specialforward[2]=skeleton.joints[skeleton.jointlabels[leftelbow]].position-skeleton.specialforward[2]/2; + skeleton.specialforward[2]+=skeleton.forward*.2; + Normalise(&skeleton.specialforward[2]); + + if(who==0&&aimamount>0&&health==100&&whichgun!=nogun){ + //Facing + XYZ facing; + XYZ facingdown; + //Facing + facing=0; + facing.z=1; + + facing=DoRotation(facing,camera.rotation2,0,0); + facingdown=DoRotation(facing,90,0,0); + skeleton.specialforward[1]=skeleton.specialforward[1]*(1-aimamount)+facingdown*aimamount; + skeleton.specialforward[2]=skeleton.specialforward[2]*(1-aimamount)+facingdown*aimamount; + } + + skeleton.specialforward[3]=skeleton.joints[skeleton.jointlabels[righthip]].position+skeleton.joints[skeleton.jointlabels[rightankle]].position; + skeleton.specialforward[3]=skeleton.specialforward[3]/2-skeleton.joints[skeleton.jointlabels[rightknee]].position; + skeleton.specialforward[3]+=skeleton.lowforward*.2; + Normalise(&skeleton.specialforward[3]); + skeleton.specialforward[4]=skeleton.joints[skeleton.jointlabels[lefthip]].position+skeleton.joints[skeleton.jointlabels[leftankle]].position; + skeleton.specialforward[4]=skeleton.specialforward[4]/2-skeleton.joints[skeleton.jointlabels[leftknee]].position; + skeleton.specialforward[4]+=skeleton.lowforward*.2; + Normalise(&skeleton.specialforward[4]); + + //Find joint rotations + for(int i=0;i<skeleton.num_joints;i++){ + if(skeleton.joints[i].hasparent&&skeleton.joints[i].visible) + { + skeleton.FindRotationJoint(i); + } + } + for(int i=0;i<skeleton.num_muscles;i++){ + if(skeleton.muscles[i].visible) + { + skeleton.FindRotationMuscle(i); + } + }}} + for(int i=0;i<skeleton.num_joints;i++){ + if(skeleton.joints[i].hasparent&&skeleton.joints[i].visible) + { + glPushMatrix(); + glTranslatef( (skeleton.joints[i].position.x+skeleton.joints[i].parent->position.x)/2, + (skeleton.joints[i].position.y+skeleton.joints[i].parent->position.y)/2, + (skeleton.joints[i].position.z+skeleton.joints[i].parent->position.z)/2); + glRotatef(-skeleton.joints[i].rotate1+90,0,1,0); + glRotatef(-skeleton.joints[i].rotate2+90,0,0,1); + glRotatef(-skeleton.joints[i].rotate3,0,1,0); + if(skeleton.joints[i].modelnum==0&&(who!=0||thirdperson))skeletonmodels[skeleton.joints[i].modelnum].draw(costume[whichcostume].headcolor[0],costume[whichcostume].headcolor[1],costume[whichcostume].headcolor[2]); + if(skeleton.joints[i].modelnum==0&&(who==0&&thirdperson))skeletonmodels[9].draw(); + if(skeleton.joints[i].modelnum==1&&(who!=0||thirdperson))skeletonmodels[skeleton.joints[i].modelnum].draw(costume[whichcostume].chestcolor[0],costume[whichcostume].chestcolor[1],costume[whichcostume].chestcolor[2]); + if(skeleton.joints[i].modelnum==2)skeletonmodels[skeleton.joints[i].modelnum].draw(costume[whichcostume].abdomencolor[0],costume[whichcostume].abdomencolor[1],costume[whichcostume].abdomencolor[2]); + if(skeleton.joints[i].modelnum==3)skeletonmodels[skeleton.joints[i].modelnum].draw(costume[whichcostume].upperarmcolor[0],costume[whichcostume].upperarmcolor[1],costume[whichcostume].upperarmcolor[2]); + if(skeleton.joints[i].modelnum==4)skeletonmodels[skeleton.joints[i].modelnum].draw(costume[whichcostume].lowerarmcolor[0],costume[whichcostume].lowerarmcolor[1],costume[whichcostume].lowerarmcolor[2]); + if(skeleton.joints[i].modelnum==5)skeletonmodels[skeleton.joints[i].modelnum].draw(costume[whichcostume].handcolor[0],costume[whichcostume].handcolor[1],costume[whichcostume].handcolor[2]); + if(skeleton.joints[i].modelnum==6)skeletonmodels[skeleton.joints[i].modelnum].draw(costume[whichcostume].upperlegcolor[0],costume[whichcostume].upperlegcolor[1],costume[whichcostume].upperlegcolor[2]); + if(skeleton.joints[i].modelnum==7)skeletonmodels[skeleton.joints[i].modelnum].draw(costume[whichcostume].lowerlegcolor[0],costume[whichcostume].lowerlegcolor[1],costume[whichcostume].lowerlegcolor[2]); + if(skeleton.joints[i].modelnum==8)skeletonmodels[skeleton.joints[i].modelnum].draw(costume[whichcostume].footcolor[0],costume[whichcostume].footcolor[1],costume[whichcostume].footcolor[2]); + glPopMatrix(); + } + } + + for(int i=0;i<skeleton.num_muscles;i++){ + if(skeleton.muscles[i].visible) + { + glPushMatrix(); + glTranslatef( (skeleton.muscles[i].parent1->position.x+skeleton.muscles[i].parent2->position.x)/2, + (skeleton.muscles[i].parent1->position.y+skeleton.muscles[i].parent2->position.y)/2, + (skeleton.muscles[i].parent1->position.z+skeleton.muscles[i].parent2->position.z)/2); + glRotatef(-skeleton.muscles[i].rotate1+90,0,1,0); + glRotatef(-skeleton.muscles[i].rotate2+90,0,0,1); + glRotatef(-skeleton.muscles[i].rotate3,0,1,0); + if(skeleton.muscles[i].parent1->modelnum==0&&(who!=0||thirdperson))skeletonmodels[skeleton.muscles[i].parent1->modelnum].draw(costume[whichcostume].headcolor[0],costume[whichcostume].headcolor[1],costume[whichcostume].headcolor[2]); + if(skeleton.muscles[i].parent1->modelnum==0&&(who==0&&thirdperson))skeletonmodels[9].draw(); + if(skeleton.muscles[i].parent1->modelnum==1&&(who!=0||thirdperson))skeletonmodels[skeleton.muscles[i].parent1->modelnum].draw(costume[whichcostume].chestcolor[0],costume[whichcostume].chestcolor[1],costume[whichcostume].chestcolor[2]); + if(skeleton.muscles[i].parent1->modelnum==2)skeletonmodels[skeleton.muscles[i].parent1->modelnum].draw(costume[whichcostume].abdomencolor[0],costume[whichcostume].abdomencolor[1],costume[whichcostume].abdomencolor[2]); + if(skeleton.muscles[i].parent1->modelnum==3)skeletonmodels[skeleton.muscles[i].parent1->modelnum].draw(costume[whichcostume].upperarmcolor[0],costume[whichcostume].upperarmcolor[1],costume[whichcostume].upperarmcolor[2]); + if(skeleton.muscles[i].parent1->modelnum==4)skeletonmodels[skeleton.muscles[i].parent1->modelnum].draw(costume[whichcostume].lowerarmcolor[0],costume[whichcostume].lowerarmcolor[1],costume[whichcostume].lowerarmcolor[2]); + if(skeleton.muscles[i].parent1->modelnum==5)skeletonmodels[skeleton.muscles[i].parent1->modelnum].draw(costume[whichcostume].handcolor[0],costume[whichcostume].handcolor[1],costume[whichcostume].handcolor[2]); + if(skeleton.muscles[i].parent1->modelnum==6)skeletonmodels[skeleton.muscles[i].parent1->modelnum].draw(costume[whichcostume].upperlegcolor[0],costume[whichcostume].upperlegcolor[1],costume[whichcostume].upperlegcolor[2]); + if(skeleton.muscles[i].parent1->modelnum==7)skeletonmodels[skeleton.muscles[i].parent1->modelnum].draw(costume[whichcostume].lowerlegcolor[0],costume[whichcostume].lowerlegcolor[1],costume[whichcostume].lowerlegcolor[2]); + if(skeleton.muscles[i].parent1->modelnum==8)skeletonmodels[skeleton.muscles[i].parent1->modelnum].draw(costume[whichcostume].footcolor[0],costume[whichcostume].footcolor[1],costume[whichcostume].footcolor[2]); + + glPopMatrix(); + } + } + if(whichgun==knife){ + glPushMatrix(); + glTranslatef( skeleton.joints[skeleton.jointlabels[righthand]].position.x, + skeleton.joints[skeleton.jointlabels[righthand]].position.y, + skeleton.joints[skeleton.jointlabels[righthand]].position.z); + glRotatef(-skeleton.joints[skeleton.jointlabels[righthand]].rotate1+90-1.5,0,1,0); + glRotatef(-skeleton.joints[skeleton.jointlabels[righthand]].rotate2+90,0,0,1); + glRotatef(-skeleton.joints[skeleton.jointlabels[righthand]].rotate3,0,1,0); + glTranslatef(0,-.2,0); + gunmodels[knifemodel].draw(); + glPopMatrix(); + } + if(skeleton.offset&&skeleton.free<1){ + for(int i=0;i<skeleton.num_joints;i++){ + skeleton.joints[i].position=skeleton.joints[i].oldposition; + } + } + + glDisable(GL_LIGHT1); + + return 0; +} + |