Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Apr 25, 2005, 9:29:41 AM (19 years ago)
Author:
patrick
Message:

orxonox/branches/physics: merged with trunk - with command svn merge -r 3866:HEAD

File:
1 edited

Legend:

Unmodified
Added
Removed
  • orxonox/branches/physics/src/lib/graphics/importer/objModel.cc

    r3658 r3953  
    1818#include "objModel.h"
    1919
    20 #include <fstream>
     20#include <stdio.h>
     21#include <string.h>
     22#include <stdlib.h>
     23
     24#define PARSELINELENGTH 8192
    2125
    2226#include "debug.h"
     27#include "compiler.h"
    2328
    2429/**
     
    2732   \param scaling The factor that the model will be scaled with.
    2833*/
    29 OBJModel::OBJModel(char* fileName, float scaling)
     34OBJModel::OBJModel(const char* fileName, float scaling) : Model(fileName)
    3035{
    3136  this->initializeOBJ();
     
    3439  this->importFile (fileName);
    3540
    36   this->importToGL ();
    37 
    38   this->cleanup();
     41  this->finalize();
    3942}
    4043
     
    6366  this->objFileName = NULL;
    6467  this->mtlFileName = NULL;
    65 
    66   this->initialize();
    6768}
    6869
     
    7172   \param fileName The file to import
    7273*/
    73 bool OBJModel::importFile (char* fileName)
     74bool OBJModel::importFile (const char* fileName)
    7475{
    7576  PRINTF(4)("preparing to read in file: %s\n", fileName);
     
    8384  char pathSplitter='/';
    8485#endif /* __WIN32__ */
    85   char* tmpName = fileName;
     86  char* tmpName;
     87  strcpy(tmpName, fileName);
    8688  if (tmpName[0] == pathSplitter)
    8789    tmpName++;
     
    100102 
    101103  this->setName(name);
    102   if (this->material)
    103     this->material->addTexturePath(this->objPath);
     104
    104105  this->objFileName = new char[strlen(name)+1];
    105106  strcpy (this->objFileName, name);
     
    120121  strcat(fileName, this->objFileName);
    121122
    122   ifstream* OBJ_FILE = new ifstream(fileName);
    123   if (OBJ_FILE->fail())
    124     {
    125       PRINTF(1)("unable to open .OBJ file: %s\n Loading cube-Model instead.\n", fileName);
    126       cubeModel();
    127       OBJ_FILE->close();
    128       delete []fileName;
    129       delete OBJ_FILE;
     123  FILE* stream;
     124  if( (stream = fopen (fileName, "r")) == NULL)
     125    {
     126      printf("IniParser could not open %s\n", fileName);
    130127      return false;
    131128    }
    132   PRINTF(4)("Reading from opened file %s\n", fileName);
    133   char Buffer[10000];
    134   while(!OBJ_FILE->eof())
    135     {
    136       OBJ_FILE->getline(Buffer, 10000);
    137       PRINTF(5)("Read input line: %s\n", Buffer);
     129
     130  char buffer[PARSELINELENGTH];
     131  while(fgets(buffer, PARSELINELENGTH, stream))
     132    {
     133      // line termiated with \0 not \n
     134      if (buffer[strlen(buffer)-1] == '\n')
     135        buffer[strlen(buffer)-1] = '\0';
     136
     137      // case vertice
     138      if (!strncmp(buffer, "v ", 2))
     139        {
     140          this->addVertex(buffer+2);
     141        }
     142
     143      // case face
     144      else if (!strncmp(buffer, "f ", 2))
     145        {
     146          this->addFace (buffer+2);
     147        }
    138148     
    139 
    140       // case vertice
    141       if (!strncmp(Buffer, "v ", 2))
    142         {
    143           this->addVertex(Buffer+2);
    144         }
    145 
    146       // case face
    147       else if (!strncmp(Buffer, "f ", 2))
    148         {
    149           this->addFace (Buffer+2);
    150         }
    151      
    152       else if (!strncmp(Buffer, "mtllib ", 7))
    153         {
    154           this->readMtlLib (Buffer+7);
    155         }
    156 
    157       else if (!strncmp(Buffer, "usemtl ", 7))
    158         {
    159           this->addUseMtl (Buffer+7);
     149      else if (!strncmp(buffer, "mtllib ", 7))
     150        {
     151          this->readMtlLib (buffer+7);
     152        }
     153
     154      else if (!strncmp(buffer, "usemtl ", 7))
     155        {
     156          this->setMaterial (buffer+7);
    160157        }
    161158
    162159      // case VertexNormal
    163       else if (!strncmp(Buffer, "vn ", 3))
    164         {
    165           this->addVertexNormal(Buffer+3);
     160      else if (!strncmp(buffer, "vn ", 3))
     161        {
     162          this->addVertexNormal(buffer+3);
    166163        }
    167164     
    168165      // case VertexTextureCoordinate
    169       else if (!strncmp(Buffer, "vt ", 3))
    170         {
    171           this->addVertexTexture(Buffer+3);
     166      else if (!strncmp(buffer, "vt ", 3))
     167        {
     168          this->addVertexTexture(buffer+3);
    172169        }
    173170      // case group
    174       else if (!strncmp(Buffer, "g ", 2))
    175         {
    176           this->addGroup (Buffer+2);
    177         }
    178       else if (!strncmp(Buffer, "s ", 2)) //! \todo smoothing groups have to be implemented
    179         {
    180           PRINTF(2)("smoothing groups not supportet yet. line: %s\n", Buffer);
    181         }
    182     }
    183   OBJ_FILE->close();
    184   delete OBJ_FILE;
     171      else if (!strncmp(buffer, "g ", 2))
     172        {
     173          this->addGroup (buffer+2);
     174        }
     175      else if (!strncmp(buffer, "s ", 2)) //! \todo smoothing groups have to be implemented
     176        {
     177          PRINTF(2)("smoothing groups not supportet yet. line: %s\n", buffer);
     178        }
     179    }
     180  fclose (stream);
    185181  delete []fileName;
    186182  return true;
     
    196192
    197193*/
    198 bool OBJModel::readMtlLib (char* mtlFile)
     194bool OBJModel::readMtlLib (const char* mtlFile)
    199195{
    200196  this->mtlFileName = new char [strlen(mtlFile)+1];
     
    205201 
    206202
    207   PRINTF(4)("Opening mtlFile: %s\n", fileName);
    208 
    209   ifstream* MTL_FILE = new ifstream (fileName);
    210   if (MTL_FILE->fail())
    211     {
    212       PRINTF(2)("unable to open file: %s\n", fileName);
    213       MTL_FILE->close();
    214       delete []fileName;
    215       delete MTL_FILE;
     203  FILE* stream;
     204  if( (stream = fopen (fileName, "r")) == NULL)
     205    {
     206      printf("IniParser could not open %s\n", fileName);
    216207      return false;
    217208    }
    218   char Buffer[500];
    219   Material* tmpMat = material;
    220   while(!MTL_FILE->eof())
    221     {
    222       MTL_FILE->getline(Buffer, 500);
    223       PRINTF(5)("found line in mtlFile: %s\n", Buffer);
     209
     210  char buffer[PARSELINELENGTH];
     211  Material* tmpMat = NULL;
     212
     213  while(fgets(buffer, PARSELINELENGTH, stream))
     214    {
     215      PRINTF(5)("found line in mtlFile: %s\n", buffer);
     216
     217      // line termiated with \0 not \n
     218      if (buffer[strlen(buffer)-1] == '\n')
     219        buffer[strlen(buffer)-1] = '\0';
     220
     221      // create new Material
     222      if (!strncmp(buffer, "newmtl ", 7))
     223        {
     224          tmpMat = this->addMaterial(buffer+7);//tmpMat->addMaterial(buffer+7);
     225        }
     226      // setting a illumMode
     227      else if (!strncmp(buffer, "illum ", 6))
     228        {
     229          if (likely(tmpMat != NULL))
     230            tmpMat->setIllum(buffer+6);
     231
     232        }
     233      // setting Diffuse Color
     234      else if (!strncmp(buffer, "Kd ", 3))
     235        {
     236          if (likely(tmpMat != NULL))
     237            tmpMat->setDiffuse(buffer+3);
     238        }
     239      // setting Ambient Color
     240      else if (!strncmp(buffer, "Ka ", 3))
     241        {
     242          if (likely(tmpMat != NULL))
     243            tmpMat->setAmbient(buffer+3);
     244        }
     245      // setting Specular Color
     246      else if (!strncmp(buffer, "Ks ", 3))
     247        {
     248          if (likely(tmpMat != NULL))
     249            tmpMat->setSpecular(buffer+3);
     250        }
     251      // setting The Specular Shininess
     252      else if (!strncmp(buffer, "Ns ", 3))
     253        {
     254          if (likely(tmpMat != NULL))
     255            tmpMat->setShininess(buffer+3);
     256        }
     257      // setting up transparency
     258      else if (!strncmp(buffer, "d ", 2))
     259        {
     260          if (likely(tmpMat != NULL))
     261            tmpMat->setTransparency(buffer+2);
     262        }
     263      else if (!strncmp(buffer, "Tf ", 3))
     264        {
     265          if (likely(tmpMat != NULL))
     266            tmpMat->setTransparency(buffer+3);
     267        }
    224268     
    225 
    226       // create new Material
    227       if (!strncmp(Buffer, "newmtl ", 7))
    228         {
    229           tmpMat = tmpMat->addMaterial(Buffer+7);
    230           //      PRINTF(2)("%s, %p\n", tmpMat->getName(), tmpMat);
    231         }
    232       // setting a illumMode
    233       else if (!strncmp(Buffer, "illum ", 6))
    234         {
    235           tmpMat->setIllum(Buffer+6);
    236 
    237         }
    238       // setting Diffuse Color
    239       else if (!strncmp(Buffer, "Kd ", 3))
    240         {
    241           tmpMat->setDiffuse(Buffer+3);
    242         }
    243       // setting Ambient Color
    244       else if (!strncmp(Buffer, "Ka ", 3))
    245         {
    246           tmpMat->setAmbient(Buffer+3);
    247         }
    248       // setting Specular Color
    249       else if (!strncmp(Buffer, "Ks ", 3))
    250         {
    251           tmpMat->setSpecular(Buffer+3);
    252         }
    253       // setting The Specular Shininess
    254       else if (!strncmp(Buffer, "Ns ", 3))
    255         {
    256           tmpMat->setShininess(Buffer+3);
    257         }
    258       // setting up transparency
    259       else if (!strncmp(Buffer, "d ", 2))
    260         {
    261           tmpMat->setTransparency(Buffer+2);
    262         }
    263       else if (!strncmp(Buffer, "Tf ", 3))
    264         {
    265           tmpMat->setTransparency(Buffer+3);
    266         }
    267      
    268       else if (!strncmp(Buffer, "map_Kd ", 7))
    269         {
    270           tmpMat->setDiffuseMap(Buffer+7);
    271         }
    272       else if (!strncmp(Buffer, "map_Ka ", 7))
    273         {
    274           tmpMat->setAmbientMap(Buffer+7);
    275         }
    276       else if (!strncmp(Buffer, "map_Ks ", 7))
    277         {
    278           tmpMat->setSpecularMap(Buffer+7);
    279         }
    280       else if (!strncmp(Buffer, "bump ", 5))
    281         {
    282           tmpMat->setBump(Buffer+7);
     269      else if (!strncmp(buffer, "map_Kd ", 7))
     270        {
     271          if (likely(tmpMat != NULL))
     272            tmpMat->setDiffuseMap(buffer+7);
     273        }
     274      else if (!strncmp(buffer, "map_Ka ", 7))
     275        {
     276          if (likely(tmpMat != NULL))
     277            tmpMat->setAmbientMap(buffer+7);
     278        }
     279      else if (!strncmp(buffer, "map_Ks ", 7))
     280        {
     281          if (likely(tmpMat != NULL))
     282            tmpMat->setSpecularMap(buffer+7);
     283        }
     284      else if (!strncmp(buffer, "bump ", 5))
     285        {
     286          if (likely(tmpMat != NULL))
     287            tmpMat->setBump(buffer+7);
    283288        }
    284289     
    285290
    286291    }
    287   MTL_FILE->close();
     292  fclose(stream);
    288293  delete []fileName;
    289   delete MTL_FILE;
    290294  return true;
    291295}
Note: See TracChangeset for help on using the changeset viewer.