Files
grafikaKBT/DayNightCycle.hpp
2026-02-01 23:54:22 +01:00

96 lines
3.4 KiB
C++

#ifndef DAYNIGHTCYCLE_HPP
#define DAYNIGHTCYCLE_HPP
#include "GL/glew.h"
#include <iostream>
class DayNightCycle {
private:
bool isNight;
public:
// Konstruktor - domyślnie startujemy w dzień
DayNightCycle() : isNight(false) {}
// Funkcja przełączająca stan
void toggle() {
isNight = !isNight;
if (isNight) {
std::cout << "Tryb: NOC" << std::endl;
}
else {
std::cout << "Tryb: DZIEN" << std::endl;
}
}
// Zwraca informację czy jest noc (przydatne np. do włączania świateł łazika)
bool isNightMode() const {
return isNight;
}
// Główna funkcja ustawiająca światła i tło
void apply() {
if (isNight) {
// === USTAWIENIA NOCNE ===
// Kolor nieba (Tło) - Ciemny granat/czarny
glClearColor(0.05f, 0.05f, 0.1f, 1.0f);
// GL_LIGHT0 (Księżyc) - Zimne, słabe światło
GLfloat nightAmbient[] = { 0.1f, 0.1f, 0.2f, 1.0f };
GLfloat nightDiffuse[] = { 0.2f, 0.2f, 0.35f, 1.0f }; // Niebieskawy odcień
GLfloat nightSpecular[] = { 0.1f, 0.1f, 0.1f, 1.0f }; // Bardzo słaby połysk
glLightfv(GL_LIGHT0, GL_AMBIENT, nightAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, nightDiffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, nightSpecular);
// GL_LIGHT1 (Doświetlenie cieni) - Prawie wyłączone w nocy
GLfloat fillAmbient[] = { 0.02f, 0.02f, 0.05f, 1.0f };
GLfloat fillDiffuse[] = { 0.05f, 0.05f, 0.1f, 1.0f };
glLightfv(GL_LIGHT1, GL_AMBIENT, fillAmbient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, fillDiffuse);
// Opcjonalnie: Włączamy gęstą czarną mgłę dla klimatu
glEnable(GL_FOG);
GLfloat fogColor[] = { 0.05f, 0.05f, 0.1f, 1.0f };
glFogfv(GL_FOG_COLOR, fogColor);
glFogi(GL_FOG_MODE, GL_EXP2);
glFogf(GL_FOG_DENSITY, 0.002f); // Gęstość mgły
}
else {
// === USTAWIENIA DZIENNE ===
// Kolor nieba (Tło) - Jasny błękit
glClearColor(0.53f, 0.81f, 0.92f, 1.0f);
// GL_LIGHT0 (Słońce) - Ciepłe, jasne światło
GLfloat dayAmbient[] = { 0.4f, 0.4f, 0.4f, 1.0f };
GLfloat dayDiffuse[] = { 0.9f, 0.9f, 0.8f, 1.0f }; // Lekko żółtawe
GLfloat daySpecular[] = { 0.5f, 0.5f, 0.5f, 1.0f };
glLightfv(GL_LIGHT0, GL_AMBIENT, dayAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, dayDiffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, daySpecular);
// GL_LIGHT1 (Doświetlenie cieni)
GLfloat fillAmbient[] = { 0.4f, 0.4f, 0.4f, 1.0f };
GLfloat fillDiffuse[] = { 0.3f, 0.3f, 0.4f, 1.0f }; // Niebieskawe cienie
glLightfv(GL_LIGHT1, GL_AMBIENT, fillAmbient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, fillDiffuse);
// Wyłączamy mgłę w dzień (lub ustawiamy bardzo rzadką)
glDisable(GL_FOG);
}
// Pozycję światła ustawiamy taką samą dla obu (wysoko w górze)
// W przyszłości możesz tu zrobić animację przesuwania się słońca
GLfloat lightPos[] = { 100.0f, 150.0f, 100.0f, 0.0f }; // 0.0f na końcu = światło kierunkowe
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
}
};
#endif