aboutsummaryrefslogtreecommitdiff
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;