/*
**	$VER: primitives.c 1.1 (12.03.1998)
**
**	This is an example program for CyberGL
**
**      Written by Frank Gerberding
**
**	Copyright © 1996-1998 by phase5 digital products
**      All Rights reserved.
**
*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include <clib/exec_protos.h>

#define CYBERGLNAME             "cybergl.library"
#define CYBERGLVERSION          39L


#define SHARED                  /* we use the cybergl shared library */
#define GL_APICOMPATIBLE        /* we use stubs from cybergl.lib */


#include <cybergl/cybergl.h>
#include <proto/cybergl.h>

#ifdef SHARED
LONG __oslibversion   = 39L;
LONG __CGLlibversion = CYBERGLVERSION;
#endif


#define WIDTH    400
#define HEIGHT   400





int mode = 0;





void draw_primitives (void)
{
  glMatrixMode   (GL_PROJECTION);
  glLoadIdentity ();
  glOrtho2D      (-1.0, 1.0, -1.0, 1.0);

  switch (mode)
  {
    case 0: glBegin (GL_POINTS);
            break;
    case 1: glBegin (GL_LINES);
            break;
    case 2: glBegin (GL_LINE_STRIP);
            break;
    case 3: glBegin (GL_LINE_LOOP);
            break;
    case 4: glBegin (GL_TRIANGLES);
            break;
    case 5: glBegin (GL_TRIANGLE_STRIP);
            break;
    case 6: glBegin (GL_TRIANGLE_FAN);
            break;
    case 7: glBegin (GL_QUADS);
            break;
    case 8: glBegin (GL_QUAD_STRIP);
            break;
    case 9: glBegin (GL_POLYGON);
            break;
  }
  glColor3d  ( 1.0, 1.0, 1.0);
  glVertex2d (-0.8, -0.33137);
  glVertex2d (-0.8,  0.33137);
  glVertex2d (-0.33137,  0.8);
  glVertex2d ( 0.33137,  0.8);
  glVertex2d ( 0.8,  0.33137);
  glVertex2d ( 0.8, -0.33137);
  glVertex2d ( 0.33137, -0.8);
  glVertex2d (-0.33137, -0.8);

  glEnd ();
}





void handle_window_events (GLvoid *win)
{
  struct Window       *window;
  struct IntuiMessage *msg;
  int                  done = 0;

  window = getWindow (win);

  while (!done)
  {
    Wait (1L << window->UserPort->mp_SigBit);
    while ((!done) && (msg = (struct IntuiMessage *) GetMsg (window->UserPort)))
    {
      switch (msg->Class)
      {
        case IDCMP_CLOSEWINDOW:
          done = 1;
          break;
        case IDCMP_NEWSIZE:
          resizeGLWindow   (win, window->GZZWidth, window->GZZHeight);
          glClear          (GL_COLOR_BUFFER_BIT);
          draw_primitives ();
          break;
      }
      ReplyMsg ((struct Message *) msg);
    }
  }
}





void main (int argc, char *argv[])
{
  void *window;

  if (argc > 1)
  {
    mode = atoi (argv [1]);
  }

  window  = openGLWindowTags (WIDTH, HEIGHT, GLWA_Title, "Primitves",
                                             GLWA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_NEWSIZE,
                                             GLWA_CloseGadget, TRUE,
                                             GLWA_DepthGadget, TRUE,
                                             GLWA_DragBar,     TRUE,
                                             GLWA_Activate, TRUE,
                                             GLWA_RGBAMode, GL_TRUE,
                                             TAG_DONE);
  if (window)
  {
    glEnable         (GL_DITHER);
    glShadeModel     (GL_SMOOTH);
    glClear          (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    draw_primitives ();

    handle_window_events (window);

    closeGLWindow (window);
  }
}
