Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 2823 was 2823, checked in by bensch, 20 years ago

orxonox/trunk/importer: now uses c++ lib <fstream>, and added the OrxOnoX Headers

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