00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef CAL_HARDWAREMODEL_H
00012 #define CAL_HARDWAREMODEL_H
00013
00014
00015
00016
00017
00018 #include "cal3d/global.h"
00019 #include "cal3d/coresubmesh.h"
00020
00021
00022
00023
00024
00025 class CalCoreModel;
00026 class CalSkeleton;
00027 class CalCoreMaterial;
00028
00029
00030
00031
00032
00033
00034
00038 class CAL3D_API CalHardwareModel
00039 {
00040 public:
00041 struct CalHardwareMesh
00042 {
00043 std::vector<int> m_vectorBonesIndices;
00044
00045 int baseVertexIndex;
00046 int vertexCount;
00047 int startIndex;
00048 int faceCount;
00049 CalCoreMaterial *pCoreMaterial;
00050
00051 int meshId,submeshId;
00052 };
00053
00054
00055
00056 private:
00057
00058 std::vector<CalHardwareMesh> m_vectorHardwareMesh;
00059 std::vector<CalIndex> m_vectorVertexIndiceUsed;
00060 int m_selectedHardwareMesh;
00061 std::vector<int> m_coreMeshIds;
00062 CalCoreModel *m_pCoreModel;
00063
00064
00065 char * m_pVertexBuffer;
00066 int m_vertexStride;
00067 char * m_pNormalBuffer;
00068 int m_normalStride;
00069 char * m_pWeightBuffer;
00070 int m_weightStride;
00071 char * m_pMatrixIndexBuffer;
00072 int m_matrixIndexStride;
00073 char * m_pTextureCoordBuffer[8];
00074 int m_textureCoordStride[8];
00075 int m_textureCoordNum;
00076 char * m_pTangentSpaceBuffer[8];
00077 int m_tangentSpaceStride[8];
00078
00079 CalIndex * m_pIndexBuffer;
00080
00081 int m_totalVertexCount;
00082 int m_totalFaceCount;
00083
00084
00085
00086
00087 public:
00088 CalHardwareModel();
00089 virtual ~CalHardwareModel();
00090
00091
00092 public:
00093 bool create(CalCoreModel *pCoreModel);
00094
00095 void setVertexBuffer( char * pVertexBuffer, int stride);
00096 void setIndexBuffer( CalIndex * pIndexBuffer);
00097 void setNormalBuffer( char * pNormalBuffer, int stride);
00098 void setWeightBuffer( char * pWeightBuffer, int stride);
00099 void setMatrixIndexBuffer( char * pMatrixIndexBuffer, int stride);
00100 void setTextureCoordNum(int textureCoordNum);
00101 void setTextureCoordBuffer(int mapId, char * pTextureCoordBuffer, int stride);
00102 void setTangentSpaceBuffer(int mapId, char * pTangentSpaceBuffer, int stride);
00103 void setCoreMeshIds(const std::vector<int>& coreMeshIds);
00104
00105 bool load(int baseVertexIndex, int startIndex,int maxBonesPerMesh);
00106
00107 void destroy();
00108
00109 std::vector<CalHardwareMesh> & getVectorHardwareMesh();
00110 void getAmbientColor(unsigned char *pColorBuffer);
00111 void getDiffuseColor(unsigned char *pColorBuffer);
00112 void getSpecularColor(unsigned char *pColorBuffer);
00113 const CalQuaternion & getRotationBoneSpace(int boneId, CalSkeleton *pSkeleton);
00114 const CalVector & getTranslationBoneSpace(int boneId, CalSkeleton *pSkeleton);
00115
00116 float getShininess();
00117
00118 int getHardwareMeshCount();
00119 int getFaceCount();
00120 int getVertexCount();
00121 int getBoneCount();
00122
00123 int getBaseVertexIndex();
00124 int getStartIndex();
00125
00126 int getTotalFaceCount();
00127 int getTotalVertexCount();
00128
00129 Cal::UserData getMapUserData(int mapId);
00130
00131 bool selectHardwareMesh(int meshId);
00132
00133 private:
00134 bool canAddFace(CalHardwareMesh &hardwareMesh, CalCoreSubmesh::Face & face,std::vector<CalCoreSubmesh::Vertex>& vectorVertex, int maxBonesPerMesh);
00135 int addVertex(CalHardwareMesh &hardwareMesh, int indice , CalCoreSubmesh *pCoreSubmesh, int maxBonesPerMesh);
00136 int addBoneIndice(CalHardwareMesh &hardwareMesh, int Indice, int maxBonesPerMesh);
00137
00138 };
00139
00140 #endif
00141
00142