public SilverLiningSky ()
    {
        sunDistance *= (float)SilverLining.unitScale;
        moonDistance *= (float)SilverLining.unitScale;
        H *= (float)SilverLining.unitScale;

        ephemeris = new SilverLiningEphemeris ();
        InitTwilightLuminances ();
        sunSpectrum = new SilverLiningSolarSpectrum ();
        lunarSpectrum = new SilverLiningLunarSpectrum ();
        XYZ2RGB = new SilverLiningMatrix3 (3.240479, -0.969256, 0.055648, -1.537150, 1.875992, -0.204043, -0.498535, 0.041556, 1.057311);

        XYZ2RGB4 = new Matrix4x4 ();
        XYZ2RGB4[0, 0] = 3.240479f;
        XYZ2RGB4[0, 1] = -0.969256f;
        XYZ2RGB4[0, 2] = 0.055648f;
        XYZ2RGB4[0, 3] = 0.0f;
        XYZ2RGB4[1, 0] = -1.537150f;
        XYZ2RGB4[1, 1] = 1.875992f;
        XYZ2RGB4[1, 2] = -0.204043f;
        XYZ2RGB4[1, 3] = 0.0f;
        XYZ2RGB4[2, 0] = -0.498535f;
        XYZ2RGB4[2, 1] = 0.041556f;
        XYZ2RGB4[2, 2] = 1.057311f;
        XYZ2RGB4[2, 3] = 0.0f;
        XYZ2RGB4[3, 0] = 0.0f;
        XYZ2RGB4[3, 1] = 0.0f;
        XYZ2RGB4[3, 2] = 0.0f;
        XYZ2RGB4[3, 3] = 1.0f;
		
		hosekWilkieRadiances = new double[3];
		hosekWilkieCoeffs = new double[3,9];
		
		datasetsXYZ = new double[][]
		{
			datasetXYZ1,
			datasetXYZ2,
			datasetXYZ3
		};
		
		datasetsXYZRad = new double[][]
		{
			datasetXYZRad1,
			datasetXYZRad2,
			datasetXYZRad3
		};
    }
 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;
         
     }
 }
    public SilverLiningSky()
    {
        sunDistance *= (float)SilverLining.unitScale;
        moonDistance *= (float)SilverLining.unitScale;
        H *= (float)SilverLining.unitScale;

        ephemeris = new SilverLiningEphemeris ();
        InitTwilightLuminances ();
        sunSpectrum = new SilverLiningSolarSpectrum ();
        lunarSpectrum = new SilverLiningLunarSpectrum ();
        XYZ2RGB = new SilverLiningMatrix3 (3.240479, -0.969256, 0.055648, -1.537150, 1.875992, -0.204043, -0.498535, 0.041556, 1.057311);

        XYZ2RGB4 = new Matrix4x4 ();
        XYZ2RGB4[0, 0] = 3.240479f;
        XYZ2RGB4[0, 1] = -0.969256f;
        XYZ2RGB4[0, 2] = 0.055648f;
        XYZ2RGB4[0, 3] = 0.0f;
        XYZ2RGB4[1, 0] = -1.537150f;
        XYZ2RGB4[1, 1] = 1.875992f;
        XYZ2RGB4[1, 2] = -0.204043f;
        XYZ2RGB4[1, 3] = 0.0f;
        XYZ2RGB4[2, 0] = -0.498535f;
        XYZ2RGB4[2, 1] = 0.041556f;
        XYZ2RGB4[2, 2] = 1.057311f;
        XYZ2RGB4[2, 3] = 0.0f;
        XYZ2RGB4[3, 0] = 0.0f;
        XYZ2RGB4[3, 1] = 0.0f;
        XYZ2RGB4[3, 2] = 0.0f;
        XYZ2RGB4[3, 3] = 1.0f;
    }