// Use this for initialization
    void Start ()
    {
        //QualitySettings.vSyncCount = 0;

        time = new SilverLiningTime ();
        sky = new SilverLiningSky ();
        location = new SilverLiningLocation ();
        lastFogColor = new Color (0, 0, 0, 0);
        lastFogDensity = -1;
		
		todSliderValue = (float)hour + (float)minutes / (60.0f);
		
		sky.moonWidthDegrees = moonInitialWidthDegrees;
		sky.sunWidthDegrees = sunInitialWidthDegrees;
		
        sky.Start ();

        CreateClouds ();

        //Camera.main.clearFlags = CameraClearFlags.Depth;
        float farClip = (float)Math.Max (100000.0 * unitScale, Camera.main.farClipPlane);
        Camera.main.farClipPlane = farClip;

        cumulusCloudTransform = GameObject.Find ("CumulusClouds");
        cirrusCloudTransform = GameObject.Find ("CirrusClouds");
        stratusCloudTransform = GameObject.Find ("StratusClouds");
    }
    // Use this for initialization
    void Start()
    {
        //QualitySettings.vSyncCount = 0;

        time           = new SilverLiningTime();
        sky            = new SilverLiningSky();
        location       = new SilverLiningLocation();
        lastFogColor   = new Color(0, 0, 0, 0);
        lastFogDensity = -1;

        todSliderValue = (float)hour + (float)minutes / (60.0f);

        sky.moonWidthDegrees = moonInitialWidthDegrees;
        sky.sunWidthDegrees  = sunInitialWidthDegrees;

        sky.Start();

        CreateClouds();

        //Camera.main.clearFlags = CameraClearFlags.Depth;
        float farClip = (float)Math.Max(100000.0 * unitScale, Camera.main.farClipPlane);

        Camera.main.farClipPlane = farClip;

        cumulusCloudTransform = GameObject.Find("CumulusClouds");
        cirrusCloudTransform  = GameObject.Find("CirrusClouds");
        stratusCloudTransform = GameObject.Find("StratusClouds");
    }
 public SilverLiningEphemeris ()
 {
     equatorialToHorizon = new SilverLiningMatrix3 ();
     eclipticToHorizon = new SilverLiningMatrix3 ();
     eclipticToEquatorial = new SilverLiningMatrix3 ();
     equatorialToGeographic = new SilverLiningMatrix3 ();
     horizonToEquatorial = new SilverLiningMatrix3 ();
     horizonToGeographic = new SilverLiningMatrix3 ();
     geographicToEquatorial = new SilverLiningMatrix3 ();
     geographicToHorizon = new SilverLiningMatrix3 ();
     precession = new SilverLiningMatrix3 ();
     moonEq = new Vector3 ();
     sunEq = new Vector3 ();
     moonEcl = new Vector3 ();
     sunEcl = new Vector3 ();
     sunHoriz = new Vector3 ();
     moonHoriz = new Vector3 ();
     moonGeo = new Vector3 ();
     sunGeo = new Vector3 ();
     
     geoZUp = true;
     lastLocation = new SilverLiningLocation ();
     lastTime = new SilverLiningTime ();
     
     planets = new Planet[(int)Planets.NUM_PLANETS];
     planetElements = new OrbitalElements[(int)Planets.NUM_PLANETS];
     
     // Mercury
     planetElements[0] = new OrbitalElements (0.240852, RADIANS (60.750646), RADIANS (77.299833), 0.205633, 0.387099, RADIANS (7.004540), RADIANS (48.212740), 6.74, -0.42);
     
     // Venus
     planetElements[1] = new OrbitalElements (0.615211, RADIANS (88.455855), RADIANS (131.430236), 0.006778, 0.723332, RADIANS (3.394535), RADIANS (76.589820), 16.92, -4.40);
     
     // Earth
     planetElements[2] = new OrbitalElements (1.00004, RADIANS (99.403308), RADIANS (102.768413), 0.016713, 1.00000, 0, 0, 0, 0);
     
     // Mars
     planetElements[3] = new OrbitalElements (1.880932, RADIANS (240.739474), RADIANS (335.874939), 0.093396, 1.523688, RADIANS (1.849736), RADIANS (49.480308), 9.36, -1.52);
     
     // Jupiter
     planetElements[4] = new OrbitalElements (11.863075, RADIANS (90.638185), RADIANS (14.170747), 0.048482, 5.202561, RADIANS (1.303613), RADIANS (100.353142), 196.74, -9.40);
     
     // Saturn
     planetElements[5] = new OrbitalElements (29.471362, RADIANS (287.690033), RADIANS (92.861407), 0.055581, 9.554747, RADIANS (2.488980), RADIANS (113.576139), 165.60, -8.88);
     
 }
