#ifndef _MODELS_H_
#define _MODELS_H_ 1

typedef int8_t Point_index;
typedef int8_t Vertex_index;

// 3D point structure
// Note that the *objects* fit into 8 bits, but the *world* is larger

typedef struct {
    int8_t x, y, z;
} Point3D;

// 2D point structure
typedef struct {
    screen_coord x, y;
} Point2D;


// First the array of x,y,z vertex points.

#define ZAXIS 0
#define XAXIS 1
#define YAXIS 2

#define BD 0   // move to and start drawing from here
#define LD -1  // continue drawing. (isn't this a no-op?)
#define END -2 // done.

// ###############################################################################    // TIE FIGHTER

#define TIE_POINTS (sizeof(TIE_p)/sizeof(TIE_p[0]))
const Point3D TIE_p[] = {
  { 0,0,0 },

  { -10,-16,18 },    // LEFT OUTER FIN
  { 8,-16,18 },
  { 14,-16,0 },
  { 8,-16,-18 },
  { -10,-16,-18 },
  { -16,-16,0 },
  { -2,-16,2 },    // SMALL CIRCLE ON LEFT FIN
  { 0,-16,2 },
  { 1,-16,0 },
  { 0,-16,-2 },
  { -2,-16,-2 },
  { -3,-16,0 },

  { -10,16,18 },    // RIGHT FIN
  { 8,16,18 },
  { 14,16,0 },
  { 8,16,-18 },
  { -10,16,-18 },
  { -16,16,0 },
  { -2,16,2 },    // SMALL CIRCLE ON RIGHT FIN
  { 0,16,2 },
  { 1,16,0 },
  { 0,16,-2 },
  { -2,16,-2 },
  { -3,16,0 },

  { -2,-6,2 },    // INNER CIRCLE LEFT STRUT
  { 0,-6,2 },
  { 1,-6,0 },
  { 0,-6,-2 },
  { -2,-6,-2 },
  { -3,-6,0 },

  { -2,6,2 },    // INNER CIRCLE RIGHT STRUT
  { 0,6,2 },
  { 1,6,0 },
  { 0,6,-2 },
  { -2,6,-2 },
  { -3,6,0 },

  { -4,-2,6 },    // LARGE CIRCLE LEFT BODY
  { 2,-2,6 },
  { 6,-2,3 },
  { 6,-4,0 },
  { 6,-2,-3 },
  { 2,-2,-6 },
  { -4,-2,-6 },
  { -8,-2,0 },

  { -4,2,6 },    // LARGE CIRCLE RIGHT BODY
  { 2,2,6 },
  { 6,2,3 },
  { 6,4,0 },
  { 6,2,-3 },
  { 2,2,-6 },
  { -4,2,-6 },
  { -8,2,0 },

};

const Point_index TIE[] = {                       // TIE FIGHTER
  BD, 1,2,3,4,5,6,1,
  LD, 7,8,9,10,11,12,7,
  LD, 25,26,27,28,29,25,
  LD, 37,38,39,47,
  BD, 39,40,41,49,
  BD, 41,42,43,44,37,
  LD, 45,46,47,48,49,50,51,52,45,
  LD, 31,32,33,34,35,36,31,
  LD, 19,20,21,22,23,24,19,
  LD, 13,14,15,16,17,18,13,
  BD, 14,20,32,46,38,26,8,2,
  BD, 3,9,27,40,
  BD, 48,33,21,15,
  BD, 16,22,34,50,42,28,10,4,
  BD, 5,11,29,43,51,35,23,17,
  BD, 18,24,36,52,44,30,12,6,
  END
}; 

// ###############################################################################   // EXPLODED TIE FIGHTER, LEFT WING AND STRUT

#define TI1_POINTS (sizeof(TI1_p)/sizeof(TI1_p[0]))
const Point3D TI1_p[] = {
  { 0,0,0 },

  { -10,-2,18 },    // LEFT OUTER FIN
  { 8,-2,18 },
  { 14,-2,0 },
  { 8,-2,-18 },
  { -10,-2,-18 },
  { -16,-2,0 },
  { -2,-2,2 },    // SMALL CIRCLE ON LEFT FIN
  { 0,-2,2 },
  { 1,-2,0 },
  { 0,-2,-2 },
  { -2,-2,-2 },
  { -3,-2,0 },

  { -2,10,2 },    // INNER CIRCLE LEFT STRUT
  { 0,10,2 },
  { 1,10,0 },
  { 0,10,-2 },
  { -2,10,-2 },
  { -3,10,0 },

};

                                                  // TIE FIGHTER, EXPLODED PIECES
