diff --git a/FPSCounter.cpp b/FPSCounter.cpp new file mode 100644 index 0000000..61144c3 --- /dev/null +++ b/FPSCounter.cpp @@ -0,0 +1,24 @@ +#include +#include + +class FPSCounter { +public: + FPSCounter() : frameCount(0), lastTime(std::chrono::high_resolution_clock::now()) {} + + void update() { + frameCount++; + auto currentTime = std::chrono::high_resolution_clock::now(); + std::chrono::duration elapsed = currentTime - lastTime; + + if (elapsed.count() >= 1.0) { + double fps = frameCount / elapsed.count(); + std::cout << "FPS: " << fps << std::endl; + frameCount = 0; + lastTime = currentTime; + } + } + +private: + int frameCount; + std::chrono::time_point lastTime; +}; diff --git a/grafikaKBT.vcxproj b/grafikaKBT.vcxproj index 403c19e..a6076de 100644 --- a/grafikaKBT.vcxproj +++ b/grafikaKBT.vcxproj @@ -121,6 +121,7 @@ + diff --git a/grafikaKBT.vcxproj.filters b/grafikaKBT.vcxproj.filters index 15876af..5e31f23 100644 --- a/grafikaKBT.vcxproj.filters +++ b/grafikaKBT.vcxproj.filters @@ -33,6 +33,9 @@ Source Files + + Source Files + diff --git a/main.cpp b/main.cpp index 1684580..d798968 100644 --- a/main.cpp +++ b/main.cpp @@ -31,6 +31,7 @@ #include "GL/glfw3.h" #include #include "timeh.hpp" +#include "FPSCounter.cpp" using namespace glm; @@ -113,8 +114,9 @@ void RotateRoverAndCamera(float angle) { */ //Zmienne do ruchu ##############################################^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +FPSCounter fpsCounter; - +//Fps counter bool keyWPressed = false; bool keySPressed = false; @@ -133,7 +135,10 @@ 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; - +float rotationVelocity = 0.0f; // Prędkość obrotu łazika +const float rotationAcceleration = 0.1f; // Przyspieszenie obrotu +const float rotationFriction = 0.05f; // Współczynnik tarcia obrotu +const float maxRotationSpeed = 5.0f; // Maksymalna prędkość obrotu @@ -167,17 +172,18 @@ void RotateRoverAndCamera(float angle) { } void UpdateRover() { - // Przyspieszanie + // Przyspieszanie w przód if (keyWPressed) { velocity += acceleration; if (velocity > maxSpeed) velocity = maxSpeed; } + // Przyspieszanie w tył else if (keySPressed) { velocity -= acceleration; if (velocity < -maxSpeed) velocity = -maxSpeed; } + // Hamowanie (wytracanie prędkości z powodu tarcia) else { - // Hamowanie (wytracanie prędkości z powodu tarcia) if (velocity > 0) { velocity -= friction; if (velocity < 0) velocity = 0; @@ -190,16 +196,34 @@ void UpdateRover() { // Obracanie if (keyAPressed) { - RotateRoverAndCamera(3.0f); + rotationVelocity += rotationAcceleration; + if (rotationVelocity > maxRotationSpeed) rotationVelocity = maxRotationSpeed; } else if (keyDPressed) { - RotateRoverAndCamera(-3.0f); + rotationVelocity -= rotationAcceleration; + if (rotationVelocity < -maxRotationSpeed) rotationVelocity = -maxRotationSpeed; + } + else { + // Hamowanie obrotu (wytracanie prędkości z powodu tarcia) + if (rotationVelocity > 0) { + rotationVelocity -= rotationFriction; + if (rotationVelocity < 0) rotationVelocity = 0; + } + else if (rotationVelocity < 0) { + rotationVelocity += rotationFriction; + if (rotationVelocity > 0) rotationVelocity = 0; + } } // Aktualizacja pozycji na podstawie prędkości float radRotation = Rotation * GL_PI / 180.0f; - Sides-= velocity * cos(radRotation); - Foward-= velocity * sin(radRotation); + Sides -= velocity * cos(radRotation); + Foward -= velocity * sin(radRotation); + + // Aktualizacja kąta obrotu + Rotation += rotationVelocity; + if (Rotation >= 360.0f) Rotation -= 360.0f; + if (Rotation < 0.0f) Rotation += 360.0f; } // Change viewing volume and viewport. Called when window is resized @@ -433,7 +457,7 @@ void RenderScene(void) { // prymitywny licznik FPS if (monitormode) { std::time_t now_t = std::time(nullptr); - yRot -= 1; // showcase demo + yRot -= 10; // showcase demo if (now_t > monitormodehelper) { std::cout << (int)(monitormodecounter / (now_t - monitormodehelper)) << " fps\n"; monitormodehelper = now_t; @@ -483,7 +507,7 @@ void RenderScene(void) { user.draw(); UpdateRover(); glPopMatrix(); - + fpsCounter.update(); // Zamiana buforów (double buffering) @@ -573,69 +597,88 @@ HPALETTE GetOpenGLPalette(HDC hDC) { // Return the handle to the new palette return hRetPal; } - -int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { - - MSG msg; // Windows message structure - WNDCLASS wc; // Windows class structure - HWND hWnd; // Storeage for window handle - - - hInstance = hInst; - - // Register Window style - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = (WNDPROC)WndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = NULL; - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - - // No need for background brush for OpenGL window - wc.hbrBackground = NULL; - - wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); - wc.lpszClassName = lpszAppName; - - // Register the window class - if (RegisterClass(&wc) == 0) return FALSE; - - - // Create the main application window - hWnd = CreateWindow( - lpszAppName, - lpszAppName, - - // OpenGL requires WS_CLIPCHILDREN and WS_CLIPSIBLINGS - WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, - - // Window position and size - 50, 50, - 400, 400, - NULL, - NULL, - hInstance, - NULL); - - // If window was not created, quit - 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); - - // Process application messages until the application closes - while (GetMessage(&msg, NULL, 0, 0)) { - TranslateMessage(&msg); - DispatchMessage(&msg); +void CreateConsole() +{ + // Tworzenie nowej konsoli + if (AllocConsole()) + { + // Przekierowanie standardowych strumieni do konsoli + FILE* conin; + FILE* conout; + FILE* conerr; + freopen_s(&conin, "conin$", "r", stdin); + freopen_s(&conout, "conout$", "w", stdout); + freopen_s(&conerr, "conout$", "w", stderr); + } + else + { + MessageBox(NULL, "Nie udało się utworzyć konsoli.", "Błąd", MB_OK | MB_ICONERROR); } - - return msg.wParam; } + int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { + CreateConsole(); + MSG msg; // Windows message structure + WNDCLASS wc; // Windows class structure + HWND hWnd; // Storeage for window handle + + + hInstance = hInst; + + // Register Window style + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = (WNDPROC)WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInstance; + wc.hIcon = NULL; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + + // No need for background brush for OpenGL window + wc.hbrBackground = NULL; + + wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); + wc.lpszClassName = lpszAppName; + + // Register the window class + if (RegisterClass(&wc) == 0) return FALSE; + + + // Create the main application window + hWnd = CreateWindow( + lpszAppName, + lpszAppName, + + // OpenGL requires WS_CLIPCHILDREN and WS_CLIPSIBLINGS + WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, + + // Window position and size + 50, 50, + 800, 800, + NULL, + NULL, + hInstance, + NULL); + + // If window was not created, quit + 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); + + // Process application messages until the application closes + while (GetMessage(&msg, NULL, 0, 0)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + return msg.wParam; + } // Window procedure, handles all messages for this program @@ -950,4 +993,4 @@ BOOL APIENTRY AboutDlgProc(HWND hDlg, UINT message, UINT wParam, LONG lParam) { } return FALSE; -} \ No newline at end of file +}