This file is for programmers that would like to use this file
format, to include them into their programs/demos.
The purpose of this new object format is to provide an optimised
object, for the different displaying modes, with expansion possi-
bilities, and the needed informations for 3d-clipping, animation,
and so on. The comments are preceded by a semi-colon:


;Here is the explanation of the different fileds:
;the length of the fields is given in bytes, in brackets.

  "3DX01" + '\0', Null terminated identifier. (6)
  
;Now we got three different descriptions of the object, depending
;on the distance viewer-object: there is no point of drawing
;120 faces that are not bigger than one pixel, because the object
;is too far away.

;Short range description:
  NOBJS_0    How many objects are there?        (2)
  {  
    NAME,    A null terminated name for the object
             len(name + null char) <= 15        (15)
    NPTS,    How many 3d points are there?      (2)
    NFFCS,   How many faces are there for the shaded faces
             representation?                    (2)
    NWFCS,   How many faces are there for the wireframe
             representation?                    (2)

;The faces can have any number of vertices, they can be triangles,
;squares,... so we need to know, to know exactly how big the memory
;allocation should be, how big the sum of the number of vertices of
;every face is:
;  if VFi,VWi is the number of vertices of the ith face for the
;  shaded representation resp. the wireframe representation, then we
;  need:
    NFOFFS,  = VF1+VF2+...VFn , n=NFFCS        (2)
    NWOFFS,  = VW1+VW2+...VWn , n=NWFCS        (2)

;Boundings of the object:
    XMAX,XMIN,YMAX,YMIN,ZMAX,ZMIN,             (2 each=12)
            
;Coordinates (=Crd.) of the gravity center of the object:
    [Xg,Yg,Zg],                                (2 each=6)

;Crd. of the three light sources:
    [Xl,Yl,Zl]*3,                              (6*3=18)

;Crd. of the points of the object (points table):
    [X,Y,Z]*NPTS,                              (6*NPTS)

;Description of the shaded faces:
    [
      COL,      coulour of the face            (2)
      NOFFS,    # of vertices in the face      (2)

;Here we have the description of the polygon. the ith OFFSET is the offset
;in the points table of the ith vertex.
;!!! Important !!! OFFSET is the offset of the *point* not the
;offset of the first coordinate:
; x1,y1,z1 <---- OFFSET == 0
; x2,y2,z2 <---- OFFSET == 1, and not equal 6 (6 bytes further)!
      (OFFSET)*NFOFFS,                         (2*NFOFFS)
      (Nx,Ny,Nz), Normal vector of the face    (2*3=6)
      (Xg,Yg,Zg), Gravity center of the face   (2*3=6)
    ]*NFFCS,

;Description of the wireframe faces:
    [
      NOFFS,    # of vertices in the face      (2)
      
;Here we need to know, for each vertex in the face, if there has to be
;a drawn line from the actual point to the next point in the list.
;Ex:
;          1                                 2
;          *---------------------------------*
;         /             Face 1                \
;        /                                     \
;      4*--This line should only be drawn once--*3
;      /                                       /
;     /                 Face 2                /
;    *---------------------------------------*
;From point 3 to point 4, there'll be no line for face 1, so here,
;CONT=0 on point 3. "no line from 3 to 4"
;Description of Face1:
;NOFFS==4
;(OFFSET==1,CONT==1)   means  "line form 1 to 2"
;(OFFSET==2,CONT==1)          "line from 2 to 3"
;(OFFSET==3,CONT==0)          "NO line from 3 to 4"
;(OFFSET==4,CONT==1)          "line from 4 to 1"
;and every line of Face2 is drawn.
;Of course, on situations like this:
;          1                                 2
;   *-----*---------------------------------*
;  /Face /             Face 1                \
; /  3  /                                     \
;*----4*--This line should only be drawn once--*3
;     /                                       /
;    /                 Face 2                /
;   *---------------------------------------*
;instead of having "no line from 3 to 4" and "no line from 4 to 1", 
;the OFFSET 4 will simply not be present, so the face 1 will be:
;Description of Face1:
;NOFFS==3
;(OFFSET==1,CONT==1)   means  "line from 1 to 2"
;(OFFSET==2,CONT==1)          "line from 2 to 3"
;(OFFSET==3,CONT==0)          "NO line from 3 to 1"
;OFFSET has the same meaning as above.
;and every line of Face2 and Face3 is drawn.
; ===> every line on the figures above is only drawn once!
    (OFFSET,CONT)*NWOFFS                       (4*NWOFFS)
    ]*NWFCS

;This additional zone is always structured this way (if not empty,
;that is, its length is 0):
    
    additional zone=
    [
     -LEN          length of additional zone              (4)
     -a 9 BYTES, null terminated string identifier:
      ("BSPTREE" , "MAPTGA" , "GOURAUD", "" if empty...)  (9)
     -LEN bytes    actual description of the zone         (LEN)
     -[additional zone]   ;next additional zone (might be empty)
    ]
;i.e: an "empty" additional zone would be:
;LEN==0
;string identifier==""  (zero string, but don't forget, the zone
;                        still is 9 bytes long)
;that would be all
;if you got for example a BSP tree here:
;LEN=length of the bsp tree
;"BSPTREE" (plus the fillers)
;your bsptree (you choose the sructure
;now comes the next additional zone, lets say it's empty:
;LEN==0 .... see above

  }*NOBJS_0
  
;The description of the medium and the long range objects is the same.
  NOBJS_1,
          {...}*NOBJS_1
  NOBJS_2,
          {...}*NOBJS_2


                                        Nikopol (Flatliner)

Ok, that's it. If you have a good idea of an expansion to the format,
please send it to me (with its format). My mail adresses are:

email:
  lmuniz@vub.ac.be    on internet
smail:
  Luis Muniz
  564 chaussee de Boondael
  B-1050 Brussels
  Belgium
  
  from august/september on:
  54, rue Dillens
  B-1050 Brussels
  Belgium
  