Example #4
0
    public SilverLiningEphemeris()
    {
        equatorialToHorizon    = new SilverLiningMatrix3();
        eclipticToHorizon      = new SilverLiningMatrix3();
        eclipticToEquatorial   = new SilverLiningMatrix3();
        equatorialToGeographic = new SilverLiningMatrix3();
        horizonToEquatorial    = new SilverLiningMatrix3();
        horizonToGeographic    = new SilverLiningMatrix3();
        geographicToEquatorial = new SilverLiningMatrix3();
        geographicToHorizon    = new SilverLiningMatrix3();
        precession             = new SilverLiningMatrix3();
        moonEq    = new Vector3();
        sunEq     = new Vector3();
        moonEcl   = new Vector3();
        sunEcl    = new Vector3();
        sunHoriz  = new Vector3();
        moonHoriz = new Vector3();
        moonGeo   = new Vector3();
        sunGeo    = new Vector3();

        geoZUp       = true;
        lastLocation = new SilverLiningLocation();
        lastTime     = new SilverLiningTime();

        planets        = new Planet[(int)Planets.NUM_PLANETS];
        planetElements = new OrbitalElements[(int)Planets.NUM_PLANETS];

        // Mercury
        planetElements[0] = new OrbitalElements(0.240852, RADIANS(60.750646), RADIANS(77.299833), 0.205633, 0.387099, RADIANS(7.004540), RADIANS(48.212740), 6.74, -0.42);

        // Venus
        planetElements[1] = new OrbitalElements(0.615211, RADIANS(88.455855), RADIANS(131.430236), 0.006778, 0.723332, RADIANS(3.394535), RADIANS(76.589820), 16.92, -4.40);

        // Earth
        planetElements[2] = new OrbitalElements(1.00004, RADIANS(99.403308), RADIANS(102.768413), 0.016713, 1.00000, 0, 0, 0, 0);

        // Mars
        planetElements[3] = new OrbitalElements(1.880932, RADIANS(240.739474), RADIANS(335.874939), 0.093396, 1.523688, RADIANS(1.849736), RADIANS(49.480308), 9.36, -1.52);

        // Jupiter
        planetElements[4] = new OrbitalElements(11.863075, RADIANS(90.638185), RADIANS(14.170747), 0.048482, 5.202561, RADIANS(1.303613), RADIANS(100.353142), 196.74, -9.40);

        // Saturn
        planetElements[5] = new OrbitalElements(29.471362, RADIANS(287.690033), RADIANS(92.861407), 0.055581, 9.554747, RADIANS(2.488980), RADIANS(113.576139), 165.60, -8.88);
    }
Example #5
0
 public SilverLiningLocation(SilverLiningLocation l)
 {
     latitude  = l.GetLatitude();
     longitude = l.GetLongitude();
     altitude  = l.GetAltitude();
 }
