//  ---------------------------------------------------------------------------
//
//  @file       MiniGLUT.h
//  @brief      A subset of GLUT definitions needed to compile helper functions
//              implemented in TwEventGLUT.c
//
//  notes:    - Private header
//            - AntTweakBar.dll does not need to link with GLUT, 
//              it just needs some definitions for its helper functions.
//            - This header is provided to avoid the need of having GLUT
//              installed to recompile AntTweakBar.
//            - Do not use this header in your own programs, better use the
//              GLUT.h header from the actual GLUT library SDK :
//              http://opengl.org/resources/libraries/glut
//
//  ---------------------------------------------------------------------------

#if !defined MINI_GLUT_INCLUDED
#define MINI_GLUT_INCLUDED

#if defined(_WIN32) || defined(_WIN64)
#   define WIN32_LEAN_AND_MEAN
#   include <windows.h> // needed by gl.h
#   define GLUT_CALL     __stdcall
#   define GLUT_CALLBACK __cdecl
#   define GLUT_API      __declspec(dllimport)
#else
#   define GLUT_CALL
#   define GLUT_CALLBACK
#   define GLUT_API      extern
#endif

#if defined(_MACOSX)
#   include <OpenGL/gl.h>
#   include <OpenGL/glu.h>
#else
#   include <GL/gl.h>  // must be included after windows.h
#   include <GL/glu.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif


// Mouse buttons
#define GLUT_LEFT_BUTTON    0
#define GLUT_MIDDLE_BUTTON  1
#define GLUT_RIGHT_BUTTON   2

// Mouse button state
#define GLUT_DOWN           0
#define GLUT_UP             1

// glutGetModifiers return mask
#define GLUT_ACTIVE_SHIFT   1
#define GLUT_ACTIVE_CTRL    2
#define GLUT_ACTIVE_ALT     4

// function keys
#define GLUT_KEY_F1         1
#define GLUT_KEY_F2         2
#define GLUT_KEY_F3         3
#define GLUT_KEY_F4         4
#define GLUT_KEY_F5         5
#define GLUT_KEY_F6         6
#define GLUT_KEY_F7         7
#define GLUT_KEY_F8         8
#define GLUT_KEY_F9         9
#define GLUT_KEY_F10        10
#define GLUT_KEY_F11        11
#define GLUT_KEY_F12        12

// directional keys
#define GLUT_KEY_LEFT       100
#define GLUT_KEY_UP         101
#define GLUT_KEY_RIGHT      102
#define GLUT_KEY_DOWN       103
#define GLUT_KEY_PAGE_UP    104
#define GLUT_KEY_PAGE_DOWN  105
#define GLUT_KEY_HOME       106
#define GLUT_KEY_END        107
#define GLUT_KEY_INSERT     108

// display mode bit masks
#define GLUT_RGB            0
#define GLUT_RGBA           GLUT_RGB
#define GLUT_INDEX          1
#define GLUT_SINGLE         0
#define GLUT_DOUBLE         2
#define GLUT_ACCUM          4
#define GLUT_ALPHA          8
#define GLUT_DEPTH          16
#define GLUT_STENCIL        32

// timer
#define GLUT_ELAPSED_TIME   ((GLenum) 700)


// functions subset
GLUT_API void GLUT_CALL glutInit(int *argcp, char **argv);
GLUT_API void GLUT_CALL glutInitDisplayMode(unsigned int mode);
GLUT_API int  GLUT_CALL glutCreateWindow(const char *title);
GLUT_API int  GLUT_CALL glutGetWindow(void);
GLUT_API void GLUT_CALL glutSetWindow(int win);
GLUT_API int  GLUT_CALL glutCreateSubWindow(int win, int x, int y, int width, int height);
GLUT_API int  GLUT_CALL glutGet(GLenum type);
GLUT_API void GLUT_CALL glutSwapBuffers();
GLUT_API void GLUT_CALL glutPostRedisplay();
GLUT_API void GLUT_CALL glutInitWindowPosition(int x, int y);
GLUT_API void GLUT_CALL glutInitWindowSize(int width, int height);
GLUT_API void GLUT_CALL glutPositionWindow(int x, int y);
GLUT_API void GLUT_CALL glutReshapeWindow(int width, int height);
GLUT_API void GLUT_CALL glutMainLoop();
GLUT_API int  GLUT_CALL glutCreateMenu(void (GLUT_CALLBACK *func)(int));
GLUT_API void GLUT_CALL glutDisplayFunc(void (GLUT_CALLBACK *func)(void));
GLUT_API void GLUT_CALL glutReshapeFunc(void (GLUT_CALLBACK *func)(int width, int height));
GLUT_API void GLUT_CALL glutKeyboardFunc(void (GLUT_CALLBACK *func)(unsigned char key, int x, int y));
GLUT_API void GLUT_CALL glutMouseFunc(void (GLUT_CALLBACK *func)(int button, int state, int x, int y));
GLUT_API void GLUT_CALL glutMotionFunc(void (GLUT_CALLBACK *func)(int x, int y));
GLUT_API void GLUT_CALL glutPassiveMotionFunc(void (GLUT_CALLBACK *func)(int x, int y));
GLUT_API void GLUT_CALL glutSpecialFunc(void (GLUT_CALLBACK *func)(int key, int x, int y));
GLUT_API int  GLUT_CALL glutGetModifiers(void);
GLUT_API void GLUT_CALL glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
GLUT_API void GLUT_CALL glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
GLUT_API void GLUT_CALL glutSolidTeapot(GLdouble size);

// GLUT exit problem workaround (see glut.h)
#if (defined(_WIN32) || defined(_WIN64)) && !defined(GLUT_DISABLE_ATEXIT_HACK)
    extern void __cdecl exit(int);
    GLUT_API void GLUT_CALL __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int));
    static void GLUT_CALL glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); }
    #define glutInit glutInit_ATEXIT_HACK
#endif


#ifdef __cplusplus
}
#endif

#endif // !defined MINI_GLUT_INCLUDED

