home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / book / Chap17 / GLView / GLWindow.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1999-09-19  |  9.2 KB  |  348 lines

  1. // GLWindow.cpp : implementation file
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "GLView.h"
  6. #include "GLWindow.h"
  7.  
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13.  
  14.  
  15.  
  16. BYTE* gltResourceBMPBits(UINT nResource, int *nWidth, int *nHeight)
  17.     {
  18.     HINSTANCE hInstance;    // Instance Handle
  19.     HANDLE hBitmap;            // Handle to bitmap resource
  20.     BITMAPINFO bmInfo;
  21.  
  22.  
  23.     // Find the bitmap resource
  24.     hInstance = GetModuleHandle(NULL);
  25.     hBitmap = LoadBitmap(hInstance,MAKEINTRESOURCE(nResource));
  26.  
  27.     if(hBitmap == NULL)
  28.         return NULL;
  29.  
  30.     GetObject(hBitmap,sizeof(BITMAPINFO),&bmInfo);
  31.     DeleteObject(hBitmap);
  32.  
  33.     hBitmap = ::LoadResource(hInstance,
  34.          ::FindResource(hInstance,MAKEINTRESOURCE(nResource), RT_BITMAP));
  35.  
  36.     if(hBitmap == NULL)
  37.         return NULL;
  38.  
  39.     BYTE *pData = (BYTE *)LockResource(hBitmap);
  40.     pData += sizeof(BITMAPINFO)-1;
  41.  
  42.     *nWidth = bmInfo.bmiHeader.biWidth; //bm.bmWidth;
  43.     *nHeight = bmInfo.bmiHeader.biHeight;//bm.bmHeight;
  44.  
  45.     return pData;
  46.     }
  47.  
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CGLWindow
  50.  
  51. CGLWindow::CGLWindow()
  52.     {
  53.     m_hRC = NULL;
  54.     m_hDC = NULL;
  55.     m_nPixelFormat;
  56.     }
  57.  
  58. CGLWindow::~CGLWindow()
  59.     {
  60.     }
  61.  
  62.  
  63. BEGIN_MESSAGE_MAP(CGLWindow, CWnd)
  64.     //{{AFX_MSG_MAP(CGLWindow)
  65.     ON_WM_PAINT()
  66.     ON_WM_CREATE()
  67.     ON_WM_DESTROY()
  68.     ON_WM_SIZE()
  69.     //}}AFX_MSG_MAP
  70. END_MESSAGE_MAP()
  71.  
  72.  
  73. /////////////////////////////////////////////////////////////////////////////
  74. // CGLWindow message handlers
  75.  
  76. void CGLWindow::OnPaint() 
  77.     {
  78.     static float fX = 0.0f;
  79.     static float fY = 0.0f;
  80.  
  81.     if(m_hRC != NULL)
  82.         {
  83.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  84.  
  85.         fX += 0.015f;
  86.         fY += 0.01f;
  87.  
  88.         if(fX > 360.0f)
  89.             fX = 0.015f;
  90.  
  91.         if(fY > 360.0f)
  92.             fY = 0.01f;
  93.  
  94.         glPushMatrix();
  95.         glRotatef(fX, 1.0f, 0.0f, 0.0f);
  96.         glRotatef(fY, 0.0f, 1.0f, 0.0f);
  97.  
  98.         float fSize = 20.0f;
  99.  
  100.         // Front face of Cube
  101.         glBindTexture(GL_TEXTURE_2D, m_Sides[0]);
  102.         glBegin(GL_QUADS);
  103.             glTexCoord2f(0.0f, 1.0f);
  104.             glVertex3f(-fSize, fSize, fSize);
  105.             glTexCoord2f(0.0f, 0.0f);
  106.             glVertex3f(-fSize, -fSize, fSize);
  107.             glTexCoord2f(1.0f, 0.0f);
  108.             glVertex3f(fSize,-fSize, fSize);
  109.             glTexCoord2f(1.0f, 1.0f);
  110.             glVertex3f(fSize,fSize, fSize);
  111.         glEnd();
  112.  
  113.         // Back face of Cube
  114.         glBindTexture(GL_TEXTURE_2D,  m_Sides[1]);
  115.         glBegin(GL_QUADS);
  116.             glTexCoord2f(0.0f, 1.0f);
  117.             glVertex3f(fSize,fSize, -fSize);
  118.             glTexCoord2f(0.0f, 0.0f);
  119.             glVertex3f(fSize,-fSize, -fSize);
  120.             glTexCoord2f(1.0f, 0.0f);
  121.             glVertex3f(-fSize, -fSize, -fSize);
  122.             glTexCoord2f(1.0f, 1.0f);
  123.             glVertex3f(-fSize, fSize, -fSize);
  124.         glEnd();
  125.  
  126.         // Top Face of Cube
  127.         glBindTexture(GL_TEXTURE_2D,  m_Sides[2]);
  128.         glBegin(GL_QUADS);
  129.             glTexCoord2f(0.0f, 1.0f);
  130.             glVertex3f(-fSize, fSize, fSize);
  131.             glTexCoord2f(0.0f, 0.0f);
  132.             glVertex3f(fSize, fSize, fSize);
  133.             glTexCoord2f(1.0f, 0.0f);
  134.             glVertex3f(fSize, fSize, -fSize);
  135.             glTexCoord2f(1.0f, 1.0f);
  136.             glVertex3f(-fSize, fSize, -fSize);
  137.         glEnd();
  138.  
  139.  
  140.         // Bottom Face of Cube
  141.         glBindTexture(GL_TEXTURE_2D,  m_Sides[3]);
  142.         glBegin(GL_QUADS);
  143.             glTexCoord2f(0.0f, 1.0f);
  144.             glVertex3f(-fSize, -fSize, -fSize);
  145.             glTexCoord2f(0.0f, 0.0f);
  146.             glVertex3f(fSize, -fSize, -fSize);
  147.             glTexCoord2f(1.0f, 0.0f);
  148.             glVertex3f(fSize, -fSize, fSize);
  149.             glTexCoord2f(1.0f, 1.0f);
  150.             glVertex3f(-fSize, -fSize, fSize);
  151.         glEnd();
  152.  
  153.  
  154.         // Left hand side of cube
  155.         glBindTexture(GL_TEXTURE_2D,  m_Sides[4]);
  156.         glBegin(GL_QUADS);
  157.             glTexCoord2f(0.0f, 1.0f);
  158.             glVertex3f(-fSize, fSize, -fSize);
  159.             glTexCoord2f(0.0f, 0.0f);
  160.             glVertex3f(-fSize, -fSize, -fSize);
  161.             glTexCoord2f(1.0f, 0.0f);
  162.             glVertex3f(-fSize, -fSize, fSize);
  163.             glTexCoord2f(1.0f, 1.0f);
  164.             glVertex3f(-fSize, fSize, fSize);
  165.         glEnd();
  166.  
  167.  
  168.         // Right hand side of cube
  169.         glBindTexture(GL_TEXTURE_2D,  m_Sides[5]);
  170.         glBegin(GL_QUADS);
  171.             glTexCoord2f(0.0f, 1.0f);
  172.             glVertex3f(fSize, fSize, fSize);
  173.             glTexCoord2f(0.0f, 0.0f);
  174.             glVertex3f(fSize, -fSize, fSize);
  175.             glTexCoord2f(1.0f, 0.0f);
  176.             glVertex3f(fSize, -fSize, -fSize);
  177.             glTexCoord2f(1.0f, 1.0f);
  178.             glVertex3f(fSize, fSize, -fSize);
  179.         glEnd();
  180.  
  181.         glPopMatrix();
  182.  
  183.         SwapBuffers(m_hDC);
  184.         }
  185.     else
  186.         {
  187.         CPaintDC dc(this); // device context for painting
  188.  
  189.         RECT rect;
  190.         GetClientRect(&rect);
  191.         HDC m_hMemDC;
  192.         HBITMAP m_hBitmap, m_hOldBitmap;
  193.  
  194.         m_hMemDC = CreateCompatibleDC(m_hDC);
  195.     
  196.         // Load the bitmap
  197.         m_hBitmap = LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BM_NOGL));
  198.         m_hOldBitmap = (HBITMAP) SelectObject(m_hMemDC, m_hBitmap);
  199.  
  200.         // Do the blit for the background
  201.         StretchBlt(m_hDC, 0,0, rect.right, rect.bottom, m_hMemDC, 0, 0, 200, 200,SRCCOPY);
  202.  
  203.         SelectObject(m_hMemDC, m_hOldBitmap);
  204.         DeleteObject(m_hBitmap);
  205.         ::DeleteDC(m_hMemDC);
  206.         }
  207.     }
  208.  
  209. int CGLWindow::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  210.     {
  211.     if (CWnd::OnCreate(lpCreateStruct) == -1)
  212.         return -1;
  213.     
  214.     // Get the device context
  215.     m_hDC = ::GetDC(this->m_hWnd);
  216.     
  217.     // Set the Pixel Format
  218.     SetPixelFormat(m_hDC, m_nPixelFormat, NULL);
  219.  
  220.     // Create the rendering context and make it current
  221.     m_hRC = wglCreateContext(m_hDC);
  222.  
  223.     if(m_hRC != NULL)
  224.         wglMakeCurrent(m_hDC, m_hRC);
  225.  
  226.     // Setup the context
  227.     if(m_hRC != NULL)
  228.         {
  229.         glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  230.         glGenTextures(6, m_Sides);
  231.         glEnable(GL_TEXTURE_2D);
  232.         glEnable(GL_DEPTH_TEST);
  233.         glEnable(GL_CULL_FACE);
  234.         glFrontFace(GL_CCW);
  235.  
  236.         BYTE *pBytes;
  237.         int nWidth, nHeight;
  238.     
  239.         glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE, GL_REPLACE);
  240.  
  241.         // Load the texture objects
  242.         pBytes = gltResourceBMPBits(IDB_BITMAP1, &nWidth, &nHeight);
  243.         glBindTexture(GL_TEXTURE_2D, m_Sides[0]);
  244.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  245.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  246.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  247.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  248.         glTexImage2D(GL_TEXTURE_2D,0,GL_RGB8,nWidth, nHeight, 0,
  249.             GL_BGR_EXT, GL_UNSIGNED_BYTE, pBytes);
  250.  
  251.         pBytes = gltResourceBMPBits(IDB_BITMAP2, &nWidth, &nHeight);
  252.         glBindTexture(GL_TEXTURE_2D, m_Sides[1]);
  253.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  254.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  255.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  256.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  257.         glTexImage2D(GL_TEXTURE_2D,0,GL_RGB8,nWidth, nHeight, 0,
  258.             GL_BGR_EXT, GL_UNSIGNED_BYTE, pBytes);
  259.  
  260.         pBytes = gltResourceBMPBits(IDB_BITMAP3, &nWidth, &nHeight);
  261.         glBindTexture(GL_TEXTURE_2D, m_Sides[2]);
  262.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  263.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  264.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  265.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  266.         glTexImage2D(GL_TEXTURE_2D,0,GL_RGB8,nWidth, nHeight, 0,
  267.             GL_BGR_EXT, GL_UNSIGNED_BYTE, pBytes);
  268.  
  269.         pBytes = gltResourceBMPBits(IDB_BITMAP4, &nWidth, &nHeight);
  270.         glBindTexture(GL_TEXTURE_2D, m_Sides[3]);
  271.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  272.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  273.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  274.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  275.         glTexImage2D(GL_TEXTURE_2D,0,GL_RGB8,nWidth, nHeight, 0,
  276.             GL_BGR_EXT, GL_UNSIGNED_BYTE, pBytes);
  277.  
  278.         pBytes = gltResourceBMPBits(IDB_BITMAP5, &nWidth, &nHeight);
  279.         glBindTexture(GL_TEXTURE_2D, m_Sides[4]);
  280.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  281.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  282.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  283.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  284.         glTexImage2D(GL_TEXTURE_2D,0,GL_RGB8,nWidth, nHeight, 0,
  285.             GL_BGR_EXT, GL_UNSIGNED_BYTE, pBytes);
  286.  
  287.         pBytes = gltResourceBMPBits(IDB_BITMAP6, &nWidth, &nHeight);
  288.         glBindTexture(GL_TEXTURE_2D, m_Sides[5]);
  289.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  290.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  291.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  292.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  293.         glTexImage2D(GL_TEXTURE_2D,0,GL_RGB8,nWidth, nHeight, 0,
  294.             GL_BGR_EXT, GL_UNSIGNED_BYTE, pBytes);
  295.  
  296.         }
  297.         
  298.     return 0;
  299.     }
  300.  
  301. void CGLWindow::OnDestroy() 
  302.     {
  303.     CWnd::OnDestroy();
  304.  
  305.     if(m_hRC)
  306.         {    
  307.         glDeleteTextures(6, m_Sides);
  308.  
  309.  
  310.         wglMakeCurrent(m_hDC, NULL);
  311.         wglDeleteContext(m_hRC);
  312.         m_hRC = NULL;
  313.         }
  314.  
  315.     ::ReleaseDC(this->m_hWnd, m_hDC);
  316.     m_hDC = NULL;
  317.     }
  318.  
  319. void CGLWindow::OnSize(UINT nType, int w, int h) 
  320.     {
  321.     CWnd::OnSize(nType, w, h);
  322.     
  323.     GLfloat nRange = 100.0f;
  324.     GLfloat fAspect;
  325.  
  326.     // Prevent a divide by zero
  327.     if(h == 0)
  328.         h = 1;
  329.  
  330.     fAspect = (GLfloat)w/(GLfloat)h;
  331.  
  332.     // Set Viewport to window dimensions
  333.     glViewport(0, 0, w, h);
  334.  
  335.     glMatrixMode(GL_PROJECTION);
  336.  
  337.     // Reset coordinate system
  338.     glLoadIdentity();
  339.  
  340.     // Setup perspective for viewing
  341.     gluPerspective(17.5f,fAspect,60,300);
  342.  
  343.     // Viewing transformation
  344.     glMatrixMode(GL_MODELVIEW);
  345.     glLoadIdentity();
  346.     glTranslatef(0.0f, 0.0f, -250.0f);
  347.     }
  348.