#ifndef DAYNIGHTCYCLE_HPP #define DAYNIGHTCYCLE_HPP #include "GL/glew.h" #include 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