Compare commits
3 Commits
2602b9a523
...
780e852596
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
780e852596 | ||
|
|
177bb7133a | ||
|
|
739ba9f1a4 |
197
main.cpp
197
main.cpp
@@ -116,10 +116,11 @@ float Sides = -45.0f; // Pozycja łazika w lewo/prawo
|
|||||||
float Rotation = 270.0f; // Rotacja łazika (w stopniach)
|
float Rotation = 270.0f; // Rotacja łazika (w stopniach)
|
||||||
|
|
||||||
|
|
||||||
|
bool fpv_view = false; // Flaga widoku z pierwszej osoby
|
||||||
|
|
||||||
const float MinDistance = 20.0f;
|
const float MinDistance = 20.0f;
|
||||||
const float MaxDistance = 1000.0f;
|
const float MaxDistance = 1000.0f;
|
||||||
float CameraHeight = 50.0f; // Wysokość kamery
|
float CameraHeight = 150.0f; // Wysokość kamery
|
||||||
float MoveSpeed = 0.5f; // Prędkość poruszania się
|
float MoveSpeed = 0.5f; // Prędkość poruszania się
|
||||||
|
|
||||||
|
|
||||||
@@ -430,6 +431,10 @@ lazik user(10.0f, 0.0f, 0.0f, "res/models/lazik4.obj"); // obiekty eksportujemy
|
|||||||
plane mapa( 0.0f, 0.0f, 0.0f, "res/models/mapka3_nofence_noplatform.obj");
|
plane mapa( 0.0f, 0.0f, 0.0f, "res/models/mapka3_nofence_noplatform.obj");
|
||||||
|
|
||||||
static void SetupRC() {
|
static void SetupRC() {
|
||||||
|
|
||||||
|
glEnable(GL_MULTISAMPLE); //
|
||||||
|
glEnable(GL_LINE_SMOOTH);
|
||||||
|
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
|
||||||
// Light values and coordinates
|
// Light values and coordinates
|
||||||
GLfloat ambientLight[] = {0.3f, 0.3f, 0.3f, 1.0f};
|
GLfloat ambientLight[] = {0.3f, 0.3f, 0.3f, 1.0f};
|
||||||
GLfloat diffuseLight[] = {0.7f, 0.7f, 0.7f, 1.0f};
|
GLfloat diffuseLight[] = {0.7f, 0.7f, 0.7f, 1.0f};
|
||||||
@@ -523,10 +528,10 @@ void static RenderScene(void) {
|
|||||||
|
|
||||||
// PS: to nie zadziała, bo okno nie jest tworzone przez glfw
|
// PS: to nie zadziała, bo okno nie jest tworzone przez glfw
|
||||||
// Ustawienie liczby próbek dla antyaliasingu
|
// Ustawienie liczby próbek dla antyaliasingu
|
||||||
// glfwWindowHint(GLFW_SAMPLES, 16); // 4x MSAA (Wielokrotne próbkowanie)
|
glfwWindowHint(GLFW_SAMPLES, 16); // 4x MSAA (Wielokrotne próbkowanie)
|
||||||
|
|
||||||
// Włączenie antyaliasingu (MSAA)
|
// Włączenie antyaliasingu (MSAA)
|
||||||
//glEnable(GL_MULTISAMPLE);
|
glEnable(GL_MULTISAMPLE);
|
||||||
|
|
||||||
// Przywrócenie macierzy modelu i ustawienie obrotów
|
// Przywrócenie macierzy modelu i ustawienie obrotów
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
@@ -551,36 +556,47 @@ void static RenderScene(void) {
|
|||||||
float rad = Rotation * GL_PI / 180.0f;
|
float rad = Rotation * GL_PI / 180.0f;
|
||||||
|
|
||||||
if (panoramic_view) {
|
if (panoramic_view) {
|
||||||
// --- WIDOK Z GÓRY (STRATEGICZNY) ---
|
// --- WIDOK Z GÓRY ---
|
||||||
maxRotationSpeed = 1.0f;
|
maxRotationSpeed = 1.0f;
|
||||||
rotationFriction = 0.5f;
|
rotationFriction = 0.5f;
|
||||||
|
float mapZoom = 400.0f;
|
||||||
float mapZoom = 400.0f; // Wysokość, z której patrzymy
|
gluLookAt(Foward, mapZoom, Sides, Foward, 0.0f, Sides, 1.0f, 0.0f, 0.0f);
|
||||||
gluLookAt(
|
|
||||||
Foward, mapZoom, Sides, // Kamera wysoko nad łazikiem
|
|
||||||
Foward, 0.0f, Sides, // Patrzymy prosto na łazik
|
|
||||||
1.0f, 0.0f, 0.0f // ZMIANA: Wektor góry to oś X (bo patrzymy w dół osi Y)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
else {
|
else if (fpv_view) {
|
||||||
|
// --- WIDOK FIRST PERSON (FPV) ---
|
||||||
maxRotationSpeed = 0.5f;
|
maxRotationSpeed = 0.5f;
|
||||||
rotationFriction = 0.1f;
|
rotationFriction = 0.1f;
|
||||||
|
|
||||||
float rad = Rotation * GL_PI / 180.0f;
|
float rad = Rotation * GL_PI / 180.0f;
|
||||||
|
|
||||||
// Obliczamy pozycję kamery korzystając z dynamicznego CameraDistance
|
// Pozycja oczu: środek łazika + lekko w górę
|
||||||
float camX = Foward + CameraHeight * sin(rad);
|
float eyeX = Foward;
|
||||||
float camZ = Sides + CameraHeight * cos(rad);
|
float eyeY = 15.0f; // Wysokość "oczu" nad ziemią
|
||||||
|
float eyeZ = Sides;
|
||||||
|
|
||||||
// Wysokość kamery też może się skalować z dystansem (opcjonalnie)
|
// Kierunek patrzenia: zgodnie z rotacją łazika
|
||||||
float dynamicHeight = CameraHeight * 0.4f;
|
// Używamy ujemnego sin/cos, bo w Twoim kodzie Rotation steruje modelem w ten sposób
|
||||||
|
float lookAtX = Foward - 10.0f * sin(rad);
|
||||||
|
float lookAtZ = Sides - 10.0f * cos(rad);
|
||||||
|
|
||||||
gluLookAt(
|
gluLookAt(
|
||||||
camX, dynamicHeight, camZ, // Pozycja kamery
|
eyeX, eyeY, eyeZ, // Oko jest wewnątrz/nad łazikiem
|
||||||
Foward, 10.0f, Sides, // Patrzymy na łazik
|
lookAtX, eyeY, lookAtZ, // Patrzymy przed siebie (na tej samej wysokości)
|
||||||
0.0f, 1.0f, 0.0f // Góra
|
0.0f, 1.0f, 0.0f // Góra to oś Y
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
// --- WIDOK TRZECIOOSOBOWY (TPP) ---
|
||||||
|
maxRotationSpeed = 0.5f;
|
||||||
|
rotationFriction = 0.1f;
|
||||||
|
float rad = Rotation * GL_PI / 180.0f;
|
||||||
|
float camX = Foward + CameraHeight * sin(rad);
|
||||||
|
float camZ = Sides + CameraHeight * cos(rad);
|
||||||
|
float dynamicHeight = CameraHeight * 0.4f;
|
||||||
|
|
||||||
|
gluLookAt(camX, dynamicHeight, camZ, Foward, 10.0f, Sides, 0.0f, 1.0f, 0.0f);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Rysowanie mapy
|
// Rysowanie mapy
|
||||||
@@ -796,97 +812,83 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
float radRotation = Rotation * GL_PI / 180.0f;
|
float radRotation = Rotation * GL_PI / 180.0f;
|
||||||
switch (message) {
|
switch (message) {
|
||||||
// Window creation, setup for OpenGL
|
// Window creation, setup for OpenGL
|
||||||
case WM_CREATE:
|
case WM_CREATE:
|
||||||
|
{
|
||||||
// Store the device context
|
// 1. NAJPIERW INICJALIZACJA KONTEKSTU WINDOWS I OPENGL
|
||||||
|
// Bez tego funkcje gl... nie będą działać!
|
||||||
hDC = GetDC(hWnd);
|
hDC = GetDC(hWnd);
|
||||||
|
|
||||||
// Select the pixel format
|
|
||||||
SetDCPixelFormat(hDC);
|
SetDCPixelFormat(hDC);
|
||||||
|
|
||||||
// Create palette if needed
|
|
||||||
hPalette = GetOpenGLPalette(hDC);
|
hPalette = GetOpenGLPalette(hDC);
|
||||||
|
|
||||||
// Create the rendering context and make it current
|
|
||||||
hRC = wglCreateContext(hDC);
|
hRC = wglCreateContext(hDC);
|
||||||
wglMakeCurrent(hDC, hRC);
|
wglMakeCurrent(hDC, hRC);
|
||||||
|
|
||||||
|
// Inicjalizacja GLEW i modeli (Twoja funkcja)
|
||||||
SetupRC();
|
SetupRC();
|
||||||
|
|
||||||
|
|
||||||
glGenTextures(3, &texture[0]); // tworzy obiekt tekstury
|
|
||||||
|
|
||||||
// ładuje pierwszy obraz tekstury (płotki):
|
// 2. SPRAWDZENIE MOŻLIWOŚCI KARTY GRAFICZNEJ
|
||||||
|
GLfloat fLargest;
|
||||||
|
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &fLargest);
|
||||||
|
|
||||||
|
// 3. GENEROWANIE OBIEKTÓW TEKSTUR
|
||||||
|
// Używasz indeksów 0, 1, 2, 3 – więc potrzebujesz 4 slotów
|
||||||
|
glGenTextures(4, &texture[0]);
|
||||||
|
|
||||||
|
// --- TEKSTURA 0: PŁOTKI ---
|
||||||
bitmapData = LoadBitmapFile((char*)"res/img/woodenTextureHighExposure.bmp", &bitmapInfoHeader);
|
bitmapData = LoadBitmapFile((char*)"res/img/woodenTextureHighExposure.bmp", &bitmapInfoHeader);
|
||||||
|
if (bitmapData) {
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture[0]);
|
||||||
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, fLargest); // Ostrość pod kątem
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Rozdzielczość w dali (Mipmapy)
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Rozdzielczość z bliska
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
|
||||||
|
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, bitmapInfoHeader.biWidth, bitmapInfoHeader.biHeight, GL_RGB, GL_UNSIGNED_BYTE, bitmapData);
|
||||||
|
free(bitmapData);
|
||||||
|
}
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, texture[0]); // aktywuje obiekt tekstury
|
// --- TEKSTURA 1: ZIEMIA (Najważniejsza dla efektu oddali) ---
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
||||||
|
|
||||||
// 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_WRAP_S, GL_MIRRORED_REPEAT);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
|
|
||||||
|
|
||||||
// tworzy obraz tekstury
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bitmapInfoHeader.biWidth,
|
|
||||||
bitmapInfoHeader.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapData);
|
|
||||||
|
|
||||||
if (bitmapData) free(bitmapData);
|
|
||||||
|
|
||||||
// ładuje drugi obraz tekstury (ziemia):
|
|
||||||
bitmapData = LoadBitmapFile((char*)"res/img/grass02.bmp", &bitmapInfoHeader);
|
bitmapData = LoadBitmapFile((char*)"res/img/grass02.bmp", &bitmapInfoHeader);
|
||||||
glBindTexture(GL_TEXTURE_2D, texture[1]); // aktywuje obiekt tekstury
|
if (bitmapData) {
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture[1]);
|
||||||
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, fLargest);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
|
||||||
|
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, bitmapInfoHeader.biWidth, bitmapInfoHeader.biHeight, GL_RGB, GL_UNSIGNED_BYTE, bitmapData);
|
||||||
|
free(bitmapData);
|
||||||
|
}
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
// --- TEKSTURA 2: DACH STODOŁY ---
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
|
|
||||||
|
|
||||||
// tworzy obraz tekstury
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bitmapInfoHeader.biWidth,
|
|
||||||
bitmapInfoHeader.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapData);
|
|
||||||
|
|
||||||
if (bitmapData) free(bitmapData);
|
|
||||||
|
|
||||||
// ładuje trzeci obraz tekstury (dach stodoły):
|
|
||||||
bitmapData = LoadBitmapFile((char*)"res/img/barnroof.bmp", &bitmapInfoHeader);
|
bitmapData = LoadBitmapFile((char*)"res/img/barnroof.bmp", &bitmapInfoHeader);
|
||||||
glBindTexture(GL_TEXTURE_2D, texture[2]); // aktywuje obiekt tekstury
|
if (bitmapData) {
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture[2]);
|
||||||
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, fLargest);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
||||||
|
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, bitmapInfoHeader.biWidth, bitmapInfoHeader.biHeight, GL_RGB, GL_UNSIGNED_BYTE, bitmapData);
|
||||||
|
free(bitmapData);
|
||||||
|
}
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
// --- TEKSTURA 3: ŚCIANA ---
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
|
||||||
|
|
||||||
// tworzy obraz tekstury
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bitmapInfoHeader.biWidth,
|
|
||||||
bitmapInfoHeader.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapData);
|
|
||||||
|
|
||||||
if (bitmapData) free(bitmapData);
|
|
||||||
|
|
||||||
// ładuje czwarty obraz tekstury (kamienista ściana):
|
|
||||||
bitmapData = LoadBitmapFile((char*)"res/img/brickwall.bmp", &bitmapInfoHeader);
|
bitmapData = LoadBitmapFile((char*)"res/img/brickwall.bmp", &bitmapInfoHeader);
|
||||||
glBindTexture(GL_TEXTURE_2D, texture[3]); // aktywuje obiekt tekstury
|
if (bitmapData) {
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture[3]);
|
||||||
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, fLargest);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
||||||
|
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, bitmapInfoHeader.biWidth, bitmapInfoHeader.biHeight, GL_RGB, GL_UNSIGNED_BYTE, bitmapData);
|
||||||
|
free(bitmapData);
|
||||||
|
}
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
// Ustalenie sposobu mieszania tekstury z tłem
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
|
||||||
|
|
||||||
// tworzy obraz tekstury
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bitmapInfoHeader.biWidth,
|
|
||||||
bitmapInfoHeader.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapData);
|
|
||||||
|
|
||||||
if (bitmapData) free(bitmapData);
|
|
||||||
|
|
||||||
// ustalenie sposobu mieszania tekstury z tłem
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
// Window is being destroyed, cleanup
|
// Window is being destroyed, cleanup
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
@@ -1004,7 +1006,10 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
case 'D':
|
case 'D':
|
||||||
keyDPressed = false;
|
keyDPressed = false;
|
||||||
break;
|
break;
|
||||||
|
case 112: // F1 - Widok z pierwszej osoby (FPV)
|
||||||
|
fpv_view = !fpv_view;
|
||||||
|
if (fpv_view) panoramic_view = false; // Wyłącz panoramę, jeśli włączasz FPV
|
||||||
|
break;
|
||||||
// Obsługa innych klawiszy
|
// Obsługa innych klawiszy
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user