//This file is part of Photon (http://photon.sourceforge.net)
//Copyright (C) 2004-2005 James Turk
//
// Author:
//  James Turk (jpt2433@rit.edu)
//
// Version:
//  $Id: types.hpp,v 1.7 2005/08/08 19:19:25 cozman Exp $

#ifndef PHOTON_TYPES_HPP
#define PHOTON_TYPES_HPP

#include <boost/shared_ptr.hpp>

#include <string>
#include <vector>

#include "GL/glfw.h"   //This file depends on glfw

// Title: Basic Types

namespace photon 
{

// Group: Basic Types

// Type: ubyte
//  Unsigned byte, alias for unsigned char.
typedef unsigned char ubyte;

// Type: uint
//  Alias for unsigned integer.
typedef unsigned int uint;

// Type: scalar
//  Scalar value, used throughout photon in place of double or float
typedef double scalar;

// Group: STL/Boost Types

// Type: StrVec
//  Typedef for vector of strings, which is used all throughout photon.
typedef std::vector<std::string> StrVec;

// Type: shared_ptr
//  Shared pointer type. (uses the boost implementation)
using boost::shared_ptr;

// Group: Enums

// Enum: KeyCode
// Enumeration defining keys, used in <Application::keyPressed>.
//
// Enums:
//  KEY_ESC  - Escape key
//  KEY_F1   - F1 key
//  KEY_F2   - F2 key
//  KEY_F3   - F3 key
//  KEY_F4   - F4 key
//  KEY_F5   - F5 key
//  KEY_F6   - F6 key
//  KEY_F7   - F7 key
//  KEY_F8   - F8 key
//  KEY_F9   - F9 key
//  KEY_F10  - F10 key
//  KEY_F11  - F11 key
//  KEY_F12  - F12 key
//  KEY_F13  - F13 key
//  KEY_F14  - F14 key
//  KEY_F15  - F15 key
//  KEY_F16  - F16 key
//  KEY_F17  - F17 key
//  KEY_F18  - F18 key
//  KEY_F19  - F19 key
//  KEY_F20  - F20 key
//  KEY_F21  - F21 key
//  KEY_F22  - F22 key
//  KEY_F23  - F23 key
//  KEY_F24  - F24 key
//  KEY_F25  - F25 key
//
//  KEY_INSERT   - Insert key
//  KEY_HOME     - Home key
//  KEY_PGUP     - Page up key
//  KEY_DELETE   - Delete key
//  KEY_END      - End key
//  KEY_PGDOWN   - Page down key
//  KEY_UP       - Up arrow key
//  KEY_LEFT     - Left arrow key
//  KEY_DOWN     - Down arrow key
//  KEY_RIGHT    - Right arrow key
//
//  KEY_TILDE    - Tilde key
//  KEY_1        - 1 key
//  KEY_2        - 2 key
//  KEY_3        - 3 key
//  KEY_4        - 4 key
//  KEY_5        - 5 key
//  KEY_6        - 6 key
//  KEY_7        - 7 key
//  KEY_8        - 8 key
//  KEY_9        - 9 key
//  KEY_0        - 0 key
//  KEY_MINUS    - Minus key
//  KEY_EQUAL    - Equal key
//  KEY_BACKSPACE- Backspace key
//
//  KEY_TAB      - Tab key
//  KEY_Q        - Q key
//  KEY_W        - W key
//  KEY_E        - E key
//  KEY_R        - R key
//  KEY_T        - T key
//  KEY_Y        - Y key
//  KEY_U        - U key
//  KEY_I        - I key
//  KEY_O        - O key
//  KEY_P        - P key
//  KEY_LBRAC    - Left bracket [ key
//  KEY_RBRAC    - Right bracket ] key
//  KEY_BKSLASH  - Backslash \ key
//
//  KEY_A        - A key
//  KEY_S        - S key
//  KEY_D        - D key
//  KEY_F        - F key
//  KEY_G        - G key
//  KEY_H        - H key
//  KEY_J        - J key
//  KEY_K        - K key
//  KEY_L        - L key
//  KEY_COLON    - Colon :  key
//  KEY_QUOTE    - Quote " key
//  KEY_RETURN   - Enter/Return key
//
//  KEY_LSHIFT   - Left shift key
//  KEY_Z        - Z key
//  KEY_X        - X key
//  KEY_C        - C key
//  KEY_V        - V key
//  KEY_B        - B key
//  KEY_N        - N key
//  KEY_M        - M key
//  KEY_COMMA    - Comma , key
//  KEY_PERIOD   - Period . key
//  KEY_SLASH    - Slash / key
//  KEY_RSHIFT   - Right shift key
//
//  KEY_LCTRL    - Left control key
//  KEY_LALT     - Left alt key
//  KEY_SPACE    - Space bar key
//  KEY_RALT     - Right alt key
//  KEY_RCTRL    - Right control key
//
//  KEY_NUM_SLASH    - Numpad slash / key
//  KEY_NUM_ASTERIX  - Numpad asterix * key
//  KEY_NUM_MINUS    - Numpad minus - key
//  KEY_NUM_PLUS     - Numpad plus + key
//  KEY_NUM_ENTER    - Numpad enter key
//  KEY_NUM_PERIOD   - Numpad period . key
//  KEY_NUM_0        - Numpad 0 key
//  KEY_NUM_1        - Numpad 1 key
//  KEY_NUM_2        - Numpad 2 key
//  KEY_NUM_3        - Numpad 3 key
//  KEY_NUM_4        - Numpad 4 key
//  KEY_NUM_5        - Numpad 5 key
//  KEY_NUM_6        - Numpad 6 key
//  KEY_NUM_7        - Numpad 7 key
//  KEY_NUM_8        - Numpad 8 key
//  KEY_NUM_9        - Numpad 9 key
enum KeyCode
{
    //TOP ROW
    KEY_ESC  =GLFW_KEY_ESC,
    KEY_F1   =GLFW_KEY_F1,
    KEY_F2   =GLFW_KEY_F2,
    KEY_F3   =GLFW_KEY_F3,
    KEY_F4   =GLFW_KEY_F4,
    KEY_F5   =GLFW_KEY_F5,
    KEY_F6   =GLFW_KEY_F6,
    KEY_F7   =GLFW_KEY_F7,
    KEY_F8   =GLFW_KEY_F8,
    KEY_F9   =GLFW_KEY_F9,
    KEY_F10  =GLFW_KEY_F10,
    KEY_F11  =GLFW_KEY_F11,
    KEY_F12  =GLFW_KEY_F12,
    KEY_F13  =GLFW_KEY_F13,
    KEY_F14  =GLFW_KEY_F14,
    KEY_F15  =GLFW_KEY_F15,
    KEY_F16  =GLFW_KEY_F16,
    KEY_F17  =GLFW_KEY_F17,
    KEY_F18  =GLFW_KEY_F18,
    KEY_F19  =GLFW_KEY_F19,
    KEY_F20  =GLFW_KEY_F20,
    KEY_F21  =GLFW_KEY_F21,
    KEY_F22  =GLFW_KEY_F22,
    KEY_F23  =GLFW_KEY_F23,
    KEY_F24  =GLFW_KEY_F24,
    KEY_F25  =GLFW_KEY_F25,

