aboutsummaryrefslogtreecommitdiff
path: root/src/Skeleton.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Skeleton.cpp')
-rw-r--r--src/Skeleton.cpp187
1 files changed, 98 insertions, 89 deletions
diff --git a/src/Skeleton.cpp b/src/Skeleton.cpp
index a5516c6..8ac7c4f 100644
--- a/src/Skeleton.cpp
+++ b/src/Skeleton.cpp
@@ -96,106 +96,115 @@ void Skeleton::DoConstraints()
void Skeleton::DoConstraints(Model *collide, XYZ *move, float rotation)
{
- friction=20;
- numrepeats=2;
- groundlevel=0;
-
- move->y+=.35;
-
- for(int j=0; j<numrepeats; j++){
- for(int i=0; i<num_joints; i++){
- if(joints[i].existing||i==jointlabels[lefthand]||i==jointlabels[righthand]){
- //Length constraints
+ friction = 20;
+ move->y += 0.35;
+ groundlevel = 0;
+ numrepeats = 2;
+ for (int j = 0; j < numrepeats; j++) {
+ for (int i = 0; i < num_joints; i++) {
+ if (!joints[i].existing
+ && i != jointlabels[lefthand]
+ && i != jointlabels[righthand])
+ continue;
+
+ // Length constraints
joints[i].DoConstraint();
- //Ground constraint
- offset=0;
- overpoint=joints[i].position;
- overpoint.y+=10;
- underpoint=joints[i].position;
- underpoint.y-=offset;
- whichtri=collide->LineCheck2(overpoint,underpoint,&impact,*move,rotation);
- if(collide->normals[whichtri].y<=.8)whichtri=collide->LineCheck2(joints[i].realoldposition,joints[i].position,&impact,*move,rotation);
- if(joints[i].position.y<=groundlevel+offset||whichtri!=-1){
- if(whichtri==-1||(whichtri!=-1&&collide->normals[whichtri].y>.8)){
- if(whichtri==-1)joints[i].position.y=groundlevel+offset;
- if(whichtri!=-1){
- joints[i].position=impact;
- joints[i].position.y+=offset;
+ // Ground constraint
+ auto& pos = joints[i].position;
+ overpoint = pos;
+ overpoint.y += 10;
+ underpoint = pos;
+ underpoint.y -= offset = 0;
+ whichtri = collide->LineCheck2(overpoint, underpoint,
+ &impact, *move, rotation);
+ if (whichtri == -1
+ || collide->normals[whichtri].y <= 0.8)
+ whichtri = collide->LineCheck2(
+ joints[i].realoldposition, pos,
+ &impact, *move, rotation);
+
+ if (pos.y <= groundlevel + offset || whichtri != -1) {
+ if (whichtri == -1
+ || collide->normals[whichtri].y > 0.8) {
+ if (whichtri == -1) {
+ pos.y = groundlevel + offset;
+ } else {
+ pos = impact;
+ pos.y += offset;
}
- joints[i].velocity.y*=-.3;
- joints[i].velocity.x*=.3;
- joints[i].velocity.z*=.3;
+ joints[i].velocity.y *= -0.3;
+ joints[i].velocity.x *= 0.3;
+ joints[i].velocity.z *= 0.3;
}
- offset=.2;
- if(whichtri!=-1&&collide->normals[whichtri].y<=.8){
- normalrotated=DoRotation(collide->normals[whichtri],0,rotation,0);
- joints[i].position=impact+normalrotated*offset;
- ReflectVector(&joints[i].velocity,&normalrotated);
- joints[i].velocity*=.3;
- }
- if(broken<=1){
- XYZ avgvelocity;
- avgvelocity=0;
- float gLoc[3];
- ALint tempint;
- for(int k=0; k<num_joints; k++){
- avgvelocity+=joints[k].velocity;
- }
- avgvelocity/=num_joints;
- if(joints[i].label==head&&(findLengthfast(joints[i].velocity)>2||findLengthfast(avgvelocity)>2)){
- avgvelocity+=joints[i].velocity;
- gLoc[0]=joints[i].position.x/soundscalefactor;
- gLoc[1]=joints[i].position.y/soundscalefactor;
- gLoc[2]=joints[i].position.z/soundscalefactor;
-#ifdef DEBIAN_NEEDS_TO_UPDATE_THEIR_OPENAL
- alGetSourceiv(gSourceID[headlandsound], AL_SOURCE_STATE, &tempint);
-#else
- alGetSourcei(gSourceID[headlandsound], AL_SOURCE_STATE, &tempint);
-#endif
- if (tempint != AL_PLAYING){
- alSourcef(gSourceID[headlandsound], AL_MIN_GAIN, ALfloat(findLengthfast(avgvelocity)*2/findDistancefast(joints[i].position,camera.position)*soundscalefactor*2));
- alSourcef(gSourceID[headlandsound], AL_MAX_GAIN, ALfloat(findLengthfast(avgvelocity)*2/findDistancefast(joints[i].position,camera.position)*soundscalefactor*2));
- alSourcefv(gSourceID[headlandsound], AL_POSITION, gLoc);
- alSourcePlay(gSourceID[headlandsound]);}
- }
- avgvelocity=0;
- for(int k=0; k<num_joints; k++){
- avgvelocity+=joints[k].velocity;
+
+ offset = 0.2;
+ if (whichtri != -1
+ && collide->normals[whichtri].y <= 0.8) {
+ normalrotated = DoRotation(collide->normals[whichtri], 0, rotation, 0);
+ pos = impact + normalrotated * offset;
+ ReflectVector(&joints[i].velocity, &normalrotated);
+ joints[i].velocity *= 0.3;
}
- avgvelocity/=num_joints;
- if((joints[i].label==abdomen)&&(findLengthfast(joints[i].velocity)>2||findLengthfast(avgvelocity)>2)){
- avgvelocity+=joints[i].velocity;
- gLoc[0]=joints[i].position.x/soundscalefactor;
- gLoc[1]=joints[i].position.y/soundscalefactor;
- gLoc[2]=joints[i].position.z/soundscalefactor;
-#ifdef DEBIAN_NEEDS_TO_UPDATE_THEIR_OPENAL
- alGetSourceiv(gSourceID[bodylandsound], AL_SOURCE_STATE, &tempint);
-#else
- alGetSourcei(gSourceID[bodylandsound], AL_SOURCE_STATE, &tempint);
-#endif
- if (tempint != AL_PLAYING){
- alSourcef(gSourceID[bodylandsound], AL_MIN_GAIN, ALfloat(findLengthfast(joints[i].velocity)*1/findDistancefast(joints[i].position,camera.position)*soundscalefactor*2));
- alSourcef(gSourceID[bodylandsound], AL_MAX_GAIN, ALfloat(findLengthfast(joints[i].velocity)*1/findDistancefast(joints[i].position,camera.position)*soundscalefactor*2));
- alSourcefv(gSourceID[bodylandsound], AL_POSITION, gLoc);
- alSourcePlay(gSourceID[bodylandsound]);}
+
+ if (broken > 1)
+ continue;
+ XYZ avgvelocity {0};
+ for (int k = 0; k < num_joints; k++)
+ avgvelocity += joints[k].velocity;
+ avgvelocity /= num_joints;
+
+ int landsound = -1;
+ switch (joints[i].label) {
+ case head:
+ landsound = headlandsound;
+ break;
+ case abdomen:
+ landsound = bodylandsound;
+ break;
}
+ ALint playing = AL_PLAYING;
+ if (landsound >= 0)
+ alGetSourcei(gSourceID[landsound],
+ AL_SOURCE_STATE, &playing);
+
+ if (playing != AL_PLAYING
+ && (findLengthfast(joints[i].velocity) > 2
+ || findLengthfast(avgvelocity) > 2)) {
+ ALfloat gain =
+ findLengthfast(avgvelocity
+ + joints[i].velocity)
+ / findDistancefast(pos,
+ camera.position)
+ * soundscalefactor * 4;
+ alSourcef(gSourceID[landsound],
+ AL_MIN_GAIN, gain);
+ alSourcef(gSourceID[landsound],
+ AL_MAX_GAIN, gain);
+
+ float gLoc[3] {
+ pos.x / soundscalefactor,
+ pos.y / soundscalefactor,
+ pos.z / soundscalefactor,
+ };
+ alSourcefv(gSourceID[landsound],
+ AL_POSITION, gLoc);
+ alSourcePlay(gSourceID[landsound]);
}
- }}
+ }
}
- if(num_muscles)
- for(int i=0; i<num_muscles; i++){
+
+ for (int i = 0; i < num_muscles; i++)
//Length constraints
muscles[i].DoConstraint(broken);
- }
}
- for(int i=0; i<num_joints; i++){
- joints[i].realoldposition=joints[i].position;
- }
-
- //Add velocity
- for(int i=0; i<num_joints; i++){
- if(joints[i].existing||i==jointlabels[lefthand]||i==jointlabels[righthand])joints[i].position=joints[i].position+joints[i].velocity*multiplier;
+ for (int i = 0; i < num_joints; i++) {
+ joints[i].realoldposition = joints[i].position;
+ //Add velocity
+ if (joints[i].existing
+ || i == jointlabels[lefthand]
+ || i == jointlabels[righthand])
+ joints[i].position += joints[i].velocity * multiplier;
}
}