
#define WIDTH 320
#define HEIGHT 100
#define DEPTH 8
#define SIZE WIDTH*HEIGHT
#define BPLSIZE SIZE/DEPTH



#define NULL   0

#define GFX_POLYGON      1
#define GFX_FRAME        2
#define GFX_ENVIRONMENT  3
#define GFX_OBJECT       4
#define GFX_CAMERA       5
#define GFX_SHADETABLE   6

#define GFX_NONE   0

#define GFX_FILL_SHADING    0
#define GFX_FLAT_SHADING    1
#define GFX_DEPTH_SHADING 2



/******************/
/*                */
/* STRUTTURE DATI */
/*                */
/******************/

#define MEMF_PUBLIC  0x00001
#define MEMF_CHIP    0x00002
#define MEMF_FAST    0x00004
#define MEMF_CLEAR   0x10000
#define MEMF_LARGEST 0x20000

typedef struct BitMap
{
   short ByteV3DerRow;
   short Rows;
   char Flags;
   char Depth;
   short Pad;
   void * Planes[8];
} BitMap;

typedef struct NewScreen
{
  short LeftEdge, TopEdge;
  short Width, Height;
  short Depth;
  char DetailPen, BlockPen;
  short ViewModes;
  short Type;
  void * Font;
  char * DefaultTitle;
  void * Gadgets;
  struct BitMap * CustomBitMap;
} NewScreen;

#define V_HIRES      0x8000

#define SCREENTYPE   0x0F
#define WBENCHSCREEN 0x01
#define PUBLICSCREEN 0x02
#define CUSTOMSCREEN 0x0F
#define SHOWTITLE    0x10
#define BEEPING      0x20
#define CUSTOMBITMAP 0x40

typedef struct rl_RGB
{
  unsigned char Red, Green, Blue;
  char paddle;
} rl_RGB;



/***************/
/*             */
/*  PROTOTIPI  */
/*             */
/***************/

void * BuildFrame( short *points, short *polygons, long scale,  long offset );



/***********************/
/*                     */
/*  VARIABILI GLOBALI  */
/*                     */
/***********************/



/*************************/
/*                       */
/*  FUNZIONE PRINCIPALE  */
/*                       */
/*************************/

void * GfxBase;
void * IntuitionBase;
void * GfX3dBase;

struct BitMap MyBitMap;
struct NewScreen MyNewScreen = {
   0, 0, WIDTH, HEIGHT, DEPTH,
   1, 0,
   V_HIRES,
   CUSTOMSCREEN | CUSTOMBITMAP,
   0,
   "GfX3d shared library ©1998",
   0,
   NULL
};
void * MyScreen;
unsigned long *View;
unsigned long ViewPort;
void * memptr;
void *polygon, *frame, *object, *env, *cam;