    //MIDDLE SECTION
    //PRINT SCREEN
    //SCROLL LOCK
    //PAUSE
    KEY_INSERT   =GLFW_KEY_INSERT,
    KEY_HOME     =GLFW_KEY_HOME,
    KEY_PGUP     =GLFW_KEY_PAGEUP,
    KEY_DELETE   =GLFW_KEY_DEL,
    KEY_END      =GLFW_KEY_END,
    KEY_PGDOWN   =GLFW_KEY_PAGEDOWN,
    KEY_UP       =GLFW_KEY_UP,
    KEY_LEFT     =GLFW_KEY_LEFT,
    KEY_DOWN     =GLFW_KEY_DOWN,
    KEY_RIGHT    =GLFW_KEY_RIGHT,

    //TOP ROW
    KEY_TILDE    ='`',
    KEY_1        ='1',
    KEY_2        ='2',
    KEY_3        ='3',
    KEY_4        ='4',
    KEY_5        ='5',
    KEY_6        ='6',
    KEY_7        ='7',
    KEY_8        ='8',
    KEY_9        ='9',
    KEY_0        ='0',
    KEY_MINUS    ='-',
    KEY_EQUAL    ='=',
    KEY_BACKSPACE=GLFW_KEY_BACKSPACE,

    //SECOND ROW
    KEY_TAB      =GLFW_KEY_TAB,
    KEY_Q        ='Q',
    KEY_W        ='W',
    KEY_E        ='E',
    KEY_R        ='R',
    KEY_T        ='T',
    KEY_Y        ='Y',
    KEY_U        ='U',
    KEY_I        ='I',
    KEY_O        ='O',
    KEY_P        ='P',
    KEY_LBRAC    ='[',
    KEY_RBRAC    =']',
    KEY_BKSLASH  ='\\',

