From 039435ed73271f28f788611d05222199a5a58e52 Mon Sep 17 00:00:00 2001 From: Pc Date: Tue, 7 Jan 2025 20:49:20 +0100 Subject: [PATCH] Sterowanie na ocene chyba 5.0 ? --- main.cpp | 566 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 339 insertions(+), 227 deletions(-) diff --git a/main.cpp b/main.cpp index 306b8c1..1684580 100644 --- a/main.cpp +++ b/main.cpp @@ -60,7 +60,7 @@ static GLsizei lastWidth; // Opis tekstury BITMAPINFOHEADER bitmapInfoHeader; // nagłówek obrazu -unsigned char* bitmapData; // dane tekstury +unsigned char* bitmapData; // dane tekstury unsigned int texture[2]; // obiekt tekstury LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); @@ -76,7 +76,7 @@ int monitormodecounter = 0; std::time_t monitormodehelper; //Zmienne do ruchu ############################################## - +/* float Foward = 0.0f; // Pozycja łazika w przód/tył float Sides = 0.0f; // Pozycja łazika w lewo/prawo float Rotation = 0.0f; // Rotacja łazika (w stopniach) @@ -110,6 +110,97 @@ void RotateRoverAndCamera(float angle) { if (Rotation >= 360.0f) Rotation -= 360.0f; if (Rotation < 0.0f) Rotation += 360.0f; } +*/ +//Zmienne do ruchu ##############################################^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + + + +bool keyWPressed = false; +bool keySPressed = false; +bool keyAPressed = false; +bool keyDPressed = false; + +float Foward = 0.0f; // Pozycja łazika w przód/tył +float Sides = 0.0f; // Pozycja łazika w lewo/prawo +float Rotation = 0.0f; // Rotacja łazika (w stopniach) + +float CameraHeight = 50.0f; // Wysokość kamery +float MoveSpeed = 1.0f; // Prędkość poruszania się + + +float velocity = 0.0f; // Aktualna prędkość łazika +const float friction = 0.1f; // Współczynnik tarcia (μ) +const float maxSpeed = 3.0f; // Maksymalna prędkość łazika +const float acceleration = 0.1f; + + + + + +// Funkcja do poruszania łazikiem +void MoveRover(bool forward) { + // Zamieniamy kąt na radiany + float radRotation = Rotation * GL_PI / 180.0f; + + // Wektor ruchu w kierunku przód/tył (kierunek łazika) + float moveX = cos(radRotation); + float moveZ = sin(radRotation); + + // Ruch w przód + if (forward) { + Sides -= MoveSpeed * moveX; + Foward -= MoveSpeed * moveZ; + } + // Ruch w tył + else { + Sides += MoveSpeed * moveX; + Foward += MoveSpeed * moveZ; + } +} + +// Funkcja do obracania łazika wokół osi Y +void RotateRoverAndCamera(float angle) { + Rotation += angle; + if (Rotation >= 360.0f) Rotation -= 360.0f; + if (Rotation < 0.0f) Rotation += 360.0f; +} + +void UpdateRover() { + // Przyspieszanie + if (keyWPressed) { + velocity += acceleration; + if (velocity > maxSpeed) velocity = maxSpeed; + } + else if (keySPressed) { + velocity -= acceleration; + if (velocity < -maxSpeed) velocity = -maxSpeed; + } + else { + // Hamowanie (wytracanie prędkości z powodu tarcia) + if (velocity > 0) { + velocity -= friction; + if (velocity < 0) velocity = 0; + } + else if (velocity < 0) { + velocity += friction; + if (velocity > 0) velocity = 0; + } + } + + // Obracanie + if (keyAPressed) { + RotateRoverAndCamera(3.0f); + } + else if (keyDPressed) { + RotateRoverAndCamera(-3.0f); + } + + // Aktualizacja pozycji na podstawie prędkości + float radRotation = Rotation * GL_PI / 180.0f; + Sides-= velocity * cos(radRotation); + Foward-= velocity * sin(radRotation); +} // Change viewing volume and viewport. Called when window is resized void ChangeSize(GLsizei w, GLsizei h) { @@ -153,7 +244,7 @@ void ChangeSize(GLsizei w, GLsizei h) { unsigned char* LoadBitmapFile(char* filename, BITMAPINFOHEADER* bitmapInfoHeader) { FILE* filePtr; // wskaźnik pozycji pliku BITMAPFILEHEADER bitmapFileHeader; // nagłówek pliku - unsigned char* bitmapImage; // dane obrazu + unsigned char* bitmapImage; // dane obrazu int imageIdx = 0; // licznik pikseli unsigned char tempRGB; // zmienna zamiany składowych @@ -238,7 +329,7 @@ void SetDCPixelFormat(HDC hDC) { } lazik user(10.0f, 0.0f, 0.0f, "res/models/lazik4.obj"); -plane mapa(0.0f, 0.0f, 0.0f, "res/models/mapka2.obj"); +plane mapa(0.0f, 0.0f, 0.0f, "res/models/mapka2.obj"); void SetupRC() { // Light values and coordinates @@ -278,7 +369,7 @@ void SetupRC() { // White background glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // Black brush - + glColor3f(0.0, 0.0, 0.0); // Initialize GLEW @@ -295,7 +386,7 @@ void SetupRC() { // do przepisania kodu na podobny do tego stąd: // https://github.com/opengl-tutorials/ogl/blob/master/tutorial07_model_loading/tutorial07.cpp timestampedCout("Inicjalizowanie GLFW3..."); - if(!glfwInit()) { + if (!glfwInit()) { timestampedCout("Failed to initialize GLFW"); } timestampedCout("Zainicjalizowano GLFW3."); @@ -332,11 +423,11 @@ void RenderScene(void) { // ); switch (polygonmode) { - case 1: - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - break; - default: - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + case 1: + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + break; + default: + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } // prymitywny licznik FPS @@ -370,9 +461,9 @@ void RenderScene(void) { //Sterowanie //############################################################################################ gluLookAt( - Foward - 50.0f * sin((Rotation + 180.0f) * GL_PI / 180.0f), // Pozycja kamery wokół łazika (w poziomie) + Foward - 100.0f * sin((Rotation + 180.0f) * GL_PI / 180.0f), // Pozycja kamery wokół łazika (w poziomie) CameraHeight, // Wysokość kamery - Sides - 50.0f * cos((Rotation + 180.0f) * GL_PI / 180.0f), // Kamera wzdłuż osi X i Z + Sides - 100.0f * cos((Rotation + 180.0f) * GL_PI / 180.0f), // Kamera wzdłuż osi X i Z Foward, 0.0f, Sides, // Punkt, na który patrzy kamera (łazik) 0.0f, 1.0f, 0.0f // Wektor "góry" ); @@ -385,15 +476,17 @@ void RenderScene(void) { // Rysowanie łazika (porusza się i obraca) glPushMatrix(); + glTranslatef(Foward, 0.0f, Sides); // Translacja łazika na jego pozycję glRotatef(Rotation, 0.0f, 1.0f, 0.0f); // Obrót łazika wokół własnej osi glColor3f(1.0, 0.0, 0.0); // Czerwony kolor dla łazika user.draw(); + UpdateRover(); glPopMatrix(); // Zamiana buforów (double buffering) - + // Swap buffers //glfwSwapBuffers(window); @@ -487,6 +580,7 @@ int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, WNDCLASS wc; // Windows class structure HWND hWnd; // Storeage for window handle + hInstance = hInst; // Register Window style @@ -528,6 +622,8 @@ int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, if (hWnd == NULL) return FALSE; + const WORD ID_TIMER = 1; + SetTimer(hWnd, ID_TIMER, 100, NULL); // Display the window ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); @@ -547,243 +643,259 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) static HGLRC hRC; // Permenant Rendering context static HDC hDC; // Private GDI Device context -float radRotation = Rotation * GL_PI / 180.0f; + float radRotation = Rotation * GL_PI / 180.0f; switch (message) { // Window creation, setup for OpenGL - case WM_CREATE: - // Store the device context - hDC = GetDC(hWnd); + case WM_CREATE: + // Store the device context + hDC = GetDC(hWnd); - // Select the pixel format - SetDCPixelFormat(hDC); + // Select the pixel format + SetDCPixelFormat(hDC); - // Create palette if needed - hPalette = GetOpenGLPalette(hDC); + // Create palette if needed + hPalette = GetOpenGLPalette(hDC); - // Create the rendering context and make it current - hRC = wglCreateContext(hDC); - wglMakeCurrent(hDC, hRC); - SetupRC(); - - /* - glGenTextures(2, &texture[0]); // tworzy obiekt tekstury + // Create the rendering context and make it current + hRC = wglCreateContext(hDC); + wglMakeCurrent(hDC, hRC); + SetupRC(); - // ładuje pierwszy obraz tekstury: - bitmapData = LoadBitmapFile((char*)"Bitmapy\\checker.bmp", &bitmapInfoHeader); + /* + glGenTextures(2, &texture[0]); // tworzy obiekt tekstury - glBindTexture(GL_TEXTURE_2D, texture[0]); // aktywuje obiekt tekstury + // ładuje pierwszy obraz tekstury: + bitmapData = LoadBitmapFile((char*)"Bitmapy\\checker.bmp", &bitmapInfoHeader); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glBindTexture(GL_TEXTURE_2D, texture[0]); // aktywuje obiekt tekstury - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - // tworzy obraz tekstury - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bitmapInfoHeader.biWidth, - bitmapInfoHeader.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapData); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - if (bitmapData) free(bitmapData); + // tworzy obraz tekstury + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bitmapInfoHeader.biWidth, + bitmapInfoHeader.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapData); - // ładuje drugi obraz tekstury: - bitmapData = LoadBitmapFile((char*)"Bitmapy\\crate.bmp", &bitmapInfoHeader); - glBindTexture(GL_TEXTURE_2D, texture[1]); // aktywuje obiekt tekstury + if (bitmapData) free(bitmapData); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + // ładuje drugi obraz tekstury: + bitmapData = LoadBitmapFile((char*)"Bitmapy\\crate.bmp", &bitmapInfoHeader); + glBindTexture(GL_TEXTURE_2D, texture[1]); // aktywuje obiekt tekstury - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - // tworzy obraz tekstury - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bitmapInfoHeader.biWidth, - bitmapInfoHeader.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapData); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - if (bitmapData) free(bitmapData); + // tworzy obraz tekstury + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bitmapInfoHeader.biWidth, + bitmapInfoHeader.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapData); - // ustalenie sposobu mieszania tekstury z tłem - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + if (bitmapData) free(bitmapData); - */ - break; + // ustalenie sposobu mieszania tekstury z tłem + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + + */ + break; // Window is being destroyed, cleanup - case WM_DESTROY: - // Deselect the current rendering context and delete it - wglMakeCurrent(hDC, NULL); - wglDeleteContext(hRC); + case WM_DESTROY: + // Deselect the current rendering context and delete it + wglMakeCurrent(hDC, NULL); + wglDeleteContext(hRC); - // Delete the palette if it was created - if (hPalette != NULL) DeleteObject(hPalette); + // Delete the palette if it was created + if (hPalette != NULL) DeleteObject(hPalette); - // Tell the application to terminate after the window - // is gone. - PostQuitMessage(0); - break; + // Tell the application to terminate after the window + // is gone. + PostQuitMessage(0); + break; // Window is resized. - case WM_SIZE: - // Call our function which modifies the clipping - // volume and viewport - ChangeSize(LOWORD(lParam), HIWORD(lParam)); - break; + case WM_SIZE: + // Call our function which modifies the clipping + // volume and viewport + ChangeSize(LOWORD(lParam), HIWORD(lParam)); + break; // The painting function. This message sent by Windows // whenever the screen needs updating. - case WM_PAINT: - // Call OpenGL drawing code - RenderScene(); + case WM_PAINT: + // Call OpenGL drawing code + RenderScene(); - SwapBuffers(hDC); + SwapBuffers(hDC); - // Validate the newly painted client area - if (!monitormode) ValidateRect(hWnd, NULL); - else InvalidateRect(hWnd, NULL, FALSE); - break; + // Validate the newly painted client area + if (!monitormode) ValidateRect(hWnd, NULL); + else InvalidateRect(hWnd, NULL, FALSE); + break; // Windows is telling the application that it may modify // the system palette. This message in essance asks the // application for a new palette. - case WM_QUERYNEWPALETTE: - // If the palette was created. - if (hPalette) { - int nRet; + case WM_QUERYNEWPALETTE: + // If the palette was created. + if (hPalette) { + int nRet; - // Selects the palette into the current device context - SelectPalette(hDC, hPalette, FALSE); + // Selects the palette into the current device context + SelectPalette(hDC, hPalette, FALSE); - // Map entries from the currently selected palette to - // the system palette. The return value is the number - // of palette entries modified. - nRet = RealizePalette(hDC); + // Map entries from the currently selected palette to + // the system palette. The return value is the number + // of palette entries modified. + nRet = RealizePalette(hDC); - // Repaint, forces remap of palette in current window - InvalidateRect(hWnd, NULL, FALSE); + // Repaint, forces remap of palette in current window + InvalidateRect(hWnd, NULL, FALSE); - return nRet; - } - break; + return nRet; + } + break; // This window may set the palette, even though it is not the // currently active window. - case WM_PALETTECHANGED: - // Don't do anything if the palette does not exist, or if - // this is the window that changed the palette. - if ((hPalette != NULL) && ((HWND)wParam != hWnd)) { - // Select the palette into the device context - SelectPalette(hDC, hPalette, FALSE); + case WM_PALETTECHANGED: + // Don't do anything if the palette does not exist, or if + // this is the window that changed the palette. + if ((hPalette != NULL) && ((HWND)wParam != hWnd)) { + // Select the palette into the device context + SelectPalette(hDC, hPalette, FALSE); - // Map entries to system palette - RealizePalette(hDC); + // Map entries to system palette + RealizePalette(hDC); - // Remap the current colors to the newly realized palette - UpdateColors(hDC); - return 0; - } + // Remap the current colors to the newly realized palette + UpdateColors(hDC); + return 0; + } + break; + case WM_KEYUP: + switch (wParam) { + case 'W': + keyWPressed = false; + break; + case 'S': + keySPressed = false; + break; + case 'A': + keyAPressed = false; + break; + case 'D': + keyDPressed = false; + break; + // Obsługa innych klawiszy + } + break; + + + case WM_KEYDOWN: + + + + switch (wParam) { + + case VK_UP: + xRot -= 5.0f; break; - // Key press, check for arrow keys to do cube rotation. - case WM_KEYDOWN: - - switch (wParam) { - case VK_UP: - xRot -= 5.0f; - break; - - case VK_DOWN: - xRot += 5.0f; - break; - - case VK_LEFT: - yRot -= 5.0f; - break; - - case VK_RIGHT: - yRot += 5.0f; - break; - - case 'Q': - zRot += 5.0f; - break; - - case 'E': - zRot -= 5.0f; - break; - - case 'R': - xRot = 0; - yRot = 0; - zRot = 0; - break; - - case ' ': // 32 - polygonmode = !polygonmode; - if (polygonmode) timestampedCout("Uwaga! Tryb wireframe jest niewydajny i powinien sluzyc tylko do debugowania!"); - break; - - case 'W': // Ruch w przód - MoveRover(true); - break; - case 'S': // Ruch w tył - MoveRover(false); - break; - - case 'A': // Obrót w lewo - RotateRoverAndCamera(5.0f); // Obrót łazika i kamery w lewo - break; - case 'D': // Obrót w prawo - RotateRoverAndCamera(-5.0f); // Obrót łazika i kamery w prawo - break; - - case 'J': // Obrót w lewo (wokół własnej osi) - Rotation += 5.0f; - if (Rotation > 360.0f || Rotation < 0.0f) Rotation -= 360.0f; - break; - case 'K': // Obrót w prawo (wokół własnej osi) - Rotation -= 5.0f; - if (Rotation > 360.0f || Rotation < 0.0f) Rotation += 360.0f; - break; - - case 114: // F3 - monitormode = !monitormode; - if (monitormode) { - monitormodehelper = std::time(nullptr) - 1; - timestampedCout("Wlaczono tryb monitorowania wydajnosci."); - } - if (!monitormode) timestampedCout("Wylaczono tryb monitorowania wydajnosci."); - break; - - default: - timestampedCout("Nacisnieto nierozpoznany klawisz: " << (int)wParam); - } - - xRot = (const int)xRot % 360; - yRot = (const int)yRot % 360; - zRot = (const int)zRot % 360; - - InvalidateRect(hWnd, NULL, FALSE); + case VK_DOWN: + xRot += 5.0f; break; + case VK_LEFT: + yRot -= 5.0f; + break; + + case VK_RIGHT: + yRot += 5.0f; + break; + + case 'Q': + zRot += 5.0f; + break; + + case 'E': + zRot -= 5.0f; + break; + + case 'R': + xRot = 0; + yRot = 0; + zRot = 0; + break; + + case ' ': // 32 + polygonmode = !polygonmode; + if (polygonmode) timestampedCout("Uwaga! Tryb wireframe jest niewydajny i powinien sluzyc tylko do debugowania!"); + break; + + case 'W': + keyWPressed = true; + break; + case 'S': + keySPressed = true; + break; + case 'A': + keyAPressed = true; + break; + case 'D': + keyDPressed = true; + break; + + case 114: // F3 + monitormode = !monitormode; + if (monitormode) { + monitormodehelper = std::time(nullptr) - 1; + timestampedCout("Wlaczono tryb monitorowania wydajnosci."); + } + if (!monitormode) timestampedCout("Wylaczono tryb monitorowania wydajnosci."); + break; + + default: + timestampedCout("Nacisnieto nierozpoznany klawisz: " << (int)wParam); + } + + xRot = (const int)xRot % 360; + yRot = (const int)yRot % 360; + zRot = (const int)zRot % 360; + + InvalidateRect(hWnd, NULL, FALSE); + break; + // A menu command - case WM_COMMAND: + case WM_COMMAND: - switch (LOWORD(wParam)) { + switch (LOWORD(wParam)) { - // Exit the program - case ID_FILE_EXIT: - DestroyWindow(hWnd); - break; - - // Display the about box - case ID_HELP_ABOUT: - DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_ABOUT), hWnd, (DLGPROC)AboutDlgProc); - break; - - } + // Exit the program + case ID_FILE_EXIT: + DestroyWindow(hWnd); break; - default: // Passes it on if unproccessed - return (DefWindowProc(hWnd, message, wParam, lParam)); + // Display the about box + case ID_HELP_ABOUT: + DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_ABOUT), hWnd, (DLGPROC)AboutDlgProc); + break; + + } + break; + case WM_TIMER: + { + RenderScene(); + SwapBuffers(hDC); + ValidateRect(hWnd, NULL); + break; + } + default: // Passes it on if unproccessed + return (DefWindowProc(hWnd, message, wParam, lParam)); } return (0L); @@ -794,46 +906,46 @@ BOOL APIENTRY AboutDlgProc(HWND hDlg, UINT message, UINT wParam, LONG lParam) { switch (message) { // Initialize the dialog box - case WM_INITDIALOG: - int i; - GLenum glError; + case WM_INITDIALOG: + int i; + GLenum glError; - // glGetString demo - SetDlgItemText(hDlg, IDC_OPENGL_VENDOR, reinterpret_cast(glGetString(GL_VENDOR))); - SetDlgItemText(hDlg, IDC_OPENGL_RENDERER, (LPCSTR)glGetString(GL_RENDERER)); - SetDlgItemText(hDlg, IDC_OPENGL_VERSION, (LPCSTR)glGetString(GL_VERSION)); - SetDlgItemText(hDlg, IDC_OPENGL_EXTENSIONS, (LPCSTR)glGetString(GL_EXTENSIONS)); + // glGetString demo + SetDlgItemText(hDlg, IDC_OPENGL_VENDOR, reinterpret_cast(glGetString(GL_VENDOR))); + SetDlgItemText(hDlg, IDC_OPENGL_RENDERER, (LPCSTR)glGetString(GL_RENDERER)); + SetDlgItemText(hDlg, IDC_OPENGL_VERSION, (LPCSTR)glGetString(GL_VERSION)); + SetDlgItemText(hDlg, IDC_OPENGL_EXTENSIONS, (LPCSTR)glGetString(GL_EXTENSIONS)); - // gluGetString demo - SetDlgItemText(hDlg, IDC_GLU_VERSION, (LPCSTR)gluGetString(GLU_VERSION)); - SetDlgItemText(hDlg, IDC_GLU_EXTENSIONS, (LPCSTR)gluGetString(GLU_EXTENSIONS)); + // gluGetString demo + SetDlgItemText(hDlg, IDC_GLU_VERSION, (LPCSTR)gluGetString(GLU_VERSION)); + SetDlgItemText(hDlg, IDC_GLU_EXTENSIONS, (LPCSTR)gluGetString(GLU_EXTENSIONS)); - // Display any recent error messages - i = 0; - do { - glError = glGetError(); - SetDlgItemText(hDlg, IDC_ERROR1 + i, (LPCSTR)gluErrorString(glError)); - i++; - } while (i < 6 && glError != GL_NO_ERROR); + // Display any recent error messages + i = 0; + do { + glError = glGetError(); + SetDlgItemText(hDlg, IDC_ERROR1 + i, (LPCSTR)gluErrorString(glError)); + i++; + } while (i < 6 && glError != GL_NO_ERROR); - return (TRUE); + return (TRUE); - break; + break; // Process command messages - case WM_COMMAND: + case WM_COMMAND: - // Validate and Make the changes - if (LOWORD(wParam) == IDOK) EndDialog(hDlg, TRUE); - break; + // Validate and Make the changes + if (LOWORD(wParam) == IDOK) EndDialog(hDlg, TRUE); + break; // Closed from sysbox - case WM_CLOSE: + case WM_CLOSE: - EndDialog(hDlg, TRUE); - break; + EndDialog(hDlg, TRUE); + break; }