unsigned long RGB32[] =
{
  0x01000000,0x00000000,0x00000000,0x00000000,0xa0a0a0a0,0xa0a0a0a0,
  0xa0a0a0a0,0x00000000,0xaaaaaaaa,0x00000000,0x00000000,0xaaaaaaaa,
  0xaaaaaaaa,0xaaaaaaaa,0x00000000,0x00000000,0xaaaaaaaa,0x00000000,
  0xaaaaaaaa,0xaaaaaaaa,0x55555555,0x00000000,0xaaaaaaaa,0xaaaaaaaa,
  0xaaaaaaaa,0x55555555,0x55555555,0x55555555,0x55555555,0x55555555,
  0xffffffff,0x55555555,0xffffffff,0x55555555,0x55555555,0xffffffff,
  0xffffffff,0xffffffff,0x55555555,0x55555555,0xffffffff,0x55555555,
  0xffffffff,0xffffffff,0xffffffff,0x55555555,0xffffffff,0xffffffff,
  0xffffffff,0xefefefef,0xefefefef,0xefefefef,0xdfdfdfdf,0xdfdfdfdf,
  0xdfdfdfdf,0xd3d3d3d3,0xd3d3d3d3,0xd3d3d3d3,0xc3c3c3c3,0xc3c3c3c3,
  0xc3c3c3c3,0xb7b7b7b7,0xb7b7b7b7,0xb7b7b7b7,0xabababab,0xabababab,
  0xabababab,0x9b9b9b9b,0x9b9b9b9b,0x9b9b9b9b,0x8f8f8f8f,0x8f8f8f8f,
  0x8f8f8f8f,0x7f7f7f7f,0x7f7f7f7f,0x7f7f7f7f,0x73737373,0x73737373,
  0x73737373,0x67676767,0x67676767,0x67676767,0x57575757,0x57575757,
  0x57575757,0x4b4b4b4b,0x4b4b4b4b,0x4b4b4b4b,0x3b3b3b3b,0x3b3b3b3b,
  0x3b3b3b3b,0x2f2f2f2f,0x2f2f2f2f,0x2f2f2f2f,0x23232323,0x23232323,
  0x23232323,0xffffffff,0x00000000,0x00000000,0xefefefef,0x00000000,
  0x00000000,0xe3e3e3e3,0x00000000,0x00000000,0xd7d7d7d7,0x00000000,
  0x00000000,0xcbcbcbcb,0x00000000,0x00000000,0xbfbfbfbf,0x00000000,
  0x00000000,0xb3b3b3b3,0x00000000,0x00000000,0xa7a7a7a7,0x00000000,
  0x00000000,0x9b9b9b9b,0x00000000,0x00000000,0x8b8b8b8b,0x00000000,
  0x00000000,0x7f7f7f7f,0x00000000,0x00000000,0x73737373,0x00000000,
  0x00000000,0x67676767,0x00000000,0x00000000,0x5b5b5b5b,0x00000000,
  0x00000000,0x4f4f4f4f,0x00000000,0x00000000,0x40404040,0x00000000,
  0x00000000,0xffffffff,0xdadadada,0xdadadada,0xffffffff,0xbabababa,
  0xbabababa,0xffffffff,0x9f9f9f9f,0x9f9f9f9f,0xffffffff,0x7f7f7f7f,
  0x7f7f7f7f,0xffffffff,0x5f5f5f5f,0x5f5f5f5f,0xffffffff,0x40404040,
  0x40404040,0xffffffff,0x20202020,0x20202020,0xffffffff,0x00000000,
  0x00000000,0xfcfcfcfc,0xa8a8a8a8,0x5c5c5c5c,0xfcfcfcfc,0x98989898,
  0x40404040,0xfcfcfcfc,0x88888888,0x20202020,0xfcfcfcfc,0x78787878,
  0x00000000,0xe4e4e4e4,0x6c6c6c6c,0x00000000,0xcccccccc,0x60606060,
  0x00000000,0xb4b4b4b4,0x54545454,0x00000000,0x9c9c9c9c,0x4c4c4c4c,
  0x00000000,0xfcfcfcfc,0xfcfcfcfc,0xd8d8d8d8,0xfcfcfcfc,0xfcfcfcfc,
  0xb8b8b8b8,0xfcfcfcfc,0xfcfcfcfc,0x9c9c9c9c,0xfcfcfcfc,0xfcfcfcfc,
  0x7c7c7c7c,0xfcfcfcfc,0xf8f8f8f8,0x5c5c5c5c,0xfcfcfcfc,0xf4f4f4f4,
  0x40404040,0xfcfcfcfc,0xf4f4f4f4,0x20202020,0xfcfcfcfc,0xf4f4f4f4,
  0x00000000,0xe4e4e4e4,0xd8d8d8d8,0x00000000,0xcccccccc,0xc4c4c4c4,
  0x00000000,0xb4b4b4b4,0xacacacac,0x00000000,0x9c9c9c9c,0x9c9c9c9c,
  0x00000000,0x84848484,0x84848484,0x00000000,0x70707070,0x6c6c6c6c,
  0x00000000,0x58585858,0x54545454,0x00000000,0x40404040,0x40404040,
  0x00000000,0xd0d0d0d0,0xfcfcfcfc,0x5c5c5c5c,0xc4c4c4c4,0xfcfcfcfc,
  0x40404040,0xb4b4b4b4,0xfcfcfcfc,0x20202020,0xa0a0a0a0,0xfcfcfcfc,
  0x00000000,0x90909090,0xe4e4e4e4,0x00000000,0x80808080,0xcccccccc,
  0x00000000,0x74747474,0xb4b4b4b4,0x00000000,0x60606060,0x9c9c9c9c,
  0x00000000,0xd8d8d8d8,0xfcfcfcfc,0xd8d8d8d8,0xbcbcbcbc,0xfcfcfcfc,
  0xb8b8b8b8,0x9c9c9c9c,0xfcfcfcfc,0x9c9c9c9c,0x80808080,0xfcfcfcfc,
  0x7c7c7c7c,0x60606060,0xfcfcfcfc,0x5c5c5c5c,0x40404040,0xfcfcfcfc,
  0x40404040,0x20202020,0xfcfcfcfc,0x20202020,0x00000000,0xfcfcfcfc,
  0x00000000,0x00000000,0xffffffff,0x00000000,0x00000000,0xefefefef,
  0x00000000,0x00000000,0xe3e3e3e3,0x00000000,0x00000000,0xd7d7d7d7,
  0x00000000,0x07070707,0xcbcbcbcb,0x00000000,0x07070707,0xbfbfbfbf,
  0x00000000,0x07070707,0xb3b3b3b3,0x00000000,0x07070707,0xa7a7a7a7,
  0x00000000,0x07070707,0x9b9b9b9b,0x00000000,0x07070707,0x8b8b8b8b,
  0x00000000,0x07070707,0x7f7f7f7f,0x00000000,0x07070707,0x73737373,
  0x00000000,0x07070707,0x67676767,0x00000000,0x07070707,0x5b5b5b5b,
  0x00000000,0x07070707,0x4f4f4f4f,0x00000000,0x04040404,0x40404040,
  0x00000000,0xdadadada,0xffffffff,0xffffffff,0xb8b8b8b8,0xfcfcfcfc,
  0xfcfcfcfc,0x9c9c9c9c,0xfcfcfcfc,0xfcfcfcfc,0x7c7c7c7c,0xfcfcfcfc,
  0xf8f8f8f8,0x5c5c5c5c,0xfcfcfcfc,0xfcfcfcfc,0x40404040,0xfcfcfcfc,
  0xfcfcfcfc,0x20202020,0xfcfcfcfc,0xfcfcfcfc,0x00000000,0xfcfcfcfc,
  0xfcfcfcfc,0x00000000,0xe4e4e4e4,0xe4e4e4e4,0x00000000,0xcccccccc,
  0xcccccccc,0x00000000,0xb4b4b4b4,0xb4b4b4b4,0x00000000,0x9c9c9c9c,
  0x9c9c9c9c,0x00000000,0x84848484,0x84848484,0x00000000,0x70707070,
  0x70707070,0x00000000,0x58585858,0x58585858,0x00000000,0x40404040,
  0x40404040,0x5c5c5c5c,0xbcbcbcbc,0xfcfcfcfc,0x40404040,0xb0b0b0b0,
  0xfcfcfcfc,0x20202020,0xa8a8a8a8,0xfcfcfcfc,0x00000000,0x9c9c9c9c,
  0xfcfcfcfc,0x00000000,0x8c8c8c8c,0xe4e4e4e4,0x00000000,0x7c7c7c7c,
  0xcccccccc,0x00000000,0x6c6c6c6c,0xb4b4b4b4,0x00000000,0x5c5c5c5c,
  0x9c9c9c9c,0xdadadada,0xdadadada,0xffffffff,0xbabababa,0xbfbfbfbf,
  0xffffffff,0x9f9f9f9f,0x9f9f9f9f,0xffffffff,0x7f7f7f7f,0x80808080,
  0xffffffff,0x5f5f5f5f,0x60606060,0xffffffff,0x40404040,0x40404040,
  0xffffffff,0x20202020,0x25252525,0xffffffff,0x00000000,0x05050505,
  0xffffffff,0x00000000,0x00000000,0xffffffff,0x00000000,0x00000000,
  0xefefefef,0x00000000,0x00000000,0xe3e3e3e3,0x00000000,0x00000000,
  0xd7d7d7d7,0x00000000,0x00000000,0xcbcbcbcb,0x00000000,0x00000000,
  0xbfbfbfbf,0x00000000,0x00000000,0xb3b3b3b3,0x00000000,0x00000000,
  0xa7a7a7a7,0x00000000,0x00000000,0x9b9b9b9b,0x00000000,0x00000000,
  0x8b8b8b8b,0x00000000,0x00000000,0x7f7f7f7f,0x00000000,0x00000000,
  0x73737373,0x00000000,0x00000000,0x67676767,0x00000000,0x00000000,
  0x5b5b5b5b,0x00000000,0x00000000,0x4f4f4f4f,0x00000000,0x00000000,
  0x40404040,0xf0f0f0f0,0xdadadada,0xffffffff,0xe5e5e5e5,0xbabababa,
  0xffffffff,0xdadadada,0x9f9f9f9f,0xffffffff,0xd0d0d0d0,0x7f7f7f7f,
  0xffffffff,0xcacacaca,0x5f5f5f5f,0xffffffff,0xbfbfbfbf,0x40404040,
  0xffffffff,0xb5b5b5b5,0x20202020,0xffffffff,0xaaaaaaaa,0x00000000,
  0xffffffff,0x9a9a9a9a,0x00000000,0xe5e5e5e5,0x80808080,0x00000000,
  0xcfcfcfcf,0x75757575,0x00000000,0xb5b5b5b5,0x60606060,0x00000000,
  0x9f9f9f9f,0x50505050,0x00000000,0x85858585,0x45454545,0x00000000,
  0x70707070,0x35353535,0x00000000,0x5a5a5a5a,0x2a2a2a2a,0x00000000,
  0x40404040,0xffffffff,0xdadadada,0xffffffff,0xffffffff,0xbabababa,
  0xffffffff,0xffffffff,0x9f9f9f9f,0xffffffff,0xffffffff,0x7f7f7f7f,
  0xffffffff,0xffffffff,0x5f5f5f5f,0xffffffff,0xffffffff,0x40404040,
  0xffffffff,0xffffffff,0x20202020,0xffffffff,0xffffffff,0x00000000,
  0xffffffff,0xe0e0e0e0,0x00000000,0xe5e5e5e5,0xcacacaca,0x00000000,
  0xcfcfcfcf,0xb5b5b5b5,0x00000000,0xb5b5b5b5,0x9f9f9f9f,0x00000000,
  0x9f9f9f9f,0x85858585,0x00000000,0x85858585,0x6f6f6f6f,0x00000000,
  0x70707070,0x5a5a5a5a,0x00000000,0x5a5a5a5a,0x40404040,0x00000000,
  0x40404040,0xffffffff,0xe9e9e9e9,0xdededede,0xf7f7f7f7,0xdddddddd,
  0xd0d0d0d0,0xf0f0f0f0,0xd1d1d1d1,0xc3c3c3c3,0xe9e9e9e9,0xc7c7c7c7,
  0xb7b7b7b7,0xe1e1e1e1,0xbabababa,0xaaaaaaaa,0xdadadada,0xb0b0b0b0,
  0x9e9e9e9e,0xd3d3d3d3,0xa4a4a4a4,0x94949494,0xcccccccc,0x9b9b9b9b,
  0x89898989,0xc5c5c5c5,0x90909090,0x80808080,0xbebebebe,0x86868686,
  0x76767676,0xb6b6b6b6,0x7c7c7c7c,0x6b6b6b6b,0xafafafaf,0x73737373,
  0x63636363,0xa8a8a8a8,0x6b6b6b6b,0x5a5a5a5a,0xa1a1a1a1,0x61616161,
  0x52525252,0x9a9a9a9a,0x59595959,0x4a4a4a4a,0x93939393,0x50505050,
  0x43434343,0x8b8b8b8b,0x48484848,0x3b3b3b3b,0x84848484,0x3f3f3f3f,
  0x34343434,0x7e7e7e7e,0x39393939,0x2e2e2e2e,0x77777777,0x31313131,
  0x28282828,0x70707070,0x2c2c2c2c,0x23232323,0x69696969,0x26262626,
  0x1d1d1d1d,0x61616161,0x1f1f1f1f,0x18181818,0x5a5a5a5a,0x1b1b1b1b,
  0x14141414,0x53535353,0x15151515,0x10101010,0x4c4c4c4c,0x11111111,
  0x0d0d0d0d,0x45454545,0x0c0c0c0c,0x09090909,0x3e3e3e3e,0x09090909,
  0x07070707,0x36363636,0x05050505,0x04040404,0x2f2f2f2f,0x03030303,
  0x02020202,0x28282828,0x01010101,0x01010101,0x21212121,0x00000000,
  0x00000000,0xffffffff,0x58585858,0x58585858,0xffffffff,0xbebebebe,
  0x80808080,0xffffffff,0xfefefefe,0x82828282,0x82828282,0xffffffff,
  0x84848484,0x80808080,0xffffffff,0xffffffff,0x80808080,0x80808080,
  0xffffffff,0xbfbfbfbf,0x80808080,0xffffffff,0xfefefefe,0x80808080,
  0xffffffff,0xc7c7c7c7,0x2b2b2b2b,0x2b2b2b2b,0xc7c7c7c7,0x4f4f4f4f,
  0x2b2b2b2b,0xc7c7c7c7,0x77777777,0x2b2b2b2b,0xc7c7c7c7,0x9f9f9f9f,
  0x2b2b2b2b,0xc7c7c7c7,0xc7c7c7c7,0x2b2b2b2b,0x9f9f9f9f,0xc7c7c7c7,
  0x2b2b2b2b,0x77777777,0xc7c7c7c7,0x2b2b2b2b,0x4f4f4f4f,0xc7c7c7c7,
  0x2b2b2b2b,0x2b2b2b2b,0xc7c7c7c7,0x33333333,0x2b2b2b2b,0xc7c7c7c7,
  0x5f5f5f5f,0x2b2b2b2b,0xc7c7c7c7,0x8b8b8b8b,0x2b2b2b2b,0xc7c7c7c7,
  0xb7b7b7b7,0x2b2b2b2b,0xabababab,0xc7c7c7c7,0x2b2b2b2b,0x7f7f7f7f,
  0xc7c7c7c7,0x2b2b2b2b,0x53535353,0xc7c7c7c7,0x2f2f2f2f,0x2b2b2b2b,
  0xc7c7c7c7,0x5b5b5b5b,0x2b2b2b2b,0xc7c7c7c7,0x87878787,0x2b2b2b2b,
  0xc7c7c7c7,0xb3b3b3b3,0x2b2b2b2b,0xc7c7c7c7,0xc7c7c7c7,0x2b2b2b2b,
  0xafafafaf,0xc7c7c7c7,0x2b2b2b2b,0x83838383,0xc7c7c7c7,0x2b2b2b2b,
  0x57575757,0xc7c7c7c7,0x2b2b2b2b,0x2b2b2b2b,0xffffffff,0xffffffff,
  0xffffffff,0x00000000,
};
unsigned long RGB8bit[] =
{
  0x00000000,0x00a0a0a0,0x0000aa00,0x0000aaaa,0x00aa0000,0x00aa00aa,
  0x00aa5500,0x00aaaaaa,0x00555555,0x005555ff,0x0055ff55,0x0055ffff,
  0x00ff5555,0x00ff55ff,0x00ffff55,0x00ffffff,0x00efefef,0x00dfdfdf,
  0x00d3d3d3,0x00c3c3c3,0x00b7b7b7,0x00ababab,0x009b9b9b,0x008f8f8f,
  0x007f7f7f,0x00737373,0x00676767,0x00575757,0x004b4b4b,0x003b3b3b,
  0x002f2f2f,0x00232323,0x00ff0000,0x00ef0000,0x00e30000,0x00d70000,
  0x00cb0000,0x00bf0000,0x00b30000,0x00a70000,0x009b0000,0x008b0000,
  0x007f0000,0x00730000,0x00670000,0x005b0000,0x004f0000,0x00400000,
  0x00ffdada,0x00ffbaba,0x00ff9f9f,0x00ff7f7f,0x00ff5f5f,0x00ff4040,
  0x00ff2020,0x00ff0000,0x00fca85c,0x00fc9840,0x00fc8820,0x00fc7800,
  0x00e46c00,0x00cc6000,0x00b45400,0x009c4c00,0x00fcfcd8,0x00fcfcb8,
  0x00fcfc9c,0x00fcfc7c,0x00fcf85c,0x00fcf440,0x00fcf420,0x00fcf400,
  0x00e4d800,0x00ccc400,0x00b4ac00,0x009c9c00,0x00848400,0x00706c00,
  0x00585400,0x00404000,0x00d0fc5c,0x00c4fc40,0x00b4fc20,0x00a0fc00,
  0x0090e400,0x0080cc00,0x0074b400,0x00609c00,0x00d8fcd8,0x00bcfcb8,
  0x009cfc9c,0x0080fc7c,0x0060fc5c,0x0040fc40,0x0020fc20,0x0000fc00,
  0x0000ff00,0x0000ef00,0x0000e300,0x0000d700,0x0007cb00,0x0007bf00,
  0x0007b300,0x0007a700,0x00079b00,0x00078b00,0x00077f00,0x00077300,
  0x00076700,0x00075b00,0x00074f00,0x00044000,0x00daffff,0x00b8fcfc,
  0x009cfcfc,0x007cfcf8,0x005cfcfc,0x0040fcfc,0x0020fcfc,0x0000fcfc,
  0x0000e4e4,0x0000cccc,0x0000b4b4,0x00009c9c,0x00008484,0x00007070,
  0x00005858,0x00004040,0x005cbcfc,0x0040b0fc,0x0020a8fc,0x00009cfc,
  0x00008ce4,0x00007ccc,0x00006cb4,0x00005c9c,0x00dadaff,0x00babfff,
  0x009f9fff,0x007f80ff,0x005f60ff,0x004040ff,0x002025ff,0x000005ff,
  0x000000ff,0x000000ef,0x000000e3,0x000000d7,0x000000cb,0x000000bf,
  0x000000b3,0x000000a7,0x0000009b,0x0000008b,0x0000007f,0x00000073,
  0x00000067,0x0000005b,0x0000004f,0x00000040,0x00f0daff,0x00e5baff,
  0x00da9fff,0x00d07fff,0x00ca5fff,0x00bf40ff,0x00b520ff,0x00aa00ff,
  0x009a00e5,0x008000cf,0x007500b5,0x0060009f,0x00500085,0x00450070,
  0x0035005a,0x002a0040,0x00ffdaff,0x00ffbaff,0x00ff9fff,0x00ff7fff,
  0x00ff5fff,0x00ff40ff,0x00ff20ff,0x00ff00ff,0x00e000e5,0x00ca00cf,
  0x00b500b5,0x009f009f,0x00850085,0x006f0070,0x005a005a,0x00400040,
  0x00ffe9de,0x00f7ddd0,0x00f0d1c3,0x00e9c7b7,0x00e1baaa,0x00dab09e,
  0x00d3a494,0x00cc9b89,0x00c59080,0x00be8676,0x00b67c6b,0x00af7363,
  0x00a86b5a,0x00a16152,0x009a594a,0x00935043,0x008b483b,0x00843f34,
  0x007e392e,0x00773128,0x00702c23,0x0069261d,0x00611f18,0x005a1b14,
  0x00531510,0x004c110d,0x00450c09,0x003e0907,0x00360504,0x002f0302,
  0x00280101,0x00210000,0x00ff5858,0x00ffbe80,0x00fffe82,0x0082ff84,
  0x0080ffff,0x008080ff,0x00bf80ff,0x00fe80ff,0x00c72b2b,0x00c74f2b,
  0x00c7772b,0x00c79f2b,0x00c7c72b,0x009fc72b,0x0077c72b,0x004fc72b,
  0x002bc733,0x002bc75f,0x002bc78b,0x002bc7b7,0x002babc7,0x002b7fc7,
  0x002b53c7,0x002f2bc7,0x005b2bc7,0x00872bc7,0x00b32bc7,0x00c72baf,
  0x00c72b83,0x00c72b57,0x00c72b2b,0x00ffffff
};
struct rl_RGB palette[256];

