Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/trunk/importer: added BOX if no Object can be displayed

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