Example #1
0
/* general OpenGL initialization function */
int initGL()
{
    if (!loadGLTextures())
    {
        return False;
    }
    glEnable(GL_TEXTURE_2D);       /* Enable Texture Mapping */
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    /* set up our lighting */
    glLightfv(GL_LIGHT1, GL_AMBIENT, lightAmbient);
    glLightfv(GL_LIGHT1, GL_DIFFUSE, lightDiffuse);
    glLightfv(GL_LIGHT1, GL_POSITION, lightPosition);
    glEnable(GL_LIGHT1);
    /* we use resizeGLScene once to set up our initial perspective */
    resizeGLScene(GLWin.width, GLWin.height);
    if (light)
        glEnable(GL_LIGHTING);
    glFlush();
    return True;
}
Example #2
0
/* general OpenGL initialization function */
int initGL(GLvoid)
{
    if (!loadGLTextures())
    {
        return False;
    }
    glEnable(GL_TEXTURE_2D);       /* enable texture mapping */
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glColor4f(1.0f, 1.0f, 1.0f, 0.5f);  /* full brightness, 50% Alpha */
    glBlendFunc(GL_SRC_ALPHA, GL_ONE);  /* blending function */
    /* set up our lighting */
    glLightfv(GL_LIGHT1, GL_AMBIENT, lightAmbient);
    glLightfv(GL_LIGHT1, GL_DIFFUSE, lightDiffuse);
    glLightfv(GL_LIGHT1, GL_POSITION, lightPosition);
    glEnable(GL_LIGHT1);
    /* we use resizeGLScene once to set up our initial perspective */
    resizeGLScene(GLWin.width, GLWin.height);
    /* test the state of blending and lighting, so keep it when switching 
     * between fullscreen and window mode 
     */
    if (blend)
    {
        glEnable(GL_BLEND);
        glDisable(GL_DEPTH_TEST);
    }
    if (light)
        glEnable(GL_LIGHTING);
    glFlush();
    return True;
}
Example #3
0
void Game::initDisplay()
{
	mainOpenGLState = new CL_OpenGLState(CL_Display::get_current_window()->get_gc());
	mainOpenGLState->set_active();

	resizeGLScene();

	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
	glClearDepth(1.0);

	//ne dessine que les faces avant des polygones
	glCullFace(GL_FRONT);
	//active le depth buffer
	glEnable(GL_DEPTH_TEST);
	//normalize les vecteurs
	glEnable(GL_NORMALIZE);
	//dessine que les polygones definis dans le sens trigonometrique
	glEnable(GL_CULL_FACE);
	glFrontFace(GL_CCW);
	//modele de degrade
	glShadeModel(GL_SMOOTH);
	//filtrage des textures
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);	
	
	//gestion des lumiéres
	GLfloat ambient[] = {0.4f, 0.4f, 0.4f, 1.0f};
	glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
	
#ifndef WIN32
	//sépare la couleur spéculaire pour les textures
	glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