const Point_index TI1[] = {                       // LEFT WING AND STRUT
  BD, 7,8,9,10,11,12,7,                           // INNER CIRCLE OF LEFT FIN
  LD, 13,14,15,16,17,18,13,                       // STRUT CIRCLE ON BODY
  BD, 7,1,2,3,4,5,6,1,                            // OUTER CIRCLE OF LEFT FIN
  BD, 2,8,14,                                     // SPIDER LINES
  BD, 15,9,3,
  BD, 4,10,16,
  BD, 17,11,5,
  BD, 6,12,18,
  END
};

// ###############################################################################    // EXPLODED TIE, RIGHT WING AND STRUT, ROTATED

#define TI2_POINTS (sizeof(TI2_p)/sizeof(TI2_p[0]))
const Point3D TI2_p[] = {
  { 0,0,0 },

  { -10,18,2 },    // RIGHT OUTER FIN
  { 8,18,2 },
  { 14,0,2 },
  { 8,-18,2 },
  { -10,-18,2 },
  { -16,0,2 },
  { -2,2,2 },    // SMALL CIRCLE ON RIGHT FIN
  { 0,2,2 },
  { 1,0,2 },
  { 0,-2,2 },
  { -2,-2,2 },
  { -3,0,2 },

  { -2,2,-10 },    // INNER CIRCLE RIGHT STRUT
  { 0,2,-10 },
  { 1,0,-10 },
  { 0,-2,-10 },
  { -2,-2,-10 },
  { -3,0,-10 },

};

// TI2_v                                             RIGHT WING, SAME SHAPE, DIFFERENT POINTS

// ###############################################################################    // EXPLODED TIE, CENTER CABIN

#define TI3_POINTS (sizeof(TI3_p)/sizeof(TI3_p[0]))
const Point3D TI3_p[] = {
  { 0,0,0 },

  { -2,-6,2 },    // INNER CIRCLE LEFT STRUT
  { 0,-6,2 },
  { 1,-6,0 },
  { 0,-6,-2 },
  { -2,-6,-2 },
  { -3,-6,0 },

  { -2,6,2 },    // INNER CIRCLE RIGHT STRUT
  { 0,6,2 },
  { 1,6,0 },
  { 0,6,-2 },
  { -2,6,-2 },
  { -3,6,0 },

  { -4,-2,6 },    // LARGE CIRCLE LEFT BODY
  { 2,-2,6 },
  { 6,-2,3 },
  { 6,-4,0 },
  { 6,-2,-3 },
  { 2,-2,-6 },
  { -4,-2,-6 },
  { -8,-2,0 },

  { -4,2,6 },    // LARGE CIRCLE RIGHT BODY
  { 2,2,6 },
  { 6,2,3 },
  { 6,4,0 },
  { 6,2,-3 },
  { 2,2,-6 },
  { -4,2,-6 },
  { -8,2,0 },

};

const Point_index TI3[] = {                       // CENTER TIE CABIN
  
//LD, 25,26,27,28,29,25
  BD, 1,2,3,4,5,1,

//LD, 37,38,39,47
  LD, 13,14,15,23,

//BD, 39,40,41,49
  BD, 15,16,17,25,

//BD, 41,42,43,44,37
  BD, 17,18,19,20,13,

//LD, 45,46,47,48,49,50,51,52,45
  LD, 21,22,23,24,25,26,27,28,21,

//LD, 31,32,33,34,35,36,31
  LD, 7,8,9,10,11,12,7,

//BD, 32,46,38,26
  BD, 8,22,14,2,

//BD, 27,40
  BD, 3,16,

//BD, 48,33
  BD, 24,9,

//BD, 34,50,42,28
  BD, 10,26,18,4,

//BD, 29,43,51,35
  BD, 5,19,27,11,

//BD, 36,52,44,30
  BD, 12,28,20,6,

  END
}; 

