ultimatepp/uppsrc/GLCtrl/Win32GlCtrl.cpp
mdelfede 3ce6f217f0 new uvs2 releases : uppsrc-2615 tutorial-38 examples-142 reference-115 -- testing updated debian dependencies
git-svn-id: svn://ultimatepp.org/upp/trunk@306 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2008-07-05 09:43:27 +00:00

112 lines
2.2 KiB
C++

#include "GLCtrl.h"
NAMESPACE_UPP
#ifdef PLATFORM_WIN32
#pragma comment( lib, "opengl32.lib" ) // Search For OpenGL32.lib While Linking
#pragma comment( lib, "glu32.lib" ) // Search For GLu32.lib While Linking
GLCtrl::GLCtrl()
{
hDC = NULL;
hRC = NULL;
}
GLCtrl::~GLCtrl()
{
CloseGL();
}
void GLCtrl::OpenGL()
{
HWND hwnd = GetHWND();
if(!hwnd)
return;
hDC = ::GetDC(hwnd);
if(!hDC)
return;
PIXELFORMATDESCRIPTOR pfd;
memset(&pfd, 0, sizeof(pfd));
pfd.nSize = sizeof(pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | 0x00008000;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 32;
pfd.iLayerType = PFD_MAIN_PLANE;
int pf = ChoosePixelFormat(hDC, &pfd);
if(!pf) {
CloseGL();
return;
}
if(!SetPixelFormat(hDC, pf, &pfd)) {
CloseGL();
return;
}
DescribePixelFormat(hDC, pf, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
hRC = wglCreateContext(hDC);
}
void GLCtrl::CloseGL()
{
if(hRC)
wglDeleteContext(hRC);
if(hDC)
ReleaseDC(GetHWND(), hDC);
}
void GLCtrl::State(int reason)
{
if(reason == CLOSE)
CloseGL();
DHCtrl::State(reason);
if(reason == OPEN)
OpenGL();
}
void GLCtrl::GLPaint()
{
WhenGLPaint();
}
void GLCtrl::StdView()
{
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
Size sz = GetSize();
glViewport(0, 0, (GLsizei)sz.cx, (GLsizei)sz.cy);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)(sz.cx)/(GLfloat)(sz.cy), 1.0f, 100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
LRESULT GLCtrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(message == WM_PAINT && hDC && hRC) {
wglMakeCurrent(hDC, hRC);
GLPaint();
glFlush();
glFinish();
SwapBuffers(hDC);
wglMakeCurrent(NULL, NULL);
PAINTSTRUCT ps;
BeginPaint(GetHWND(), &ps);
EndPaint(GetHWND(), &ps);
return 0;
}
if(message == WM_ERASEBKGND)
return 1;
return DHCtrl::WindowProc(message, wParam, lParam);
}
#endif
END_UPP_NAMESPACE