Changeset 4178 in orxonox.OLD for orxonox/branches/physics/src/lib/graphics/importer
- Timestamp:
- May 13, 2005, 11:16:33 PM (20 years ago)
- Location:
- orxonox/branches/physics
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
orxonox/branches/physics
- Property svn:externals
-
old new 1 data http://svn.orxonox.ethz.ch/data 1
-
- Property svn:externals
-
orxonox/branches/physics/src/lib/graphics/importer/Makefile.in
r3953 r4178 119 119 EXEEXT = @EXEEXT@ 120 120 GPROF = @GPROF@ 121 GTHREAD_CFLAGS = @GTHREAD_CFLAGS@122 GTHREAD_LIBS = @GTHREAD_LIBS@123 121 GTK2_CFLAGS = @GTK2_CFLAGS@ 124 122 GTK2_LIBS = @GTK2_LIBS@ 125 123 HAVE_CURL_FALSE = @HAVE_CURL_FALSE@ 126 124 HAVE_CURL_TRUE = @HAVE_CURL_TRUE@ 127 HAVE_GTHREAD_FALSE = @HAVE_GTHREAD_FALSE@128 HAVE_GTHREAD_TRUE = @HAVE_GTHREAD_TRUE@129 125 HAVE_GTK2_FALSE = @HAVE_GTK2_FALSE@ 130 126 HAVE_GTK2_TRUE = @HAVE_GTK2_TRUE@ … … 147 143 PACKAGE_VERSION = @PACKAGE_VERSION@ 148 144 PATH_SEPARATOR = @PATH_SEPARATOR@ 145 PKG_CONFIG = @PKG_CONFIG@ 146 RANLIB = @RANLIB@ 149 147 SET_MAKE = @SET_MAKE@ 150 148 SHELL = @SHELL@ … … 155 153 ac_ct_CC = @ac_ct_CC@ 156 154 ac_ct_CXX = @ac_ct_CXX@ 155 ac_ct_RANLIB = @ac_ct_RANLIB@ 157 156 ac_ct_STRIP = @ac_ct_STRIP@ 158 157 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -
orxonox/branches/physics/src/lib/graphics/importer/array.cc
r3590 r4178 112 112 113 113 /** 114 \brief Gives back the array !! MUST be executed AFTER finalize.115 \returns The created array.116 */117 GLfloat* Array::getArray ()118 {119 return this->array;120 }121 122 /**123 \returns The Count of entries in the Array124 */125 int Array::getCount()126 {127 return this->entryCount;128 }129 130 /**131 114 \brief Simple debug info about the Array 132 115 */ 133 void Array::debug ( )116 void Array::debug (void) const 134 117 { 135 118 PRINT(0)("entryCount=%i, address=%p\n", this->entryCount, this->array); -
orxonox/branches/physics/src/lib/graphics/importer/array.h
r3590 r4178 23 23 void addEntry(GLfloat entry0, GLfloat entry1, GLfloat entry2); 24 24 25 GLfloat* getArray (); 26 int getCount(); 27 void debug(void); 25 /** \returns The array */ 26 inline const GLfloat* getArray () const {return this->array;} 27 /** \returns The Count of entries in the Array*/ 28 inline int getCount(void)const {return this->entryCount;} 29 void debug(void) const ; 28 30 private: 29 31 //! One entry of the Array -
orxonox/branches/physics/src/lib/graphics/importer/framework.cc
r3657 r4178 79 79 obj = new OBJModel(argv[1]); 80 80 else 81 obj = new PrimitiveModel( SPHERE);81 obj = new PrimitiveModel(CYLINDER); 82 82 83 83 M = Vector(wHandler.screen->w/2, wHandler.screen->h/2, 0); -
orxonox/branches/physics/src/lib/graphics/importer/material.cc
r3953 r4178 45 45 this->setTransparency(1.0); 46 46 47 48 47 this->diffuseTexture = NULL; 49 48 this->ambientTexture = NULL; 50 49 this->specularTexture = NULL; 51 52 this->diffuseTextureSet = false;53 this->ambientTextureSet = false;54 this->specularTextureSet = false;55 50 56 51 this->setName(mtlName); … … 88 83 89 84 // setting the transparency 90 if (this->transparency == 1.0) 91 { 92 glDisable(GL_BLEND); 93 } 94 else 85 if (this->transparency < 1.0) 95 86 { 96 87 glEnable(GL_BLEND); … … 98 89 glBlendFunc(GL_SRC_ALPHA, GL_ONE); 99 90 } 91 else 92 { 93 glDisable(GL_BLEND); 94 glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 95 } 96 100 97 101 98 // setting illumination Model … … 105 102 glShadeModel(GL_SMOOTH); 106 103 107 if (this->diffuseTexture Set)104 if (this->diffuseTexture) 108 105 { 109 106 glEnable(GL_TEXTURE_2D); 110 107 glBindTexture(GL_TEXTURE_2D, this->diffuseTexture->getTexture()); 108 109 /* This allows alpha blending of 2D textures with the scene */ 110 if (this->diffuseTexture->hasAlpha()) 111 { 112 glEnable(GL_BLEND); 113 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 114 } 111 115 } 112 116 else … … 291 295 { 292 296 PRINTF(4)("setting Diffuse Map %s\n", dMap); 293 // diffuseTexture = new Texture();294 // this->diffuseTextureSet = diffuseTexture->loadImage(dMap);295 297 296 298 //! \todo check if RESOURCE MANAGER is availiable 297 299 //! \todo Textures from .mtl-file need special care. 298 this->diffuseTexture Set = this->diffuseTexture= (Texture*)ResourceManager::getInstance()->load(dMap, IMAGE);300 this->diffuseTexture = (Texture*)ResourceManager::getInstance()->load(dMap, IMAGE); 299 301 } 300 302 -
orxonox/branches/physics/src/lib/graphics/importer/material.h
r3953 r4178 67 67 Texture* ambientTexture; //!< The ambient texture of the Material. 68 68 Texture* specularTexture;//!< The specular texture of the Material. 69 70 bool diffuseTextureSet; //!< Chekcs if the diffuse texture is Set.71 bool ambientTextureSet; //!< Chekcs if the ambient texture is Set.72 bool specularTextureSet;//!< Chekcs if the specular texture is Set.73 74 69 }; 75 70 #endif -
orxonox/branches/physics/src/lib/graphics/importer/model.cc
r3953 r4178 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 } -
orxonox/branches/physics/src/lib/graphics/importer/model.h
r3953 r4178 34 34 VERTEX_TEXCOORD_NORMAL = NORMAL | TEXCOORD}; 35 35 36 //////////////////// 37 /// SUB-ELEMENTS /// 38 //////////////////// 39 //! This is the placeholder of one Vertex beloning to a Face. 40 class ModelFaceElement 41 { 42 public: 43 ModelFaceElement(); 44 ~ModelFaceElement(); 45 46 int vertexNumber; //!< The number of the Vertex out of the Array* vertices, this vertex points to. 47 int normalNumber; //!< The number of the Normal out of the Array* normals, this vertex points to. 48 int texCoordNumber; //!< The number of the textureCoordinate out of the Array* vTexture, this vertex points to. 49 ModelFaceElement* next; //!< Point to the next FaceElement in this List. 50 }; 51 52 //! This is the placeholder of a Face belonging to a Group of Faces. 53 class ModelFace 54 { 55 public: 56 ModelFace(); 57 ~ModelFace(); 58 59 int vertexCount; //!< The Count of vertices this Face has. 60 ModelFaceElement* firstElem; //!< Points to the first Vertex (FaceElement) of this Face. 61 62 Material* material; //!< The Material to use. 63 64 ModelFace* next; //!< Pointer to the next Face. 65 }; 66 67 //! Group to handle multiple Models per obj-file. 68 class ModelGroup 69 { 70 public: 71 ModelGroup(); 72 ~ModelGroup(); 73 74 void cleanup(); 75 76 char* name; //!< the Name of the Group. this is an identifier, that can be accessed via the draw (char* name) function. 77 78 GLubyte* indices; //!< The indices of the Groups. Needed for vertex-arrays 79 GLuint listNumber; //!< The number of the GL-List this Group gets. 80 ModelFace* firstFace; //!< The first Face in this group. 81 ModelFace* currentFace; //!< The current Face in this Group (the one we are currently working with.) 82 int faceMode; //!< The Mode the Face is in: initially -1, 0 for FaceList opened, 1 for Material, 3 for triangle, 4 for Quad, 5+ for Poly \todo ENUM... 83 int faceCount; //!< The Number of Faces this Group holds. 84 85 ModelGroup* next; //!< Pointer to the next Group. 86 }; 87 88 ///////////// 89 /// MODEL /// 90 ///////////// 91 36 92 //! Class that handles 3D-Models. it can also read them in and display them. 37 93 class Model 38 94 { 39 95 private: 40 /////////////41 // structs //42 /////////////43 //! This is the placeholder of one Vertex beloning to a Face.44 struct FaceElement45 {46 int vertexNumber; //!< The number of the Vertex out of the Array* vertices, this vertex points to.47 int normalNumber; //!< The number of the Normal out of the Array* normals, this vertex points to.48 int texCoordNumber; //!< The number of the textureCoordinate out of the Array* vTexture, this vertex points to.49 FaceElement* next; //!< Point to the next FaceElement in this List.50 };51 96 52 //! This is the placeholder of a Face belonging to a Group of Faces. 53 struct Face 54 { 55 int vertexCount; //!< The Count of vertices this Face has. 56 FaceElement* firstElem; //!< Points to the first Vertex (FaceElement) of this Face. 97 char* name; //!< This is the name of the Model. 98 MODEL_TYPE type; //!< A type for the Model 99 bool finalized; //!< Sets the Object to be finalized. 57 100 58 Material* material; //!< The Material to use. 101 int vertexCount; //!< A modelwide Counter for vertices. 102 int normalCount; //!< A modelwide Counter for the normals. 103 int texCoordCount; //!< A modelwide Counter for the texCoord. 104 Array* vertices; //!< The Array that handles the Vertices. 105 Array* normals; //!< The Array that handles the Normals. 106 Array* vTexture; //!< The Array that handles the VertexTextureCoordinates. 59 107 60 Face* next; //!< Pointer to the next Face. 61 }; 108 ModelGroup* firstGroup; //!< The first of all groups. 109 ModelGroup* currentGroup; //!< The currentGroup. this is the one we will work with. 110 int groupCount; //!< The Count of Groups. 62 111 63 //! Group to handle multiple Models per obj-file. 64 struct Group 65 { 66 char* name; //!< the Name of the Group. this is an identifier, that can be accessed via the draw (char* name) function. 67 68 GLubyte* indices; //!< The indices of the Groups. Needed for vertex-arrays 69 GLuint listNumber; //!< The number of the GL-List this Group gets. 70 Face* firstFace; //!< The first Face in this group. 71 Face* currentFace; //!< The current Face in this Group (the one we are currently working with.) 72 int faceMode; //!< The Mode the Face is in: initially -1, 0 for FaceList opened, 1 for Material, 3 for triangle, 4 for Quad, 5+ for Poly \todo ENUM... 73 int faceCount; //!< The Number of Faces this Group holds. 74 75 Group* next; //!< Pointer to the next Group. 76 }; 77 78 char* name; //!< This is the name of the Model. 79 MODEL_TYPE type; 80 bool finalized; //!< Sets the Object to be finalized. 81 82 Array* vertices; //!< The Array that handles the Vertices. 83 int verticesCount; //!< A global Counter for vertices. 84 Array* normals; //!< The Array that handles the Normals. 85 Array* vTexture; //!< The Array that handles the VertexTextureCoordinates. 86 87 Group* firstGroup; //!< The first of all groups. 88 Group* currentGroup; //!< The currentGroup. this is the one we will work with. 89 int groupCount; //!< The Count of Groups. 90 91 tList<Material>* materialList; 112 tList<Material>* materialList;//!< A list for all the Materials in this Model 92 113 93 94 bool initGroup(Group* group);95 bool initFace (Face* face);96 97 114 bool buildVertexNormals(void); 98 115 99 116 bool importToDisplayList(void); 100 bool addGLElement( FaceElement* elem);117 bool addGLElement(ModelFaceElement* elem); 101 118 102 119 bool importToVertexArray(void); … … 104 121 bool deleteArrays(void); 105 122 bool cleanup(void); 106 bool cleanupGroup(Group* group);107 bool cleanupFace(Face* face);108 bool cleanupFaceElement(FaceElement* faceElem);109 123 110 124 … … 121 135 122 136 void setName(const char* name); 137 /** \returns the Name of the Model */ 123 138 inline const char* getName() {return this->name;} 124 139 … … 126 141 void draw(int groupNumber) const; 127 142 void draw(char* groupName) const; 128 int getGroupCount() const; 143 144 /** \returns Count of the Models (Groups) in this File */ 145 inline int getGroupCount(void) const {return this->groupCount;} 129 146 130 147 Material* addMaterial(Material* material); … … 143 160 bool setMaterial(Material* mtl); 144 161 void finalize(void); 162 163 /** \returns The number of Vertices of the Model */ 164 inline int getVertexCount(void) const {return this->vertexCount;} 165 /** \returns The number of Normals of the Model */ 166 inline int getNormalCount(void) const {return this->normalCount;} 167 /** \returns The number of Texture Coordinates of the Model*/ 168 inline int getTexCoordCount(void) const {return this->texCoordCount;} 145 169 }; 146 170 -
orxonox/branches/physics/src/lib/graphics/importer/objModel.cc
r3953 r4178 34 34 OBJModel::OBJModel(const char* fileName, float scaling) : Model(fileName) 35 35 { 36 this->initializeOBJ(); 36 this->objPath = "./"; 37 37 38 this->scaleFactor = scaling; 38 39 … … 52 53 if (this->objPath) 53 54 delete []this->objPath; 54 if (this->objFileName)55 delete []this->objFileName;56 if (this->mtlFileName)57 delete []this->mtlFileName;58 }59 60 /**61 \brief Initializes an obj-model62 */63 void OBJModel::initializeOBJ(void)64 {65 this->objPath = NULL;66 this->objFileName = NULL;67 this->mtlFileName = NULL;68 55 } 69 56 … … 71 58 \brief Imports a obj file and handles the the relative location 72 59 \param fileName The file to import 60 61 Splits the FileName from the DirectoryName 73 62 */ 74 63 bool OBJModel::importFile (const char* fileName) 75 64 { 76 65 PRINTF(4)("preparing to read in file: %s\n", fileName); 77 78 79 #ifdef __WIN32__ 80 // win32 path reading 81 char pathSplitter= '\\'; 82 #else /* __WIN32__ */ 83 // unix path reading 84 char pathSplitter='/'; 85 #endif /* __WIN32__ */ 86 char* tmpName; 87 strcpy(tmpName, fileName); 88 if (tmpName[0] == pathSplitter) 89 tmpName++; 90 char* name = tmpName; 91 while (( tmpName = strchr (tmpName+1, pathSplitter))) 92 { 93 name = tmpName+1; 94 } 95 this->objPath = new char[name-fileName+1]; 96 strncpy(this->objPath, fileName, name-fileName); 97 this->objPath[name-fileName] = '\0'; 98 if (strlen(objPath)> 0) 99 PRINTF(5)("Resolved file %s to folder: %s.\n", name, objPath); 100 else 101 PRINTF(5)("Resolved file %s.\n", name); 102 103 this->setName(name); 104 105 this->objFileName = new char[strlen(name)+1]; 106 strcpy (this->objFileName, name); 107 this->readFromObjFile (); 66 // splitting the 67 char* split = NULL; 68 69 if (!(split = strrchr(fileName, '/'))) 70 split = strrchr(fileName, '\\'); // windows Case 71 if (split) 72 { 73 int len = split - fileName+1; 74 this->objPath = new char[len +2]; 75 strncpy(this->objPath, fileName, len); 76 this->objPath[len] = '\0'; 77 PRINTF(1)("Resolved file %s to Path %s.\n", fileName, this->objPath); 78 } 79 this->readFromObjFile (fileName); 108 80 return true; 109 81 } … … 113 85 This function does read the file, parses it for the occurence of things like vertices, faces and so on, and executes the specific tasks 114 86 */ 115 bool OBJModel::readFromObjFile (void) 116 { 117 char* fileName = new char [strlen(objPath)+strlen(objFileName)+1]; 118 if (this->objFileName != NULL && !strcmp(this->objFileName, "")) 119 return false; 120 strcpy(fileName, this->objPath); 121 strcat(fileName, this->objFileName); 122 87 bool OBJModel::readFromObjFile(const char* fileName) 88 { 123 89 FILE* stream; 124 90 if( (stream = fopen (fileName, "r")) == NULL) 125 91 { 126 printf(" IniParser could not open%s\n", fileName);92 printf("Object File Could not be Opened %s\n", fileName); 127 93 return false; 128 94 } … … 179 145 } 180 146 fclose (stream); 181 delete []fileName;182 147 return true; 183 148 } … … 194 159 bool OBJModel::readMtlLib (const char* mtlFile) 195 160 { 196 this->mtlFileName = new char [strlen(mtlFile)+1]; 197 strcpy(this->mtlFileName, mtlFile); 198 char* fileName = new char [strlen(objPath) + strlen(this->mtlFileName)+1]; 199 strcpy(fileName, this->objPath); 200 strcat(fileName, this->mtlFileName); 201 161 char* fileName = new char [strlen(this->objPath) + strlen(mtlFile)+1]; 162 sprintf(fileName, "%s%s", this->objPath, mtlFile); 202 163 203 164 FILE* stream; 204 165 if( (stream = fopen (fileName, "r")) == NULL) 205 166 { 206 printf("IniParser could not open %s\n", fileName); 167 PRINTF(2)("MaterialLibrary could not be opened %s\n", fileName); 168 delete []fileName; 207 169 return false; 208 170 } -
orxonox/branches/physics/src/lib/graphics/importer/objModel.h
r3953 r4178 15 15 OBJModel(const char* fileName, float scaling = 1.0); 16 16 virtual ~OBJModel(); 17 void initializeOBJ(void);18 17 19 18 private: 20 19 // Variables 21 20 char* objPath; //!< The Path where the obj and mtl-file are located. 22 char* objFileName; //!< The Name of the obj-file.23 char* mtlFileName; //!< The Name of the mtl-file (parsed out of the obj-file)24 21 25 22 ///// readin ///// 26 23 bool importFile (const char* fileName); 27 bool readFromObjFile ( void);24 bool readFromObjFile (const char* fileName); 28 25 bool readMtlLib (const char* matFile); 29 26 }; -
orxonox/branches/physics/src/lib/graphics/importer/primitive_model.cc
r3953 r4178 71 71 void PrimitiveModel::sphereModel(float size, unsigned int detail) 72 72 { 73 int vertexCount = 0;74 73 if (detail <= 0) 75 74 detail = 1; … … 89 88 size * sin(vi) * cos(vj)); 90 89 this->addVertexTexture(i / (df *2.0), (j-1.0)/(df)+.5); 91 vertexCount++;92 90 } 93 91 } 94 92 this->addVertex(0, -size, 0); 93 this->addVertexTexture(0,0); 95 94 this->addVertex(0, size, 0); 95 this->addVertexTexture(0 ,1); 96 96 97 97 // defining the binding Faces. … … 102 102 { 103 103 104 v1 = i*detail + j ;105 v4 = i*detail + (j+1);104 v1 = i*detail + j-1; 105 v4 = i*detail + j; 106 106 107 107 if (i == detail*2 -1) 108 108 { 109 v2 = j ;110 v3 = j +1;109 v2 = j-1; 110 v3 = j; 111 111 } 112 112 else 113 113 { 114 v2 = (i+1)*detail + j ;115 v3 = (i+1)*detail + (j+1);116 } 117 114 v2 = (i+1)*detail + j-1; 115 v3 = (i+1)*detail + j; 116 } 117 118 118 if (j == 0) 119 119 { 120 v1 = vertexCount+1;120 v1 = this->getVertexCount()-2; 121 121 this->addFace(3, VERTEX_TEXCOORD, v1, v1, v3, v3, v4, v4); 122 122 } 123 123 else if (j == detail) 124 124 { 125 v3 = vertexCount+2;125 v3 = this->getVertexCount()-1; 126 126 this->addFace(3, VERTEX_TEXCOORD, v1, v1, v2, v2, v3, v3); 127 127 } … … 157 157 { 158 158 int p1, p2, p3, p4; 159 p1 = 2*i +1;160 p2 = 2*i+ 2;161 p3 = 2*i+ 4;162 p4 = 2*i+ 3;159 p1 = 2*i; 160 p2 = 2*i+1; 161 p3 = 2*i+3; 162 p4 = 2*i+2; 163 163 // something is wrong here 164 164 this->addFace(4, VERTEX_ONLY, p1, p2, p3, p4); 165 this->addFace(3, VERTEX_ONLY, p4, p1, 2*detail +1);166 this->addFace(3, VERTEX_ONLY, p2, p3, 2*detail+ 2);165 this->addFace(3, VERTEX_ONLY, p4, p1, 2*detail); 166 this->addFace(3, VERTEX_ONLY, p2, p3, 2*detail+1); 167 167 } 168 168 // caps 169 this->addFace(4, VERTEX_ONLY, 2*detail- 1, 2*detail, 2, 1);170 this->addFace(3, VERTEX_ONLY, 1, 2*detail-1, 2*detail+1);171 this->addFace(3, VERTEX_ONLY, 2*detail , 2, 2*detail+2);169 this->addFace(4, VERTEX_ONLY, 2*detail-2, 2*detail-1, 1, 0); 170 this->addFace(3, VERTEX_ONLY, 0, 2*detail-2, 2*detail); 171 this->addFace(3, VERTEX_ONLY, 2*detail-1, 1, 2*detail+1); 172 172 } 173 173 … … 198 198 { 199 199 unsigned int v1, v2; 200 v1 = i+ 3;200 v1 = i+2; 201 201 if (i == detail -1) 202 v2 = 3;202 v2 = 2; 203 203 else 204 v2 = i+ 4;205 this->addFace(3, VERTEX_ONLY, 1, v1, v2);206 this->addFace(3, VERTEX_ONLY, 2, v1, v2);204 v2 = i+3; 205 this->addFace(3, VERTEX_ONLY, 0, v1, v2); 206 this->addFace(3, VERTEX_ONLY, 1, v1, v2); 207 207 } 208 208 } … … 228 228 unsigned int v1, v2, v3, v4; 229 229 for (int i = 0; i < detail-1; i++) 230 for (int j = 1; j < detail; j++)230 for (int j = 0; j < detail-1; j++) 231 231 { 232 232 v1 = i*detail + j; -
orxonox/branches/physics/src/lib/graphics/importer/texture.cc
r3953 r4178 25 25 Texture::Texture(const char* imageName) 26 26 { 27 bAlpha = false; 27 28 this->texture = 0; 28 29 if (imageName) … … 112 113 if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA ) { 113 114 SDL_SetAlpha(surface, saved_flags | SDL_OPENGL, saved_alpha); 115 this->bAlpha = true; 114 116 } 115 117 … … 119 121 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 120 122 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 121 /* glTexImage2D(GL_TEXTURE_2D, 123 // build the Texture 124 glTexImage2D(GL_TEXTURE_2D, 122 125 0, 123 126 GL_RGBA, … … 127 130 GL_UNSIGNED_BYTE, 128 131 image->pixels); 129 */132 // build the MipMaps 130 133 gluBuild2DMipmaps(GL_TEXTURE_2D, 131 3,134 GL_RGBA, 132 135 w, 133 136 h, … … 135 138 GL_UNSIGNED_BYTE, 136 139 image->pixels); 137 140 138 141 SDL_FreeSurface(image); /* No longer needed */ 139 142 -
orxonox/branches/physics/src/lib/graphics/importer/texture.h
r3953 r4178 23 23 char* searchTextureInPaths(const char* texName) const; 24 24 void swap(unsigned char &a, unsigned char &b); 25 26 bool bAlpha; //!< if the texture has an alpha channel. 25 27 public: 26 28 Texture(const char* imageName = NULL); … … 30 32 inline GLuint getTexture(void) {return this->texture;} 31 33 GLuint loadTexToGL (SDL_Surface* surface); 34 inline bool hasAlpha(void) {return bAlpha;} 32 35 33 36 bool loadImage(const char* imageName);
Note: See TracChangeset
for help on using the changeset viewer.