MODEL.CPP
Upload User: nthssl
Upload Date: 2022-04-05
Package Size: 25357k
Code Size: 5k
Category:

OpenCV

Development Platform:

Visual C++

  1. // Model.cpp: implementation of the Model class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Terrain3DTest.h"
  6. #include "Model.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. Model::Model()
  16. {
  17. m_numMeshes = 0;
  18. m_pMeshes = NULL;
  19. m_numMaterials = 0;
  20. m_pMaterials = NULL;
  21. m_numTriangles = 0;
  22. m_pTriangles = NULL;
  23. m_numVertices = 0;
  24. m_pVertices = NULL;
  25. }
  26. Model::~Model()
  27. {
  28. int i;
  29. for ( i = 0; i < m_numMeshes; i++ )
  30. delete[] m_pMeshes[i].m_pTriangleIndices;
  31. for ( i = 0; i < m_numMaterials; i++ )
  32. delete[] m_pMaterials[i].m_pTextureFilename;
  33. m_numMeshes = 0;
  34. if ( m_pMeshes != NULL )
  35. {
  36. delete[] m_pMeshes;
  37. m_pMeshes = NULL;
  38. }
  39. m_numMaterials = 0;
  40. if ( m_pMaterials != NULL )
  41. {
  42. delete[] m_pMaterials;
  43. m_pMaterials = NULL;
  44. }
  45. m_numTriangles = 0;
  46. if ( m_pTriangles != NULL )
  47. {
  48. delete[] m_pTriangles;
  49. m_pTriangles = NULL;
  50. }
  51. m_numVertices = 0;
  52. if ( m_pVertices != NULL )
  53. {
  54. delete[] m_pVertices;
  55. m_pVertices = NULL;
  56. }
  57. }
  58. void Model::draw() 
  59. {
  60. GLboolean texEnabled = glIsEnabled( GL_TEXTURE_2D );
  61. // Draw by group
  62. for ( int i = 0; i < m_numMeshes; i++ )
  63. {
  64. int materialIndex = m_pMeshes[i].m_materialIndex;
  65. if ( materialIndex >= 0 )
  66. {
  67. glMaterialfv( GL_FRONT, GL_AMBIENT, m_pMaterials[materialIndex].m_ambient );
  68. glMaterialfv( GL_FRONT, GL_DIFFUSE, m_pMaterials[materialIndex].m_diffuse );
  69. glMaterialfv( GL_FRONT, GL_SPECULAR, m_pMaterials[materialIndex].m_specular );
  70. glMaterialfv( GL_FRONT, GL_EMISSION, m_pMaterials[materialIndex].m_emissive );
  71. glMaterialf( GL_FRONT, GL_SHININESS, m_pMaterials[materialIndex].m_shininess );
  72. if ( m_pMaterials[materialIndex].m_texture > 0 )
  73. {
  74. glBindTexture( GL_TEXTURE_2D, m_pMaterials[materialIndex].m_texture );
  75. glEnable( GL_TEXTURE_2D );
  76. }
  77. else
  78. glDisable( GL_TEXTURE_2D );
  79. }
  80. else
  81. {
  82. // Material properties?
  83. glDisable( GL_TEXTURE_2D );
  84. }
  85. glBegin( GL_TRIANGLES );
  86. {
  87. for ( int j = 0; j < m_pMeshes[i].m_numTriangles; j++ )
  88. {
  89. int triangleIndex = m_pMeshes[i].m_pTriangleIndices[j];
  90. const Triangle* pTri = &m_pTriangles[triangleIndex];
  91. for ( int k = 0; k < 3; k++ )
  92. {
  93. int index = pTri->m_vertexIndices[k];
  94. glNormal3fv( pTri->m_vertexNormals[k] );
  95. glTexCoord2f( pTri->m_s[k], pTri->m_t[k] );
  96. glVertex3fv( m_pVertices[index].m_location );
  97. }
  98. }
  99. }
  100. glEnd();
  101. }
  102. if ( texEnabled )
  103. glEnable( GL_TEXTURE_2D );
  104. else
  105. glDisable( GL_TEXTURE_2D );
  106. }
  107. GLuint Model::makeDisplayList() 
  108. {
  109. GLuint List = glGenLists(1); 
  110. glNewList(List,GL_COMPILE); // Start With The Box List
  111. GLboolean texEnabled = glIsEnabled( GL_TEXTURE_2D );
  112. // Draw by group
  113. for ( int i = 0; i < m_numMeshes; i++ )
  114. {
  115. int materialIndex = m_pMeshes[i].m_materialIndex;
  116. if ( materialIndex >= 0 )
  117. {
  118. glMaterialfv( GL_FRONT, GL_AMBIENT, m_pMaterials[materialIndex].m_ambient );
  119. glMaterialfv( GL_FRONT, GL_DIFFUSE, m_pMaterials[materialIndex].m_diffuse );
  120. glMaterialfv( GL_FRONT, GL_SPECULAR, m_pMaterials[materialIndex].m_specular );
  121. glMaterialfv( GL_FRONT, GL_EMISSION, m_pMaterials[materialIndex].m_emissive );
  122. glMaterialf( GL_FRONT, GL_SHININESS, m_pMaterials[materialIndex].m_shininess );
  123. if ( m_pMaterials[materialIndex].m_texture > 0 )
  124. {
  125. glBindTexture( GL_TEXTURE_2D, m_pMaterials[materialIndex].m_texture );
  126. glEnable( GL_TEXTURE_2D );
  127. }
  128. else
  129. glDisable( GL_TEXTURE_2D );
  130. }
  131. else
  132. {
  133. // Material properties?
  134. glDisable( GL_TEXTURE_2D );
  135. }
  136. glBegin( GL_TRIANGLES );
  137. {
  138. for ( int j = 0; j < m_pMeshes[i].m_numTriangles; j++ )
  139. {
  140. int triangleIndex = m_pMeshes[i].m_pTriangleIndices[j];
  141. const Triangle* pTri = &m_pTriangles[triangleIndex];
  142. for ( int k = 0; k < 3; k++ )
  143. {
  144. int index = pTri->m_vertexIndices[k];
  145. glNormal3fv( pTri->m_vertexNormals[k] );
  146. glTexCoord2f( pTri->m_s[k], pTri->m_t[k] );
  147. glVertex3fv( m_pVertices[index].m_location );
  148. }
  149. }
  150. }
  151. glEnd();
  152. }
  153. if ( texEnabled )
  154. glEnable( GL_TEXTURE_2D );
  155. else
  156. glDisable( GL_TEXTURE_2D );
  157.     glEndList();
  158. return List;
  159. }
  160. void Model::reloadTextures()
  161. {
  162. for ( int i = 0; i < m_numMaterials; i++ )
  163. if ( strlen( m_pMaterials[i].m_pTextureFilename ) > 0 )
  164. m_pMaterials[i].m_texture = m_texture.LoadGLTexture( m_pMaterials[i].m_pTextureFilename );
  165. else
  166. m_pMaterials[i].m_texture = 0;
  167. }