| [2823] | 1 | /*! |
|---|
| [3360] | 2 | \file model.h |
|---|
| 3 | \brief Contains the Model Class that handles 3D-Models |
|---|
| [2823] | 4 | */ |
|---|
| 5 | |
|---|
| [3360] | 6 | #ifndef _MODEL_H |
|---|
| 7 | #define _MODEL_H |
|---|
| [2773] | 8 | |
|---|
| [3196] | 9 | #include "../stdincl.h" |
|---|
| [2773] | 10 | |
|---|
| [2754] | 11 | #include "array.h" |
|---|
| [2776] | 12 | #include "material.h" |
|---|
| [3075] | 13 | #include "vector.h" |
|---|
| [2748] | 14 | |
|---|
| [2823] | 15 | using namespace std; |
|---|
| [2804] | 16 | |
|---|
| [2842] | 17 | |
|---|
| 18 | |
|---|
| [3360] | 19 | //! Class that handles 3D-Models. it can also read them in and display them. |
|---|
| 20 | class Model |
|---|
| [2748] | 21 | { |
|---|
| 22 | public: |
|---|
| [3396] | 23 | Model(void); |
|---|
| 24 | virtual ~Model(void); |
|---|
| [2748] | 25 | |
|---|
| [3396] | 26 | void draw(void) const; |
|---|
| 27 | void draw(int groupNumber) const; |
|---|
| 28 | void draw(char* groupName) const; |
|---|
| [3063] | 29 | int getGroupCount() const; |
|---|
| [2767] | 30 | |
|---|
| [3396] | 31 | protected: |
|---|
| 32 | char* name; //!< This is the name of the Model; |
|---|
| [3186] | 33 | //! This is the placeholder of one Vertex beloning to a Face. |
|---|
| [3396] | 34 | struct FaceElement |
|---|
| [3063] | 35 | { |
|---|
| [3186] | 36 | int vertexNumber; //!< The number of the Vertex out of the Array* vertices, this vertex points to. |
|---|
| 37 | int normalNumber; //!< The number of the Normal out of the Array* normals, this vertex points to. |
|---|
| 38 | int texCoordNumber; //!< The number of the textureCoordinate out of the Array* vTexture, this vertex points to. |
|---|
| 39 | FaceElement* next; //!< Point to the next FaceElement in this List. |
|---|
| [3063] | 40 | }; |
|---|
| 41 | |
|---|
| [3186] | 42 | //! This is the placeholder of a Face belonging to a Group of Faces. |
|---|
| 43 | /** |
|---|
| 44 | \todo take Material to a call for itself. |
|---|
| 45 | |
|---|
| 46 | This can also be a Material-Change switch. |
|---|
| 47 | That means if you want to change a Material inside of a group, |
|---|
| 48 | you can create an empty face and apply a material to it, and the Importer will cahnge Colors |
|---|
| 49 | */ |
|---|
| 50 | struct Face |
|---|
| [3063] | 51 | { |
|---|
| [3186] | 52 | int vertexCount; //!< The Count of vertices this Face has. |
|---|
| 53 | FaceElement* firstElem; //!< Points to the first Vertex (FaceElement) of this Face. |
|---|
| [3063] | 54 | |
|---|
| [3186] | 55 | char* materialString; //!< The Name of the Material to which to Change. |
|---|
| [3063] | 56 | |
|---|
| [3186] | 57 | Face* next; //!< Pointer to the next Face. |
|---|
| 58 | }; |
|---|
| [3063] | 59 | |
|---|
| [3360] | 60 | //! Group to handle multiple Models per obj-file. |
|---|
| [2850] | 61 | struct Group |
|---|
| 62 | { |
|---|
| [3186] | 63 | char* name; //!< the Name of the Group. this is an identifier, that can be accessed via the draw (char* name) function. |
|---|
| [2850] | 64 | |
|---|
| [3186] | 65 | GLuint listNumber; //!< The number of the GL-List this Group gets. |
|---|
| 66 | Face* firstFace; //!< The first Face in this group. |
|---|
| 67 | Face* currentFace; //!< The current Face in this Group (the one we are currently working with.) |
|---|
| 68 | int faceMode; //!< The Mode the Face is in: initially -1, 0 for FaceList opened, 1 for Material, 3 for triangle, 4 for Quad, 5+ for Poly \todo ENUM... |
|---|
| 69 | int faceCount; //!< The Number of Faces this Group holds. |
|---|
| [2850] | 70 | |
|---|
| [3186] | 71 | Group* next; //!< Pointer to the next Group. |
|---|
| [3063] | 72 | }; |
|---|
| [2850] | 73 | |
|---|
| [3063] | 74 | |
|---|
| [3186] | 75 | Array* vertices; //!< The Array that handles the Vertices. |
|---|
| 76 | int verticesCount; //!< A global Counter for vertices. |
|---|
| 77 | Array* normals; //!< The Array that handles the Normals. |
|---|
| 78 | Array* vTexture; //!< The Array that handles the VertexTextureCoordinates. |
|---|
| [3063] | 79 | |
|---|
| [2850] | 80 | |
|---|
| [3186] | 81 | Group* firstGroup; //!< The first of all groups. |
|---|
| 82 | Group* currentGroup; //!< The currentGroup. this is the one we will work with. |
|---|
| 83 | int groupCount; //!< The Count of Groups. |
|---|
| [2850] | 84 | |
|---|
| [3186] | 85 | Material* material; //!< Initial pointer to the Material. This can hold many materials, because Material can be added with Material::addMaterial(..) |
|---|
| [3360] | 86 | float scaleFactor; //!< The Factor with which the Model should be scaled. \todo maybe one wants to scale the Model after Initialisation |
|---|
| [2760] | 87 | |
|---|
| [3066] | 88 | bool initialize (void); |
|---|
| [2850] | 89 | bool initGroup(Group* group); |
|---|
| [3066] | 90 | bool initFace (Face* face); |
|---|
| 91 | bool cleanup(void); |
|---|
| 92 | bool cleanupGroup(Group* group); |
|---|
| 93 | bool cleanupFace(Face* face); |
|---|
| [3068] | 94 | bool cleanupFaceElement(FaceElement* faceElem); |
|---|
| [2850] | 95 | |
|---|
| [3396] | 96 | bool addGroup (char* groupString); |
|---|
| 97 | bool addVertex (char* vertexString); |
|---|
| 98 | bool addFace (char* faceString); |
|---|
| 99 | bool addVertexNormal (char* normalString); |
|---|
| 100 | bool addVertexTexture (char* vTextureString); |
|---|
| 101 | bool addUseMtl (char* mtlString); |
|---|
| [2754] | 102 | |
|---|
| [3063] | 103 | bool importToGL (void); |
|---|
| [3072] | 104 | bool addGLElement (FaceElement* elem); |
|---|
| [2821] | 105 | |
|---|
| [3075] | 106 | bool buildVertexNormals (); |
|---|
| 107 | |
|---|
| [3360] | 108 | void BoxModel (void); |
|---|
| [2748] | 109 | }; |
|---|
| [2773] | 110 | |
|---|
| 111 | #endif |
|---|