// 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 SilverLiningTime(SilverLiningTime t) { localYear = t.GetYear(); localMonth = t.GetMonth(); localDay = t.GetDay(); observingDST = t.GetDST(); localHours = t.GetHour(); localMinutes = t.GetMinute(); localSeconds = t.GetSeconds(); zoneCorrection = t.GetTimeZone(); }
public SilverLiningTime(SilverLiningTime t) { localYear = t.GetYear (); localMonth = t.GetMonth (); localDay = t.GetDay (); observingDST = t.GetDST (); localHours = t.GetHour (); localMinutes = t.GetMinute (); localSeconds = t.GetSeconds (); zoneCorrection = t.GetTimeZone (); }
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); }
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); }
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 (); 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); } }