D:/Zythum/DinoKod/Model/MdlMesh.h

00001 //---------------------------------------------------------------------------------------------
00002 //      This file is a part of "DinoKod".
00003 //      Copyright © 2003 Dino Productions. All Rights Reserved.
00004 //      
00005 //      File                    : MdlMesh.h
00006 //      Author                  : Sebastien LEIX        sebastien.leix@wanadoo.fr
00007 //      Date                    : 09/09/2002
00008 //      Modification    :
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;                    // Inutile de sauvegarder pour le moment
00163         KMdlFrameVertex**                       m_pFastFrameVertex;             // Inutile de sauvegarder pour le moment
00164         KVertex*                                        m_pTranformedVertices;  // Inutile de sauvegarder pour le moment
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;         // Inutile de sauvegarder pour le moment
00252         u32                                                     m_MaxFrame;                     // Inutile de sauvegarder pour le moment
00253         KMdlFrameMatrix**                       m_pFastFrameMatrix;     // Inutile de sauvegarder pour le moment
00254         u32                                                     m_CurrentFrame;         // Inutile de sauvegarder pour le moment
00255         KMatrix                                         m_BlendMatrix;          // Inutile de sauvegarder pour le moment
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 

Generated on Sun Mar 25 20:02:15 2007 for Zythum Project by  doxygen 1.5.1-p1