Changeset 9869 in orxonox.OLD for trunk/src/lib/graphics/importer/md2/md2Model.cc
- Timestamp:
- Oct 3, 2006, 12:19:30 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/lib/graphics/importer/md2/md2Model.cc
r9406 r9869 19 19 20 20 #include "debug.h" 21 #include " util/loading/resource_manager.h"22 23 24 21 #include "resource_md2.h" 22 23 24 ObjectListDefinition(MD2Model); 25 25 26 26 //! the model anorms 27 27 sVec3D MD2Model::anorms[NUM_VERTEX_NORMALS] = { 28 29 };28 #include "anorms.h" 29 }; 30 30 31 31 //! anormal dots, no idea of how this shall work, but it does 32 32 float MD2Model::anormsDots[SHADEDOT_QUANT][256] = { 33 34 };33 #include "anormtab.h" 34 }; 35 35 36 36 … … 42 42 sAnim MD2Model::animationList[22] = 43 43 { 44 // begin, end, fps, interruptable44 // begin, end, fps, interruptable 45 45 { 0, 39, 9, 1 }, //!< STAND 46 46 { 40, 45, 10, 1 }, //!< RUN … … 73 73 ********************************************************************************/ 74 74 75 MD2Model::MD2Model() 76 : data(new MD2Data()) 77 { 78 this->init(); 79 } 80 81 #include "resource_md2.h" 75 82 /** 76 83 \brief simple constructor initializing all variables 77 84 */ 78 85 MD2Model::MD2Model(const std::string& modelFileName, const std::string& skinFileName, float scale) 79 { 80 this->setClassID(CL_MD2_MODEL, "MD2Model"); 81 /* this creates the data container via ressource manager */ 82 if (!modelFileName.empty()) 83 this->data = (MD2Data*)ResourceManager::getInstance()->load(modelFileName, MD2, RP_GAME, skinFileName, scale); 84 if( unlikely(this->data == NULL)) 85 PRINTF(0)("The model was not found, MD2Model Loader finished abnormaly. Update the data-repos\n"); 86 86 : data(new MD2Data()) 87 { 88 this->init(); 87 89 this->scaleFactor = scale; 88 this->animationSpeed = 1.0f; 89 90 shadeDots = MD2Model::anormsDots[0]; 91 /* set the animation stat mannualy */ 92 this->animationState.type = STAND; 93 this->animationState.numPlays = 1; 94 this->setAnimation(STAND); 95 96 this->debug(); 97 98 //write the modelinfo information 90 91 this->data = ResourceMD2(modelFileName, skinFileName, scale).data; 92 rebuildInfo(); 93 94 //this->debug(); 95 } 96 97 MD2Model::MD2Model(const MD2Model& model) 98 : data(model.data) 99 { 100 this->init(); 101 this->rebuildInfo(); 102 } 103 104 MD2Model& MD2Model::operator=(const MD2Model& md2model) 105 { 106 this->data = md2model.data; 107 this->rebuildInfo(); 108 return *this; 109 } 110 111 void MD2Model::rebuildInfo() 112 { 113 //write the modelinfo information 99 114 this->pModelInfo.numVertices = this->data->numVertices; 100 115 this->pModelInfo.numTriangles = this->data->numTriangles; … … 107 122 108 123 // triangle conversion 124 if (this->pModelInfo.pTriangles != NULL) 125 delete[] this->pModelInfo.pTriangles; 109 126 this->pModelInfo.pTriangles = new sTriangleExt[this->data->numTriangles]; 110 127 for( int i = 0; i < this->data->numTriangles; i++) … … 118 135 this->pModelInfo.pTriangles[i].indexToTexCoor[2] = this->data->pTriangles[i].indexToTexCoor[2]; 119 136 } 137 } 138 139 bool MD2Model::load(const std::string& modelFileName, const std::string& skinFileName, float scale) 140 { 141 this->data = MD2Data::Pointer(new MD2Data(modelFileName, skinFileName, scale)); 142 this->rebuildInfo(); 120 143 } 121 144 … … 132 155 this->pModelInfo.pTexCoor = NULL; 133 156 this->pModelInfo.pTriangles = NULL; 134 135 ResourceManager::getInstance()->unload(this->data); 136 } 137 157 } 158 159 160 void MD2Model::init() 161 { 162 this->registerObject(this, MD2Model::_objectList); 163 /* this creates the data container via ressource manager */ 164 if( unlikely(this->data.isNull())) 165 PRINTF(0)("The model was not found, MD2Model Loader finished abnormaly. Update the data-repos\n"); 166 167 this->scaleFactor = 1.0f; 168 this->animationSpeed = 1.0f; 169 170 shadeDots = MD2Model::anormsDots[0]; 171 /* set the animation stat mannualy */ 172 this->animationState.type = STAND; 173 this->animationState.numPlays = 1; 174 this->setAnimation(STAND); 175 } 138 176 139 177 /** … … 153 191 154 192 for( int i = 0; i < this->data->numVertices; ++i) 155 156 157 158 159 193 { 194 this->verticesList[i][0] = currVec[i][0] + this->animationState.interpolationState * (nextVec[i][0] - currVec[i][0]); 195 this->verticesList[i][1] = currVec[i][1] + this->animationState.interpolationState * (nextVec[i][1] - currVec[i][1]); 196 this->verticesList[i][2] = currVec[i][2] + this->animationState.interpolationState * (nextVec[i][2] - currVec[i][2]); 197 } 160 198 } 161 199 … … 259 297 /* draw the triangles */ 260 298 while( int i = *(pCommands++)) /* strange looking while loop for maximum performance */ 299 { 300 if( i < 0) 261 301 { 262 if( i < 0) 263 { 264 glBegin(GL_TRIANGLE_FAN); 265 i = -i; 266 } 267 else 268 { 269 glBegin(GL_TRIANGLE_STRIP); 270 } 271 272 for(; i > 0; i--, pCommands += 3) /* down counting for loop, next 3 gl commands */ 273 { 274 glTexCoord2f( ((float *)pCommands)[0], ((float *)pCommands)[1] ); 275 glNormal3fv(anorms[this->data->pLightNormals[pCommands[2]]]); 276 glVertex3fv(this->verticesList[pCommands[2]]); 277 } 278 glEnd(); 279 302 glBegin(GL_TRIANGLE_FAN); 303 i = -i; 280 304 } 305 else 306 { 307 glBegin(GL_TRIANGLE_STRIP); 308 } 309 310 for(; i > 0; i--, pCommands += 3) /* down counting for loop, next 3 gl commands */ 311 { 312 glTexCoord2f( ((float *)pCommands)[0], ((float *)pCommands)[1] ); 313 glNormal3fv(anorms[this->data->pLightNormals[pCommands[2]]]); 314 glVertex3fv(this->verticesList[pCommands[2]]); 315 } 316 glEnd(); 317 318 } 281 319 glDisable(GL_CULL_FACE); 282 320 glPopAttrib(); … … 289 327 int* pCommands = this->data->pGLCommands; 290 328 /* some face culling stuff */ 291 // glPushAttrib(GL_POLYGON_BIT);292 // glFrontFace(GL_CW);293 // glEnable(GL_CULL_FACE);294 // glCullFace(GL_BACK);295 //296 // this->processLighting();297 // this->interpolate(/*this->verticesList*/);329 // glPushAttrib(GL_POLYGON_BIT); 330 // glFrontFace(GL_CW); 331 // glEnable(GL_CULL_FACE); 332 // glCullFace(GL_BACK); 333 // 334 // this->processLighting(); 335 // this->interpolate(/*this->verticesList*/); 298 336 this->data->material.select(); 299 337 … … 337 375 338 376 if( this->animationState.localTime - this->animationState.lastTime > (1.0f / this->animationState.fps)) 377 { 378 this->animationState.currentFrame = this->animationState.nextFrame; 379 this->animationState.nextFrame++; 380 381 if( this->animationState.nextFrame > this->animationState.endFrame ) 339 382 { 340 this->animationState.currentFrame = this->animationState.nextFrame; 341 this->animationState.nextFrame++; 342 343 if( this->animationState.nextFrame > this->animationState.endFrame ) 383 if( this->animationState.animPlaybackMode == MD2_ANIM_LOOP) 344 384 { 345 if( this->animationState.animPlaybackMode == MD2_ANIM_LOOP) 346 { 347 this->animationState.nextFrame = this->animationState.startFrame; 348 this->animationState.numPlays++; 349 } 350 else 351 { 352 this->animationState.nextFrame = this->animationState.endFrame; 353 } 385 this->animationState.nextFrame = this->animationState.startFrame; 386 this->animationState.numPlays++; 354 387 } 355 this->animationState.lastTime = this->animationState.localTime; 388 else 389 { 390 this->animationState.nextFrame = this->animationState.endFrame; 391 } 356 392 } 357 358 // if( this->animationState.currentFrame > (this->data->numFrames - 1) ) 359 // this->animationState.currentFrame = 0; 360 361 // if( (this->animationState.nextFrame > (this->data->numFrames - 1)) && this->animationState.animPlaybackMode == MD2_ANIM_LOOP) 362 // this->animationState.nextFrame = 0; 393 this->animationState.lastTime = this->animationState.localTime; 394 } 395 396 // if( this->animationState.currentFrame > (this->data->numFrames - 1) ) 397 // this->animationState.currentFrame = 0; 398 399 // if( (this->animationState.nextFrame > (this->data->numFrames - 1)) && this->animationState.animPlaybackMode == MD2_ANIM_LOOP) 400 // this->animationState.nextFrame = 0; 363 401 364 402 this->animationState.interpolationState = this->animationState.fps * 365 (this->animationState.localTime - this->animationState.lastTime);403 (this->animationState.localTime - this->animationState.lastTime); 366 404 } 367 405 … … 390 428 PRINT(0)("= Number of Frames: \t%i\n", this->data->header->numFrames); 391 429 PRINT(0)("= Height, Width:\t%i, %i\n", this->data->header->skinHeight, this->data->header->skinWidth); 392 PRINT(0)("= Pointer to the data object: %p\n", this->data);430 //PRINT(0)("= Pointer to the data object: %p\n", this->data); 393 431 PRINT(0)("===================================================\n\n"); 394 432 } … … 399 437 ********************************************************************************/ 400 438 439 MD2Data::MD2Data() 440 { 441 this->init(); 442 } 443 401 444 /** 402 445 \brief simple constructor … … 404 447 MD2Data::MD2Data(const std::string& modelFileName, const std::string& skinFileName, float scale) 405 448 { 406 scale *= 0.1f; 407 449 this->init(); 450 this->scaleFactor = scale * .1; 451 452 this->loadModel(modelFileName); 453 this->loadSkin(skinFileName); 454 } 455 456 void MD2Data::init() 457 { 458 this->scaleFactor = 1.0; 408 459 this->pVertices = NULL; 409 460 this->pGLCommands = NULL; 410 461 this->pLightNormals = NULL; 411 462 this->pTexCoor = NULL; 463 this->header = NULL; 412 464 413 465 this->numFrames = 0; … … 415 467 this->numGLCommands = 0; 416 468 this->numTexCoor = 0; 417 418 // this->scaleFactor = 1.0f; 419 this->scaleFactor = scale; 420 421 this->fileName = ""; 422 this->skinFileName = ""; 423 this->loadModel(modelFileName); 424 this->loadSkin(skinFileName); 425 } 426 469 } 427 470 428 471 /** … … 462 505 pFile = fopen(fileName.c_str(), "rb"); 463 506 if( unlikely(!pFile)) 464 465 466 467 507 { 508 PRINTF(1)("Couldn't open the MD2 File for loading. Exiting.\n"); 509 return false; 510 } 468 511 this->header = new MD2Header; 469 512 fread(this->header, 1, sizeof(MD2Header), pFile); 470 513 /* check for the header version: make sure its a md2 file :) */ 471 514 if( unlikely(this->header->version != MD2_VERSION) && unlikely(this->header->ident != MD2_IDENT)) 472 473 474 475 515 { 516 PRINTF(1)("Couldn't load file %s: invalid file format: stop loading\n", fileName.c_str()); 517 return false; 518 } 476 519 477 520 this->fileName =fileName; … … 506 549 507 550 for(int i = 0; i < this->numFrames; ++i) 551 { 552 frame = (sFrame*)(buffer + this->header->frameSize * i); 553 pVertex = this->pVertices + this->numVertices * i; 554 pNormals = this->pLightNormals + this->numVertices * i; 555 556 for(int j = 0; j < this->numVertices; ++j) 508 557 { 509 frame = (sFrame*)(buffer + this->header->frameSize * i); 510 pVertex = this->pVertices + this->numVertices * i; 511 pNormals = this->pLightNormals + this->numVertices * i; 512 513 for(int j = 0; j < this->numVertices; ++j) 514 { 515 /* SPEEDUP: *(pVerts + i + 0) = (*(frame->pVertices + i + 0)... */ 516 pVertex[j][0] = ((frame->pVertices[j].v[0] * frame->scale[0] ) + frame->translate[0] )* this->scaleFactor; 517 pVertex[j][1] = ((frame->pVertices[j].v[2] * frame->scale[2]) + frame->translate[2]) * this->scaleFactor; 518 pVertex[j][2] = (-1.0 * (frame->pVertices[j].v[1] * frame->scale[1] + frame->translate[1])) * this->scaleFactor; 519 520 //printf("vertex %i/%i: (%f, %f, %f)\n", j, this->numVertices, pVertex[j][0], pVertex[j][1], pVertex[j][2]); 521 522 pNormals[j] = frame->pVertices[j].lightNormalIndex; 523 } 558 /* SPEEDUP: *(pVerts + i + 0) = (*(frame->pVertices + i + 0)... */ 559 pVertex[j][0] = ((frame->pVertices[j].v[0] * frame->scale[0] ) + frame->translate[0] )* this->scaleFactor; 560 pVertex[j][1] = ((frame->pVertices[j].v[2] * frame->scale[2]) + frame->translate[2]) * this->scaleFactor; 561 pVertex[j][2] = (-1.0 * (frame->pVertices[j].v[1] * frame->scale[1] + frame->translate[1])) * this->scaleFactor; 562 563 //printf("vertex %i/%i: (%f, %f, %f)\n", j, this->numVertices, pVertex[j][0], pVertex[j][1], pVertex[j][2]); 564 565 pNormals[j] = frame->pVertices[j].lightNormalIndex; 524 566 } 525 PRINTF(4)("Finished loading the md2 file\n"); 567 } 568 PRINTF(4)("Finished loading the md2 file\n"); 526 569 527 570 delete [] buffer; … … 538 581 { 539 582 if( fileName.empty()) 540 541 542 543 583 { 584 this->skinFileName = ""; 585 return false; 586 } 544 587 545 588 this->skinFileName = fileName;
Note: See TracChangeset
for help on using the changeset viewer.