Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/importer/object.cc @ 2833

Last change on this file since 2833 was 2833, checked in by bensch, 21 years ago

orxonox/trunk/importer: check if mtl exists, vn, vt do not have to be defined. Scaling ablility.

File size: 9.8 KB
RevLine 
[2823]1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Benjamin Grauer
13   co-programmer: ...
14*/
15
[2748]16#include "object.h"
[2776]17
[2748]18Object::Object ()
19{
[2765]20
[2767]21  initialize();
[2765]22
[2768]23  importFile ("reaphigh.obj");
[2767]24
25  finalize();
26}
27
[2773]28Object::Object(char* fileName)
29{
30  initialize();
31
32  importFile (fileName);
33
34  finalize();
35}
36
[2833]37Object::Object(char* fileName, float scaling)
[2767]38{
[2833]39  initialize();
40  scaleFactor = scaling;
41
42  importFile (fileName);
43
44  finalize();
[2767]45}
46
47bool Object::initialize (void)
48{
[2804]49  if (verbose >=3)
50    printf("new 3D-Object is being created\n"); 
[2767]51  faceMode = -1;
52  if ( (listNumber = glGenLists(1)) == 0 )
53    {
54      printf ("list could not be created for this Object\n");
55      return false;
[2760]56    }
[2833]57
58  mtlFileName = "";
59  scaleFactor = 1;
[2821]60  vertices = new Array();
61  normals = new Array();
62  vTexture = new Array();
63
[2767]64  glNewList (listNumber, GL_COMPILE);
65  glEnableClientState (GL_VERTEX_ARRAY);
[2794]66  glEnableClientState (GL_NORMAL_ARRAY);
67  //  glEnableClientState (GL_TEXTURE_COORD_ARRAY);
[2759]68
[2767]69  return true;
70}
71
[2833]72bool Object::importFile (char* fileName)
73{
74  if (verbose >=3)
75    printf("preparing to read in file: %s\n", fileName);   
76  objFileName = fileName;
77  this->readFromObjFile (objFileName);
78  return true;
79}
80
[2767]81bool Object::finalize(void)
82{
[2804]83  if (verbose >=3)
84    printf("finalizing the 3D-Object\n"); 
[2821]85  OBJ_FILE->close();
86  glEnd();
[2748]87  glEndList();
[2767]88  return true;
[2748]89}
90
[2767]91void Object::draw (void)
[2748]92{
[2804]93  if (verbose >=3)
94    printf("drawing the 3D-Object\n"); 
[2748]95  glCallList (listNumber);
96}
[2754]97
98
99bool Object::readFromObjFile (char* fileName)
100{
[2823]101  OBJ_FILE = new ifstream(fileName);
[2775]102  if (!OBJ_FILE->is_open())
103    {
[2804]104      if (verbose >=1)
[2821]105        printf ("unable to open .OBJ file: %s\n Loading Box Object instead.\n", fileName);
106      BoxObject();
[2775]107      return false;
108    }
[2804]109  objFileName = fileName;
[2765]110  char Buffer[500];
111  while(!OBJ_FILE->eof())
112    {
113      OBJ_FILE->getline(Buffer, 500);
[2804]114      if (verbose >=4)
115        printf ("Read input line: %s\n",Buffer);
[2765]116     
117
118      // case vertice
119      if (!strncmp(Buffer, "v ", 2))
120        {
[2767]121          readVertex(Buffer+2);
[2765]122        }
123
124      // case face
125      else if (!strncmp(Buffer, "f ", 2))
126        {
[2767]127          readFace (Buffer+2);
[2765]128        }
[2776]129     
130      else if (!strncmp(Buffer, "mtllib", 6))
131        {
132          readMtlLib (Buffer+7);
133        }
[2765]134
[2769]135      else if (!strncmp(Buffer, "usemtl", 6))
136        {
137          readUseMtl (Buffer+7);
138        }
[2794]139
140      // case VertexNormal
141      else if (!strncmp(Buffer, "vn ", 2))
142      {
143        readVertexNormal(Buffer+3);
144      }
145
[2765]146      // case vt
147      else if (!strncmp(Buffer, "vt ", 2))
148      {
[2820]149        readVertexTexture(Buffer+3);
[2765]150      }
151         
152
153    }
154 
155
156 
157 
[2767]158}
[2765]159
[2767]160
161bool Object::readVertex (char* vertexString)
162{
163  readVertices = true;
[2768]164  char subbuffer1[20];
165  char subbuffer2[20];
166  char subbuffer3[20];
[2767]167  sscanf (vertexString, "%s %s %s", subbuffer1, subbuffer2, subbuffer3);
[2804]168  if (verbose >= 3)
169    printf ("reading in a vertex: %s %s %s\n", subbuffer1, subbuffer2, subbuffer3);
[2833]170  vertices->addEntry(atof(subbuffer1)*scaleFactor, atof(subbuffer2)*scaleFactor, atof(subbuffer3)*scaleFactor);
[2767]171  return true;
172}
173
174bool Object::readFace (char* faceString)
175{
176  if (readVertices == true)
[2757]177    {
[2767]178      vertices->finalizeArray();
179      glVertexPointer(3, GL_FLOAT, 0, vertices->getArray());
[2794]180      normals->finalizeArray();
181      glNormalPointer(GL_FLOAT, 0, normals->getArray());
[2820]182      vTexture->finalizeArray();
[2757]183    }
[2767]184
185  readVertices = false;
[2768]186  char subbuffer1[20];
187  char subbuffer2[20];
188  char subbuffer3[20];
189  char subbuffer4[20] ="";
[2767]190  sscanf (faceString, "%s %s %s %s", subbuffer1, subbuffer2, subbuffer3, subbuffer4);
191  if (!strcmp(subbuffer4, ""))
192    {
193      if (faceMode != 3)
194        {
195          if (faceMode != -1)
196            glEnd();
197          glBegin(GL_TRIANGLES);
198        }
199     
200      faceMode = 3;
[2804]201      if (verbose >=3)
202        printf ("found triag: %s, %s, %s\n", subbuffer1, subbuffer2, subbuffer3);
[2768]203      addGLElement(subbuffer1);
204      addGLElement(subbuffer2);
205      addGLElement(subbuffer3);
[2767]206      return true;
207    }
[2757]208  else
209    {
[2767]210      if (faceMode != 4)
[2757]211        {
[2767]212          if (faceMode != -1)
213            glEnd();
214          glBegin(GL_QUADS);
[2757]215        }
[2767]216      faceMode = 4;
[2804]217      if (verbose >=3 )
218        printf ("found quad: %s, %s, %s, %s\n", subbuffer1, subbuffer2, subbuffer3, subbuffer4);
[2768]219      addGLElement(subbuffer1);
220      addGLElement(subbuffer2);
221      addGLElement(subbuffer3);
222      addGLElement(subbuffer4);
[2757]223      return true;
224    }
[2754]225}
[2768]226
227bool Object::addGLElement (char* elementString)
228{
[2833]229  if (verbose >=3)
230    printf ("importing grafical Element.... including to openGL\n");
[2794]231  char* vertex = elementString;
[2833]232
[2794]233  char* texture;
234  texture = strstr (vertex, "/");
235  texture[0] = '\0';
236  texture ++;
[2820]237  glTexCoord2fv(vTexture->getArray()+(atoi(texture)-1)*2);
[2833]238
239  char* normal;
240  if ((normal = strstr (texture, "/")) !=NULL)
241    {
242      normal[0] = '\0';
243      normal ++;
244      //glArrayElement(atoi(vertex)-1);
245      glNormal3fv(normals->getArray() +(atoi(normal)-1)*3);
246    }
[2794]247  glVertex3fv(vertices->getArray() +(atoi(vertex)-1)*3);
[2768]248
249}
[2769]250
[2794]251bool Object::readVertexNormal (char* normalString)
252{
253  readVertices = true;
254  char subbuffer1[20];
255  char subbuffer2[20];
256  char subbuffer3[20];
257  sscanf (normalString, "%s %s %s", subbuffer1, subbuffer2, subbuffer3);
[2804]258  if (verbose >=3 )
259    printf("found vertex-Normal %s, %s, %s\n", subbuffer1,subbuffer2,subbuffer3);
[2794]260  normals->addEntry(atof(subbuffer1), atof(subbuffer2), atof(subbuffer3));
261  return true;
262}
263
[2820]264bool Object::readVertexTexture (char* vTextureString)
265{
266  readVertices = true;
267  char subbuffer1[20];
268  char subbuffer2[20];
269  sscanf (vTextureString, "%s %s", subbuffer1, subbuffer2);
270  if (verbose >=3 )
271    printf("found vertex-Texture %s, %s\n", subbuffer1,subbuffer2);
272  vTexture->addEntry(atof(subbuffer1));
273  vTexture->addEntry(atof(subbuffer2));
274  return true;
275}
276
277
[2776]278bool Object::readMtlLib (char* mtlFile)
279{
280  MTL_FILE = new ifstream (mtlFile);
281  if (!MTL_FILE->is_open())
282    {
[2804]283      if (verbose >= 1)
284        printf ("unable to open file: %s\n", mtlFile);
[2776]285      return false;
286    }
[2804]287  mtlFileName = mtlFile;
288  if (verbose >=2)
289    printf ("Opening mtlFile: %s\n", mtlFileName);
[2776]290  char Buffer[500];
291  vertices = new Array();
[2778]292  material = new Material();
293  Material* tmpMat = material;
[2776]294  while(!MTL_FILE->eof())
295    {
296      MTL_FILE->getline(Buffer, 500);
[2804]297      if (verbose >= 4)
298        printf("found line in mtlFile: %s\n", Buffer);
[2776]299     
[2769]300
[2776]301      // create new Material
302      if (!strncmp(Buffer, "newmtl ", 2))
303        {
[2778]304          tmpMat = tmpMat->addMaterial(Buffer+7);
[2779]305          //      printf ("%s, %p\n", tmpMat->getName(), tmpMat);
[2776]306        }
307      // setting a illumMode
308      else if (!strncmp(Buffer, "illum", 5))
309        {
[2778]310          tmpMat->setIllum(Buffer+6);
311
[2776]312        }
313      // setting Diffuse Color
314      else if (!strncmp(Buffer, "Kd", 2))
315        {
[2778]316          tmpMat->setDiffuse(Buffer+3);
[2776]317        }
318      // setting Ambient Color
319      else if (!strncmp(Buffer, "Ka", 2))
320        {
[2778]321          tmpMat->setAmbient(Buffer+3);
[2776]322        }
323      // setting Specular Color
324      else if (!strncmp(Buffer, "Ks", 2))
325        {
[2778]326          tmpMat->setSpecular(Buffer+3);
[2776]327        }
328    }
329  return true;
330}
331
[2769]332bool Object::readUseMtl (char* matString)
333{
[2833]334  if (!strcmp (mtlFileName, ""))
335    {
336      if (verbose >= 1)
337        printf ("Not using new defined material, because no mtlFile found yet\n");
338      return false;
339    }
340     
[2769]341  if (faceMode != -1)
342    glEnd();
[2776]343  faceMode = 0;
[2804]344  if (verbose >= 2)
345    printf ("using material %s for coming Faces.\n", matString);
[2779]346  material->search(matString)->select();
[2769]347}
[2776]348
349
[2821]350void Object::BoxObject(void)
351{
352  readVertex ("-0.500000 -0.500000 0.500000");
353  readVertex ("0.500000 -0.500000 0.500000");
354  readVertex ("-0.500000 0.500000 0.500000");
355  readVertex ("0.500000 0.500000 0.500000");
356  readVertex ("-0.500000 0.500000 -0.500000");
357  readVertex ("0.500000 0.500000 -0.500000");
358  readVertex ("-0.500000 -0.500000 -0.500000");
359  readVertex ("0.500000 -0.500000 -0.500000");
360  readVertexTexture ("0.000000 0.000000");
361  readVertexTexture ("1.000000 0.000000");
362  readVertexTexture ("0.000000 1.000000");
363  readVertexTexture ("1.000000 1.000000");
364  readVertexTexture ("0.000000 2.000000");
365  readVertexTexture ("1.000000 2.000000");
366  readVertexTexture ("0.000000 3.000000");
367  readVertexTexture ("1.000000 3.000000");
368  readVertexTexture ("0.000000 4.000000");
369  readVertexTexture ("1.000000 4.000000");
370  readVertexTexture ("2.000000 0.000000");
371  readVertexTexture ("2.000000 1.000000");
372  readVertexTexture ("-1.000000 0.000000");
373  readVertexTexture ("-1.000000 1.000000");
374 
375  readVertexNormal ("0.000000 0.000000 1.000000");
376  readVertexNormal ("0.000000 0.000000 1.000000");
377  readVertexNormal ("0.000000 0.000000 1.000000");
378  readVertexNormal ("0.000000 0.000000 1.000000");
379  readVertexNormal ("0.000000 1.000000 0.000000");
380  readVertexNormal ("0.000000 1.000000 0.000000");
381  readVertexNormal ("0.000000 1.000000 0.000000");
382  readVertexNormal ("0.000000 1.000000 0.000000");
383  readVertexNormal ("0.000000 0.000000 -1.000000");
384  readVertexNormal ("0.000000 0.000000 -1.000000");
385  readVertexNormal ("0.000000 0.000000 -1.000000");
386  readVertexNormal ("0.000000 0.000000 -1.000000");
387  readVertexNormal ("0.000000 -1.000000 0.000000");
388  readVertexNormal ("0.000000 -1.000000 0.000000");
389  readVertexNormal ("0.000000 -1.000000 0.000000");
390  readVertexNormal ("0.000000 -1.000000 0.000000");
391  readVertexNormal ("1.000000 0.000000 0.000000");
392  readVertexNormal ("1.000000 0.000000 0.000000");
393  readVertexNormal ("1.000000 0.000000 0.000000");
394  readVertexNormal ("1.000000 0.000000 0.000000");
395  readVertexNormal ("-1.000000 0.000000 0.000000");
396  readVertexNormal ("-1.000000 0.000000 0.000000");
397  readVertexNormal ("-1.000000 0.000000 0.000000");
398  readVertexNormal ("-1.000000 0.000000 0.000000");
399
400  readFace ("1/1/1 2/2/2 4/4/3 3/3/4");
401  readFace ("3/3/5 4/4/6 6/6/7 5/5/8");
402  readFace ("5/5/9 6/6/10 8/8/11 7/7/12");
403  readFace ("7/7/13 8/8/14 2/10/15 1/9/16");
404  readFace ("2/2/17 8/11/18 6/12/19 4/4/20");
405  readFace ("7/13/21 1/1/22 3/3/23 5/14/24");
406}
Note: See TracBrowser for help on using the repository browser.