Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Apr 16th, 2012  |  syntax: None  |  size: 28.41 KB  |  hits: 17  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #include <windows.h>                    // Заголовочный файл для Windows
  2. #include <stdio.h>                      // Заголовочный файл стандартного ввода/вывода (НОВОЕ)                      // Заголовочный файл библиотеки OpenGL32
  3. #include <gl\glut.h>                    // Заголовочный файл библиотеки GLu32
  4. #include <gl\glaux.h>                   // Заголовочный файл библиотеки GLaux
  5. #include <string>
  6.  
  7. #pragma comment(lib, "glut32.lib"
  8. #pragma comment(lib, "opengl32.lib")                            // Ссылка на OpenGL32.lib
  9. #pragma comment(lib, "glu32.lib")                               // Ссылка на Glu32.lib
  10. #pragma comment(lib, "glaux.lib")
  11.  
  12. #define         MAP_SIZE        1024                    // Размер карты вершин (НОВОЕ)
  13. #define         STEP_SIZE       8                       // Ширина и высота каждого квадрата (НОВОЕ)
  14. #define         HEIGHT_RATIO    1.5f            // Коэффициент масштабирования по оси Y в соответствии с осями X и Z (НОВОЕ)
  15.  
  16. typedef signed __int32 int32;
  17. typedef unsigned __int32 uint32;
  18. typedef unsigned __int8 uint8;
  19. typedef signed __int8 int8;
  20.  
  21. HDC             hDC=NULL;                               // Приватный контекст устройства GDI
  22. HGLRC           hRC=NULL;                               // Постоянный контекст рендеринга
  23. HWND            hWnd=NULL;                              // Указатель на наше окно
  24. HINSTANCE       hInstance;                              // Указывает на дескриптор текущего приложения
  25.  
  26. bool            keys[256];                              // Массив для процедуры обработки клавиатуры
  27. bool            active=TRUE;                            // Флаг активности окна, по умолчанию=TRUE
  28. bool            fullscreen=TRUE;                        // Флаг полноэкранного режима, по умолчанию=TRUE
  29. bool            bRender = TRUE;                 // Флаг режима отображения полигонов, по умолчанию=TRUE (НОВОЕ)
  30.  
  31. BYTE g_HeightMap[MAP_SIZE*MAP_SIZE];            // Содержит карту вершин (НОВОЕ)
  32.  
  33. float scaleValue = 0.1f;                                        // Величина масштабирования поверхности (НОВОЕ)
  34.  
  35. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);           // Объявление для WndProc
  36.  
  37. struct BMPHandle
  38. {
  39.         uint32 sizeX;
  40.         uint32 sizeY;
  41.         uint8 * buffer;
  42. };
  43.  
  44. BMPHandle * LoadBMP(const char * path)
  45. {
  46.         FILE * file = fopen(path, "rb");
  47.         if (file == NULL)
  48.                 return NULL;
  49.         uint8 buffer[54];       // first 54 bytes of file - header
  50.         fread(buffer, 1, 54, file);
  51.         uint32 bit_count = *(uint32*)(buffer + 28);
  52.         if (bit_count != 24)    // non 24-bit bmp is not handled yet
  53.         {
  54.                 string str("Application attempted to load not handled type of bmp-file with name ");
  55.                 str += path;
  56.                 str += ". Only 24 bit BMP files is supported.";
  57.                 MessageBoxA(NULL, str.c_str(), "Error", MB_OK);
  58.                 exit(EXIT_SUCCESS);
  59.                 return NULL;
  60.         }
  61.         BMPHandle * _bmph = new BMPHandle;
  62.         _bmph->sizeX = *(uint32*)(buffer + 18);
  63.         _bmph->sizeY = *(uint32*)(buffer + 22);
  64.         uint32 size = _bmph->sizeX * _bmph->sizeY * 3; // 3 bytes per pixel: RGB
  65.         _bmph->buffer = new uint8[size];       
  66.  
  67.         uint32 start = *(uint32*)(buffer + 10);
  68.         fseek(file, start, SEEK_SET);
  69.         fread(_bmph->buffer, 1, size, file);
  70.         for (uint32 x = 0; x < size; x += 3)    // bmp holds info in format BGR, so we need to convert it to RGB
  71.         {
  72.                 uint8 tmp = _bmph->buffer[x + 2];
  73.                 _bmph->buffer[x + 2] = _bmph->buffer[x];
  74.                 _bmph->buffer[x] = tmp;
  75.         }
  76.         return _bmph;
  77. ;
  78.  
  79.  
  80.  
  81. GLvoid ReSizeGLScene(GLsizei Width, GLsizei Height)
  82. {
  83.         if (Height==0)          // Предотвращение деления на ноль, если окно слишком мало
  84.                 Height=1;
  85.  
  86.         glViewport(0, 0, Width, Height);
  87.                 // Сброс текущей области вывода и перспективных преобразований
  88.  
  89.         glMatrixMode(GL_PROJECTION);// Выбор матрицы проекций
  90.         glLoadIdentity();                       // Сброс матрицы проекции
  91.  
  92.         gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,500.0f);
  93.                 // Вычисление соотношения геометрических размеров для окна
  94.         glMatrixMode(GL_MODELVIEW);     // Выбор матрицы просмотра модели
  95. }
  96.  
  97. GLuint tex;
  98.  
  99. void LoadTexture(const char * str)
  100. {
  101.         AUX_RGBImageRec * texture = auxRGBImageLoadA(str);
  102.         if (texture == NULL)
  103.                 return;
  104.         glGenTextures(1, &tex);
  105.         if (!tex)
  106.         {
  107.                 MessageBoxA(NULL, "Texture not generate", "Error", MB_OK);
  108.                 return;
  109.         }
  110.         glBindTexture(GL_TEXTURE_2D, tex);
  111.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  112.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  113.     glTexImage2D(GL_TEXTURE_2D, 0, 3, texture->sizeX, texture->sizeY,
  114.         0, GL_RGB, GL_UNSIGNED_BYTE, texture->data);
  115. }
  116.  
  117. // Чтение и сохранение .RAW файла в pHeightMap
  118. void LoadRawFile(LPSTR strName, int nSize, BYTE *pHeightMap)
  119. {
  120.         FILE *pFile = NULL;
  121.  
  122.         // открытие файла в режиме бинарного чтения
  123.         pFile = fopen( strName, "rb" );
  124.  
  125.         // Файл найден?
  126.         if ( pFile == NULL )   
  127.         {
  128.                 // Выводим сообщение об ошибке и выходим из процедуры
  129.                 MessageBoxA(NULL, "Can't Find The Height Map!", "Error", MB_OK);
  130.                 return;
  131.         }
  132.  
  133.         // Загружаем .RAW файл в массив pHeightMap
  134.         // Каждый раз читаем по одному байту, размер = ширина * высота
  135.         fread( pHeightMap, 1, nSize, pFile );
  136.  
  137.         // Проверяем на наличие ошибки
  138.         int result = ferror( pFile );
  139.  
  140.         // Если произошла ошибка
  141.         if (result)
  142.         {
  143.                 MessageBoxA(NULL, "Failed To Get Data!", "Error", MB_OK);
  144.         }
  145.  
  146.         // Закрываем файл
  147.         fclose(pFile);
  148. }
  149.  
  150. int InitGL(GLvoid)                                              // Инициализация OpenGL
  151. {      
  152.         LoadBMP("Data/Font.bmp");
  153.         glEnable(GL_TEXTURE_2D);
  154.         glShadeModel(GL_SMOOTH);                        // Включить сглаживание
  155.         glClearColor(0.5f, 0.5f, 0.75f, 0.5f);  // Очистка экрана черным цветом
  156.         glClearDepth(1.0f);                             // Установка буфера глубины
  157.         glEnable(GL_DEPTH_TEST);                        // Включить буфер глубины
  158.         glDepthFunc(GL_LEQUAL);                 // Тип теста глубины
  159.         glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);      // Улучшенные вычисления перспективы
  160.  
  161.         // Читаем данные из файла и сохраняем их в массиве g_HeightMap array.
  162. // Также передаем размер файла (1024).
  163.  
  164.         LoadRawFile("Terrain.raw", MAP_SIZE * MAP_SIZE, g_HeightMap);   // ( NEW )
  165.  
  166.         return TRUE;                                            // Инициализация прошла успешно
  167. }
  168.  
  169.  
  170. int Height(BYTE *pHeightMap, int X, int Y)                      // Возвращает высоту из карты вершин (?)
  171. {
  172.         int x = X % MAP_SIZE;                                   // Проверка переменной х
  173.         int y = Y % MAP_SIZE;                                   // Проверка переменной y
  174.  
  175.         if(!pHeightMap) return 0;                               // Убедимся, что данные корректны
  176.  
  177.         return pHeightMap[x + (y * MAP_SIZE)];                  // Возвращаем значение высоты
  178. }
  179.                                                                                                                
  180. void SetVertexColor(BYTE *pHeightMap, int x, int y)             // Эта функция устанавливает значение цвета для конкретного номера,
  181. {                                                               // зависящего от номера высоты
  182.         if(!pHeightMap) return;                                 // Данные корректны?
  183.  
  184.         float fColor = -0.15f + (Height(pHeightMap, x, y ) / 256.0f);
  185.  
  186.         // Присвоить оттенок синего цвета для конкретной точки
  187.         glColor3f(0.0f, 0.0f, fColor );
  188. }
  189.  
  190. void RenderHeightMap(BYTE pHeightMap[])                         // Рендеринг карты высоты с помощью квадратов
  191. {
  192.         glBindTexture(GL_TEXTURE_2D, tex);
  193.         int X = 0, Y = 0;                                       // Создаем пару переменных для перемещения по массиву
  194.         int x, y, z;                                            // И еще три для удобства чтения
  195.  
  196.         if(!pHeightMap) return;                                 // Данные корректны?
  197.  
  198.         if(bRender)                                             // Что хотим рендерить?
  199.                 glBegin( GL_QUADS );                            // Полигоны
  200.         else
  201.                 glBegin( GL_LINES );                            // Линии
  202.  
  203. for ( X = 0; X < MAP_SIZE; X += STEP_SIZE )
  204.                 for ( Y = 0; Y < MAP_SIZE; Y += STEP_SIZE )
  205.                 {
  206.                         float texturebitX = X / MAP_SIZE;
  207.                         float texturebitY = Y / MAP_SIZE;
  208.                         float _texturebitX = X + 1 / MAP_SIZE;
  209.                         float _texturebitY = Y + 1 / MAP_SIZE;
  210.                         // Получаем (X, Y, Z) координаты нижней левой вершины
  211.                         x = X;                                                 
  212.                         y = Height(pHeightMap, X, Y ); 
  213.                         z = Y;                                                 
  214.  
  215.                         // Устанавливаем цвет конкретной точки
  216.                         SetVertexColor(pHeightMap, x, z); //metka
  217.                         glTexCoord2f(texturebitX, texturebitY);
  218.                         glVertex3i(x, y, z);                    // Рендерим ее
  219.  
  220.                         // Получаем (X, Y, Z) координаты верхней левой вершины
  221.                         x = X;                                                                         
  222.                         y = Height(pHeightMap, X, Y + STEP_SIZE );  
  223.                         z = Y + STEP_SIZE ;                                                    
  224.                        
  225.                         // Устанавливаем цвет конкретной точки
  226.                         SetVertexColor(pHeightMap, x, z);
  227.                         glTexCoord2f(texturebitX, _texturebitY);
  228.  
  229.                         glVertex3i(x, y, z);                    // Рендерим ее
  230.  
  231.                         // Получаем (X, Y, Z) координаты верхней правой вершины
  232.                         x = X + STEP_SIZE;
  233.                         y = Height(pHeightMap, X + STEP_SIZE, Y + STEP_SIZE );
  234.                         z = Y + STEP_SIZE ;
  235.  
  236.                         // Устанавливаем цвет конкретной точки
  237.                         SetVertexColor(pHeightMap, x, z);
  238.                         glTexCoord2f(_texturebitX, _texturebitY);
  239.                        
  240.                         glVertex3i(x, y, z);                    // Рендерим ее
  241.  
  242.                         // Получаем (X, Y, Z) координаты нижней правой вершины
  243.                         x = X + STEP_SIZE;
  244.                         y = Height(pHeightMap, X + STEP_SIZE, Y );
  245.                         z = Y;
  246.  
  247.                         // Устанавливаем цвет конкретной точки
  248.                         SetVertexColor(pHeightMap, x, z);
  249.                         glTexCoord2f(_texturebitX, texturebitY);
  250.  
  251.                         glVertex3i(x, y, z);                    // Рендерим ее
  252.                 }
  253.         glEnd();
  254.  
  255.         glColor4f(1.0f, 1.0f, 1.0f, 1.0f);                      // Сбрасываем цвет
  256. }
  257.  
  258. int DrawGLScene(GLvoid)                                         // Здесь содержится код рисования
  259. {
  260.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     // Очистка экрана и буфера глубины
  261.         glLoadIdentity();                                       // Сброс просмотра
  262.        
  263.         //        Положение     Вид         Вектор вертикали
  264.         gluLookAt(212, 60, 194,  186, 55, 171,  0, 1, 0);       // Определяет вид и положение камеры
  265.  
  266.         glScalef(scaleValue, scaleValue * HEIGHT_RATIO, scaleValue);
  267.  
  268.         glEnable(GL_TEXTURE_2D);
  269.         RenderHeightMap(g_HeightMap);                           // Рендеринг карты вершин
  270.  
  271.         return TRUE;                                            // Идем дальше
  272. }
  273.  
  274. GLvoid KillGLWindow(GLvoid)                                                             // Должным образом уничтожаем окно
  275. {
  276.         if (fullscreen)                                                                         // Мы в полно экранном режииме?
  277.         {
  278.                 ChangeDisplaySettings(NULL,0);                                  // Если да, то перключаемся на рабочий стол
  279.                 ShowCursor(TRUE);                                                               // Показываем курсор мыши
  280.         }
  281.  
  282.         if (hRC)                                                                                        // Контекст отображения уже есть?
  283.         {
  284.                 if (!wglMakeCurrent(NULL,NULL))                                 // Мы можем освободить RC и DC контексты?
  285.                 {
  286.                         MessageBoxA(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  287.                 }
  288.  
  289.                 if (!wglDeleteContext(hRC))                                             // Мы можем удалить RC?
  290.                 {
  291.                         MessageBoxA(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  292.                 }
  293.                 hRC=NULL;                                                                               // Устанавливаем RC в NULL
  294.         }
  295.  
  296.         if (hDC && !ReleaseDC(hWnd,hDC))                                        // Мы можем высвободить контекст DC
  297.         {
  298.                 MessageBoxA(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  299.                 hDC=NULL;                                                                               // Устанавливаем DC в NULL
  300.         }
  301.  
  302.         if (hWnd && !DestroyWindow(hWnd))                                       // Мы можем уничтожить окно?
  303.         {
  304.                 MessageBoxA(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  305.                 hWnd=NULL;                                                                              // Устанавливаем hWnd в NULL
  306.         }
  307.  
  308.         if (!UnregisterClassA("OpenGL",hInstance))                      // Можем разрегистрировать класс
  309.         {
  310.                 MessageBoxA(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  311.                 hInstance=NULL;                                                                 // Устанавливаем hInstance в NULL
  312.         }
  313. }
  314.  
  315. /*      Эта часть программы создает наше окно OpenGL.  Параметры:                                                      *
  316.  *      title                   - Заголовок, отображаемый наверху окна                                                          *
  317.  *      width                   - Ширина GL окна или полноэкранного режима                                                     *
  318.  *      height                  - Высота GL окна или полноэкранного режима                                                     *
  319.  *      bits                    - Количество бит на цвет (8/16/24/32)                                                                *
  320.  *      fullscreenflag  - Использование полноэкранного (TRUE) или оконного(FALSE) режимов  */
  321.  
  322. BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
  323. {
  324.         GLuint          PixelFormat;                    // Содержит результаты подбора глубины цвета
  325.         WNDCLASS        wc;                                             // Структура классов Windows
  326.         DWORD           dwExStyle;                              // Расширенный стиль окна
  327.         DWORD           dwStyle;                                // Стиль окна
  328.         RECT            WindowRect;                             // Получает значения верхнего левого и нижнего правого углов прямоугольника
  329.         WindowRect.left=(long)0;                        // Устанавливает значение лево (Left) в 0
  330.         WindowRect.right=(long)width;           // Устанавливает значение право (Right) в требуемую ширину (Width)
  331.         WindowRect.top=(long)0;                         // Устанавливает значение верх (Top) в 0
  332.         WindowRect.bottom=(long)height;         // Устанавливает значение низ (Bottom) в требуемую высоту (Height)
  333.  
  334.         fullscreen=fullscreenflag;                      // Устанавливаем глобальный флвг Fullscreen
  335.  
  336.         hInstance                       = GetModuleHandle(NULL);                                // Захватываем Instance для нашего окна
  337.         wc.style                        = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;   // Перерисовываем по размеру, и получаем DC для окна.
  338.         wc.lpfnWndProc          = (WNDPROC) WndProc;                                    // WndProc Handles Messages
  339.         wc.cbClsExtra           = 0;                                                                    // Нет дополнительных данных окна
  340.         wc.cbWndExtra           = 0;                                                                    // Нет дополнительных данных окна
  341.         wc.hInstance            = hInstance;                                                    // Установим Instance
  342.         wc.hIcon                        = LoadIcon(NULL, IDI_WINLOGO);                  // Згрузим иконку по умолчанию
  343.         wc.hCursor                      = LoadCursor(NULL, IDC_ARROW);                  // Згрузим стрелку курсора
  344.         wc.hbrBackground        = NULL;                                                                 // Фон для GL не требуется
  345.         wc.lpszMenuName         = NULL;                                                                 // Нам не нужны меню
  346.         wc.lpszClassName        = L"OpenGL";                                                            // Установим имя класса
  347.  
  348.         if (!RegisterClass(&wc))                                                                        // Попытаемся зарегистрировать класс окна
  349.         {
  350.                 MessageBoxA(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  351.                 return FALSE;                                                                                   // Возращаем FALSE
  352.         }
  353.        
  354.         if (fullscreen)                                                                                         // Попытаться включить полноеэкранный режим?
  355.         {
  356.                 DEVMODE dmScreenSettings;                                                               // Режим устройства
  357.                 memset(&dmScreenSettings,0,sizeof(dmScreenSettings));   // Убедимся, что памать очищена
  358.                 dmScreenSettings.dmSize=sizeof(dmScreenSettings);               // Размер структуры devmode
  359.                 dmScreenSettings.dmPelsWidth    = width;                                // Выбрана ширина экрана
  360.                 dmScreenSettings.dmPelsHeight   = height;                               // Выбрана высота экрана
  361.                 dmScreenSettings.dmBitsPerPel   = bits;                                 // Выбрано количество бит на пиксель
  362.                 dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
  363.  
  364.                 // Попытаемся установить выбранный режим и получить резутьтаты.  К седению: CDS_FULLSCREEN избавляется от кнопки стариGets Rid Of Start Bar.
  365.                 if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
  366.                 {
  367.                         // Если режиим не включился, предложим две возможности. Выйти или использовать оконный режим.
  368.                         if (MessageBoxA(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
  369.                         {
  370.                                 fullscreen=FALSE;               // Выбран оконный режим.  Fullscreen = FALSE
  371.                         }
  372.                         else
  373.                         {
  374.                                 // Показать сообщение, что приложение закончило работу.
  375.                                 MessageBoxA(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);
  376.                                 return FALSE;                                                                   // Возвращаем FALSE
  377.                         }
  378.                 }
  379.         }
  380.  
  381.         if (fullscreen)                                                                                         // Так мы в полноэкранном режиме?
  382.         {
  383.                 dwExStyle=WS_EX_APPWINDOW;                                                              // Расширенный стиль окна
  384.                 dwStyle=WS_POPUP;                                                                               // Стиль окна
  385.                 ShowCursor(FALSE);                                                                              // Скрыть курсор мыши
  386.         }
  387.         else
  388.         {
  389.                 dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;                   // Расширенный стиль окна
  390.                 dwStyle=WS_OVERLAPPEDWINDOW;                                                    // Стиль окна
  391.         }
  392.  
  393.         AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);             // Подстроить окно, чтобы оно соответствовало требуемому размеру
  394.  
  395.         // Создать окно
  396.         if (!(hWnd=CreateWindowExA(     dwExStyle,                                                      // Расширенный стиль для окна
  397.                                                                 "OpenGL",                                                       // Наименование класса
  398.                                                                 title,                                                          // Заголовок окна
  399.                                                                 dwStyle |                                                       // Определенный стиль окна
  400.                                                                 WS_CLIPSIBLINGS |                                       // Требуемый стиль окна
  401.                                                                 WS_CLIPCHILDREN,                                        // Требуемый стиль окна
  402.                                                                 0, 0,                                                           // Местоположение окна
  403.                                                                 WindowRect.right-WindowRect.left,       // Вычисление ширины окна
  404.                                                                 WindowRect.bottom-WindowRect.top,       // Вычисление высоты окна
  405.                                                                 NULL,                                                           // Нет родительского окна
  406.                                                                 NULL,                                                           // Нет меню
  407.                                                                 hInstance,                                                      // Instance
  408.                                                                 NULL)))                                                         // Не посылать сообщение по WM_CREATE
  409.         {
  410.                 KillGLWindow();                                                         // Инициализация дисплея
  411.                 MessageBoxA(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  412.                 return FALSE;                                                           // Вернуть FALSE
  413.         }
  414.  
  415.         static  PIXELFORMATDESCRIPTOR pfd=                              // pfd сообщает Windows какие параметры мы хотим
  416.         {
  417.                 sizeof(PIXELFORMATDESCRIPTOR),                          // Размер дескриптора формата пикселей
  418.                 1,                                                                                      // Номер версии
  419.                 PFD_DRAW_TO_WINDOW |                                            // Формат должен поддерживать окно
  420.                 PFD_SUPPORT_OPENGL |                                            // Формат должен поддерживать OpenGL
  421.                 PFD_DOUBLEBUFFER,                                                       // Должна поддерживаться двойная буферизация
  422.                 PFD_TYPE_RGBA,                                                          // Запрос RGBA формата
  423.                 bits,                                                                           // Выбор глубины цвета
  424.                 0, 0, 0, 0, 0, 0,                                                       // Биты цвета игнорируются
  425.                 0,                                                                                      // Нет альфа буферизации
  426.                 0,                                                                                      // Бит сдвига игнорируется
  427.                 0,                                                                                      // Нет буфера накопления
  428.                 0, 0, 0, 0,                                                                     // Биты накопления игнорируются
  429.                 16,                                                                                     // 16битный Z-бувер (Буфер глубины)  
  430.                 0,                                                                                      // Нет буфера трафарета (stencil buffer)
  431.                 0,                                                                                      // Нет вспомогательного буфера
  432.                 PFD_MAIN_PLANE,                                                         // Главная плоскость рисования
  433.                 0,                                                                                      // Зарезервировано
  434.                 0, 0, 0                                                                         // Слой масок игнорируется
  435.         };
  436.        
  437.         if (!(hDC=GetDC(hWnd)))                                                 // Мы получили контекст устройства?
  438.         {
  439.                 KillGLWindow();                                                         // Инициализация дисплея
  440.                 MessageBoxA(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  441.                 return FALSE;                                                           // Вернуть FALSE
  442.         }
  443.  
  444.         if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Windows нашла соответствующий формат пикселя?
  445.         {
  446.                 KillGLWindow();                                                         // Инициализация дисплея
  447.                 MessageBoxA(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  448.                 return FALSE;                                                           // Вернуть FALSE
  449.         }
  450.  
  451.         if(!SetPixelFormat(hDC,PixelFormat,&pfd))               // Мы можем установить формат пикселя?
  452.         {
  453.                 KillGLWindow();                                                         // Инициализация дисплея
  454.                 MessageBoxA(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  455.                 return FALSE;                                                           // Вернуть FALSE
  456.         }
  457.  
  458.         if (!(hRC=wglCreateContext(hDC)))                               // Мы можем получить контекст изображения?
  459.         {
  460.                 KillGLWindow();                                                         // Инициализация дисплея
  461.                 MessageBoxA(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  462.                 return FALSE;                                                           // Вернуть FALSE
  463.         }
  464.  
  465.         if(!wglMakeCurrent(hDC,hRC))                                    // Пытаемся активировать контекст изображения
  466.         {
  467.                 KillGLWindow();                                                         // Инициализация дисплея
  468.                 MessageBoxA(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  469.                 return FALSE;                                                           // Вернуть FALSE
  470.         }
  471.  
  472.         ShowWindow(hWnd,SW_SHOW);                                               // Показать окно
  473.         SetForegroundWindow(hWnd);                                              // Слегка увеличим приоритет
  474.         SetFocus(hWnd);                                                                 // Устанавливаем фокус клавииатуры на окно
  475.         ReSizeGLScene(width, height);                                   // Устанавливаем наше GL окно с перспективой
  476.  
  477.         if (!InitGL())                                                                  // Инициализируем наше GL окно
  478.         {
  479.                 KillGLWindow();                                                         // Инициализация дисплея
  480.                 MessageBoxA(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  481.                 return FALSE;                                                           // Возращает FALSE
  482.         }
  483.         //LoadTexture("Data/Mask1.bmp");
  484.         return TRUE;                                                                    // Успешное завершение инициализациии
  485. }
  486.  
  487.  
  488. LRESULT CALLBACK WndProc(       HWND    hWnd,                   // Указатель на окно
  489.                                 UINT    uMsg,                   // Сообщение для этого окна
  490.                                 WPARAM  wParam,                 // Параметры сообщения
  491.                                 LPARAM  lParam)                 // Параметры сообщения
  492. {
  493.         switch (uMsg)                                           // Проверим сообщения окна
  494.         {
  495.                 case WM_ACTIVATE:                               // Наблюдаем за сообщением об активизации окна
  496.                 {
  497.                         if (!HIWORD(wParam))                    // Проверим состояние минимизациии
  498.                         {
  499.                                 active=TRUE;                    // Программа активна
  500.                         }
  501.                         else
  502.                         {
  503.                                 active=FALSE;                   // Программа больше не активна
  504.                         }
  505.  
  506.                         return 0;                               // Вернуться к циклу сообщений
  507.                 }
  508.  
  509.                 case WM_SYSCOMMAND:                             // Перехватваем системную команду
  510.                 {
  511.                         switch (wParam)                         // Проверка выбора системы
  512.                         {
  513.                                 case SC_SCREENSAVE:             // Пытается включиться скринсэйвер?
  514.                                 case SC_MONITORPOWER:           // Монитор пытается переключитться в режим сохранения энергии?
  515.                                 return 0;                       // Не давать этому случиться
  516.                         }
  517.                         break;                                  // Выход
  518.                 }
  519.  
  520.                 case WM_CLOSE:                                  // Мы получили сообщение о закрытии программы?
  521.                 {
  522.                         PostQuitMessage(0);                     // Послать сообщение о выходе
  523.                         return 0;                               // Jump Back
  524.                 }
  525.  
  526.                 case WM_LBUTTONDOWN:                            // Did We Receive A Left Mouse Click?
  527.                 {
  528.                         bRender = !bRender;                     // Change Rendering State Between Fill/Wire Frame
  529.                         return 0;                               // Вернуться
  530.                 }
  531.  
  532.                 case WM_KEYDOWN:                                // Клавиша была нажата?
  533.                 {
  534.                         keys[wParam] = TRUE;                    // Если так – пометим это TRUE
  535.                         return 0;                               // Вернуться
  536.                 }
  537.  
  538.                 case WM_KEYUP:                                  // Клавиша была отпущена?
  539.                 {
  540.                         keys[wParam] = FALSE;                   // Если так – пометим это FALSE
  541.                         return 0;                               // Вернуться
  542.                 }
  543.  
  544.                 case WM_SIZE:                                   // Изменились окна OpenGL
  545.                 {
  546.                         ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));   // LoWord=ширина, HiWord=высота
  547.                         return 0;                               // Вернуться
  548.                 }
  549.         }
  550.         // Пересылаем все прочие сообщения в DefWindowProc
  551.         return DefWindowProc(hWnd,uMsg,wParam,lParam);
  552. }
  553.  
  554.  
  555. /*int WINAPI WinMain(   HINSTANCE       hInstance,              // Экземпляр
  556.                         HINSTANCE       hPrevInstance,          // Предыдущий экземпляр
  557.                         LPSTR           lpCmdLine,              // Параметры командной строки                  
  558.                         int             nCmdShow)               // Показать состояние окна*/
  559. int main(int argn, char * argc[])
  560. {
  561.         MSG             msg;                                    // Структура сообщения окна
  562.         BOOL    done=FALSE;                                     // Булевская переменная выхода из цикла
  563.  
  564.         // Запросим пользователя какой режим отображения он предпочитает
  565.         if (MessageBoxA(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)
  566.         {
  567.                 fullscreen=FALSE;                               // Оконный режим
  568.         }
  569.  
  570.         // Создадим наше окно OpenGL
  571.         if (!CreateGLWindow("Terrain", 640, 480, 16, fullscreen))
  572.         {
  573.                 return 0;                                       // Выходим если окно не было создано
  574.         }
  575.  
  576.         while(!done)                                            // Цикл, который продолжается пока done=FALSE       
  577.         {
  578.                 if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))       // Есть ожидаемое сообщение?
  579.                 {
  580.                         if (msg.message==WM_QUIT)               // Мы получили сообщение о выходе?
  581.                         {
  582.                                 done=TRUE;                      // Если так done=TRUE
  583.                         }
  584.                         else                                    // Если нет, продолжаем работать с сообщениями окна           
  585.                         {
  586.                                 TranslateMessage(&msg);         // Переводим сообщение
  587.                                 DispatchMessage(&msg);          // Отсылаем сообщение
  588.                         }
  589.                 }
  590.                 else                                            // Если сообщений нет
  591.                 {
  592.                         // Рисуем сцену. Ожидаем нажатия кнопки ESC и сообщения о выходе от DrawGLScene()            
  593.                         if ((active && !DrawGLScene()) || keys[VK_ESCAPE])      // Активно?  Было получено сообщение о выходе?
  594.                         {
  595.                                 done=TRUE;                      // ESC или DrawGLScene просигналили "выход"
  596.                         }
  597.                         else if (active)                        // Не время выходить, обновляем экран
  598.                         {
  599.                                 SwapBuffers(hDC);               // Переключаем буферы (Двойная буферизация)
  600.                         }
  601.  
  602.                         if (keys[VK_F1])                        // Была нажата кнопка F1?
  603.                         {
  604.                                 keys[VK_F1]=FALSE;              // Если так - установим значение FALSE
  605.                                 KillGLWindow();                 // Закроем текущее окно OpenGL  
  606.                                 fullscreen=!fullscreen;         // Переключим режим "Полный экран"/"Оконный"
  607.                                 // Заново создадим наше окно OpenGL
  608.                                 if (!CreateGLWindow("Terrain", 640, 480, 16, fullscreen))
  609.                                 {
  610.                                         return 0;               // Выйти, если окно не было создано
  611.                                 }
  612.                         }
  613.  
  614.                 if (keys[VK_UP])                        // Нажата клавиша ВВЕРХ?
  615.                                 scaleValue += 0.001f;   //      Увеличить переменную масштабирования
  616.  
  617.                         if (keys[VK_DOWN])                      // Нажата клавиша ВНИЗ?
  618.                                 scaleValue -= 0.001f;           // Уменьшить переменную масштабирования
  619.                 }
  620.         }
  621.  
  622.         // Shutdown
  623.         KillGLWindow();                                         // Закроем окно
  624.         return (msg.wParam);                                    // Выйдем из программы
  625. }