#include <windows.h>
#include <GL\gl.h>
#include <GL\glu.h>
#include <GL\glaux.h>
#include "viewerres.h"
#include "trackbal.h"
#include "pmesh.h"
#include <objbase.h>
#include <initguid.h>

/************************************************************************/
/******************* Macros *********************************************/
/************************************************************************/
#define SCROLLBAR_PAGE 100
#define SCROLLBAR_MIN 0 
#define SCROLLBAR_MAX 1000+(SCROLLBAR_PAGE-1)

#define WIN_WIDTH 500
#define WIN_HEIGHT 500
#define WIN_X 10
#define WIN_Y 10

#define DEFHITHER  1  //0.1
#define DEFYONDER  10 //1e30;

#ifdef DEBUGGING
    char    szDebugBuffer[80];
    #define DEBUG(parm1,parm2)\
        {\
            wsprintf(szDebugBuffer,parm1,parm2);\
            OutputDebugString(szDebugBuffer);\
        }
#else
    #define DEBUG(parm1,parm2)
#endif


/************************************************************************/
/******************* Enums **********************************************/
/************************************************************************/
/**** Enums ****/
enum NormalMode {PER_VERTEX, PER_FACET, PER_OBJECT};
enum TransformType {ORTHO_PROJECTION, PERSP_PROJECTION};

/************************************************************************/
/******************* Structs ********************************************/
/************************************************************************/
/**** Structs ****/

typedef struct _ostate 
{
} GLSTATE, *LPGLSTATE;

typedef struct _Scene 
{
    GLfloat hither;
    GLfloat yon;

    GLfloat scale;
    GLfloat angle;
    int scroll_pos;
    GLfloat trans[3];
  
    GLfloat from[3];
    GLfloat to[3];
    GLfloat up[3];
    GLfloat aspect_ratio;
    GLfloat fov;
    GLfloat zoom;

    GLfloat max_vert[3];
    GLfloat min_vert[3];
} SCENE, *LPSCENE;

typedef struct _WInf 
{
    HWND         hWnd;
    HMENU        hMenu;
    POINT        wPosition;
    POINT        wCenter;
    SIZE         wSize;
    HPALETTE     hPalette;
    HPALETTE     hOldPalette;
    HGLRC        hRc;

    LONG         rmouseX;
    LONG         rmouseY;
    BOOL         rmouse_down;
  
    LONG         lmouseX;
    LONG         lmouseY;
    BOOL         lmouse_down;
  
} WININFO, *LPWININFO;


/************************************************************************/
/******************* Windows Globals ************************************/
/************************************************************************/
/**** Externs ****/
extern WININFO g_wi;
extern SCENE g_s;

/************************************************************************/
/******************* Function Prototypes ********************************/
/************************************************************************/
/******** viewer.cxx *************/
extern void CleanUpAndQuit (void);
extern BOOL InitMainWindow (HINSTANCE, HINSTANCE, LPSTR, int);
extern LONG APIENTRY GLWndProc(HWND, UINT, UINT, LONG);

/******** glstuff.cxx ************/
extern void Reshape (GLsizei, GLsizei);
extern void SetViewWrap (GLsizei, GLsizei);
extern void InitGL(void);
extern void InitDrawing ();
extern void CALLBACK DoGlStuff(void);
extern void spin( HWND, HDC );
extern void CleanupGL(HGLRC);
extern void UpdateWinTitle (HWND);
extern void spin(void);
extern void ForceRedraw(HWND);
extern char* OpenPMFile(HWND, const char *, int);
extern void EnableLighting (void);
extern void DisableLighting (void);

extern void Key_up (void);
extern void Key_down (void);
extern void Key_i (void);
extern void Key_z (void);
extern void Key_Z (void);
extern void Key_y (void);
extern void Key_Y (void);
extern void Key_x (void);
extern void Key_X (void);

extern BOOL FindPixelFormat(HDC);
extern HPALETTE CreateRGBPalette( HDC hdc );

/******** pm.cxx *****************/
extern long RealizePaletteNow( HDC, HPALETTE, BOOL);
extern int PixelFormatDescriptorFromDc( HDC, PIXELFORMATDESCRIPTOR * );

/************************************************************************/
/******************* OpenGL State ***************************************/
/************************************************************************/
/********** OpenGL State *************/
extern BOOL renderDoubleBuffer;
extern int colormode;
extern enum NormalMode normal_mode;

extern BOOL linesmooth_enable;
extern BOOL polysmooth_enable;

extern GLenum cull_face;
extern GLenum front_face;
extern BOOL cull_enable;

extern BOOL depth_mode;
extern BOOL fog_enable;
extern BOOL clip_enable;
extern GLenum shade_model;

extern BOOL polystipple_enable;
extern BOOL linestipple_enable;

extern int matrixmode;
extern enum TransformType tx_type;

extern BOOL dither_enable;

extern BOOL blend_enable;
extern GLenum sblendfunc;
extern GLenum dblendfunc;

extern BOOL filled_mode;
extern BOOL edge_mode;
extern BOOL displaylist_mode;
extern GLfloat linewidth;

extern GLfloat hither;
extern GLfloat yon;

extern GLenum polymodefront;
extern GLenum polymodeback;

extern BOOL mblur_enable;
extern GLfloat blur_amount;
extern int fsantimode;
extern int fsaredraw;
extern GLfloat fsajitter;

extern int cmface;
extern int cmmode;
extern int cmenable;

extern BOOL tex_enable;
extern BOOL texgen_enable;
extern GLenum texenvmode;

extern long tex_pack;
extern int tex_row;
extern int tex_col;
extern int tex_index;
extern int tex_xpix;
extern int tex_ypix;
extern int tex_numpix;
extern int tex_numcomp;
extern GLfloat tex_minfilter;
extern GLfloat tex_magfilter;
extern unsigned char *Image;
extern unsigned char *TextureImage;

extern BOOL light_enable;
extern int numInfLights;
extern int numLocalLights;
extern BOOL lighttwoside;
extern GLfloat localviewmode;

extern float curquat[4];
extern float lastquat[4];

/************** PM related stuff **********/
extern float pm_lod_level;
extern float old_lod;
extern BOOL pm_ready;
extern LPPMESH pPMesh;
extern LPPMESHGL pPMeshGL;