
/*
**
**  A 'C' Source File Demonstrating How to Build Objects for A-Render
**
*/


#include <stdio.h>


/*  Constants to dimension our arrays  */
#define OBJ_VERT_ARRAY_SIZE 46
#define OBJ_POLY_ARRAY_SIZE 41
#define OBJ_POLY_VERT_ARRAY_SIZE 9

/* Define a data structure for use */
struct Object {
  int  id;
  int  type;
  int  polygon_count;
  int  vertice_count;
  int  polygon_vertice_count[OBJ_POLY_ARRAY_SIZE];
  int  vertice_list[OBJ_POLY_ARRAY_SIZE] [OBJ_POLY_VERT_ARRAY_SIZE];
  float  vertice_x[OBJ_VERT_ARRAY_SIZE];
  float  vertice_y[OBJ_VERT_ARRAY_SIZE];
  float  vertice_z[OBJ_VERT_ARRAY_SIZE];
};


/*  Define a variable named 'object', of a structure of type 'Object'  */
struct Object object;


main()
{
FILE *fopen(), *fp;

int polygon_id,
    vertice_id,
    vlist_id,
    this_object_id = 1;
    
/************           Start your changes here!            **********/
/*  Be sure to set these  */
/*  two values.           */
  object.polygon_count = 28;
  object.vertice_count = 40;


/*  Now just explicitly set up the XYZ values       */
/*  for our object vertice points.  (40 vertices)   */
    object.vertice_x [1] = -3.75;
    object.vertice_y [1] = -4.;
    object.vertice_z [1] = -.5;

    object.vertice_x [2] = -3.75;
    object.vertice_y [2] = -3.5;
    object.vertice_z [2] = -.5;

    object.vertice_x [3] = -3.;
    object.vertice_y [3] = -3.5;
    object.vertice_z [3] = -.5;

    object.vertice_x [4] =  1.25;
    object.vertice_y [4] =  2.75;
    object.vertice_z [4] = -.5;

    object.vertice_x [5] =  1.25;
    object.vertice_y [5] =  1.5;
    object.vertice_z [5] = -.5;

    object.vertice_x [6] = -2.;
    object.vertice_y [6] = -3.5;
    object.vertice_z [6] = -.5;

    object.vertice_x [7] = -1.25;
    object.vertice_y [7] = -3.5;
    object.vertice_z [7] = -.5;

    object.vertice_x [8] = -1.25;
    object.vertice_y [8] = -4.;
    object.vertice_z [8] = -.5;

    object.vertice_x [9] =  2.;
    object.vertice_y [9] =  4.;
    object.vertice_z [9] = -.5;

    object.vertice_x [10] =  3.;
    object.vertice_y [10] =  4.;
    object.vertice_z [10] = -.5;

    object.vertice_x [11] =  3.;
    object.vertice_y [11] = -3.5;
    object.vertice_z [11] = -.5;

    object.vertice_x [12] =  3.75;
    object.vertice_y [12] = -3.5;
    object.vertice_z [12] = -.5;

    object.vertice_x [13] =  3.75;
    object.vertice_y [13] =  -4.;
    object.vertice_z [13] = -.5;

    object.vertice_x [14] =  .5;
    object.vertice_y [14] = -4.;
    object.vertice_z [14] = -.5;

    object.vertice_x [15] =  .5;
    object.vertice_y [15] = -3.5;
    object.vertice_z [15] = -.5;

    object.vertice_x [16] =  1.25;
    object.vertice_y [16] = -3.5;
    object.vertice_z [16] = -.5;

    object.vertice_x [17] = -1.;
    object.vertice_y [17] =  -2.;
    object.vertice_z [17] = -.5;

    object.vertice_x [18] = -.5;
    object.vertice_y [18] = -1.;
    object.vertice_z [18] = -.5;

    object.vertice_x [19] =  1.25;
    object.vertice_y [19] = -1.;
    object.vertice_z [19] = -.5;

    object.vertice_x [20] =  1.25;
    object.vertice_y [20] = -2.;
    object.vertice_z [20] = -.5;

    object.vertice_x [21] = -3.75;
    object.vertice_y [21] = -4.;
    object.vertice_z [21] =  .5;

    object.vertice_x [22] = -3.75;
    object.vertice_y [22] = -3.5;
    object.vertice_z [22] =  .5;

    object.vertice_x [23] = -3.;
    object.vertice_y [23] = -3.5;
    object.vertice_z [23] =  .5;

    object.vertice_x [24] =  1.25;
    object.vertice_y [24] =  2.75;
    object.vertice_z [24] =  .5;

    object.vertice_x [25] =  1.25;
    object.vertice_y [25] =  1.5;
    object.vertice_z [25] =  .5;

    object.vertice_x [26] = -2.;
    object.vertice_y [26] = -3.5;
    object.vertice_z [26] =  .5;

    object.vertice_x [27] = -1.25;
    object.vertice_y [27] = -3.5;
    object.vertice_z [27] =  .5;

    object.vertice_x [28] = -1.25;
    object.vertice_y [28] = -4.;
    object.vertice_z [28] =  .5;

    object.vertice_x [29] =  2.;
    object.vertice_y [29] =  4.;
    object.vertice_z [29] =  .5;

    object.vertice_x [30] =  3.;
    object.vertice_y [30] =  4.;
    object.vertice_z [30] =  .5;

    object.vertice_x [31] =  3.;
    object.vertice_y [31] = -3.5;
    object.vertice_z [31] =  .5;

    object.vertice_x [32] =  3.75;
    object.vertice_y [32] = -3.5;
    object.vertice_z [32] =  .5;

    object.vertice_x [33] =  3.75;
    object.vertice_y [33] =  -4.;
    object.vertice_z [33] =  .5;

    object.vertice_x [34] =  .5;
    object.vertice_y [34] = -4.;
    object.vertice_z [34] =  .5;

    object.vertice_x [35] =  .5;
    object.vertice_y [35] = -3.5;
    object.vertice_z [35] =  .5;

    object.vertice_x [36] =  1.25;
    object.vertice_y [36] = -3.5;
    object.vertice_z [36] =  .5;

    object.vertice_x [37] = -1.;
    object.vertice_y [37] =  -2.;
    object.vertice_z [37] =  .5;

    object.vertice_x [38] = -.5;
    object.vertice_y [38] = -1.;
    object.vertice_z [38] =  .5;

    object.vertice_x [39] =  1.25;
    object.vertice_y [39] = -1.;
    object.vertice_z [39] =  .5;

    object.vertice_x [40] =  1.25;
    object.vertice_y [40] = -2.;
    object.vertice_z [40] =  .5;





/*  Now each polygon's vertice list just indexes the points         */
/*  listed above by the subscript of the vertice.  Each polygon     */
/*  has a vertice count also.  A four sided polygon is considered   */
/*  to have five vertices, the starting vertice, following around   */
/*  thru the second, third and fourth vertice, and ending by        */ 
/*  duplicating the first vertice as the last.                      */
/*  This first polygon is a four sided polygon, as most are.        */
      object.polygon_vertice_count [1] = 5;
      object.vertice_list [1] [1] = 1;
      object.vertice_list [1] [2] = 21;
      object.vertice_list [1] [3] = 22;
      object.vertice_list [1] [4] = 2;
      object.vertice_list [1] [5] = 1;

      object.polygon_vertice_count [2] = 5;
      object.vertice_list [2] [1] = 2;
      object.vertice_list [2] [2] = 22;
      object.vertice_list [2] [3] = 23;
      object.vertice_list [2] [4] = 3;
      object.vertice_list [2] [5] = 2;

      object.polygon_vertice_count [3] = 5;
      object.vertice_list [3] [1] = 3;
      object.vertice_list [3] [2] = 23;
      object.vertice_list [3] [3] = 24;
      object.vertice_list [3] [4] = 4;
      object.vertice_list [3] [5] = 3;

      object.polygon_vertice_count [4] = 5;
      object.vertice_list [4] [1] = 5;
      object.vertice_list [4] [2] = 25;
      object.vertice_list [4] [3] = 26;
      object.vertice_list [4] [4] = 6;
      object.vertice_list [4] [5] = 5;

      object.polygon_vertice_count [5] = 5;
      object.vertice_list [5] [1] = 6;
      object.vertice_list [5] [2] = 26;
      object.vertice_list [5] [3] = 27;
      object.vertice_list [5] [4] = 7;
      object.vertice_list [5] [5] = 6;

      object.polygon_vertice_count [6] = 5;
      object.vertice_list [6] [1] = 7;
      object.vertice_list [6] [2] = 27;
      object.vertice_list [6] [3] = 28;
      object.vertice_list [6] [4] = 8;
      object.vertice_list [6] [5] = 7;

      object.polygon_vertice_count [7] = 5;
      object.vertice_list [7] [1] = 8;
      object.vertice_list [7] [2] = 28;
      object.vertice_list [7] [3] = 21;
      object.vertice_list [7] [4] = 1;
      object.vertice_list [7] [5] = 8;

      object.polygon_vertice_count [8] = 5;
      object.vertice_list [8] [1] = 14;
      object.vertice_list [8] [2] = 34;
      object.vertice_list [8] [3] = 35;
      object.vertice_list [8] [4] = 15;
      object.vertice_list [8] [5] = 14;

      object.polygon_vertice_count [9] = 5;
      object.vertice_list [9] [1] = 15;
      object.vertice_list [9] [2] = 35;
      object.vertice_list [9] [3] = 36;
      object.vertice_list [9] [4] = 16;
      object.vertice_list [9] [5] = 15;

      object.polygon_vertice_count [10] = 5;
      object.vertice_list [10] [1] = 16;
      object.vertice_list [10] [2] = 36;
      object.vertice_list [10] [3] = 24;
      object.vertice_list [10] [4] = 4;
      object.vertice_list [10] [5] = 16;

      object.polygon_vertice_count [11] = 5;
      object.vertice_list [11] [1] = 4;
      object.vertice_list [11] [2] = 24;
      object.vertice_list [11] [3] = 29;
      object.vertice_list [11] [4] = 9;
      object.vertice_list [11] [5] = 4;

      object.polygon_vertice_count [12] = 5;
      object.vertice_list [12] [1] = 9;
      object.vertice_list [12] [2] = 29;
      object.vertice_list [12] [3] = 30;
      object.vertice_list [12] [4] = 10;
      object.vertice_list [12] [5] = 9;

      object.polygon_vertice_count [13] = 5;
      object.vertice_list [13] [1] = 10;
      object.vertice_list [13] [2] = 30;
      object.vertice_list [13] [3] = 31;
      object.vertice_list [13] [4] = 11;
      object.vertice_list [13] [5] = 10;

      object.polygon_vertice_count [14] = 5;
      object.vertice_list [14] [1] = 11;
      object.vertice_list [14] [2] = 31;
      object.vertice_list [14] [3] = 32;
      object.vertice_list [14] [4] = 12;
      object.vertice_list [14] [5] = 11;

      object.polygon_vertice_count [15] = 5;
      object.vertice_list [15] [1] = 12;
      object.vertice_list [15] [2] = 32;
      object.vertice_list [15] [3] = 33;
      object.vertice_list [15] [4] = 13;
      object.vertice_list [15] [5] = 12;

      object.polygon_vertice_count [16] = 5;
      object.vertice_list [16] [1] = 13;
      object.vertice_list [16] [2] = 33;
      object.vertice_list [16] [3] = 34;
      object.vertice_list [16] [4] = 14;
      object.vertice_list [16] [5] = 13;

      object.polygon_vertice_count [17] = 5;
      object.vertice_list [17] [1] = 18;
      object.vertice_list [17] [2] = 38;
      object.vertice_list [17] [3] = 39;
      object.vertice_list [17] [4] = 19;
      object.vertice_list [17] [5] = 18;

      object.polygon_vertice_count [18] = 5;
      object.vertice_list [18] [1] = 20;
      object.vertice_list [18] [2] = 40;
      object.vertice_list [18] [3] = 37;
      object.vertice_list [18] [4] = 17;
      object.vertice_list [18] [5] = 20;

      object.polygon_vertice_count [19] = 5;
      object.vertice_list [19] [1] = 17;
      object.vertice_list [19] [2] = 18;
      object.vertice_list [19] [3] = 19;
      object.vertice_list [19] [4] = 20;
      object.vertice_list [19] [5] = 17;

      object.polygon_vertice_count [20] = 6;
      object.vertice_list [20] [1] = 16;
      object.vertice_list [20] [2] = 4;
      object.vertice_list [20] [3] = 9;
      object.vertice_list [20] [4] = 10;
      object.vertice_list [20] [5] = 11;
      object.vertice_list [20] [6] = 16;

      object.polygon_vertice_count [21] = 5;
      object.vertice_list [21] [1] = 3;
      object.vertice_list [21] [2] = 4;
      object.vertice_list [21] [3] = 5;
      object.vertice_list [21] [4] = 6;
      object.vertice_list [21] [5] = 3;

      object.polygon_vertice_count [22] = 5;
      object.vertice_list [22] [1] = 1;
      object.vertice_list [22] [2] = 2;
      object.vertice_list [22] [3] = 7;
      object.vertice_list [22] [4] = 8;
      object.vertice_list [22] [5] = 1;

      object.polygon_vertice_count [23] = 5;
      object.vertice_list [23] [1] = 14;
      object.vertice_list [23] [2] = 15;
      object.vertice_list [23] [3] = 12;
      object.vertice_list [23] [4] = 13;
      object.vertice_list [23] [5] = 14;

      object.polygon_vertice_count [24] = 5;
      object.vertice_list [24] [1] = 40;
      object.vertice_list [24] [2] = 39;
      object.vertice_list [24] [3] = 38;
      object.vertice_list [24] [4] = 37;
      object.vertice_list [24] [5] = 40;

      object.polygon_vertice_count [25] = 6;
      object.vertice_list [25] [1] = 31;
      object.vertice_list [25] [2] = 30;
      object.vertice_list [25] [3] = 29;
      object.vertice_list [25] [4] = 24;
      object.vertice_list [25] [5] = 36;
      object.vertice_list [25] [6] = 31;

      object.polygon_vertice_count [26] = 5;
      object.vertice_list [26] [1] = 26;
      object.vertice_list [26] [2] = 25;
      object.vertice_list [26] [3] = 24;
      object.vertice_list [26] [4] = 23;
      object.vertice_list [26] [5] = 26;

      object.polygon_vertice_count [27] = 5;
      object.vertice_list [27] [1] = 28;
      object.vertice_list [27] [2] = 27;
      object.vertice_list [27] [3] = 22;
      object.vertice_list [27] [4] = 21;
      object.vertice_list [27] [5] = 28;

      object.polygon_vertice_count [28] = 5;
      object.vertice_list [28] [1] = 33;
      object.vertice_list [28] [2] = 32;
      object.vertice_list [28] [3] = 35;
      object.vertice_list [28] [4] = 34;
      object.vertice_list [28] [5] = 33;

/*******      You shouldn't need to make changes past here,      *******/
/*             unless you want to change the file name to              */
/*               be more meaningful for your object.                   */
/*                     (Change in two places)                          */

/*  Now the object is saved to a file  */

    /*  Open file  */
    fp = fopen("a.obj","w");


/* The following fprintf statement puts the object file header to disk. */
/* The first '1' means there is 1 object in this file.                  */
/* The second value identifies which object this is in the object file. */
/* The '3' identifies this as an alpha object, built from polygons.     */
/* Object '2' is a general polygonal object.  Be sure to use a 2 or 3!  */
/* Object types 2 and 3 are the only ones supported in A-Render v.3.    */
/* After, the polygon and object counts are written to the file.        */
          fprintf(fp,"1 %d 3 %d %d",    
                  this_object_id,
                  object.polygon_count,
                  object.vertice_count);

/*  Now just save the object verticies!  */
      for (vertice_id=1;
      vertice_id <= object.vertice_count; vertice_id++) {
        fprintf(fp," %f %f %f",
          object.vertice_x [vertice_id],
          object.vertice_y [vertice_id],
          object.vertice_z [vertice_id]);
      }

/*  And save the polygons.  */
      for (polygon_id=1; 
      polygon_id <= object.polygon_count; polygon_id++) {

        fprintf(fp," %d",
          object.polygon_vertice_count [polygon_id]);

        for (vlist_id=1;
        vlist_id <= object.polygon_vertice_count [polygon_id];
        vlist_id++) {
          fprintf(fp," %d",
            object.vertice_list [polygon_id] [vlist_id]);
        }
      }

/*  Close  */
    printf("\n");
    fclose(fp);
    printf("a.obj written\n");
}

