3dEngine.cpp
上传用户:shxiangxiu
上传日期:2007-01-03
资源大小:1101k
文件大小:10k
源码类别:

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // 3dEngine.cpp : implementation file
  3. //
  4. // glOOP (OpenGL Object Oriented Programming library)
  5. // Copyright (c) Craig Fahrnbach 1997, 1998
  6. //
  7. // OpenGL is a registered trademark of Silicon Graphics
  8. //
  9. //
  10. // This program is provided for educational and personal use only and
  11. // is provided without guarantee or warrantee expressed or implied.
  12. //
  13. // Commercial use is strickly prohibited without written permission
  14. // from ImageWare Development.
  15. //
  16. // This program is -not- in the public domain.
  17. //
  18. /////////////////////////////////////////////////////////////////////////////
  19. #include "stdafx.h"
  20. #include "glOOP.h"
  21. #ifdef _DEBUG
  22. #define new DEBUG_NEW
  23. #undef THIS_FILE
  24. static char THIS_FILE[] = __FILE__;
  25. #endif
  26. //////////////////////////////////////////////////////////////////
  27. // C3dEngine
  28. IMPLEMENT_DYNAMIC(C3dEngine, CObject)
  29. /////////////////////////////////////////////////////////////////////////////
  30. // C3dEngine construction
  31. C3dEngine::C3dEngine()
  32. {
  33. // Assign Default values to member attributes
  34. m_hPalette = NULL;
  35. m_bDisplayErrorMessages = TRUE;
  36. }
  37. /////////////////////////////////////////////////////////////////////////////
  38. // C3dEngine Destructor
  39. C3dEngine::~C3dEngine()
  40. {
  41. // Delete palette if created
  42. if(m_hPalette)
  43. DeleteObject(m_hPalette);
  44. }
  45. /////////////////////////////////////////////////////////////////////////////
  46. // C3dEngine Procedures
  47. BOOL C3dEngine::SetWindowPixelFormat(HDC hDC, DWORD dwFlags)
  48. {
  49. int iPixelFormat; // Pixel format
  50. int iMaxPixelFormatIndex; // Max Pixel format index
  51. int iNumEntries; // Number of entries in the logical palette were
  52. // mapped to different entries in the system palette.
  53. // dwFlags += PFD_DRAW_TO_WINDOW | // Draw to Window (not bitmap) <dwFlags>
  54. //    PFD_SUPPORT_OPENGL | // Support OpenGL calls in window
  55. //    PFD_DOUBLEBUFFER; // Double buffered mode
  56. PIXELFORMATDESCRIPTOR pfd = {  
  57. sizeof(PIXELFORMATDESCRIPTOR), // Size of this structure <nSize>
  58. 1, // Version of this structure <nVersion>
  59. dwFlags, // Pixel format descriptor flags
  60. PFD_TYPE_RGBA, // RGBA Color mode <iPixelType>
  61. 24, // Want 24bit color <cColorBits> 
  62. 0,0,0,0,0,0, // Not used to select mode color bits / shift
  63. 0,0, // Not used to select mode alpha bits / shift
  64. 0,0,0,0,0, // Not used to select mode accum bits / shift
  65. 16, // Size of depth buffer <cDepthBits>
  66. 16, // Size of the Stencel buffer <CStencilBits>
  67. 0, // Not used to select mode <cAuxBuffers>
  68. PFD_MAIN_PLANE, // Draw in main plane <iLayerType>
  69. 0, // MUST BE ZERO <bReserved>
  70. 0,0,0 }; // Not used to select mode
  71. // Choose a pixel format that best matches that described in pfd
  72. iPixelFormat = ChoosePixelFormat(hDC, &pfd);
  73. if (iPixelFormat==0) // Let's choose a default index.
  74. {
  75. DisplayError("C3dEngine::SetWindowPixelFormat");
  76. return FALSE;
  77. // iPixelFormat = 1;
  78. // if (DescribePixelFormat(hDC, 
  79. // iPixelFormat, 
  80. // sizeof(PIXELFORMATDESCRIPTOR), 
  81. // &pfd)==0)
  82. // return FALSE;
  83. }
  84. // Set the pixel format for the device context
  85. if(!SetPixelFormat(hDC, iPixelFormat, &pfd))
  86. {
  87. DisplayError("C3dEngine::SetWindowPixelFormat");
  88. return FALSE;
  89. }
  90. // With the pixel format index, get it's description
  91. iMaxPixelFormatIndex = DescribePixelFormat(hDC, 
  92. iPixelFormat, 
  93. sizeof(PIXELFORMATDESCRIPTOR), 
  94. &pfd);
  95. if(!iMaxPixelFormatIndex)
  96. {
  97. DisplayError("C3dEngine::SetWindowPixelFormat");
  98. return FALSE;
  99. }
  100. // Does this pixel format require a palette?
  101. if(pfd.dwFlags & PFD_NEED_PALETTE)
  102. {
  103. if(!m_hPalette)
  104. // Palette not created so create one!
  105. m_hPalette = CreateNewPalette(hDC);
  106. // If a palette was just created or previously created, select
  107. // the palette into our device context
  108. if(m_hPalette)
  109. {
  110. // Selects the palette into the current device context
  111. SelectPalette(hDC, m_hPalette, FALSE);
  112. // Map entries from the currently selected palette to
  113. // the system palette.  The return value is the number 
  114. // of palette entries modified.
  115. iNumEntries = RealizePalette(hDC);
  116. }
  117. }
  118. return TRUE;
  119. }
  120. BOOL C3dEngine::EnableRC(HDC hDC, HGLRC hRC, BOOL bEnable)
  121. {
  122. if(bEnable)
  123. {
  124. // Make the rendering context current
  125. if(!wglMakeCurrent(hDC, hRC))
  126. {
  127. if(m_bDisplayErrorMessages)
  128. {
  129. int iPixelFormat;
  130. PIXELFORMATDESCRIPTOR  pfd;
  131. // Get the current pixel format index 
  132. iPixelFormat = GetPixelFormat(hDC);
  133. // obtain a detailed description of that pixel format 
  134. DescribePixelFormat(hDC, iPixelFormat, 
  135. sizeof(PIXELFORMATDESCRIPTOR), &pfd); 
  136. DisplayError("C3dEngine::EnableRC");
  137. }
  138. return FALSE;
  139. }
  140. }
  141. else
  142. // Releases the device context that is used by the rendering context
  143. // to allow other rendering contexts to co-exist.
  144. wglMakeCurrent(NULL, NULL);
  145. return TRUE;
  146. }
  147. void C3dEngine::DisplayError(LPSTR szTitle)
  148. {
  149. LPVOID lpMsgBuf;
  150. FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  151.   NULL,
  152.   GetLastError(),
  153.   MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  154.   (LPTSTR) &lpMsgBuf,
  155.   0,
  156.   NULL);
  157. if(m_bDisplayErrorMessages)
  158. // Display the string.
  159. MessageBox( NULL, (LPTSTR)lpMsgBuf, szTitle, MB_OK|MB_ICONINFORMATION );
  160. TRACE("%s: %sn", szTitle, lpMsgBuf);
  161. // Free the buffer.
  162. LocalFree( lpMsgBuf );
  163. }
  164. /******************************************************************************
  165.  *                                                                            *
  166.  * HPALETTE CreateNewPalette()   *
  167.  *                                                                            *
  168.  * Parameter:                                                               *
  169.  *                                                                            *
  170.  * HDC - Handle to a Device Context   *
  171.  *                                                                            *
  172.  * Return Value:                                                              *
  173.  *                                                                            *
  174.  * HPALETTE         - Returns a handle to a palette or NULL if it   *
  175.  *                    fails.                                                  *
  176.  *                                                                            *
  177.  * Description:                                                               *
  178.  *                                                                            *
  179.  * This function will build a palette with a spectrum of colors.  It is       *
  180.  * useful when you want to display a number of DIBs each with a different     *
  181.  * palette yet still have an a good selection of colors for the DIBs to map   *
  182.  * to.                                                                        *
  183.  *                                                                            *
  184.  *****************************************************************************/
  185. HPALETTE C3dEngine::CreateNewPalette(HDC hDC)
  186. {
  187. PIXELFORMATDESCRIPTOR pfd; // Pixel Format Descriptor
  188. LOGPALETTE *pPal; // Pointer to memory for logical palette
  189. HPALETTE hPal; // Handle to our palette
  190. int iPixelFormat; // Pixel format index
  191. int nColors; // Number of entries in palette
  192. int i; // Counting variable
  193. BYTE RedRange,GreenRange,BlueRange;
  194. // Range for each color entry (7,7,and 3)
  195. // Get the pixel format index and retrieve the pixel format description
  196. iPixelFormat = GetPixelFormat(hDC);
  197. DescribePixelFormat(hDC, iPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
  198. // Does this pixel format require a palette?  If not, do not create a
  199. // palette and just return NULL
  200. if(!(pfd.dwFlags & PFD_NEED_PALETTE))
  201. return NULL;
  202. // Number of entries in palette.  8 bits yeilds 256 entries
  203. nColors = 1 << pfd.cColorBits;
  204. // Allocate space for a logical palette structure plus all the palette entries
  205. pPal = (LOGPALETTE*)malloc(sizeof(LOGPALETTE) +nColors*sizeof(PALETTEENTRY));
  206. // Fill in palette header 
  207. pPal->palVersion = 0x300; // Windows 3.0
  208. pPal->palNumEntries = nColors; // table size
  209. // Build mask of all 1's.  This creates a number represented by having
  210. // the low order x bits set, where x = pfd.cRedBits, pfd.cGreenBits, and
  211. // pfd.cBlueBits.  
  212. RedRange = (1 << pfd.cRedBits) -1;
  213. GreenRange = (1 << pfd.cGreenBits) - 1;
  214. BlueRange = (1 << pfd.cBlueBits) -1;
  215. // Loop through all the palette entries
  216. for(i = 0; i < nColors; i++)
  217. {
  218. // Fill in the 8-bit equivalents for each component
  219. pPal->palPalEntry[i].peRed = (i >> pfd.cRedShift) & RedRange;
  220. pPal->palPalEntry[i].peRed = (unsigned char)(
  221. (double) pPal->palPalEntry[i].peRed * 255.0 / RedRange);
  222. pPal->palPalEntry[i].peGreen = (i >> pfd.cGreenShift) & GreenRange;
  223. pPal->palPalEntry[i].peGreen = (unsigned char)(
  224. (double)pPal->palPalEntry[i].peGreen * 255.0 / GreenRange);
  225. pPal->palPalEntry[i].peBlue = (i >> pfd.cBlueShift) & BlueRange;
  226. pPal->palPalEntry[i].peBlue = (unsigned char)(
  227. (double)pPal->palPalEntry[i].peBlue * 255.0 / BlueRange);
  228. pPal->palPalEntry[i].peFlags = (unsigned char) NULL;
  229. }
  230. // Create the palette
  231. hPal = CreatePalette(pPal);
  232. // Go ahead and select and realize the palette for this device context
  233. // SelectPalette(hDC,(HPALETTE)hPalette,FALSE);
  234. // RealizePalette(hDC);
  235. // Free the memory used for the logical palette structure
  236. free(pPal);
  237. return hPal; // Return the handle to this palette
  238. }