Example #6
0
    public void Update(SilverLiningTime time, SilverLiningLocation location)
    {
        bool timeChanged     = false;
        bool locationChanged = false;

        if (time != lastTime)
        {
            timeChanged = true;
            lastTime    = new SilverLiningTime(time);
        }

        if (location != lastLocation)
        {
            locationChanged = true;
            lastLocation    = new SilverLiningLocation(location);
        }

        if (timeChanged || locationChanged)
        {
            T         = time.GetEpoch2000Centuries(true);
            Tuncorr   = time.GetEpoch2000Centuries(false);
            epochDays = time.GetEpoch1990Days(false);

            SilverLiningMatrix3 Rx, Ry, Rz;
            Rx = new SilverLiningMatrix3();
            Ry = new SilverLiningMatrix3();
            Rz = new SilverLiningMatrix3();

            Rx.FromRx(-0.1118 * T);
            Ry.FromRy(0.00972 * T);
            Rz.FromRz(-0.01118 * T);
            precession = Rz * (Ry * Rx);

            GMST = 4.894961 + 230121.675315 * Tuncorr;
            // radians
            LMST = GMST + RADIANS(location.GetLongitude());
            // radians
            double latitude = RADIANS(location.GetLatitude());

            e = 0.409093 - 0.000227 * T;

            Ry.FromRy(-(latitude - PI / 2.0));
            Rz.FromRz(LMST);
            Rx.FromRx(-e);
            equatorialToHorizon  = Ry * Rz * precession;
            eclipticToHorizon    = Ry * Rz * Rx * precession;
            eclipticToEquatorial = Rx;

            equatorialToGeographic.FromRz(GMST);
            geographicToEquatorial = equatorialToGeographic.Transpose();

            horizonToEquatorial = equatorialToHorizon.Transpose();
            horizonToGeographic = equatorialToGeographic * horizonToEquatorial;
            geographicToHorizon = equatorialToHorizon * geographicToEquatorial;

            ComputeSunPosition();
            ComputeMoonPosition();
            ComputeEarthPosition();
            ComputeMoonPositionAngle();

            for (int i = 0; i < (int)Planets.NUM_PLANETS; i++)
            {
                if (i != (int)Planets.EARTH)
                {
                    ComputePlanetPosition(i);
                }
            }
        }
    }
 public SilverLiningLocation (SilverLiningLocation l)
 {
     latitude = l.GetLatitude ();
     longitude = l.GetLongitude ();
     altitude = l.GetAltitude ();
 }
    public void Update (SilverLiningTime time, SilverLiningLocation loc, Renderer renderer, bool bIsOvercast,
        bool doFog)
    {
        ephemeris.Update (time, loc);

        isOvercast = bIsOvercast;

        lightingChanged = false;
        ComputeSun (loc.GetAltitude ());
        ComputeMoon (loc.GetAltitude ());
        
        UpdatePerezCoefficients ();
		UpdateHosekWilkieCoefficients();
		
        UpdateZenith (loc.GetAltitude ());
        
        sunx = Perezx (0, thetaS);
        suny = Perezy (0, thetaS);
        sunY = PerezY (0, thetaS);
        moonY = PerezY (0, thetaM);
        moonx = Perezx (0, thetaM);
        moony = Perezy (0, thetaM);
        
        ComputeLogAvg ();
        ComputeToneMappedSkyLight ();
        
        renderer.material.SetColor ("theColor", Color.cyan);
        
        Vector4 sunPerez = new Vector4 ((float)sunx, (float)suny, (float)sunY, 1.0f);
        Vector4 zenithPerez = new Vector4 ((float)xZenith, (float)yZenith, (float)YZenith, 1.0f);
        Vector4 moonPerez = new Vector4 ((float)moonx, (float)moony, (float)moonY, 1.0f);
        Vector4 zenithMoonPerez = new Vector4 ((float)xMoon, (float)yMoon, (float)YMoon, 1.0f);
        
        Vector4 xPerezABC = new Vector4 ((float)Ax, (float)Bx, (float)Cx, 1.0f);
        Vector4 xPerezDE = new Vector4 ((float)Dx, (float)Ex, 0.0f, 1.0f);
        Vector4 yPerezABC = new Vector4 ((float)Ay, (float)By, (float)Cy, 1.0f);
        Vector4 yPerezDE = new Vector4 ((float)Dy, (float)Ey, 0, 0);
        Vector4 YPerezABC = new Vector4 ((float)AY, (float)BY, (float)CY, 1.0f);
        Vector4 YPerezDE = new Vector4 ((float)DY, (float)EY, 0, 0);
        
        double sfRod, sfCone;
        SilverLiningLuminanceMapper.GetLuminanceScales (out sfRod, out sfCone);
        Vector4 luminanceScales = new Vector4 ((float)sfRod, (float)sfCone, 0, 0);
        
        Vector4 kAndLdmax = new Vector4 ((float)SilverLiningLuminanceMapper.GetRodConeBlend (), (float)SilverLiningLuminanceMapper.GetMaxDisplayLuminance (), oneOverGamma, 1.0f);
        
        Vector3 sunPos = ephemeris.GetSunPositionHorizon ();
        sunPos.Normalize ();
        
        Vector3 moonPos = ephemeris.GetMoonPositionHorizon ();
        moonPos.Normalize ();

        Vector4 overcast = new Vector4 (isOvercast ? 1 : 0, isOvercast ? overcastBlend : 0, overcastTransmission, 0.0f);

        Color fogColor = new Color (1.0f, 1.0f, 1.0f, 1.0f);
        float fogDensity = 0;
        float fogDistance = 1E20f;
        
		// New fog method - sets the fog color to create good sky / ground blending at the horizon
		if (RenderSettings.fog && doFog) {
			Color litFogColor = baseFogColor * GetSunOrMoonColor();
			RenderSettings.fogColor = litFogColor;
			fogColor = litFogColor;
			fogDensity = 0.0003f;
			fogDistance = fogThickness;
		}

		// Old fog method - requires the application to maintain reasonable fog colors for every time 
		// of day, which is kind of unreasonable.
		/*
        if (RenderSettings.fog && doFog) {
            fogColor = RenderSettings.fogColor;
            fogDensity = RenderSettings.fogDensity;
            fogDistance = fogThickness;
        }
		*/

        Vector4 fog = new Vector4 (fogColor.r, fogColor.g, fogColor.b, fogDensity);
        overcast.w = fogDistance;

        renderer.material.SetVector ("sunPos", sunPos);
        renderer.material.SetVector ("moonPos", moonPos);
        renderer.material.SetVector ("sunPerez", sunPerez);
        renderer.material.SetVector ("moonPerez", moonPerez);
        renderer.material.SetVector ("zenithMoonPerez", zenithMoonPerez);
        renderer.material.SetVector ("zenithPerez", zenithPerez);

        renderer.material.SetVector ("xPerezABC", xPerezABC);
        renderer.material.SetVector ("xPerezDE", xPerezDE);
        renderer.material.SetVector ("yPerezABC", yPerezABC);
        renderer.material.SetVector ("yPerezDE", yPerezDE);
        renderer.material.SetVector ("YPerezABC", YPerezABC);
        renderer.material.SetVector ("YPerezDE", YPerezDE);
        renderer.material.SetVector ("luminanceScales", luminanceScales);
        renderer.material.SetVector ("kAndLdmax", kAndLdmax);
        renderer.material.SetVector ("overcast", overcast);
        renderer.material.SetVector ("fog", fog);
        renderer.material.SetMatrix ("XYZtoRGB", XYZ2RGB4);
		
        Vector4 XHosekABC = new Vector4((float)hosekWilkieCoeffs[0,0], (float)hosekWilkieCoeffs[0,1], (float)hosekWilkieCoeffs[0,2], 1.0f);
        Vector4 XHosekDEF = new Vector4((float)hosekWilkieCoeffs[0,3], (float)hosekWilkieCoeffs[0,4], (float)hosekWilkieCoeffs[0,5], 1.0f);
        Vector4 XHosekGHI = new Vector4((float)hosekWilkieCoeffs[0,6], (float)hosekWilkieCoeffs[0,7], (float)hosekWilkieCoeffs[0,8], 1.0f);

        Vector4 YHosekABC = new Vector4((float)hosekWilkieCoeffs[1,0], (float)hosekWilkieCoeffs[1,1], (float)hosekWilkieCoeffs[1,2], 1.0f);
        Vector4 YHosekDEF = new Vector4((float)hosekWilkieCoeffs[1,3], (float)hosekWilkieCoeffs[1,4], (float)hosekWilkieCoeffs[1,5], 1.0f);
        Vector4 YHosekGHI = new Vector4((float)hosekWilkieCoeffs[1,6], (float)hosekWilkieCoeffs[1,7], (float)hosekWilkieCoeffs[1,8], 1.0f);

        Vector4 ZHosekABC = new Vector4((float)hosekWilkieCoeffs[2,0], (float)hosekWilkieCoeffs[2,1], (float)hosekWilkieCoeffs[2,2], 1.0f);
        Vector4 ZHosekDEF = new Vector4((float)hosekWilkieCoeffs[2,3], (float)hosekWilkieCoeffs[2,4], (float)hosekWilkieCoeffs[2,5], 1.0f);
        Vector4 ZHosekGHI = new Vector4((float)hosekWilkieCoeffs[2,6], (float)hosekWilkieCoeffs[2,7], (float)hosekWilkieCoeffs[2,8], 1.0f);

        Vector4 HosekRadiances = new Vector4((float)hosekWilkieRadiances[0], (float)hosekWilkieRadiances[1], (float)hosekWilkieRadiances[2], perezBlend);
		
		renderer.material.SetVector ("XHosekABC", XHosekABC);
		renderer.material.SetVector ("XHosekDEF", XHosekDEF);
		renderer.material.SetVector ("XHosekGHI", XHosekGHI);
		
		renderer.material.SetVector ("YHosekABC", YHosekABC);
		renderer.material.SetVector ("YHosekDEF", YHosekDEF);
		renderer.material.SetVector ("YHosekGHI", YHosekGHI);
		
		renderer.material.SetVector ("ZHosekABC", ZHosekABC);
		renderer.material.SetVector ("ZHosekDEF", ZHosekDEF);
		renderer.material.SetVector ("ZHosekGHI", ZHosekGHI);
		
		renderer.material.SetVector ("HosekRadiances", HosekRadiances);
		
        UpdateSun ();
        UpdateMoon ();
        UpdateLight ();
        if (YZenith < duskZenithLuminance) {
            stars.Enable (true);
            stars.Update ();
        } else {
            stars.Enable (false);
        }

        if (starFogShader != null && starNoFogShader != null) {
            ParticleRenderer ren = sun.GetComponent<ParticleRenderer>();
            if (ren != null) ren.material.shader = doFog ? starFogShader : starNoFogShader;
            ren = moon.GetComponent<ParticleRenderer>();
            if (ren != null) ren.material.shader = doFog ? starFogShader : starNoFogShader;
            stars.SetShader(doFog ? starFogShader : starNoFogShader);
        }
    }
    public void Update (SilverLiningTime time, SilverLiningLocation location)
    {
        bool timeChanged = false;
        bool locationChanged = false;
        
        if (time != lastTime) {
            timeChanged = true;
            lastTime = new SilverLiningTime (time);
        }
        
        if (location != lastLocation) {
            locationChanged = true;
            lastLocation = new SilverLiningLocation (location);
        }
        
        if (timeChanged || locationChanged) {
            T = time.GetEpoch2000Centuries (true);
            Tuncorr = time.GetEpoch2000Centuries (false);
            epochDays = time.GetEpoch1990Days (false);
            
            SilverLiningMatrix3 Rx, Ry, Rz;
            Rx = new SilverLiningMatrix3 ();
            Ry = new SilverLiningMatrix3 ();
            Rz = new SilverLiningMatrix3 ();
            
            Rx.FromRx (-0.1118 * T);
            Ry.FromRy (0.00972 * T);
            Rz.FromRz (-0.01118 * T);
            precession = Rz * (Ry * Rx);
            
            GMST = 4.894961 + 230121.675315 * Tuncorr;
            // radians
            LMST = GMST + RADIANS (location.GetLongitude ());
            // radians
            double latitude = RADIANS (location.GetLatitude ());
            
            e = 0.409093 - 0.000227 * T;
            
            Ry.FromRy (-(latitude - PI / 2.0));
            Rz.FromRz (LMST);
            Rx.FromRx (-e);
            equatorialToHorizon = Ry * Rz * precession;
            eclipticToHorizon = Ry * Rz * Rx * precession;
            eclipticToEquatorial = Rx;
            
            equatorialToGeographic.FromRz (GMST);
            geographicToEquatorial = equatorialToGeographic.Transpose ();
            
            horizonToEquatorial = equatorialToHorizon.Transpose ();
            horizonToGeographic = equatorialToGeographic * horizonToEquatorial;
            geographicToHorizon = equatorialToHorizon * geographicToEquatorial;
            
            ComputeSunPosition ();
            ComputeMoonPosition ();
            ComputeEarthPosition ();
			ComputeMoonPositionAngle ();
            
            for (int i = 0; i < (int)Planets.NUM_PLANETS; i++) {
                if (i != (int)Planets.EARTH) {
                    ComputePlanetPosition (i);
                }
            }
        }
    }
    public void Update(SilverLiningTime time, SilverLiningLocation loc, Renderer renderer, bool bIsOvercast,
        bool doFog)
    {
        ephemeris.Update (time, loc);

        isOvercast = bIsOvercast;

        lightingChanged = false;
        ComputeSun (loc.GetAltitude ());
        ComputeMoon (loc.GetAltitude ());

        UpdatePerezCoefficients ();
        UpdateZenith (loc.GetAltitude ());

        sunx = Perezx (0, thetaS);
        suny = Perezy (0, thetaS);
        sunY = PerezY (0, thetaS);
        moonY = PerezY (0, thetaM);
        moonx = Perezx (0, thetaM);
        moony = Perezy (0, thetaM);

        ComputeLogAvg ();
        ComputeToneMappedSkyLight ();

        renderer.material.SetColor ("theColor", Color.cyan);

        Vector4 sunPerez = new Vector4 ((float)sunx, (float)suny, (float)sunY, 1.0f);
        Vector4 zenithPerez = new Vector4 ((float)xZenith, (float)yZenith, (float)YZenith, 1.0f);
        Vector4 moonPerez = new Vector4 ((float)moonx, (float)moony, (float)moonY, 1.0f);
        Vector4 zenithMoonPerez = new Vector4 ((float)xMoon, (float)yMoon, (float)YMoon, 1.0f);

        Vector4 xPerezABC = new Vector4 ((float)Ax, (float)Bx, (float)Cx, 1.0f);
        Vector4 xPerezDE = new Vector4 ((float)Dx, (float)Ex, 0.0f, 1.0f);
        Vector4 yPerezABC = new Vector4 ((float)Ay, (float)By, (float)Cy, 1.0f);
        Vector4 yPerezDE = new Vector4 ((float)Dy, (float)Ey, 0, 0);
        Vector4 YPerezABC = new Vector4 ((float)AY, (float)BY, (float)CY, 1.0f);
        Vector4 YPerezDE = new Vector4 ((float)DY, (float)EY, 0, 0);

        double sfRod, sfCone;
        SilverLiningLuminanceMapper.GetLuminanceScales (out sfRod, out sfCone);
        Vector4 luminanceScales = new Vector4 ((float)sfRod, (float)sfCone, 0, 0);

        Vector4 kAndLdmax = new Vector4 ((float)SilverLiningLuminanceMapper.GetRodConeBlend (), (float)SilverLiningLuminanceMapper.GetMaxDisplayLuminance (), oneOverGamma, 1.0f);

        Vector3 sunPos = ephemeris.GetSunPositionHorizon ();
        sunPos.Normalize ();

        Vector3 moonPos = ephemeris.GetMoonPositionHorizon ();
        moonPos.Normalize ();

        Vector4 overcast = new Vector4 (isOvercast ? 1 : 0, isOvercast ? overcastBlend : 0, overcastTransmission, 0.0f);

        Color fogColor = new Color (1.0f, 1.0f, 1.0f, 1.0f);
        float fogDensity = 0;
        float fogDistance = 1E20f;

        if (RenderSettings.fog && doFog) {
            fogColor = RenderSettings.fogColor;
            fogDensity = RenderSettings.fogDensity;
            fogDistance = fogThickness;
        }

        Vector4 fog = new Vector4 (fogColor.r, fogColor.g, fogColor.b, fogDensity);
        overcast.w = fogDistance;

        renderer.material.SetVector ("sunPos", sunPos);
        renderer.material.SetVector ("moonPos", moonPos);
        renderer.material.SetVector ("sunPerez", sunPerez);
        renderer.material.SetVector ("moonPerez", moonPerez);
        renderer.material.SetVector ("zenithMoonPerez", zenithMoonPerez);
        renderer.material.SetVector ("zenithPerez", zenithPerez);

        renderer.material.SetVector ("xPerezABC", xPerezABC);
        renderer.material.SetVector ("xPerezDE", xPerezDE);
        renderer.material.SetVector ("yPerezABC", yPerezABC);
        renderer.material.SetVector ("yPerezDE", yPerezDE);
        renderer.material.SetVector ("YPerezABC", YPerezABC);
        renderer.material.SetVector ("YPerezDE", YPerezDE);
        renderer.material.SetVector ("luminanceScales", luminanceScales);
        renderer.material.SetVector ("kAndLdmax", kAndLdmax);
        renderer.material.SetVector ("overcast", overcast);
        renderer.material.SetVector ("fog", fog);
        renderer.material.SetMatrix ("XYZtoRGB", XYZ2RGB4);

        UpdateSun ();
        UpdateMoon ();
        UpdateLight ();
        if (YZenith < duskZenithLuminance) {
            stars.Enable (true);
            stars.Update ();
        } else {
            stars.Enable (false);
        }

        if (starFogShader != null && starNoFogShader != null) {
            ParticleRenderer ren = sun.GetComponent<ParticleRenderer>();
            if (ren != null) ren.material.shader = doFog ? starFogShader : starNoFogShader;
            ren = moon.GetComponent<ParticleRenderer>();
            if (ren != null) ren.material.shader = doFog ? starFogShader : starNoFogShader;
            stars.SetShader(doFog ? starFogShader : starNoFogShader);
        }
    }