X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FAnimation%2FAnimation.cpp;h=8ee1fd662ea0b171008980a2f0df62af506ed520;hb=b32cd80b243d77cd80e026c7ae73e33ec39b1de9;hp=3ccd17cf5a5db262777eda841bd243cf1a299561;hpb=4d0ec1838440e55f24e8ec9501a62348cd9e2ec3;p=lugaru.git
diff --git a/Source/Animation/Animation.cpp b/Source/Animation/Animation.cpp
index 3ccd17c..8ee1fd6 100644
--- a/Source/Animation/Animation.cpp
+++ b/Source/Animation/Animation.cpp
@@ -17,62 +17,75 @@ You should have received a copy of the GNU General Public License
along with Lugaru. If not, see .
*/
-#include "Animation/Skeleton.h"
-#include "Animation/Animation.h"
-#include "Utils/Folders.h"
-#include "Game.h"
+#include "Animation/Animation.hpp"
-extern bool visibleloading;
+#include "Animation/Skeleton.hpp"
+#include "Game.hpp"
+#include "Utils/Folders.hpp"
-//~ struct animation_data_elt {
- //~ const std::string& filename;
- //~ int height;
- //~ int attack;
-//~ };
-
-//~ static animation_data_elt animation_data[animation_count] = {
-//~ #define DECLARE_ANIM(id, file, height, attack, ...) {file, height, attack},
-//~ #include "Animation.def"
-//~ #undef DECLARE_ANIM
-//~ };
std::vector Animation::animations;
void Animation::loadAll()
{
- int i = 0;
-#define DECLARE_ANIM(id, file, height, attack, ...) if (i++ < loadable_anim_end) animations.emplace_back(file, height, attack);
+#define DECLARE_ANIM(id, file, height, attack, ...) if (id < loadable_anim_end) animations.emplace_back(file, height, attack);
#include "Animation.def"
#undef DECLARE_ANIM
}
+void AnimationFrame::loadBaseInfo(FILE* tfile)
+{
+ // for each joint in the skeleton...
+ for (unsigned j = 0; j < joints.size(); j++) {
+ // read joint position
+ funpackf(tfile, "Bf Bf Bf", &joints[j].position.x, &joints[j].position.y, &joints[j].position.z);
+ }
+ for (unsigned j = 0; j < joints.size(); j++) {
+ // read twist
+ funpackf(tfile, "Bf", &joints[j].twist);
+ }
+ for (unsigned j = 0; j < joints.size(); j++) {
+ // read onground (boolean)
+ unsigned char uch;
+ funpackf(tfile, "Bb", &uch);
+ joints[j].onground = (uch != 0);
+ }
+ // read frame speed (?)
+ funpackf(tfile, "Bf", &speed);
+}
-Animation::Animation():
- numframes(0),
- height(0),
- attack(0),
- joints(0),
- weapontargetnum(0),
+void AnimationFrame::loadTwist2(FILE* tfile)
+{
+ for (unsigned j = 0; j < joints.size(); j++) {
+ funpackf(tfile, "Bf", &joints[j].twist2);
+ }
+}
- position(0),
- twist(0),
- twist2(0),
- speed(0),
- onground(0),
- forward(0),
- label(0),
- weapontarget(0)
+void AnimationFrame::loadLabel(FILE* tfile)
+{
+ funpackf(tfile, "Bf", &label);
+}
+
+void AnimationFrame::loadWeaponTarget(FILE* tfile)
+{
+ funpackf(tfile, "Bf Bf Bf", &weapontarget.x, &weapontarget.y, &weapontarget.z);
+}
+
+Animation::Animation():
+ height(lowheight),
+ attack(neutral),
+ numjoints(0)
{
}
/* EFFECT
* load an animation from file
*/
-Animation::Animation(const std::string& filename, int aheight, int aattack):
+Animation::Animation(const std::string& filename, anim_height_type aheight, anim_attack_type aattack):
Animation()
{
FILE *tfile;
- int i, j;
- XYZ endoffset;
+ int numframes;
+ unsigned i;
LOGFUNC;
@@ -84,216 +97,54 @@ Animation::Animation(const std::string& filename, int aheight, int aattack):
height = aheight;
attack = aattack;
- if (visibleloading)
- Game::LoadingScreen();
+ Game::LoadingScreen();
// read file in binary mode
tfile = Folders::openMandatoryFile( filepath, "rb" );
// read numframes, joints to know how much memory to allocate
- funpackf(tfile, "Bi Bi", &numframes, &joints);
+ funpackf(tfile, "Bi Bi", &numframes, &numjoints);
// allocate memory for everything
- position = (XYZ**)malloc(sizeof(XYZ*) * joints);
- for (i = 0; i < joints; i++)
- position[i] = (XYZ*)malloc(sizeof(XYZ) * numframes);
-
- twist = (float**)malloc(sizeof(float*) * joints);
- for (i = 0; i < joints; i++)
- twist[i] = (float*)malloc(sizeof(float) * numframes);
-
- twist2 = (float**)malloc(sizeof(float*) * joints);
- for (i = 0; i < joints; i++)
- twist2[i] = (float*)malloc(sizeof(float) * numframes);
-
- speed = (float*)malloc(sizeof(float) * numframes);
-
- onground = (bool**)malloc(sizeof(bool*) * joints);
- for (i = 0; i < joints; i++)
- onground[i] = (bool*)malloc(sizeof(bool) * numframes);
-
- forward = (XYZ*)malloc(sizeof(XYZ) * numframes);
- weapontarget = (XYZ*)malloc(sizeof(XYZ) * numframes);
- label = (int*)malloc(sizeof(int) * numframes);
+ frames.resize(numframes);
// read binary data as animation
// for each frame...
- for (i = 0; i < numframes; i++) {
- // for each joint in the skeleton...
- for (j = 0; j < joints; j++) {
- // read joint position
- funpackf(tfile, "Bf Bf Bf", &position[j][i].x, &position[j][i].y, &position[j][i].z);
- }
- for (j = 0; j < joints; j++) {
- // read twist
- funpackf(tfile, "Bf", &twist[j][i]);
- }
- for (j = 0; j < joints; j++) {
- // read onground (boolean)
- unsigned char uch;
- funpackf(tfile, "Bb", &uch);
- onground[j][i] = (uch != 0);
- }
- // read frame speed (?)
- funpackf(tfile, "Bf", &speed[i]);
+ for (i = 0; i < frames.size(); i++) {
+ frames[i].joints.resize(numjoints);
+ frames[i].loadBaseInfo(tfile);
}
// read twist2 for whole animation
- for (i = 0; i < numframes; i++) {
- for (j = 0; j < joints; j++) {
- funpackf(tfile, "Bf", &twist2[j][i]);
- }
+ for (i = 0; i < frames.size(); i++) {
+ frames[i].loadTwist2(tfile);
}
// read label for each frame
- for (i = 0; i < numframes; i++) {
- funpackf(tfile, "Bf", &label[i]);
+ for (i = 0; i < frames.size(); i++) {
+ frames[i].loadLabel(tfile);
}
- // read weapontargetnum
+ // read unused weapontargetnum
+ int weapontargetnum;
funpackf(tfile, "Bi", &weapontargetnum);
// read weapontarget positions for each frame
- for (i = 0; i < numframes; i++) {
- funpackf(tfile, "Bf Bf Bf", &weapontarget[i].x, &weapontarget[i].y, &weapontarget[i].z);
+ for (i = 0; i < frames.size(); i++) {
+ frames[i].loadWeaponTarget(tfile);
}
fclose(tfile);
+ XYZ endoffset;
endoffset = 0;
// 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][numframes - 1].y < 1)
- endoffset += position[j][numframes - 1];
+ for (i = 0; i < frames.back().joints.size(); i++) {
+ if (frames.back().joints[i].position.y < 1) {
+ endoffset += frames.back().joints[i].position;
+ }
}
- endoffset /= joints;
+ endoffset /= numjoints;
offset = endoffset;
offset.y = 0;
}
-
-Animation::~Animation()
-{
- //~ deallocate();
-}
-
-void Animation::deallocate()
-{
- int i = 0;
-
- if (position) {
- for (i = 0; i < joints; i++)
- free(position[i]);
-
- free(position);
- }
- position = 0;
-
- if (twist) {
- for (i = 0; i < joints; i++)
- free(twist[i]);
-
- free(twist);
- }
- twist = 0;
-
- if (twist2) {
- for (i = 0; i < joints; i++)
- free(twist2[i]);
-
- free(twist2);
- }
- twist2 = 0;
-
- if (onground) {
- for (i = 0; i < joints; i++)
- free(onground[i]);
-
- free(onground);
- }
- onground = 0;
-
- if (speed)
- free(speed);
- speed = 0;
-
- if (forward)
- free(forward);
- forward = 0;
-
- if (weapontarget)
- free(weapontarget);
- weapontarget = 0;
-
- if (label)
- free(label);
- label = 0;
-
- joints = 0;
-}
-
-Animation & Animation::operator = (const Animation & ani)
-{
- int i = 0;
-
- bool allocate = ((ani.numframes != numframes) || (ani.joints != joints));
-
- if (allocate)
- deallocate();
-
- numframes = ani.numframes;
- height = ani.height;
- attack = ani.attack;
- joints = ani.joints;
- weapontargetnum = ani.weapontargetnum;
- offset = ani.offset;
-
- if (allocate)
- position = (XYZ**)malloc(sizeof(XYZ*)*ani.joints);
- for (i = 0; i < ani.joints; i++) {
- if (allocate)
- position[i] = (XYZ*)malloc(sizeof(XYZ) * ani.numframes);
- memcpy(position[i], ani.position[i], sizeof(XYZ)*ani.numframes);
- }
-
- if (allocate)
- twist = (float**)malloc(sizeof(float*)*ani.joints);
- for (i = 0; i < ani.joints; i++) {
- if (allocate)
- twist[i] = (float*)malloc(sizeof(float) * ani.numframes);
- memcpy(twist[i], ani.twist[i], sizeof(float)*ani.numframes);
- }
-
- if (allocate)
- twist2 = (float**)malloc(sizeof(float*)*ani.joints);
- for (i = 0; i < ani.joints; i++) {
- if (allocate)
- twist2[i] = (float*)malloc(sizeof(float) * ani.numframes);
- memcpy(twist2[i], ani.twist2[i], sizeof(float)*ani.numframes);
- }
-
- if (allocate)
- speed = (float*)malloc(sizeof(float) * ani.numframes);
- memcpy(speed, ani.speed, sizeof(float)*ani.numframes);
-
- if (allocate)
- onground = (bool**)malloc(sizeof(bool*)*ani.joints);
- for (i = 0; i < ani.joints; i++) {
- if (allocate)
- onground[i] = (bool*)malloc(sizeof(bool) * ani.numframes);
- memcpy(onground[i], ani.onground[i], sizeof(bool)*ani.numframes);
- }
-
- if (allocate)
- forward = (XYZ*)malloc(sizeof(XYZ) * ani.numframes);
- memcpy(forward, ani.forward, sizeof(XYZ)*ani.numframes);
-
- if (allocate)
- weapontarget = (XYZ*)malloc(sizeof(XYZ) * ani.numframes);
- memcpy(weapontarget, ani.weapontarget, sizeof(XYZ)*ani.numframes);
-
- if (allocate)
- label = (int*)malloc(sizeof(int) * ani.numframes);
- memcpy(label, ani.label, sizeof(int)*ani.numframes);
-
- return (*this);
-}