#endif

	//lumiére de position, donc w = 1.0 (sinon lumiére directionnelle)
	GLfloat position[] = {world->getWidth() / 2.0f - 2.0f, world->getHeight() / 2.0f - 2.0f, -world->getDepth() / 2.0f + 2.0f, 1.0f};
	GLfloat direction[] = {-1.0, -1.0, 1.0};
	GLfloat cutoff[] = {90.0f};
	GLfloat attenuation[] = {0.2f};
	GLfloat diffuse[] = {1.0, 1.0, 1.0, 1.0};
	GLfloat specular[] = {1.0, 1.0, 1.0, 1.0};
	glLightfv(GL_LIGHT0, GL_POSITION, position);
	glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, direction);
	glLightfv(GL_LIGHT0, GL_SPOT_CUTOFF, cutoff);
	glLightfv(GL_LIGHT0, GL_CONSTANT_ATTENUATION, attenuation);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
	glLightfv(GL_LIGHT0, GL_SPECULAR, specular);

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);

	world->initDisplay();
}
Example #4
0
/* general OpenGL initialization function */
int initGL(GLvoid)
{
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    /* we use resizeGLScene once to set up our initial perspective */
    resizeGLScene(GLWin.width, GLWin.height);
    /* Reset the rotation angles of our objects */
    rotTri = 0;
    rotQuad = 0;    
    glFlush();
    return True;
}
Example #5
0
File: main.cpp Project: UIKit0/boll
void initGL()
{
	    glEnable(GL_TEXTURE_2D);       /* Enable Texture Mapping */
	        glShadeModel(GL_SMOOTH);
		    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
		        glClearDepth(1.0f);
			    glEnable(GL_DEPTH_TEST);
			        glDepthFunc(GL_LEQUAL);
				    glEnable(GL_LIGHT0);
				        glEnable(GL_LIGHTING);
					    glEnable(GL_COLOR_MATERIAL);
					        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
						    /* we use resizeGLScene once to set up our initial perspective */
						    resizeGLScene(640,480);
						        glFlush();
}
Example #6
0
int initGL()						/*  All Setup For OpenGL Goes Here */
{
	glEnable(GL_TEXTURE_2D);				/*  Enable Texture Mapping */
	glShadeModel(GL_SMOOTH);				/*  Enable Smooth Shading */
	glClearColor(0.05f, 0.05f, 0.05f, 0.5f);		/*  Black Background */
	glClearDepth(1.0f);					/*  Depth Buffer Setup */
	glEnable(GL_DEPTH_TEST);				/*  Enables Depth Testing */
	glDepthFunc(GL_LEQUAL);					/*  The Type Of Depth Testing To Do */
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	/*  Really Nice Perspective Calculations */

	initBezier();						/*  Initialize the Bezier's control grid */
	LoadGLTexture(&(mybezier.texture), "./data/NeHe.bmp");	/*  Load the texture */
	mybezier.dlBPatch = genBezier(mybezier, divs);		/*  Generate the patch */

	resizeGLScene(GLWin.width, GLWin.height);
	glFlush();

	return True;						/*  Initialization Went OK */
}
Example #7
0
/* general OpenGL initialization function */
int initGL(GLvoid)
{
    if (!loadGLTextures())
    {
        return False;
    }
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    glDisable(GL_DEPTH_TEST);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    /* initializing our particles */
    for (loop = 0; loop < MAX_PARTICLES; loop++) {
        particle[loop].active = True;
        particle[loop].life = 1.0f;
        particle[loop].fade = (float) (rand() % 100) / 1000 + 0.003f;
        particle[loop].red = colors[loop / (MAX_PARTICLES / 12)][0];
        particle[loop].green = colors[loop / (MAX_PARTICLES / 12)][0];
        particle[loop].blue = colors[loop / (MAX_PARTICLES / 12)][0];
        particle[loop].xSpeed = (float) ((rand() % 50) - 26.0f) * 10.0f;
        particle[loop].ySpeed = (float) ((rand() % 50) - 25.0f) * 10.0f;
        particle[loop].zSpeed = (float) ((rand() % 50) - 25.0f) * 10.0f;
        particle[loop].xGrav = 0.0f;
        particle[loop].yGrav = -0.8f;
        particle[loop].zGrav = 0.0f;
    }
    /* we use resizeGLScene once to set up our initial perspective */
    resizeGLScene(GLWin.width, GLWin.height);
    glFlush();
    return True;
}
BOOL OpenGLGame::createGLWindow()
{
	GLuint		PixelFormat;						// 保存查找匹配的结果
	WNDCLASS	wc;							// 窗口类结构
	DWORD		dwExStyle;						// 扩展窗口风格
	DWORD		dwStyle;						// 窗口风格

	RECT WindowRect;							// 取得矩形的左上角和右下角的坐标值
	WindowRect.left = ( long )0;						// 将Left   设为 0
	WindowRect.right = ( long )m_nWidth;						// 将Right  设为要求的宽度
	WindowRect.top = ( long )0;							// 将Top    设为 0
	WindowRect.bottom = ( long )m_nHeight;						// 将Bottom 设为要求的高度

	m_hInstance		= GetModuleHandle( NULL );			// 取得我们窗口的实例
	wc.style		= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;		// 移动时重画,并为窗口取得DC
	wc.lpfnWndProc		= ( WNDPROC ) &OpenGLGame::wndProc;				// WndProc处理消息
	wc.cbClsExtra		= 0;						// 无额外窗口数据
	wc.cbWndExtra		= 0;						// 无额外窗口数据
	wc.hInstance		= m_hInstance;					// 设置实例
	wc.hIcon		= LoadIcon( NULL, IDI_WINLOGO );			// 装入缺省图标
	wc.hCursor		= LoadCursor( NULL, IDC_ARROW );			// 装入鼠标指针
	wc.hbrBackground	= NULL;						// GL不需要背景
	wc.lpszMenuName		= NULL;						// 不需要菜单
	wc.lpszClassName	= "OpenG";					// 设定类名字


	if ( !RegisterClass( &wc ) )						// 尝试注册窗口类
	{
		MessageBox( NULL, "注册窗口失败", "错误", MB_OK | MB_ICONEXCLAMATION );
		return FALSE;							// 退出并返回FALSE
	}

	if ( m_bFullScreen )								// 要尝试全屏模式吗?
	{
		DEVMODE dmScreenSettings;						// 设备模式
		memset( &dmScreenSettings, 0, sizeof( dmScreenSettings ) );			// 确保内存清空为零
		dmScreenSettings.dmSize = sizeof( dmScreenSettings );			// Devmode 结构的大小
		dmScreenSettings.dmPelsWidth	= m_nWidth;				// 所选屏幕宽度
		dmScreenSettings.dmPelsHeight	= m_nHeight;				// 所选屏幕高度
		dmScreenSettings.dmBitsPerPel	= m_nBitMode;					// 每象素所选的色彩深度
		dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;



		// 尝试设置显示模式并返回结果。注: CDS_FULLSCREEN 移去了状态条。
		if ( ChangeDisplaySettings( &dmScreenSettings, CDS_FULLSCREEN ) != DISP_CHANGE_SUCCESSFUL )
		{
			// 若模式失败,提供两个选项:退出或在窗口内运行。
			if ( MessageBox( NULL, "全屏模式在当前显卡上设置失败!\n使用窗口模式?", "G", MB_YESNO | MB_ICONEXCLAMATION ) == IDYES )
			{
				m_bFullScreen = FALSE;				// 选择窗口模式(Fullscreen=FALSE)
			}
			else
			{
				// 弹出一个对话框,告诉用户程序结束
				MessageBox( NULL, "程序将被关闭", "错误", MB_OK | MB_ICONSTOP );
				return FALSE;					//  退出并返回 FALSE
			}
		}
	}


	if ( m_bFullScreen )								// 仍处于全屏模式吗?
	{
		dwExStyle = WS_EX_APPWINDOW;					// 扩展窗体风格
		dwStyle = WS_POPUP;						// 窗体风格
		ShowCursor( FALSE );						// 隐藏鼠标指针
	}
	else
	{
		dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;			// 扩展窗体风格
		dwStyle = WS_OVERLAPPEDWINDOW;					//  窗体风格
	}

	AdjustWindowRectEx( &WindowRect, dwStyle, FALSE, dwExStyle );		// 调整窗口达到真正要求的大小

	if ( !( m_hWnd = CreateWindowEx(	dwExStyle,				// 扩展窗体风格
	                                    "OpenG",				// 类名字
	                                    m_szTitle,					// 窗口标题
	                                    WS_CLIPSIBLINGS |			// 必须的窗体风格属性
	                                    WS_CLIPCHILDREN |			// 必须的窗体风格属性
	                                    dwStyle,				// 选择的窗体属性
	                                    0, 0,					// 窗口位置
	                                    WindowRect.right - WindowRect.left,	// 计算调整好的窗口宽度
	                                    WindowRect.bottom - WindowRect.top,	// 计算调整好的窗口高度
	                                    NULL,					// 无父窗口
	                                    NULL,					// 无菜单
	                                    m_hInstance,				// 实例
	                                    NULL ) ) )					// 不向WM_CREATE传递任何东东
	{
		killGLWindow();							// 重置显示区
		MessageBox( NULL, "不能创建一个窗口设备描述表", "错误", MB_OK | MB_ICONEXCLAMATION );
		return FALSE;							// 返回 FALSE
	}

	static	PIXELFORMATDESCRIPTOR pfd =					// /pfd 告诉窗口我们所希望的东东,即窗口使用的像素格式
	{
		sizeof( PIXELFORMATDESCRIPTOR ),					// 上述格式描述符的大小
		1,								// 版本号
		PFD_DRAW_TO_WINDOW |						// 格式支持窗口
		PFD_SUPPORT_OPENGL |						// 格式必须支持OpenGL
		PFD_DOUBLEBUFFER,						// 必须支持双缓冲
		PFD_TYPE_RGBA,							// 申请 RGBA 格式
		m_nBitMode,								// 选定色彩深度
		0, 0, 0, 0, 0, 0,						// 忽略的色彩位
		0,								// 无Alpha缓存
		0,								// 忽略Shift Bit
		0,								// 无累加缓存
		0, 0, 0, 0,							// 忽略聚集位
		16,								// 16位 Z-缓存 (深度缓存)
		0,								// 无蒙板缓存
		0,								// 无辅助缓存
		PFD_MAIN_PLANE,							// 主绘图层
		0,								// Reserved
		0, 0, 0								// 忽略层遮罩
	};


	if ( !( m_hDC = GetDC( m_hWnd ) ) )							// 取得设备描述表了么?
	{
		killGLWindow();							// 重置显示区
		MessageBox( NULL, "不能创建一种相匹配的像素格式", "错误", MB_OK | MB_ICONEXCLAMATION );
		return FALSE;							// 返回 FALSE
	}

	if ( !( PixelFormat = ChoosePixelFormat( m_hDC, &pfd ) ) )				// Windows 找到相应的象素格式了吗?
	{
		killGLWindow();							// 重置显示区
		MessageBox( NULL, "不能设置像素格式", "错误", MB_OK | MB_ICONEXCLAMATION );
		return FALSE;							// 返回 FALSE
	}

	if( !SetPixelFormat( m_hDC, PixelFormat, &pfd ) )				// 能够设置象素格式么?
	{
		killGLWindow();							// 重置显示区
		MessageBox( NULL, "不能设置像素格式", "错误", MB_OK | MB_ICONEXCLAMATION );
		return FALSE;							// 返回 FALSE
	}


	if ( !( m_hRC = wglCreateContext( m_hDC ) ) )					// 能否取得着色描述表?
	{
		killGLWindow();							// 重置显示区
		MessageBox( NULL, "不能创建OpenGL渲染描述表", "错误", MB_OK | MB_ICONEXCLAMATION );
		return FALSE;							// 返回 FALSE
	}

	if( !wglMakeCurrent( m_hDC, m_hRC ) )						// 尝试激活着色描述表
	{
		killGLWindow();							// 重置显示区
		MessageBox( NULL, "不能激活当前的OpenGL渲然描述表", "错误", MB_OK | MB_ICONEXCLAMATION );
		return FALSE;							// 返回 FALSE
	}

	ShowWindow( m_hWnd, SW_SHOW );						// 显示窗口
	SetForegroundWindow( m_hWnd );						// 略略提高优先级
	SetFocus( m_hWnd );								// 设置键盘的焦点至此窗口
	resizeGLScene( m_nWidth, m_nHeight );						// 设置透视 GL 屏幕


	if ( !initGL() )								// 初始化新建的GL窗口
	{
		killGLWindow();							// 重置显示区
		MessageBox( NULL, "Initialization Failed.", "ERROR", MB_OK | MB_ICONEXCLAMATION );
		return FALSE;							// 返回 FALSE
	}


	return TRUE;								// 成功
}
Example #9
0
int main(int argc, char **argv)
{
    XEvent event;
    KeySym key;
    
    done = False;
    /* default to fullscreen */
    GLWin.fs = True;
    createGLWindow("NeHe's Rotation Tutorial", 1920, 1280, 24, GLWin.fs);

    /* wait for events*/ 
    while (!done)
    {
        /* handle the events in the queue */
        while (XPending(GLWin.dpy) > 0)
        {
            XNextEvent(GLWin.dpy, &event);
            switch (event.type)
            {
                case Expose:
	                if (event.xexpose.count != 0)
	                    break;
                    drawGLScene();
         	        break;
	            case ConfigureNotify:
	            /* call resizeGLScene only if our window-size changed */
	                if ((event.xconfigure.width != GLWin.width) || 
	                    (event.xconfigure.height != GLWin.height))
	                {
	                    GLWin.width = event.xconfigure.width;
	                    GLWin.height = event.xconfigure.height;
                        printf("Resize event\n");
	                    resizeGLScene(event.xconfigure.width,
	                        event.xconfigure.height);
	                }
	                break;
                /* exit in case of a mouse button press */
                case ButtonPress:
                    done = True;
                    break;
                case KeyPress:
                    key = XLookupKeysym(&event.xkey, 0);
                    keyPressed(key);
                    break;
                case ClientMessage:
                    if (*XGetAtomName(GLWin.dpy, event.xclient.message_type) == 
                        *"WM_PROTOCOLS")
                    {
                        printf("Exiting sanely...\n");
                        done = True;
                    }
                    break;
                default:
                    break;
            }
        }
        drawGLScene();
    }
    killGLWindow();
    return 0;
}
Example #10
0
static void HandleMessage( PRENDERER gl_camera, GLWindow *x11_gl_window, XEvent *event)
{
    switch( event->type )
    {
    case ButtonPress:
        {
            // event->xbutton.state - prior state before this event
            // event->xbutton.button = which button is changed.
            switch( event->xbutton.button )
            {
            case Button1:
                x11_gl_window->mouse_b |= MK_LBUTTON;
                break;
            case Button2:
                x11_gl_window->mouse_b |= MK_RBUTTON;
                break;
            case Button3:
                x11_gl_window->mouse_b |= MK_MBUTTON;
                break;
            }
		  }
        //lprintf( "Mouse down... %d %d %d", x11_gl_window->mouse_x,x11_gl_window->mouse_y,x11_gl_window->mouse_b );
        InvokeMouseEvent( gl_camera, x11_gl_window );
        break;
    case ButtonRelease:
        {
            // event->xbutton.state - prior state before this event
            // event->xbutton.button = which button is changed.
            switch( event->xbutton.button )
            {
            case Button1:
                x11_gl_window->mouse_b &= ~MK_LBUTTON;
                break;
            case Button2:
                x11_gl_window->mouse_b &= ~MK_RBUTTON;
                break;
            case Button3:
                x11_gl_window->mouse_b &= ~MK_MBUTTON;
                break;
            }
        }
        //lprintf( "Mouse up... %d %d %d", x11_gl_window->mouse_x,x11_gl_window->mouse_y,x11_gl_window->mouse_b );
        InvokeMouseEvent( gl_camera, x11_gl_window );
        break;
	case MotionNotify:
		x11_gl_window->mouse_x = event->xmotion.x;
		x11_gl_window->mouse_y = event->xmotion.y;
		//lprintf( "Mouse move... %d %d %d", x11_gl_window->mouse_x,x11_gl_window->mouse_y,x11_gl_window->mouse_b );
		InvokeMouseEvent( gl_camera, x11_gl_window );
		break;
    case Expose:
        if (event->xexpose.count != 0)
            break;
		  //drawGLScene( camera, x11_gl_window );
		  break;
	case ConfigureNotify:
		/* call resizeGLScene only if our window-size changed */
		if ((event->xconfigure.width != x11_gl_window->width) ||
			 (event->xconfigure.height != x11_gl_window->height))
		{
			x11_gl_window->width = event->xconfigure.width;
			x11_gl_window->height = event->xconfigure.height;
			resizeGLScene(event->xconfigure.width,
							  event->xconfigure.height);
		}
		break;
		/* exit in case of a mouse button press */
	case KeyPress:
		{
			int used = FALSE;
			//char buffer[32];
			//KeySym keysym;
			//XLookupString( &event->xkey, buffer, 32, &keysym, NULL );
			// this is for keymap support; flags are diferent from the common
			// flags that existed... so this setup has to be done first for non-windows....
         // and needs to be improved
			SACK_Vidlib_ProcessKeyState( TRUE, event->xkey.keycode, &used );
         if( !used )
				used = DispatchKeyEvent( gl_camera, KEY_PRESSED|event->xkey.keycode );
		}
		break;
	case KeyRelease:
		{
			int used = FALSE;
			// this is for keymap support; flags are diferent from the common
			// flags that existed... so this setup has to be done first for non-windows....
         // and needs to be improved
			SACK_Vidlib_ProcessKeyState( FALSE, event->xkey.keycode, &used );
         if( !used )
				used = DispatchKeyEvent( gl_camera, event->xkey.keycode );
    		}
		break;
	case ClientMessage:
		{
			if( event->xclient.message_type == x11_gl_window->atom_create )
			{
			}

			char *msg = XGetAtomName( event->xany.display
											, event->xclient.message_type );
			if( !msg )
			{
				lprintf( "Received an any message with bad atom." );
				break;
			}
			XFree( msg );
		}
		if (*XGetAtomName(x11_gl_window->dpy, event->xclient.message_type) ==
			 *"WM_PROTOCOLS")
		{
			BAG_Exit( 0 );
		}
		break;
	default:
		break;
	}
}
int main()
{
        // Create the main window
        sf::Window myWindow(sf::VideoMode(800, 600, 32), "SFML/NeHe OpenGL");

        initGL();
        resizeGLScene(800, 600);

        // Start game loop
        while (myWindow.isOpen())
        {
                // Process events
                sf::Event event;
                while (myWindow.pollEvent(event))
                {
                        // Close window : exit

                        switch (event.type) {
                                case sf::Event::Closed:
                                        myWindow.close();
                                        break;

                                // Resize event : adjust viewport
                                case sf::Event::Resized:
                                        resizeGLScene(event.size.width, event.size.height);
                                        break;

                                // Handle keyboard events
                                case sf::Event::KeyPressed:
                                        switch (event.key.code) {
                                                case sf::Keyboard::Escape:
                                                        myWindow.close();
                                                        break;

                                                case sf::Keyboard::F1:
                                                        fullscreen = !fullscreen;
                                                        myWindow.create(fullscreen ? sf::VideoMode::getDesktopMode() : sf::VideoMode(800, 600, 32),
                                                                        "SFML/NeHe OpenGL",
                                                                        (fullscreen ? sf::Style::Fullscreen : sf::Style::Resize | sf::Style::Close));

                                                        {
                                                                sf::Vector2u size = myWindow.getSize();
                                                                resizeGLScene(size.x,size.y);
                                                        }
                                                        break;

                                                case sf::Keyboard::F5:
                                                        vsync = !vsync;
                                                        break;
                                        }
                                        break;
                        }
                }

                // Turn VSYNC on so that animations run at a more reasonable speed on new CPU's/GPU's.
                myWindow.setVerticalSyncEnabled(vsync);

                // Set the active window before using OpenGL commands
                // It's useless here because active window is always the same,
                // but don't forget it if you use multiple windows or controls
                myWindow.setActive();

                //Draw some pretty stuff
                drawGLScene();

                // Finally, display rendered frame on screen
                myWindow.display();
        }

        return EXIT_SUCCESS;
}
	LRESULT CALLBACK ApplicationWindow_WGL::WndProc( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam )
	{
		//	std::cout << "WndProc_MESSAGE" << std::endl;

		if(!_inputListenersToRemove.empty())
		{
			// remove InputListeners before doing anything else
			updateInputListeners();
		}

		switch (Msg) 
		{
		case WM_ACTIVATE:							
			{
				if (!HIWORD(wParam))					// Check Minimization State
				{
					_active = TRUE;						// Program Is Active
				}
				else
				{
					_active = FALSE;					// Program Is No Longer Active
				}
				break;
			}
		case WM_SIZE:
			{
				resizeGLScene(LOWORD(lParam),HIWORD(lParam));  // LoWord=Width, HiWord=Height
				break;
			}
		case WM_CLOSE:
			{
				PostQuitMessage(0);
				break;
			}
			//case WM_QUIT:
			//{
			//	_closePending = true;
			//	break;
			//} 
		case WM_LBUTTONDOWN:
			{				
				callInputListenersMouseDown( MB_Left, Vector2(
					static_cast<float>(GET_X_LPARAM(lParam)), 
					static_cast<float>(GET_Y_LPARAM(lParam)) ) );
				break;
			}
		case WM_LBUTTONUP:
			{				
				callInputListenersMouseUp( MB_Left, Vector2(
					static_cast<float>(GET_X_LPARAM(lParam)), 
					static_cast<float>(GET_Y_LPARAM(lParam)) ) );
				break;
			}
		case WM_MBUTTONDOWN:
			{				
				callInputListenersMouseDown( MB_Middle, Vector2(
					static_cast<float>(GET_X_LPARAM(lParam)), 
					static_cast<float>(GET_Y_LPARAM(lParam)) ) );
				break;
			}
		case WM_MBUTTONUP:
			{				
				callInputListenersMouseUp( MB_Middle, Vector2(
					static_cast<float>(GET_X_LPARAM(lParam)), 
					static_cast<float>(GET_Y_LPARAM(lParam)) ) );
				break;
			}
		case WM_RBUTTONDOWN:
			{				
				callInputListenersMouseDown( MB_Right, Vector2(
					static_cast<float>(GET_X_LPARAM(lParam)), 
					static_cast<float>(GET_Y_LPARAM(lParam)) ) );
				break;
			}
		case WM_RBUTTONUP:
			{				
				callInputListenersMouseUp( MB_Right, Vector2(
					static_cast<float>(GET_X_LPARAM(lParam)), 
					static_cast<float>(GET_Y_LPARAM(lParam)) ) );
				break;
			}
		case WM_MOUSEMOVE:
			{				
				callInputListenersMouseMoved( Vector2(
					static_cast<float>(GET_X_LPARAM(lParam)), 
					static_cast<float>(GET_Y_LPARAM(lParam)) ) );
				break;
			}

#pragma region Keyboard events
		case WM_KEYDOWN:
			{
				switch(wParam)
				{
				case VK_BACK:		callInputListenersKeyDown(KEY_Back); break;
				case VK_TAB:		callInputListenersKeyDown(KEY_Tab); break;
				case VK_CLEAR:		callInputListenersKeyDown(KEY_Clear); break;
				case VK_RETURN:		callInputListenersKeyDown(KEY_Return); break;
				case VK_SHIFT:		callInputListenersKeyDown(KEY_Shift); break;
				case VK_CONTROL:	callInputListenersKeyDown(KEY_Control); break;
				case VK_MENU:		callInputListenersKeyDown(KEY_Menu); break;
				case VK_PAUSE:		callInputListenersKeyDown(KEY_Pause); break;
				case VK_CAPITAL:	callInputListenersKeyDown(KEY_Capital); break;
				case VK_KANA:		callInputListenersKeyDown(KEY_Kana); break;
				case VK_JUNJA:		callInputListenersKeyDown(KEY_Junja); break;
				case VK_FINAL:		callInputListenersKeyDown(KEY_Final); break;
				case VK_HANJA:		callInputListenersKeyDown(KEY_Hanja); break;
				case VK_ESCAPE:		callInputListenersKeyDown(KEY_Escape); break;
				case VK_CONVERT:	callInputListenersKeyDown(KEY_Convert); break;
				case VK_NONCONVERT:	callInputListenersKeyDown(KEY_Nonconvert); break;
				case VK_ACCEPT:		callInputListenersKeyDown(KEY_Accept); break;
				case VK_MODECHANGE:	callInputListenersKeyDown(KEY_Modechange); break;
				case VK_SPACE:		callInputListenersKeyDown(KEY_Space); break;
				case VK_PRIOR:		callInputListenersKeyDown(KEY_Prior); break;
				case VK_NEXT:		callInputListenersKeyDown(KEY_Next); break;
				case VK_END:		callInputListenersKeyDown(KEY_End); break;
				case VK_HOME:		callInputListenersKeyDown(KEY_Home); break;
				case VK_LEFT:		callInputListenersKeyDown(KEY_Left); break;
				case VK_UP:			callInputListenersKeyDown(KEY_Up); break;
				case VK_RIGHT:		callInputListenersKeyDown(KEY_Right); break;
				case VK_DOWN:		callInputListenersKeyDown(KEY_Down); break;
				case VK_SELECT:		callInputListenersKeyDown(KEY_Select); break;
				case VK_PRINT:		callInputListenersKeyDown(KEY_Print); break;
				case VK_EXECUTE:	callInputListenersKeyDown(KEY_Execute); break;
				case VK_SNAPSHOT:	callInputListenersKeyDown(KEY_Snapshot); break;
				case VK_INSERT:		callInputListenersKeyDown(KEY_Insert); break;
				case VK_DELETE:		callInputListenersKeyDown(KEY_Delete); break;
				case VK_HELP:		callInputListenersKeyDown(KEY_Help); break;
				case VK_LWIN:		callInputListenersKeyDown(KEY_Lwin); break;
				case VK_RWIN:		callInputListenersKeyDown(KEY_Rwin); break;
				case VK_APPS:		callInputListenersKeyDown(KEY_Apps); break;
				case VK_SLEEP:		callInputListenersKeyDown(KEY_Sleep); break;
				case VK_NUMPAD0:	callInputListenersKeyDown(KEY_Numpad0); break;
				case VK_NUMPAD1:	callInputListenersKeyDown(KEY_Numpad1); break;
				case VK_NUMPAD2:	callInputListenersKeyDown(KEY_Numpad2); break;
				case VK_NUMPAD3:	callInputListenersKeyDown(KEY_Numpad3); break;
				case VK_NUMPAD4:	callInputListenersKeyDown(KEY_Numpad4); break;
				case VK_NUMPAD5:	callInputListenersKeyDown(KEY_Numpad5); break;
				case VK_NUMPAD6:	callInputListenersKeyDown(KEY_Numpad6); break;
				case VK_NUMPAD7:	callInputListenersKeyDown(KEY_Numpad7); break;
				case VK_NUMPAD8:	callInputListenersKeyDown(KEY_Numpad8); break;
				case VK_NUMPAD9:	callInputListenersKeyDown(KEY_Numpad9); break;
				case VK_MULTIPLY:	callInputListenersKeyDown(KEY_Multiply); break;
				case VK_ADD:		callInputListenersKeyDown(KEY_Add); break;
				case VK_SEPARATOR:	callInputListenersKeyDown(KEY_Separator); break;
				case VK_SUBTRACT:	callInputListenersKeyDown(KEY_Subtract); break;
				case VK_DECIMAL:	callInputListenersKeyDown(KEY_Decimal); break;
				case VK_DIVIDE:		callInputListenersKeyDown(KEY_Divide); break;
				case VK_F1:			callInputListenersKeyDown(KEY_F1); break;
				case VK_F2:			callInputListenersKeyDown(KEY_F2); break;
				case VK_F3:			callInputListenersKeyDown(KEY_F3); break;
				case VK_F4:			callInputListenersKeyDown(KEY_F4); break;
				case VK_F5:			callInputListenersKeyDown(KEY_F5); break;
				case VK_F6:			callInputListenersKeyDown(KEY_F6); break;
				case VK_F7:			callInputListenersKeyDown(KEY_F7); break;
				case VK_F8:			callInputListenersKeyDown(KEY_F8); break;
				case VK_F9:			callInputListenersKeyDown(KEY_F9); break;
				case VK_F10:		callInputListenersKeyDown(KEY_F10); break;
				case VK_F11:		callInputListenersKeyDown(KEY_F11); break;
				case VK_F12:		callInputListenersKeyDown(KEY_F12); break;
				case VK_F13:		callInputListenersKeyDown(KEY_F13); break;
				case VK_F14:		callInputListenersKeyDown(KEY_F14); break;
				case VK_F15:		callInputListenersKeyDown(KEY_F15); break;
				case VK_F16:		callInputListenersKeyDown(KEY_F16); break;
				case VK_F17:		callInputListenersKeyDown(KEY_F17); break;
				case VK_F18:		callInputListenersKeyDown(KEY_F18); break;
				case VK_F19:		callInputListenersKeyDown(KEY_F19); break;
				case VK_F20:		callInputListenersKeyDown(KEY_F20); break;
				case VK_F21:		callInputListenersKeyDown(KEY_F21); break;
				case VK_F22:		callInputListenersKeyDown(KEY_F22); break;
				case VK_F23:		callInputListenersKeyDown(KEY_F23); break;
				case VK_F24:		callInputListenersKeyDown(KEY_F24); break;
				case VK_NUMLOCK:	callInputListenersKeyDown(KEY_Numlock); break;
				case VK_SCROLL:		callInputListenersKeyDown(KEY_Scrolllock); break;
				case VK_OEM_PLUS:	callInputListenersKeyDown(KEY_OEM_Plus); break;
				case VK_OEM_COMMA:	callInputListenersKeyDown(KEY_OEM_Comma); break;
				case VK_OEM_MINUS:	callInputListenersKeyDown(KEY_OEM_Minus); break;
				case VK_OEM_PERIOD:	callInputListenersKeyDown(KEY_OEM_Period); break;
				case 'Q':			callInputListenersKeyDown(KEY_Q); break;
				case 'W':			callInputListenersKeyDown(KEY_W); break;
				case 'E':			callInputListenersKeyDown(KEY_E); break;
				case 'R':			callInputListenersKeyDown(KEY_R); break;
				case 'T':			callInputListenersKeyDown(KEY_T); break;
				case 'Y':			callInputListenersKeyDown(KEY_Y); break;
				case 'U':			callInputListenersKeyDown(KEY_U); break;
				case 'I':			callInputListenersKeyDown(KEY_I); break;
				case 'O':			callInputListenersKeyDown(KEY_O); break;
				case 'P':			callInputListenersKeyDown(KEY_P); break;
				case 'A':			callInputListenersKeyDown(KEY_A); break;
				case 'S':			callInputListenersKeyDown(KEY_S); break;
				case 'D':			callInputListenersKeyDown(KEY_D); break;
				case 'F':			callInputListenersKeyDown(KEY_F); break;
				case 'G':			callInputListenersKeyDown(KEY_G); break;
				case 'H':			callInputListenersKeyDown(KEY_H); break;
				case 'J':			callInputListenersKeyDown(KEY_J); break;
				case 'K':			callInputListenersKeyDown(KEY_K); break;
				case 'L':			callInputListenersKeyDown(KEY_L); break;
				case 'Z':			callInputListenersKeyDown(KEY_Z); break;
				case 'X':			callInputListenersKeyDown(KEY_X); break;
				case 'C':			callInputListenersKeyDown(KEY_C); break;
				case 'V':			callInputListenersKeyDown(KEY_V); break;
				case 'B':			callInputListenersKeyDown(KEY_B); break;
				case 'N':			callInputListenersKeyDown(KEY_N); break;
				case 'M':			callInputListenersKeyDown(KEY_M); break;
				default:
					break;
				}
				break;
			}
		case WM_KEYUP:
			{
				switch(wParam)
				{
				case VK_BACK:		callInputListenersKeyUp(KEY_Back); break;
				case VK_TAB:		callInputListenersKeyUp(KEY_Tab); break;
				case VK_CLEAR:		callInputListenersKeyUp(KEY_Clear); break;
				case VK_RETURN:		callInputListenersKeyUp(KEY_Return); break;
				case VK_SHIFT:		callInputListenersKeyUp(KEY_Shift); break;
				case VK_CONTROL:	callInputListenersKeyUp(KEY_Control); break;
				case VK_MENU:		callInputListenersKeyUp(KEY_Menu); break;
				case VK_PAUSE:		callInputListenersKeyUp(KEY_Pause); break;
				case VK_CAPITAL:	callInputListenersKeyUp(KEY_Capital); break;
				case VK_KANA:		callInputListenersKeyUp(KEY_Kana); break;
				case VK_JUNJA:		callInputListenersKeyUp(KEY_Junja); break;
				case VK_FINAL:		callInputListenersKeyUp(KEY_Final); break;
				case VK_HANJA:		callInputListenersKeyUp(KEY_Hanja); break;
				case VK_ESCAPE:		callInputListenersKeyUp(KEY_Escape); break;
				case VK_CONVERT:	callInputListenersKeyUp(KEY_Convert); break;
				case VK_NONCONVERT:	callInputListenersKeyUp(KEY_Nonconvert); break;
				case VK_ACCEPT:		callInputListenersKeyUp(KEY_Accept); break;
				case VK_MODECHANGE:	callInputListenersKeyUp(KEY_Modechange); break;
				case VK_SPACE:		callInputListenersKeyUp(KEY_Space); break;
				case VK_PRIOR:		callInputListenersKeyUp(KEY_Prior); break;
				case VK_NEXT:		callInputListenersKeyUp(KEY_Next); break;
				case VK_END:		callInputListenersKeyUp(KEY_End); break;
				case VK_HOME:		callInputListenersKeyUp(KEY_Home); break;
				case VK_LEFT:		callInputListenersKeyUp(KEY_Left); break;
				case VK_UP:			callInputListenersKeyUp(KEY_Up); break;
				case VK_RIGHT:		callInputListenersKeyUp(KEY_Right); break;
				case VK_DOWN:		callInputListenersKeyUp(KEY_Down); break;
				case VK_SELECT:		callInputListenersKeyUp(KEY_Select); break;
				case VK_PRINT:		callInputListenersKeyUp(KEY_Print); break;
				case VK_EXECUTE:	callInputListenersKeyUp(KEY_Execute); break;
				case VK_SNAPSHOT:	callInputListenersKeyUp(KEY_Snapshot); break;
				case VK_INSERT:		callInputListenersKeyUp(KEY_Insert); break;
				case VK_DELETE:		callInputListenersKeyUp(KEY_Delete); break;
				case VK_HELP:		callInputListenersKeyUp(KEY_Help); break;
				case VK_LWIN:		callInputListenersKeyUp(KEY_Lwin); break;
				case VK_RWIN:		callInputListenersKeyUp(KEY_Rwin); break;
				case VK_APPS:		callInputListenersKeyUp(KEY_Apps); break;
				case VK_SLEEP:		callInputListenersKeyUp(KEY_Sleep); break;
				case VK_NUMPAD0:	callInputListenersKeyUp(KEY_Numpad0); break;
				case VK_NUMPAD1:	callInputListenersKeyUp(KEY_Numpad1); break;
				case VK_NUMPAD2:	callInputListenersKeyUp(KEY_Numpad2); break;
				case VK_NUMPAD3:	callInputListenersKeyUp(KEY_Numpad3); break;
				case VK_NUMPAD4:	callInputListenersKeyUp(KEY_Numpad4); break;
				case VK_NUMPAD5:	callInputListenersKeyUp(KEY_Numpad5); break;
				case VK_NUMPAD6:	callInputListenersKeyUp(KEY_Numpad6); break;
				case VK_NUMPAD7:	callInputListenersKeyUp(KEY_Numpad7); break;
				case VK_NUMPAD8:	callInputListenersKeyUp(KEY_Numpad8); break;
				case VK_NUMPAD9:	callInputListenersKeyUp(KEY_Numpad9); break;
				case VK_MULTIPLY:	callInputListenersKeyUp(KEY_Multiply); break;
				case VK_ADD:		callInputListenersKeyUp(KEY_Add); break;
				case VK_SEPARATOR:	callInputListenersKeyUp(KEY_Separator); break;
				case VK_SUBTRACT:	callInputListenersKeyUp(KEY_Subtract); break;
				case VK_DECIMAL:	callInputListenersKeyUp(KEY_Decimal); break;
				case VK_DIVIDE:		callInputListenersKeyUp(KEY_Divide); break;
				case VK_F1:			callInputListenersKeyUp(KEY_F1); break;
				case VK_F2:			callInputListenersKeyUp(KEY_F2); break;
				case VK_F3:			callInputListenersKeyUp(KEY_F3); break;
				case VK_F4:			callInputListenersKeyUp(KEY_F4); break;
				case VK_F5:			callInputListenersKeyUp(KEY_F5); break;
				case VK_F6:			callInputListenersKeyUp(KEY_F6); break;
				case VK_F7:			callInputListenersKeyUp(KEY_F7); break;
				case VK_F8:			callInputListenersKeyUp(KEY_F8); break;
				case VK_F9:			callInputListenersKeyUp(KEY_F9); break;
				case VK_F10:		callInputListenersKeyUp(KEY_F10); break;
				case VK_F11:		callInputListenersKeyUp(KEY_F11); break;
				case VK_F12:		callInputListenersKeyUp(KEY_F12); break;
				case VK_F13:		callInputListenersKeyUp(KEY_F13); break;
				case VK_F14:		callInputListenersKeyUp(KEY_F14); break;
				case VK_F15:		callInputListenersKeyUp(KEY_F15); break;
				case VK_F16:		callInputListenersKeyUp(KEY_F16); break;
				case VK_F17:		callInputListenersKeyUp(KEY_F17); break;
				case VK_F18:		callInputListenersKeyUp(KEY_F18); break;
				case VK_F19:		callInputListenersKeyUp(KEY_F19); break;
				case VK_F20:		callInputListenersKeyUp(KEY_F20); break;
				case VK_F21:		callInputListenersKeyUp(KEY_F21); break;
				case VK_F22:		callInputListenersKeyUp(KEY_F22); break;
				case VK_F23:		callInputListenersKeyUp(KEY_F23); break;
				case VK_F24:		callInputListenersKeyUp(KEY_F24); break;
				case VK_NUMLOCK:	callInputListenersKeyUp(KEY_Numlock); break;
				case VK_SCROLL:		callInputListenersKeyUp(KEY_Scrolllock); break;
				case VK_OEM_PLUS:	callInputListenersKeyUp(KEY_OEM_Plus); break;
				case VK_OEM_COMMA:	callInputListenersKeyUp(KEY_OEM_Comma); break;
				case VK_OEM_MINUS:	callInputListenersKeyUp(KEY_OEM_Minus); break;
				case VK_OEM_PERIOD:	callInputListenersKeyUp(KEY_OEM_Period); break;
				case 'Q':			callInputListenersKeyUp(KEY_Q); break;
				case 'W':			callInputListenersKeyUp(KEY_W); break;
				case 'E':			callInputListenersKeyUp(KEY_E); break;
				case 'R':			callInputListenersKeyUp(KEY_R); break;
				case 'T':			callInputListenersKeyUp(KEY_T); break;
				case 'Y':			callInputListenersKeyUp(KEY_Y); break;
				case 'U':			callInputListenersKeyUp(KEY_U); break;
				case 'I':			callInputListenersKeyUp(KEY_I); break;
				case 'O':			callInputListenersKeyUp(KEY_O); break;
				case 'P':			callInputListenersKeyUp(KEY_P); break;
				case 'A':			callInputListenersKeyUp(KEY_A); break;
				case 'S':			callInputListenersKeyUp(KEY_S); break;
				case 'D':			callInputListenersKeyUp(KEY_D); break;
				case 'F':			callInputListenersKeyUp(KEY_F); break;
				case 'G':			callInputListenersKeyUp(KEY_G); break;
				case 'H':			callInputListenersKeyUp(KEY_H); break;
				case 'J':			callInputListenersKeyUp(KEY_J); break;
				case 'K':			callInputListenersKeyUp(KEY_K); break;
				case 'L':			callInputListenersKeyUp(KEY_L); break;
				case 'Z':			callInputListenersKeyUp(KEY_Z); break;
				case 'X':			callInputListenersKeyUp(KEY_X); break;
				case 'C':			callInputListenersKeyUp(KEY_C); break;
				case 'V':			callInputListenersKeyUp(KEY_V); break;
				case 'B':			callInputListenersKeyUp(KEY_B); break;
				case 'N':			callInputListenersKeyUp(KEY_N); break;
				case 'M':			callInputListenersKeyUp(KEY_M); break;
				default:
					break;
				}
				break;
			}
#pragma endregion

		default:
			// We do not want to handle this message so pass back to Windows
			// to handle it in a default way
			return DefWindowProc(hWnd, Msg, wParam, lParam);
		}

		return 0;
	}
	bool ApplicationWindow_WGL::createWindow( std::string title, Vector2 position, Vector2 size, bool fullscreen, const ParameterMap *parameters)
	{
		_renderer = Renderer::getSingletonPtr();

		HWND		parentWnd = nullptr;
		int			bpp = 32;
		int			PixelFormat;			// Holds The Results After Searching For A Match
		WNDCLASS	wc;						// Windows Class Structure
		DWORD		dwExStyle;				// Window Extended Style
		DWORD		dwStyle;				// Window Style

		dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
		dwStyle = WS_OVERLAPPEDWINDOW;

		if(parameters != nullptr)
		{
			ParameterMap::const_iterator it;
			ParameterMap::const_iterator itEnd = parameters->end();
			if ( (it = parameters->find("parent_window")) != itEnd )
			{
				parentWnd = (HWND) atoi(it->second.c_str());
				dwStyle = WS_CHILD;
			}
		}

		Vector2 sceneSize = _renderer->_sceneViewMax - _renderer->_sceneViewMin;
		_aspectRatio = sceneSize.x / sceneSize.y;

		_fullscreen = fullscreen;			

		_hInstance			= GetModuleHandle(NULL);				// Grab An Instance For Our Window

		wc.style			= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;	// Redraw On Size, And Own DC For Window.
		wc.lpfnWndProc		= &ApplicationWindow_WGL::initialWndProc;// WndProc Handles Messages
		wc.cbClsExtra		= 0;									// No Extra Window Data
		wc.cbWndExtra		= 0;									// No Extra Window Data
		wc.hInstance		= _hInstance;							// Set The Instance
		wc.hIcon			= LoadIcon(NULL, IDI_WINLOGO);			// Load The Default Icon
		wc.hCursor			= LoadCursor(NULL, IDC_ARROW);			// Load The Arrow Pointer
		wc.hbrBackground	= NULL;									// No Background Required For GL
		wc.lpszMenuName		= NULL;									// We Don't Want A Menu
		wc.lpszClassName	= SKETCHYDYNAMICS_WINDOW_CLASS_NAME;			// Set The Class Name

		if (!RegisterClass(&wc))									// Attempt To Register The Window Class
		{
			Logger::getSingletonPtr()->writeError("{ApplicationWindow_WGL}Failed To Register The Window Class");
			return FALSE;											// Return FALSE
		}

		if (fullscreen)												// Attempt Fullscreen Mode?
		{
			DEVMODE dmScreenSettings;								// Device Mode
			memset(&dmScreenSettings,0,sizeof(dmScreenSettings));	// Makes Sure Memory's Cleared
			dmScreenSettings.dmSize=sizeof(dmScreenSettings);		// Size Of The Devmode Structure
			dmScreenSettings.dmPelsWidth	= (long)size.x;			// Selected Screen Width
			dmScreenSettings.dmPelsHeight	= (long)size.y;			// Selected Screen Height
			dmScreenSettings.dmBitsPerPel	= bpp;					// Selected Bits Per Pixel
			dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

			// Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
			if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
			{
				// If The Mode Fails, Use Windowed Mode.			
				fullscreen=FALSE;
				Logger::getSingletonPtr()->writeWarning("Fullscreen mode not supported");			
			}
		}

		if (fullscreen)												// Are We Still In Fullscreen Mode?
		{
			dwExStyle=WS_EX_APPWINDOW;								// Window Extended Style
			dwStyle=WS_POPUP;										// Windows Style
			//ShowCursor(FALSE);										// Hide Mouse Pointer
		}		

		RECT		WindowRect;				
		WindowRect.left	= (long)position.x;
		WindowRect.right = (long)(position.x + size.x);
		WindowRect.top = (long)position.y;
		WindowRect.bottom = (long)(position.y + size.y);

		AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);		// Adjust Window To True Requested Size

		// Create The Window
		if (!(_hWnd=CreateWindowEx(	dwExStyle,							// Extended Style For The Window
			SKETCHYDYNAMICS_WINDOW_CLASS_NAME,		// Class Name
			title.c_str(),						// Window Title
			dwStyle |							// Defined Window Style
			WS_CLIPSIBLINGS |					// Required Window Style
			WS_CLIPCHILDREN,					// Required Window Style
			(int)position.x, (int)position.y,	// Window Position
			WindowRect.right-WindowRect.left,	// Calculate Window Width
			WindowRect.bottom-WindowRect.top,	// Calculate Window Height
			parentWnd,							// Parent Window
			NULL,								// No Menu
			_hInstance,							// Instance
			this)))								// Pass To WM_CREATE
		{
			destroyWindow();								// Reset The Display
			Logger::getSingletonPtr()->writeError("{ApplicationWindow_WGL}Window Creation Error");
			return FALSE;								// Return FALSE
		}

		static	PIXELFORMATDESCRIPTOR pfd=				// pfd Tells Windows How We Want Things To Be
		{
			sizeof(PIXELFORMATDESCRIPTOR),				// Size Of This Pixel Format Descriptor
			1,											// Version Number
			PFD_DRAW_TO_WINDOW |						// Format Must Support Window
			PFD_SUPPORT_OPENGL |						// Format Must Support OpenGL
			PFD_DOUBLEBUFFER,							// Must Support Double Buffering
			PFD_TYPE_RGBA,								// Request An RGBA Format
			bpp,										// Select Our Color Depth
			0, 0, 0, 0, 0, 0,							// Color Bits Ignored
			0,											// No Alpha Buffer
			0,											// Shift Bit Ignored
			0,											// No Accumulation Buffer
			0, 0, 0, 0,									// Accumulation Bits Ignored
			16,											// 16Bit Z-Buffer (Depth Buffer)  
			0,											// No Stencil Buffer
			0,											// No Auxiliary Buffer
			PFD_MAIN_PLANE,								// Main Drawing Layer
			0,											// Reserved
			0, 0, 0										// Layer Masks Ignored
		};

		if (!(_hDC=GetDC(_hWnd)))							// Did We Get A Device Context?
		{
			destroyWindow();								// Reset The Display
			Logger::getSingletonPtr()->writeError("{ApplicationWindow_WGL}Can't Create A GL Device Context");
			return FALSE;								// Return FALSE
		}

		if (!(PixelFormat=ChoosePixelFormat(_hDC,&pfd)))	// Did Windows Find A Matching Pixel Format?
		{
			destroyWindow();								// Reset The Display
			Logger::getSingletonPtr()->writeError("{ApplicationWindow_WGL}Can't Find A Suitable PixelFormat");
			return FALSE;								// Return FALSE
		}

		if(!SetPixelFormat(_hDC,PixelFormat,&pfd))		// Are We Able To Set The Pixel Format?
		{
			destroyWindow();								// Reset The Display
			Logger::getSingletonPtr()->writeError("{ApplicationWindow_WGL}Can't Set The PixelFormat");
			return FALSE;								// Return FALSE
		}

		if (!(_hRC=wglCreateContext(_hDC)))				// Are We Able To Get A Rendering Context?
		{
			destroyWindow();								// Reset The Display
			Logger::getSingletonPtr()->writeError("{ApplicationWindow_WGL}Can't Create A GL Rendering Context");
			return FALSE;								// Return FALSE
		}

		if(!wglMakeCurrent(_hDC,_hRC))					// Try To Activate The Rendering Context
		{
			destroyWindow();								// Reset The Display
			Logger::getSingletonPtr()->writeError("{ApplicationWindow_WGL}Can't Activate The GL Rendering Context");
			return FALSE;								// Return FALSE
		}
				
		ShowWindow(_hWnd, SW_SHOW);						// Show The Window
		SetForegroundWindow(_hWnd);						// Slightly Higher Priority
		SetFocus(_hWnd);								// Sets Keyboard Focus To The Window
		resizeGLScene((int)size.x, (int)size.y);					// Set Up Our Perspective GL Screen

		if(!_renderer->initGL())
		{
			SKETCHYDYNAMICS_LOG_ERROR("OpenGL init failed");
			destroyWindow();
			return FALSE;
		}

		setVSync(false);

		return TRUE;									// Success
	}