diff options
Diffstat (limited to 'src/Person.cpp')
-rw-r--r-- | src/Person.cpp | 167 |
1 files changed, 73 insertions, 94 deletions
diff --git a/src/Person.cpp b/src/Person.cpp index 7630000..bd1e5cb 100644 --- a/src/Person.cpp +++ b/src/Person.cpp @@ -51,28 +51,21 @@ HitStruct Person::BulletCollideWithPlayer(int who, XYZ start, XYZ end){ XYZ collisionpoint; GLfloat M[16]; int collide; - XYZ average; - 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=sqrt(distancemax); + + XYZ average {}; + for (auto& joint : skeleton.joints) + average += joint.position; + average /= max_joints; + + float distancemax = 0.0f; + for (auto& joint : skeleton.joints) + distancemax = max(distancemax, + findDistancefast(average, joint.position)); + distancemax = sqrt(distancemax); + //Collide with player if(skeleton.free<1){ start=start-playercoords; @@ -85,18 +78,18 @@ HitStruct Person::BulletCollideWithPlayer(int who, XYZ start, XYZ 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; + for (auto& joint : skeleton.joints) { + if (joint.hasparent && joint.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)); + glScalef(1, 1 / joint.length, 1); + glRotatef(joint.rotate2 - 90, 0, 0, 1); + glRotatef(joint.rotate1 - 90, 0, 1, 0); + glTranslatef(-(joint.position.x + joint.parent->position.x) / 2, + -(joint.position.y + joint.parent->position.y) / 2, + -(joint.position.z + joint.parent->position.z) / 2); glTranslatef(tempbulletloc[0].x,tempbulletloc[0].y,tempbulletloc[0].z); glGetFloatv(GL_MODELVIEW_MATRIX,M); tempbulletloc[0].x=M[12]; @@ -105,29 +98,29 @@ HitStruct Person::BulletCollideWithPlayer(int who, XYZ start, XYZ end){ 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)); + glScalef(1, 1 / joint.length, 1); + glRotatef(joint.rotate2 - 90, 0, 0, 1); + glRotatef(joint.rotate1 - 90, 0, 1, 0); + glTranslatef(-(joint.position.x + joint.parent->position.x) / 2, + -(joint.position.y + joint.parent->position.y) / 2, + -(joint.position.z + joint.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); + collide=skeletonmodels[joint.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((joint.position.x + joint.parent->position.x) / 2, + (joint.position.y + joint.parent->position.y) / 2, + (joint.position.z + joint.parent->position.z) / 2); + glRotatef(90 - joint.rotate1, 0, 1, 0); + glRotatef(90 - joint.rotate2, 0, 0, 1); + glScalef(1, joint.length, 1); glTranslatef(collisionpoint.x,collisionpoint.y,collisionpoint.z); glGetFloatv(GL_MODELVIEW_MATRIX,M); collisionpoint.x=M[12]; @@ -136,8 +129,8 @@ HitStruct Person::BulletCollideWithPlayer(int who, XYZ start, XYZ end){ glPopMatrix(); hitstruct.collision=1; hitstruct.hitlocation=collisionpoint; - hitstruct.joint1=&skeleton.joints[j]; - hitstruct.joint2=skeleton.joints[j].parent; + hitstruct.joint1 = &joint; + hitstruct.joint2 = joint.parent; } } } @@ -302,7 +295,7 @@ void Person::DoAnimations(int who) if(target>1)currentframe=targetframe; - for(int i=0;i<skeleton.num_joints;i++){ + for (int i = 0; i < max_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); @@ -357,33 +350,26 @@ void Person::DoAnimations(int who) } 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); + switch (whichgun) { + case sniperrifle: + case shotgun: + case assaultrifle: + for (int i = 0; i < max_joints; ++i) + switch (skeleton.joints[i].label) { + case leftelbow: + case leftwrist: + case lefthand: + case rightelbow: + case rightwrist: + case righthand: + skeleton.joints[i].position = animation[rifleholdanim].position[i][0]; + if (currentanimation == crouchanim + || targetanimation == crouchanim) + skeleton.joints[i].position += skeleton.joints[skeleton.jointlabels[neck]].position + - animation[idleanim].position[skeleton.jointlabels[neck]][0]; } - } - } - 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; @@ -401,7 +387,7 @@ void Person::DoAnimations(int who) if(grenamount<0)grenamount=0; } rotatearound=skeleton.joints[skeleton.jointlabels[neck]].position; - for(int i=0;i<skeleton.num_joints;i++){ + for (int i = 0; i < max_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){ @@ -473,7 +459,7 @@ void Person::DoAnimations(int who) } //Whack if(attackframe>-1&&whichgun!=grenade){ - for(int i=0;i<skeleton.num_joints;i++){ + for (int i = 0; i < max_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); @@ -490,7 +476,7 @@ void Person::DoAnimations(int who) } //Throw grenade if(attackframe>-1&&whichgun==grenade&&ammo>0){ - for(int i=0;i<skeleton.num_joints;i++){ + for (int i = 0; i < max_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); @@ -521,20 +507,16 @@ void Person::DoAnimations(int who) } 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); + if (who == 0) { + for (auto& joint : skeleton.joints) + if (!joint.lower) + joint.position = rotatearound + + DoRotation(joint.position - rotatearound, playerrotation2 / 2, 0, 0); + else if (joint.label != groin) + joint.position = DoRotation(joint.position, 0, playerlowrotation - playerrotation, 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(); @@ -1023,8 +1005,7 @@ int Person::DrawSkeleton(int who) if (skeleton.offset && skeleton.free < 1) { XYZ normal; skeleton.offset = 0; - for (int i = 0; i < skeleton.num_joints; i++) { - auto& joint = skeleton.joints[i]; + for (auto& joint : skeleton.joints) { joint.oldposition = joint.position; joint.position += joint.offset; if (findLengthfast(joint.offset) >= multiplier * multiplier * 25) { @@ -1105,7 +1086,7 @@ int Person::DrawSkeleton(int who) + skeleton.lowforward * 0.2; Normalise(specialfwd++); - for(int i = 0; i < skeleton.num_joints; i++) + for (int i = 0; i < max_joints; i++) if (skeleton.joints[i].hasparent && skeleton.joints[i].visible) skeleton.FindRotationJoint(i); @@ -1116,16 +1097,14 @@ int Person::DrawSkeleton(int who) } } - for (int i = 0; i < skeleton.num_joints; i++) + for (int i = 0; i < max_joints; i++) draw_joint(skeleton.joints[i], who, whichcostume); for (int i = 0; i < skeleton.num_muscles; i++) draw_muscle(skeleton.muscles[i], who, whichcostume); if (skeleton.offset && skeleton.free < 1) - for (int i = 0; i < skeleton.num_joints; i++) { - auto& joint = skeleton.joints[i]; + for (auto& joint : skeleton.joints) joint.position = joint.oldposition; - } glDisable(GL_LIGHT1); return 0; |