X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FSkeleton.cpp;h=af343d6b3261b3a405f876f877e665a7a6813c85;hb=47bd467205c41f5c993fb9d3f2b31338989c641c;hp=c8207a0ea8066f9b8c8689c475cc3bba1b34c4db;hpb=24004d6ab1e68faaf85ece11b566449997da5013;p=lugaru.git diff --git a/Source/Skeleton.cpp b/Source/Skeleton.cpp index c8207a0..af343d6 100644 --- a/Source/Skeleton.cpp +++ b/Source/Skeleton.cpp @@ -1,22 +1,21 @@ /* Copyright (C) 2003, 2010 - Wolfire Games +Copyright (C) 2010-2016 - Lugaru contributors (see AUTHORS file) 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. +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, +Lugaru 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. +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. +along with Lugaru. If not, see . */ /**> HEADER FILES <**/ @@ -27,17 +26,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. extern float multiplier; extern float gravity; -extern Skeleton testskeleton; extern Terrain terrain; extern Objects objects; extern int environment; extern float camerashake; extern bool freeze; extern int detail; -extern XYZ envsound[30]; -extern float envsoundvol[30]; -extern int numenvsounds; -extern float envsoundlife[30]; extern int tutoriallevel; extern int whichjointstartarray[26]; @@ -45,28 +39,11 @@ extern int whichjointendarray[26]; extern bool visibleloading; -/* convenience functions - */ -Joint& Skeleton::joint(int bodypart) -{ - return joints[jointlabels[bodypart]]; -} -XYZ& Skeleton::jointPos(int bodypart) -{ - return joint(bodypart).position; -} -XYZ& Skeleton::jointVel(int bodypart) -{ - return joint(bodypart).velocity; -} - - /* EFFECT */ void dealloc2(void* param) { free(param); - param = 0; // FIXME: does this *do* anything??? } enum {boneconnect, constraint, muscle}; @@ -201,7 +178,7 @@ float Skeleton::DoConstraints(XYZ *coords, float *scale) XYZ bounceness; const int numrepeats = 3; float groundlevel = .15; - int i, j, k, l, m; + int i, j, k, m; XYZ temp; XYZ terrainnormal; int whichhit; @@ -359,17 +336,17 @@ 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.yaw[k], 0), .4, .5, Random() % 360); + // FIXME: this crashes because k is not initialized! + // to reproduce, type 'wolfie' in console and play a while + // I'll just comment it out for now + //objects.model[k].MakeDecal(breakdecal, DoRotation(temp - objects.position[k], 0, -objects.yaw[k], 0), .4, .5, Random() % 360); Sprite::MakeSprite(cloudsprite, joints[i].position * (*scale) + *coords, joints[i].velocity * .06, 1, 1, 1, 4, .2); breaking = false; camerashake += .6; emit_sound_at(breaksound2, joints[i].position * (*scale) + *coords); - envsound[numenvsounds] = *coords; - envsoundvol[numenvsounds] = 64; - envsoundlife[numenvsounds] = .4; - numenvsounds++; + addEnvSound(*coords, 64); } if (findLengthfast(&bounceness) > 2500) { @@ -454,10 +431,7 @@ float Skeleton::DoConstraints(XYZ *coords, float *scale) emit_sound_at(breaksound2, joints[i].position * (*scale) + *coords); - envsound[numenvsounds] = *coords; - envsoundvol[numenvsounds] = 64; - envsoundlife[numenvsounds] = .4; - numenvsounds++; + addEnvSound(*coords, 64); } if (objects.type[k] == treetrunktype) { objects.rotx[k] += joints[i].velocity.x * multiplier * .4; @@ -568,7 +542,16 @@ void Skeleton::DoGravity(float *scale) { static int i; for (i = 0; i < num_joints; i++) { - if (((joints[i].label != leftknee && joints[i].label != rightknee) || lowforward.y > -.1 || joints[i].mass < 5) && ((joints[i].label != rightelbow && joints[i].label != rightelbow) || forward.y < .3)) + if ( + ( + ((joints[i].label != leftknee) && (joints[i].label != rightknee)) || + (lowforward.y > -.1) || + (joints[i].mass < 5) + ) && ( + ((joints[i].label != leftelbow) && (joints[i].label != rightelbow)) || + (forward.y < .3) + ) + ) joints[i].velocity.y += gravity * multiplier / (*scale); } } @@ -689,7 +672,7 @@ void Animation::Load(const char *filename, int aheight, int aattack) { FILE *tfile; int i, j; - XYZ startoffset, endoffset; + XYZ endoffset; // path to dir const char *anim_prefix = ":Data:Animations:"; @@ -721,23 +704,6 @@ void Animation::Load(const char *filename, int aheight, int aattack) if (tfile) { // read numframes, joints to know how much memory to allocate funpackf(tfile, "Bi Bi", &numframes, &joints); - /* - for(i = 0; i < joints; i++){ - if(position[i])dealloc2(position[i]); - if(twist[i])dealloc2(twist[i]); - if(twist2[i])dealloc2(twist2[i]); - if(onground[i])dealloc2(onground[i]); - }*/ - /* - if(position)dealloc2(position); - if(twist)dealloc2(twist); - if(twist2)dealloc2(twist2); - if(speed)dealloc2(speed); - if(onground)dealloc2(onground); - if(forward)dealloc2(forward); - if(weapontarget)dealloc2(weapontarget); - if(label)dealloc2(label);*/ - // allocate memory for everything @@ -763,15 +729,6 @@ void Animation::Load(const char *filename, int aheight, int aattack) weapontarget = (XYZ*)malloc(sizeof(XYZ) * numframes); label = (int*)malloc(sizeof(int) * numframes); - /*position = new XYZ[joints][numframes]; - twist = new float[joints][numframes]; - twist2 = new float[joints][numframes]; - speed = new float[numframes]; - onground = new bool[joints][numframes]; - forward = new XYZ[numframes]; - label = new int[numframes];*/ - - // read binary data as animation // for each frame... @@ -814,18 +771,14 @@ void Animation::Load(const char *filename, int aheight, int aattack) fclose(tfile); } - startoffset = 0; endoffset = 0; - // find average position of certain joints on first and last frames - // and save in startoffset, endoffset + // find average position of certain joints on last frames + // and save in endoffset // (not sure what exactly this accomplishes. the y < 1 test confuses me.) for (j = 0; j < joints; j++) { - if (position[j][0].y < 1) - startoffset += position[j][0]; if (position[j][numframes - 1].y < 1) endoffset += position[j][numframes - 1]; } - startoffset /= joints; endoffset /= joints; offset = endoffset; offset.y = 0; @@ -847,16 +800,11 @@ void Skeleton::Load(const char *filename, const char *lowfilename, const c int parentID; FILE *tfile; float lSize; - int i, j, tempmuscle; - - int newload; + int i, j; int edit; LOGFUNC; - - newload = 0; - num_models = 7; // load various models @@ -926,10 +874,9 @@ void Skeleton::Load(const char *filename, const char *lowfilename, const c funpackf(tfile, "Bi", &num_joints); // allocate memory - //joints.resize(num_joints); if (joints) delete [] joints; //dealloc2(joints); - joints = (Joint*)new Joint[num_joints]; //malloc(sizeof(Joint)*num_joints); + joints = (Joint*)new Joint[num_joints]; // read info for each joint for (i = 0; i < num_joints; i++) { @@ -947,27 +894,19 @@ void Skeleton::Load(const char *filename, const char *lowfilename, const c } // read num_muscles - tempmuscle = num_muscles; funpackf(tfile, "Bi", &num_muscles); // allocate memory - //muscles.clear(); if (muscles) delete [] muscles; //dealloc2(muscles); muscles = (Muscle*)new Muscle[num_muscles]; //malloc(sizeof(Muscle)*num_muscles); - newload = 1; - // for each muscle... for (i = 0; i < num_muscles; i++) { // read info - tempmuscle = muscles[i].numvertices; funpackf(tfile, "Bf Bf Bf Bf Bf Bi Bi", &muscles[i].length, &muscles[i].targetlength, &muscles[i].minlength, &muscles[i].maxlength, &muscles[i].strength, &muscles[i].type, &muscles[i].numvertices); // allocate memory for vertices - //muscles[i].vertices.clear(); - //muscles[i].vertices.resize(muscles[i].numvertices); - //if(muscles[i].vertices)dealloc2(muscles[i].vertices); muscles[i].vertices = (int*)malloc(sizeof(int) * muscles[i].numvertices); // read vertices @@ -1045,8 +984,6 @@ void Skeleton::Load(const char *filename, const char *lowfilename, const c lSize = sizeof(num_joints); fseek(tfile, lSize, SEEK_CUR); - //joints = new Joint[num_joints]; - //jointlabels = new int[num_joints]; for (i = 0; i < num_joints; i++) { // skip joint info lSize = sizeof(XYZ) @@ -1071,7 +1008,6 @@ void Skeleton::Load(const char *filename, const char *lowfilename, const c // read num_muscles funpackf(tfile, "Bi", &num_muscles); - //muscles = new Muscle[num_muscles]; for (i = 0; i < num_muscles; i++) { // skip muscle info @@ -1084,14 +1020,10 @@ void Skeleton::Load(const char *filename, const char *lowfilename, const c fseek(tfile, lSize, SEEK_CUR); // read numverticeslow - tempmuscle = muscles[i].numverticeslow; funpackf(tfile, "Bi", &muscles[i].numverticeslow); if (muscles[i].numverticeslow) { // allocate memory - //muscles[i].verticeslow.clear(); - //muscles[i].verticeslow.resize(muscles[i].numverticeslow); - //if(muscles[i].verticeslow)dealloc2(muscles[i].verticeslow); muscles[i].verticeslow = (int*)malloc(sizeof(int) * muscles[i].numverticeslow); // read verticeslow @@ -1113,23 +1045,13 @@ void Skeleton::Load(const char *filename, const char *lowfilename, const c fseek ( tfile, lSize, SEEK_CUR); } - // ??? - lSize = sizeof(int); for (j = 0; j < num_muscles; j++) { for (i = 0; i < muscles[j].numverticeslow; i++) { - if (muscles[j].numverticeslow && muscles[j].verticeslow[i] < modellow.vertexNum) + if (muscles[j].verticeslow[i] < modellow.vertexNum) modellow.owner[muscles[j].verticeslow[i]] = j; } } - /*FindForwards(); - for(i=0;iposition + muscles[modellow.owner[i]].parent2->position) / 2; @@ -1158,8 +1080,6 @@ void Skeleton::Load(const char *filename, const char *lowfilename, const c // skip num_joints lSize = sizeof(num_joints); fseek ( tfile, lSize, SEEK_CUR); - //joints = new Joint[num_joints]; - //jointlabels = new int[num_joints]; for (i = 0; i < num_joints; i++) { // skip joint info @@ -1185,7 +1105,6 @@ void Skeleton::Load(const char *filename, const char *lowfilename, const c // read num_muscles funpackf(tfile, "Bi", &num_muscles); - //muscles = new Muscle[num_muscles]; for (i = 0; i < num_muscles; i++) { // skip muscle info @@ -1198,14 +1117,10 @@ void Skeleton::Load(const char *filename, const char *lowfilename, const c fseek(tfile, lSize, SEEK_CUR); // read numverticesclothes - tempmuscle = muscles[i].numverticesclothes; funpackf(tfile, "Bi", &muscles[i].numverticesclothes); // read verticesclothes if (muscles[i].numverticesclothes) { - //muscles[i].verticesclothes.clear(); - //muscles[i].verticesclothes.resize(muscles[i].numverticesclothes); - //if(muscles[i].verticesclothes)dealloc2(muscles[i].verticesclothes); muscles[i].verticesclothes = (int*)malloc(sizeof(int) * muscles[i].numverticesclothes); edit = 0; for (j = 0; j < muscles[i].numverticesclothes - edit; j++) { @@ -1234,14 +1149,6 @@ void Skeleton::Load(const char *filename, const char *lowfilename, const c } } - /*FindForwards(); - for(i=0;iposition + muscles[modelclothes.owner[i]].parent2->position) / 2; @@ -1360,24 +1267,24 @@ Skeleton::Skeleton() selected = 0; memset(forwardjoints, 0, sizeof(forwardjoints)); - // XYZ forward; + // XYZ forward; id = 0; memset(lowforwardjoints, 0, sizeof(lowforwardjoints)); - // XYZ lowforward; + // XYZ lowforward; - // XYZ specialforward[5]; + // XYZ specialforward[5]; memset(jointlabels, 0, sizeof(jointlabels)); - // Model model[7]; - // Model modellow; - // Model modelclothes; + // Model model[7]; + // Model modellow; + // Model modelclothes; num_models = 0; - // Model drawmodel; - // Model drawmodellow; - // Model drawmodelclothes; + // Model drawmodel; + // Model drawmodellow; + // Model drawmodelclothes; clothes = 0; spinny = 0; @@ -1448,9 +1355,7 @@ Animation & Animation::operator = (const Animation & ani) { int i = 0; - bool allocate = true; - - allocate = ((ani.numframes != numframes) || (ani.joints != joints)); + bool allocate = ((ani.numframes != numframes) || (ani.joints != joints)); if (allocate) deallocate(); @@ -1460,6 +1365,7 @@ Animation & Animation::operator = (const Animation & ani) attack = ani.attack; joints = ani.joints; weapontargetnum = ani.weapontargetnum; + offset = ani.offset; if (allocate) position = (XYZ**)malloc(sizeof(XYZ*)*ani.joints); @@ -1613,14 +1519,6 @@ void Skeleton::Draw(int muscleview) glVertex3f(joints[i].parent->position.x, joints[i].parent->position.y, joints[i].parent->position.z); } } - /*for(int i=0; iblurred); @@ -1677,13 +1575,7 @@ void Skeleton::AddJoint(float x, float y, float z, int which) joints[num_joints].mass = 1; joints[num_joints].locked = 0; - /*if(which>=num_joints||which<0)*/ joints[num_joints].hasparent = 0; - /*if(which=0){ - joints[num_joints].parent=&joints[which]; - joints[num_joints].hasparent=1; - joints[num_joints].length=findDistance(joints[num_joints].position,joints[num_joints].parent->position); - }*/ num_joints++; if (which < num_joints && which >= 0) AddMuscle(num_joints - 1, which, 0, 10, boneconnect);