// ###############################################################################    // DARTH VADER TIE FIGHTER

#define RTH_POINTS (sizeof(RTH_p)/sizeof(RTH_p[0]))
const Point3D RTH_p[] = {
  { 0,0,0 },
  
  { -18,-18,13 },    // 1-8 RIGHT OUTER WING
  { 18,-18,13 },
  { 18,-27,5 },
  { 18,-27,-5 },
  { 18,-18,-13 },
  { -18,-18,-13 },
  { -18,-27,-5 },
  { -18,-27,5 },
  { -2,-27,3 },    // 9-12 RIGHT INNER WING
  { 2,-27,3 },
  { 2,-27,-3 },
  { -2,-27,-3 },
  { -18,18,13 },    // 13-20 LEFT OUTER WING
  { 18,18,13 },
  { 18,27,5 },
  { 18,27,-5 },
  { 18,18,-13 },
  { -18,18,-13 },
  { -18,27,-5 },
  { -18,27,5 },
  { -2,27,3 },    // 21-24 LEFT INNER WING
  { 2,27,3 },
  { 2,27,-3 },
  { -2,27,-3 },
  { -6,-6,5 },    // 25-28 RIGHT BODY STRUT
  { 6,-6,5 },
  { 6,-6,-5 },
  { -6,-6,-5 },
  { -6,6,5 },    // 29-32 LEFT BODY STRUT
  { 6,6,5 },
  { 6,6,-5 },
  { -6,6,-5 },
  { -3,-3,8 },    // 33-40 RIGHT BODY FACE
  { 3,-3,8 },
  { 8,-8,3 },
  { 8,-8,-3 },
  { 3,-3,-8 },
  { -3,-3,-8 },
  { -8,-8,-3 },
  { -8,-8,3 },
  { -3,3,8 },    // 41-48 LEFT BODY FACE
  { 3,3,8 },
  { 8,8,3 },
  { 8,8,-3 },
  { 3,3,-8 },
  { -3,3,-8 },
  { -8,8,-3 },
  { -8,8,3 },
  { 5,-2,6 },    // 49-56 FRONT OUTER WINDOW
  { 5,2,6 },
  { 8,6,2 },
  { 8,6,-2 },
  { 5,2,-6 },
  { 5,-2,-6 },
  { 8,-6,-2 },
  { 8,-6,2 },

};

const Point_index RTH[] = {                       // DARTH VADER TIE FIGHTER
                                                  // RIGHT WING
  BD, 8,1,2,3,8,7,4,3,
  BD, 4,5,6,7,
                                                  // RIGHT STRUT
  BD, 12,11,10,9,12,28,
  BD, 27,11,
  BD, 10,26,
  BD, 25,9,
//BD, 13,12,11,10,9,14,13,33
//BD, 32,12
//BD, 11,31
//BD, 30,10
//BD, 9,29
//BD, 34,14
                                                  // BODY
  BD, 37,36,35,34,42,43,44,45,37,
  LD, 38,46,47,48,41,33,40,39,38,
//BD, 45,44,43,42,50,51,52,53,45
//LD, 46,54,55,56,49,41,48,47,46
  BD, 39,36,
  BD, 35,40,
  BD, 33,34,
  BD, 42,41,
  BD, 48,43,
  BD, 44,47,
  BD, 46,45,
//BD, 47,44
//BD, 43,48
//BD, 41,42
//BD, 50,49
//BD, 56,51
//BD, 52,55
//BD, 54,53
                                                  // LEFT STRUT

  BD, 31,23,22,21,21,24,23,
  BD, 22,30,
  BD, 29,21,
  BD, 24,32,
//BD, 38,26,25,24,23,28,27,26
//BD, 25,37
//BD, 36,24
//BD, 23,35
//BD, 40,28
//BD, 27,39
                                                  // LEFT WING
  BD, 19,18,17,16,19,20,15,16,
  BD, 15,14,13,20,
//BD, 21,20,19,18,21,22,17,18
//BD, 17,16,15,22
                                                  // FRONT WINDOW
  BD, 49,50,51,52,53,54,55,56,49,53,
  BD, 54,50,
  BD, 51,55,
  BD, 56,52,

  END
}; 

