Back to ppModeler.

3do File format

As all part of ppGui and ppGame library, 3do file are based on chunks. A chunk is a piece of file that contains data, with a known length, and an identifier for . The main advantage of this kind of format is it can be easily extended. When a reader program don't know a chunk, it simply ignores it, and jumps to next one. So a program can read newly created files with an old reader. One draw back of this kind of file is saving with chunk leads to a more complicated code. But, nevertheless, the advantage is worth the programing effort. A 3do file contains all the information of the object, included textures.

Every number is writed in big endian mode (Most Significant Bit first).

chunk

A chunk is composed of two parts :
  • an header
  • data
  • The header is composed of two parts :
  • an identifier string, always 8 chars.
  • a DWORD for the lenngth, without the header.
  • The chunk header is defined by :
    typedef struct
    {
      char  id[9];  /* with the trailling '\'0' */
      DWORD size;
    }chunkDef;

    3do chunk

    chunk id = "object3d"

     It can be composed of the following sub-chunks :

  • vertices chunk
  • faces chunk
  • normals chunk
  • edges chunk
  • textures chunk
  • bounding spheres chunk
  •  vertices chunk

    chunk id = "vertLst "

     The data are :

  • a DWORD for the number of vertices,
  • for each vertex, three float for x, y, z coordinates.
  •  faces chunk

    chunk id = "faceLst "

     This chunk is composed of :

  • the number (DWORD) of faces,
  • a face chunk for each face.
  •  face chunk

    chunk id = "face3d "

     A face, is a 3d polygon, which is planar and convex. This chunk is composed of :

  • an identifier (DWORD) of the drawing mode of this face :
  • 0 : draw3dFaceFlat,
  • 1 : draw3dFacePhong,
  • 2 : draw3dFaceTexture,
  • 3 : draw3dFacePoint,
  • 4 : draw3dFaceEdge,
  • 5 : draw3dFaceTransparentTexture,
  • 6 : draw3dFaceBump.
  • the number (DWORD) of points of the face,
  • for each point, the index (DWORD) in the vertex array of the object,
  • a face plane chunk
  • a face material chunk
  • possibly some of the following sub-chunks :
  • face normals chunk
  • face uv chunk
  •  face material chunk

    chunk id = "material"

     The data are :

  • a DWORD ambient (0 -> 255),
  • a DWORD diffuse (0 -> 255),
  • a DWORD specular (0 -> 255),
  • a DWORD red (0 -> 255),
  • a DWORD green (0 -> 255),
  • a DWORD blue (0 -> 255),
  •  face plane chunk

    chunk id = "plane3d "

     A plane is defined by is equation : nx.x + ny.y + nz.z = D. This chunk defines the plane of a face. The data are :

  • a float for the x composant of the normal
  • a float for the y composant of the normal
  • a float for the z composant of the normal
  • a float for D
  •  face normals chunk

    chunk id = "normIdx "

     The number of normal indexes is the same than the number of points in the face. The data are :

  • for each point, the index (DWORD) in the normal array of the object,
  • face uv chunk

    chunk id = "textuPos"

     The number of uv coordinates is the same than the number of points in the face. The data are :

  • a DWORD for the texture index in the texture array of the object,
  • for each point, two DWORD for u, v coordinates in the texture. u must be greater or equal than 0, and lower or equal than texture->width-1. v must be greater or equal than 0, and lower or equal than texture->height-1;
  •  mormals chunk

    chunk id = "normLst "

     The data are :

  • a DWORD for the number of normals (not necessarely the same that the number of vertices),
  • for each normal, three float for x, y, z coordinates. The normal must be of length one.
  •  edges chunk

    chunk id = "edgeLst "

     The data are :

  • a DWORD for the number of edges,
  • for each edge :
  • the index (DWORD) of the first vertex,
  • the index (DWORD) of the first face,
  • the index (DWORD) of the second vertex,
  • the index (DWORD) of the second face.
  •  bounding spheres chunk

    chunk id = "bound3d "

     The data are :

  • a DWORD for the number of bounding spheres,
  • for each bounding sphere :
  • a float for the x coordinate of the center,
  • a float for the y coordinate of the center,
  • a float for the z coordinate of the center,
  • a float for the radius of the sphere,
  • Acknowledgement

  • IJG code for the jpeg import/export library,
  • Brian Mirtich (http://www.cs.berkeley.edu/~mirtich) for his volume integration program,

  • Back to ppModeler.