short mask_points[] =
{
  0, 85, 20,    50, 20, 10,    45, -20, 15,    75, 15, 0,    50, 0, 10,
  30, 0, 10,    20, -70, 10,   0, -105, 10,    25, 20, 10,   0, 10, 15,
  10, -100, 13, 20, -55, 10,   10, 5, 10,      0, -55, 30,   0, -60, 10,
  0, -87, 10,   10, -75, 15,   45, -130, -25,  80, -80, -25, 95, -10, -25,
  95, 50, -25,  80, 95, -25,   45, 130, -25,   0, 140, -25,  60, 25, 10,
  35, 25, 15,   10, 30, 15,    20, 60, 20,     45, 30, 10,   65, 30, 10,
  0, -145, -25, 0, -140, -5,   10, -120, 0,    20, -135, -15,25, -100, 5,
  35, -86, 8,   55, -100, -15, 60, -55, 0,     85, -50, -15, 80, -15, 0,
  90, 20, -15,  80, 20, 5,     60, 65, 10,     80, 75, -5,   35, 100, 5,
  20, 135, -15, 0, 125, 0,     55, 110, -15,   -45, 30, 10,  -65, 30, 10,
  -10, -120, 0, -35, 100, 5,   -20, 60, 20,    -60, 65, 10,  -10, 30, 15,
  -35, 25, 15,  -60, 25, 10,   -80, 20, 5,     -60, -55, 0,  -45, -20, 15,
  -80, -15, 0,  -20, -70, 10,  -25, -100, 5,   -30, 0, 10,   -50, 0, 10,
  -75, 15, 0,   -50, 20, 10,   -25, 20, 10,    -10, 5, 10,   -20, -55, 10,
  -10, -75, 15, -35, -86, 8,   -10, -100, 13,  -20, -135, -15,-55, -100, -15,
  -85, -50, -15,-90, 20, -15,  -80, 75, -5,    -55, 110, -15,-20, 135, -15,
  -95, 50, -25, -80, 95, -25,  -45, 130, -25,  -45, -130, -25,-80, -80, -25,
  -95, -10, -25
};

