#pragma once #include #include class Sky { private: struct Sun { Vector3 position; Vector3 direction; Color color; float intensity; float angle; // Sun angle for day/night cycle void updatePosition(float timeOfDay); Vector3 getLightDirection() const { return direction; } }; struct Moon { Vector3 position; Vector3 direction; Color color; float intensity; float phase; // 0 = new moon, 0.5 = full moon, 1 = new moon void updatePosition(float timeOfDay); }; Sun sun; Moon moon; Color horizonColor; Color zenithColor; Color fogColor; float fogDensity; float timeOfDay; // 0.0 to 1.0 (0 = midnight, 0.5 = noon) Shader skyShader; Mesh skyDome; Model skyModel; bool shaderLoaded; // Shader locations int horizonColorLoc; int zenithColorLoc; int sunDirectionLoc; int sunColorLoc; int sunIntensityLoc; int moonDirectionLoc; int moonColorLoc; int moonIntensityLoc; int moonPhaseLoc; int starsIntensityLoc; int timeLoc; public: Sky(); ~Sky(); void update(float deltaTime); void updateFromServerTime(float serverTimeOfDay); void render(const Camera3D& camera); void renderSkybox(const Camera3D& camera); // Render skybox that follows camera void setTimeOfDay(float time); float getTimeOfDay() const { return timeOfDay; } Vector3 getSunDirection() const { return sun.direction; } Color getSunColor() const { return sun.color; } float getSunIntensity() const { return sun.intensity; } Color getFogColor() const { return fogColor; } float getFogDensity() const { return fogDensity; } Color getAmbientLight() const; private: void updateColors(); void createSkyDome(); Color interpolateColor(const Color& a, const Color& b, float t) const; void drawGradientSky() const; void drawSun(const Camera3D& camera) const; };