// ###############################################################################    // X WING

#define XW_POINTS (sizeof(XW_p)/sizeof(XW_p[0]))
const Point3D XW_p[] = {
  { 0,0,0 },
  
        // 1-6 FRONT NOSE
  { 40,-2,-1 },
  { 40,2,-1 },
  { 40,3,-2 },
  { 40,2,-3 },
  { 40,-2,-3 },
  { 40,-3,-2 },
        // 7-12 MID BODY
  { 13,-5,2 },
  { 13,5,2 },
  { 13,5,-2 },
  { 13,4,-4 },
  { 13,-4,-4 },
  { 13,-5,-2 },
        // 13-15,60 REAR BODY
  { -20,5,2 },
  { -20,4,-4 },
  { -20,-4,-4 },
//   -20,-5,2,    //   60
        // 16-17 CANOPY
  { 20,0,1 },
  { 10,0,6 },
        // 18-20 TOP RIGHT GUN
  { 20,-42,10 },
  { -10,-42,10 },
  { -26,-42,10 },
        // 21-23 TOP LEFT GUN
  { 20,42,10 },
  { -10,42,10 },
  { -26,42,10 },
        // 24-26 BOTTOM LEFT GUN
  { 20,42,-10 },
  { -10,42,-10 },
  { -26,42,-10 },
        // 27-29 BOTTOM RIGHT GUN
  { 20,-42,-10 },
  { -10,-42,-10 },
  { -26,-42,-10 },
        // 30-36 TOP RIGHT ENGINE
  { 5,-5,2 },
  { -24,-5,2 },
  { -24,-9,2 },
  { -25,-11,6 },
  { -26,-9,10 },
  { -26,-5,10 },
  { -25,-3,6 },
        // 37-43 TOP LEFT ENGINE
  { 5,5,2 },
  { -24,5,2 },
  { -24,9,2 },
  { -25,11,6 },
  { -26,9,10 },
  { -26,5,10 },
  { -25,3,6 },
        // 44-50 BOTTOM LEFT ENGINE
  { 5,5,-2 },
  { -24,5,-2 },
  { -24,9,-2 },
  { -25,11,-6 },
  { -26,9,-10 },
  { -26,5,-10 },
  { -25,3,-6 },
        // 51-57 BOTTOM RIGHT ENGINE
  { 5,-5,-2 },
  { -24,-5,-2 },
  { -24,-9,-2 },
  { -25,-11,-6 },
  { -26,-9,-10 },
  { -26,-5,-10 },
  { -25,-3,-6 },
        // 58,59 FRONT BOTTOM DEFLECTOR
  { 35,-4,-4 },
  { 35,4,-4 },
        // 60 REST OF REAR BODY
  { -20,-5,2 },    //   60

};

const Point_index XW[] = {                        // X WING
                                                  // FRONT NOSE
  BD, 1,2,3,4,59,58,5,4,
  BD, 5,6,1,7,8,9,10,11,12,7,
  BD, 8,2,
  BD, 3,9,
  BD, 10,59,
  BD, 58,11,                                      // BOTTOM FRONT DEFLECTOR
  BD, 12,6,
                                                  // TOP CANOPY
  BD, 16,17,7,16,8,17,
                                                  // REAR BODY
  BD, 7,60,13,14,15,60,
  BD, 15,11,
  BD, 10,14,
  BD, 13,8,
                                                  // TOP LEFT WING,ENGINE
  BD, 37,22,21,                                   // GUN
  BD, 22,23,39,40,41,42,43,38,39,                 // BACK ENGINE
  LD, 37,40,
  BD, 41,37,42,
  BD, 43,37,38,
                                                  // BOTTOM LEFT WING,ENGINE
  BD, 46,26,24,                                   // WING
  BD, 25,44,46,47,48,49,50,45,46,
  BD, 47,44,48,
  BD, 49,44,50,
  BD, 45,44,
                                                  // BOTTOM RIGHT WING,ENGINE
  BD, 51,28,27,                                   // GUN
  BD, 28,29,53,54,55,56,57,52,53,
  LD, 51,54,
  BD, 55,51,56,
  BD, 57,51,52,
                                                  // TOP RIGHT WING,ENGINE
  BD, 32,20,18,
  BD, 19,30,32,33,34,35,36,31,32,
  BD, 33,30,34,
  BD, 35,30,36,
  BD, 31,30,

  END
}; 

