50 for ( i = 0; i < m_numMeshes; i++ )
51 delete[] m_pMeshes[i].m_pTriangleIndices;
52 for ( i = 0; i < m_numMaterials; i++ )
53 delete[] m_pMaterials[i].m_pTextureFilename;
56 if ( m_pMeshes != NULL )
63 if ( m_pMaterials != NULL )
65 delete[] m_pMaterials;
70 if ( m_pTriangles != NULL )
72 delete[] m_pTriangles;
77 if ( m_pVertices != NULL )
88 ifstream inputFile( filename, ios::in | ios::binary );
89 if ( inputFile.fail())
92 char pathTemp[PATH_MAX+1];
94 for ( pathLength = strlen( filename ); pathLength--; ) {
95 if ( filename[pathLength] ==
'/' || filename[pathLength] ==
'\\' ) {
99 strncpy( pathTemp, filename, pathLength );
101 inputFile.seekg( 0, ios::end );
102 long fileSize = (long)inputFile.tellg();
103 inputFile.seekg( 0, ios::beg );
105 char *pBuffer =
new char[fileSize];
106 inputFile.read( pBuffer, fileSize );
109 const char *pPtr = pBuffer;
113 if ( strncmp( pHeader->
m_ID,
"MS3D000000", 10 ) != 0 )
120 m_numVertices = nVertices;
121 m_pVertices =
new Vertex[nVertices];
125 for ( i = 0; i < nVertices; i++ )
129 memcpy( m_pVertices[i].m_location, pVertex->
m_vertex,
sizeof(
float )*3 );
134 m_numTriangles = nTriangles;
135 m_pTriangles =
new Triangle[nTriangles];
138 for ( i = 0; i < nTriangles; i++ )
142 float t[3] = { 1.0f-pTriangle->
m_t[0], 1.0f-pTriangle->
m_t[1], 1.0f-pTriangle->
m_t[2] };
143 memcpy( m_pTriangles[i].m_vertexNormals, pTriangle->
m_vertexNormals,
sizeof(
float )*3*3 );
144 memcpy( m_pTriangles[i].m_s, pTriangle->
m_s,
sizeof(
float )*3 );
145 memcpy( m_pTriangles[i].m_t, t,
sizeof(
float )*3 );
146 memcpy( m_pTriangles[i].m_vertexIndices, vertexIndices,
sizeof(
int )*3 );
153 m_numMeshes = nGroups;
154 m_pMeshes =
new Mesh[nGroups];
156 for ( i = 0; i < nGroups; i++ )
163 int *pTriangleIndices =
new int[nTriangles];
164 for (
int j = 0; j < nTriangles; j++ )
170 char materialIndex = *(
char* )pPtr;
171 pPtr +=
sizeof( char );
174 m_pMeshes[i].m_numTriangles = nTriangles;
175 m_pMeshes[i].m_pTriangleIndices = pTriangleIndices;
179 m_numMaterials = nMaterials;
180 m_pMaterials =
new Material[nMaterials];
182 for ( i = 0; i < nMaterials; i++ )
185 memcpy( m_pMaterials[i].m_ambient, pMaterial->
m_ambient,
sizeof(
float )*4 );
186 memcpy( m_pMaterials[i].m_diffuse, pMaterial->
m_diffuse,
sizeof(
float )*4 );
187 memcpy( m_pMaterials[i].m_specular, pMaterial->
m_specular,
sizeof(
float )*4 );
188 memcpy( m_pMaterials[i].m_emissive, pMaterial->
m_emissive,
sizeof(
float )*4 );
189 m_pMaterials[i].m_shininess = pMaterial->
m_shininess;
190 if ( strncmp( pMaterial->
m_texture,
".\\", 2 ) == 0 ) {
192 strcpy( pathTemp + pathLength, pMaterial->
m_texture + 1 );
193 m_pMaterials[i].m_pTextureFilename =
new char[strlen( pathTemp )+1];
194 strcpy( m_pMaterials[i].m_pTextureFilename, pathTemp );
198 m_pMaterials[i].m_pTextureFilename =
new char[strlen( pMaterial->
m_texture )+1];
199 strcpy( m_pMaterials[i].m_pTextureFilename, pMaterial->
m_texture );
215 GLboolean texEnabled = glIsEnabled( GL_TEXTURE_2D );
216 static bool once=
true;
221 for (
int i = 0; i < m_numMeshes; i++ )
223 int materialIndex = m_pMeshes[i].m_materialIndex;
224 if ( materialIndex >= 0 )
235 glBindTexture( GL_TEXTURE_2D,
Texture[TextureNumber]);
236 glEnable( GL_TEXTURE_2D );
243 glDisable( GL_TEXTURE_2D );
246 if (wireframed) glBegin( GL_LINES );
247 else glBegin( GL_TRIANGLES );
249 for (
int j = 0; j < m_pMeshes[i].m_numTriangles; j++ )
251 int triangleIndex = m_pMeshes[i].m_pTriangleIndices[j];
252 const Triangle* pTri = &m_pTriangles[triangleIndex];
254 for (
int k = 0; k < 3; k++ )
259 glTexCoord2f( pTri->
m_s[k], pTri->
m_t[k] );
260 glVertex3fv( m_pVertices[index].m_location );
268 glEnable( GL_TEXTURE_2D );
270 glDisable( GL_TEXTURE_2D );
272 glDisable( GL_TEXTURE_2D );
279 for (
int i = 0; i < m_numMaterials; i++ )
281 if ( strlen( m_pMaterials[i].m_pTextureFilename ) > 0 )
292 m_pMaterials[i].m_texture = 0;
This file deals with the loading of 3D objects into the simulator.
bool loadModelData(const char *filename)
void draw(bool wireframed, int TextureNumber)
unsigned int Texture[200]
ms3d::word m_vertexIndices[3]
float m_vertexNormals[3][3]
float m_vertexNormals[3][3]