Asg 3: Read in (parse) and display a simple A|W object

Objectives

Following Assignment 02, and Makefile rgbcube.cpp now replace the setupCube() function by an inputCube() that reads in a simple rgbcube.obj file, an Alias|Wavefront object, e.g., a simple cube.

Assignment

  1. In the inputCube() function, read in the data for the verteces and faces as they are encountered. The program should contain two global lists:
  2. Create a face_t object that will be used to store the integer vertex indeces that index into the object's vertex list, basically a list of integers. The face_t object contains the following data objects: The interface and implementation for this object should be provided in separate header face.h and implementation face.cpp files.

Details

  1. GLUT and OpenGL details are the same as in rgbcube.cpp.

Hints

  1. Notice that the indices stored in the data file number from 1..n whereas C/C++ lists, including the std::vector, are indexed 0..n-1.
  2. One of two trickiest parts of this assignment is the file parsing. You should look over previous code for reading the point_t object and follow that pattern. This time, when looping through the input, you will have to decide what is being read in: a point_t object, a face_t object, or the std::string object. Each of these is identified by the leading character, i.e., v, g, or f, respectively. Therefore, your parsing loop should read in a single character and then switch on that character to decide what to read in, e.g., with std::istream& s,
      while( s.get(c) && !s.eof() ) {
        switch(c) {
          case 'v':
            // read in vertex_t object
          break;
          case 'g':
            // read in group string
          break;
          case 'f':
            // read in face_t object
          break;
      }
    	
  3. Another of the trickier parts of this assignment is rendering (drawing) of the object. Each face of the object is just a polygon, so that is drawn just like each of the planar polygons of rgbcube.cpp. The tricky part is getting at the three x-, y-, and z-coordinates of each vertex for the call to glVertex3f.

    To do the above, you will need to

    Hint: see Assignment 02 and specifically how those coordinates were printed out (recall the (*the_points[i])[0] syntax).

Input

  1. Tje rgbcube.obj cube, or
  2. The cube-ccw.obj file used to test the above program is:
    v 1.0 1.0 1.0
    v 1.0 1.0 -1.0
    v 1.0 -1.0 1.0
    v 1.0 -1.0 -1.0
    v -1.0 1.0 1.0
    v -1.0 1.0 -1.0
    v -1.0 -1.0 1.0
    v -1.0 -1.0 -1.0
    g cube
    f 1 5 7 3
    f 2 1 3 4
    f 5 6 8 7
    f 6 2 4 8
    f 2 6 5 1
    f 8 4 3 7
    	
  3. An object is represented by a list of vertices, basically a list of 3D points similar to what was used previously to display a plane.
  4. Each vertex is now used in a list of faces (polygons) that define the spatial boundary of the object. For a cube, there are 6 quadrilaterals.
  5. Note that, in general, you cannot assume that all objects are composed of quads; they could be composed on n-sided faces, or polygons. You cannot therefore assume that each face will have 4 indices into the vertex list. There will be at least 3 and at most n where n is unknown. For this reason we use the STL std::vector containers, which keep track of the size of the list.

Output

  1. If you can parse rgbcube.obj then the same display should appear as in the original rgbcube.cpp demo.

  2. See also:

Turn in

Turn in all of your code, in one tar.gz archive of your asg##/ directory, including:
  1. A README file containing
    1. Course id--section no
    2. Name
    3. Brief solution description (e.g., program design, description of algorithm, etc., however appropriate).
    4. Lessons learned, identified interesting features of your program
    5. Any special usage instructions
  2. Makefile
  3. source code (.h headers and .cpp source)
  4. object code (do a make clean before tar)

How to hand in

See handin notes

Grading scheme