Changeset 9869 in orxonox.OLD for trunk/src/lib/graphics/importer/md2
- Timestamp:
- Oct 3, 2006, 12:19:30 AM (18 years ago)
- Location:
- trunk/src/lib/graphics/importer/md2
- Files:
-
- 2 edited
- 2 copied
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; -
trunk/src/lib/graphics/importer/md2/md2Model.h
r9235 r9869 20 20 21 21 #include "base_object.h" 22 #include "count_pointer.h" 22 23 23 24 #include "interactive_model.h" … … 45 46 struct MD2Header 46 47 { 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 48 int ident; //!< This is used to identify the file 49 int version; //!< The version number of the file (Must be 8) 50 51 int skinWidth; //!< The skin width in pixels 52 int skinHeight; //!< The skin height in pixels 53 int frameSize; //!< The size in bytes the frames are 54 55 int numSkins; //!< The number of skins associated with the model 56 int numVertices; //!< The number of vertices (constant for each frame) 57 int numTexCoords; //!< The number of texture coordinates 58 int numTriangles; //!< The number of faces (polygons) 59 int numGlCommands; //!< The number of gl commands 60 int numFrames; //!< The number of animation frames 61 62 int offsetSkins; //!< The offset in the file for the skin data 63 int offsetTexCoords; //!< The offset in the file for the texture data 64 int offsetTriangles; //!< The offset in the file for the face data 65 int offsetFrames; //!< The offset in the file for the frames data 66 int offsetGlCommands; //!< The offset in the file for the gl commands data 67 int offsetEnd; //!< The end of the file offset 67 68 }; 68 69 … … 70 71 //! animation names enumeration 71 72 typedef enum MD2animType 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 73 { 74 STAND, //0 75 RUN, //1 76 ATTACK, //2 77 PAIN_A, //3 78 PAIN_B, //4 79 PAIN_C, //5 80 JUMP, //6 81 FLIP, //7 82 SALUTE, //8 83 FALLBACK, //9 84 WAVE, //10 85 POINT, //11 86 CROUCH_STAND, 87 CROUCH_WALK, 88 CROUCH_ATTACK, 89 CROUCH_PAIN, 90 CROUCH_DEATH, 91 DEATH_FALLBACK, 92 DEATH_FALLFORWARD, 93 DEATH_FALLBACKSLOW, 94 BOOM, 95 WALK, 96 97 MAX_ANIMATIONS 98 }; 98 99 99 100 … … 116 117 class MD2Data : public BaseObject 117 118 { 118 public: 119 MD2Data(const std::string& modelFileName, const std::string& skinFileName, float scale = 1.0f); 119 public: 120 typedef CountPointer<MD2Data> Pointer; 121 public: 122 MD2Data(); 123 MD2Data(const std::string& modelFileName, const std::string& skinFileName, float scale = 1.0f); 120 124 virtual ~MD2Data(); 121 125 122 private: 123 bool loadModel(const std::string& fileName); 124 bool loadSkin(const std::string& fileName = ""); 125 126 public: 126 private: 127 void init(); 128 bool loadModel(const std::string& fileName); 129 bool loadSkin(const std::string& fileName = ""); 130 131 public: 127 132 int numFrames; //!< number of frames 128 133 int numVertices; //!< number of vertices … … 148 153 149 154 //! This is a MD2 Model class 150 class MD2Model : public InteractiveModel { 151 152 public: 155 class MD2Model : public InteractiveModel 156 { 157 ObjectListDeclaration(MD2Model); 158 public: 159 MD2Model(); 153 160 MD2Model(const std::string& modelFileName, const std::string& skinFileName = "", float scale = 1.0f); 161 MD2Model(const MD2Model& model); 154 162 virtual ~MD2Model(); 163 164 MD2Model& operator=(const MD2Model& md2model); 165 166 bool load(const std::string& modelFileName, const std::string& skinFileName = "", float scale = 1.0f); 155 167 156 168 virtual void draw() const; … … 160 172 virtual void setAnimation(int firstFrame, int lastFrame, int fps, int bStoppable, int animPlayback); 161 173 /** returns the current animation @returns animation type */ 162 inline int MD2Model::getAnimation(){ return this->animationState.type; }174 inline int getAnimation() const { return this->animationState.type; } 163 175 virtual void setAnimationSpeed(float speed) { this->animationSpeed = speed; } 164 virtual bool isAnimationFinished(){ return (this->animationState.currentFrame == this->animationState.endFrame )?true:false; }176 virtual bool isAnimationFinished() const { return (this->animationState.currentFrame == this->animationState.endFrame )?true:false; } 165 177 /** scales the current model @param scaleFactor: the factor [0..1] to use for scaling */ 166 178 void scaleModel(float scaleFactor) { this->scaleFactor = scaleFactor;} 167 179 180 181 void acquireData(const MD2Data::Pointer& data) { this->data = data; rebuildInfo(); }; 182 const MD2Data::Pointer& dataPointer() const { return this->data; }; 168 183 virtual void tick(float dtS); 169 184 void debug(); … … 171 186 172 187 private: 188 void init(); 189 void rebuildInfo(); 190 173 191 void animate(float time); 174 192 void processLighting(); … … 177 195 178 196 179 197 public: 180 198 /* these variables are static, because they are all the same for every model */ 181 static sVec3D anorms[NUM_VERTEX_NORMALS]; //!< the anormals182 static float anormsDots[SHADEDOT_QUANT][256]; //!< the anormals dot products183 static sAnim animationList[22]; //!< the anomation list184 185 float* shadeDots;186 187 MD2Data* data;//!< the md2 data pointer188 189 190 float scaleFactor; //!< the scale factor (individual)191 float animationSpeed; //!< the speed of the animation (factor for the time)192 sAnimState animationState; //!< animation state of the model193 sVec3D verticesList[MD2_MAX_VERTICES]; //!< place to temp sav the vert199 static sVec3D anorms[NUM_VERTEX_NORMALS]; //!< the anormals 200 static float anormsDots[SHADEDOT_QUANT][256]; //!< the anormals dot products 201 static sAnim animationList[22]; //!< the anomation list 202 //! again one of these strange id software parts 203 float* shadeDots; 204 205 CountPointer<MD2Data> data; //!< the md2 data pointer 206 207 private: 208 float scaleFactor; //!< the scale factor (individual) 209 float animationSpeed; //!< the speed of the animation (factor for the time) 210 sAnimState animationState; //!< animation state of the model 211 sVec3D verticesList[MD2_MAX_VERTICES]; //!< place to temp sav the vert 194 212 }; 195 213
Note: See TracChangeset
for help on using the changeset viewer.