96 lines
3.4 KiB
C++
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 |