private void ComputeMoon (double altitude)
 {
     Vector3 moonPos = ephemeris.GetMoonPositionHorizon ();
     moonPos.Normalize ();
     
     double cosZenith = moonPos.y;
     double zenith = Math.Acos (cosZenith);
     
     if (lastMoonT != T || lastMoonZenith != zenith) {
         lastMoonT = T;
         lastMoonZenith = zenith;
         
         lightingChanged = true;
         
         SilverLiningSpectrum moonSpectrumEarthDirect = new SilverLiningLunarSpectrum ();
         SilverLiningSpectrum moonSpectrumEarthScattered = new SilverLiningLunarSpectrum ();
         
         lunarSpectrum.ApplyAtmosphericTransmittance (zenith, cosZenith, T, altitude, ref moonSpectrumEarthDirect, ref moonSpectrumEarthScattered);
         float moonLuminance = MoonLuminance ();
         moonTransmittedLuminance = moonSpectrumEarthDirect.ToXYZ () * moonLuminance;
         moonScatteredLuminance = moonSpectrumEarthScattered.ToXYZ () * moonLuminance;
         
         if (isOvercast) {
             moonTransmittedLuminance = (moonTransmittedLuminance * (overcastBlend * overcastTransmission)) + (moonTransmittedLuminance * (1.0f - overcastBlend));
             moonScatteredLuminance = (moonScatteredLuminance * (overcastBlend * overcastTransmission)) + (moonScatteredLuminance * (1.0f - overcastBlend));
         }
         
         moonTransmittedLuminance = moonTransmittedLuminance * moonTransmissionScale;
         moonScatteredLuminance = moonScatteredLuminance * moonScatteredScale;
         
     }
 }