    //HOME ROW
    //CAPS LOCK
    KEY_A        ='A',
    KEY_S        ='S',
    KEY_D        ='D',
    KEY_F        ='F',
    KEY_G        ='G',
    KEY_H        ='H',
    KEY_J        ='J',
    KEY_K        ='K',
    KEY_L        ='L',
    KEY_COLON    =';',
    KEY_QUOTE    ='\'',
    KEY_RETURN   =GLFW_KEY_ENTER,

    //BOTTOM ROW
    KEY_LSHIFT   =GLFW_KEY_LSHIFT,
    KEY_Z        ='Z',
    KEY_X        ='X',
    KEY_C        ='C',
    KEY_V        ='V',
    KEY_B        ='B',
    KEY_N        ='N',
    KEY_M        ='M',
    KEY_COMMA    =',',
    KEY_PERIOD   ='.',
    KEY_SLASH    ='/',
    KEY_RSHIFT   =GLFW_KEY_RSHIFT,

    //SPACE ROW
    KEY_LCTRL    =GLFW_KEY_LCTRL,
    //WINDOWS KEY
    KEY_LALT     =GLFW_KEY_LALT,
    KEY_SPACE    =GLFW_KEY_SPACE,
    KEY_RALT     =GLFW_KEY_RALT,
    //WINDOWS KEY
    //TASK KEY
    KEY_RCTRL    =GLFW_KEY_RCTRL,

    //NUMPAD
    //NUMLOCK
    KEY_NUM_SLASH    =GLFW_KEY_KP_DIVIDE,
    KEY_NUM_ASTERIX  =GLFW_KEY_KP_MULTIPLY,
    KEY_NUM_MINUS    =GLFW_KEY_KP_SUBTRACT,
    KEY_NUM_PLUS     =GLFW_KEY_KP_ADD,
    KEY_NUM_ENTER    =GLFW_KEY_KP_ENTER,
    KEY_NUM_PERIOD   =GLFW_KEY_KP_DECIMAL,
    KEY_NUM_0        =GLFW_KEY_KP_0,
    KEY_NUM_1        =GLFW_KEY_KP_1,
    KEY_NUM_2        =GLFW_KEY_KP_2,
    KEY_NUM_3        =GLFW_KEY_KP_3,
    KEY_NUM_4        =GLFW_KEY_KP_4,
    KEY_NUM_5        =GLFW_KEY_KP_5,
    KEY_NUM_6        =GLFW_KEY_KP_6,
    KEY_NUM_7        =GLFW_KEY_KP_7,
    KEY_NUM_8        =GLFW_KEY_KP_8,
    KEY_NUM_9        =GLFW_KEY_KP_9
};

// Enum: MouseButton
// Enumeration defining buttons, used in <Application::mouseButtonPressed>.
//
//  MB_LEFT     - Left mouse button.
//  MB_MIDDLE   - Middle mouse button.
//  MB_RIGHT    - Right mouse button.
enum MouseButton 
{
    MB_LEFT     =GLFW_MOUSE_BUTTON_LEFT,
    MB_MIDDLE   =GLFW_MOUSE_BUTTON_MIDDLE,
    MB_RIGHT    =GLFW_MOUSE_BUTTON_RIGHT
};

}

#endif  //PHOTON_TYPES_HPP
