Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

167 lines
4.3 KiB

  1. /**
  2. ** File : sglmesh.cxx
  3. ** Description: Implementations of CSGlMesh class
  4. **/
  5. #include "precomp.h"
  6. #pragma hdrstop
  7. #include "sglmesh.h"
  8. #include "pmerrors.h"
  9. /**************************************************************************/
  10. /*
  11. * CSimpGlMesh: Constructor
  12. */
  13. CSimpGlMesh::CSimpGlMesh()
  14. {
  15. m_varray = NULL;
  16. m_narray = NULL;
  17. m_tarray = NULL;
  18. m_farray = NULL;
  19. m_wedgelist = NULL;
  20. m_matArray = NULL;
  21. m_matcnt = NULL;
  22. m_matpos = NULL;
  23. m_userWedgeSize = 0;
  24. m_userWedge = NULL;
  25. m_userVertexSize = 0;
  26. m_userVertex = NULL;
  27. m_userFaceSize = 0;
  28. m_userFace = NULL;
  29. m_numFaces = 0;
  30. m_numWedges = 0;
  31. m_numVerts = 0;
  32. m_numMaterials = 0;
  33. m_numTextures = 0;
  34. }
  35. /*
  36. * CSimpGlMesh: Destructor
  37. */
  38. CSimpGlMesh::~CSimpGlMesh()
  39. {
  40. delete [] m_varray;
  41. delete [] m_narray;
  42. delete [] m_tarray;
  43. delete [] m_matArray;
  44. delete [] m_wedgelist;
  45. delete [] m_userWedge;
  46. delete [] m_userVertex;
  47. delete [] m_userFace;
  48. delete [] m_matArray;
  49. delete [] m_matcnt;
  50. delete [] m_matpos;
  51. }
  52. /*
  53. * CSimpGlMesh: Print
  54. */
  55. HRESULT CSimpGlMesh::Print(ostream& os)
  56. {
  57. os << "\n\nMaterials:";
  58. for (int i=0; i<m_numMaterials; ++i)
  59. {
  60. LPGLmaterial lpglm = &m_matArray[i];
  61. os << "\n\nMaterial [" << i << "] :";
  62. os << "\nShininess : " << lpglm->shininess;
  63. os << "\nDiffuse : (" << lpglm->diffuse.r << ", "
  64. << lpglm->diffuse.g << ", "
  65. << lpglm->diffuse.b << ", "
  66. << lpglm->diffuse.a << ")";
  67. os << "\nSpecular : (" << lpglm->specular.r << ", "
  68. << lpglm->specular.g << ", "
  69. << lpglm->specular.b << ", "
  70. << lpglm->specular.a << ")";
  71. os << "\nEmissive : (" << lpglm->emissive.r << ", "
  72. << lpglm->emissive.g << ", "
  73. << lpglm->emissive.b << ", "
  74. << lpglm->emissive.a << ")";
  75. os << "\nNumber of faces: " << m_matcnt[i];
  76. for (int j=0; j< m_matcnt[i]; j++)
  77. {
  78. #ifdef __MATPOS_IS_A_PTR
  79. os << "\n(" << m_matpos[i][j].w[0] << ","
  80. << (m_matpos[i][j]).w[1] << ","
  81. << (m_matpos[i][j]).w[2] << ")";
  82. #else
  83. os << "\n(" << (m_farray[m_matpos[i] + j]).w[0] << ","
  84. << (m_farray[m_matpos[i] + j]).w[0] << ","
  85. << (m_farray[m_matpos[i] + j]).w[0] << ")";
  86. #endif
  87. }
  88. }
  89. os << "\n\nWedge connectivity:";
  90. for (i=0; i<m_numWedges; ++i)
  91. {
  92. os << "\n" << m_wedgelist[i];
  93. }
  94. os << "\n\nWedge data:";
  95. for (i=0; i<m_numWedges; ++i)
  96. {
  97. os << "\n(" << m_varray[i].x << ", "
  98. << m_varray[i].y << ", "
  99. << m_varray[i].z << ") "
  100. << " (" << m_narray[i].x << ", "
  101. << m_narray[i].y << ", "
  102. << m_narray[i].z << ") "
  103. << " (" << m_tarray[i].s << ", "
  104. << m_tarray[i].t << ") ";
  105. }
  106. return S_OK;
  107. }
  108. /*
  109. * CSimpGlMesh: RenderMesh
  110. */
  111. HRESULT CSimpGlMesh::RenderMesh(RenderType rt)
  112. {
  113. if (rt == GLPM_SOLID)
  114. {
  115. glVertexPointer(3, GL_FLOAT, 0, (void *)&(m_varray[0].x));
  116. glNormalPointer (GL_FLOAT, 0, (void *)&(m_narray[0].x));
  117. glTexCoordPointer (2, GL_FLOAT, 0, (void *)&(m_tarray[0].s));
  118. glEnableClientState (GL_VERTEX_ARRAY);
  119. glEnableClientState (GL_NORMAL_ARRAY);
  120. for (int i=0; i<m_numMaterials; i++)
  121. {
  122. LPGLmaterial lpglm = &(m_matArray[i]);
  123. if (m_matcnt[i] == (WORD) 0) continue;
  124. glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, lpglm->shininess);
  125. glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,
  126. (GLfloat *) &(lpglm->specular));
  127. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE,
  128. (GLfloat *) &(lpglm->diffuse));
  129. glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION,
  130. (GLfloat *) &(lpglm->emissive));
  131. glDrawElements (GL_TRIANGLES, (GLuint) m_matcnt[i]*3,
  132. GL_UNSIGNED_SHORT,
  133. (void *) &(m_farray[m_matpos[i]]));
  134. }
  135. return S_OK;
  136. }
  137. else
  138. {
  139. return E_NOTIMPL;
  140. }
  141. }