short mask_poly[] =
{
  148,
  3, 50, 7, 62, 5,    3, 51, 0, 46, 5,    3, 51, 52, 0, 5,    3, 53, 52, 51, 5,
  3, 55, 9, 54, 15,   3, 57, 60, 65, 5,   3, 67, 9, 55, 9,    3, 66, 55, 56, 9,
  3, 66, 67, 55, 9,   3, 65, 66, 56, 9,   3, 57, 65, 56, 9,   3, 58, 71, 61, 5,
  3, 58, 61, 69, 5,   3, 58, 69, 59, 5,   3, 59, 69, 63, 15,  3, 59, 63, 64, 15,
  3, 60, 59, 64, 5,   3, 60, 58, 59, 5,   3, 60, 64, 65, 5,   3, 69, 68, 63, 15,
  3, 61, 70, 69, 5,   3, 61, 71, 70, 5,   3, 71, 62, 72, 5,   3, 62, 7, 72, 5,
  3, 13, 9, 68, 15,   3, 9, 67, 68, 9,    3, 71, 72, 15, 2,   3, 71, 15, 70, 2,
  3, 70, 14, 69, 15,  3, 69, 14, 13, 15,  3, 13, 68, 69, 15,  3, 83, 73, 74, 15,
  3, 83, 30, 73, 15,  3, 84, 83, 74, 15,  3, 84, 74, 75, 15,  3, 85, 84, 75, 15,
  3, 85, 75, 76, 15,  3, 76, 77, 80, 15,  3, 85, 76, 80, 15,  3, 80, 77, 81, 15,
  3, 77, 78, 81, 15,  3, 78, 79, 82, 15,  3, 81, 78, 82, 15,  3, 79, 23, 82, 15,
  3, 57, 56, 49, 5,   3, 49, 56, 48, 5,   3, 56, 55, 48, 15,  3, 55, 54, 48, 15,
  3, 48, 54, 52, 15,  3, 48, 52, 53, 5,   3, 49, 48, 53, 5,   3, 57, 49, 53, 5,
  3, 31, 73, 30, 15,  3, 31, 50, 73, 15,  3, 73, 50, 62, 15,  3, 73, 62, 74, 15,
  3, 74, 62, 71, 15,  3, 74, 71, 58, 15,  3, 74, 58, 75, 15,  3, 75, 58, 60, 15,
  3, 75, 60, 76, 15,  3, 76, 60, 57, 15,  3, 76, 57, 77, 15,  3, 57, 53, 77, 15,
  3, 77, 51, 78, 15,  3, 77, 53, 51, 15,  3, 78, 51, 46, 15,  3, 78, 46, 79, 15,
  3, 47, 45, 46, 5,   3, 47, 46, 44, 5,   3, 43, 44, 42, 15,  3, 43, 47, 44, 15,
  3, 41, 43, 42, 15,  3, 40, 43, 41, 15,  3, 40, 41, 39, 15,  3, 38, 40, 39, 15,
  3, 38, 39, 37, 15,  3, 36, 38, 37, 15,  3, 36, 37, 35, 15,  3, 36, 35, 34, 15,
  3, 33, 36, 34, 15,  3, 33, 34, 32, 15,  3, 31, 33, 32, 5,   3, 31, 30, 33, 5,
  3, 41, 42, 29, 15,  3, 29, 42, 28, 15,  3, 28, 42, 27, 15,  3, 28, 27, 26, 15,
  3, 25, 28, 26, 15,  3, 24, 28, 25, 15,  3, 29, 28, 24, 15,  3, 41, 29, 24, 15,
  3, 45, 22, 23, 15,  3, 21, 22, 47, 5,   3, 47, 22, 45, 5,   3, 43, 21, 47, 15,
  3, 20, 21, 43, 15,  3, 19, 20, 40, 15,  3, 40, 20, 43, 15,  3, 19, 40, 38, 15,
  3, 19, 38, 18, 15,  3, 18, 38, 36, 15,  3, 18, 36, 17, 15,  3, 17, 33, 30, 5,
  3, 17, 36, 33, 15,  3, 13, 11, 12, 15,  3, 11, 13, 14, 15,  3, 16, 11, 14, 15,
  3, 35, 16, 15, 2,   3, 35, 15, 10, 2,   3, 9, 12, 8, 9,     3, 13, 12, 9, 15,
  3, 34, 10, 7, 15,   3, 35, 10, 34, 15,  3, 6, 16, 35, 15,   3, 6, 11, 16, 15,
  3, 11, 5, 12, 15,   3, 39, 3, 4, 15,    3, 39, 2, 37, 15,   3, 39, 4, 2, 15,
  3, 2, 4, 5, 15,     3, 2, 5, 11, 15,    3, 37, 2, 11, 15,   3, 37, 11, 6, 15,
  3, 37, 6, 35, 15,   3, 41, 24, 3, 9,    3, 3, 24, 1, 9,     3, 1, 25, 8, 9,
  3, 1, 24, 25, 9,    3, 8, 25, 9, 9,     3, 41, 3, 39, 15,   3, 25, 26, 9, 15,
  3, 42, 44, 27, 15,  3, 44, 0, 27, 15,   3, 44, 46, 0, 5,    3, 32, 34, 7, 15,
  3, 31, 32, 50, 5,   3, 50, 32, 7, 5,    3, 72, 7, 10, 15,   3, 72, 10, 15, 2,
  3, 46, 45, 79, 15,  3, 23, 79, 45, 15,  3, 52, 27, 0, 14,   3, 54, 9, 26, 14,
  4, 52, 54, 26, 27, 14,     3, 70, 15, 16, 2,     3, 70, 16, 14, 15
};

