summary refs log tree commit diff
path: root/src/Skeleton.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Skeleton.cpp')
-rw-r--r--src/Skeleton.cpp182
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;