Ms3dLoader.cpp
上传用户:hkb425
上传日期:2007-06-16
资源大小:34191k
文件大小:10k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. // CMs3dLoader.cpp: implementation of the CMs3dLoader2 class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Ms3dLoader.h"
  6. #include "stdio.h"
  7. #include "texture.h"
  8. #include "cmath.h"
  9. //////////////////////////////////////////////////////////////////////
  10. // Construction/Destruction
  11. //////////////////////////////////////////////////////////////////////
  12. // File header
  13. /////////////////////////////////////////////
  14. CMs3dLoader::CMs3dLoader()
  15. {
  16. m_numMeshes = 0;
  17. m_pMeshes = NULL;
  18. m_numTriangles = 0;
  19. m_pTriangles = NULL;
  20. m_numVertices = 0;
  21. m_pVertices = NULL;
  22. m_numTexture=0;
  23. m_pTexture=NULL;
  24. }
  25. CMs3dLoader::~CMs3dLoader()
  26. {
  27. unsigned short i;
  28. for ( i = 0; i < m_numMeshes; i++ )
  29. delete[] m_pMeshes[i].m_pTriangleIndices;
  30. m_numMeshes = 0;
  31. if ( m_pMeshes != NULL )
  32. {
  33. delete[] m_pMeshes;
  34. m_pMeshes = NULL;
  35. }
  36. m_numTriangles = 0;
  37. if ( m_pTriangles != NULL )
  38. {
  39. delete [] m_pTriangles;
  40. m_pTriangles = NULL;
  41. }
  42. m_numVertices = 0;
  43. if ( m_pVertices != NULL )
  44. {
  45. delete [] m_pVertices;
  46. m_pVertices = NULL;
  47. }
  48. m_numTexture=0;
  49. if(m_pTexture != NULL)
  50. {
  51. delete [] m_pTexture;
  52. m_pTexture = NULL;
  53. }
  54. }
  55. bool CMs3dLoader::Load( const char *filename )
  56. {
  57. FILE* file;
  58. //Open the .ms3d model file
  59. if((file= fopen(filename, "rb"))==NULL)
  60. return false;
  61. MS3DHeader Header ;
  62. fread(&Header.m_ID, sizeof(char), 10, file);
  63. fread(&Header.m_version, sizeof(int), 1, file);
  64. if ( strncmp( Header.m_ID, "MS3D000000", 10 ) != 0 )
  65. MessageBox(NULL,"id error","ERROR",MB_OK|MB_ICONEXCLAMATION);
  66. fclose(file);
  67. return false; // "Not a valid Milkshape3D model file."
  68. }
  69. if ( Header.m_version < 3 ||Header.m_version > 4 )
  70. {
  71. MessageBox(NULL,"version error","ERROR",MB_OK|MB_ICONEXCLAMATION);
  72. fclose(file);
  73. return false; // "Unhandled file version. Only Milkshape3D Version 1.3 and 1.4 is supported." );
  74. }
  75. fread(&m_numVertices, sizeof(unsigned short), 1, file);
  76. m_pVertices = new Vertex[m_numVertices];
  77. MS3DVertex ms3dVertex;
  78. for (unsigned short i = 0; i < m_numVertices; i++ )
  79. {
  80.         fread( &ms3dVertex.m_flags,    sizeof(unsigned char),1,file);
  81.         fread(  ms3dVertex.m_vertex,   sizeof(float),        3,file);
  82.         fread( &ms3dVertex.m_refCount, sizeof(unsigned char),1,file);
  83.         fread( &ms3dVertex.m_boneID,   sizeof(char),         1,file);
  84.         /////////////data copy
  85. memcpy( m_pVertices[i].m_location, ms3dVertex.m_vertex, sizeof( float )*3 );
  86. ///////////////zoom
  87. m_pVertices[i].m_location[0] *=1.5f;
  88. m_pVertices[i].m_location[1] *=1.5f;
  89. m_pVertices[i].m_location[2] *=1.5f;
  90.   if(m_pVertices[i].m_location[0]>m_boundary.maxx)m_boundary.maxx=m_pVertices[i].m_location[0];
  91. if(m_pVertices[i].m_location[0]<m_boundary.minx)m_boundary.minx=m_pVertices[i].m_location[0];
  92. if(m_pVertices[i].m_location[1]>m_boundary.maxy)m_boundary.maxy=m_pVertices[i].m_location[1];
  93. if(m_pVertices[i].m_location[1]<m_boundary.miny)m_boundary.miny=m_pVertices[i].m_location[1];
  94. if(m_pVertices[i].m_location[2]>m_boundary.maxz)m_boundary.maxz=m_pVertices[i].m_location[2];
  95. if(m_pVertices[i].m_location[2]<m_boundary.minz)m_boundary.minz=m_pVertices[i].m_location[2];
  96. }
  97.     ///////////read Triangles///////////////////////////
  98.     fread(&m_numTriangles, sizeof(unsigned short), 1, file);
  99. m_pTriangles = new Triangle[m_numTriangles];
  100.     MS3DTriangle ms3dTriangle;
  101. CMath  cmath;
  102. for ( i = 0; i < m_numTriangles; i++ )
  103. {
  104.         fread(&ms3dTriangle.m_flags,            sizeof(unsigned short),   1, file);
  105.         fread( ms3dTriangle.m_vertexIndices,    sizeof(unsigned short),   3, file);
  106.         fread( ms3dTriangle.m_vertexNormals[0], sizeof(float), 3, file);
  107.         fread( ms3dTriangle.m_vertexNormals[1], sizeof(float), 3, file);
  108.         fread( ms3dTriangle.m_vertexNormals[2], sizeof(float), 3, file);
  109.         fread( ms3dTriangle.m_u,                sizeof(float), 3, file);
  110.         fread( ms3dTriangle.m_v,                sizeof(float), 3, file);
  111.   
  112.         fread(&ms3dTriangle.m_smoothingGroup,   sizeof(unsigned char), 1, file);
  113.         fread(&ms3dTriangle.m_groupIndex  ,     sizeof(unsigned char), 1, file);
  114.         //////////////////////////////////////////////////////////////////////
  115. int v1,v2,v3;
  116. v1=ms3dTriangle.m_vertexIndices[0];
  117. v2=ms3dTriangle.m_vertexIndices[1];
  118. v3=ms3dTriangle.m_vertexIndices[2];
  119.         NORMAL normal=cmath.GetNormal(m_pVertices[v1].m_location,
  120.                           m_pVertices[v2].m_location,
  121.               m_pVertices[v3].m_location);
  122. m_pTriangles[i].m_normal[0]=normal.nx;
  123. m_pTriangles[i].m_normal[1]=normal.ny;
  124. m_pTriangles[i].m_normal[2]=normal.nz;
  125. memcpy( m_pTriangles[i].m_u, ms3dTriangle.m_u, sizeof( float )*3 );
  126. memcpy( m_pTriangles[i].m_v, ms3dTriangle.m_v, sizeof( float )*3 );
  127. memcpy( m_pTriangles[i].m_vertexIndices, ms3dTriangle.m_vertexIndices, sizeof(unsigned short )*3 );
  128. }
  129.     //////////////read Meshes/////////////
  130.     fread(&m_numMeshes, sizeof(unsigned short), 1, file);
  131. m_pMeshes = new Mesh[m_numMeshes];
  132. MS3DMesh ms3dMesh ;
  133. ////////////allocate maximum memory : m_numTriangles
  134. ms3dMesh.m_TriangleIndices = new unsigned short [m_numTriangles];
  135. for ( i = 0; i < m_numMeshes; i++ )
  136. {
  137. fread(&ms3dMesh.m_flags,        sizeof(unsigned char), 1,  file);
  138. fread( ms3dMesh.m_name,         sizeof(char),          32, file);
  139. fread(&ms3dMesh.m_numTriangles, sizeof(unsigned short ),           1,  file);
  140. fread( ms3dMesh.m_TriangleIndices, sizeof(unsigned short), ms3dMesh.m_numTriangles, file);
  141. fread(&ms3dMesh.m_MaterialIndex, sizeof(char),  1, file);
  142.         //////////////////////copy data
  143. m_pMeshes[i].m_pTriangleIndices=new unsigned short [ms3dMesh.m_numTriangles];
  144. memcpy( m_pMeshes[i].m_pTriangleIndices,ms3dMesh.m_TriangleIndices, sizeof( unsigned short )*ms3dMesh.m_numTriangles );
  145.     m_pMeshes[i].m_textureIndex=ms3dMesh.m_MaterialIndex;
  146.     m_pMeshes[i].m_numTriangles=ms3dMesh.m_numTriangles;
  147. }
  148. delete [] ms3dMesh.m_TriangleIndices;
  149.     ////////////////read texture/////////////
  150.     fread(&m_numTexture, sizeof(unsigned short), 1, file);
  151. m_pTexture=new unsigned int[m_numTexture];
  152.     
  153. CTexture cTex;
  154.     
  155. MS3DMaterial ms3dMaterial;
  156. for ( i = 0; i < m_numTexture; i++ )
  157. {
  158.         fread( ms3dMaterial.m_name,            sizeof(char),   32, file);
  159.         fread( ms3dMaterial.m_ambient,         sizeof(float),   4, file);
  160.         fread( ms3dMaterial.m_diffuse,         sizeof(float),   4, file);
  161.         fread( ms3dMaterial.m_specular,        sizeof(float),   4, file);
  162.         fread( ms3dMaterial.m_emissive,        sizeof(float),   4, file);
  163.         fread(&ms3dMaterial.m_shininess,       sizeof(float),   1, file);
  164.         fread(&ms3dMaterial.m_transparency,    sizeof(float),   1, file);
  165.         fread(&ms3dMaterial.m_mode,            sizeof(char),    1, file);
  166.         fread( ms3dMaterial.m_texture,         sizeof(char),   128,file);
  167.         fread( ms3dMaterial.m_alphamap,        sizeof(char),   128,file);
  168.         
  169. if ( strncmp(ms3dMaterial.m_texture, ".\", 2 ) == 0 ) 
  170. {
  171. char texname[128];
  172. strcpy( texname, "model\ms3d\");
  173. strcpy( texname+11, ms3dMaterial.m_texture+2 );
  174.             char bmpname[128];
  175. int  n=0;
  176. while(texname[n] != '.' && texname[n] != ' ' && n<100)
  177. {
  178. bmpname[n]=texname[n];
  179. n++;
  180. }
  181. strcpy( &bmpname[n], ".bmp" );
  182.     if(!cTex.MakeTextureBind(bmpname,&m_pTexture[i]))
  183. return false;     
  184. }
  185. }
  186.     fclose(file);
  187. return true;
  188. }
  189. void CMs3dLoader::Render(NORMAL nView) 
  190. {
  191. glEnable(GL_TEXTURE_2D);
  192. for ( int i = 0; i < m_numMeshes; i++ )
  193. {
  194. glBindTexture(GL_TEXTURE_2D,m_pTexture[m_pMeshes[i].m_textureIndex] );    
  195. glBegin( GL_TRIANGLES );
  196. {
  197. for ( int j = 0; j < m_pMeshes[i].m_numTriangles; j++ )
  198. {
  199. int triangleIndex = m_pMeshes[i].m_pTriangleIndices[j];
  200. //              if(CheckVisible( nView,m_pTriangles[triangleIndex].m_normal))
  201. {
  202.     for ( int k = 0; k < 3; k++ )
  203. {
  204.      int index = m_pTriangles[triangleIndex].m_vertexIndices[k];
  205.     glNormal3fv( m_pTriangles[triangleIndex].m_normal );
  206.     glTexCoord2f( m_pTriangles[triangleIndex].m_u[k], m_pTriangles[triangleIndex].m_v[k] );
  207.     glVertex3fv( m_pVertices[index].m_location );
  208. }
  209. }
  210. }
  211. }
  212. glEnd();
  213. }
  214. }
  215. bool CMs3dLoader::CheckVisible(NORMAL n1,float *pCheck)
  216. {
  217. NORMAL n2=NORMAL(pCheck[0],pCheck[1],pCheck[2]);
  218. float temp;
  219. temp=n1.nx*n2.nx+n1.ny*n2.ny+n1.nz*n2.nz;
  220. if(temp>0)return false;
  221.     return true;
  222. }
  223. void CMs3dLoader::DrawBoundary()
  224. {
  225. glDisable(GL_TEXTURE_2D);
  226. glColor3f(1,1,1);
  227. glBegin(GL_LINE_STRIP);
  228.     glVertex3f(m_boundary.minx,m_boundary.miny,m_boundary.minz);
  229.     glVertex3f(m_boundary.maxx,m_boundary.miny,m_boundary.minz);
  230.     glVertex3f(m_boundary.maxx,m_boundary.miny,m_boundary.maxz);
  231.     glVertex3f(m_boundary.minx,m_boundary.miny,m_boundary.maxz);
  232.     glVertex3f(m_boundary.minx,m_boundary.miny,m_boundary.minz);
  233.     glVertex3f(m_boundary.minx,m_boundary.maxy,m_boundary.minz);
  234.     glVertex3f(m_boundary.maxx,m_boundary.maxy,m_boundary.minz);
  235.     glVertex3f(m_boundary.maxx,m_boundary.maxy,m_boundary.maxz);
  236.     glVertex3f(m_boundary.minx,m_boundary.maxy,m_boundary.maxz);
  237.     glVertex3f(m_boundary.minx,m_boundary.maxy,m_boundary.minz);
  238. glEnd();
  239. glBegin(GL_LINES);
  240.     glVertex3f(m_boundary.maxx,m_boundary.miny,m_boundary.minz);
  241.     glVertex3f(m_boundary.maxx,m_boundary.maxy,m_boundary.minz);
  242.     glVertex3f(m_boundary.maxx,m_boundary.miny,m_boundary.maxz);
  243.     glVertex3f(m_boundary.maxx,m_boundary.maxy,m_boundary.maxz);
  244.     glVertex3f(m_boundary.minx,m_boundary.miny,m_boundary.maxz);
  245.     glVertex3f(m_boundary.minx,m_boundary.maxy,m_boundary.maxz);
  246. glEnd();
  247. glColor3f(1,1,1);
  248. }