X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FPerson.cpp;h=a4dcb496e8735e42f50df61eea64954beb9a21df;hb=320a287705c0463c6f8943ad9cf4c407c556f703;hp=9b91325609d083c2b7b777a88815d8a7b50563ec;hpb=2609df0eb8239f33810537d12b9986aa5af00438;p=lugaru.git diff --git a/Source/Person.cpp b/Source/Person.cpp index 9b91325..a4dcb49 100644 --- a/Source/Person.cpp +++ b/Source/Person.cpp @@ -85,6 +85,12 @@ extern bool gamestarted; Person player[maxplayers]; +/* convenience functions + */ +Joint& Person::joint(int bodypart) { return skeleton.joints[skeleton.jointlabels[bodypart]]; } +XYZ& Person::jointPos(int bodypart) { return joint(bodypart).position; } +XYZ& Person::jointVel(int bodypart) { return joint(bodypart).velocity; } + /* EFFECT * * USES: @@ -325,16 +331,16 @@ void Person::DoBlood(float howmuch, int which) bloodvel -= DoRotation(skeleton.forward * 10 * scale, ((float)(Random() % 100)) / 4, ((float)(Random() % 100)) / 4, 0); } if (skeleton.free) - bloodvel += DoRotation(skeleton.joints[skeleton.jointlabels[head]].velocity, ((float)(Random() % 100)) / 4, yaw + ((float)(Random() % 100)) / 4, 0) * scale; + bloodvel += DoRotation(jointVel(head), ((float)(Random() % 100)) / 4, yaw + ((float)(Random() % 100)) / 4, 0) * scale; if (!skeleton.free) bloodvel += DoRotation(velocity, ((float)(Random() % 100)) / 4, ((float)(Random() % 100)) / 4, 0) * scale; if (skeleton.free) { - Sprite::MakeSprite(bloodsprite, skeleton.joints[skeleton.jointlabels[head]].position * scale + coords, bloodvel, 1, 1, 1, .05, 1); - Sprite::MakeSprite(bloodflamesprite, skeleton.joints[skeleton.jointlabels[head]].position * scale + coords, bloodvel, 1, 1, 1, .3, 1); + Sprite::MakeSprite(bloodsprite, jointPos(head) * scale + coords, bloodvel, 1, 1, 1, .05, 1); + Sprite::MakeSprite(bloodflamesprite, jointPos(head) * scale + coords, bloodvel, 1, 1, 1, .3, 1); } if (!skeleton.free) { - Sprite::MakeSprite(bloodsprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position + skeleton.joints[skeleton.jointlabels[neck]].position) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, 1); - Sprite::MakeSprite(bloodflamesprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position + skeleton.joints[skeleton.jointlabels[neck]].position) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .3, 1); + Sprite::MakeSprite(bloodsprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, 1); + Sprite::MakeSprite(bloodflamesprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .3, 1); } } if (Random() % 2 == 0) // 50% chance @@ -344,7 +350,7 @@ void Person::DoBlood(float howmuch, int which) bloodvel = 0; if (skeleton.free) { bloodvel -= DoRotation(skeleton.forward * 10 * scale, ((float)(Random() % 100)) / 4, ((float)(Random() % 100)) / 4, 0); - bloodvel += DoRotation(skeleton.joints[skeleton.jointlabels[head]].velocity, ((float)(Random() % 100)) / 4, yaw + ((float)(Random() % 100)) / 4, 0) * scale; + bloodvel += DoRotation(jointVel(head), ((float)(Random() % 100)) / 4, yaw + ((float)(Random() % 100)) / 4, 0) * scale; } else { bloodvel.z = 10; bloodvel = DoRotation(bloodvel, ((float)(Random() % 100)) / 4, yaw + ((float)(Random() % 100)) / 4, 0) * scale; @@ -352,9 +358,9 @@ void Person::DoBlood(float howmuch, int which) } bloodvel *= .2; if (skeleton.free) { - Sprite::MakeSprite(splintersprite, skeleton.joints[skeleton.jointlabels[head]].position * scale + coords, bloodvel, 1, 1, 1, .05, 1); + Sprite::MakeSprite(splintersprite, jointPos(head) * scale + coords, bloodvel, 1, 1, 1, .05, 1); } else { - Sprite::MakeSprite(splintersprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position + skeleton.joints[skeleton.jointlabels[neck]].position) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, 1); + Sprite::MakeSprite(splintersprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, 1); } Sprite::setLastSpriteSpecial(3); // sets it to teeth } @@ -456,16 +462,16 @@ void Person::DoBloodBig(float howmuch, int which) bloodvel -= DoRotation(skeleton.forward * 10 * scale, ((float)(Random() % 100)) / 4, ((float)(Random() % 100)) / 4, 0); } if (skeleton.free) - bloodvel += DoRotation(skeleton.joints[skeleton.jointlabels[head]].velocity, ((float)(Random() % 100)) / 4, yaw + ((float)(Random() % 100)) / 4, 0) * scale; + bloodvel += DoRotation(jointVel(head), ((float)(Random() % 100)) / 4, yaw + ((float)(Random() % 100)) / 4, 0) * scale; if (!skeleton.free) bloodvel += DoRotation(velocity, ((float)(Random() % 100)) / 4, ((float)(Random() % 100)) / 4, 0) * scale; if (skeleton.free) { - Sprite::MakeSprite(bloodsprite, skeleton.joints[skeleton.jointlabels[head]].position * scale + coords, bloodvel, 1, 1, 1, .05, 1); - Sprite::MakeSprite(bloodflamesprite, skeleton.joints[skeleton.jointlabels[head]].position * scale + coords, bloodvel, 1, 1, 1, .3, 1); + Sprite::MakeSprite(bloodsprite, jointPos(head) * scale + coords, bloodvel, 1, 1, 1, .05, 1); + Sprite::MakeSprite(bloodflamesprite, jointPos(head) * scale + coords, bloodvel, 1, 1, 1, .3, 1); } if (!skeleton.free) { - Sprite::MakeSprite(bloodsprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position + skeleton.joints[skeleton.jointlabels[neck]].position) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, 1); - Sprite::MakeSprite(bloodflamesprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position + skeleton.joints[skeleton.jointlabels[neck]].position) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .3, 1); + Sprite::MakeSprite(bloodsprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, 1); + Sprite::MakeSprite(bloodflamesprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .3, 1); } } } @@ -704,16 +710,16 @@ bool Person::DoBloodBigWhere(float howmuch, int which, XYZ where) bloodvel -= DoRotation(skeleton.forward * 10 * scale, ((float)(Random() % 100)) / 4, ((float)(Random() % 100)) / 4, 0); } if (skeleton.free) - bloodvel += DoRotation(skeleton.joints[skeleton.jointlabels[head]].velocity, ((float)(Random() % 100)) / 4, yaw + ((float)(Random() % 100)) / 4, 0) * scale; + bloodvel += DoRotation(jointVel(head), ((float)(Random() % 100)) / 4, yaw + ((float)(Random() % 100)) / 4, 0) * scale; if (!skeleton.free) bloodvel += DoRotation(velocity, ((float)(Random() % 100)) / 4, ((float)(Random() % 100)) / 4, 0) * scale; if (skeleton.free) { - Sprite::MakeSprite(bloodsprite, skeleton.joints[skeleton.jointlabels[head]].position * scale + coords, bloodvel, 1, 1, 1, .05, 1); - Sprite::MakeSprite(bloodflamesprite, skeleton.joints[skeleton.jointlabels[head]].position * scale + coords, bloodvel, 1, 1, 1, .3, 1); + Sprite::MakeSprite(bloodsprite, jointPos(head) * scale + coords, bloodvel, 1, 1, 1, .05, 1); + Sprite::MakeSprite(bloodflamesprite, jointPos(head) * scale + coords, bloodvel, 1, 1, 1, .3, 1); } if (!skeleton.free) { - Sprite::MakeSprite(bloodsprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position + skeleton.joints[skeleton.jointlabels[neck]].position) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, 1); - Sprite::MakeSprite(bloodflamesprite, DoRotation((skeleton.joints[skeleton.jointlabels[head]].position + skeleton.joints[skeleton.jointlabels[neck]].position) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .3, 1); + Sprite::MakeSprite(bloodsprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, 1); + Sprite::MakeSprite(bloodflamesprite, DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .3, 1); } } } @@ -1386,8 +1392,8 @@ void Person::DoHead() headpitch += multiplier * lookspeed / 2; } - rotatearound = skeleton.joints[skeleton.jointlabels[neck]].position; - skeleton.joints[skeleton.jointlabels[head]].position = rotatearound + DoRotation(skeleton.joints[skeleton.jointlabels[head]].position - rotatearound, headpitch, 0, 0); + rotatearound = jointPos(neck); + jointPos(head) = rotatearound + DoRotation(jointPos(head) - rotatearound, headpitch, 0, 0); facing = 0; facing.z = -1; @@ -1551,9 +1557,9 @@ void Person::RagDoll(bool checkcollision) if (weaponactive != -1 && animTarget != rabbitkickanim && num_weapons > 0) { weapons[weaponids[0]].owner = -1; weapons[weaponids[0]].hitsomething = 0; - weapons[weaponids[0]].velocity = skeleton.joints[skeleton.jointlabels[righthand]].velocity * scale * -.3; + weapons[weaponids[0]].velocity = jointVel(righthand) * scale * -.3; weapons[weaponids[0]].velocity.x += .01; - weapons[weaponids[0]].tipvelocity = skeleton.joints[skeleton.jointlabels[righthand]].velocity * scale; + weapons[weaponids[0]].tipvelocity = jointVel(righthand) * scale; weapons[weaponids[0]].missed = 1; weapons[weaponids[0]].freetime = 0; weapons[weaponids[0]].firstfree = 1; @@ -1590,9 +1596,9 @@ void Person::FootLand(int which, float opacity) if (opacity > 1) { footvel = 0; if (which == 0) - footpoint = DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position, 0, yaw, 0) * scale + coords; + footpoint = DoRotation(jointPos(leftfoot), 0, yaw, 0) * scale + coords; if (which == 1) - footpoint = DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position, 0, yaw, 0) * scale + coords; + footpoint = DoRotation(jointPos(rightfoot), 0, yaw, 0) * scale + coords; //footpoint.y=coords.y; if (distsq(&footpoint, &viewer)) Sprite::MakeSprite(cloudsprite, footpoint, footvel, 1, 1, 1, .5, .2 * opacity); @@ -1601,9 +1607,9 @@ void Person::FootLand(int which, float opacity) if (footvel.y < .8) footvel.y = .8; if (which == 0) - footpoint = DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position, 0, yaw, 0) * scale + coords; + footpoint = DoRotation(jointPos(leftfoot), 0, yaw, 0) * scale + coords; if (which == 1) - footpoint = DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position, 0, yaw, 0) * scale + coords; + footpoint = DoRotation(jointPos(rightfoot), 0, yaw, 0) * scale + coords; footpoint.y = terrain.getHeight(footpoint.x, footpoint.z); terrainlight = terrain.getLighting(footpoint.x, footpoint.z); if (distsq(&footpoint, &viewer) < viewdistance * viewdistance / 4) @@ -1617,9 +1623,9 @@ void Person::FootLand(int which, float opacity) if (footvel.y < .8) footvel.y = .8; if (which == 0) - footpoint = DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position, 0, yaw, 0) * scale + coords; + footpoint = DoRotation(jointPos(leftfoot), 0, yaw, 0) * scale + coords; if (which == 1) - footpoint = DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position, 0, yaw, 0) * scale + coords; + footpoint = DoRotation(jointPos(rightfoot), 0, yaw, 0) * scale + coords; footpoint.y = terrain.getHeight(footpoint.x, footpoint.z); terrainlight = terrain.getLighting(footpoint.x, footpoint.z); if (distsq(&footpoint, &viewer) < viewdistance * viewdistance / 4) @@ -1629,9 +1635,9 @@ void Person::FootLand(int which, float opacity) if (footvel.y < .8) footvel.y = .8; if (which == 0) - footpoint = DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position, 0, yaw, 0) * scale + coords; + footpoint = DoRotation(jointPos(leftfoot), 0, yaw, 0) * scale + coords; if (which == 1) - footpoint = DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position, 0, yaw, 0) * scale + coords; + footpoint = DoRotation(jointPos(rightfoot), 0, yaw, 0) * scale + coords; footpoint.y = terrain.getHeight(footpoint.x, footpoint.z); terrainlight = terrain.getLighting(footpoint.x, footpoint.z); if (distsq(&footpoint, &viewer) < viewdistance * viewdistance / 4) @@ -1645,9 +1651,9 @@ void Person::FootLand(int which, float opacity) if (footvel.y < .8) footvel.y = .8; if (which == 0) - footpoint = DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position, 0, yaw, 0) * scale + coords; + footpoint = DoRotation(jointPos(leftfoot), 0, yaw, 0) * scale + coords; if (which == 1) - footpoint = DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position, 0, yaw, 0) * scale + coords; + footpoint = DoRotation(jointPos(rightfoot), 0, yaw, 0) * scale + coords; //footpoint.y=coords.y; if (distsq(&footpoint, &viewer) < viewdistance * viewdistance / 4) Sprite::MakeSprite(cloudsprite, footpoint, footvel * .6, 1, 1, 1, .5, .2 * opacity); @@ -1662,18 +1668,10 @@ void Person::Puff(int whichlabel) static XYZ footvel, footpoint; footvel = 0; - footpoint = DoRotation(skeleton.joints[skeleton.jointlabels[whichlabel]].position, 0, yaw, 0) * scale + coords; + footpoint = DoRotation(jointPos(whichlabel), 0, yaw, 0) * scale + coords; Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 1, 1, .9, .3); } -/* FUNCTION - * convenience function - */ -Joint& Person::getJointFor(int bodypart) -{ - return skeleton.joints[skeleton.jointlabels[bodypart]]; -} - /* EFFECT * I think I added this in an attempt to clean up code */ @@ -2011,10 +2009,10 @@ void Person::DoAnimations() victim->weaponids[0] = victim->weaponids[victim->num_weapons]; } - victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * 6; - victim->skeleton.joints[victim->skeleton.jointlabels[neck]].velocity += relative * 6; - victim->skeleton.joints[victim->skeleton.jointlabels[rightshoulder]].velocity += relative * 6; - victim->skeleton.joints[victim->skeleton.jointlabels[leftshoulder]].velocity += relative * 6; + victim->jointVel(abdomen) += relative * 6; + victim->jointVel(neck) += relative * 6; + victim->jointVel(rightshoulder) += relative * 6; + victim->jointVel(leftshoulder) += relative * 6; } weapons[i].owner = id; if (num_weapons > 0) { @@ -2154,7 +2152,7 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 40; } - victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 200; + victim->jointVel(head) += relative * damagemult * 200; //FootLand(1,2); victim->Puff(head); victim->DoDamage(damagemult * 100 / victim->protectionhead); @@ -2190,7 +2188,7 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 20; } - victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 100; + victim->jointVel(head) += relative * damagemult * 100; //FootLand(1,2); victim->Puff(head); victim->DoDamage(damagemult * 50 / victim->protectionhead); @@ -2221,7 +2219,7 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 40; } - victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 200; + victim->jointVel(head) += relative * damagemult * 200; //FootLand(1,2); victim->Puff(head); victim->DoDamage(damagemult * 150 / victim->protectionhead); @@ -2257,7 +2255,7 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 40; } - victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 200; + victim->jointVel(head) += relative * damagemult * 200; //FootLand(1,2); victim->Puff(head); victim->DoDamage(damagemult * 150 / victim->protectionhead); @@ -2287,7 +2285,7 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 30; } - victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 100; + victim->jointVel(head) += relative * damagemult * 100; //FootLand(1,2); victim->Puff(head); victim->DoDamage(damagemult * 50 / victim->protectionhead); @@ -2324,7 +2322,7 @@ void Person::DoAnimations() victim->skeleton.joints[i].realoldposition.y += relative.y * .3; } victim->Puff(abdomen); - victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity.y = relative.y * 400; + victim->jointVel(abdomen).y = relative.y * 400; } } @@ -2349,7 +2347,7 @@ void Person::DoAnimations() slomodelay = .2; } victim->DoDamage(damagemult * 500 / victim->protectionhigh); - victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 300; + victim->jointVel(abdomen) += relative * damagemult * 300; } } @@ -2385,7 +2383,7 @@ void Person::DoAnimations() victim->Puff(abdomen); victim->DoDamage(damagemult * 20 / victim->protectionhigh); - victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 200; + victim->jointVel(abdomen) += relative * damagemult * 200; staggerdelay = .5; if (!victim->dead) staggerdelay = 1.2; @@ -2573,7 +2571,7 @@ void Person::DoAnimations() victim->bled = 0; } - victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 20; + victim->jointVel(abdomen) += relative * damagemult * 20; } } } @@ -2604,7 +2602,7 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity = relative * 30; } - victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 150; + victim->jointVel(head) += relative * damagemult * 150; victim->frameTarget = 0; victim->animTarget = staggerbackhardanim; @@ -2651,7 +2649,7 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity = relative * 5; } - victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 400; + victim->jointVel(abdomen) += relative * damagemult * 400; victim->frameTarget = 0; victim->animTarget = staggerbackhardanim; @@ -2703,7 +2701,7 @@ void Person::DoAnimations() escapednum = 0; XYZ aim; weapons[weaponids[0]].owner = -1; - aim = victim->coords + DoRotation(victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position, 0, victim->yaw, 0) * victim->scale + victim->velocity * findDistance(&victim->coords, &coords) / 50 - (coords + DoRotation(skeleton.joints[skeleton.jointlabels[righthand]].position, 0, yaw, 0) * scale); + aim = victim->coords + DoRotation(victim->jointPos(abdomen), 0, victim->yaw, 0) * victim->scale + victim->velocity * findDistance(&victim->coords, &coords) / 50 - (coords + DoRotation(jointPos(righthand), 0, yaw, 0) * scale); Normalise(&aim); /*if(victim->animTarget==jumpupanim||victim->animTarget==jumpdownanim){ aim=DoRotation(aim,(float)abs(Random()%15)-7,(float)abs(Random()%15)-7,0); @@ -2734,7 +2732,7 @@ void Person::DoAnimations() if (tutoriallevel != 1) { emit_sound_at(knifeslicesound, victim->coords); } - //victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200; + //victim->jointVel(abdomen)+=relative*damagemult*200; if (animation[victim->animTarget].attack && (victim->aitype != playercontrolled || victim->animTarget == knifeslashstartanim) && (victim->creature == rabbittype || victim->deathbleeding <= 0)) { if (victim->id != 0 || difficulty == 2) { victim->frameTarget = 0; @@ -2757,10 +2755,10 @@ void Person::DoAnimations() XYZ footvel, footpoint; footvel = 0; if (skeleton.free) { - footpoint = (victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position + victim->skeleton.joints[victim->skeleton.jointlabels[neck]].position) / 2 * victim->scale + victim->coords; + footpoint = (victim->jointPos(abdomen) + victim->jointPos(neck)) / 2 * victim->scale + victim->coords; } if (!skeleton.free) { - footpoint = DoRotation((victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position + victim->skeleton.joints[victim->skeleton.jointlabels[neck]].position) / 2, 0, victim->yaw, 0) * victim->scale + victim->coords; + footpoint = DoRotation((victim->jointPos(abdomen) + victim->jointPos(neck)) / 2, 0, victim->yaw, 0) * victim->scale + victim->coords; } if (tutoriallevel != 1) { if (bloodtoggle) @@ -2791,7 +2789,7 @@ void Person::DoAnimations() victim->deathbleeding = 1; emit_sound_at(swordslicesound, victim->coords); } - //victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*200; + //victim->jointVel(abdomen)+=relative*damagemult*200; if (tutoriallevel != 1) { victim->frameTarget = 0; victim->animTarget = staggerbackhardanim; @@ -2813,10 +2811,10 @@ void Person::DoAnimations() XYZ footvel, footpoint; footvel = 0; if (skeleton.free) { - footpoint = (victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position + victim->skeleton.joints[victim->skeleton.jointlabels[neck]].position) / 2 * victim->scale + victim->coords; + footpoint = (victim->jointPos(abdomen) + victim->jointPos(neck)) / 2 * victim->scale + victim->coords; } if (!skeleton.free) { - footpoint = DoRotation((victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].position + victim->skeleton.joints[victim->skeleton.jointlabels[neck]].position) / 2, 0, victim->yaw, 0) * victim->scale + victim->coords; + footpoint = DoRotation((victim->jointPos(abdomen) + victim->jointPos(neck)) / 2, 0, victim->yaw, 0) * victim->scale + victim->coords; } if (bloodtoggle) Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 0, 0, .9, .3); @@ -2897,8 +2895,8 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 60; } - victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 230; - victim->skeleton.joints[victim->skeleton.jointlabels[neck]].velocity += relative * damagemult * 230; + victim->jointVel(head) += relative * damagemult * 230; + victim->jointVel(neck) += relative * damagemult * 230; //FootLand(1,2); victim->Puff(head); if (tutoriallevel != 1) { @@ -2930,8 +2928,8 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 40; } - victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 220; - victim->skeleton.joints[victim->skeleton.jointlabels[neck]].velocity += relative * damagemult * 220; + victim->jointVel(head) += relative * damagemult * 220; + victim->jointVel(neck) += relative * damagemult * 220; //FootLand(1,2); victim->Puff(head); if (tutoriallevel != 1) { @@ -2979,14 +2977,14 @@ void Person::DoAnimations() victim->skeleton.joints[i].velocity = relative * damagemult * 40; } //FootLand(1,2); - victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 40; + victim->jointVel(abdomen) += relative * damagemult * 40; } if (victim->dead) { for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity = relative * damagemult * abs(Random() % 20); } //FootLand(1,2); - //victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity+=relative*damagemult*20; + //victim->jointVel(abdomen)+=relative*damagemult*20; } victim->Puff(abdomen); if (tutoriallevel != 1) { @@ -3020,7 +3018,7 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 40; } - victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 200; + victim->jointVel(head) += relative * damagemult * 200; if (tutoriallevel != 1) { emit_sound_at(heavyimpactsound, victim->coords, 128.); } @@ -3039,7 +3037,7 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 10; } - victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 200; + victim->jointVel(abdomen) += relative * damagemult * 200; victim->frameTarget = 0; victim->animTarget = staggerbackhighanim; victim->targetyaw = targetyaw + 180; @@ -3098,7 +3096,7 @@ void Person::DoAnimations() if (victim->skeleton.joints[i].label == leftfoot || victim->skeleton.joints[i].label == rightfoot || victim->skeleton.joints[i].label == leftankle || victim->skeleton.joints[i].label == rightankle) victim->skeleton.joints[i].velocity += relative * damagemult * 80; } - victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 200; + victim->jointVel(abdomen) += relative * damagemult * 200; victim->frameTarget = 0; victim->animTarget = staggerbackhighanim; victim->targetyaw = targetyaw + 180; @@ -3141,7 +3139,7 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 40; } - victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 200; + victim->jointVel(abdomen) += relative * damagemult * 200; //FootLand(1,2); victim->Puff(abdomen); victim->DoDamage(damagemult * 150 / victim->protectionhigh); @@ -3187,7 +3185,7 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 30; } - victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 200; + victim->jointVel(abdomen) += relative * damagemult * 200; //FootLand(1,2); victim->Puff(head); victim->DoDamage(damagemult * 70 / victim->protectionhigh); @@ -3218,7 +3216,7 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 30; } - victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 200; + victim->jointVel(abdomen) += relative * damagemult * 200; //FootLand(1,2); victim->Puff(head); victim->DoDamage(damagemult * 70 / victim->protectionhigh); @@ -3236,14 +3234,14 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 70; } - victim->skeleton.joints[victim->skeleton.jointlabels[lefthand]].velocity *= .1; - victim->skeleton.joints[victim->skeleton.jointlabels[leftwrist]].velocity *= .2; - victim->skeleton.joints[victim->skeleton.jointlabels[leftelbow]].velocity *= .5; - victim->skeleton.joints[victim->skeleton.jointlabels[leftshoulder]].velocity *= .7; - victim->skeleton.joints[victim->skeleton.jointlabels[righthand]].velocity *= .1; - victim->skeleton.joints[victim->skeleton.jointlabels[rightwrist]].velocity *= .2; - victim->skeleton.joints[victim->skeleton.jointlabels[rightelbow]].velocity *= .5; - victim->skeleton.joints[victim->skeleton.jointlabels[rightshoulder]].velocity *= .7; + victim->jointVel(lefthand) *= .1; + victim->jointVel(leftwrist) *= .2; + victim->jointVel(leftelbow) *= .5; + victim->jointVel(leftshoulder) *= .7; + victim->jointVel(righthand) *= .1; + victim->jointVel(rightwrist) *= .2; + victim->jointVel(rightelbow) *= .5; + victim->jointVel(rightshoulder) *= .7; victim->Puff(abdomen); victim->DoDamage(damagemult * 90 / victim->protectionhigh); @@ -3288,14 +3286,14 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 70; } - victim->skeleton.joints[victim->skeleton.jointlabels[lefthand]].velocity *= .1 - 1; - victim->skeleton.joints[victim->skeleton.jointlabels[leftwrist]].velocity *= .2 - 1; - victim->skeleton.joints[victim->skeleton.jointlabels[leftelbow]].velocity *= .5 - 1; - victim->skeleton.joints[victim->skeleton.jointlabels[leftshoulder]].velocity *= .7 - 1; - victim->skeleton.joints[victim->skeleton.jointlabels[righthand]].velocity *= .1 - 1; - victim->skeleton.joints[victim->skeleton.jointlabels[rightwrist]].velocity *= .2 - 1; - victim->skeleton.joints[victim->skeleton.jointlabels[rightelbow]].velocity *= .5 - 1; - victim->skeleton.joints[victim->skeleton.jointlabels[rightshoulder]].velocity *= .7 - 1; + victim->jointVel(lefthand) *= .1 - 1; + victim->jointVel(leftwrist) *= .2 - 1; + victim->jointVel(leftelbow) *= .5 - 1; + victim->jointVel(leftshoulder) *= .7 - 1; + victim->jointVel(righthand) *= .1 - 1; + victim->jointVel(rightwrist) *= .2 - 1; + victim->jointVel(rightelbow) *= .5 - 1; + victim->jointVel(rightshoulder) *= .7 - 1; award_bonus(id, swordreversebonus); } @@ -3320,7 +3318,7 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 40; } - victim->skeleton.joints[victim->skeleton.jointlabels[abdomen]].velocity += relative * damagemult * 200; + victim->jointVel(abdomen) += relative * damagemult * 200; //FootLand(1,2); victim->Puff(abdomen); victim->DoDamage(damagemult * 30 / victim->protectionhigh); @@ -3381,7 +3379,7 @@ void Person::DoAnimations() bloodvel.z=20; bloodvel.y=5; bloodvel=DoRotation(bloodvel,((float)(Random()%100))/4,yaw+((float)(Random()%100))/4,0)*scale; - Sprite::MakeSprite(bloodsprite, DoRotation(skeleton.joints[skeleton.jointlabels[neck]].position,0,yaw,0)*scale+coords,bloodvel, 1,1,1, .05, 1); + Sprite::MakeSprite(bloodsprite, DoRotation(jointPos(neck),0,yaw,0)*scale+coords,bloodvel, 1,1,1, .05, 1); */ XYZ footvel, footpoint; footvel = 0; @@ -3552,7 +3550,7 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 20; } - victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 200; + victim->jointVel(head) += relative * damagemult * 200; if (victim->damage < victim->damagetolerance - 100) victim->velocity = relative * 200; victim->DoDamage(damagemult * 100 / victim->protectionhead); @@ -3573,7 +3571,7 @@ void Person::DoAnimations() for (i = 0; i < victim->skeleton.num_joints; i++) { victim->skeleton.joints[i].velocity += relative * damagemult * 20; } - victim->skeleton.joints[victim->skeleton.jointlabels[head]].velocity += relative * damagemult * 200; + victim->jointVel(head) += relative * damagemult * 200; } if (hasvictim && (animTarget == spinkickreversalanim || animTarget == sweepreversalanim || animTarget == rabbitkickreversalanim || animTarget == upunchreversalanim || animTarget == jumpreversalanim || animTarget == swordslashreversalanim || animTarget == knifeslashreversalanim || animTarget == rabbittacklereversal || animTarget == wolftacklereversal || animTarget == staffhitreversalanim || animTarget == staffspinhitreversalanim)) @@ -3870,7 +3868,7 @@ void Person::DoAnimations() animTarget = rollanim; frameTarget = 5; oldcoords = coords; - coords += (DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position, 0, yaw, 0) + DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position, 0, yaw, 0)) / 2 * scale; + coords += (DoRotation(jointPos(leftfoot), 0, yaw, 0) + DoRotation(jointPos(rightfoot), 0, yaw, 0)) / 2 * scale; coords.y = oldcoords.y; } if (animCurrent == knifeslashreversedanim) { @@ -3879,7 +3877,7 @@ void Person::DoAnimations() targetyaw += 90; yaw += 90; oldcoords = coords; - coords += (DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position, 0, yaw, 0) + DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position, 0, yaw, 0)) / 2 * scale; + coords += (DoRotation(jointPos(leftfoot), 0, yaw, 0) + DoRotation(jointPos(rightfoot), 0, yaw, 0)) / 2 * scale; coords.y = oldcoords.y; } } @@ -3893,7 +3891,7 @@ void Person::DoAnimations() if (animCurrent == spinkickanim || animCurrent == getupfrombackanim || animCurrent == getupfromfrontanim || animCurrent == lowkickanim) { animTarget = getIdle(); oldcoords = coords; - coords += (DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position, 0, yaw, 0) + DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position, 0, yaw, 0)) / 2 * scale; + coords += (DoRotation(jointPos(leftfoot), 0, yaw, 0) + DoRotation(jointPos(rightfoot), 0, yaw, 0)) / 2 * scale; coords.y = oldcoords.y; //coords+=DoRotation(animation[animCurrent].offset,0,yaw,0)*scale; targetoffset.y = coords.y; @@ -4287,13 +4285,13 @@ void Person::DoStuff() bloodvel -= DoRotation(skeleton.forward * 10 * scale, ((float)(Random() % 100)) / 40, ((float)(Random() % 100)) / 40, 0); } if (skeleton.free) - bloodvel += DoRotation(skeleton.joints[skeleton.jointlabels[head]].velocity, ((float)(Random() % 100)) / 40, yaw + ((float)(Random() % 100)) / 40, 0) * scale; + bloodvel += DoRotation(jointVel(head), ((float)(Random() % 100)) / 40, yaw + ((float)(Random() % 100)) / 40, 0) * scale; if (!skeleton.free) bloodvel += DoRotation(velocity, ((float)(Random() % 100)) / 40, ((float)(Random() % 100)) / 40, 0) * scale; if (skeleton.free) - Sprite::MakeSprite(bloodsprite, (skeleton.joints[skeleton.jointlabels[neck]].position + (skeleton.joints[skeleton.jointlabels[neck]].position - skeleton.joints[skeleton.jointlabels[head]].position) / 5)*scale + coords, bloodvel, 1, 1, 1, .05, .9); + Sprite::MakeSprite(bloodsprite, (jointPos(neck) + (jointPos(neck) - jointPos(head)) / 5)*scale + coords, bloodvel, 1, 1, 1, .05, .9); if (!skeleton.free) - Sprite::MakeSprite(bloodsprite, DoRotation(skeleton.joints[skeleton.jointlabels[neck]].position + (skeleton.joints[skeleton.jointlabels[neck]].position - skeleton.joints[skeleton.jointlabels[head]].position) / 5, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, .9); + Sprite::MakeSprite(bloodsprite, DoRotation(jointPos(neck) + (jointPos(neck) - jointPos(head)) / 5, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, .9); neckspurtparticledelay = .05; } if (neckspurtdelay < 0) { @@ -4312,13 +4310,13 @@ void Person::DoStuff() if (bloodtoggle) { bloodvel = 0; if (skeleton.free) - bloodvel += DoRotation(skeleton.joints[skeleton.jointlabels[abdomen]].velocity, ((float)(Random() % 100)) / 4, yaw + ((float)(Random() % 100)) / 4, 0) * scale; + bloodvel += DoRotation(jointVel(abdomen), ((float)(Random() % 100)) / 4, yaw + ((float)(Random() % 100)) / 4, 0) * scale; if (!skeleton.free) bloodvel += DoRotation(velocity, ((float)(Random() % 100)) / 4, ((float)(Random() % 100)) / 4, 0) * scale; if (skeleton.free) - Sprite::MakeSprite(bloodsprite, skeleton.joints[skeleton.jointlabels[abdomen]].position * scale + coords, bloodvel, 1, 1, 1, .05, 1); + Sprite::MakeSprite(bloodsprite, jointPos(abdomen) * scale + coords, bloodvel, 1, 1, 1, .05, 1); if (!skeleton.free) - Sprite::MakeSprite(bloodsprite, DoRotation((skeleton.joints[skeleton.jointlabels[abdomen]].position + skeleton.joints[skeleton.jointlabels[abdomen]].position) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, 1); + Sprite::MakeSprite(bloodsprite, DoRotation((jointPos(abdomen) + jointPos(abdomen)) / 2, 0, yaw, 0)*scale + coords, bloodvel, 1, 1, 1, .05, 1); } } bloodloss += deathbleeding * multiplier * 80; @@ -4536,9 +4534,9 @@ void Person::DoStuff() if (skeleton.free) footvel = skeleton.specialforward[0] * -1; if (!skeleton.free) - footpoint = DoRotation((skeleton.joints[skeleton.jointlabels[head]].position + skeleton.joints[skeleton.jointlabels[neck]].position) / 2, 0, yaw, 0) * scale + coords; + footpoint = DoRotation((jointPos(head) + jointPos(neck)) / 2, 0, yaw, 0) * scale + coords; if (skeleton.free) - footpoint = ((skeleton.joints[skeleton.jointlabels[head]].position + skeleton.joints[skeleton.jointlabels[neck]].position) / 2) * scale + coords; + footpoint = ((jointPos(head) + jointPos(neck)) / 2) * scale + coords; if (animTarget == sleepanim) footvel = DoRotation(footvel, 0, 90, 0); Sprite::MakeSprite(breathsprite, footpoint + footvel * .2, footvel * .4, 1, 1, 1, .4, .3); @@ -4904,7 +4902,7 @@ void Person::DoStuff() } average /= multiplier; - //velocity=skeleton.joints[skeleton.jointlabels[groin]].velocity*scale; + //velocity=jointVel(groin)*scale; velocity = 0; for (i = 0; i < skeleton.num_joints; i++) { velocity += skeleton.joints[i].velocity * scale; @@ -4927,7 +4925,7 @@ void Person::DoStuff() } if (dead == 2 && bloodloss < damagetolerance) { XYZ headpoint; - headpoint = (skeleton.joints[skeleton.jointlabels[head]].position + skeleton.joints[skeleton.jointlabels[neck]].position) / 2 * scale + coords; + headpoint = (jointPos(head) + jointPos(neck)) / 2 * scale + coords; DoBlood(1, 255); if (bloodtoggle && !bled) { terrain.MakeDecal(blooddecal, headpoint, .2 * 1.2, .5, 0); @@ -4945,7 +4943,7 @@ void Person::DoStuff() } if (dead == 2 && bloodloss >= damagetolerance) { XYZ headpoint; - headpoint = (skeleton.joints[skeleton.jointlabels[abdomen]].position + skeleton.joints[skeleton.jointlabels[neck]].position) / 2 * scale + coords; + headpoint = (jointPos(abdomen) + jointPos(neck)) / 2 * scale + coords; if (bleeding <= 0) DoBlood(1, 255); if (bloodtoggle && !bled) { @@ -4988,18 +4986,18 @@ void Person::DoStuff() XYZ middle; middle = 0; - terrainnormal = skeleton.joints[skeleton.jointlabels[groin]].position - skeleton.joints[skeleton.jointlabels[abdomen]].position; - if (skeleton.joints[skeleton.jointlabels[groin]].locked && skeleton.joints[skeleton.jointlabels[abdomen]].locked) { - terrainnormal = skeleton.joints[skeleton.jointlabels[groin]].position - skeleton.joints[skeleton.jointlabels[abdomen]].position; - middle = (skeleton.joints[skeleton.jointlabels[groin]].position + skeleton.joints[skeleton.jointlabels[abdomen]].position) / 2; + terrainnormal = jointPos(groin) - jointPos(abdomen); + if (joint(groin).locked && joint(abdomen).locked) { + terrainnormal = jointPos(groin) - jointPos(abdomen); + middle = (jointPos(groin) + jointPos(abdomen)) / 2; } - if (skeleton.joints[skeleton.jointlabels[abdomen]].locked && skeleton.joints[skeleton.jointlabels[neck]].locked) { - terrainnormal = skeleton.joints[skeleton.jointlabels[abdomen]].position - skeleton.joints[skeleton.jointlabels[neck]].position; - middle = (skeleton.joints[skeleton.jointlabels[neck]].position + skeleton.joints[skeleton.jointlabels[abdomen]].position) / 2; + if (joint(abdomen).locked && joint(neck).locked) { + terrainnormal = jointPos(abdomen) - jointPos(neck); + middle = (jointPos(neck) + jointPos(abdomen)) / 2; } - if (skeleton.joints[skeleton.jointlabels[groin]].locked && skeleton.joints[skeleton.jointlabels[neck]].locked) { - terrainnormal = skeleton.joints[skeleton.jointlabels[groin]].position - skeleton.joints[skeleton.jointlabels[neck]].position; - middle = (skeleton.joints[skeleton.jointlabels[groin]].position + skeleton.joints[skeleton.jointlabels[neck]].position) / 2; + if (joint(groin).locked && joint(neck).locked) { + terrainnormal = jointPos(groin) - jointPos(neck); + middle = (jointPos(groin) + jointPos(neck)) / 2; } Normalise(&terrainnormal); @@ -5041,18 +5039,18 @@ void Person::DoStuff() XYZ middle; middle = 0; - terrainnormal = skeleton.joints[skeleton.jointlabels[groin]].position - skeleton.joints[skeleton.jointlabels[abdomen]].position; - if (skeleton.joints[skeleton.jointlabels[groin]].locked && skeleton.joints[skeleton.jointlabels[abdomen]].locked) { - terrainnormal = skeleton.joints[skeleton.jointlabels[groin]].position - skeleton.joints[skeleton.jointlabels[abdomen]].position; - middle = (skeleton.joints[skeleton.jointlabels[groin]].position + skeleton.joints[skeleton.jointlabels[abdomen]].position) / 2; + terrainnormal = jointPos(groin) - jointPos(abdomen); + if (joint(groin).locked && joint(abdomen).locked) { + terrainnormal = jointPos(groin) - jointPos(abdomen); + middle = (jointPos(groin) + jointPos(abdomen)) / 2; } - if (skeleton.joints[skeleton.jointlabels[abdomen]].locked && skeleton.joints[skeleton.jointlabels[neck]].locked) { - terrainnormal = skeleton.joints[skeleton.jointlabels[abdomen]].position - skeleton.joints[skeleton.jointlabels[neck]].position; - middle = (skeleton.joints[skeleton.jointlabels[neck]].position + skeleton.joints[skeleton.jointlabels[abdomen]].position) / 2; + if (joint(abdomen).locked && joint(neck).locked) { + terrainnormal = jointPos(abdomen) - jointPos(neck); + middle = (jointPos(neck) + jointPos(abdomen)) / 2; } - if (skeleton.joints[skeleton.jointlabels[groin]].locked && skeleton.joints[skeleton.jointlabels[neck]].locked) { - terrainnormal = skeleton.joints[skeleton.jointlabels[groin]].position - skeleton.joints[skeleton.jointlabels[neck]].position; - middle = (skeleton.joints[skeleton.jointlabels[groin]].position + skeleton.joints[skeleton.jointlabels[neck]].position) / 2; + if (joint(groin).locked && joint(neck).locked) { + terrainnormal = jointPos(groin) - jointPos(neck); + middle = (jointPos(groin) + jointPos(neck)) / 2; } Normalise(&terrainnormal); @@ -5874,6 +5872,47 @@ void Person::DoStuff() } } + +/* EFFECT + * inverse kinematics helper function + */ +void IKHelper(Person *p, float interp){ + XYZ point, newpoint, change, change2; + float heightleft, heightright; + + // TODO: implement localToWorld and worldToLocal + // but keep in mind it won't be the same math if player is ragdolled or something + // - localToWorldStanding / worldToLocalStanding (or crouching or...?) + // then comb through code for places where to use it + + // point = localToWorld(jointPos(leftfoot)) + point = DoRotation(p->jointPos(leftfoot), 0, p->yaw, 0) * p->scale + p->coords; + // adjust height of foot + heightleft = terrain.getHeight(point.x, point.z) + .04; + point.y = heightleft; + change = p->jointPos(leftankle) - p->jointPos(leftfoot); + change2 = p->jointPos(leftknee) - p->jointPos(leftfoot); + // jointPos(leftfoot) = interpolate(worldToLocal(point), jointPos(leftfoot), interp) + p->jointPos(leftfoot) = DoRotation((point - p->coords) / p->scale, 0, -p->yaw, 0) * interp + p->jointPos(leftfoot) * (1 - interp); + // move ankle along with foot + p->jointPos(leftankle) = p->jointPos(leftfoot) + change; + // average knee pos between old and new pos + p->jointPos(leftknee) = (p->jointPos(leftfoot) + change2) / 2 + (p->jointPos(leftknee)) / 2; + + // do same as above for right leg + point = DoRotation(p->jointPos(rightfoot), 0, p->yaw, 0) * p->scale + p->coords; + heightright = terrain.getHeight(point.x, point.z) + .04; + point.y = heightright; + change = p->jointPos(rightankle) - p->jointPos(rightfoot); + change2 = p->jointPos(rightknee) - p->jointPos(rightfoot); + p->jointPos(rightfoot) = DoRotation((point - p->coords) / p->scale, 0, -p->yaw, 0) * interp + p->jointPos(rightfoot) * (1 - interp); + p->jointPos(rightankle) = p->jointPos(rightfoot) + change; + p->jointPos(rightknee) = (p->jointPos(rightfoot) + change2) / 2 + (p->jointPos(rightknee)) / 2; + + // fix up skeleton now that we've moved body parts? + p->skeleton.DoConstraints(&p->coords, &p->scale); +} + /* EFFECT * MONSTER * TODO: ??? @@ -5938,134 +5977,31 @@ int Person::DrawSkeleton() static int start, endthing; if ((dead != 2 || skeleton.free != 2) && updatedelay <= 0) { if (!isSleeping() && !isSitting()) { - if (onterrain && ((isIdle() || isCrouch() || isLanding() || isLandhard() || animTarget == drawrightanim || animTarget == drawleftanim || animTarget == crouchdrawrightanim) && (wasIdle() || wasCrouch() || wasLanding() || wasLandhard() || animCurrent == drawrightanim || animCurrent == drawleftanim || animCurrent == crouchdrawrightanim)) && !skeleton.free) { - XYZ point, newpoint, change, change2; - point = DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position, 0, yaw, 0) * scale + coords; - heightleft = terrain.getHeight(point.x, point.z) + .04; - point.y = heightleft; - change = skeleton.joints[skeleton.jointlabels[leftankle]].position - skeleton.joints[skeleton.jointlabels[leftfoot]].position; - change2 = skeleton.joints[skeleton.jointlabels[leftknee]].position - skeleton.joints[skeleton.jointlabels[leftfoot]].position; - skeleton.joints[skeleton.jointlabels[leftfoot]].position = DoRotation((point - coords) / scale, 0, -yaw, 0); - skeleton.joints[skeleton.jointlabels[leftankle]].position = skeleton.joints[skeleton.jointlabels[leftfoot]].position + change; - skeleton.joints[skeleton.jointlabels[leftknee]].position = (skeleton.joints[skeleton.jointlabels[leftfoot]].position + change2) / 2 + (skeleton.joints[skeleton.jointlabels[leftknee]].position) / 2; - - point = DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position, 0, yaw, 0) * scale + coords; - heightright = terrain.getHeight(point.x, point.z) + .04; - point.y = heightright; - change = skeleton.joints[skeleton.jointlabels[rightankle]].position - skeleton.joints[skeleton.jointlabels[rightfoot]].position; - change2 = skeleton.joints[skeleton.jointlabels[rightknee]].position - skeleton.joints[skeleton.jointlabels[rightfoot]].position; - skeleton.joints[skeleton.jointlabels[rightfoot]].position = DoRotation((point - coords) / scale, 0, -yaw, 0); - skeleton.joints[skeleton.jointlabels[rightankle]].position = skeleton.joints[skeleton.jointlabels[rightfoot]].position + change; - skeleton.joints[skeleton.jointlabels[rightknee]].position = (skeleton.joints[skeleton.jointlabels[rightfoot]].position + change2) / 2 + (skeleton.joints[skeleton.jointlabels[rightknee]].position) / 2; - skeleton.DoConstraints(&coords, &scale); + // TODO: give these meaningful names + const bool cond1 = (isIdle() || isCrouch() || isLanding() || isLandhard() + || animTarget == drawrightanim || animTarget == drawleftanim || animTarget == crouchdrawrightanim); + const bool cond2 = (wasIdle() || wasCrouch() || wasLanding() || wasLandhard() + || animCurrent == drawrightanim || animCurrent == drawleftanim || animCurrent == crouchdrawrightanim); - if (creature == wolftype) { - point = DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position, 0, yaw, 0) * scale + coords; - heightleft = terrain.getHeight(point.x, point.z) + .04; - point.y = heightleft; - change = skeleton.joints[skeleton.jointlabels[leftankle]].position - skeleton.joints[skeleton.jointlabels[leftfoot]].position; - change2 = skeleton.joints[skeleton.jointlabels[leftknee]].position - skeleton.joints[skeleton.jointlabels[leftfoot]].position; - skeleton.joints[skeleton.jointlabels[leftfoot]].position = DoRotation((point - coords) / scale, 0, -yaw, 0); - skeleton.joints[skeleton.jointlabels[leftankle]].position = skeleton.joints[skeleton.jointlabels[leftfoot]].position + change; - skeleton.joints[skeleton.jointlabels[leftknee]].position = (skeleton.joints[skeleton.jointlabels[leftfoot]].position + change2) / 2 + (skeleton.joints[skeleton.jointlabels[leftknee]].position) / 2; - - point = DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position, 0, yaw, 0) * scale + coords; - heightright = terrain.getHeight(point.x, point.z) + .04; - point.y = heightright; - change = skeleton.joints[skeleton.jointlabels[rightankle]].position - skeleton.joints[skeleton.jointlabels[rightfoot]].position; - change2 = skeleton.joints[skeleton.jointlabels[rightknee]].position - skeleton.joints[skeleton.jointlabels[rightfoot]].position; - skeleton.joints[skeleton.jointlabels[rightfoot]].position = DoRotation((point - coords) / scale, 0, -yaw, 0); - skeleton.joints[skeleton.jointlabels[rightankle]].position = skeleton.joints[skeleton.jointlabels[rightfoot]].position + change; - skeleton.joints[skeleton.jointlabels[rightknee]].position = (skeleton.joints[skeleton.jointlabels[rightfoot]].position + change2) / 2 + (skeleton.joints[skeleton.jointlabels[rightknee]].position) / 2; - skeleton.DoConstraints(&coords, &scale); - } - } - if (onterrain && ((isIdle() || isCrouch() || isLanding() || isLandhard() || animTarget == drawrightanim || animTarget == drawleftanim || animTarget == crouchdrawrightanim) && !(wasIdle() || wasCrouch() || wasLanding() || wasLandhard() || animCurrent == drawrightanim || animCurrent == drawleftanim || animCurrent == crouchdrawrightanim)) && !skeleton.free) { - XYZ point, newpoint, change, change2; - point = DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position, 0, yaw, 0) * scale + coords; - heightleft = terrain.getHeight(point.x, point.z) + .04; - point.y = heightleft; - change = skeleton.joints[skeleton.jointlabels[leftankle]].position - skeleton.joints[skeleton.jointlabels[leftfoot]].position; - change2 = skeleton.joints[skeleton.jointlabels[leftknee]].position - skeleton.joints[skeleton.jointlabels[leftfoot]].position; - skeleton.joints[skeleton.jointlabels[leftfoot]].position = DoRotation((point - coords) / scale, 0, -yaw, 0) * target + skeleton.joints[skeleton.jointlabels[leftfoot]].position * (1 - target); - skeleton.joints[skeleton.jointlabels[leftankle]].position = skeleton.joints[skeleton.jointlabels[leftfoot]].position + change; - skeleton.joints[skeleton.jointlabels[leftknee]].position = (skeleton.joints[skeleton.jointlabels[leftfoot]].position + change2) / 2 + (skeleton.joints[skeleton.jointlabels[leftknee]].position) / 2; - - point = DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position, 0, yaw, 0) * scale + coords; - heightright = terrain.getHeight(point.x, point.z) + .04; - point.y = heightright; - change = skeleton.joints[skeleton.jointlabels[rightankle]].position - skeleton.joints[skeleton.jointlabels[rightfoot]].position; - change2 = skeleton.joints[skeleton.jointlabels[rightknee]].position - skeleton.joints[skeleton.jointlabels[rightfoot]].position; - skeleton.joints[skeleton.jointlabels[rightfoot]].position = DoRotation((point - coords) / scale, 0, -yaw, 0) * target + skeleton.joints[skeleton.jointlabels[rightfoot]].position * (1 - target); - skeleton.joints[skeleton.jointlabels[rightankle]].position = skeleton.joints[skeleton.jointlabels[rightfoot]].position + change; - skeleton.joints[skeleton.jointlabels[rightknee]].position = (skeleton.joints[skeleton.jointlabels[rightfoot]].position + change2) / 2 + (skeleton.joints[skeleton.jointlabels[rightknee]].position) / 2; - skeleton.DoConstraints(&coords, &scale); + if (onterrain && (cond1 && cond2) && !skeleton.free) { + IKHelper(this, 1); + if (creature == wolftype) + IKHelper(this, 1); + } - if (creature == wolftype) { - point = DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position, 0, yaw, 0) * scale + coords; - heightleft = terrain.getHeight(point.x, point.z) + .04; - point.y = heightleft; - change = skeleton.joints[skeleton.jointlabels[leftankle]].position - skeleton.joints[skeleton.jointlabels[leftfoot]].position; - change2 = skeleton.joints[skeleton.jointlabels[leftknee]].position - skeleton.joints[skeleton.jointlabels[leftfoot]].position; - skeleton.joints[skeleton.jointlabels[leftfoot]].position = DoRotation((point - coords) / scale, 0, -yaw, 0) * target + skeleton.joints[skeleton.jointlabels[leftfoot]].position * (1 - target); - skeleton.joints[skeleton.jointlabels[leftankle]].position = skeleton.joints[skeleton.jointlabels[leftfoot]].position + change; - skeleton.joints[skeleton.jointlabels[leftknee]].position = (skeleton.joints[skeleton.jointlabels[leftfoot]].position + change2) / 2 + (skeleton.joints[skeleton.jointlabels[leftknee]].position) / 2; - - point = DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position, 0, yaw, 0) * scale + coords; - heightright = terrain.getHeight(point.x, point.z) + .04; - point.y = heightright; - change = skeleton.joints[skeleton.jointlabels[rightankle]].position - skeleton.joints[skeleton.jointlabels[rightfoot]].position; - change2 = skeleton.joints[skeleton.jointlabels[rightknee]].position - skeleton.joints[skeleton.jointlabels[rightfoot]].position; - skeleton.joints[skeleton.jointlabels[rightfoot]].position = DoRotation((point - coords) / scale, 0, -yaw, 0) * target + skeleton.joints[skeleton.jointlabels[rightfoot]].position * (1 - target); - skeleton.joints[skeleton.jointlabels[rightankle]].position = skeleton.joints[skeleton.jointlabels[rightfoot]].position + change; - skeleton.joints[skeleton.jointlabels[rightknee]].position = (skeleton.joints[skeleton.jointlabels[rightfoot]].position + change2) / 2 + (skeleton.joints[skeleton.jointlabels[rightknee]].position) / 2; - skeleton.DoConstraints(&coords, &scale); - } - } - - if (onterrain && (!(isIdle() || isCrouch() || isLanding() || isLandhard() || animTarget == drawrightanim || animTarget == drawleftanim || animTarget == crouchdrawrightanim) && (wasIdle() || wasCrouch() || wasLanding() || wasLandhard() || animCurrent == drawrightanim || animCurrent == drawleftanim || animCurrent == crouchdrawrightanim)) && !skeleton.free) { - XYZ point, newpoint, change, change2; - point = DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position, 0, yaw, 0) * scale + coords; - heightleft = terrain.getHeight(point.x, point.z) + .04; - point.y = heightleft; - change = skeleton.joints[skeleton.jointlabels[leftankle]].position - skeleton.joints[skeleton.jointlabels[leftfoot]].position; - change2 = skeleton.joints[skeleton.jointlabels[leftknee]].position - skeleton.joints[skeleton.jointlabels[leftfoot]].position; - skeleton.joints[skeleton.jointlabels[leftfoot]].position = DoRotation((point - coords) / scale, 0, -yaw, 0) * (1 - target) + skeleton.joints[skeleton.jointlabels[leftfoot]].position * target; - skeleton.joints[skeleton.jointlabels[leftankle]].position = skeleton.joints[skeleton.jointlabels[leftfoot]].position + change; - skeleton.joints[skeleton.jointlabels[leftknee]].position = (skeleton.joints[skeleton.jointlabels[leftfoot]].position + change2) / 2 + (skeleton.joints[skeleton.jointlabels[leftknee]].position) / 2; - - point = DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position, 0, yaw, 0) * scale + coords; - heightright = terrain.getHeight(point.x, point.z) + .04; - point.y = heightright; - change = skeleton.joints[skeleton.jointlabels[rightankle]].position - skeleton.joints[skeleton.jointlabels[rightfoot]].position; - change2 = skeleton.joints[skeleton.jointlabels[rightknee]].position - skeleton.joints[skeleton.jointlabels[rightfoot]].position; - skeleton.joints[skeleton.jointlabels[rightfoot]].position = DoRotation((point - coords) / scale, 0, -yaw, 0) * (1 - target) + skeleton.joints[skeleton.jointlabels[rightfoot]].position * target; - skeleton.joints[skeleton.jointlabels[rightankle]].position = skeleton.joints[skeleton.jointlabels[rightfoot]].position + change; - skeleton.joints[skeleton.jointlabels[rightknee]].position = (skeleton.joints[skeleton.jointlabels[rightfoot]].position + change2) / 2 + (skeleton.joints[skeleton.jointlabels[rightknee]].position) / 2; - skeleton.DoConstraints(&coords, &scale); + if (onterrain && (cond1 && !cond2) && !skeleton.free) { + IKHelper(this, target); + if (creature == wolftype) + IKHelper(this, target); + } - if (creature == wolftype) { - point = DoRotation(skeleton.joints[skeleton.jointlabels[leftfoot]].position, 0, yaw, 0) * scale + coords; - heightleft = terrain.getHeight(point.x, point.z) + .04; - point.y = heightleft; - change = skeleton.joints[skeleton.jointlabels[leftankle]].position - skeleton.joints[skeleton.jointlabels[leftfoot]].position; - change2 = skeleton.joints[skeleton.jointlabels[leftknee]].position - skeleton.joints[skeleton.jointlabels[leftfoot]].position; - skeleton.joints[skeleton.jointlabels[leftfoot]].position = DoRotation((point - coords) / scale, 0, -yaw, 0) * (1 - target) + skeleton.joints[skeleton.jointlabels[leftfoot]].position * target; - skeleton.joints[skeleton.jointlabels[leftankle]].position = skeleton.joints[skeleton.jointlabels[leftfoot]].position + change; - skeleton.joints[skeleton.jointlabels[leftknee]].position = (skeleton.joints[skeleton.jointlabels[leftfoot]].position + change2) / 2 + (skeleton.joints[skeleton.jointlabels[leftknee]].position) / 2; - - point = DoRotation(skeleton.joints[skeleton.jointlabels[rightfoot]].position, 0, yaw, 0) * scale + coords; - heightright = terrain.getHeight(point.x, point.z) + .04; - point.y = heightright; - change = skeleton.joints[skeleton.jointlabels[rightankle]].position - skeleton.joints[skeleton.jointlabels[rightfoot]].position; - change2 = skeleton.joints[skeleton.jointlabels[rightknee]].position - skeleton.joints[skeleton.jointlabels[rightfoot]].position; - skeleton.joints[skeleton.jointlabels[rightfoot]].position = DoRotation((point - coords) / scale, 0, -yaw, 0) * (1 - target) + skeleton.joints[skeleton.jointlabels[rightfoot]].position * target; - skeleton.joints[skeleton.jointlabels[rightankle]].position = skeleton.joints[skeleton.jointlabels[rightfoot]].position + change; - skeleton.joints[skeleton.jointlabels[rightknee]].position = (skeleton.joints[skeleton.jointlabels[rightfoot]].position + change2) / 2 + (skeleton.joints[skeleton.jointlabels[rightknee]].position) / 2; - skeleton.DoConstraints(&coords, &scale); - } + if (onterrain && (!cond1 && cond2) && !skeleton.free) { + IKHelper(this, 1 - target); + if (creature == wolftype) + IKHelper(this, 1 - target); } } + if (!skeleton.free && (!animation[animTarget].attack && animTarget != getupfrombackanim && ((animTarget != rollanim && !isFlip()) || animation[animTarget].label[frameTarget] == 6) && animTarget != getupfromfrontanim && animTarget != wolfrunninganim && animTarget != rabbitrunninganim && animTarget != backhandspringanim && animTarget != walljumpfrontanim && animTarget != hurtidleanim && !isLandhard() && !isSleeping())) DoHead(); else { @@ -6087,31 +6023,36 @@ int Person::DrawSkeleton() skeleton.drawmodelclothes.vertex[i].y = 999; } for (i = 0; i < skeleton.num_muscles; i++) { + // convenience renames + const int p1 = skeleton.muscles[i].parent1->label; + const int p2 = skeleton.muscles[i].parent2->label; + if ((skeleton.muscles[i].numvertices > 0 && playerdetail) || (skeleton.muscles[i].numverticeslow > 0 && !playerdetail)) { morphness = 0; start = 0; endthing = 0; - if (skeleton.muscles[i].parent1->label == righthand || skeleton.muscles[i].parent2->label == righthand) { + + if (p1 == righthand || p2 == righthand) { morphness = righthandmorphness; start = righthandmorphstart; endthing = righthandmorphend; } - if (skeleton.muscles[i].parent1->label == lefthand || skeleton.muscles[i].parent2->label == lefthand) { + if (p1 == lefthand || p2 == lefthand) { morphness = lefthandmorphness; start = lefthandmorphstart; endthing = lefthandmorphend; } - if (skeleton.muscles[i].parent1->label == head || skeleton.muscles[i].parent2->label == head) { + if (p1 == head || p2 == head) { morphness = headmorphness; start = headmorphstart; endthing = headmorphend; } - if ((skeleton.muscles[i].parent1->label == neck && skeleton.muscles[i].parent2->label == abdomen) || (skeleton.muscles[i].parent2->label == neck && skeleton.muscles[i].parent1->label == abdomen)) { + if ((p1 == neck && p2 == abdomen) || (p2 == neck && p1 == abdomen)) { morphness = chestmorphness; start = chestmorphstart; endthing = chestmorphend; } - if ((skeleton.muscles[i].parent1->label == groin && skeleton.muscles[i].parent2->label == abdomen) || (skeleton.muscles[i].parent2->label == groin && skeleton.muscles[i].parent1->label == abdomen)) { + if ((p1 == groin && p2 == abdomen) || (p2 == groin && p1 == abdomen)) { morphness = tailmorphness; start = tailmorphstart; endthing = tailmorphend; @@ -6119,7 +6060,7 @@ int Person::DrawSkeleton() if (calcrot) skeleton.FindRotationMuscle(i, animTarget); mid = (skeleton.muscles[i].parent1->position + skeleton.muscles[i].parent2->position) / 2; - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix + glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); if (!skeleton.free) @@ -6141,24 +6082,26 @@ int Person::DrawSkeleton() if (playerdetail || skeleton.free == 3) { for (j = 0; j < skeleton.muscles[i].numvertices; j++) { - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix + XYZ &v0 = skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]]; + XYZ &v1 = skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]]; + glMatrixMode(GL_MODELVIEW); glPushMatrix(); - if (skeleton.muscles[i].parent1->label == abdomen || skeleton.muscles[i].parent2->label == abdomen) - glTranslatef((skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].x * (1 - morphness) + skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].x * morphness)*proportionbody.x, - (skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].y * (1 - morphness) + skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].y * morphness)*proportionbody.y, - (skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].z * (1 - morphness) + skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].z * morphness)*proportionbody.z); - if (skeleton.muscles[i].parent1->label == lefthand || skeleton.muscles[i].parent1->label == righthand || skeleton.muscles[i].parent1->label == leftwrist || skeleton.muscles[i].parent1->label == rightwrist || skeleton.muscles[i].parent1->label == leftelbow || skeleton.muscles[i].parent1->label == rightelbow || skeleton.muscles[i].parent2->label == leftelbow || skeleton.muscles[i].parent2->label == rightelbow) - glTranslatef((skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].x * (1 - morphness) + skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].x * morphness)*proportionarms.x, - (skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].y * (1 - morphness) + skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].y * morphness)*proportionarms.y, - (skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].z * (1 - morphness) + skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].z * morphness)*proportionarms.z); - if (skeleton.muscles[i].parent1->label == leftfoot || skeleton.muscles[i].parent1->label == rightfoot || skeleton.muscles[i].parent1->label == leftankle || skeleton.muscles[i].parent1->label == rightankle || skeleton.muscles[i].parent1->label == leftknee || skeleton.muscles[i].parent1->label == rightknee || skeleton.muscles[i].parent2->label == leftknee || skeleton.muscles[i].parent2->label == rightknee) - glTranslatef((skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].x * (1 - morphness) + skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].x * morphness)*proportionlegs.x, - (skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].y * (1 - morphness) + skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].y * morphness)*proportionlegs.y, - (skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].z * (1 - morphness) + skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].z * morphness)*proportionlegs.z); - if (skeleton.muscles[i].parent1->label == head || skeleton.muscles[i].parent2->label == head) - glTranslatef((skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].x * (1 - morphness) + skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].x * morphness)*proportionhead.x, - (skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].y * (1 - morphness) + skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].y * morphness)*proportionhead.y, - (skeleton.model[start].vertex[skeleton.muscles[i].vertices[j]].z * (1 - morphness) + skeleton.model[endthing].vertex[skeleton.muscles[i].vertices[j]].z * morphness)*proportionhead.z); + if (p1 == abdomen || p2 == abdomen) + glTranslatef((v0.x * (1-morphness) + v1.x * morphness) * proportionbody.x, + (v0.y * (1-morphness) + v1.y * morphness) * proportionbody.y, + (v0.z * (1-morphness) + v1.z * morphness) * proportionbody.z); + if (p1 == lefthand || p1 == righthand || p1 == leftwrist || p1 == rightwrist || p1 == leftelbow || p1 == rightelbow || p2 == leftelbow || p2 == rightelbow) + glTranslatef((v0.x * (1-morphness) + v1.x * morphness) * proportionarms.x, + (v0.y * (1-morphness) + v1.y * morphness) * proportionarms.y, + (v0.z * (1-morphness) + v1.z * morphness) * proportionarms.z); + if (p1 == leftfoot || p1 == rightfoot || p1 == leftankle || p1 == rightankle || p1 == leftknee || p1 == rightknee || p2 == leftknee || p2 == rightknee) + glTranslatef((v0.x * (1-morphness) + v1.x * morphness) * proportionlegs.x, + (v0.y * (1-morphness) + v1.y * morphness) * proportionlegs.y, + (v0.z * (1-morphness) + v1.z * morphness) * proportionlegs.z); + if (p1 == head || p2 == head) + glTranslatef((v0.x * (1-morphness) + v1.x * morphness) * proportionhead.x, + (v0.y * (1-morphness) + v1.y * morphness) * proportionhead.y, + (v0.z * (1-morphness) + v1.z * morphness) * proportionhead.z); glGetFloatv(GL_MODELVIEW_MATRIX, M); //if(!isnormal(M[12])||!isnormal(M[13])||!isnormal(M[14]))test=0; //if(!isnormal(scale))test=1; @@ -6171,24 +6114,25 @@ int Person::DrawSkeleton() } if (!playerdetail || skeleton.free == 3) { for (j = 0; j < skeleton.muscles[i].numverticeslow; j++) { - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix + XYZ &v0 = skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]]; + glMatrixMode(GL_MODELVIEW); glPushMatrix(); - if (skeleton.muscles[i].parent1->label == abdomen || skeleton.muscles[i].parent2->label == abdomen) - glTranslatef((skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].x)*proportionbody.x, - (skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].y)*proportionbody.y, - (skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].z)*proportionbody.z); - if (skeleton.muscles[i].parent1->label == lefthand || skeleton.muscles[i].parent1->label == righthand || skeleton.muscles[i].parent1->label == leftwrist || skeleton.muscles[i].parent1->label == rightwrist || skeleton.muscles[i].parent1->label == leftelbow || skeleton.muscles[i].parent1->label == rightelbow || skeleton.muscles[i].parent2->label == leftelbow || skeleton.muscles[i].parent2->label == rightelbow) - glTranslatef((skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].x)*proportionarms.x, - (skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].y)*proportionarms.y, - (skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].z)*proportionarms.z); - if (skeleton.muscles[i].parent1->label == leftfoot || skeleton.muscles[i].parent1->label == rightfoot || skeleton.muscles[i].parent1->label == leftankle || skeleton.muscles[i].parent1->label == rightankle || skeleton.muscles[i].parent1->label == leftknee || skeleton.muscles[i].parent1->label == rightknee || skeleton.muscles[i].parent2->label == leftknee || skeleton.muscles[i].parent2->label == rightknee) - glTranslatef((skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].x)*proportionlegs.x, - (skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].y)*proportionlegs.y, - (skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].z)*proportionlegs.z); - if (skeleton.muscles[i].parent1->label == head || skeleton.muscles[i].parent2->label == head) - glTranslatef((skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].x)*proportionhead.x, - (skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].y)*proportionhead.y, - (skeleton.modellow.vertex[skeleton.muscles[i].verticeslow[j]].z)*proportionhead.z); + if (p1 == abdomen || p2 == abdomen) + glTranslatef(v0.x * proportionbody.x, + v0.y * proportionbody.y, + v0.z * proportionbody.z); + if (p1 == lefthand || p1 == righthand || p1 == leftwrist || p1 == rightwrist || p1 == leftelbow || p1 == rightelbow || p2 == leftelbow || p2 == rightelbow) + glTranslatef(v0.x * proportionarms.x, + v0.y * proportionarms.y, + v0.z * proportionarms.z); + if (p1 == leftfoot || p1 == rightfoot || p1 == leftankle || p1 == rightankle || p1 == leftknee || p1 == rightknee || p2 == leftknee || p2 == rightknee) + glTranslatef(v0.x * proportionlegs.x, + v0.y * proportionlegs.y, + v0.z * proportionlegs.z); + if (p1 == head || p2 == head) + glTranslatef(v0.x * proportionhead.x, + v0.y * proportionhead.y, + v0.z * proportionhead.z); glGetFloatv(GL_MODELVIEW_MATRIX, M); skeleton.drawmodellow.vertex[skeleton.muscles[i].verticeslow[j]].x = M[12] * scale; @@ -6202,7 +6146,7 @@ int Person::DrawSkeleton() if (skeleton.clothes && skeleton.muscles[i].numverticesclothes > 0) { mid = (skeleton.muscles[i].parent1->position + skeleton.muscles[i].parent2->position) / 2; - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix + glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); if (!skeleton.free) @@ -6220,24 +6164,25 @@ int Person::DrawSkeleton() glRotatef(-skeleton.muscles[i].lastrotate3, 0, 1, 0); for (j = 0; j < skeleton.muscles[i].numverticesclothes; j++) { - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix + XYZ &v0 = skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]]; + glMatrixMode(GL_MODELVIEW); glPushMatrix(); - if (skeleton.muscles[i].parent1->label == abdomen || skeleton.muscles[i].parent2->label == abdomen) - glTranslatef((skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].x)*proportionbody.x, - (skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].y)*proportionbody.y, - (skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].z)*proportionbody.z); - if (skeleton.muscles[i].parent1->label == lefthand || skeleton.muscles[i].parent1->label == righthand || skeleton.muscles[i].parent1->label == leftwrist || skeleton.muscles[i].parent1->label == rightwrist || skeleton.muscles[i].parent1->label == leftelbow || skeleton.muscles[i].parent1->label == rightelbow || skeleton.muscles[i].parent2->label == leftelbow || skeleton.muscles[i].parent2->label == rightelbow) - glTranslatef((skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].x)*proportionarms.x, - (skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].y)*proportionarms.y, - (skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].z)*proportionarms.z); - if (skeleton.muscles[i].parent1->label == leftfoot || skeleton.muscles[i].parent1->label == rightfoot || skeleton.muscles[i].parent1->label == leftankle || skeleton.muscles[i].parent1->label == rightankle || skeleton.muscles[i].parent1->label == leftknee || skeleton.muscles[i].parent1->label == rightknee || skeleton.muscles[i].parent2->label == leftknee || skeleton.muscles[i].parent2->label == rightknee) - glTranslatef((skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].x)*proportionlegs.x, - (skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].y)*proportionlegs.y, - (skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].z)*proportionlegs.z); - if (skeleton.muscles[i].parent1->label == head || skeleton.muscles[i].parent2->label == head) - glTranslatef((skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].x)*proportionhead.x, - (skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].y)*proportionhead.y, - (skeleton.modelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].z)*proportionhead.z); + if (p1 == abdomen || p2 == abdomen) + glTranslatef(v0.x * proportionbody.x, + v0.y * proportionbody.y, + v0.z * proportionbody.z); + if (p1 == lefthand || p1 == righthand || p1 == leftwrist || p1 == rightwrist || p1 == leftelbow || p1 == rightelbow || p2 == leftelbow || p2 == rightelbow) + glTranslatef(v0.x * proportionarms.x, + v0.y * proportionarms.y, + v0.z * proportionarms.z); + if (p1 == leftfoot || p1 == rightfoot || p1 == leftankle || p1 == rightankle || p1 == leftknee || p1 == rightknee || p2 == leftknee || p2 == rightknee) + glTranslatef(v0.x * proportionlegs.x, + v0.y * proportionlegs.y, + v0.z * proportionlegs.z); + if (p1 == head || p2 == head) + glTranslatef(v0.x * proportionhead.x, + v0.y * proportionhead.y, + v0.z * proportionhead.z); glGetFloatv(GL_MODELVIEW_MATRIX, M); skeleton.drawmodelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].x = M[12] * scale; skeleton.drawmodelclothes.vertex[skeleton.muscles[i].verticesclothes[j]].y = M[13] * scale; @@ -6278,7 +6223,7 @@ int Person::DrawSkeleton() updatedelaychange *= 8; updatedelay += updatedelaychange; - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix + glMatrixMode(GL_MODELVIEW); glPushMatrix(); if (!skeleton.free) glTranslatef(coords.x, coords.y - .02, coords.z); @@ -6296,19 +6241,23 @@ int Person::DrawSkeleton() glBegin(GL_POINTS); if (playerdetail) for (i = 0; i < skeleton.drawmodel.vertexNum; i++) { - glVertex3f(skeleton.drawmodel.vertex[i].x, skeleton.drawmodel.vertex[i].y, skeleton.drawmodel.vertex[i].z); + XYZ &v0 = skeleton.drawmodel.vertex[i]; + glVertex3f(v0.x, v0.y, v0.z); } glEnd(); glBegin(GL_LINES); if (playerdetail) for (i = 0; i < skeleton.drawmodel.TriangleNum; i++) { - glVertex3f(skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[0]].x, skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[0]].y, skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[0]].z); - glVertex3f(skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[1]].x, skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[1]].y, skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[1]].z); - glVertex3f(skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[1]].x, skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[1]].y, skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[1]].z); - glVertex3f(skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[2]].x, skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[2]].y, skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[2]].z); - glVertex3f(skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[2]].x, skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[2]].y, skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[2]].z); - glVertex3f(skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[0]].x, skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[0]].y, skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[0]].z); + XYZ &v0 = skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[0]]; + XYZ &v1 = skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[1]]; + XYZ &v2 = skeleton.drawmodel.vertex[skeleton.drawmodel.Triangles[i].vertex[2]]; + glVertex3f(v0.x, v0.y, v0.z); + glVertex3f(v1.x, v1.y, v1.z); + glVertex3f(v1.x, v1.y, v1.z); + glVertex3f(v2.x, v2.y, v2.z); + glVertex3f(v2.x, v2.y, v2.z); + glVertex3f(v0.x, v0.y, v0.z); } glEnd(); @@ -6438,7 +6387,7 @@ int Person::DrawSkeleton() } weaponpoint = (skeleton.muscles[weaponattachmuscle].parent1->position + skeleton.muscles[weaponattachmuscle].parent2->position) / 2; if (creature == wolftype) - weaponpoint = (skeleton.joints[skeleton.jointlabels[rightwrist]].position * .7 + skeleton.joints[skeleton.jointlabels[righthand]].position * .3); + weaponpoint = (jointPos(rightwrist) * .7 + jointPos(righthand) * .3); } if (weapons[i].getType() == staff) { for (j = 0; j < skeleton.num_muscles; j++) { @@ -6451,25 +6400,25 @@ int Person::DrawSkeleton() weaponrotatemuscle = j; } } - //weaponpoint=skeleton.joints[skeleton.jointlabels[rightwrist]].position; + //weaponpoint=jointPos(rightwrist); weaponpoint = (skeleton.muscles[weaponattachmuscle].parent1->position + skeleton.muscles[weaponattachmuscle].parent2->position) / 2; - //weaponpoint+=skeleton.specialforward[1]*.1+(skeleton.joints[skeleton.jointlabels[rightwrist]].position-skeleton.joints[skeleton.jointlabels[rightelbow]].position); + //weaponpoint+=skeleton.specialforward[1]*.1+(jointPos(rightwrist)-jointPos(rightelbow)); XYZ tempnormthing, vec1, vec2; - vec1 = (skeleton.joints[skeleton.jointlabels[rightwrist]].position - skeleton.joints[skeleton.jointlabels[rightelbow]].position); - vec2 = (skeleton.joints[skeleton.jointlabels[rightwrist]].position - skeleton.joints[skeleton.jointlabels[rightshoulder]].position); + vec1 = (jointPos(rightwrist) - jointPos(rightelbow)); + vec2 = (jointPos(rightwrist) - jointPos(rightshoulder)); CrossProduct(&vec1, &vec2, &tempnormthing); Normalise(&tempnormthing); if (animTarget != staffhitanim && animCurrent != staffhitanim && animTarget != staffgroundsmashanim && animCurrent != staffgroundsmashanim && animTarget != staffspinhitanim && animCurrent != staffspinhitanim) - weaponpoint += tempnormthing * .1 - skeleton.specialforward[1] * .3 + (skeleton.joints[skeleton.jointlabels[rightwrist]].position - skeleton.joints[skeleton.jointlabels[rightelbow]].position); + weaponpoint += tempnormthing * .1 - skeleton.specialforward[1] * .3 + (jointPos(rightwrist) - jointPos(rightelbow)); } } if (weaponactive != k && weaponstuck != k) { if (weapons[i].getType() == knife) - weaponpoint = skeleton.joints[skeleton.jointlabels[abdomen]].position + (skeleton.joints[skeleton.jointlabels[righthip]].position - skeleton.joints[skeleton.jointlabels[lefthip]].position) * .1 + (skeleton.joints[skeleton.jointlabels[rightshoulder]].position - skeleton.joints[skeleton.jointlabels[leftshoulder]].position) * .35; + weaponpoint = jointPos(abdomen) + (jointPos(righthip) - jointPos(lefthip)) * .1 + (jointPos(rightshoulder) - jointPos(leftshoulder)) * .35; if (weapons[i].getType() == sword) - weaponpoint = skeleton.joints[skeleton.jointlabels[abdomen]].position + (skeleton.joints[skeleton.jointlabels[lefthip]].position - skeleton.joints[skeleton.jointlabels[righthip]].position) * .09 + (skeleton.joints[skeleton.jointlabels[leftshoulder]].position - skeleton.joints[skeleton.jointlabels[rightshoulder]].position) * .33; + weaponpoint = jointPos(abdomen) + (jointPos(lefthip) - jointPos(righthip)) * .09 + (jointPos(leftshoulder) - jointPos(rightshoulder)) * .33; if (weapons[i].getType() == staff) - weaponpoint = skeleton.joints[skeleton.jointlabels[abdomen]].position + (skeleton.joints[skeleton.jointlabels[lefthip]].position - skeleton.joints[skeleton.jointlabels[righthip]].position) * .09 + (skeleton.joints[skeleton.jointlabels[leftshoulder]].position - skeleton.joints[skeleton.jointlabels[rightshoulder]].position) * .33; + weaponpoint = jointPos(abdomen) + (jointPos(lefthip) - jointPos(righthip)) * .09 + (jointPos(leftshoulder) - jointPos(rightshoulder)) * .33; for (j = 0; j < skeleton.num_muscles; j++) { if ((skeleton.muscles[j].parent1->label == abdomen || skeleton.muscles[j].parent2->label == abdomen) && (skeleton.muscles[j].parent1->label == neck || skeleton.muscles[j].parent2->label == neck) && skeleton.muscles[j].numvertices > 0) { weaponrotatemuscle = j; @@ -6478,9 +6427,9 @@ int Person::DrawSkeleton() } if (weaponstuck == k) { if (weaponstuckwhere == 0) - weaponpoint = skeleton.joints[skeleton.jointlabels[abdomen]].position * .5 + skeleton.joints[skeleton.jointlabels[neck]].position * .5 - skeleton.forward * .8; + weaponpoint = jointPos(abdomen) * .5 + jointPos(neck) * .5 - skeleton.forward * .8; else - weaponpoint = skeleton.joints[skeleton.jointlabels[abdomen]].position * .5 + skeleton.joints[skeleton.jointlabels[neck]].position * .5 + skeleton.forward * .8; + weaponpoint = jointPos(abdomen) * .5 + jointPos(neck) * .5 + skeleton.forward * .8; for (j = 0; j < skeleton.num_muscles; j++) { if ((skeleton.muscles[j].parent1->label == abdomen || skeleton.muscles[j].parent2->label == abdomen) && (skeleton.muscles[j].parent1->label == neck || skeleton.muscles[j].parent2->label == neck) && skeleton.muscles[j].numvertices > 0) { weaponrotatemuscle = j; @@ -6515,7 +6464,7 @@ int Person::DrawSkeleton() XYZ temppoint1, temppoint2, tempforward; float distance; - temppoint1 = skeleton.joints[skeleton.jointlabels[righthand]].position; + temppoint1 = jointPos(righthand); temppoint2 = animation[animCurrent].weapontarget[frameCurrent] * (1 - target) + animation[animTarget].weapontarget[frameTarget] * (target); distance = findDistance(&temppoint1, &temppoint2); weapons[i].rotation2 = asin((temppoint1.y - temppoint2.y) / distance); @@ -6534,7 +6483,7 @@ int Person::DrawSkeleton() XYZ temppoint1, temppoint2, tempforward; float distance; - temppoint1 = skeleton.joints[skeleton.jointlabels[righthand]].position; + temppoint1 = jointPos(righthand); temppoint2 = animation[animCurrent].weapontarget[frameCurrent] * (1 - target) + animation[animTarget].weapontarget[frameTarget] * (target); distance = findDistance(&temppoint1, &temppoint2); weapons[i].rotation2 = asin((temppoint1.y - temppoint2.y) / distance); @@ -6578,7 +6527,7 @@ int Person::DrawSkeleton() XYZ temppoint1, temppoint2, tempforward; float distance; - temppoint1 = animation[animCurrent].position[skeleton.jointlabels[righthand]][frameCurrent] * (1 - target) + animation[animTarget].position[skeleton.jointlabels[righthand]][frameTarget] * (target); //skeleton.joints[skeleton.jointlabels[righthand]].position; + temppoint1 = animation[animCurrent].position[skeleton.jointlabels[righthand]][frameCurrent] * (1 - target) + animation[animTarget].position[skeleton.jointlabels[righthand]][frameTarget] * (target); //jointPos(righthand); temppoint2 = animation[animCurrent].weapontarget[frameCurrent] * (1 - target) + animation[animTarget].weapontarget[frameTarget] * (target); distance = findDistance(&temppoint1, &temppoint2); weapons[i].rotation2 = asin((temppoint1.y - temppoint2.y) / distance); @@ -6601,7 +6550,7 @@ int Person::DrawSkeleton() XYZ temppoint1, temppoint2, tempforward; float distance; - temppoint1 = animation[animCurrent].position[skeleton.jointlabels[righthand]][frameCurrent] * (1 - target) + animation[animTarget].position[skeleton.jointlabels[righthand]][frameTarget] * (target); //skeleton.joints[skeleton.jointlabels[righthand]].position; + temppoint1 = animation[animCurrent].position[skeleton.jointlabels[righthand]][frameCurrent] * (1 - target) + animation[animTarget].position[skeleton.jointlabels[righthand]][frameTarget] * (target); //jointPos(righthand); temppoint2 = animation[animCurrent].weapontarget[frameCurrent] * (1 - target) + animation[animTarget].weapontarget[frameTarget] * (target); distance = findDistance(&temppoint1, &temppoint2); weapons[i].rotation2 = asin((temppoint1.y - temppoint2.y) / distance);