- Timestamp:
- May 10, 2005, 11:16:39 AM (20 years ago)
- Location:
- orxonox/branches/md2_loader/src
- Files:
-
- 2 edited
-
lib/graphics/importer/md2Model.cc (modified) (5 diffs)
-
story_entities/world.cc (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
orxonox/branches/md2_loader/src/lib/graphics/importer/md2Model.cc
r4138 r4140 32 32 \brief standard constructor 33 33 34 creates a new model34 creates a new model 35 35 */ 36 36 MD2Model::MD2Model () 37 37 { 38 this->setClassName ("MD2Model");38 this->setClassName ("MD2Model"); 39 39 } 40 40 … … 50 50 51 51 /** 52 \brief draw function52 \brief draw function 53 53 54 these function will take NO argument in the final version, just for testing54 these function will take NO argument in the final version, just for testing 55 55 */ 56 56 void MD2Model::draw(t3DModel *pModel) 57 57 { 58 if( pModel->objectList->getSize() <= 0) return;59 60 t3DObject *pObject = pModel->objectList->firstElement();61 glBegin(GL_TRIANGLES);62 for(int j = 0; j < pObject->numOfFaces; j++)63 {64 for(int whichVertex = 0; whichVertex < 3; whichVertex++)65 {66 int index = pObject->pFaces[j].vertIndex[whichVertex];67 int index2 = pObject->pFaces[j].coordIndex[whichVertex];68 /* we invert the normals since the md2 file format uses different style */69 glNormal3f(-pObject->pNormals[ index ].x, -pObject->pNormals[ index ].y, -pObject->pNormals[ index ].z);70 if(pObject->pTexVerts)71 {72 glTexCoord2f(pObject->pTexVerts[ index2 ].x, pObject->pTexVerts[ index2 ].y);73 }74 glVertex3f(pObject->pVerts[ index ].x, pObject->pVerts[ index ].y, pObject->pVerts[ index ].z);75 }76 }77 glEnd();58 if( pModel->objectList->getSize() <= 0) return; 59 60 t3DObject *pObject = pModel->objectList->firstElement(); 61 glBegin(GL_TRIANGLES); 62 for(int j = 0; j < pObject->numOfFaces; j++) 63 { 64 for(int whichVertex = 0; whichVertex < 3; whichVertex++) 65 { 66 int index = pObject->pFaces[j].vertIndex[whichVertex]; 67 int index2 = pObject->pFaces[j].coordIndex[whichVertex]; 68 /* we invert the normals since the md2 file format uses different style */ 69 glNormal3f(-pObject->pNormals[ index ].x, -pObject->pNormals[ index ].y, -pObject->pNormals[ index ].z); 70 if(pObject->pTexVerts) 71 { 72 glTexCoord2f(pObject->pTexVerts[ index2 ].x, pObject->pTexVerts[ index2 ].y); 73 } 74 glVertex3f(pObject->pVerts[ index ].x, pObject->pVerts[ index ].y, pObject->pVerts[ index ].z); 75 } 76 } 77 glEnd(); 78 78 } 79 79 … … 84 84 /** 85 85 \brief standard deconstructor 86 creates a new model loader86 creates a new model loader 87 87 */ 88 88 MD2Loader::MD2Loader() 89 89 { 90 this->setClassName ("MD2Loader");91 /* initialize all data to initial state */92 memset(&this->header, 0, sizeof(tMd2Header));93 this->pSkins = NULL;94 this->pTexCoords = NULL;95 this->pTriangles = NULL;96 this->pFrames = NULL;90 this->setClassName ("MD2Loader"); 91 /* initialize all data to initial state */ 92 memset(&this->header, 0, sizeof(tMd2Header)); 93 this->pSkins = NULL; 94 this->pTexCoords = NULL; 95 this->pTriangles = NULL; 96 this->pFrames = NULL; 97 97 } 98 98 … … 105 105 106 106 /** 107 \brief this is called by the client to open the .Md2 file, read it, then clean up108 \param model to load in109 \param file name to load110 \param texture name to load107 \brief this is called by the client to open the .Md2 file, read it, then clean up 108 \param model to load in 109 \param file name to load 110 \param texture name to load 111 111 */ 112 112 bool MD2Loader::importMD2(t3DModel *pModel, char *fileName, char *textureName) 113 113 { 114 this->pFile = fopen(fileName, "rb");115 if( unlikely(!pFile))116 {117 PRINTF(1)("Couldn't open the MD2 File for loading. Exiting.\n");118 return false;119 }120 fread(&this->header, 1, sizeof(tMd2Header), pFile);121 /* check for the header version: make sure its a md2 file :) */122 if( likely(this->header.version != 8))123 {124 PRINTF(1)("Couldn't load file %s: invalid file format: stop loading\n", fileName);125 return false;126 }114 this->pFile = fopen(fileName, "rb"); 115 if( unlikely(!pFile)) 116 { 117 PRINTF(1)("Couldn't open the MD2 File for loading. Exiting.\n"); 118 return false; 119 } 120 fread(&this->header, 1, sizeof(tMd2Header), pFile); 121 /* check for the header version: make sure its a md2 file :) */ 122 if( likely(this->header.version != 8)) 123 { 124 PRINTF(1)("Couldn't load file %s: invalid file format: stop loading\n", fileName); 125 return false; 126 } 127 127 128 this->readMD2Data();129 this->convertDataStructures(pModel);130 131 if( likely((int)textureName))132 {133 tMaterialInfo* textureInfo = new tMaterialInfo;134 strcpy(textureInfo->strFile, textureName);135 /* since there is only one texture for a .Md2 file, the ID is always 0 */136 textureInfo->texureId = 0;137 textureInfo->uTile = 1;138 /* we only have 1 material for a model */139 pModel->numOfMaterials = 1;140 pModel->materialList->add(textureInfo);141 }128 this->readMD2Data(); 129 this->convertDataStructures(pModel); 130 131 if( likely((int)textureName)) 132 { 133 tMaterialInfo* textureInfo = new tMaterialInfo; 134 strcpy(textureInfo->strFile, textureName); 135 /* since there is only one texture for a .Md2 file, the ID is always 0 */ 136 textureInfo->texureId = 0; 137 textureInfo->uTile = 1; 138 /* we only have 1 material for a model */ 139 pModel->numOfMaterials = 1; 140 pModel->materialList->add(textureInfo); 141 } 142 142 143 this->cleanUp();144 return true;145 } 146 147 /** 148 \brief This function reads in all of the model's data, except the animation frames143 this->cleanUp(); 144 return true; 145 } 146 147 /** 148 \brief This function reads in all of the model's data, except the animation frames 149 149 */ 150 150 void MD2Loader::readMD2Data() 151 151 { 152 unsigned char buffer[MD2_MAX_FRAMESIZE];153 this->pSkins = new tMd2Skin[this->header.numSkins];154 this->pTexCoords = new tMd2TexCoord[this->header.numTexCoords];155 this->pTriangles = new tMd2Face[this->header.numTriangles];156 this->pFrames = new tMd2Frame[this->header.numFrames];157 158 /* we read the skins */159 fseek(this->pFile, this->header.offsetSkins, SEEK_SET);160 fread(this->pSkins, sizeof(tMd2Skin), this->header.numSkins, this->pFile);161 /* read all vertex data */162 fseek(this->pFile, this->header.offsetTexCoords, SEEK_SET);163 fread(this->pTexCoords, sizeof(tMd2TexCoord), this->header.numTexCoords, this->pFile);164 /* read face data for each triangle (normals) */165 fseek(this->pFile, this->header.offsetTriangles, SEEK_SET);166 fread(this->pTriangles, sizeof(tMd2Face), this->header.numTriangles, this->pFile);167 /* reading all frame data */168 fseek(this->pFile, this->header.offsetFrames, SEEK_SET);169 for(int i = 0; i < this->header.numFrames; i++)170 {171 tMd2AliasFrame *pFrame = (tMd2AliasFrame *) buffer;172 this->pFrames[i].pVertices = new tMd2Triangle [this->header.numVertices];173 174 /* read the frame animation data */175 fread(pFrame, 1, this->header.frameSize, this->pFile);176 strcpy(this->pFrames[i].strName, pFrame->name);177 tMd2Triangle *pVertices = this->pFrames[i].pVertices;178 /*179 scale translations, store vertices: since id used a non-opengl xyz notation, we have to swap y and z180 and negate z axis181 */182 for(int j = 0; j < this->header.numVertices; j++)183 {184 pVertices[j].vertex[0] = pFrame->aliasVertices[j].vertex[0] * pFrame->scale[0] + pFrame->translate[0];185 pVertices[j].vertex[2] = -1 * (pFrame->aliasVertices[j].vertex[1] * pFrame->scale[1] + pFrame->translate[1]);186 pVertices[j].vertex[1] = pFrame->aliasVertices[j].vertex[2] * pFrame->scale[2] + pFrame->translate[2];187 }188 }189 } 190 191 /** 192 \brief this function fills in the animation list for each animation by name and frame193 \param model152 unsigned char buffer[MD2_MAX_FRAMESIZE]; 153 this->pSkins = new tMd2Skin[this->header.numSkins]; 154 this->pTexCoords = new tMd2TexCoord[this->header.numTexCoords]; 155 this->pTriangles = new tMd2Face[this->header.numTriangles]; 156 this->pFrames = new tMd2Frame[this->header.numFrames]; 157 158 /* we read the skins */ 159 fseek(this->pFile, this->header.offsetSkins, SEEK_SET); 160 fread(this->pSkins, sizeof(tMd2Skin), this->header.numSkins, this->pFile); 161 /* read all vertex data */ 162 fseek(this->pFile, this->header.offsetTexCoords, SEEK_SET); 163 fread(this->pTexCoords, sizeof(tMd2TexCoord), this->header.numTexCoords, this->pFile); 164 /* read face data for each triangle (normals) */ 165 fseek(this->pFile, this->header.offsetTriangles, SEEK_SET); 166 fread(this->pTriangles, sizeof(tMd2Face), this->header.numTriangles, this->pFile); 167 /* reading all frame data */ 168 fseek(this->pFile, this->header.offsetFrames, SEEK_SET); 169 for(int i = 0; i < this->header.numFrames; i++) 170 { 171 tMd2AliasFrame *pFrame = (tMd2AliasFrame *) buffer; 172 this->pFrames[i].pVertices = new tMd2Triangle [this->header.numVertices]; 173 174 /* read the frame animation data */ 175 fread(pFrame, 1, this->header.frameSize, this->pFile); 176 strcpy(this->pFrames[i].strName, pFrame->name); 177 tMd2Triangle *pVertices = this->pFrames[i].pVertices; 178 /* 179 scale translations, store vertices: since id used a non-opengl xyz notation, we have to swap y and z 180 and negate z axis 181 */ 182 for(int j = 0; j < this->header.numVertices; j++) 183 { 184 pVertices[j].vertex[0] = pFrame->aliasVertices[j].vertex[0] * pFrame->scale[0] + pFrame->translate[0]; 185 pVertices[j].vertex[2] = -1 * (pFrame->aliasVertices[j].vertex[1] * pFrame->scale[1] + pFrame->translate[1]); 186 pVertices[j].vertex[1] = pFrame->aliasVertices[j].vertex[2] * pFrame->scale[2] + pFrame->translate[2]; 187 } 188 } 189 } 190 191 /** 192 \brief this function fills in the animation list for each animation by name and frame 193 \param model 194 194 */ 195 195 void MD2Loader::parseAnimations(t3DModel *pModel) 196 196 { 197 tAnimationInfo* animationInfo = new tAnimationInfo;198 string strLastName = "";199 200 /* the animation parse process looks a little bit weired: this is because there are no201 fix bounds for the animation lengths, so the frames are destingushed using their names202 which is normaly composed of <animationname><number>203 */204 205 for(int i = 0; i < pModel->numOfObjects; i++)206 {207 string strName = this->pFrames[i].strName;208 int frameNum = 0;197 tAnimationInfo* animationInfo = new tAnimationInfo; 198 string strLastName = ""; 199 200 /* the animation parse process looks a little bit weired: this is because there are no 201 fix bounds for the animation lengths, so the frames are destingushed using their names 202 which is normaly composed of <animationname><number> 203 */ 204 205 for(int i = 0; i < pModel->numOfObjects; i++) 206 { 207 string strName = this->pFrames[i].strName; 208 int frameNum = 0; 209 209 210 for(unsigned int j = 0; j < strName.length(); j++)211 {212 if( isdigit(strName[j]) && j >= strName.length() - 2)213 {214 frameNum = atoi(&strName[j]);215 strName.erase(j, strName.length() - j);216 break;217 }218 }219 220 /* animations are sorted through their names: this is how its been done: */221 if(strName != strLastName || i == pModel->numOfObjects - 1)222 {223 if(strLastName != "")224 {225 strcpy(animationInfo->strName, strLastName.c_str());226 animationInfo->endFrame = i;227 pModel->animationList->add(animationInfo);228 memset(&animationInfo, 0, sizeof(tAnimationInfo));229 pModel->numOfAnimations++;230 }231 animationInfo->startFrame = frameNum - 1 + i;232 }233 strLastName = strName;234 }235 } 236 237 /** 238 \brief this function converts the .md2 structures to our own model and object structures: decompress239 \param model210 for(unsigned int j = 0; j < strName.length(); j++) 211 { 212 if( isdigit(strName[j]) && j >= strName.length() - 2) 213 { 214 frameNum = atoi(&strName[j]); 215 strName.erase(j, strName.length() - j); 216 break; 217 } 218 } 219 220 /* animations are sorted through their names: this is how its been done: */ 221 if(strName != strLastName || i == pModel->numOfObjects - 1) 222 { 223 if(strLastName != "") 224 { 225 strcpy(animationInfo->strName, strLastName.c_str()); 226 animationInfo->endFrame = i; 227 pModel->animationList->add(animationInfo); 228 memset(&animationInfo, 0, sizeof(tAnimationInfo)); 229 pModel->numOfAnimations++; 230 } 231 animationInfo->startFrame = frameNum - 1 + i; 232 } 233 strLastName = strName; 234 } 235 } 236 237 /** 238 \brief this function converts the .md2 structures to our own model and object structures: decompress 239 \param model 240 240 */ 241 241 void MD2Loader::convertDataStructures(t3DModel *pModel) 242 242 { 243 int j = 0, i = 0;243 int j = 0, i = 0; 244 244 245 memset(pModel, 0, sizeof(t3DModel));246 pModel->numOfObjects = this->header.numFrames;247 248 this->parseAnimations(pModel);249 250 for (i = 0; i < pModel->numOfObjects; i++)251 {252 t3DObject* currentFrame = new t3DObject;253 254 currentFrame->numOfVerts = this->header.numVertices;255 currentFrame->numTexVertex = this->header.numTexCoords;256 currentFrame->numOfFaces = this->header.numTriangles;257 258 currentFrame->pVerts = new CVector3[currentFrame->numOfVerts];259 260 for (j = 0; j < currentFrame->numOfVerts; j++)261 {262 currentFrame->pVerts[j].x = this->pFrames[i].pVertices[j].vertex[0];263 currentFrame->pVerts[j].y = this->pFrames[i].pVertices[j].vertex[1];264 currentFrame->pVerts[j].z = this->pFrames[i].pVertices[j].vertex[2];265 }266 267 delete this->pFrames[i].pVertices;268 269 if( likely(i > 0))270 {271 pModel->objectList->add(currentFrame);272 continue;273 }245 memset(pModel, 0, sizeof(t3DModel)); 246 pModel->numOfObjects = this->header.numFrames; 247 248 this->parseAnimations(pModel); 249 250 for (i = 0; i < pModel->numOfObjects; i++) 251 { 252 t3DObject* currentFrame = new t3DObject; 253 254 currentFrame->numOfVerts = this->header.numVertices; 255 currentFrame->numTexVertex = this->header.numTexCoords; 256 currentFrame->numOfFaces = this->header.numTriangles; 257 258 currentFrame->pVerts = new CVector3[currentFrame->numOfVerts]; 259 260 for (j = 0; j < currentFrame->numOfVerts; j++) 261 { 262 currentFrame->pVerts[j].x = this->pFrames[i].pVertices[j].vertex[0]; 263 currentFrame->pVerts[j].y = this->pFrames[i].pVertices[j].vertex[1]; 264 currentFrame->pVerts[j].z = this->pFrames[i].pVertices[j].vertex[2]; 265 } 266 267 delete this->pFrames[i].pVertices; 268 269 if( likely(i > 0)) 270 { 271 pModel->objectList->add(currentFrame); 272 continue; 273 } 274 274 275 currentFrame->pTexVerts = new CVector2[currentFrame->numTexVertex];276 currentFrame->pFaces = new tFace[currentFrame->numOfFaces];277 278 for(j = 0; j < currentFrame->numTexVertex; j++)279 {280 currentFrame->pTexVerts[j].x = this->pTexCoords[j].u / float(this->header.skinWidth);281 currentFrame->pTexVerts[j].y = 1 - this->pTexCoords[j].v / float(this->header.skinHeight);282 }283 284 for(j = 0; j < currentFrame->numOfFaces; j++)285 {286 currentFrame->pFaces[j].vertIndex[0] = this->pTriangles[j].vertexIndices[0];287 currentFrame->pFaces[j].vertIndex[1] = this->pTriangles[j].vertexIndices[1];288 currentFrame->pFaces[j].vertIndex[2] = this->pTriangles[j].vertexIndices[2];289 290 currentFrame->pFaces[j].coordIndex[0] = this->pTriangles[j].textureIndices[0];291 currentFrame->pFaces[j].coordIndex[1] = this->pTriangles[j].textureIndices[1];292 currentFrame->pFaces[j].coordIndex[2] = this->pTriangles[j].textureIndices[2];293 }294 pModel->objectList->add(currentFrame);295 }296 } 297 298 299 /** 300 \brief this function conputes the normals of the model301 \param model275 currentFrame->pTexVerts = new CVector2[currentFrame->numTexVertex]; 276 currentFrame->pFaces = new tFace[currentFrame->numOfFaces]; 277 278 for(j = 0; j < currentFrame->numTexVertex; j++) 279 { 280 currentFrame->pTexVerts[j].x = this->pTexCoords[j].u / float(this->header.skinWidth); 281 currentFrame->pTexVerts[j].y = 1 - this->pTexCoords[j].v / float(this->header.skinHeight); 282 } 283 284 for(j = 0; j < currentFrame->numOfFaces; j++) 285 { 286 currentFrame->pFaces[j].vertIndex[0] = this->pTriangles[j].vertexIndices[0]; 287 currentFrame->pFaces[j].vertIndex[1] = this->pTriangles[j].vertexIndices[1]; 288 currentFrame->pFaces[j].vertIndex[2] = this->pTriangles[j].vertexIndices[2]; 289 290 currentFrame->pFaces[j].coordIndex[0] = this->pTriangles[j].textureIndices[0]; 291 currentFrame->pFaces[j].coordIndex[1] = this->pTriangles[j].textureIndices[1]; 292 currentFrame->pFaces[j].coordIndex[2] = this->pTriangles[j].textureIndices[2]; 293 } 294 pModel->objectList->add(currentFrame); 295 } 296 } 297 298 299 /** 300 \brief this function conputes the normals of the model 301 \param model 302 302 */ 303 303 void MD2Loader::computeNormals(t3DModel *pModel) … … 306 306 307 307 /** 308 \brief This function cleans up our allocated memory and closes the file308 \brief This function cleans up our allocated memory and closes the file 309 309 */ 310 310 void MD2Loader::cleanUp() 311 311 { 312 fclose(this->pFile);312 fclose(this->pFile); 313 313 314 if( this->pSkins) delete [] this->pSkins;315 if( this->pTexCoords) delete this->pTexCoords;316 if( this->pTriangles) delete this->pTriangles;317 if( this->pFrames) delete this->pFrames;318 } 314 if( this->pSkins) delete [] this->pSkins; 315 if( this->pTexCoords) delete this->pTexCoords; 316 if( this->pTriangles) delete this->pTriangles; 317 if( this->pFrames) delete this->pFrames; 318 } -
orxonox/branches/md2_loader/src/story_entities/world.cc
r4139 r4140 491 491 this->model = new t3DModel; 492 492 this->md2Model = new MD2Model(); 493 494 md2loader->importMD2(model, " test.md2", "test.bmp");493 494 md2loader->importMD2(model, "../data/models/jack/tris.md2", "test.bmp"); 495 495 496 496 } … … 953 953 954 954 /* TESTGING TESTING TESTING */ 955 this->md2Model->draw(this->model);955 //this->md2Model->draw(this->model); 956 956 957 957 glCallList (objectList);
Note: See TracChangeset
for help on using the changeset viewer.