// ###############################################################################     // Y WING
  
#define YW_POINTS (sizeof(YW_p)/sizeof(YW_p[0]))
const Point3D YW_p[] = {
  { 0,0,0 },

        // 1-4 FRONT NOSE
  { 40,-3,1 },
  { 40,3,1 },
  { 40,5,-2 },
  { 40, -5,-2 },
        // 5-10 MID NOSE
  { 30,-10,-2 },
  { 30,-10,3 },
  { 30,10,3 },
  { 30,10,-2 },
  { 30,5,-5 },
  { 30,-5,-5 },
        // 11-14,31-32 REAR HEAD
  { 10,-10,3 },
  { 10,10,3 },
  { 10,10,-2 },
  { 10,-10,-2 },
//   10,5,-5
//   10,-5,-5
        // 15-18 FRONT OF REAR BODY
  { 10,-7,1 },
  { 10,7,1 },
  { 10,7,-1 },
  { 10,-7,-1 },
        // 19-24,26-29 CANOPY
  { 30,-2,3 },
  { 25,-5,4 },
  { 27,-3,7 },
  { 27,3,7 },
  { 25,5,4 },
  { 30,2,3 },
  { 0,0,0 },    // ***25 UNUSED
  { 11,-3,7 },    //   BACK CANOPY
  { 10,-5,4 },
  { 11,3,7 },
  { 10,5,4 },
  { 0,0,0 },    // ***30 UNUSED
        //   31-32 REAR HEAD
  { 10,5,-5 },
  { 10,-5,-5 },
        // 33-34 GUNS
  { 45,5,-2 },
  { 45,-5,-2 },
        // 35-39 LEFT STRUT
  { 5,7,0 },
  { -20,13,1 },
  { -20,7,1 },
  { -20,13,-1 },
  { -20,7,-1 },
        // 40-46 LEFT ENGINE
  { 5,18,0 },
  { -29,18,7 },
  { -30,25,4 },
  { -30,25,-4 },
  { -29,18,-7 },
  { -28,11,-4 },
  { -28,11,4 },
        // 47-51 RIGHT STRUT
  { 5,-7,0 },
  { -20,-13,1 },
  { -20,-7,1 },
  { -20,-13,-1 },
  { -20,-7,-1 },
        // 52-58 RIGHT ENGINE
  { 5,-18,0 },
  { -29,-18,7 },
  { -30,-25,4 },
  { -30,-25,-4 },
  { -29,-18,-7 },
  { -28,-11,-4 },
  { -28,-11,4 },

};

const Point_index YW[] = {                        // Y WING
                                                  // FRONT NOSE
  BD, 1,2,3,33,
  BD, 3,4,34,                                     // GUNS
  BD, 4,1,6,5,10,9,8,7,2,
  BD, 7,12,
  LD, 29,28,26,27,11,14,32,31,13,12,              // REAR CIRCLE
  BD, 11,6,                                       // TOP PINSTRIPE
  BD, 4,5,14,
  BD, 13,8,3,                                     // MID PINSTRIPE
  LD, 9,31,                                       // BOTTOM PINSTRIPE
  BD, 32,10,4,
                                                  // CANOPY
  BD, 19,24,23,22,24,
  BD, 23,29,
  BD, 28,22,21,26,
  BD, 27,20,19,21,20,
                                                  // REAR BODY
  BD, 15,16,17,18,15,49,48,
  BD, 49,51,50,
  BD, 51,39,38,
  BD, 39,37,36,
  BD, 37,49,
  BD, 51,18,
  BD, 17,39,
  BD, 37,16,
                                                  // LEFT STRUT,ENGINE
  BD, 35,40,41,42,43,44,45,46,41,
  BD, 42,40,43,
  BD, 44,40,45,
  BD, 46,40,
                                                  // RIGHT STRUT,ENGINE
  BD, 47,52,53,54,55,56,57,58,53,
  BD, 54,52,55,
  BD, 56,52,57,
  BD, 58,52,

  END
};

#endif // _MODELS_H_
