I'm trying to create an openGL window in my engine and the following code runs.........just not good.....so I was wondering if there's anything wrong with this code:
// create OpenGLWindow;
bool IOpenGLRenderWindow::createWindow(std::string wiName,
std::string title,
unsigned int width,
unsigned int height,
bool fullscreen,
bool VSync,
bool Stencil,
unsigned int bits,
unsigned int numSamples)
{
// set values from class to values in-coming
m_windowWidth = width; // set the width;
m_windowHeight = height; // set height;
m_windowName = wiName; // the window's name;
m_windowTitle = title; // the title of the window.
m_fullScreen = fullscreen; // full screen
m_VSync = VSync; // V-Sync.
m_Stencil = Stencil; // stencil
m_bits = bits; // bits
m_numSamples = numSamples; // the sample quality;
WNDCLASSEX winClass;
ZeroMemory(&winClass,sizeof(winClass));
winClass.cbSize = sizeof(WNDCLASSEX);
winClass.style = CS_HREDRAW | CS_VREDRAW;
winClass.lpfnWndProc = IWindowUtility::getSingleton()->WinProc;
winClass.hInstance = GetModuleHandle(NULL);
winClass.hCursor = LoadCursor(NULL,IDC_ARROW);
winClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
winClass.lpszClassName = this->m_windowName.c_str();
if(!RegisterClassEx(&winClass))
{
IDebuggingUtility::operatingSystemBug("OpenGLRenderWindow::CreateWindow");
}
// styles needed.
DWORD dwStyle; // regular style
DWORD dwExStyle; // extra style.
// set the window rect.
RECT winRect;
winRect.left = 0; // left region
winRect.top = 0; // top
winRect.right = m_windowWidth;// right
winRect.bottom = m_windowHeight; // bottom.
// check if full screen.
if(m_fullScreen)
{
DEVMODE devMode;
ZeroMemory(&devMode, sizeof(DEVMODE));
devMode.dmSize = sizeof(DEVMODE);
devMode.dmBitsPerPel = m_bits;
devMode.dmPanningWidth = m_windowWidth;
devMode.dmPanningHeight = m_windowHeight;
devMode.dmFields = DM_BITSPERPEL | DM_PANNINGWIDTH | DM_PANNINGHEIGHT;
// check if full screen.
if(ChangeDisplaySettings(&devMode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
{
m_fullScreen = false;
IDebuggingUtility::operatingSystemBug("ChangeDisplayMode");
}
dwStyle = WS_POPUP;
dwExStyle = WS_EX_APPWINDOW;
ShowCursor(false);
}
else
{
dwStyle = WS_OVERLAPPEDWINDOW;
dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
ShowCursor(true);
}
AdjustWindowRectEx(&winRect, dwStyle,NULL,dwExStyle);
// create the window
m_windowHandle = CreateWindowEx(dwExStyle,
this->m_windowName.c_str(),
this->m_windowTitle.c_str(),
dwStyle,
0,
0,
winRect.right - winRect.left,
winRect.bottom - winRect.top,
NULL,
NULL,
GetModuleHandle(NULL),
NULL);
if(m_windowHandle)
{
ShowWindow(m_windowHandle,SW_SHOW);
UpdateWindow(m_windowHandle);
}
else
{
IDebuggingUtility::operatingSystemBug("CreateWindowEx");
}
// get Device context
this->m_deviceContext = GetDC(m_windowHandle);
// check if device gotten
if(m_deviceContext == NULL)
{
IDebuggingUtility::operatingSystemBug("GetDC");
const char* error = (char*)gluErrorString(glGetError());
string err = "The device Context is NULL.";
err += error;
throw IException(ET_APIERROR,err,"GetDC");
}
// set pixel information
ZeroMemory(&this->m_pPixelDesc,sizeof(m_pPixelDesc));
m_pPixelDesc.nSize = sizeof(m_pPixelDesc);
m_pPixelDesc.nVersion = 1;
m_pPixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL| PFD_DOUBLEBUFFER;
m_pPixelDesc.iPixelType = PFD_TYPE_RGBA;
m_pPixelDesc.cColorBits = m_bits;
if(m_Stencil)
{
m_pPixelDesc.cStencilBits = 8;
m_pPixelDesc.cDepthBits = 24;
}
else
{
m_pPixelDesc.cStencilBits = 0;
m_pPixelDesc.cDepthBits = 24;
}
m_pPixelDesc.iLayerType = PFD_MAIN_PLANE;
int pixelFormat = 0;
pixelFormat = ChoosePixelFormat(m_deviceContext,&m_pPixelDesc);
if(!pixelFormat)
{
IDebuggingUtility::operatingSystemBug("ChoosePixelFormat");
const char* error = (char*)gluErrorString(glGetError());
string err = "Pixel format not working....... ";
err += error;
throw IException(ET_APIERROR, err,"ChoosePixelFormat");
}
// set the pixel format
if(!SetPixelFormat(m_deviceContext,pixelFormat,&m_pPixelDesc))
{
IDebuggingUtility::operatingSystemBug("SetPixelFormat");
const char* error = (char*)gluErrorString(glGetError());
string err = "Pixel Format cannot be set: ";
err += error;
string func = "SetPixelFormat";
throw IException(ET_APIERROR, err,func);
}
// create the device context
this->m_GLRC = ::wglCreateContext(m_deviceContext);
if(m_GLRC == NULL)
{
IDebuggingUtility::operatingSystemBug("wglCreateContext");
const char* error = (char*)gluErrorString(glGetError());
string err = "Context creation failed: ";
err += error;
string func = "wlgCreateContext";
throw IException(ET_APIERROR,err,func);
}
if(m_GLRC != GLEW_OK)
{
const char* error = (char*)gluErrorString(glGetError());
throw IException(ET_APIERROR, string(error),"Device Context");
}
// set the current device context
wglMakeCurrent(this->m_deviceContext, m_GLRC);
GLenum glew = glewInit();
if(glew != GLEW_OK)
{
const char* error = (char*)gluErrorString(glew);
string err = "glew not initialized ";
err += error;
throw IException(ET_APIERROR, err,"Cannot initalize glew");
}
int attributes[] =
{
WGL_CONTEXT_MINOR_VERSION_ARB, 4,
WGL_CONTEXT_MAJOR_VERSION_ARB, 1,
WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
0
};
if(wglewIsSupported("WGL_ARB_Create_Context") == 1)
{
this->m_GLRC = ::wglCreateContextAttribsARB(this->m_deviceContext, NULL, attributes);
wglMakeCurrent(NULL,NULL);
wglDeleteContext(m_GLRC);
wglMakeCurrent(m_deviceContext, m_GLRC);
}
else
{
const char* error = (char*)gluErrorString(glew);
string err = "WGL_ARG_Create_Context is flawed. ";
err += error;
throw IException(ET_APIERROR,err,"Error in WGL_ARG");
}
return IRenderWindow::createWindow(this->m_windowName,
m_windowTitle,
m_windowWidth,
m_windowHeight,
this->m_fullScreen,
this->m_VSync,
this->m_Stencil,
this->m_bits,
this->m_numSamples);
}
void IOpenGLRenderWindow::_setClearColor(BYTE alpha, BYTE red, BYTE green, BYTE blue)
{
if(m_deviceContext)
{
glClearColor(red,green,blue,alpha);
}
IRenderWindow::_setClearColor(alpha, red, green, blue);
}
void IOpenGLRenderWindow::_renderStart()
{
glClear(GL_COLOR_BUFFER_BIT);
}
void IOpenGLRenderWindow::_renderEnd()
{
bool isOK = SwapBuffers(m_deviceContext);
if(!isOK)
{
IDebuggingUtility::operatingSystemBug("IOpenGLRenderWindow::_renderEnd");
}
}
seems ok to me, maybe i didn't initialize the pixel format good?