openal and fontft memleak fixes from keltar
[fegdk.git] / tools / fgp / f_expmodel.h
blob2a8e30ea0044c3efd3c5ec11597e345f597d7dfd
1 /*
2 fegdk: FE Game Development Kit
3 Copyright (C) 2001-2008 Alexey "waker" Yakovenko
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
15 You should have received a copy of the GNU Library General Public
16 License along with this library; if not, write to the Free
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 Alexey Yakovenko
20 waker@users.sourceforge.net
23 #ifndef __F_EXPMODEL_H
24 #define __F_EXPMODEL_H
26 #include "f_string.h"
27 #include "f_parser.h"
28 #include "f_math.h"
29 #include "f_sceneobject.h"
30 #include "f_animation.h"
31 #include "f_model.h"
32 #include "f_helpers.h"
34 namespace fe
37 enum objClassID
39 UNKNOWN_OBJECT_CLASS_ID,
40 TRI_OBJECT_CLASS_ID,
41 ENTITY_OBJECT_CLASS_ID,
42 REF_OBJECT_CLASS_ID,
43 DUMMY_OBJECT_CLASS_ID
46 struct expFace
48 int v[3];
51 class expScene;
53 class expObject : public baseObject
56 public:
57 typedef std::vector < smartPtr <expObject> > childrenList;
59 protected:
61 float mFrameRate;
62 expObject* mpParent;
63 matrix4 mMatrix;
64 matrix4 mWorldMatrix;
66 childrenList mChildren;
68 objClassID mClassID;
70 bool baseLoad (charParser &p, const char *fname);
71 void recalcWorldTransforms (void);
73 virtual ~expObject (void)
75 mChildren.clear ();
78 public:
80 // constructor & destructor
81 expObject (expObject *parent);
83 objClassID getClassID (void) const { return mClassID; }
85 const matrix4 &getMatrix (void) const
87 return mMatrix;
90 const matrix4 &getWorldMatrix (void) const
92 return mWorldMatrix;
95 void setMatrix (const matrix4 &m);
96 void setWorldMatrix (const matrix4 &m);
97 virtual void load (charParser &p, const char *fname) = 0;
98 virtual void render (const smartPtr <expScene> &scene) const;
99 const childrenList& children (void) const { return mChildren; }
100 void addChild (const smartPtr <expObject> &child);
101 void removeChild (const smartPtr <expObject> &child);
102 void setParent (expObject *parent);
103 smartPtr <expObject> getParent (void) { return mpParent; }
105 float frameRate (void) const { return mFrameRate; }
107 typedef smartPtr <expObject> expObjectPtr;
109 class expScene : public baseObject
112 public:
114 typedef std::vector <materialPtr> materialList;
116 protected:
118 expObjectPtr mpSceneRoot;
119 std::vector <cStr> mMtlNameList;
120 std::vector <cStr> mBoneList;
121 materialList mMtlList;
123 void load (charParser &p);
124 expObjectPtr loadObject (charParser &p);
126 ~expScene (void);
128 public:
130 expScene (void);
132 int load (const char *fname);
134 expObjectPtr getRootNode (void) { return mpSceneRoot; }
136 std::vector <cStr>& mtlNameList (void) { return mMtlNameList; }
137 materialList& mtlList (void) { return mMtlList; }
139 virtual void render (void);
142 typedef smartPtr <expScene> expScenePtr;
144 class expTriObject : public expObject
147 protected:
149 std::vector <vector3> mVerts;
150 std::vector <vector3> mColors;
151 std::vector <vector3> mNormals;
152 std::vector <vector2> mTexCoords;
153 std::vector <vector2> mLightmapTexCoords;
154 std::vector <expFace> mFaces;
155 std::vector <expFace> mColorFaces;
156 std::vector <expFace> mNormalFaces;
157 std::vector <expFace> mTexCoordFaces;
158 std::vector <expFace> mLightmapTexCoordFaces;
159 std::vector <int> mMtlIndex;
160 std::vector <vector3> mTangents;
161 std::vector <vector3> mBinormals;
162 std::vector <expFace> mTSFaces;
164 struct boneInfl {
165 int bone;
166 float weight;
168 typedef std::vector <boneInfl> vertexInfl;
169 std::vector <vertexInfl> mVertexInfluences;
171 void flush (expScene *scene, int mtl, int firstFace, int numFaces);
173 ~expTriObject (void) {}
175 public:
177 expTriObject (expObject *parent);
179 virtual void load (charParser &p, const char *fname);
180 void transformIntoWorldSpace (void);
182 std::vector<vector3>& verts () { return mVerts; }
183 std::vector<vector3>& colors () { return mColors; }
184 std::vector<vector3>& normals () { return mNormals; }
185 std::vector<vector2>& texCoords () { return mTexCoords; }
186 std::vector<vector2>& lightmapTexCoords () { return mLightmapTexCoords; }
187 std::vector<expFace>& faces () { return mFaces; }
188 std::vector<expFace>& colorFaces () { return mColorFaces; }
189 std::vector<expFace>& normalFaces () { return mNormalFaces; }
190 std::vector<expFace>& texCoordFaces () { return mTexCoordFaces; }
191 std::vector<expFace>& lightmapTexCoordFaces () { return mLightmapTexCoordFaces; }
192 std::vector<int>& mtlIndex () { return mMtlIndex; }
193 std::vector<vector3>& tangents () { return mTangents; }
194 std::vector<vector3>& binormals () { return mBinormals; }
195 std::vector<expFace>& tsFaces () { return mTSFaces; }
197 const std::vector<vector3>& verts () const { return mVerts; }
198 const std::vector<vector3>& colors () const { return mColors; }
199 const std::vector<vector3>& normals () const { return mNormals; }
200 const std::vector<vector2>& texCoords () const { return mTexCoords; }
201 const std::vector<vector2>& lightmapTexCoords () const { return mLightmapTexCoords; }
202 const std::vector<expFace>& faces () const { return mFaces; }
203 const std::vector<expFace>& colorFaces () const { return mColorFaces; }
204 const std::vector<expFace>& normalFaces () const { return mNormalFaces; }
205 const std::vector<expFace>& texCoordFaces () const { return mTexCoordFaces; }
206 const std::vector<expFace>& lightmapTexCoordFaces () const { return mLightmapTexCoordFaces; }
207 const std::vector<int>& mtlIndex () const { return mMtlIndex; }
208 const std::vector<vector3>& tangents () const { return mTangents; }
209 const std::vector<vector3>& binormals () const { return mBinormals; }
210 const std::vector<expFace>& tsFaces () const { return mTSFaces; }
212 virtual void render (expScene *scene);
215 typedef smartPtr <expTriObject> expTriObjectPtr;
217 class expModel : public sceneObject
220 protected:
222 struct face
224 ushort v[3];
227 struct subset
229 uint32 firstVertex;
230 uint32 firstFace;
231 uint32 numVerts;
232 uint32 numFaces;
233 uint32 mtl;
236 bool mbLightmaps, mbTangents;
238 std::vector< subset > mSubSets;
239 std::vector< drawVertex_t > mVerts;
240 std::vector< face > mFaces;
241 std::vector< int > mMtlIndex;
242 cStr mLightmapName;
244 ~expModel (void);
245 void saveGeometry (FILE *fp) const;
247 public:
249 expModel (expModel *parent);
251 void convertFrom (const expScenePtr &s, const expObjectPtr &o);
252 void save (const char *fname, const expScenePtr &s) const;
255 class expEntityObject : public expObject
257 private:
259 public:
260 // data
261 std::map<cStr, cStr> mProps;
263 public:
265 virtual void load (charParser &p, const char *fname);
267 // constructor & destructor
268 expEntityObject (expObject *parent);
269 virtual void render (expScene *scene);
271 protected:
272 virtual ~expEntityObject () {};
275 class expRefObject : public expObject
278 // data
279 cStr mRefObjFileName; // imported .mdl filename
280 expScene* mpScene; // imported scene ptr
282 public:
284 virtual void load (charParser &p, const char *fname);
286 // constructor & destructor
287 expRefObject (expObject *parent);
288 virtual void render (expScene *scene);
290 protected:
292 virtual ~expRefObject () {};
296 class expDummyObject : public expObject
299 public:
301 expDummyObject (expObject *parent);
302 virtual void load (charParser &p, const char *fname);
303 virtual void render (expScene *scene);
308 #endif // __F_EXPMODEL_H