+
+
+
+#if 0
+
+// the following functions are not used anywhere
+
+/* EFFECT
+ * sets forward, lowforward, specialforward[]
+ *
+ * USES:
+ * NONE
+ */
+void Skeleton::FindForwardsfirst()
+{
+ //Find forward vectors
+ CrossProduct(joints[forwardjoints[1]].position - joints[forwardjoints[0]].position, joints[forwardjoints[2]].position - joints[forwardjoints[0]].position, &forward);
+ Normalise(&forward);
+
+ CrossProduct(joints[lowforwardjoints[1]].position - joints[lowforwardjoints[0]].position, joints[lowforwardjoints[2]].position - joints[lowforwardjoints[0]].position, &lowforward);
+ Normalise(&lowforward);
+
+ //Special forwards
+ specialforward[0] = forward;
+ specialforward[1] = forward;
+ specialforward[2] = forward;
+ specialforward[3] = forward;
+ specialforward[4] = forward;
+
+}
+
+/* EFFECT
+ *
+ * USES:
+ * NONE
+ */
+void Skeleton::Draw(int muscleview)
+{
+ static float jointcolor[4];
+
+ if (muscleview != 2) {
+ jointcolor[0] = 0;
+ jointcolor[1] = 0;
+ jointcolor[2] = .5;
+ jointcolor[3] = 1;
+ }
+
+ if (muscleview == 2) {
+ jointcolor[0] = 0;
+ jointcolor[1] = 0;
+ jointcolor[2] = 0;
+ jointcolor[3] = .5;
+ }
+ //Calc motionblur-ness
+ for (int i = 0; i < num_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;
+ }
+
+ //Do Motionblur
+ glDepthMask(0);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glBegin(GL_QUADS);
+ for (int i = 0; i < num_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);
+ glColor4f(jointcolor[0], jointcolor[1], jointcolor[2], jointcolor[3] / joints[i].parent->blurred);
+ glVertex3f(joints[i].parent->position.x, joints[i].parent->position.y, joints[i].parent->position.z);
+ glColor4f(jointcolor[0], jointcolor[1], jointcolor[2], jointcolor[3] / joints[i].parent->blurred);
+ glVertex3f(joints[i].parent->oldposition.x, joints[i].parent->oldposition.y, joints[i].parent->oldposition.z);
+ glColor4f(jointcolor[0], jointcolor[1], jointcolor[2], jointcolor[3] / joints[i].blurred);
+ glVertex3f(joints[i].oldposition.x, joints[i].oldposition.y, joints[i].oldposition.z);
+ }
+ }
+ for (int i = 0; i < num_muscles; i++) {
+ if (muscles[i].type == boneconnect) {
+ glColor4f(jointcolor[0], jointcolor[1], jointcolor[2], jointcolor[3] / muscles[i].parent2->blurred);
+ glVertex3f(muscles[i].parent1->position.x, muscles[i].parent1->position.y, muscles[i].parent1->position.z);
+ glColor4f(jointcolor[0], jointcolor[1], jointcolor[2], jointcolor[3] / muscles[i].parent2->blurred);
+ glVertex3f(muscles[i].parent2->position.x, muscles[i].parent2->position.y, muscles[i].parent2->position.z);
+ glColor4f(jointcolor[0], jointcolor[1], jointcolor[2], jointcolor[3] / muscles[i].parent2->blurred);
+ glVertex3f(muscles[i].parent2->oldposition.x, muscles[i].parent2->oldposition.y, muscles[i].parent2->oldposition.z);
+ glColor4f(jointcolor[0], jointcolor[1], jointcolor[2], jointcolor[3] / muscles[i].parent1->blurred);
+ glVertex3f(muscles[i].parent1->oldposition.x, muscles[i].parent1->oldposition.y, muscles[i].parent1->oldposition.z);
+ }
+ }
+ glEnd();
+
+ glBegin(GL_LINES);
+ for (int i = 0; i < num_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);
+ glColor4f(jointcolor[0], jointcolor[1], jointcolor[2], jointcolor[3] / joints[i].parent->blurred);
+ glVertex3f(joints[i].parent->position.x, joints[i].parent->position.y, joints[i].parent->position.z);
+ }
+ }
+ /*for(int i=0; i<num_joints; i++){
+ if(joints[i].hasparent){
+ glColor4f(jointcolor[0],jointcolor[1],jointcolor[2],1);
+ glVertex3f(joints[i].position.x,joints[i].position.y,joints[i].position.z);
+ glColor4f(jointcolor[0],jointcolor[1],jointcolor[2],1);
+ glVertex3f(joints[i].position.x+forward.x,joints[i].position.y+forward.y,joints[i].position.z+forward.z);
+ }
+ }*/
+ for (int i = 0; i < num_muscles; i++) {
+ if (muscles[i].type == boneconnect) {
+ glColor4f(jointcolor[0], jointcolor[1], jointcolor[2], jointcolor[3] / muscles[i].parent1->blurred);
+ glVertex3f(muscles[i].parent1->position.x, muscles[i].parent1->position.y, muscles[i].parent1->position.z);
+ glColor4f(jointcolor[0], jointcolor[1], jointcolor[2], jointcolor[3] / muscles[i].parent2->blurred);
+ glVertex3f(muscles[i].parent2->position.x, muscles[i].parent2->position.y, muscles[i].parent2->position.z);
+ }
+ }
+ glColor3f(.6, .6, 0);
+ if (muscleview == 1)
+ for (int i = 0; i < num_muscles; i++) {
+ if (muscles[i].type != boneconnect) {
+ glVertex3f(muscles[i].parent1->position.x, muscles[i].parent1->position.y, muscles[i].parent1->position.z);
+ glVertex3f(muscles[i].parent2->position.x, muscles[i].parent2->position.y, muscles[i].parent2->position.z);
+ }
+ }
+ glEnd();
+
+ if (muscleview != 2) {
+ glPointSize(3);
+ glBegin(GL_POINTS);
+ for (int i = 0; i < num_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);
+ glVertex3f(joints[i].position.x, joints[i].position.y, joints[i].position.z);
+ }
+ glEnd();
+ }
+
+ //Set old position to current position
+ if (muscleview == 2)
+ for (int i = 0; i < num_joints; i++) {
+ joints[i].oldposition = joints[i].position;
+ }
+ glDepthMask(1);
+}
+
+/* EFFECT
+ *
+ * USES:
+ * NONE
+ */
+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].mass = 1;
+ 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++;
+ if (which < num_joints && which >= 0)
+ AddMuscle(num_joints - 1, which, 0, 10, boneconnect);
+ }
+}
+
+/* EFFECT
+ *
+ * USES:
+ * NONE
+ */
+void Skeleton::DeleteJoint(int whichjoint)
+{
+ if (whichjoint < num_joints && whichjoint >= 0) {
+ joints[whichjoint].velocity = joints[num_joints - 1].velocity;
+ joints[whichjoint].position = joints[num_joints - 1].position;
+ joints[whichjoint].oldposition = joints[num_joints - 1].oldposition;
+ joints[whichjoint].hasparent = joints[num_joints - 1].hasparent;
+ joints[whichjoint].parent = joints[num_joints - 1].parent;
+ joints[whichjoint].length = joints[num_joints - 1].length;
+ joints[whichjoint].locked = joints[num_joints - 1].locked;
+ joints[whichjoint].modelnum = joints[num_joints - 1].modelnum;
+ joints[whichjoint].visible = joints[num_joints - 1].visible;
+
+ 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_muscles; i++) {
+ while (muscles[i].parent1 == &joints[num_joints - 1] && i < num_muscles)muscles[i].parent1 = &joints[whichjoint];
+ while (muscles[i].parent2 == &joints[num_joints - 1] && i < num_muscles)muscles[i].parent2 = &joints[whichjoint];
+ }
+ for (int i = 0; i < num_joints; i++) {
+ if (joints[i].parent == &joints[whichjoint])
+ joints[i].hasparent = 0;
+ }
+ for (int i = 0; i < num_joints; i++) {
+ if (joints[i].parent == &joints[num_joints - 1])
+ joints[i].parent = &joints[whichjoint];
+ }
+
+ num_joints--;
+ }
+}
+
+/* EFFECT
+ *
+ * USES:
+ * Skeleton::DeleteJoint - UNUSED
+ */
+void Skeleton::DeleteMuscle(int whichmuscle)
+{
+ if (whichmuscle < num_muscles) {
+ muscles[whichmuscle].minlength = muscles[num_muscles - 1].minlength;
+ muscles[whichmuscle].maxlength = muscles[num_muscles - 1].maxlength;
+ muscles[whichmuscle].strength = muscles[num_muscles - 1].strength;
+ muscles[whichmuscle].parent1 = muscles[num_muscles - 1].parent1;
+ muscles[whichmuscle].parent2 = muscles[num_muscles - 1].parent2;
+ muscles[whichmuscle].length = muscles[num_muscles - 1].length;
+ muscles[whichmuscle].visible = muscles[num_muscles - 1].visible;
+ muscles[whichmuscle].type = muscles[num_muscles - 1].type;
+ muscles[whichmuscle].targetlength = muscles[num_muscles - 1].targetlength;
+
+ num_muscles--;
+ }
+}
+
+/* EFFECT
+ *
+ * USES:
+ * NONE
+ */
+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);
+ }
+ }
+}
+
+/* EFFECT
+ *
+ * USES:
+ * Skeleton::AddJoint - UNUSED
+ */
+void Skeleton::AddMuscle(int attach1, int attach2, float minlength, float maxlength, int type)
+{
+ const int max_muscles = 100; // FIXME: Probably can be dropped
+ if (num_muscles < max_muscles - 1 && attach1 < num_joints && attach1 >= 0 && attach2 < num_joints && attach2 >= 0 && attach1 != attach2) {
+ 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++;
+ }
+}
+
+/* EFFECT
+ *
+ * USES:
+ * NONE
+ */
+void Skeleton::MusclesSet()
+{
+ for (int i = 0; i < num_muscles; i++) {
+ muscles[i].length = findDistance(&muscles[i].parent1->position, &muscles[i].parent2->position);
+ }
+}
+
+/* EFFECT
+ *
+ * USES:
+ * NONE
+ */
+void Skeleton::DoBalance()
+{
+ /*XYZ newpoint;
+ newpoint=joints[0].position;
+ newpoint.x=(joints[2].position.x+joints[4].position.x)/2;
+ newpoint.z=(joints[2].position.z+joints[4].position.z)/2;
+ joints[0].velocity=joints[0].velocity+(newpoint-joints[0].position);
+ //Move child point to within certain distance of parent point
+ joints[0].position=newpoint;
+
+ MusclesSet();*/
+}
+
+#endif
+