void *mask_frame, *mask_obj;

int main (void)
{
  long i, j, k;
  unsigned long memptr;
  void * Raster;

   if ( GfxBase = (void *) OpenLibrary ("graphics.library", 0) )
   {
      if ( IntuitionBase = (void *) OpenLibrary ("intuition.library", 0) )
      {
         if ( GfX3dBase = (void *) OpenLibrary ("gfx3d.library", 0) )
         {
            if ( Raster = (void *) AllocMem ( SIZE , MEMF_CHIP | MEMF_CLEAR ) )
            {

               InitBitMap ( &MyBitMap, DEPTH, WIDTH, HEIGHT );
               memptr = (long) Raster;
               for ( k=0 ; k<DEPTH ; k++ )
               {
                  MyBitMap.Planes[k] = (char *) memptr;
                  memptr += BPLSIZE;
               }

          MyNewScreen.CustomBitMap = &MyBitMap;
          if ( MyScreen = (void *) OpenScreen (&MyNewScreen) )
          {
            View = (unsigned long *) ViewAddress();
            ViewPort = View[0];

            LoadRGB32( ViewPort, &RGB32, 256 );

            for ( k=0 ; k<256 ; k++ )
            {
              i = RGB8bit[k];
              palette[k].Red   = (i >> 16) & 0xFF;
              palette[k].Green = (i >> 8) & 0xFF;
              palette[k].Blue  = i & 0xFF;
            }

            GFXSetShading( GFX_FLAT_SHADING | GFX_DEPTH_SHADING );
            GFXSetFarClip( 2048 );
            GFXSetNearClip( -255 );

            GFXBegin( GFX_ENVIRONMENT );
              GFXBegin( GFX_SHADETABLE );
                GFXSteps( 9 );
                GFXThreshold( 4 );
                GFXPalette( (void *) &palette );
              GFXShadeTable( GFXEnd() );
              GFXBegin( GFX_OBJECT );
                mask_frame = BuildFrame( mask_points, mask_poly, GFXFlt( 2 ), 0 );
                GFXFrame( mask_frame );
              mask_obj = (void *) GFXEnd();
              GFXObject( mask_obj );
            env = (void *) GFXEnd();

            GFXBegin( GFX_CAMERA );
              GFXWidth( WIDTH );
              GFXHeight( HEIGHT );
              GFXVideoBuffer( Raster );
              GFXEnvironment( env );
              GFXFocus( 256 );
              GFXAspectRatio( GFXDiv( GFXFlt( 640 ), GFXFlt( WIDTH ) ),
                             GFXFlt( 1 ),
                             GFXDiv( GFXFlt( 200 ), GFXFlt( HEIGHT ) ) );
              GFXDirection( -10, 0, 0 );
              GFXPosition( 0, 0, 100 );
            cam = (void *) GFXEnd();

            for ( j=0 ; j<500 ; j++ )
            {
              GFXModifyObjectPosition( mask_obj, 0, 512+j*4, -100 );
              GFXModifyObjectDirection( mask_obj, j*3, j, j*7 );

              GFXUpdateScene( cam );

              WaitTOF();
              GFXUpdateVideoBuffer();
              GFXClearWorkBuffer();

            }

            Delay ( 50 );
            CloseScreen ( MyScreen );
          }
          FreeMem ( Raster, SIZE );
          }
          CloseLibrary (GfX3dBase);
        }
        CloseLibrary (IntuitionBase);
      }
      CloseLibrary (GfxBase);
   }
   return NULL;
}



