00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef __MDLMESH_H__
00012 #define __MDLMESH_H__
00013
00014 #include "Model/ModelDll.h"
00015 #include "Common/Types.h"
00016 #include "Common/Vertex.h"
00017 #include "Common/File.h"
00018 #include "Common/Error.h"
00019 #include "Common/Table.h"
00020 #include "Common/Matrix.h"
00021 #include "Common/List.h"
00022
00023 #define MAGIC_MESH "MSH"
00024 #define MAGIC_PRIMITIVE "PRI"
00025 #define MAGIC_VERTEX "VTX"
00026
00027 #define WRITEMAGIC( __magic ) \
00028 KStr Magic( __magic ); \
00029 File.WriteString( Magic );
00030
00031 #define TESTMAGIC( __magic ) \
00032 KStr Magic; \
00033 File.ReadString( Magic ); \
00034 if( Magic != KStr( __magic ) ) \
00035 KError::FatalError( NULL, "KMdlMesh::Load(...) : Bad magic %s, file corrupted", __magic );
00036
00037 class KMdlMesh;
00038
00039
00040 typedef enum _KMODELMESHTYPE
00041 {
00042 KMMT_MESH,
00043 KMMT_BONE,
00044 KMMT_DUMMY
00045 } KMODELMESHTYPE;
00046
00047
00048 class MODEL_API KMdlShader
00049 {
00050 public:
00051 char* m_pShaderName;
00052 };
00053
00054
00055 class MODEL_API KMdlVertex : public KBVertex
00056 {
00057 public:
00058 void Save( KFile& File )
00059 {
00060 File << m_Position.x;
00061 File << m_Position.y;
00062 File << m_Position.z;
00063 File << m_Normal.x;
00064 File << m_Normal.y;
00065 File << m_Normal.z;
00066
00067 for( u32 i = 0; i < KBVERTEX_NUNBLENDWEIGHT; i ++ )
00068 File << m_Weight[i];
00069
00070 for( u32 i = 0; i < KBVERTEX_NUNBLENDWEIGHT; i ++ )
00071 File << m_Indices[i];
00072
00073 File << m_TU;
00074 File << m_TV;
00075 }
00076
00077 void Load( KFile& File )
00078 {
00079 File >> m_Position.x;
00080 File >> m_Position.y;
00081 File >> m_Position.z;
00082 File >> m_Normal.x;
00083 File >> m_Normal.y;
00084 File >> m_Normal.z;
00085
00086 m_Normal.Normalize();
00087
00088 for( u32 i = 0; i < KBVERTEX_NUNBLENDWEIGHT; i ++ )
00089 File >> m_Weight[i];
00090
00091 for( u32 i = 0; i < KBVERTEX_NUNBLENDWEIGHT; i ++ )
00092 File >> m_Indices[i];
00093
00094 File >> m_TU;
00095 File >> m_TV;
00096 }
00097 };
00098
00099
00100 class MODEL_API KMdlFrameVertex
00101 {
00102 public:
00103 u32 m_FrameId;
00104 u16 m_nVertices;
00105 KMdlVertex* m_pVertices;
00106
00107 KMdlFrameVertex()
00108 {
00109 m_FrameId = 0;
00110 m_nVertices = 0;
00111 m_pVertices = NULL;
00112 }
00113
00114 ~KMdlFrameVertex()
00115 {
00116 if( m_pVertices ) Deletev( m_pVertices );
00117 }
00118
00119 void Save( KFile& File )
00120 {
00121 WRITEMAGIC( MAGIC_VERTEX );
00122 File << m_FrameId;
00123 File << m_nVertices;
00124
00125 u32 VertexId;
00126 for( VertexId = 0; VertexId < m_nVertices; VertexId ++ )
00127 m_pVertices[VertexId].Save( File );
00128 }
00129
00130 void Load( KFile& File )
00131 {
00132 TESTMAGIC( MAGIC_VERTEX );
00133 File >> m_FrameId;
00134 File >> m_nVertices;
00135
00136 if( m_nVertices )
00137 {
00138 m_pVertices = new KMdlVertex[m_nVertices];
00139
00140 u32 VertexId;
00141 for( VertexId = 0; VertexId < m_nVertices; VertexId ++ )
00142 m_pVertices[VertexId].Load( File );
00143 }
00144 }
00145
00146 void GenerateBlendList()
00147 {
00148
00149 }
00150 };
00151
00152
00153 class MODEL_API KMdlPrimitive
00154 {
00155 public:
00156 u32 m_ShaderId;
00157 u16 m_nIndices;
00158 u16* m_pIndices;
00159 u16 m_nVertices;
00160 u32 m_nFrames;
00161 KTable<KMdlFrameVertex*> m_FrameVertices;
00162 u32 m_MaxFrames;
00163 KMdlFrameVertex** m_pFastFrameVertex;
00164 KVertex* m_pTranformedVertices;
00165
00166 KMdlPrimitive();
00167 ~KMdlPrimitive();
00168
00169 void Free();
00170 void Save( KFile& File );
00171 void Load( KFile& File );
00172
00173 KMdlFrameVertex* GetSlowFrameVertex( u32 Frame );
00174 void GenerateFastFrameVertex();
00175 KMdlFrameVertex* GetFrameVertex( u32 Frame );
00176 };
00177
00178
00179 class MODEL_API KMdlFrameMatrix
00180 {
00181 public:
00182 u32 m_FrameId;
00183 KMatrix m_Matrix;
00184
00185 KMdlFrameMatrix()
00186 {
00187 m_FrameId = 0;
00188 }
00189
00190 void Save( KFile& File )
00191 {
00192 File << m_FrameId;
00193 File << m_Matrix;
00194 }
00195
00196 void Load( KFile& File )
00197 {
00198 File >> m_FrameId;
00199 File >> m_Matrix;
00200 }
00201 };
00202
00203
00204 class MODEL_API KMdlBone
00205 {
00206 public:
00207 KStr m_Name;
00208 KMdlMesh* m_pBone;
00209
00210 KMdlBone()
00211 {
00212 m_pBone = NULL;
00213 }
00214
00215 void Save( KFile& File )
00216 {
00217 File.WriteString( m_Name );
00218 }
00219
00220 void Load( KFile& File )
00221 {
00222 File.ReadString( m_Name );
00223 m_pBone = NULL;
00224 }
00225 };
00226
00227
00228 typedef enum _KMDLMESHRENDEREFFECT
00229 {
00230 KMMRE_NORMAL,
00231 KMMRE_NORMALWIREFRAME
00232 } KMDLMESHRENDEREFFECT;
00233
00234
00235 class MODEL_API KMdlMesh
00236 {
00237 private:
00238 KTable<KMdlPrimitive*> m_Primitives;
00239 KTable<KMdlFrameMatrix*> m_FrameMatrix;
00240 KList<KMdlMesh*> m_pChildrens;
00241 KTable<KMdlBone*> m_Bones;
00242
00243 public:
00244 KStr m_Name;
00245 KStr m_FatherName;
00246 KMdlMesh* m_pFather;
00247 KMODELMESHTYPE m_Type;
00248
00249 KMatrix m_FirstWorldMatrix;
00250 KMatrix m_CurrentWorldMatrix;
00251 KMDLMESHRENDEREFFECT m_RenderEffect;
00252 u32 m_MaxFrame;
00253 KMdlFrameMatrix** m_pFastFrameMatrix;
00254 u32 m_CurrentFrame;
00255 KMatrix m_BlendMatrix;
00256
00257 KMdlMesh();
00258 ~KMdlMesh();
00259
00260 void Save( KFile& File );
00261 void Load( KFile& File, s32 EndFrame );
00262 KMdlFrameMatrix* GetSlowFrameMatrix( u32 Frame );
00263 void GenerateFastFrameMatrix();
00264
00265 KMdlFrameMatrix* GetFrameMatrix( u32 Frame )
00266 {
00267 KASSERT( Frame >= 0 );
00268 KASSERT( Frame <= m_MaxFrame );
00269 KASSERT( m_pFastFrameMatrix );
00270 return m_pFastFrameMatrix[Frame];
00271 }
00272
00273 void SetFrame( u32 Frame )
00274 {
00275 KASSERT( Frame >= 0 );
00276 KASSERT( Frame <= m_MaxFrame );
00277 m_CurrentFrame = Frame;
00278 }
00279
00280 static void SetMeshFrame( KMdlMesh* pMesh, u32 Frame, bool bInherit );
00281
00282 void AddpChild( KMdlMesh* pChild ) { m_pChildrens.Add( pChild ); }
00283 void ClearChilds() { m_pChildrens.Clear(); }
00284 KMdlMesh* GetpFirstChild() { return m_pChildrens.GetFirst(); }
00285 KMdlMesh* GetpNextChild( KMdlMesh* pChild ) { return m_pChildrens.GetNext( pChild );}
00286
00287 void AddpBone( KMdlBone* pBone ) { m_Bones.Add( pBone ); }
00288 KMdlBone* GetpBone( u32 BoneId ) { return m_Bones[BoneId]; }
00289 u32 GetnBones() { return m_Bones.GetSize(); }
00290
00291 void AddpPrimitive( KMdlPrimitive* pPrimitive ) { m_Primitives.Add( pPrimitive ); }
00292 KMdlPrimitive* GetpPrimitive( u32 PrimitiveId ) { return m_Primitives[PrimitiveId]; }
00293 u32 GetnPrimitives() { return m_Primitives.GetSize(); }
00294
00295 void AddpFrameMatrix( KMdlFrameMatrix* pFrameMatrix ) { m_FrameMatrix.Add( pFrameMatrix ); }
00296 };
00297
00298 #endif __MDLMESH_H__
00299