|
|
|
|
@@ -31,6 +31,8 @@
|
|
|
|
|
#include "GL/glfw3.h"
|
|
|
|
|
#include <ctime>
|
|
|
|
|
#include "timeh.hpp"
|
|
|
|
|
#include "FPSCounter.cpp"
|
|
|
|
|
#include <thread>
|
|
|
|
|
|
|
|
|
|
using namespace glm;
|
|
|
|
|
|
|
|
|
|
@@ -71,51 +73,29 @@ void SetDCPixelFormat(HDC hDC);
|
|
|
|
|
|
|
|
|
|
int polygonmode = 0;
|
|
|
|
|
std::time_t lastTime = std::time(nullptr);
|
|
|
|
|
int monitormode = 0;
|
|
|
|
|
int monitormode = 1;
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
// Zmienne do sterowania kamerą
|
|
|
|
|
float CameraHeight = 50.0f; // Wysokość kamery
|
|
|
|
|
|
|
|
|
|
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 -= 1.1f * moveX;
|
|
|
|
|
Foward -= 1.1f * moveZ;
|
|
|
|
|
}
|
|
|
|
|
// Ruch w tył
|
|
|
|
|
else {
|
|
|
|
|
Sides += 1.1f * moveX;
|
|
|
|
|
Foward += 1.1f * moveZ;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Funkcja do obrotu kamery i łazika (A/D)
|
|
|
|
|
void RotateRoverAndCamera(float angle) {
|
|
|
|
|
Rotation += angle;
|
|
|
|
|
if (Rotation >= 360.0f) Rotation -= 360.0f;
|
|
|
|
|
if (Rotation < 0.0f) Rotation += 360.0f;
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
//Zmienne do ruchu ##############################################^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
FPSCounter fpsCounter;
|
|
|
|
|
static const int targetFPS = 144; // Celowany FPS
|
|
|
|
|
//Fps counter
|
|
|
|
|
void LimitFPS(int targetFPS) {
|
|
|
|
|
static auto lastTime = std::chrono::high_resolution_clock::now();
|
|
|
|
|
auto currentTime = std::chrono::high_resolution_clock::now();
|
|
|
|
|
std::chrono::duration<double> elapsed = currentTime - lastTime;
|
|
|
|
|
|
|
|
|
|
// Jeśli upłynęło za mało czasu, aby osiągnąć target FPS, czekamy
|
|
|
|
|
double frameTime = 1.0 / targetFPS; // Czas na jedną klatkę w sekundach
|
|
|
|
|
if (elapsed.count() < frameTime) {
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::duration<double>(frameTime - elapsed.count()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lastTime = std::chrono::high_resolution_clock::now();
|
|
|
|
|
}
|
|
|
|
|
bool keyWPressed = false;
|
|
|
|
|
bool keySPressed = false;
|
|
|
|
|
bool keyAPressed = false;
|
|
|
|
|
@@ -130,10 +110,13 @@ 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 friction = 0.05f; // Współczynnik tarcia (μ)
|
|
|
|
|
const float maxSpeed = 3.0f; // Maksymalna prędkość łazika
|
|
|
|
|
const float acceleration = 0.1f;
|
|
|
|
|
|
|
|
|
|
const float acceleration = 0.2f;
|
|
|
|
|
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 = 3.0f; // Maksymalna prędkość obrotu
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -167,17 +150,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;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
// Hamowanie (wytracanie prędkości z powodu tarcia)
|
|
|
|
|
else {
|
|
|
|
|
if (velocity > 0) {
|
|
|
|
|
velocity -= friction;
|
|
|
|
|
if (velocity < 0) velocity = 0;
|
|
|
|
|
@@ -190,16 +174,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);
|
|
|
|
|
|
|
|
|
|
// 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
|
|
|
|
|
@@ -430,19 +432,7 @@ void RenderScene(void) {
|
|
|
|
|
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// prymitywny licznik FPS
|
|
|
|
|
if (monitormode) {
|
|
|
|
|
std::time_t now_t = std::time(nullptr);
|
|
|
|
|
yRot -= 1; // showcase demo
|
|
|
|
|
if (now_t > monitormodehelper) {
|
|
|
|
|
std::cout << (int)(monitormodecounter / (now_t - monitormodehelper)) << " fps\n";
|
|
|
|
|
monitormodehelper = now_t;
|
|
|
|
|
monitormodecounter = 0;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
monitormodecounter++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Clear the screen
|
|
|
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
|
|
|
@@ -483,7 +473,7 @@ void RenderScene(void) {
|
|
|
|
|
user.draw();
|
|
|
|
|
UpdateRover();
|
|
|
|
|
glPopMatrix();
|
|
|
|
|
|
|
|
|
|
fpsCounter.update();
|
|
|
|
|
|
|
|
|
|
// Zamiana buforów (double buffering)
|
|
|
|
|
|
|
|
|
|
@@ -573,9 +563,26 @@ HPALETTE GetOpenGLPalette(HDC hDC) {
|
|
|
|
|
// Return the handle to the new palette
|
|
|
|
|
return hRetPal;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
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
|
|
|
|
|
@@ -612,7 +619,7 @@ int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
|
|
|
|
|
|
|
|
|
|
// Window position and size
|
|
|
|
|
50, 50,
|
|
|
|
|
400, 400,
|
|
|
|
|
800, 800,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
hInstance,
|
|
|
|
|
@@ -625,6 +632,8 @@ int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
|
|
|
|
|
const WORD ID_TIMER = 1;
|
|
|
|
|
SetTimer(hWnd, ID_TIMER, 100, NULL);
|
|
|
|
|
// Display the window
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ShowWindow(hWnd, SW_SHOW);
|
|
|
|
|
UpdateWindow(hWnd);
|
|
|
|
|
|
|
|
|
|
@@ -733,13 +742,19 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
|
|
|
SwapBuffers(hDC);
|
|
|
|
|
|
|
|
|
|
// Validate the newly painted client area
|
|
|
|
|
if (!monitormode) ValidateRect(hWnd, NULL);
|
|
|
|
|
else InvalidateRect(hWnd, NULL, FALSE);
|
|
|
|
|
break;
|
|
|
|
|
if (!monitormode) {
|
|
|
|
|
ValidateRect(hWnd, NULL);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
InvalidateRect(hWnd, NULL, FALSE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Windows is telling the application that it may modify
|
|
|
|
|
// the system palette. This message in essance asks the
|
|
|
|
|
// application for a new palette.
|
|
|
|
|
// Limit FPS
|
|
|
|
|
LimitFPS(targetFPS);
|
|
|
|
|
|
|
|
|
|
// Update FPS counter
|
|
|
|
|
fpsCounter.update();
|
|
|
|
|
break;
|
|
|
|
|
case WM_QUERYNEWPALETTE:
|
|
|
|
|
// If the palette was created.
|
|
|
|
|
if (hPalette) {
|
|
|
|
|
@@ -850,14 +865,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
|
|
|
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);
|
|
|
|
|
|