void * BuildFrame ( short *points, short *polygons, long scale,
                    long offset )
{
  long i, k;
  long count;
  long n;
  long index;
  long color;
  long x, y, z;
  long x0, y0, z0;
  long x1, y1, z1;

  GFXBegin ( GFX_FRAME );
    count = polygons[0];
    index = 1;
    for ( k=1 ; k<=count ; k++ )
    {
      n = polygons[ index ];
      index++;
      color = polygons[ index+n ];
      GFXSetColor ( color+offset );
      x0 = GFXFltMul( scale , points[ polygons[ index ] * 3 ] );
      y0 = GFXFltMul( scale , points[ polygons[ index ] * 3 + 1 ] );
      z0 = GFXFltMul( scale , points[ polygons[ index ] * 3 + 2 ] );
      x1 = GFXFltMul( scale , points[ polygons[ index+1 ] * 3 ] );
      y1 = GFXFltMul( scale , points[ polygons[ index+1 ] * 3 + 1 ] );
      z1 = GFXFltMul( scale , points[ polygons[ index+1 ] * 3 + 2 ] );
      i = 2;
      while ( i<n )
      {
        GFXBegin ( GFX_POLYGON );
          GFXVertex ( x0 , -z0 , y0 );
          GFXVertex ( x1 , -z1 , y1 );
          x = GFXFltMul( scale , points[ polygons[ index+i ] * 3 ] );
          y = GFXFltMul( scale , points[ polygons[ index+i ] * 3 + 1 ] );
          z = GFXFltMul( scale , points[ polygons[ index+i ] * 3 + 2 ] );
          i++;
          GFXVertex ( x , -z , y );
        GFXPolygon ( GFXEnd () );
        GFXBegin ( GFX_POLYGON );
          GFXColor( 6 );
          GFXVertex ( x0 , -z0 , y0 );
          GFXVertex ( x , -z , y );
          GFXVertex ( x1 , -z1 , y1 );
        GFXPolygon ( GFXEnd () );
        if ( i<n )
        {
          x1 = x;
          y1 = y;
          z1 = z;
        }
      }
      index += n+1;
    }
  return (void *) GFXEnd ();
}


