#include "stdafx.h"
#include "DialogOpenGL.h"
#include "OpenGL.h"
#include <gl/gl.h>
#include <gl/glu.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
COpenGL::COpenGL():m_bInit(FALSE),m_bFullScreen(FALSE),
m_hDC(NULL),m_hRC(NULL),m_parent(NULL)
{
}
COpenGL::~COpenGL()
{
¡¡KillGLWindow();
}
BEGIN_MESSAGE_MAP(COpenGL, CWnd)
¡¡//{{AFX_MSG_MAP(COpenGL)
¡¡¡¡ON_WM_CREATE()
¡¡¡¡ON_WM_PAINT()
¡¡¡¡ON_WM_SIZE()
¡¡¡¡ON_WM_KEYDOWN()
¡¡//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void COpenGL::Create(CRect rect, CWnd *parent)
{
¡¡if (m_bInit) return;
¡¡ASSERT(rect);
¡¡ASSERT(parent);
¡¡m_rect = rect;
¡¡m_parent = parent;
¡¡CString className = AfxRegisterWndClass(
¡¡¡¡CS_HREDRAW | CS_VREDRAW | CS_OWNDC,NULL,(HBRUSH)GetStockObject(BLACK_BRUSH),NULL);
¡¡¡¡CreateEx(0,className,"OpenGL",WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,rect,parent,0);
¡¡}
¡¡int COpenGL::OnCreate(LPCREATESTRUCT lpCreateStruct)
¡¡{
¡¡¡¡if (CWnd::OnCreate(lpCreateStruct) == -1)
¡¡¡¡¡¡return -1;
¡¡¡¡// TODO: Add your specialized creation code here
¡¡¡¡EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &m_DMsaved);
¡¡¡¡GLuint PixelFormat; // Holds The Results After Searching For A Match
¡¡¡¡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
¡¡¡¡¡¡m_DMsaved.dmBitsPerPel, // 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 ( !( m_hDC = ::GetDC ( m_hWnd ) ) ) { // Did We Get A Device Context?
¡¡¡¡¡¡KillGLWindow (); // Reset The Display
¡¡¡¡¡¡TRACE ( "Can't Create A GL Device Context." );
¡¡¡¡¡¡return FALSE;
¡¡¡¡}
¡¡¡¡if ( !( PixelFormat = ChoosePixelFormat ( m_hDC, &pfd ) ) ) { // Did Windows Find A Matching Pixel Format?
¡¡¡¡¡¡KillGLWindow (); // Reset The Display
¡¡¡¡¡¡TRACE ( "Can't Find A Suitable PixelFormat." );
¡¡¡¡¡¡return FALSE;
¡¡¡¡}
¡¡¡¡if ( !SetPixelFormat ( m_hDC, PixelFormat, &pfd ) ){ // Are We Able To Set The Pixel Format?
¡¡¡¡¡¡KillGLWindow (); // Reset The Display
¡¡¡¡¡¡TRACE ( "Can't Set The PixelFormat." );
¡¡¡¡¡¡return FALSE;
¡¡¡¡}
¡¡¡¡if ( !( m_hRC = wglCreateContext ( m_hDC ) ) ) { // Are We Able To Get A Rendering Context?
¡¡¡¡¡¡KillGLWindow (); // Reset The Display
¡¡¡¡¡¡TRACE( " Can't Create A GL Rendering Context." );
¡¡¡¡¡¡return FALSE;
¡¡¡¡}
¡¡¡¡if ( !wglMakeCurrent ( m_hDC, m_hRC ) ) { // Try To Activate The Rendering Context
¡¡¡¡¡¡KillGLWindow (); // Reset The Display
¡¡¡¡¡¡TRACE ( "Can't Activate The GL Rendering Context." );
¡¡¡¡¡¡return FALSE;
¡¡¡¡}¡¡
¡¡¡¡if ( !InitGL () ) { // Initialize Our Newly Created GL Window
¡¡¡¡¡¡KillGLWindow (); // Reset The Display
¡¡¡¡¡¡TRACE ( "Initialization Failed." );
¡¡¡¡¡¡return FALSE;
¡¡¡¡}
¡¡¡¡m_bInit = TRUE;
¡¡¡¡return 0;
¡¡}
¡¡void COpenGL::KillGLWindow()
¡¡{
¡¡¡¡if (m_bFullScreen) // Are We In Fullscreen Mode?
¡¡¡¡{
¡¡¡¡¡¡if (!ChangeDisplaySettings(NULL,CDS_TEST)) { // if the shortcut doesn't work
¡¡¡¡¡¡¡¡ChangeDisplaySettings(NULL,CDS_RESET); // Do it anyway (to get the values out of the registry)
¡¡¡¡¡¡¡¡ChangeDisplaySettings(&m_DMsaved,CDS_RESET); // change it to the saved settings
¡¡¡¡¡¡} else {
¡¡¡¡¡¡¡¡ChangeDisplaySettings(NULL,CDS_RESET);
¡¡¡¡¡¡}
¡¡¡¡¡¡ShowCursor(TRUE); // Show Mouse Pointer
¡¡¡¡}
¡¡¡¡if ( m_hRC ) { // Do We Have A Rendering Context?
¡¡¡¡¡¡if ( !wglMakeCurrent ( NULL, NULL ) ) { // Are We Able To Release The DC And RC Contexts?
¡¡¡¡¡¡¡¡TRACE ( "Release Of DC And RC Failed." );
¡¡¡¡¡¡}
¡¡¡¡¡¡if ( !wglDeleteContext ( m_hRC ) ) { // Are We Able To Delete The RC?
¡¡¡¡¡¡¡¡TRACE ( "Release Rendering Context Failed." );
¡¡¡¡¡¡}
¡¡¡¡¡¡m_hRC = NULL; // Set RC To NULL
¡¡¡¡}
¡¡¡¡if ( m_hDC && !::ReleaseDC ( m_hWnd, m_hDC ) ) { // Are We Able To Release The DC
¡¡¡¡¡¡TRACE ( "Release Device Context Failed." );
¡¡¡¡¡¡m_hDC = NULL; // Set DC To NULL
¡¡¡¡}
¡¡¡¡if ( m_hWnd && !::DestroyWindow ( m_hWnd ) ) { // Are We Able To Destroy The Window?
¡¡¡¡¡¡TRACE( "Could Not Release m_hWnd." );
¡¡¡¡¡¡m_hWnd = NULL; // Set m_hWnd To NULL
¡¡¡¡}
¡¡}
¡¡int COpenGL::InitGL()
¡¡{
¡¡¡¡glShadeModel(GL_SMOOTH); // Enable Smooth Shading
¡¡¡¡glClearColor(0.0f, 0.0f, 0.0f, 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
¡¡¡¡glEnable(GL_TEXTURE_2D); // Enable Texture Mapping
¡¡¡¡return TRUE; // Initialization Went OK
¡¡}
¡¡void COpenGL::RenderGLScene()
¡¡{
¡¡¡¡if(!m_bInit) return;
¡¡¡¡glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
¡¡¡¡glLoadIdentity();
¡¡¡¡// EXAMPLE OPENGL CODE START ////////////////////////////////////////////////////////
¡¡¡¡//////////////////////////////////////////////////////////////////////////////
¡¡¡¡static GLfloat xrot; // X Rotation
¡¡¡¡static GLfloat yrot; // Y Rotation
¡¡¡¡static GLfloat zrot; // Z Rotation
¡¡¡¡glPushMatrix(); // Push Matrix Onto Stack (Copy The Current Matrix)
¡¡¡¡glLoadIdentity(); // Reset The Current Modelview Matrix
¡¡¡¡glTranslatef(0.0f,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0
¡¡¡¡glRotatef(xrot,1.0f,0.0f,0.0f);
¡¡¡¡glRotatef(yrot,0.0f,1.0f,0.0f);
¡¡¡¡glRotatef(zrot,0.0f,0.0f,1.0f);
¡¡¡¡glBegin(GL_QUADS);
¡¡¡¡// Front Face
¡¡¡¡glColor3f(1.0f,0.0f,0.0f);glVertex3f(-1.0f, -1.0f, 1.0f);
¡¡¡¡glColor3f(0.0f,1.0f,0.0f);glVertex3f( 1.0f, -1.0f, 1.0f);
¡¡¡¡glColor3f(0.0f,1.0f,0.0f);glVertex3f( 1.0f, 1.0f, 1.0f);
¡¡¡¡glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f, 1.0f, 1.0f);
¡¡¡¡// Back Face
¡¡¡¡glColor3f(1.0f,0.0f,0.0f);glVertex3f(-1.0f, -1.0f, -1.0f);
¡¡¡¡glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f, 1.0f, -1.0f);
¡¡¡¡glColor3f(0.0f,1.0f,0.0f);glVertex3f( 1.0f, 1.0f, -1.0f);
¡¡¡¡glColor3f(0.0f,0.0f,1.0f);glVertex3f( 1.0f, -1.0f, -1.0f);
¡¡¡¡// Top Face
¡¡¡¡glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f, 1.0f, -1.0f);
¡¡¡¡glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f, 1.0f, 1.0f);
¡¡¡¡glColor3f(0.0f,1.0f,0.0f);glVertex3f( 1.0f, 1.0f, 1.0f);
¡¡¡¡glColor3f(0.0f,1.0f,0.0f);glVertex3f( 1.0f, 1.0f, -1.0f);
¡¡¡¡// Bottom Face
¡¡¡¡glColor3f(1.0f,0.0f,0.0f);glVertex3f(-1.0f, -1.0f, -1.0f);
¡¡¡¡glColor3f(0.0f,0.0f,1.0f);glVertex3f( 1.0f, -1.0f, -1.0f);
¡¡¡¡glColor3f(0.0f,1.0f,0.0f);glVertex3f( 1.0f, -1.0f, 1.0f);
¡¡¡¡glColor3f(1.0f,0.0f,0.0f);glVertex3f(-1.0f, -1.0f, 1.0f);
¡¡¡¡// Right face
¡¡¡¡glColor3f(0.0f,0.0f,1.0f);glVertex3f( 1.0f, -1.0f, -1.0f);
¡¡¡¡glColor3f(0.0f,1.0f,0.0f);glVertex3f( 1.0f, 1.0f, -1.0f);
¡¡¡¡glColor3f(0.0f,1.0f,0.0f);glVertex3f( 1.0f, 1.0f, 1.0f);
¡¡¡¡glColor3f(0.0f,1.0f,0.0f);glVertex3f( 1.0f, -1.0f, 1.0f);
¡¡¡¡// Left Face
¡¡¡¡glColor3f(1.0f,0.0f,0.0f);glVertex3f(-1.0f, -1.0f, -1.0f);
¡¡¡¡glColor3f(1.0f,0.0f,0.0f);glVertex3f(-1.0f, -1.0f, 1.0f);
¡¡¡¡glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f, 1.0f, 1.0f);
¡¡¡¡glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f, 1.0f, -1.0f);
¡¡¡¡glEnd();
¡¡¡¡glPopMatrix(); // Pop Matrix Off The Stack
¡¡¡¡xrot+=1.3f;
¡¡¡¡yrot+=1.2f;
¡¡¡¡zrot+=1.4f; // Decrease The Rotation Variable For The Quad
¡¡¡¡////////////////////////////////////////