diff options
Diffstat (limited to 'src/Skeleton.cpp')
-rw-r--r-- | src/Skeleton.cpp | 182 |
1 files changed, 50 insertions, 132 deletions
diff --git a/src/Skeleton.cpp b/src/Skeleton.cpp index 7315fac..ba27aa4 100644 --- a/src/Skeleton.cpp +++ b/src/Skeleton.cpp @@ -84,13 +84,10 @@ void Muscle::DoConstraint(int broken) void Skeleton::DoConstraints() { - numrepeats=3; - - for(int j=0; j<numrepeats; j++){ - for(int i=0; i<num_joints; i++){ - joints[i].DoConstraint(); - } - } + numrepeats = 3; + for(int i = 0; i < numrepeats; ++i) + for (auto& joint : joints) + joint.DoConstraint(); } void Skeleton::DoConstraints(Model *collide, XYZ *move, float rotation) @@ -100,7 +97,7 @@ void Skeleton::DoConstraints(Model *collide, XYZ *move, float rotation) groundlevel = 0; numrepeats = 2; for (int j = 0; j < numrepeats; j++) { - for (int i = 0; i < num_joints; i++) { + for (int i = 0; i < max_joints; i++) { if (!joints[i].existing && i != jointlabels[lefthand] && i != jointlabels[righthand]) @@ -148,9 +145,9 @@ void Skeleton::DoConstraints(Model *collide, XYZ *move, float rotation) if (broken > 1) continue; XYZ avgvelocity {0}; - for (int k = 0; k < num_joints; k++) + for (int k = 0; k < max_joints; k++) avgvelocity += joints[k].velocity; - avgvelocity /= num_joints; + avgvelocity /= max_joints; int landsound = -1; switch (joints[i].label) { @@ -181,7 +178,7 @@ void Skeleton::DoConstraints(Model *collide, XYZ *move, float rotation) muscles[i].DoConstraint(broken); } - for (int i = 0; i < num_joints; i++) { + for (int i = 0; i < max_joints; i++) { joints[i].realoldposition = joints[i].position; //Add velocity if (joints[i].existing @@ -193,9 +190,8 @@ void Skeleton::DoConstraints(Model *collide, XYZ *move, float rotation) void Skeleton::DoGravity() { - for(int i=0; i<num_joints; i++){ - joints[i].velocity.y+=gravity*multiplier; - } + for (auto& joint : joints) + joint.velocity.y += gravity * multiplier; } void Skeleton::Draw(int muscleview) @@ -216,7 +212,7 @@ void Skeleton::Draw(int muscleview) jointcolor[3]=.5; } //Calc motionblur-ness - for(int i=0; i<num_joints; i++){ + for(int i=0; i<max_joints; i++){ joints[i].oldposition=joints[i].position; joints[i].blurred=findDistance(joints[i].position,joints[i].oldposition)*100; if(joints[i].blurred<1)joints[i].blurred=1; @@ -227,7 +223,7 @@ void Skeleton::Draw(int muscleview) glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glBegin(GL_QUADS); - for(int i=0; i<num_joints; i++){ + for(int i=0; i<max_joints; i++){ if(joints[i].hasparent){ glColor4f(jointcolor[0],jointcolor[1],jointcolor[2],jointcolor[3]/joints[i].blurred); glVertex3f(joints[i].position.x,joints[i].position.y,joints[i].position.z); @@ -254,7 +250,7 @@ void Skeleton::Draw(int muscleview) glEnd(); glBegin(GL_LINES); - for(int i=0; i<num_joints; i++){ + for(int i=0; i<max_joints; i++){ if(joints[i].hasparent){ glColor4f(jointcolor[0],jointcolor[1],jointcolor[2],jointcolor[3]/joints[i].blurred); glVertex3f(joints[i].position.x,joints[i].position.y,joints[i].position.z); @@ -283,7 +279,7 @@ void Skeleton::Draw(int muscleview) if(muscleview!=2){ glPointSize(3); glBegin(GL_POINTS); - for(int i=0; i<num_joints; i++){ + for(int i=0; i<max_joints; i++){ if(i!=selected)glColor4f(0,0,.5,1); if(i==selected)glColor4f(1,1,0,1); if(joints[i].locked&&i!=selected)glColor4f(1,0,0,1); @@ -294,42 +290,24 @@ void Skeleton::Draw(int muscleview) //Set old position to current position if(muscleview==2) - for(int i=0; i<num_joints; i++){ + for(int i=0; i<max_joints; i++){ joints[i].oldposition=joints[i].position; } glDepthMask(1); } -void Skeleton::AddJoint(float x, float y, float z, int which) -{ - if(num_joints<max_joints-1){ - joints[num_joints].velocity=0; - joints[num_joints].position.x=x; - joints[num_joints].position.y=y; - joints[num_joints].position.z=z; - joints[num_joints].locked=0; - - if(which>=num_joints||which<0)joints[num_joints].hasparent=0; - if(which<num_joints&&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<num_joints&&whichjoint>=0){ + if (whichjoint < max_joints && whichjoint >= 0) { for(int i=0;i<num_muscles;i++){ while(muscles[i].parent1==&joints[whichjoint]&&i<num_muscles)DeleteMuscle(i); while(muscles[i].parent2==&joints[whichjoint]&&i<num_muscles)DeleteMuscle(i); } - for(int i=0;i<num_joints;i++){ - if(joints[i].parent==&joints[whichjoint])joints[i].hasparent=0; - } - joints[whichjoint].hasparent=0; + + for (auto& joint : joints) + if (joint.parent == &joints[whichjoint]) + joint.hasparent = 0; + joints[whichjoint].hasparent = 0; } } @@ -350,48 +328,6 @@ void Skeleton::DeleteMuscle(int whichmuscle) } } -void Skeleton::SetJoint(float x, float y, float z, int which, int whichjoint) -{ - if(whichjoint<num_joints){ - joints[whichjoint].velocity=0; - joints[whichjoint].position.x=x; - joints[whichjoint].position.y=y; - joints[whichjoint].position.z=z; - - if(which>=num_joints||which<0)joints[whichjoint].hasparent=0; - if(which<num_joints&&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 < max_muscles - 1 && attach1 != attach2 - && attach1 < num_joints && attach1 >= 0 - && attach2 < num_joints && attach2 >= 0) { - 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;i<num_muscles;i++){ - muscles[i].length=findDistance(muscles[i].parent1->position,muscles[i].parent2->position); - } -} - void Skeleton::FindRotationJoint(int which) { XYZ temppoint1,temppoint2,tempforward; @@ -446,13 +382,12 @@ void Skeleton::FindRotationMuscle(int which) tempforward.y=0; Normalise(&tempforward); muscles[which].rotate3=acos(0-tempforward.z)*rad2deg; - for(int i=0;i<num_joints;i++){ - if(&joints[i]==muscles[which].parent1){ - joints[i].rotate1=muscles[which].rotate1; - joints[i].rotate2=muscles[which].rotate2; - joints[i].rotate3=muscles[which].rotate3; + for (auto& joint : joints) + if (&joint == muscles[which].parent1) { + joint.rotate1=muscles[which].rotate1; + joint.rotate2=muscles[which].rotate2; + joint.rotate3=muscles[which].rotate3; } - } if(0>tempforward.x)muscles[which].rotate3=360-muscles[which].rotate3; } @@ -473,9 +408,8 @@ void Animation::load(const char* name) free(data.ptr); for(int j=0;j<numframes;j++){ - for(int i=0;i<testskeleton.num_joints;i++){ - testskeleton.joints[i].position=position[i][j]; - } + for (int i = 0; i < max_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); @@ -505,21 +439,24 @@ void Animation::load(const char* name) 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) - { + for (int i = 0; i < max_joints; ++i) + if (testskeleton.joints[i].hasparent + && testskeleton.joints[i].visible) { testskeleton.FindRotationJoint(i); + 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 i=0;i<testskeleton.num_muscles;i++){ - if(testskeleton.muscles[i].visible) - { + + for (int i = 0; i < max_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; @@ -530,28 +467,12 @@ void Animation::load(const char* name) 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) - { + for (int i = 0; i < max_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; @@ -566,10 +487,9 @@ void Animation::load(const char* name) 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) - { + + for (int i = 0; i < max_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; @@ -584,17 +504,15 @@ void Animation::load(const char* name) 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 Skeleton::reload() { broken = 0; - num_joints = 20; - JointData joints_data[num_joints]; + JointData joints_data[max_joints]; loadJoints(joints_data); - for (int i = 0; i < num_joints; ++i) { + for (int i = 0; i < max_joints; ++i) { joints[i].label = joints_data[i].label; joints[i].position.x = joints_data[i].x; joints[i].position.y = joints_data[i].y; |