]> git.jsancho.org Git - lugaru.git/blob - Source/Animation/Skeleton.h
7c482f911c638cd8a89812ef427fadb60dbe3449
[lugaru.git] / Source / Animation / Skeleton.h
1 /*
2 Copyright (C) 2003, 2010 - Wolfire Games
3 Copyright (C) 2010-2016 - Lugaru contributors (see AUTHORS file)
4
5 This file is part of Lugaru.
6
7 Lugaru is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 Lugaru is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Lugaru.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #ifndef _SKELETON_H_
22 #define _SKELETON_H_
23
24 #include "Models.h"
25 #include "Quaternions.h"
26
27
28 /**> HEADER FILES <**/
29 #include "gamegl.h"
30 #include "Quaternions.h"
31 #include "Objects.h"
32 #include "Sprite.h"
33 #include "binio.h"
34 #include "Animation/Animation.h"
35
36 enum bodyparts {
37     head, neck,
38     leftshoulder,  leftelbow,  leftwrist,  lefthand,
39     rightshoulder, rightelbow, rightwrist, righthand,
40     abdomen, lefthip, righthip, groin,
41     leftknee,  leftankle,  leftfoot,
42     rightknee, rightankle, rightfoot
43 };
44
45 class Joint
46 {
47 public:
48     XYZ position;
49     XYZ oldposition;
50     XYZ realoldposition;
51     XYZ velocity;
52     XYZ oldvelocity;
53     XYZ startpos;
54     float blurred;
55     float length;
56     float mass;
57     bool lower;
58     bool hasparent;
59     bool locked;
60     int modelnum;
61     bool visible;
62     Joint* parent;
63     bool sametwist;
64     int label;
65     int hasgun;
66     float delay;
67     XYZ velchange;
68
69     Joint() {
70         blurred = 0;
71         length = 0;
72         mass = 0;
73         lower = 0;
74         hasparent = 0;
75         locked = 0;
76         modelnum = 0;
77         visible = 0;
78         parent = 0;
79         sametwist = 0;
80         label = 0;
81         hasgun = 0;
82         delay = 0;
83     }
84 };
85
86 class Muscle
87 {
88 public:
89     int numvertices;
90     int* vertices;
91     int numverticeslow;
92     int* verticeslow;
93     int numverticesclothes;
94     int* verticesclothes;
95     float length;
96     float targetlength;
97     Joint* parent1;
98     Joint* parent2;
99     float maxlength;
100     float minlength;
101     int type;
102     bool visible;
103     float rotate1, rotate2, rotate3;
104     float lastrotate1, lastrotate2, lastrotate3;
105     float oldrotate1, oldrotate2, oldrotate3;
106     float newrotate1, newrotate2, newrotate3;
107
108     float strength;
109
110     Muscle();
111     ~Muscle();
112     void DoConstraint(bool spinny);
113 };
114
115 const int max_joints = 50;
116
117 class Skeleton
118 {
119 public:
120     int num_joints;
121     //Joint joints[max_joints];
122     //Joint *joints;
123     Joint* joints;
124
125     int num_muscles;
126     //Muscle muscles[max_muscles];
127     //Muscle *muscles;
128     Muscle* muscles;
129
130     int selected;
131
132     int forwardjoints[3];
133     XYZ forward;
134
135     int id;
136
137     int lowforwardjoints[3];
138     XYZ lowforward;
139
140     XYZ specialforward[5];
141     int jointlabels[max_joints];
142
143     Model model[7];
144     Model modellow;
145     Model modelclothes;
146     int num_models;
147
148     Model drawmodel;
149     Model drawmodellow;
150     Model drawmodelclothes;
151
152     bool clothes;
153     bool spinny;
154
155     GLubyte skinText[512 * 512 * 3];
156     int skinsize;
157
158     float checkdelay;
159
160     float longdead;
161     bool broken;
162
163     int free;
164     int oldfree;
165     float freetime;
166     bool freefall;
167
168     void FindForwards();
169     float DoConstraints(XYZ *coords, float *scale);
170     void DoGravity(float *scale);
171     void FindRotationJoint(int which);
172     void FindRotationJointSameTwist(int which);
173     void FindRotationMuscle(int which, int animation);
174     void Load(const std::string& fileName, const std::string& lowfileName, const std::string& clothesfileName, const std::string& modelfileName, const std::string& model2fileName, const std::string& model3fileName, const std::string& model4fileName, const std::string& model5fileNamee, const std::string& model6fileName, const std::string& model7fileName, const std::string& modellowfileName, const std::string& modelclothesfileName, bool aclothes);
175
176     /*
177     // unused
178     void FindForwardsfirst();
179     void Draw(int muscleview);
180     void AddJoint(float x, float y, float z, int which);
181     void SetJoint(float x, float y, float z, int which, int whichjoint);
182     void DeleteJoint(int whichjoint);
183     void AddMuscle(int attach1, int attach2, float maxlength, float minlength, int type);
184     void DeleteMuscle(int whichmuscle);
185     void DoBalance();
186     void MusclesSet();
187     */
188
189     Skeleton();
190     ~Skeleton();
191
192 private:
193     // convenience functions
194     // only for Skeleton.cpp
195     inline Joint& joint(int bodypart) { return joints[jointlabels[bodypart]]; }
196     inline XYZ& jointPos(int bodypart) { return joint(bodypart).position; }
197     inline XYZ& jointVel(int bodypart) { return joint(bodypart).velocity; }
198
199 };
200
201 #endif