X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FSkeleton.cpp;h=5b28f738f4ac8cfcea8429e8fb0d8d5366e27271;hb=0b7253f3d99e4382008aff8b8e221e88ff40d3e9;hp=8b7c18a33f5182ff04beca5c9be9b77d95e198c0;hpb=36cc3af3e5074215817ddee16defde754e2ad67f;p=lugaru.git diff --git a/Source/Skeleton.cpp b/Source/Skeleton.cpp index 8b7c18a..5b28f73 100644 --- a/Source/Skeleton.cpp +++ b/Source/Skeleton.cpp @@ -1,16 +1,36 @@ +/* +Copyright (C) 2003, 2010 - Wolfire Games + +This file is part of Lugaru. + +Lugaru is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + /**> HEADER FILES <**/ +#include "Game.h" #include "Skeleton.h" +#include "openal_wrapper.h" +#include "Animation.h" extern float multiplier; extern float gravity; extern Skeleton testskeleton; extern Terrain terrain; -extern FSOUND_SAMPLE *samp[100]; -extern int channels[100]; extern Objects objects; -extern Sprites sprites; extern int environment; -extern float terraindetail; extern float camerashake; extern bool freeze; extern int detail; @@ -18,23 +38,21 @@ extern XYZ envsound[30]; extern float envsoundvol[30]; extern int numenvsounds; extern float envsoundlife[30]; -extern int bonus; -extern float bonustime; extern int tutoriallevel; extern int whichjointstartarray[26]; extern int whichjointendarray[26]; -#include "Game.h" extern Game * pgame; extern bool visibleloading; -extern "C" void PlaySoundEx(int channel, FSOUND_SAMPLE *sptr, FSOUND_DSPUNIT *dsp, signed char startpaused); void dealloc2(void* param){ free(param); param=0; } +enum {boneconnect, constraint, muscle}; + void Muscle::DoConstraint(bool spinny) { static XYZ vel; @@ -175,14 +193,14 @@ float Skeleton::DoConstraints(XYZ *coords,float *scale) if(free){ freetime+=multiplier; - whichpatchx=coords->x/(terrain.size/subdivision*terrain.scale*terraindetail); - whichpatchz=coords->z/(terrain.size/subdivision*terrain.scale*terraindetail); + whichpatchx=coords->x/(terrain.size/subdivision*terrain.scale); + whichpatchz=coords->z/(terrain.size/subdivision*terrain.scale); terrainlight=*coords; objects.SphereCheckPossible(&terrainlight, 1); /* for(i=0; i=0) - if(objects.possible[k]){ - temp=joints[jointlabels[head]].position*(*scale)+*coords; - if(objects.model[k].SphereCheck(&temp, 0.06, &start, &objects.position[k], &objects.rotation[k])!=-1){ - //temp=(joints[jointlabels[head]].position*(*scale)+*coords)-start; - //Normalise(&temp); - //joints[jointlabels[head]].position=((temp*.2+start)-*coords)/(*scale); - joints[jointlabels[head]].position=(temp-*coords)/(*scale); - } - } - } */ - - - //Ears check - /*XYZ startheadpos; - startheadpos=joints[jointlabels[head]].position; - XYZ headpos; - headpos=joints[jointlabels[head]].position+(joints[jointlabels[head]].position-joints[jointlabels[neck]].position); - if(terrain.patchobjectnum[whichpatchx][whichpatchz]) - for(m=0;m=0) - if(objects.possible[k]){ - friction=objects.friction[k]; - start=joints[jointlabels[head]].position*(*scale)+*coords; - end=(headpos)*(*scale)+*coords; - whichhit=objects.model[k].LineCheckPossible(&start,&end,&temp,&objects.position[k],&objects.rotation[k]); - if(whichhit!=-1){ - if(joints[jointlabels[head]].label==groin&&!joints[jointlabels[head]].locked&&joints[jointlabels[head]].delay<=0){ - joints[jointlabels[head]].locked=1; - joints[jointlabels[head]].delay=1; - static float gLoc[3]; - static float vel[3]; - gLoc[0]=headpos.x*(*scale)+coords->x; - gLoc[1]=headpos.y*(*scale)+coords->y; - gLoc[2]=headpos.z*(*scale)+coords->z; - vel[0]=joints[jointlabels[head]].velocity.x; - vel[1]=joints[jointlabels[head]].velocity.y; - vel[2]=joints[jointlabels[head]].velocity.z; - PlaySoundEx( landsound1, samp[landsound1], NULL, TRUE); - FSOUND_3D_SetAttributes(channels[landsound1], gLoc, vel); - FSOUND_SetVolume(channels[landsound1], 128); - FSOUND_SetPaused(channels[landsound1], FALSE); - - breaking=1; - } - - if(joints[jointlabels[head]].label==head&&!joints[jointlabels[head]].locked&&joints[jointlabels[head]].delay<=0){ - joints[jointlabels[head]].locked=1; - joints[jointlabels[head]].delay=1; - static float gLoc[3]; - static float vel[3]; - gLoc[0]=headpos.x*(*scale)+coords->x; - gLoc[1]=headpos.y*(*scale)+coords->y; - gLoc[2]=headpos.z*(*scale)+coords->z; - vel[0]=joints[jointlabels[head]].velocity.x; - vel[1]=joints[jointlabels[head]].velocity.y; - vel[2]=joints[jointlabels[head]].velocity.z; - PlaySoundEx( landsound2, samp[landsound2], NULL, TRUE); - FSOUND_3D_SetAttributes(channels[landsound2], gLoc, vel); - FSOUND_SetVolume(channels[landsound2], 128); - FSOUND_SetPaused(channels[landsound2], FALSE); - } - - terrainnormal=DoRotation(objects.model[k].facenormals[whichhit],0,objects.rotation[k],0)*-1; - if(terrainnormal.y>.8)freefall=0; - bounceness=terrainnormal*findLength(&joints[jointlabels[head]].velocity)*(abs(normaldotproduct(joints[jointlabels[head]].velocity,terrainnormal))); - if(findLengthfast(&joints[jointlabels[head]].velocity)>findLengthfast(&joints[jointlabels[head]].oldvelocity)){ - bounceness=0; - joints[jointlabels[head]].velocity=joints[jointlabels[head]].oldvelocity; - } - if(findLengthfast(&bounceness)>4000&&breaking){ - objects.model[k].MakeDecal(breakdecal,DoRotation(temp-objects.position[k],0,-objects.rotation[k],0),.4,.5,Random()%360); - sprites.MakeSprite(cloudsprite, headpos*(*scale)+*coords,joints[jointlabels[head]].velocity*.06, 1,1,1, 4, .2); - breaking=0; - camerashake+=.6; - - static float gLoc[3]; - static float vel[3]; - gLoc[0]=headpos.x*(*scale)+coords->x; - gLoc[1]=headpos.y*(*scale)+coords->y; - gLoc[2]=headpos.z*(*scale)+coords->z; - vel[0]=joints[jointlabels[head]].velocity.x; - vel[1]=joints[jointlabels[head]].velocity.y; - vel[2]=joints[jointlabels[head]].velocity.z; - PlaySoundEx( breaksound2, samp[breaksound2], NULL, TRUE); - FSOUND_3D_SetAttributes(channels[breaksound2], gLoc, vel); - FSOUND_SetVolume(channels[breaksound2], 300); - FSOUND_SetPaused(channels[breaksound2], FALSE); - - envsound[numenvsounds]=*coords; - envsoundvol[numenvsounds]=64; - envsoundlife[numenvsounds]=.4; - numenvsounds++; - } - if(objects.type[k]==treetrunktype){ - objects.rotx[k]+=joints[jointlabels[head]].velocity.x*multiplier*.4; - objects.roty[k]+=joints[jointlabels[head]].velocity.z*multiplier*.4; - objects.rotx[k+1]+=joints[jointlabels[head]].velocity.x*multiplier*.4; - objects.roty[k+1]+=joints[jointlabels[head]].velocity.z*multiplier*.4; - } - if(!joints[jointlabels[head]].locked)damage+=findLengthfast(&bounceness)/2500; - ReflectVector(&joints[jointlabels[head]].velocity,&terrainnormal); - frictionness=abs(normaldotproduct(joints[jointlabels[head]].velocity,terrainnormal));//findLength(&bounceness)/findLength(&joints[jointlabels[head]].velocity); - joints[jointlabels[head]].velocity-=bounceness; - if(1-friction*frictionness>0)joints[jointlabels[head]].velocity*=1-friction*frictionness; - else joints[jointlabels[head]].velocity=0; - if(findLengthfast(&bounceness)>2500){ - Normalise(&bounceness); - bounceness=bounceness*50; - } - joints[jointlabels[head]].velocity+=bounceness*elasticity; - - - if(!joints[jointlabels[head]].locked) - if(findLengthfast(&joints[jointlabels[head]].velocity)<1){ - joints[jointlabels[head]].locked=1; - //joints[jointlabels[head]].velocity*=3; - } - if(findLengthfast(&bounceness)>500)sprites.MakeSprite(cloudsprite, headpos*(*scale)+*coords,joints[jointlabels[head]].velocity*.06, 1,1,1, .5, .2); - joints[jointlabels[head]].position=(temp-*coords)/(*scale)+(startheadpos-headpos)+terrainnormal*.005; - if(longdead>100)broken=1; - } - } - } - */ for(i=0; ix; - gLoc[1]=joints[i].position.y*(*scale)+coords->y; - gLoc[2]=joints[i].position.z*(*scale)+coords->z; - vel[0]=joints[i].velocity.x; - vel[1]=joints[i].velocity.y; - vel[2]=joints[i].velocity.z; if(tutoriallevel!=1||id==0){ - PlaySoundEx( landsound1, samp[landsound1], NULL, TRUE); - FSOUND_3D_SetAttributes(channels[landsound1], gLoc, vel); - FSOUND_SetVolume(channels[landsound1], 128); - FSOUND_SetPaused(channels[landsound1], FALSE); + emit_sound_at(landsound1, joints[i].position*(*scale)+*coords, 128.); } breaking=1; } @@ -415,19 +292,8 @@ float Skeleton::DoConstraints(XYZ *coords,float *scale) if(joints[i].label==head&&!joints[i].locked&&joints[i].delay<=0){ joints[i].locked=1; joints[i].delay=1; - static float gLoc[3]; - static float vel[3]; - gLoc[0]=joints[i].position.x*(*scale)+coords->x; - gLoc[1]=joints[i].position.y*(*scale)+coords->y; - gLoc[2]=joints[i].position.z*(*scale)+coords->z; - vel[0]=joints[i].velocity.x; - vel[1]=joints[i].velocity.y; - vel[2]=joints[i].velocity.z; if(tutoriallevel!=1||id==0){ - PlaySoundEx( landsound2, samp[landsound2], NULL, TRUE); - FSOUND_3D_SetAttributes(channels[landsound2], gLoc, vel); - FSOUND_SetVolume(channels[landsound2], 128); - FSOUND_SetPaused(channels[landsound2], FALSE); + emit_sound_at(landsound2, joints[i].position*(*scale)+*coords, 128.); } } @@ -444,23 +310,12 @@ float Skeleton::DoConstraints(XYZ *coords,float *scale) if(tutoriallevel!=1||id==0) if(findLengthfast(&bounceness)>8000&&breaking){ objects.model[k].MakeDecal(breakdecal,DoRotation(temp-objects.position[k],0,-objects.rotation[k],0),.4,.5,Random()%360); - sprites.MakeSprite(cloudsprite, joints[i].position*(*scale)+*coords,joints[i].velocity*.06, 1,1,1, 4, .2); - //sprites.MakeSprite(cloudsprite, joints[i].position*(*scale)+*coords,joints[i].velocity*.06, 1,1,1, 1, .2); + Sprite::MakeSprite(cloudsprite, joints[i].position*(*scale)+*coords,joints[i].velocity*.06, 1,1,1, 4, .2); + //Sprite::MakeSprite(cloudsprite, joints[i].position*(*scale)+*coords,joints[i].velocity*.06, 1,1,1, 1, .2); breaking=0; camerashake+=.6; - static float gLoc[3]; - static float vel[3]; - gLoc[0]=joints[i].position.x*(*scale)+coords->x; - gLoc[1]=joints[i].position.y*(*scale)+coords->y; - gLoc[2]=joints[i].position.z*(*scale)+coords->z; - vel[0]=joints[i].velocity.x; - vel[1]=joints[i].velocity.y; - vel[2]=joints[i].velocity.z; - PlaySoundEx( breaksound2, samp[breaksound2], NULL, TRUE); - FSOUND_3D_SetAttributes(channels[breaksound2], gLoc, vel); - FSOUND_SetVolume(channels[breaksound2], 300); - FSOUND_SetPaused(channels[breaksound2], FALSE); + emit_sound_at(breaksound2, joints[i].position*(*scale)+*coords); envsound[numenvsounds]=*coords; envsoundvol[numenvsounds]=64; @@ -471,7 +326,7 @@ float Skeleton::DoConstraints(XYZ *coords,float *scale) if(findLengthfast(&bounceness)>2500){ Normalise(&bounceness); bounceness=bounceness*50; - } + } joints[i].velocity+=bounceness*elasticity; @@ -486,19 +341,19 @@ float Skeleton::DoConstraints(XYZ *coords,float *scale) if(environment==snowyenvironment&&findLengthfast(&bounceness)>500&&terrain.getOpacity(joints[i].position.x*(*scale)+coords->x,joints[i].position.z*(*scale)+coords->z)<.2){ terrainlight=terrain.getLighting(joints[i].position.x*(*scale)+coords->x,joints[i].position.z*(*scale)+coords->z); - sprites.MakeSprite(cloudsprite, joints[i].position*(*scale)+*coords,joints[i].velocity*.06, terrainlight.x,terrainlight.y,terrainlight.z, .5, .7); + Sprite::MakeSprite(cloudsprite, joints[i].position*(*scale)+*coords,joints[i].velocity*.06, terrainlight.x,terrainlight.y,terrainlight.z, .5, .7); if(detail==2)terrain.MakeDecal(bodyprintdecal, joints[i].position*(*scale)+*coords,.4,.4,0); } else if(environment==desertenvironment&&findLengthfast(&bounceness)>500&&terrain.getOpacity(joints[i].position.x*(*scale)+coords->x,joints[i].position.z*(*scale)+coords->z)<.2){ terrainlight=terrain.getLighting(joints[i].position.x*(*scale)+coords->x,joints[i].position.z*(*scale)+coords->z); - sprites.MakeSprite(cloudsprite, joints[i].position*(*scale)+*coords,joints[i].velocity*.06, terrainlight.x*190/255,terrainlight.y*170/255,terrainlight.z*108/255, .5, .7); + Sprite::MakeSprite(cloudsprite, joints[i].position*(*scale)+*coords,joints[i].velocity*.06, terrainlight.x*190/255,terrainlight.y*170/255,terrainlight.z*108/255, .5, .7); } else if(environment==grassyenvironment&&findLengthfast(&bounceness)>500&&terrain.getOpacity(joints[i].position.x*(*scale)+coords->x,joints[i].position.z*(*scale)+coords->z)<.2){ terrainlight=terrain.getLighting(joints[i].position.x*(*scale)+coords->x,joints[i].position.z*(*scale)+coords->z); - sprites.MakeSprite(cloudsprite, joints[i].position*(*scale)+*coords,joints[i].velocity*.06, terrainlight.x*90/255,terrainlight.y*70/255,terrainlight.z*8/255, .5, .5); + Sprite::MakeSprite(cloudsprite, joints[i].position*(*scale)+*coords,joints[i].velocity*.06, terrainlight.x*90/255,terrainlight.y*70/255,terrainlight.z*8/255, .5, .5); } - else if(findLengthfast(&bounceness)>500)sprites.MakeSprite(cloudsprite, joints[i].position*(*scale)+*coords,joints[i].velocity*.06, terrainlight.x,terrainlight.y,terrainlight.z, .5, .2); + else if(findLengthfast(&bounceness)>500)Sprite::MakeSprite(cloudsprite, joints[i].position*(*scale)+*coords,joints[i].velocity*.06, terrainlight.x,terrainlight.y,terrainlight.z, .5, .2); joints[i].position.y=(terrain.getHeight(joints[i].position.x*(*scale)+coords->x,joints[i].position.z*(*scale)+coords->z)+groundlevel-coords->y)/(*scale); @@ -517,19 +372,8 @@ float Skeleton::DoConstraints(XYZ *coords,float *scale) if(joints[i].label==groin&&!joints[i].locked&&joints[i].delay<=0){ joints[i].locked=1; joints[i].delay=1; - static float gLoc[3]; - static float vel[3]; - gLoc[0]=joints[i].position.x*(*scale)+coords->x; - gLoc[1]=joints[i].position.y*(*scale)+coords->y; - gLoc[2]=joints[i].position.z*(*scale)+coords->z; - vel[0]=joints[i].velocity.x; - vel[1]=joints[i].velocity.y; - vel[2]=joints[i].velocity.z; if(tutoriallevel!=1||id==0){ - PlaySoundEx( landsound1, samp[landsound1], NULL, TRUE); - FSOUND_3D_SetAttributes(channels[landsound1], gLoc, vel); - FSOUND_SetVolume(channels[landsound1], 128); - FSOUND_SetPaused(channels[landsound1], FALSE); + emit_sound_at(landsound1, joints[i].position*(*scale)+*coords, 128.); } breaking=1; } @@ -537,19 +381,8 @@ float Skeleton::DoConstraints(XYZ *coords,float *scale) if(joints[i].label==head&&!joints[i].locked&&joints[i].delay<=0){ joints[i].locked=1; joints[i].delay=1; - static float gLoc[3]; - static float vel[3]; - gLoc[0]=joints[i].position.x*(*scale)+coords->x; - gLoc[1]=joints[i].position.y*(*scale)+coords->y; - gLoc[2]=joints[i].position.z*(*scale)+coords->z; - vel[0]=joints[i].velocity.x; - vel[1]=joints[i].velocity.y; - vel[2]=joints[i].velocity.z; if(tutoriallevel!=1||id==0){ - PlaySoundEx( landsound2, samp[landsound2], NULL, TRUE); - FSOUND_3D_SetAttributes(channels[landsound2], gLoc, vel); - FSOUND_SetVolume(channels[landsound2], 128); - FSOUND_SetPaused(channels[landsound2], FALSE); + emit_sound_at(landsound2, joints[i].position*(*scale)+*coords, 128.); } } @@ -563,22 +396,11 @@ float Skeleton::DoConstraints(XYZ *coords,float *scale) if(tutoriallevel!=1||id==0) if(findLengthfast(&bounceness)>4000&&breaking){ objects.model[k].MakeDecal(breakdecal,DoRotation(temp-objects.position[k],0,-objects.rotation[k],0),.4,.5,Random()%360); - sprites.MakeSprite(cloudsprite, joints[i].position*(*scale)+*coords,joints[i].velocity*.06, 1,1,1, 4, .2); + Sprite::MakeSprite(cloudsprite, joints[i].position*(*scale)+*coords,joints[i].velocity*.06, 1,1,1, 4, .2); breaking=0; camerashake+=.6; - static float gLoc[3]; - static float vel[3]; - gLoc[0]=joints[i].position.x*(*scale)+coords->x; - gLoc[1]=joints[i].position.y*(*scale)+coords->y; - gLoc[2]=joints[i].position.z*(*scale)+coords->z; - vel[0]=joints[i].velocity.x; - vel[1]=joints[i].velocity.y; - vel[2]=joints[i].velocity.z; - PlaySoundEx( breaksound2, samp[breaksound2], NULL, TRUE); - FSOUND_3D_SetAttributes(channels[breaksound2], gLoc, vel); - FSOUND_SetVolume(channels[breaksound2], 300); - FSOUND_SetPaused(channels[breaksound2], FALSE); + emit_sound_at(breaksound2, joints[i].position*(*scale)+*coords); envsound[numenvsounds]=*coords; envsoundvol[numenvsounds]=64; @@ -602,8 +424,8 @@ float Skeleton::DoConstraints(XYZ *coords,float *scale) pos.x+=float(abs(Random()%100)-50)/100*objects.scale[k]*5; pos.y+=float(abs(Random()%100)-50)/100*objects.scale[k]*15; pos.z+=float(abs(Random()%100)-50)/100*objects.scale[k]*5; - sprites.MakeSprite(splintersprite, pos,tempvel*.5, 165/255+float(abs(Random()%100)-50)/400,0,0, .2+float(abs(Random()%100)-50)/1300, 1); - sprites.special[sprites.numsprites-1]=1; + Sprite::MakeSprite(splintersprite, pos,tempvel*.5, 165/255+float(abs(Random()%100)-50)/400,0,0, .2+float(abs(Random()%100)-50)/1300, 1); + Sprite::special[Sprite::numsprites-1]=1; }*/ objects.rotx[k]+=joints[i].velocity.x*multiplier*.4; objects.roty[k]+=joints[i].velocity.z*multiplier*.4; @@ -628,7 +450,7 @@ float Skeleton::DoConstraints(XYZ *coords,float *scale) joints[i].locked=1; //joints[i].velocity*=3; } - if(findLengthfast(&bounceness)>500)sprites.MakeSprite(cloudsprite, joints[i].position*(*scale)+*coords,joints[i].velocity*.06, 1,1,1, .5, .2); + if(findLengthfast(&bounceness)>500)Sprite::MakeSprite(cloudsprite, joints[i].position*(*scale)+*coords,joints[i].velocity*.06, 1,1,1, .5, .2); joints[i].position=(temp-*coords)/(*scale)+terrainnormal*.005; if(longdead>100)broken=1; } @@ -662,9 +484,9 @@ float Skeleton::DoConstraints(XYZ *coords,float *scale) for(i=0; iposition.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){ @@ -885,12 +707,13 @@ void Skeleton::SetJoint(float x, float y, float z, int which, int whichjoint) joints[whichjoint].parent=&joints[which]; joints[whichjoint].hasparent=1; joints[whichjoint].length=findDistance(&joints[whichjoint].position,&joints[whichjoint].parent->position); - } + } } } void Skeleton::AddMuscle(int attach1,int attach2,float minlength,float maxlength,int type) { + const int max_muscles = 100; // FIXME: Probably can be dropped if(num_muscles=0&&attach2=0&&attach1!=attach2){ muscles[num_muscles].parent1=&joints[attach1]; muscles[num_muscles].parent2=&joints[attach2]; @@ -986,16 +809,26 @@ void Skeleton::FindRotationMuscle(int which, int animation) if(!isnormal(muscles[which].rotate3))muscles[which].rotate3=0; } -void Animation::Load(char *filename, int aheight, int aattack) +void Animation::Load(const char *filename, int aheight, int aattack) { static FILE *tfile; static int i,j; static XYZ startoffset,endoffset; static int howmany; + static const char *anim_prefix = ":Data:Animations:"; + + LOGFUNC; - LOG(std::string("Loading animation...") + filename); + int len = strlen(anim_prefix) + strlen(filename); + char *buf = new char[len + 1]; + snprintf(buf, len + 1, "%s%s", anim_prefix, filename); + // Changing the filename into something the OS can understand + char *fixedFN = ConvertFileName(buf); + delete[] buf; + + LOG(std::string("Loading animation...") + fixedFN); deallocate(); @@ -1004,7 +837,7 @@ void Animation::Load(char *filename, int aheight, int aattack) if(visibleloading)pgame->LoadingScreen(); - tfile=fopen( filename, "rb" ); + tfile=fopen( fixedFN, "rb" ); if(tfile){ funpackf(tfile, "Bi Bi", &numframes, &joints); /* @@ -1062,7 +895,9 @@ void Animation::Load(char *filename, int aheight, int aattack) funpackf(tfile, "Bf", &twist[j][i]); } for(j=0;j