1 //****************************************************************************// 2 // hardwaremodel.h // 3 // Copyright (C) 2004 Desmecht Laurent // 4 //****************************************************************************// 5 // This library is free software; you can redistribute it and/or modify it // 6 // under the terms of the GNU Lesser General Public License as published by // 7 // the Free Software Foundation; either version 2.1 of the License, or (at // 8 // your option) any later version. // 9 //****************************************************************************// 10 11 #ifndef CAL_HARDWAREMODEL_H 12 #define CAL_HARDWAREMODEL_H 13 14 15 #include "cal3d/global.h" 16 #include "cal3d/coresubmesh.h" 17 18 19 class CalCoreModel; 20 class CalSkeleton; 21 class CalCoreMaterial; 22 23 24 class CAL3D_API CalHardwareModel 25 { 26 public: 27 struct CalHardwareMesh 28 { 29 std::vector<int> m_vectorBonesIndices; 30 31 int baseVertexIndex; 32 int vertexCount; 33 int startIndex; 34 int faceCount; 35 CalCoreMaterial *pCoreMaterial; 36 37 int meshId,submeshId; 38 }; 39 40 public: 41 CalHardwareModel(CalCoreModel* pCoreModel); ~CalHardwareModel()42 ~CalHardwareModel() { } 43 44 void setVertexBuffer( char * pVertexBuffer, int stride); 45 void setIndexBuffer( CalIndex * pIndexBuffer); 46 void setNormalBuffer( char * pNormalBuffer, int stride); 47 void setWeightBuffer( char * pWeightBuffer, int stride); 48 void setMatrixIndexBuffer( char * pMatrixIndexBuffer, int stride); 49 void setTextureCoordNum(int textureCoordNum); 50 void setTextureCoordBuffer(int mapId, char * pTextureCoordBuffer, int stride); 51 void setTangentSpaceBuffer(int mapId, char * pTangentSpaceBuffer, int stride); 52 void setCoreMeshIds(const std::vector<int>& coreMeshIds); 53 54 bool load(int baseVertexIndex, int startIndex,int maxBonesPerMesh); 55 56 std::vector<CalHardwareMesh> & getVectorHardwareMesh(); 57 void getAmbientColor(unsigned char *pColorBuffer); 58 void getDiffuseColor(unsigned char *pColorBuffer); 59 void getSpecularColor(unsigned char *pColorBuffer); 60 const CalQuaternion & getRotationBoneSpace(int boneId, CalSkeleton *pSkeleton); 61 const CalVector & getTranslationBoneSpace(int boneId, CalSkeleton *pSkeleton); 62 63 float getShininess() const; 64 65 int getHardwareMeshCount() const; 66 int getFaceCount() const; 67 int getVertexCount() const; 68 int getBoneCount() const; 69 70 int getBaseVertexIndex() const; 71 int getStartIndex() const; 72 73 int getTotalFaceCount() const; 74 int getTotalVertexCount() const; 75 76 Cal::UserData getMapUserData(int mapId); 77 78 bool selectHardwareMesh(size_t meshId); 79 80 private: 81 bool canAddFace(CalHardwareMesh &hardwareMesh, CalCoreSubmesh::Face & face,std::vector<CalCoreSubmesh::Vertex>& vectorVertex, int maxBonesPerMesh); 82 int addVertex(CalHardwareMesh &hardwareMesh, int indice , CalCoreSubmesh *pCoreSubmesh, int maxBonesPerMesh); 83 int addBoneIndice(CalHardwareMesh &hardwareMesh, int Indice, int maxBonesPerMesh); 84 85 86 private: 87 88 std::vector<CalHardwareMesh> m_vectorHardwareMesh; 89 std::vector<CalIndex> m_vectorVertexIndiceUsed; 90 int m_selectedHardwareMesh; 91 std::vector<int> m_coreMeshIds; 92 CalCoreModel *m_pCoreModel; 93 94 95 char * m_pVertexBuffer; 96 int m_vertexStride; 97 char * m_pNormalBuffer; 98 int m_normalStride; 99 char * m_pWeightBuffer; 100 int m_weightStride; 101 char * m_pMatrixIndexBuffer; 102 int m_matrixIndexStride; 103 char * m_pTextureCoordBuffer[8]; 104 int m_textureCoordStride[8]; 105 int m_textureCoordNum; 106 char * m_pTangentSpaceBuffer[8]; 107 int m_tangentSpaceStride[8]; 108 109 CalIndex * m_pIndexBuffer; 110 111 int m_totalVertexCount; 112 int m_totalFaceCount; 113 }; 114 115 #endif 116