Ignore:
Timestamp:
02/12/07 08:33:45 (18 years ago)
Author:
mattausch
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/ObjReader/src/ObjReader.cpp

    r2111 r2112  
    22#include "gzstream.h" 
    33#include "Triangle3.h" 
     4#include "IntersectableWrapper.h" 
    45 
    56 
    67ObjReader::ObjReader() 
    78{} 
     9 
    810 
    911ObjReader::~ObjReader() 
     
    1214 
    1315bool ObjReader::LoadFile(const string &filename, 
    14                                                  TriangleContainer &triangles) const 
     16                                                 GtpVisibilityPreprocessor::ObjectContainer &objects) const 
    1517{ 
    1618        igzstream samplesIn(filename.c_str()); 
     
    2325 
    2426        samplesIn.read(reinterpret_cast<char *>(&numTriangles), sizeof(int)); 
    25         triangles.reserve(numTriangles); 
     27        objects.reserve(numTriangles); 
    2628         
    2729        while (1) 
    2830        { 
    29                 GtpVisibilityPreprocessor::Triangle3 *tri =  
    30                         new GtpVisibilityPreprocessor::Triangle3(); 
     31                GtpVisibilityPreprocessor::Triangle3 tri; 
    3132                 
    32                 samplesIn.read(reinterpret_cast<char *>((*tri).mVertices + 0),  
     33                samplesIn.read(reinterpret_cast<char *>(tri.mVertices + 0),  
    3334                                           sizeof(GtpVisibilityPreprocessor::Vector3)); 
    34                 samplesIn.read(reinterpret_cast<char *>((*tri).mVertices + 1),  
     35                samplesIn.read(reinterpret_cast<char *>(tri.mVertices + 1),  
    3536                                           sizeof(GtpVisibilityPreprocessor::Vector3)); 
    36                 samplesIn.read(reinterpret_cast<char *>((*tri).mVertices + 2),  
     37                samplesIn.read(reinterpret_cast<char *>(tri.mVertices + 2),  
    3738                                           sizeof(GtpVisibilityPreprocessor::Vector3)); 
    3839 
     
    4142                        break; 
    4243 
    43                 triangles.push_back(tri); 
     44                GtpVisibilityPreprocessor::TriangleIntersectable *obj =  
     45                        new GtpVisibilityPreprocessor::TriangleIntersectable(tri); 
     46                objects.push_back(obj); 
    4447        } 
    4548         
     
    5659#if TODO 
    5760 
    58 Ogre::Entity *IVReader::createEntity(Ogre::SceneManager* sceneMgr, std::string name, ObjMeshData *mData, Ogre::Vector3 *translation) 
     61Ogre::Entity *IVReader::createEntity(Ogre::SceneManager* sceneMgr,  
     62                                                                         std::string name,  
     63                                                                         ObjMeshData *mData,  
     64                                                                         Ogre::Vector3 *translation) 
    5965{ 
    6066        using namespace Ogre; 
     
    7278 
    7379                if (translation != NULL) *translation = data->boundingBox->getCenter(); 
    74  
    75 //              data->collapse(); 
    76 //              delete data; 
    77  
    7880 
    7981                addMeshToList(meshName, loader); 
     
    101103 
    102104 
    103 void IVReader::buildTree(Ogre::SceneManager* sceneMgr, Ogre::SceneNode *sceneNodeRoot) 
    104 { 
    105         using namespace Ogre; 
    106         if (root == NULL) return; 
    107  
    108         std::string s = intToStr(treeCnt) + "/" + fileName + "/Root"; 
    109         SceneNode *actualSceneNode = sceneNodeRoot->createChildSceneNode(s); 
    110         s = "/"; s = s + fileName + "/RootMaterial"; 
    111          
    112         Material* pMaterial = NULL; 
    113         if ((pMaterial = (Material *) MaterialManager::getSingleton().getByName(s).getPointer()) == NULL) 
    114         { 
    115                 pMaterial = (Material *)MaterialManager::getSingleton().create(s, "General").getPointer(); 
    116         } 
    117         pMaterial->load(); 
    118  
    119         nodeCnt = 1; matCnt = 1; 
    120          
    121  
    122         buildTree(sceneMgr, actualSceneNode, root, NULL, pMaterial);     
    123         treeCnt++;  
    124  
    125  
    126         std::string message = "Tree of "; message = message + fileName + " built (" + intToStr(nodeCnt) + " Nodes)"; 
    127         if (IVLog != NULL) IVLog->logMessage(message); 
    128  
    129 } 
    130  
    131 void IVReader::buildTree(Ogre::SceneManager* sceneMgr,   
    132                                                  Ogre::SceneNode *sceneNodeRoot,  
    133                                                  ObjNode *IVReaderoot, ObjMeshData *mData,  
    134                                                  Ogre::Material *material) 
    135 { 
    136         using namespace Ogre; 
    137  
    138         Material *newMaterial = NULL; 
    139  
    140         bool meshDataCreated = false; 
    141         if (mData == NULL) 
    142         { 
    143                 mData = new ObjMeshData(); 
    144                 meshDataCreated = true; 
    145         } 
    146  
    147         ObjType t; int i; 
    148          
    149         ObjNode *help = IVReaderoot->getNextChildNode(true); 
    150         while (help != NULL) 
    151         {        
    152                 if (strcmp(help->getName(), "USE") == 0) 
    153                 { 
    154                         char *defLabel = (char *) help->getField("label", &t, &i); 
    155                         if (t == IV_STRING)  
    156                         { 
    157                                 help = defList->getDef(defLabel); 
    158                         } 
    159                 } 
    160                 if ((strcmp(help->getName(), "Separator") == 0) || (strcmp(help->getName(), "TransformSeparator") == 0))  
    161                 { 
    162 /*                      std::string s = sceneNodeRoot->getName() + "/Sep" + intToStr(nodeCnt); 
    163                         nodeCnt++; 
    164                         SceneNode *actualSceneNode = sceneNodeRoot->createChildSceneNode(s); 
    165                         buildTree(sceneMgr, actualSceneNode, help, mData, actualMaterial); 
    166 */ 
    167                         if (newMaterial == NULL) newMaterial = material; 
    168                         buildTree(sceneMgr, sceneNodeRoot, help, mData, newMaterial); 
    169                 } 
    170  
    171                 if (strcmp(help->getName(), "Texture2") == 0) 
    172                 { 
    173                         char *textureFileName = (char *) help->getField("filename", &t, &i); 
    174                         if (t == IV_STRING)  
    175                         {   
    176                                 std::string s = sceneNodeRoot->getName().substr(sceneNodeRoot->getName().find('/',0), sceneNodeRoot->getName().length()) + "/Material" + intToStr(matCnt); 
    177                                 matCnt++; 
    178                                 if ((newMaterial = (Material *) MaterialManager::getSingleton().getByName(s).getPointer()) == NULL) 
    179                                 { 
    180                                         newMaterial = (Material *)MaterialManager::getSingleton().create(s, "General").getPointer(); 
    181                                         newMaterial->getTechnique(0)->getPass(0)->createTextureUnitState(textureFileName); 
    182                                 } 
    183                                 newMaterial->load(); 
    184                                 newMaterial->reload(); 
    185                         } 
    186                 } 
    187 // can be included 
    188                 if (strcmp(help->getName(), "Material") == 0) 
    189                 { 
    190                         Real *ambientColor = (Real *) help->getField("ambientColor", &t, &i); 
    191                         if ((i != 3) || (t != IV_REAL)) ambientColor = NULL; 
    192                         Real *diffuseColor = (Real *) help->getField("diffuseColor", &t, &i); 
    193                         if ((i != 3) || (t != IV_REAL)) diffuseColor = NULL; 
    194                         Real *specularColor = (Real *) help->getField("specularColor", &t, &i); 
    195                         if ((i != 3) || (t != IV_REAL)) specularColor = NULL; 
    196                         Real *emissiveColor = (Real *) help->getField("emissiveColor", &t, &i); 
    197                         if ((i != 3) || (t != IV_REAL)) emissiveColor = NULL; 
    198                         Real *shininess = (Real *) help->getField("shininess", &t, &i); 
    199                         if ((i != 1) || (t != IV_REAL)) shininess = NULL; 
    200                         Real *transparency = (Real *) help->getField("transparency", &t, &i); 
    201                         if ((i != 1) || (t != IV_REAL)) transparency = NULL; 
    202  
    203                         if (newMaterial == NULL) 
    204                         { 
    205                                 std::string s = sceneNodeRoot->getName().substr(sceneNodeRoot->getName().find('/',0), sceneNodeRoot->getName().length()) + "/Material" + intToStr(matCnt); 
    206                                 matCnt++; 
    207                                 if ((newMaterial = (Material *) MaterialManager::getSingleton().getByName(s).getPointer()) == NULL) 
    208                                 { 
    209                                         if (material == NULL) newMaterial = (Material *)MaterialManager::getSingleton().create(s, "General").getPointer(); 
    210                                         else newMaterial = material->clone(s).getPointer(); 
    211  
    212                                         Real alpha = 1.f; 
    213                                         if (transparency != NULL) alpha = 1.f - transparency[0]; 
    214                                         if (ambientColor != NULL) newMaterial->setAmbient(ambientColor[0], ambientColor[1], ambientColor[2]); 
    215                                         if (diffuseColor != NULL) newMaterial->setDiffuse(diffuseColor[0], diffuseColor[1], diffuseColor[2], alpha); 
    216                                         if (specularColor != NULL) newMaterial->setSpecular(specularColor[0], specularColor[1], specularColor[2], alpha); 
    217                                         if (emissiveColor != NULL) newMaterial->setSelfIllumination(emissiveColor[0], emissiveColor[1], emissiveColor[2]); 
    218                                         if (shininess != NULL) newMaterial->setShininess(shininess[0]); 
    219                                          
    220 //                                      if (material->getTechnique(0)->getPass(0)->getNumTextureUnitStates() > 0)                                                        
    221 //                                      { 
    222 //                                              newMaterial->getTechnique(0)->getPass(0)->createTextureUnitState(material->getTechnique(0)->getPass(0)->getTextureUnitState(0)->getTextureName()); 
    223 //                                      } 
    224                                 } 
    225                                 newMaterial->load(); 
    226                                 newMaterial->reload(); 
    227                         } 
    228                         else 
    229                         { 
    230                                 Real alpha = 1.f; 
    231                                 if (transparency != NULL) alpha = 1.f - transparency[0]; 
    232                                 if (ambientColor != NULL) newMaterial->setAmbient(ambientColor[0], ambientColor[1], ambientColor[2]); 
    233                                 if (diffuseColor != NULL) newMaterial->setDiffuse(diffuseColor[0], diffuseColor[1], diffuseColor[2], alpha); 
    234                                 if (specularColor != NULL) newMaterial->setSpecular(specularColor[0], specularColor[1], specularColor[2], alpha); 
    235                                 if (emissiveColor != NULL) newMaterial->setSelfIllumination(emissiveColor[0], emissiveColor[1], emissiveColor[2]); 
    236                                 if (shininess != NULL) newMaterial->setShininess(shininess[0]); 
    237                                 newMaterial->load(); 
    238                         } 
    239                 } 
    240  
    241                 if (strcmp(help->getName(), "Coordinate3") == 0) 
    242                 { 
    243                         mData->vertices = (Real *) help->getField("point", &t, &mData->vcnt); 
    244                         if ((t != IV_REAL) && (t != IV_INT)) mData->vertices = NULL; 
    245                 } 
    246                 if (strcmp(help->getName(), "Normal") == 0) 
    247                 { 
    248                         mData->normals = (Real *) help->getField("vector", &t, &mData->ncnt); 
    249                         if ((t != IV_REAL) && (t != IV_INT)) mData->normals = NULL; 
    250                 } 
    251                 if (strcmp(help->getName(), "TextureCoordinate2") == 0) 
    252                 { 
    253                         mData->texCoords = (Real *) help->getField("point", &t, &mData->tcnt); 
    254                         if ((t != IV_REAL) && (t != IV_INT)) mData->texCoords = NULL; 
    255                 } 
    256  
    257                 if (strcmp(help->getName(), "IndexedFaceSet") == 0) 
    258                 { 
    259                         std::string s = sceneNodeRoot->getName() + "/IFS" + intToStr(nodeCnt); 
    260                         nodeCnt++; 
    261                         SceneNode *triangleStripSceneNode = sceneNodeRoot->createChildSceneNode(s); 
    262  
    263                         mData->indices = (Real *) help->getField("coordIndex", &t, &mData->icnt); 
    264                         if (t != IV_INT) mData->indices = NULL; 
    265  
    266                         mData->normalIndices = (Real *) help->getField("normalIndex", &t, &mData->nicnt); 
    267                         if (t != IV_INT) mData->normalIndices = NULL; 
    268                  
    269                         mData->texCoordIndices = (Real *) help->getField("textureCoordIndex", &t, &mData->ticnt); 
    270                         if (t != IV_INT) mData->texCoordIndices = NULL; 
    271                  
    272  
    273                         mData->roType = IV_ROT_FACE_SET;                 
    274          
    275                         Vector3 translation = Vector3(0,0,0); 
    276                         Entity *pEntity = createEntity(sceneMgr, s, mData, &translation); 
    277                         if (newMaterial == NULL) newMaterial = material; 
    278                         if (newMaterial != NULL) pEntity->setMaterialName(newMaterial->getName()); 
    279                                  
    280                         triangleStripSceneNode->attachObject(pEntity); 
    281                         triangleStripSceneNode->translate(translation);          
    282  
    283                 } 
    284  
    285  
    286                 if (strcmp(help->getName(), "IndexedTriangleStripSet") == 0) 
    287                 { 
    288                         std::string s = sceneNodeRoot->getName() + "/ITS" + intToStr(nodeCnt); 
    289                         nodeCnt++; 
    290                         SceneNode *triangleStripSceneNode = sceneNodeRoot->createChildSceneNode(s); 
    291                  
    292                         mData->indices = (Real *) help->getField("coordIndex", &t, &mData->icnt); 
    293                         if (t != IV_INT) mData->indices = NULL; 
    294  
    295                         mData->normalIndices = (Real *) help->getField("normalIndex", &t, &mData->nicnt); 
    296                         if (t != IV_INT) mData->normalIndices = NULL; 
    297  
    298                         mData->texCoordIndices = (Real *) help->getField("textureCoordIndex", &t, &mData->ticnt); 
    299                         if (t != IV_INT) mData->texCoordIndices = NULL; 
    300  
    301                         ObjNode *n = help->getNextChildNode(true); 
    302                         while ((n != NULL) && (strcmp(help->getName(), "VertexProperty") == 0)) 
    303                         { 
    304                                 n = help->getNextChildNode(); 
    305                         } 
    306                         if (n != NULL) 
    307                         { 
    308                                 mData->vertices = (Real *) n->getField("vertex", &t, &mData->vcnt); 
    309                                 if ((t != IV_REAL) && (t != IV_INT)) mData->vertices = NULL; 
    310  
    311                                 mData->normals = (Real *) n->getField("normal", &t, &mData->ncnt); 
    312                                 if ((t != IV_REAL) && (t != IV_INT)) mData->normals = NULL; 
    313                                 mData->texCoords = (Real *) n->getField("texCoord", &t, &mData->tcnt); 
    314                                 if ((t != IV_REAL) && (t != IV_INT)) mData->texCoords = NULL; 
    315                         } 
    316  
    317                         mData->roType = IV_ROT_TRIANGLE_STRIP;           
    318  
    319                         Vector3 translation = Vector3(0,0,0); 
    320                         Entity *pEntity = createEntity(sceneMgr, s, mData, &translation); 
    321                         if (newMaterial == NULL) newMaterial = material; 
    322                         if (newMaterial != NULL) pEntity->setMaterialName(newMaterial->getName()); 
    323                                  
    324                         triangleStripSceneNode->attachObject(pEntity); 
    325                         triangleStripSceneNode->translate(translation);          
    326  
    327                 } 
    328  
    329                 help = IVReaderoot->getNextChildNode(); 
    330         } 
    331         if (meshDataCreated) if (mData != NULL) delete mData; 
    332 } 
    333105#endif 
Note: See TracChangeset for help on using the changeset viewer.