Changeset 4217 in orxonox.OLD for orxonox/branches/movie_player/src/lib/graphics/importer/model.cc
- Timestamp:
- May 18, 2005, 11:27:40 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
orxonox/branches/movie_player/src/lib/graphics/importer/model.cc
r3917 r4217 27 27 using namespace std; 28 28 29 ////////////////// 30 // DE-CONSTRUCT // 31 ////////////////// 32 /** 33 \brief Creates a 3D-Model. and assigns it a Name. 29 30 //////////////////// 31 /// SUB-Elements /// 32 //////////////////// 33 /** 34 \brief creates a new ModelFaceElement 35 */ 36 ModelFaceElement::ModelFaceElement() 37 { 38 this->vertexNumber = -1; 39 this->normalNumber = -1; 40 this->texCoordNumber = -1; 41 42 this->next = NULL; 43 } 44 45 /** 46 \brief destroys a ModelFaceElement 47 */ 48 ModelFaceElement::~ModelFaceElement() 49 { 50 if (this->next) 51 delete this->next; 52 } 53 54 /** 55 \brief creates a new ModelFace 56 */ 57 ModelFace::ModelFace() 58 { 59 this->vertexCount = 0; 60 61 this->firstElem = NULL; 62 63 this->material = NULL; 64 65 this->next = NULL; 66 67 } 68 69 /** 70 \brief deletes a ModelFace 71 */ 72 ModelFace::~ModelFace() 73 { 74 PRINTF(5)("Cleaning up Face\n"); 75 76 if (this->firstElem != NULL) 77 delete this->firstElem; 78 79 if (this->next != NULL) 80 delete this->next; 81 } 82 83 /** 84 \brief Creates a new ModelGroup 85 */ 86 ModelGroup::ModelGroup() 87 { 88 PRINTF(4)("Adding new Group\n"); 89 this->name = ""; 90 this->faceMode = -1; 91 this->faceCount = 0; 92 this->next = NULL; 93 94 this->firstFace = new ModelFace; 95 this->currentFace = this->firstFace; 96 } 97 98 /** 99 \brief deletes a ModelGroup 100 */ 101 ModelGroup::~ModelGroup() 102 { 103 PRINTF(5)("Cleaning up group\n"); 104 if (this->firstFace != NULL) 105 delete this->firstFace; 106 107 if (this->next !=NULL) 108 delete this->next; 109 } 110 111 /** 112 \brief cleans up a ModelGroup 113 114 actually does the same as the delete Operator, but does not delete the predecessing group 115 */ 116 void ModelGroup::cleanup(void) 117 { 118 PRINTF(5)("Cleaning up group\n"); 119 if (this->firstFace) 120 delete this->firstFace; 121 this->firstFace = NULL; 122 if (this->next) 123 this->next->cleanup(); 124 } 125 126 127 ///////////// 128 /// MODEL /// 129 ///////////// 130 /** 131 \brief Creates a 3D-Model. 132 133 assigns it a Name and a Type 34 134 */ 35 135 Model::Model(const char* modelName, MODEL_TYPE type) … … 42 142 this->finalized = false; 43 143 // setting the start group; 44 this->firstGroup = new Group; 45 this->currentGroup = this->firstGroup; 144 this->currentGroup = this->firstGroup = new ModelGroup; 46 145 this->groupCount = 0; 47 48 this->initGroup (this->currentGroup); 146 this->vertexCount = 0; 147 this->normalCount = 0; 148 this->texCoordCount = 0; 149 49 150 this->scaleFactor = 1; 50 151 … … 76 177 77 178 PRINTF(5)("Deleting display Lists.\n"); 78 Group* walker = this->firstGroup; 79 while (walker != NULL) 80 { 81 glDeleteLists (walker->listNumber, 1); 82 Group* delWalker = walker; 83 walker = walker->next; 84 delete delWalker; 85 } 179 delete this->firstGroup; 86 180 87 181 // deleting Arrays … … 92 186 tIterator<Material>* tmpIt = this->materialList->getIterator(); 93 187 Material* material = tmpIt->nextElement(); 188 189 //! \todo do we really have to delete this material?? 94 190 while(material) 95 191 { … … 128 224 { 129 225 PRINTF(4)("drawing the 3D-Models\n"); 130 Group* walker= this->firstGroup;131 while ( walker!= NULL)132 { 133 PRINTF(5)("Drawing model %s\n", walker->name);134 glCallList ( walker->listNumber);135 walker = walker->next;226 ModelGroup* tmpGroup = this->firstGroup; 227 while (tmpGroup != NULL) 228 { 229 PRINTF(5)("Drawing model %s\n", tmpGroup->name); 230 glCallList (tmpGroup->listNumber); 231 tmpGroup = tmpGroup->next; 136 232 } 137 233 } … … 151 247 } 152 248 PRINTF(4)("drawing the requested 3D-Models if found.\n"); 153 Group* walker= this->firstGroup;249 ModelGroup* tmpGroup = this->firstGroup; 154 250 int counter = 0; 155 while ( walker!= NULL)251 while (tmpGroup != NULL) 156 252 { 157 253 if (counter == groupNumber) 158 254 { 159 PRINTF(4)("Drawing model number %i named %s\n", counter, walker->name);160 glCallList ( walker->listNumber);255 PRINTF(4)("Drawing model number %i named %s\n", counter, tmpGroup->name); 256 glCallList (tmpGroup->listNumber); 161 257 return; 162 258 } 163 259 ++counter; 164 walker = walker->next;260 tmpGroup = tmpGroup->next; 165 261 } 166 262 PRINTF(2)("Model number %i in %s not Found.\n", groupNumber, this->name); … … 178 274 { 179 275 PRINTF(4)("drawing the requested 3D-Models if found.\n"); 180 Group* walker= this->firstGroup;181 while ( walker!= NULL)182 { 183 if (!strcmp( walker->name, groupName))276 ModelGroup* tmpGroup = this->firstGroup; 277 while (tmpGroup != NULL) 278 { 279 if (!strcmp(tmpGroup->name, groupName)) 184 280 { 185 PRINTF(4)("Drawing model %s\n", walker->name);186 glCallList ( walker->listNumber);281 PRINTF(4)("Drawing model %s\n", tmpGroup->name); 282 glCallList (tmpGroup->listNumber); 187 283 return; 188 284 } 189 walker = walker->next;285 tmpGroup = tmpGroup->next; 190 286 } 191 287 PRINTF(2)("Model Named %s in %s not Found.\n", groupName, this->name); 192 288 return; 193 }194 195 /**196 \returns Count of the Models in this File197 */198 int Model::getGroupCount (void) const199 {200 return this->groupCount;201 289 } 202 290 … … 210 298 void Model::setName(const char* name) 211 299 { 212 if (this->name) 213 delete this->name;300 if (this->name) 301 delete []this->name; 214 302 if (name) 215 303 { … … 219 307 else 220 308 this->name = NULL; 221 }222 223 /**224 \brief initializes a new Group model225 \param group the group that should be initialized.226 \todo Maybe Group should be a Class, because it does a lot of stuff227 228 */229 bool Model::initGroup(Group* group)230 {231 PRINTF(4)("Adding new Group\n");232 group->name = "";233 group->faceMode = -1;234 group->faceCount = 0;235 group->next = NULL;236 237 group->firstFace = new Face;238 this->initFace (group->firstFace);239 group->currentFace = group->firstFace;240 }241 242 /**243 \brief initializes a new Face. (sets default Values)244 \param face The face to initialize245 */246 bool Model::initFace (Face* face)247 {248 face->vertexCount = 0;249 250 face->firstElem = NULL;251 252 face->material = NULL;253 254 face->next = NULL;255 256 return true;257 309 } 258 310 … … 268 320 if (this->normals) 269 321 delete this->normals; 322 270 323 this->vertices = NULL; 271 324 this->vTexture = NULL; … … 280 333 { 281 334 PRINTF(4)("cleaning up the 3D-Model to save Memory.\n"); 282 this-> cleanupGroup(this->firstGroup);335 this->firstGroup->cleanup(); 283 336 return true; 284 337 } 285 338 286 /** 287 \brief Cleans up all groups starting from group. 288 \param group the first Group to clean 289 */ 290 bool Model::cleanupGroup (Group* group) 291 { 292 PRINTF(5)("Cleaning up group\n"); 293 if (group->firstFace != NULL) 294 { 295 cleanupFace (group->firstFace); 296 delete group->firstFace; 297 } 298 299 if (group->next !=NULL) 300 cleanupGroup (group->next); 301 return true; 302 } 303 304 /** 305 \brief Cleans up all Faces starting from face until NULL is reached. 306 \param face the first face to clean. 307 */ 308 bool Model::cleanupFace (Face* face) 309 { 310 PRINTF(5)("Cleaning up Face\n"); 311 312 if (face->firstElem != NULL) 313 { 314 this->cleanupFaceElement(face->firstElem); 315 delete face->firstElem; 316 } 317 318 if (face->next != NULL) 319 { 320 this->cleanupFace (face->next); 321 delete face->next; 322 } 323 } 324 325 /** 326 \brief Cleans up all FaceElements starting from faceElem. 327 \param faceElem the first FaceElement to clean. 328 */ 329 bool Model::cleanupFaceElement(FaceElement* faceElem) 330 { 331 if (faceElem->next != NULL) 332 { 333 this->cleanupFaceElement (faceElem->next); 334 delete faceElem->next; 335 } 336 } 339 337 340 338 341 ////////// … … 354 357 /** 355 358 \brief adds a new Material to the Material List 356 \param material the name of the Material to add359 \param materialName the name of the Material to add 357 360 \returns the added material 358 361 */ 359 362 Material* Model::addMaterial(const char* materialName) 360 363 { 361 362 364 Material* newMat = new Material(); 363 365 newMat->setName(materialName); … … 395 397 396 398 This function initializes a new Group. 397 With it you should be able to import .obj-files with more than one Models inside.398 */ 399 bool Model::addGroup 399 With it you should be able to create Models with more than one SubModel inside 400 */ 401 bool Model::addGroup(const char* groupString) 400 402 { 401 403 PRINTF(5)("Read Group: %s.\n", groupString); 402 if (this->groupCount != 0 && this->currentGroup->faceCount >0)404 if (this->groupCount != 0 && this->currentGroup->faceCount > 0) 403 405 { 404 406 // finalizeGroup(currentGroup); 405 this->currentGroup = this->currentGroup->next = new Group; 406 this->initGroup(this->currentGroup); 407 this->currentGroup = this->currentGroup->next = new ModelGroup; 407 408 } 408 409 // setting the group name if not default. … … 429 430 PRINTF(5)("reading in a vertex: %f %f %f\n", &subbuffer1, &subbuffer2, &subbuffer3); 430 431 this->vertices->addEntry(subbuffer1*scaleFactor, subbuffer2*scaleFactor, subbuffer3*scaleFactor); 432 this->vertexCount++; 431 433 return true; 432 434 } … … 443 445 PRINTF(5)("reading in a vertex: %f %f %f\n", x, y, z); 444 446 this->vertices->addEntry(x*scaleFactor, y*scaleFactor, z*scaleFactor); 447 this->vertexCount++; 445 448 return true; 446 449 } … … 460 463 PRINTF(5)("found vertex-Normal %f, %f, %f\n", &subbuffer1,&subbuffer2,&subbuffer3); 461 464 this->normals->addEntry(subbuffer1, subbuffer2, subbuffer3); 465 this->normalCount++; 462 466 return true; 463 467 } … … 475 479 PRINTF(5)("found vertex-Normal %f, %f, %f\n", x, y, z); 476 480 this->normals->addEntry(x, y, z); 481 this->normalCount++; 482 return true; 477 483 } 478 484 … … 492 498 this->vTexture->addEntry(subbuffer1); 493 499 this->vTexture->addEntry(subbuffer2); 500 this->texCoordCount++; 494 501 return true; 495 502 } … … 507 514 this->vTexture->addEntry(u); 508 515 this->vTexture->addEntry(v); 516 this->texCoordCount++; 517 return true; 509 518 } 510 519 … … 514 523 515 524 If a face line is found this function will add it to the glList. 525 526 String is different from the argument addFace, in this that the first Vertex/Normal/Texcoord is 1 instead of 0 516 527 */ 517 528 bool Model::addFace (const char* faceString) 518 529 { 519 530 if (this->currentGroup->faceCount >0) 520 this->currentGroup->currentFace = this->currentGroup->currentFace->next = new Face; 521 this->initFace (this->currentGroup->currentFace); 522 523 FaceElement* tmpElem = this->currentGroup->currentFace->firstElem = new FaceElement; 531 this->currentGroup->currentFace = this->currentGroup->currentFace->next = new ModelFace; 532 533 ModelFaceElement* tmpElem = this->currentGroup->currentFace->firstElem = new ModelFaceElement; 524 534 tmpElem->next = NULL; 525 535 while(strcmp (faceString, "\0")) 526 536 { 527 537 if (this->currentGroup->currentFace->vertexCount>0) 528 tmpElem = tmpElem->next = new FaceElement;538 tmpElem = tmpElem->next = new ModelFaceElement; 529 539 tmpElem->next = NULL; 530 540 … … 552 562 if (vertex) 553 563 tmpElem->vertexNumber = atoi(vertex)-1; 554 else555 tmpElem->vertexNumber = -1;556 564 if (texture) 557 565 tmpElem->texCoordNumber = atoi(texture)-1; 558 else559 tmpElem->texCoordNumber = -1;560 566 if (normal) 561 567 tmpElem->normalNumber = atoi(normal)-1; 562 else563 tmpElem->normalNumber = -1;564 568 565 569 faceString += tmpLen; … … 575 579 \brief adds a new Face 576 580 \param faceElemCount the number of Vertices to add to the Face. 577 \param type 0: vertex only, 1: vertex and normal, 2: vertex and Texture, 3 vertex, normal and texture581 \param type The information Passed with each Vertex 578 582 */ 579 583 bool Model::addFace(int faceElemCount, VERTEX_FORMAT type, ...) 580 584 { 581 if (this->currentGroup->faceCount > 0) 582 this->currentGroup->currentFace = this->currentGroup->currentFace->next = new Face; 583 this->initFace (this->currentGroup->currentFace); 584 585 FaceElement* tmpElem = this->currentGroup->currentFace->firstElem = new FaceElement; 586 tmpElem->next = NULL; 585 if (this->currentGroup->faceCount > 0) 586 this->currentGroup->currentFace = this->currentGroup->currentFace->next = new ModelFace; 587 588 ModelFaceElement* tmpElem = this->currentGroup->currentFace->firstElem = new ModelFaceElement; 587 589 588 590 va_list itemlist; … … 591 593 for (int i = 0; i < faceElemCount; i++) 592 594 { 593 if (this->currentGroup->currentFace->vertexCount>0) 594 tmpElem = tmpElem->next = new FaceElement; 595 tmpElem->next = NULL; 596 597 tmpElem->vertexNumber = va_arg (itemlist, int) -1; 595 if (this->currentGroup->currentFace->vertexCount > 0) 596 tmpElem = tmpElem->next = new ModelFaceElement; 597 598 tmpElem->vertexNumber = va_arg (itemlist, int); 598 599 if (type & TEXCOORD) 599 tmpElem->texCoordNumber = va_arg (itemlist, int) -1;600 tmpElem->texCoordNumber = va_arg (itemlist, int); 600 601 if (type & NORMAL) 601 tmpElem->normalNumber = va_arg(itemlist, int) -1;602 tmpElem->normalNumber = va_arg(itemlist, int); 602 603 this->currentGroup->currentFace->vertexCount++; 603 604 } … … 614 615 { 615 616 if (this->currentGroup->faceCount > 0) 616 this->currentGroup->currentFace = this->currentGroup->currentFace->next = new Face; 617 this->initFace (this->currentGroup->currentFace); 617 this->currentGroup->currentFace = this->currentGroup->currentFace->next = new ModelFace; 618 618 619 619 this->currentGroup->currentFace->material = this->findMaterialByName(matString); … … 630 630 { 631 631 if (this->currentGroup->faceCount > 0) 632 this->currentGroup->currentFace = this->currentGroup->currentFace->next = new Face; 633 this->initFace (this->currentGroup->currentFace); 632 this->currentGroup->currentFace = this->currentGroup->currentFace->next = new ModelFace; 634 633 635 634 this->currentGroup->currentFace->material = mtl; … … 662 661 Vector curV; 663 662 664 Group* tmpGroup = firstGroup;663 ModelGroup* tmpGroup = firstGroup; 665 664 while (tmpGroup) 666 665 { 667 Face* tmpFace = tmpGroup->firstFace;666 ModelFace* tmpFace = tmpGroup->firstFace; 668 667 while (tmpFace) 669 668 { 670 669 if (tmpFace->firstElem) 671 670 { 672 FaceElement* firstElem = tmpFace->firstElem;673 FaceElement* prevElem;674 FaceElement* curElem = firstElem;675 FaceElement* nextElem;676 FaceElement* lastElem;671 ModelFaceElement* firstElem = tmpFace->firstElem; 672 ModelFaceElement* prevElem; 673 ModelFaceElement* curElem = firstElem; 674 ModelFaceElement* nextElem; 675 ModelFaceElement* lastElem; 677 676 // find last Element of the Chain. !! IMPORTANT:the last Element of the Chain must point to NULL, or it will resolv into an infinity-loop. 678 677 while (curElem) … … 704 703 } 705 704 706 for (int i=0; i <vertices->getCount()/3;i++)705 for (int i=0; i < vertices->getCount()/3;i++) 707 706 { 708 707 normArray[i].normalize(); 709 708 PRINTF(5)("Found Normale number %d: (%f; %f, %f).\n", i, normArray[i].x, normArray[i].y, normArray[i].z); 710 709 711 this-> normals->addEntry(normArray[i].x, normArray[i].y, normArray[i].z);710 this->addVertexNormal(normArray[i].x, normArray[i].y, normArray[i].z); 712 711 713 712 } … … 744 743 745 744 // Putting Faces to GL 746 Face* tmpFace = this->currentGroup->firstFace;745 ModelFace* tmpFace = this->currentGroup->firstFace; 747 746 while (tmpFace != NULL) 748 747 { … … 794 793 } 795 794 796 FaceElement* tmpElem = tmpFace->firstElem;795 ModelFaceElement* tmpElem = tmpFace->firstElem; 797 796 while (tmpElem != NULL) 798 797 { … … 826 825 glNormalPointer(3, 0, this->normals->getArray()); 827 826 glTexCoordPointer(2, GL_FLOAT, 0, this->vTexture->getArray()); 828 829 827 } 830 828 … … 841 839 merging this information, the face will be drawn. 842 840 */ 843 bool Model::addGLElement ( FaceElement* elem)841 bool Model::addGLElement (ModelFaceElement* elem) 844 842 { 845 843 PRINTF(5)("importing grafical Element to openGL.\n"); 846 844 847 845 if (elem->texCoordNumber != -1) 848 glTexCoord2fv(this->vTexture->getArray() + elem->texCoordNumber * 2); 846 { 847 if (likely(elem->texCoordNumber < this->texCoordCount)) 848 glTexCoord2fv(this->vTexture->getArray() + elem->texCoordNumber * 2); 849 else 850 PRINTF(2)("TextureCoordinate %d is not in the List (max: %d)\nThe Model might be incomplete\n", 851 elem->texCoordNumber, this->texCoordCount); 852 } 849 853 if (elem->normalNumber != -1) 850 glNormal3fv(this->normals->getArray() + elem->normalNumber * 3); 854 { 855 if (likely(elem->normalNumber < this->normalCount)) 856 glNormal3fv(this->normals->getArray() + elem->normalNumber * 3); 857 else 858 PRINTF(2)("Normal %d is not in the List (max: %d)\nThe Model might be incomplete", 859 elem->normalNumber, this->normalCount); 860 } 851 861 if (elem->vertexNumber != -1) 852 glVertex3fv(this->vertices->getArray() + elem->vertexNumber * 3); 862 { 863 if (likely(elem->vertexNumber < this->vertexCount)) 864 glVertex3fv(this->vertices->getArray() + elem->vertexNumber * 3); 865 else 866 PRINTF(2)("Vertex %d is not in the List (max: %d)\nThe Model might be incomplete", 867 elem->vertexNumber, this->vertexCount); 868 } 853 869 854 870 } … … 910 926 this->addVertexNormal (-1.0, 0.0, 0.0); 911 927 912 /* normaleLess-testingMode 913 this->addFace ("1 2 4 3"); 914 this->addFace ("3 4 6 5"); 915 this->addFace ("5 6 8 7"); 916 this->addFace ("7 8 2 1"); 917 this->addFace ("2 8 6 4"); 918 this->addFace ("7 1 3 5"); 919 */ 920 921 this->addFace (4, VERTEX_TEXCOORD_NORMAL, 1,1,1, 2,2,2, 4,4,3, 3,3,4); 922 this->addFace (4, VERTEX_TEXCOORD_NORMAL, 3,3,5, 4,4,6, 6,6,7, 5,5,8); 923 this->addFace (4, VERTEX_TEXCOORD_NORMAL, 5,5,9, 6,6,10, 8,8,11, 7,7,12); 924 this->addFace (4, VERTEX_TEXCOORD_NORMAL, 7,7,13, 8,8,14, 2,10,15, 1,9,16); 925 this->addFace (4, VERTEX_TEXCOORD_NORMAL, 2,2,17, 8,11,18, 6,12,19, 4,4,20); 926 this->addFace (4, VERTEX_TEXCOORD_NORMAL, 7,13,21, 1,1,22, 3,3,23, 5,14,24); 927 928 } 928 this->addFace (4, VERTEX_TEXCOORD_NORMAL, 0,0,0, 1,1,1, 3,3,2, 2,2,3); 929 this->addFace (4, VERTEX_TEXCOORD_NORMAL, 2,2,4, 3,3,5, 5,5,6, 4,4,7); 930 this->addFace (4, VERTEX_TEXCOORD_NORMAL, 4,4,8, 5,5,9, 7,7,10, 6,6,11); 931 this->addFace (4, VERTEX_TEXCOORD_NORMAL, 6,6,12, 7,7,13, 1,9,14, 0,8,15); 932 this->addFace (4, VERTEX_TEXCOORD_NORMAL, 1,1,16, 7,10,17, 5,11,18, 3,3,19); 933 this->addFace (4, VERTEX_TEXCOORD_NORMAL, 6,12,20, 0,0,21, 2,2,22, 4,13,23); 934 935 }
Note: See TracChangeset
for help on using the changeset viewer.