You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1194 lines
61 KiB
1194 lines
61 KiB
1 year ago
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
|
||
|
namespace UnityEngine.AzureSky
|
||
|
{
|
||
|
[ExecuteInEditMode]
|
||
|
[AddComponentMenu("Azure[Sky]/Sky Controller")]
|
||
|
public class AzureSkyController : MonoBehaviour
|
||
|
{
|
||
|
#if UNITY_EDITOR
|
||
|
public AzureEditorSettings editorSettings;
|
||
|
#endif
|
||
|
public static AzureSkyController Instance;
|
||
|
//References.
|
||
|
public Transform sunTransform;
|
||
|
public Transform moonTransform;
|
||
|
public Transform lightTransform;
|
||
|
public Texture2D moonTexture;
|
||
|
public Texture2D sunTexture;
|
||
|
public Texture2D cloudNoise;
|
||
|
public Cubemap starfieldTexture;
|
||
|
public Cubemap starNoiseTexture;
|
||
|
public Material skyMaterial;
|
||
|
public Material rainMaterial;
|
||
|
public Material snowMaterial;
|
||
|
public ParticleSystem rainParticle;
|
||
|
public ParticleSystem snowParticle;
|
||
|
public Transform skydome;
|
||
|
//灯光亮度倍增
|
||
|
public float LightAddition;
|
||
|
|
||
|
//Internal uses.
|
||
|
private DateTime m_date;
|
||
|
private int m_dayOfYear = 1;
|
||
|
private AzureSkyProfile m_getCalendarProfile;
|
||
|
private Matrix4x4 m_starfieldMatrix;
|
||
|
private Matrix4x4 m_noiseMatrix;
|
||
|
private float m_noiseMatrixRotation = 0.0f;
|
||
|
private Quaternion m_noiseRotation;
|
||
|
private float m_timeSinceLastProbeUpdate;
|
||
|
private float m_timelineCurveTime = 0.0f;
|
||
|
private float m_timelineGradientTime = 0.0f;
|
||
|
private float m_sunCurveTime = 0.0f;
|
||
|
private float m_sunGradientTime = 0.0f;
|
||
|
private float m_moonCurveTime = 0.0f;
|
||
|
private float m_moonGradientTime = 0.0f;
|
||
|
|
||
|
//Time of Day.
|
||
|
private float m_timeProgression = 0.0f;
|
||
|
private Vector3 m_sunRealisticPosition = Vector3.one;
|
||
|
private Vector3 m_moonRealisticPosition = Vector3.one;
|
||
|
private Quaternion m_sunSimplePosition;
|
||
|
private Vector3 m_sunLocalDirection;
|
||
|
private Vector3 m_moonLocalDirection;
|
||
|
|
||
|
//Change Weather.
|
||
|
public int weatherNumber = 0;
|
||
|
public bool isBlendingWeathers = false;
|
||
|
public float weatherTransitionTime = 0.0f;
|
||
|
private float m_startTime = 0.0f;
|
||
|
private float m_transitionTime = 30;
|
||
|
|
||
|
//Profiles.
|
||
|
public AzureSkyProfile[] calendarProfileList = new AzureSkyProfile[366];
|
||
|
public List<AzureSkyProfile> standardProfileList = new List<AzureSkyProfile>();
|
||
|
public List<WeatherProfile> weatherProfileList = new List<WeatherProfile>();
|
||
|
|
||
|
public AzureSkyProfile calendarDayProfile;
|
||
|
private AzureSkyProfile nextCalendarDayProfile;
|
||
|
public AzureSkyProfile currentDayProfile;
|
||
|
|
||
|
public AzureSkyProfile sourceWeatherProfile;
|
||
|
private AzureSkyProfile m_targetWeatherProfile;
|
||
|
private WeightedDayProfile[] m_weightedProfiles;
|
||
|
|
||
|
//Components.
|
||
|
public AzureSkyTimeOfDayComponent timeOfDay = new AzureSkyTimeOfDayComponent();
|
||
|
public AzureSkyOptionsComponent options = new AzureSkyOptionsComponent();
|
||
|
|
||
|
//Scattering Properties of the Standard Sky System.
|
||
|
public float kr = 8.4f;
|
||
|
public float km = 1.25f;
|
||
|
public float rayleigh = 1.0f;
|
||
|
public float mie = 1.0f;
|
||
|
public float nightIntensity = 2.5f;
|
||
|
public float scattering = 0.25f;
|
||
|
public float sunDiskIntensity = 3.0f;
|
||
|
public float exposure = 1.0f;
|
||
|
public Color mieColor = Color.white;
|
||
|
public Color rayleighColor = Color.white;
|
||
|
public Color sunDiskColor = Color.white;
|
||
|
|
||
|
private Vector3 m_lambda = new Vector3(680.0f, 550.0f, 440.0f);//Wavelength.
|
||
|
public float N = 2.545f;//Molecular density. 2.545E25f
|
||
|
private const float m_pi = Mathf.PI;//Pi number value.
|
||
|
private const float m_n = 1.00029f;//Refractive index of air.
|
||
|
private const float m_pn = 0.035f;//Depolatization factor for standard air.
|
||
|
private Vector3 m_K = new Vector3(686.0f, 678.0f, 666.0f);
|
||
|
|
||
|
//Deep Space Properties.
|
||
|
public Color moonColor = Color.white;
|
||
|
public Color moonBrightColor = Color.white;
|
||
|
public float moonBrightRange = 50.0f;
|
||
|
public float moonEmission = 0.5f;
|
||
|
public float starsScintillation = 5.0f;
|
||
|
public float starfieldIntensity = 0.0f;
|
||
|
public float milkyWayIntensity = 0.0f;
|
||
|
|
||
|
//Fog Scattering Properties of the Standard Sky System.
|
||
|
public float fogScale = 1.0f;
|
||
|
public float fogBlend = 0.25f;
|
||
|
public float fogDensity = 1.0f;
|
||
|
public float fogDistance = 5000.0f;
|
||
|
public float heightFogBlend = 1.0f;
|
||
|
public float heightFogDensity = 0.5f;
|
||
|
public float heightFogDistance = 500.0f;
|
||
|
public float heightFogStart = 0.0f;
|
||
|
public float heightFogEnd = 100.0f;
|
||
|
|
||
|
//Clouds Properties.
|
||
|
public float dynamicCloudLayer1Altitude = 10.0f;
|
||
|
public float dynamicCloudLayer1Direction = 1.0f;
|
||
|
public float dynamicCloudLayer1Speed = 0.1f;
|
||
|
public Color dynamicCloudLayer1Color1 = Color.white;
|
||
|
public Color dynamicCloudLayer1Color2 = Color.white;
|
||
|
public float dynamicCloudLayer1Density = 0.7f;
|
||
|
private Texture2D staticCloudTextureSource, staticCloudTextureDestination;
|
||
|
public Color staticCloudColor = Color.white;
|
||
|
public float staticCloudScattering = 1.0f;
|
||
|
public float staticCloudExtinction = 0.25f;
|
||
|
public float staticCloudPower = 2.2f;
|
||
|
public float staticCloudIntensity = 1.0f;
|
||
|
public float staticCloudRotationSpeed = 0.0f;
|
||
|
private float m_cloudRotationSpeed = 0.0f;
|
||
|
|
||
|
//Lighting Properties.
|
||
|
public float lightIntensity = 1.0f;
|
||
|
public Color lightColor = Color.black;
|
||
|
public float ambientIntensity = 1.0f;
|
||
|
public Color ambientSkyColor = Color.black;
|
||
|
public Color ambientEquatorColor = Color.black;
|
||
|
public Color ambientGroundColor = Color.black;
|
||
|
public float reflectionIntensity = 1.0f;
|
||
|
private Light m_lightComponent;
|
||
|
private float m_sunElevation = 0.0f;
|
||
|
|
||
|
//Weather Properties.
|
||
|
public Color rainColor = Color.white;
|
||
|
public Color snowColor = Color.white;
|
||
|
public float rainIntensity = 0.0f;
|
||
|
public float snowIntensity = 0.0f;
|
||
|
public float windSpeed = 0.0f;
|
||
|
public float windDirection = 0.0f;
|
||
|
public float rainLightVolume = 0.0f;
|
||
|
public float rainMediumVolume = 0.0f;
|
||
|
public float rainHeavyVolume = 0.0f;
|
||
|
public float windLightVolume = 0.0f;
|
||
|
public float windMediumVolume = 0.0f;
|
||
|
public float windHeavyVolume = 0.0f;
|
||
|
public float wetness = 0.0f;
|
||
|
public float snowAmount = 0.0f;
|
||
|
public float covarage = 0.0f;
|
||
|
public Color outputColor1 = Color.white;
|
||
|
public Color outputColor2 = Color.white;
|
||
|
public Color outputColor3 = Color.white;
|
||
|
private ParticleSystem.EmissionModule m_rainEmission;
|
||
|
private ParticleSystem.EmissionModule m_snowEmission;
|
||
|
private float m_maxRainEmission = 2000.0f;
|
||
|
private float m_maxSnowEmission = 750.0f;
|
||
|
//private Vector3 m_windRotation = Vector3.zero;
|
||
|
//private float m_maxWindSpeed = 10.0f;
|
||
|
|
||
|
//Output Lists.
|
||
|
public List<CurveOutput> curveOuputList = new List<CurveOutput>();
|
||
|
public List<GradientOutput> gradientOuputList = new List<GradientOutput>();
|
||
|
|
||
|
//Shader Uniforms.
|
||
|
public static class Uniforms
|
||
|
{
|
||
|
internal static readonly int _CullMode = Shader.PropertyToID("_Azure_CullMode");
|
||
|
internal static readonly int _SunTexture = Shader.PropertyToID("_Azure_SunTexture");
|
||
|
internal static readonly int _MoonTexture = Shader.PropertyToID("_Azure_MoonTexture");
|
||
|
internal static readonly int _CloudNoise= Shader.PropertyToID("_Azure_CloudNoise");
|
||
|
internal static readonly int _StarfieldTexture = Shader.PropertyToID("_Azure_StarfieldTexture");
|
||
|
internal static readonly int _StarNoiseTexture = Shader.PropertyToID("_Azure_StarNoiseTexture");
|
||
|
internal static readonly int _Kr = Shader.PropertyToID("_Azure_Kr");
|
||
|
internal static readonly int _Km = Shader.PropertyToID("_Azure_Km");
|
||
|
internal static readonly int _Scattering = Shader.PropertyToID("_Azure_Scattering");
|
||
|
internal static readonly int _NightIntensity = Shader.PropertyToID("_Azure_NightIntensity");
|
||
|
internal static readonly int _RayleighColor = Shader.PropertyToID("_Azure_RayleighColor");
|
||
|
internal static readonly int _MieColor = Shader.PropertyToID("_Azure_MieColor");
|
||
|
internal static readonly int _SunDiskIntensity = Shader.PropertyToID("_Azure_SunDiskIntensity");
|
||
|
internal static readonly int _SunDiskColor = Shader.PropertyToID("_Azure_SunDiskColor");
|
||
|
internal static readonly int _Exposure = Shader.PropertyToID("_Azure_Exposure");
|
||
|
internal static readonly int _Pi316 = Shader.PropertyToID("_Azure_Pi316");
|
||
|
internal static readonly int _Pi14 = Shader.PropertyToID("_Azure_Pi14");
|
||
|
internal static readonly int _Pi = Shader.PropertyToID("_Azure_Pi");
|
||
|
internal static readonly int _LightSpeed = Shader.PropertyToID("_Azure_LightSpeed");
|
||
|
internal static readonly int _MieDepth = Shader.PropertyToID("_Azure_MieDepth");
|
||
|
internal static readonly int _SunSize = Shader.PropertyToID("_Azure_SunSize");
|
||
|
internal static readonly int _MoonSize = Shader.PropertyToID("_Azure_MoonSize");
|
||
|
internal static readonly int _SunDirection = Shader.PropertyToID("_Azure_SunDirection");
|
||
|
internal static readonly int _MoonDirection = Shader.PropertyToID("_Azure_MoonDirection");
|
||
|
internal static readonly int _UpMatrix = Shader.PropertyToID("_Azure_UpMatrix");
|
||
|
internal static readonly int _MoonMatrix = Shader.PropertyToID("_Azure_MoonMatrix");
|
||
|
internal static readonly int _SunMatrix = Shader.PropertyToID("_Azure_SunMatrix");
|
||
|
internal static readonly int _RelativeSunMatrix = Shader.PropertyToID("_Azure_RelativeSunMatrix");
|
||
|
internal static readonly int _StarMatrix = Shader.PropertyToID("_Azure_StarMatrix");
|
||
|
internal static readonly int _NoiseMatrix = Shader.PropertyToID("_Azure_NoiseMatrix");
|
||
|
internal static readonly int _Br = Shader.PropertyToID("_Azure_Br");
|
||
|
internal static readonly int _Bm = Shader.PropertyToID("_Azure_Bm");
|
||
|
internal static readonly int _MieG = Shader.PropertyToID("_Azure_MieG");
|
||
|
internal static readonly int _SunsetColorMode = Shader.PropertyToID("_Azure_SunsetColorMode");
|
||
|
|
||
|
internal static readonly int _MoonColor = Shader.PropertyToID("_Azure_MoonColor");
|
||
|
internal static readonly int _MoonBrightColor = Shader.PropertyToID("_Azure_MoonBrightColor");
|
||
|
internal static readonly int _MoonBrightRange = Shader.PropertyToID("_Azure_MoonBrightRange");
|
||
|
internal static readonly int _MoonEmission = Shader.PropertyToID("_Azure_MoonEmission");
|
||
|
internal static readonly int _StarfieldColorBalance = Shader.PropertyToID("_Azure_StarfieldColorBalance");
|
||
|
internal static readonly int _StarfieldIntensity = Shader.PropertyToID("_Azure_StarfieldIntensity");
|
||
|
internal static readonly int _MilkyWayIntensity = Shader.PropertyToID("_Azure_MilkyWayIntensity");
|
||
|
|
||
|
internal static readonly int _FogScale = Shader.PropertyToID("_Azure_FogScale");
|
||
|
internal static readonly int _FogBlend = Shader.PropertyToID("_Azure_FogBlend");
|
||
|
internal static readonly int _FogDensity = Shader.PropertyToID("_Azure_FogDensity");
|
||
|
internal static readonly int _FogDistance = Shader.PropertyToID("_Azure_FogDistance");
|
||
|
internal static readonly int _HeightFogBlend = Shader.PropertyToID("_Azure_HeightFogBlend");
|
||
|
internal static readonly int _HeightFogDensity = Shader.PropertyToID("_Azure_HeightFogDensity");
|
||
|
internal static readonly int _HeightFogDistance = Shader.PropertyToID("_Azure_HeightFogDistance");
|
||
|
internal static readonly int _HeightFogStart = Shader.PropertyToID("_Azure_HeightFogStart");
|
||
|
internal static readonly int _HeightFogEnd = Shader.PropertyToID("_Azure_HeightFogEnd");
|
||
|
|
||
|
internal static readonly int _DynamicCloudLayer1Altitude = Shader.PropertyToID("_Azure_DynamicCloudLayer1Altitude");
|
||
|
internal static readonly int _DynamicCloudLayer1Direction = Shader.PropertyToID("_Azure_DynamicCloudLayer1Direction");
|
||
|
internal static readonly int _DynamicCloudLayer1Speed = Shader.PropertyToID("_Azure_DynamicCloudLayer1Speed");
|
||
|
internal static readonly int _DynamicCloudLayer1Density = Shader.PropertyToID("_Azure_DynamicCloudLayer1Density");
|
||
|
internal static readonly int _DynamicCloudLayer1Color1 = Shader.PropertyToID("_Azure_DynamicCloudLayer1Color1");
|
||
|
internal static readonly int _DynamicCloudLayer1Color2 = Shader.PropertyToID("_Azure_DynamicCloudLayer1Color2");
|
||
|
internal static readonly int _StaticCloudTextureSource = Shader.PropertyToID("_Azure_StaticCloudTextureSource");
|
||
|
internal static readonly int _StaticCloudTextureDestination = Shader.PropertyToID("_Azure_StaticCloudTextureDestination");
|
||
|
internal static readonly int _StaticCloudColor = Shader.PropertyToID("_Azure_StaticCloudColor");
|
||
|
internal static readonly int _StaticCloudScattering = Shader.PropertyToID("_Azure_StaticCloudScattering");
|
||
|
internal static readonly int _StaticCloudExtinction = Shader.PropertyToID("_Azure_StaticCloudExtinction");
|
||
|
internal static readonly int _StaticCloudPower = Shader.PropertyToID("_Azure_StaticCloudPower");
|
||
|
internal static readonly int _StaticCloudIntensity = Shader.PropertyToID("_Azure_StaticCloudIntensity");
|
||
|
internal static readonly int _StaticCloudRotationSpeed = Shader.PropertyToID("_Azure_StaticCloudRotationSpeed");
|
||
|
internal static readonly int _WeatherTransitionTime = Shader.PropertyToID("_Azure_WeatherTransitionTime");
|
||
|
|
||
|
internal static readonly int _RainColor = Shader.PropertyToID("_TintColor");
|
||
|
internal static readonly int _SnowColor = Shader.PropertyToID("_TintColor");
|
||
|
}
|
||
|
|
||
|
// Read only.
|
||
|
private bool m_isDaytime = false;
|
||
|
public bool IsDaytime
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return m_isDaytime;
|
||
|
}
|
||
|
}
|
||
|
private void Awake()
|
||
|
{
|
||
|
Instance = this;
|
||
|
}
|
||
|
//Start.
|
||
|
void Start ()
|
||
|
{
|
||
|
weatherNumber = 0;
|
||
|
m_rainEmission = rainParticle.emission;
|
||
|
m_snowEmission = snowParticle.emission;
|
||
|
|
||
|
// Get components.
|
||
|
m_lightComponent = lightTransform.GetComponent<Light>();
|
||
|
|
||
|
//First Shaders Update.
|
||
|
ConfigureShaders ();
|
||
|
InitializeShaderUniforms ();
|
||
|
UpdateShaderUniforms ();
|
||
|
|
||
|
//Enable or Disable Particles.
|
||
|
SetParticlesActive (options.particlesMode);
|
||
|
|
||
|
//Initialize Profiles.
|
||
|
UpdateProfiles ();
|
||
|
|
||
|
//Set System Date and Time.(?)
|
||
|
if (options.startAtCurrentDate) { timeOfDay.ApplySystemDate (); }
|
||
|
if (options.startAtCurrentTime) { timeOfDay.ApplySystemTime (); }
|
||
|
|
||
|
//Get the Progression Speed of the 24-hour Day Cycle.
|
||
|
m_timeProgression = timeOfDay.GetDayLength ();
|
||
|
|
||
|
}
|
||
|
public void GetTimeProgression(float value)
|
||
|
{
|
||
|
m_timeProgression = value;
|
||
|
}
|
||
|
|
||
|
//Reset the Calendar.
|
||
|
void Reset ()
|
||
|
{
|
||
|
timeOfDay.UpdateCalendar (timeOfDay.selectableDayList);
|
||
|
}
|
||
|
|
||
|
//Update.
|
||
|
void Update ()
|
||
|
{
|
||
|
// Update shader uniforms.
|
||
|
UpdateShaderUniforms ();
|
||
|
#if UNITY_EDITOR
|
||
|
InitializeShaderUniforms ();
|
||
|
#endif
|
||
|
|
||
|
// Follow Main Camera.
|
||
|
if (options.followMainCamera && Camera.main)
|
||
|
{
|
||
|
transform.position = Camera.main.transform.position;
|
||
|
}
|
||
|
|
||
|
// Get Curves and Gradients time to evaluate.
|
||
|
m_timelineGradientTime = timeOfDay.hour / 24.0f;
|
||
|
m_timelineCurveTime = timeOfDay.hour;
|
||
|
if (timeOfDay.setTimeByCurve)
|
||
|
{
|
||
|
timeOfDay.CalculateTimeByCurve ();
|
||
|
m_timelineGradientTime = timeOfDay.hourByCurve / 24.0f;
|
||
|
m_timelineCurveTime = timeOfDay.hourByCurve;
|
||
|
}
|
||
|
m_sunCurveTime = Vector3.Dot(-sunTransform.transform.forward, transform.up);
|
||
|
m_sunGradientTime = Mathf.InverseLerp(-1, 1, m_sunCurveTime);
|
||
|
m_moonCurveTime = Vector3.Dot(-moonTransform.transform.forward, transform.up);
|
||
|
m_moonGradientTime = Mathf.InverseLerp(-1, 1, m_moonCurveTime);
|
||
|
|
||
|
// Update Properties.
|
||
|
if (!isBlendingWeathers)
|
||
|
{
|
||
|
N = currentDayProfile.scattering.N;
|
||
|
kr = currentDayProfile.scattering.kr;
|
||
|
km = currentDayProfile.scattering.km;
|
||
|
m_lambda = currentDayProfile.scattering.lambda;
|
||
|
rayleigh = GetCurveValue (currentDayProfile.scattering.rayleighCurve, currentDayProfile.scattering.rayleighCurveIndex);
|
||
|
mie = GetCurveValue (currentDayProfile.scattering.mieCurve, currentDayProfile.scattering.mieCurveIndex);
|
||
|
scattering = GetCurveValue(currentDayProfile.scattering.scatteringCurve, currentDayProfile.scattering.scatteringCurveIndex);
|
||
|
nightIntensity = GetCurveValue (currentDayProfile.scattering.nightIntensityCurve, currentDayProfile.scattering.nightIntensityCurveIndex);
|
||
|
sunDiskIntensity = GetCurveValue (currentDayProfile.scattering.sunDiskIntensityCurve, currentDayProfile.scattering.sunDiskIntensityCurveIndex);
|
||
|
exposure = GetCurveValue (currentDayProfile.scattering.exposureCurve, currentDayProfile.scattering.exposureCurveIndex);
|
||
|
rayleighColor = GetGradientValue (currentDayProfile.scattering.rayleighGradientColor, currentDayProfile.scattering.rayleighGradientIndex);
|
||
|
mieColor = GetGradientValue (currentDayProfile.scattering.mieGradientColor, currentDayProfile.scattering.mieGradientIndex);
|
||
|
sunDiskColor = GetGradientValue (currentDayProfile.scattering.sunDiskGradientColor, currentDayProfile.scattering.sunDiskGradientIndex);
|
||
|
|
||
|
moonColor = GetGradientValue (currentDayProfile.deepSpace.moonColorGradientColor, currentDayProfile.deepSpace.moonColorGradientIndex);
|
||
|
moonBrightColor = GetGradientValue (currentDayProfile.deepSpace.moonBrightColorGradientColor, currentDayProfile.deepSpace.moonBrightColorGradientIndex);
|
||
|
moonBrightRange = GetCurveValue (currentDayProfile.deepSpace.moonBrightRangeCurve, currentDayProfile.deepSpace.moonBrightRangeCurveIndex);
|
||
|
moonEmission = GetCurveValue (currentDayProfile.deepSpace.moonEmissionCurve, currentDayProfile.deepSpace.moonEmissionCurveIndex);
|
||
|
starfieldIntensity = GetCurveValue (currentDayProfile.deepSpace.starfieldIntensityCurve, currentDayProfile.deepSpace.starfieldIntensityCurveIndex);
|
||
|
milkyWayIntensity = GetCurveValue (currentDayProfile.deepSpace.milkyWayIntensityCurve, currentDayProfile.deepSpace.milkyWayIntensityCurveIndex);
|
||
|
starsScintillation = currentDayProfile.deepSpace.starsScintillation;
|
||
|
|
||
|
fogScale = currentDayProfile.fogScattering.fogScale;
|
||
|
fogBlend = GetCurveValue (currentDayProfile.fogScattering.fogBlendCurve, currentDayProfile.fogScattering.fogBlendCurveIndex);
|
||
|
fogDensity = GetCurveValue(currentDayProfile.fogScattering.fogDensityCurve, currentDayProfile.fogScattering.fogDensityCurveIndex);
|
||
|
fogDistance = GetCurveValue (currentDayProfile.fogScattering.fogDistanceCurve, currentDayProfile.fogScattering.fogDistanceCurveIndex);
|
||
|
heightFogBlend = GetCurveValue (currentDayProfile.fogScattering.heightFogBlendCurve, currentDayProfile.fogScattering.heightFogBlendCurveIndex);
|
||
|
heightFogDensity = GetCurveValue (currentDayProfile.fogScattering.heightFogDensityCurve, currentDayProfile.fogScattering.heightFogDensityCurveIndex);
|
||
|
heightFogDistance = GetCurveValue (currentDayProfile.fogScattering.heightFogDistanceCurve, currentDayProfile.fogScattering.heightFogDistanceCurveIndex);
|
||
|
heightFogStart = GetCurveValue (currentDayProfile.fogScattering.heightFogStartCurve, currentDayProfile.fogScattering.heightFogStartCurveIndex);
|
||
|
heightFogEnd = GetCurveValue (currentDayProfile.fogScattering.heightFogEndCurve, currentDayProfile.fogScattering.heightFogEndCurveIndex);
|
||
|
|
||
|
switch (options.cloudMode)
|
||
|
{
|
||
|
case 1:
|
||
|
dynamicCloudLayer1Altitude = currentDayProfile.clouds.dynamicCloudLayer1Altitude;
|
||
|
dynamicCloudLayer1Direction = currentDayProfile.clouds.dynamicCloudLayer1Direction;
|
||
|
dynamicCloudLayer1Speed = currentDayProfile.clouds.dynamicCloudLayer1Speed;
|
||
|
dynamicCloudLayer1Density = GetCurveValue (currentDayProfile.clouds.dynamicCloudLayer1DensityCurve, currentDayProfile.clouds.dynamicCloudLayer1DensityCurveIndex);
|
||
|
dynamicCloudLayer1Color1 = GetGradientValue (currentDayProfile.clouds.dynamicCloudLayer1GradientColor1, currentDayProfile.clouds.dynamicCloudLayer1GradientColor1Index);
|
||
|
dynamicCloudLayer1Color2 = GetGradientValue (currentDayProfile.clouds.dynamicCloudLayer1GradientColor2, currentDayProfile.clouds.dynamicCloudLayer1GradientColor2Index);
|
||
|
break;
|
||
|
case 2:
|
||
|
//staticCloudTextureSource = currentDayProfile.clouds.staticCloudTexture;
|
||
|
//staticCloudTextureDestination = currentDayProfile.clouds.staticCloudTexture;
|
||
|
staticCloudColor = GetGradientValue(currentDayProfile.clouds.staticCloudColor, currentDayProfile.clouds.staticCloudColorIndex);
|
||
|
staticCloudScattering = GetCurveValue(currentDayProfile.clouds.staticCloudScatteringCurve, currentDayProfile.clouds.staticCloudScatteringCurveIndex);
|
||
|
staticCloudExtinction = GetCurveValue(currentDayProfile.clouds.staticCloudExtinctionCurve, currentDayProfile.clouds.staticCloudExtinctionCurveIndex);
|
||
|
staticCloudPower = GetCurveValue(currentDayProfile.clouds.staticCloudPowerCurve, currentDayProfile.clouds.staticCloudPowerCurveIndex);
|
||
|
staticCloudIntensity = GetCurveValue(currentDayProfile.clouds.staticCloudIntensityCurve, currentDayProfile.clouds.staticCloudIntensityCurveIndex);
|
||
|
staticCloudRotationSpeed = currentDayProfile.clouds.staticCloudRotationSpeed;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
lightIntensity = GetCurveValue (currentDayProfile.lighting.directionalLightIntensityCurve, currentDayProfile.lighting.directionalLightIntensityCurveIndex);
|
||
|
lightColor = GetGradientValue (currentDayProfile.lighting.directionalLightGradientColor, currentDayProfile.lighting.directionalLightGradientColorIndex);
|
||
|
ambientIntensity = GetCurveValue (currentDayProfile.lighting.ambientIntensityCurve, currentDayProfile.lighting.ambientIntensityCurveIndex);
|
||
|
ambientSkyColor = GetGradientValue (currentDayProfile.lighting.ambientSkyGradientColor, currentDayProfile.lighting.ambientSkyGradientColorIndex);
|
||
|
ambientEquatorColor = GetGradientValue (currentDayProfile.lighting.equatorGradientColor, currentDayProfile.lighting.equatorGradientColorIndex);
|
||
|
ambientGroundColor = GetGradientValue (currentDayProfile.lighting.groundGradientColor, currentDayProfile.lighting.groundGradientColorIndex);
|
||
|
reflectionIntensity = GetCurveValue (currentDayProfile.lighting.reflectionIntensityCurve, currentDayProfile.lighting.reflectionIntensityCurveIndex);
|
||
|
|
||
|
if (options.particlesMode == 1 || options.keepWeatherUpdate)
|
||
|
{
|
||
|
rainColor = GetGradientValue (currentDayProfile.weather.weatherRainGradientColor, currentDayProfile.weather.weatherRainGradientColorIndex);
|
||
|
snowColor = GetGradientValue (currentDayProfile.weather.weatherSnowGradientColor, currentDayProfile.weather.weatherSnowGradientColorIndex);
|
||
|
rainIntensity = GetCurveValue (currentDayProfile.weather.weatherRainIntensityCurve, currentDayProfile.weather.weatherRainIntensityCurveIndex);
|
||
|
snowIntensity = GetCurveValue (currentDayProfile.weather.weatherSnowIntensityCurve, currentDayProfile.weather.weatherSnowIntensityCurveIndex);
|
||
|
windSpeed = GetCurveValue (currentDayProfile.weather.weatherWindSpeedCurve, currentDayProfile.weather.weatherWindSpeedCurveIndex);
|
||
|
windDirection = GetCurveValue (currentDayProfile.weather.weatherWindDirectionCurve, currentDayProfile.weather.weatherWindDirectionCurveIndex);
|
||
|
rainLightVolume = currentDayProfile.weather.weatherRainLightVolume;
|
||
|
rainMediumVolume = currentDayProfile.weather.weatherRainMediumVolume;
|
||
|
rainHeavyVolume = currentDayProfile.weather.weatherRainHeavyVolume;
|
||
|
windLightVolume = currentDayProfile.weather.weatherWindLightVolume;
|
||
|
windMediumVolume = currentDayProfile.weather.weatherWindMediumVolume;
|
||
|
windHeavyVolume = currentDayProfile.weather.weatherWindHeavyVolume;
|
||
|
}
|
||
|
|
||
|
if (options.keepWeatherUpdate)
|
||
|
{
|
||
|
wetness = GetCurveValue (currentDayProfile.weather.weatherWetnessCurve, currentDayProfile.weather.weatherWetnessCurveIndex);
|
||
|
snowAmount = GetCurveValue (currentDayProfile.weather.weatherSnowAmountCurve, currentDayProfile.weather.weatherSnowAmountCurveIndex);
|
||
|
covarage = GetCurveValue (currentDayProfile.weather.weatherCovarageCurve, currentDayProfile.weather.weatherCovarageCurveIndex);
|
||
|
outputColor1 = GetGradientValue (currentDayProfile.weather.weatherOutputColor1GradientColor, currentDayProfile.weather.weatherOutputColor1Index);
|
||
|
outputColor2 = GetGradientValue (currentDayProfile.weather.weatherOutputColor2GradientColor, currentDayProfile.weather.weatherOutputColor2Index);
|
||
|
outputColor3 = GetGradientValue (currentDayProfile.weather.weatherOutputColor3GradientColor, currentDayProfile.weather.weatherOutputColor3Index);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Directions.
|
||
|
m_sunLocalDirection = transform.InverseTransformDirection(sunTransform.transform.forward);
|
||
|
m_moonLocalDirection = transform.InverseTransformDirection(moonTransform.transform.forward);
|
||
|
|
||
|
//Only in Gameplay.
|
||
|
if (Application.isPlaying)
|
||
|
{
|
||
|
//Set Time of Day.
|
||
|
timeOfDay.hour += m_timeProgression * Time.deltaTime;
|
||
|
if (timeOfDay.hour >= 24)
|
||
|
{
|
||
|
//Change to the next day.
|
||
|
timeOfDay.StartNextDay (options.repeatMode);
|
||
|
|
||
|
//Apply day change transition.
|
||
|
if(options.applyDayChangeTransition && weatherNumber == 0 && calendarDayProfile != nextCalendarDayProfile)
|
||
|
{
|
||
|
SetNewWeatherProfile(-1);
|
||
|
}
|
||
|
|
||
|
//Update calendar and profiles.
|
||
|
UpdateProfiles ();
|
||
|
}
|
||
|
|
||
|
//Blend Weathers.
|
||
|
if (isBlendingWeathers)
|
||
|
{
|
||
|
BlendingWeathers ();
|
||
|
}
|
||
|
|
||
|
//Rotate Static Clouds
|
||
|
if (staticCloudRotationSpeed != 0.0f)
|
||
|
{
|
||
|
m_cloudRotationSpeed += staticCloudRotationSpeed * Time.deltaTime;
|
||
|
if (m_cloudRotationSpeed >= 1.0f)
|
||
|
{
|
||
|
m_cloudRotationSpeed -= 1.0f;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Set the Position of the Sun and Moon in the Sky.
|
||
|
switch (timeOfDay.timeMode)
|
||
|
{
|
||
|
//Simple Time Mode.
|
||
|
case 0:
|
||
|
//Set the Rotation of Directional Lights.
|
||
|
m_sunSimplePosition = Quaternion.Euler(0.0f, timeOfDay.longitude, timeOfDay.latitude);
|
||
|
m_sunSimplePosition *= Quaternion.Euler(timeOfDay.SetSimpleSunPosition(), 180.0f, 0.0f);
|
||
|
sunTransform.transform.localRotation = m_sunSimplePosition;
|
||
|
moonTransform.transform.rotation = timeOfDay.SetSimpleMoonPosition(sunTransform);
|
||
|
|
||
|
//Fix Skydome Local Rotation.
|
||
|
skydome.transform.localRotation = Quaternion.Inverse(transform.rotation);
|
||
|
|
||
|
//Update Shader Matrix.
|
||
|
Shader.SetGlobalMatrix(Uniforms._UpMatrix, transform.worldToLocalMatrix);
|
||
|
Shader.SetGlobalMatrix(Uniforms._SunMatrix, sunTransform.transform.worldToLocalMatrix);
|
||
|
Shader.SetGlobalMatrix(Uniforms._RelativeSunMatrix, sunTransform.transform.worldToLocalMatrix * Matrix4x4.TRS(Vector3.zero, Quaternion.Inverse(transform.rotation), Vector3.one).inverse);
|
||
|
Shader.SetGlobalMatrix(Uniforms._StarMatrix, Matrix4x4.TRS(Vector3.zero, Quaternion.Euler(options.starfieldPosition), Vector3.one).inverse);
|
||
|
break;
|
||
|
|
||
|
//Realistic Time Mode.
|
||
|
case 1:
|
||
|
//Set the Rotation of Directional Lights.
|
||
|
m_sunRealisticPosition = timeOfDay.SetRealisticSunPosition();
|
||
|
sunTransform.transform.forward = transform.TransformDirection(m_sunRealisticPosition);
|
||
|
m_moonRealisticPosition = timeOfDay.SetRealisticMoonPosition();
|
||
|
moonTransform.transform.forward = transform.TransformDirection(m_moonRealisticPosition);
|
||
|
|
||
|
//Fix Skydome Local Rotation.
|
||
|
skydome.transform.localRotation = Quaternion.Inverse(transform.rotation);
|
||
|
|
||
|
//Update Shader Matrix.
|
||
|
Shader.SetGlobalMatrix(Uniforms._UpMatrix, transform.worldToLocalMatrix);
|
||
|
Shader.SetGlobalMatrix(Uniforms._SunMatrix, sunTransform.transform.worldToLocalMatrix);
|
||
|
Shader.SetGlobalMatrix(Uniforms._RelativeSunMatrix, Matrix4x4.identity);
|
||
|
Quaternion skyRotation = Quaternion.Euler(90.0f - timeOfDay.latitude, 0.0f, 0.0f) * Quaternion.Euler(0.0f, timeOfDay.longitude, 0.0f) * Quaternion.Euler(0.0f, timeOfDay.lst * Mathf.Rad2Deg, 0.0f);
|
||
|
m_starfieldMatrix = Matrix4x4.TRS(Vector3.zero, skyRotation * Quaternion.Euler(options.starfieldPosition), Vector3.one);
|
||
|
Shader.SetGlobalMatrix(Uniforms._StarMatrix, m_starfieldMatrix.inverse);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Get sun elevation and set light position.
|
||
|
m_sunElevation = Vector3.Dot(-sunTransform.transform.forward, transform.up);
|
||
|
if (m_sunElevation >= 0.0f)
|
||
|
{
|
||
|
lightTransform.transform.localRotation = Quaternion.LookRotation(m_sunLocalDirection);
|
||
|
m_isDaytime = true;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
lightTransform.transform.localRotation = Quaternion.LookRotation(m_moonLocalDirection);
|
||
|
m_isDaytime = false;
|
||
|
}
|
||
|
|
||
|
//Lighting and Reflections.
|
||
|
m_lightComponent.intensity = lightIntensity+LightAddition;
|
||
|
m_lightComponent.color = lightColor;
|
||
|
RenderSettings.ambientIntensity = ambientIntensity;
|
||
|
RenderSettings.ambientSkyColor = ambientSkyColor;
|
||
|
RenderSettings.ambientEquatorColor = ambientEquatorColor;
|
||
|
RenderSettings.ambientGroundColor = ambientGroundColor;
|
||
|
|
||
|
//Particles Controller.
|
||
|
if (options.particlesMode == 1)
|
||
|
{
|
||
|
//Rain Particle.
|
||
|
if (rainIntensity > 0)
|
||
|
{
|
||
|
if (rainParticle.isStopped)
|
||
|
{
|
||
|
rainParticle.Play ();
|
||
|
m_rainEmission = rainParticle.emission;
|
||
|
}
|
||
|
m_rainEmission.rateOverTime = rainIntensity * m_maxRainEmission;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (rainParticle.isPlaying)
|
||
|
{
|
||
|
rainParticle.Stop ();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Snow Particle.
|
||
|
if (snowIntensity > 0)
|
||
|
{
|
||
|
if (snowParticle.isStopped)
|
||
|
{
|
||
|
snowParticle.Play ();
|
||
|
m_snowEmission = snowParticle.emission;
|
||
|
}
|
||
|
m_snowEmission.rateOverTime = snowIntensity * m_maxSnowEmission;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (snowParticle.isPlaying)
|
||
|
{
|
||
|
snowParticle.Stop ();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//Stars Scintillation.
|
||
|
if (starsScintillation > 0.0f)
|
||
|
{
|
||
|
m_noiseMatrixRotation += starsScintillation * Time.deltaTime;
|
||
|
m_noiseRotation = Quaternion.Euler(m_noiseMatrixRotation, m_noiseMatrixRotation, m_noiseMatrixRotation);
|
||
|
m_noiseMatrix = Matrix4x4.TRS(Vector3.zero, m_noiseRotation, new Vector3(1, 1, 1));
|
||
|
}
|
||
|
|
||
|
#if UNITY_EDITOR
|
||
|
if(!Application.isPlaying)
|
||
|
currentDayProfile = GetCalendarDayProfile();
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
//Calcule Total Rayleigh.
|
||
|
private Vector3 GetBetaRay ()
|
||
|
{
|
||
|
//Converting the wavelength values given in Inspector for real scale used in formula.
|
||
|
Vector3 converted_lambda = m_lambda * 1.0e-9f;
|
||
|
float converted_N = N * 1.0e25f;
|
||
|
|
||
|
Vector3 Br;
|
||
|
Br.x = ((8.0f * Mathf.Pow(m_pi, 3.0f) * (Mathf.Pow(Mathf.Pow(m_n, 2.0f) - 1.0f, 2.0f))) / (3.0f * converted_N * Mathf.Pow(converted_lambda.x, 4.0f))) * 1000.0f;
|
||
|
Br.y = ((8.0f * Mathf.Pow(m_pi, 3.0f) * (Mathf.Pow(Mathf.Pow(m_n, 2.0f) - 1.0f, 2.0f))) / (3.0f * converted_N * Mathf.Pow(converted_lambda.y, 4.0f))) * 1000.0f;
|
||
|
Br.z = ((8.0f * Mathf.Pow(m_pi, 3.0f) * (Mathf.Pow(Mathf.Pow(m_n, 2.0f) - 1.0f, 2.0f))) / (3.0f * converted_N * Mathf.Pow(converted_lambda.z, 4.0f))) * 1000.0f;
|
||
|
|
||
|
//Original equation.
|
||
|
//Br.x = (((8.0f * Mathf.Pow(m_pi, 3.0f) * (Mathf.Pow(Mathf.Pow(m_n, 2.0f) - 1.0f, 2.0f)))*(6.0f+3.0f*m_pn) ) / ((3.0f * m_N * Mathf.Pow(converted_lambda.x, 4.0f))*(6.0f-7.0f*m_pn) ))*1000.0f;
|
||
|
//Br.y = (((8.0f * Mathf.Pow(m_pi, 3.0f) * (Mathf.Pow(Mathf.Pow(m_n, 2.0f) - 1.0f, 2.0f)))*(6.0f+3.0f*m_pn) ) / ((3.0f * m_N * Mathf.Pow(converted_lambda.y, 4.0f))*(6.0f-7.0f*m_pn) ))*1000.0f;
|
||
|
//Br.z = (((8.0f * Mathf.Pow(m_pi, 3.0f) * (Mathf.Pow(Mathf.Pow(m_n, 2.0f) - 1.0f, 2.0f)))*(6.0f+3.0f*m_pn) ) / ((3.0f * m_N * Mathf.Pow(converted_lambda.z, 4.0f))*(6.0f-7.0f*m_pn) ))*1000.0f;
|
||
|
|
||
|
return Br;
|
||
|
}
|
||
|
|
||
|
//Calcule Total Mie.
|
||
|
private Vector3 GetBetaMie ()
|
||
|
{
|
||
|
//float c = (6544f * Turbidity - 6510f) * 10.0f;
|
||
|
float c = (0.2f * 2.0f) * 10.0f;
|
||
|
Vector3 Bm;
|
||
|
Bm.x = (434.0f * c * m_pi * Mathf.Pow((2.0f * m_pi) / m_lambda.x, 2.0f) * m_K.x) / 3.0f;
|
||
|
Bm.y = (434.0f * c * m_pi * Mathf.Pow((2.0f * m_pi) / m_lambda.y, 2.0f) * m_K.y) / 3.0f;
|
||
|
Bm.z = (434.0f * c * m_pi * Mathf.Pow((2.0f * m_pi) / m_lambda.z, 2.0f) * m_K.z) / 3.0f;
|
||
|
|
||
|
Bm.x = Mathf.Pow(Bm.x, -1.0f);
|
||
|
Bm.y = Mathf.Pow(Bm.y, -1.0f);
|
||
|
Bm.z = Mathf.Pow(Bm.z, -1.0f);
|
||
|
|
||
|
return Bm;
|
||
|
}
|
||
|
|
||
|
//Evaluate the Curve Properties.
|
||
|
private float GetCurveValue (AnimationCurve[] curveTarget, int curveMode)
|
||
|
{
|
||
|
switch (curveMode)
|
||
|
{
|
||
|
//Based on Timeline.
|
||
|
case 0:
|
||
|
return curveTarget[0].Evaluate(m_timelineCurveTime);
|
||
|
|
||
|
//Based on Sun Elevation.
|
||
|
case 1:
|
||
|
return curveTarget[1].Evaluate(m_sunCurveTime);
|
||
|
|
||
|
//Based on Moon Elevation.
|
||
|
case 2:
|
||
|
return curveTarget[2].Evaluate(m_moonCurveTime);
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Get curve output and return as a Float.
|
||
|
/// </summary>
|
||
|
/// <param name="element">The element number of the Curve Output list.</param>
|
||
|
/// <returns></returns>
|
||
|
public float GetCurveOutput (int element)
|
||
|
{
|
||
|
int curveMode = curveOuputList[element].curveIndex;
|
||
|
switch (curveMode)
|
||
|
{
|
||
|
case 0:
|
||
|
return curveOuputList[element].curveOutput[0].Evaluate(m_timelineCurveTime);
|
||
|
case 1:
|
||
|
return curveOuputList[element].curveOutput[1].Evaluate(m_sunCurveTime);
|
||
|
case 2:
|
||
|
return curveOuputList[element].curveOutput[2].Evaluate(m_moonCurveTime);
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//Evaluate the Gradient Properties.
|
||
|
private Color GetGradientValue (Gradient[] gradientTarget, int curveMode)
|
||
|
{
|
||
|
switch (curveMode)
|
||
|
{
|
||
|
//Based on Timeline.
|
||
|
case 0:
|
||
|
return gradientTarget[0].Evaluate(m_timelineGradientTime);
|
||
|
|
||
|
//Based on Sun Elevation.
|
||
|
case 1:
|
||
|
return gradientTarget[1].Evaluate(m_sunGradientTime);
|
||
|
|
||
|
//Based on Moon Elevation.
|
||
|
case 2:
|
||
|
return gradientTarget[2].Evaluate(m_moonGradientTime);
|
||
|
}
|
||
|
return Color.white;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Get gradient output and return as a Color.
|
||
|
/// </summary>
|
||
|
/// <param name="element">The element number of the Gradient Output list.</param>
|
||
|
/// <returns></returns>
|
||
|
public Color GetGradientOutput (int element)
|
||
|
{
|
||
|
int gradientMode = gradientOuputList[element].gradientIndex;
|
||
|
switch (gradientMode)
|
||
|
{
|
||
|
case 0:
|
||
|
return gradientOuputList[element].gradientOutput[0].Evaluate(m_timelineGradientTime);
|
||
|
case 1:
|
||
|
return gradientOuputList[element].gradientOutput[1].Evaluate(m_sunGradientTime);
|
||
|
case 2:
|
||
|
return gradientOuputList[element].gradientOutput[2].Evaluate(m_moonGradientTime);
|
||
|
}
|
||
|
return Color.white;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Get the current day profile from the calendar. It will return a random standard profile if there is no day profile attached to the current calendar day.
|
||
|
/// </summary>
|
||
|
/// <returns></returns>
|
||
|
public AzureSkyProfile GetCalendarDayProfile ()
|
||
|
{
|
||
|
m_dayOfYear = timeOfDay.GetDayOfYear ();
|
||
|
if (calendarProfileList[m_dayOfYear])
|
||
|
{
|
||
|
m_getCalendarProfile = calendarProfileList[m_dayOfYear];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_getCalendarProfile = standardProfileList[Random.Range(0, (int)standardProfileList.Count)];
|
||
|
}
|
||
|
return m_getCalendarProfile;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Get the next day profile from the calendar. It will return a random standard profile if there is no day profile attached to the next calendar day.
|
||
|
/// </summary>
|
||
|
/// <returns></returns>
|
||
|
public AzureSkyProfile GetNextCalendarDayProfile()
|
||
|
{
|
||
|
m_dayOfYear = timeOfDay.GetDayOfYear();
|
||
|
if (m_dayOfYear < 365)
|
||
|
{
|
||
|
if (calendarProfileList[m_dayOfYear + 1])
|
||
|
{
|
||
|
m_getCalendarProfile = calendarProfileList[m_dayOfYear + 1];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_getCalendarProfile = standardProfileList[Random.Range(0, (int)standardProfileList.Count)];
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (calendarProfileList[0])
|
||
|
{
|
||
|
m_getCalendarProfile = calendarProfileList[0];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_getCalendarProfile = standardProfileList[Random.Range(0, (int)standardProfileList.Count)];
|
||
|
}
|
||
|
}
|
||
|
return m_getCalendarProfile;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Changes the weather with a smooth transition.
|
||
|
/// </summary>
|
||
|
/// <param name="target">The profile number from the Inspector's "Weather Profiles" list.</param>
|
||
|
public void SetNewWeatherProfile (int target)
|
||
|
{
|
||
|
if (!isBlendingWeathers)
|
||
|
{
|
||
|
switch (target)
|
||
|
{
|
||
|
case -1:
|
||
|
//Call next calendar day profile.
|
||
|
m_transitionTime = options.dayChangeTransitionTime;
|
||
|
m_targetWeatherProfile = nextCalendarDayProfile;
|
||
|
break;
|
||
|
|
||
|
case 0:
|
||
|
//Call Default Weather.
|
||
|
m_transitionTime = weatherProfileList [target].TransitionTime;
|
||
|
m_targetWeatherProfile = calendarDayProfile;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
m_transitionTime = weatherProfileList[target].TransitionTime;
|
||
|
m_targetWeatherProfile = weatherProfileList[target].Profile;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
weatherTransitionTime = 0.0f;
|
||
|
m_startTime = Time.time;
|
||
|
isBlendingWeathers = true;
|
||
|
weatherNumber = target;
|
||
|
if (weatherNumber < 0) weatherNumber = 0;
|
||
|
SetStaticCloudTexture(sourceWeatherProfile.clouds.staticCloudTexture, m_targetWeatherProfile.clouds.staticCloudTexture);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Debug.Log("A weather transition is still in progress.");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Blending Weather Profiles.
|
||
|
private void BlendingWeathers ()
|
||
|
{
|
||
|
//HACK.
|
||
|
if (weatherNumber == 0 && !isBlendingWeathers) { sourceWeatherProfile = calendarDayProfile; }
|
||
|
|
||
|
weatherTransitionTime = Mathf.Clamp01((Time.time - m_startTime) / m_transitionTime);
|
||
|
SetWeightedProfiles(new WeightedDayProfile(sourceWeatherProfile, 1.0f - weatherTransitionTime), new WeightedDayProfile(m_targetWeatherProfile, weatherTransitionTime));
|
||
|
BlendWeatherProfiles(m_weightedProfiles);
|
||
|
Shader.SetGlobalFloat(Uniforms._WeatherTransitionTime, weatherTransitionTime);
|
||
|
if (weatherTransitionTime == 1.0f)
|
||
|
{
|
||
|
isBlendingWeathers = false;
|
||
|
weatherTransitionTime = 0.0f;
|
||
|
m_startTime = 0.0f;
|
||
|
sourceWeatherProfile = m_targetWeatherProfile;
|
||
|
currentDayProfile = m_targetWeatherProfile;
|
||
|
SetStaticCloudTexture(currentDayProfile.clouds.staticCloudTexture, currentDayProfile.clouds.staticCloudTexture);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void SetWeightedProfiles (params WeightedDayProfile[] profiles)
|
||
|
{
|
||
|
m_weightedProfiles = profiles;
|
||
|
}
|
||
|
|
||
|
//Based on PlayWayWater weight system.
|
||
|
private void BlendWeatherProfiles (WeightedDayProfile[] profiles)
|
||
|
{
|
||
|
N = 0.0f;
|
||
|
kr = 0.0f;
|
||
|
km = 0.0f;
|
||
|
m_lambda = Vector3.zero;
|
||
|
rayleigh = 0;
|
||
|
mie = 0.0f;
|
||
|
scattering = 0.0f;
|
||
|
nightIntensity = 0.0f;
|
||
|
sunDiskIntensity = 0.0f;
|
||
|
exposure = 0.0f;
|
||
|
rayleighColor = Color.black;
|
||
|
mieColor = Color.black;
|
||
|
sunDiskColor = Color.black;
|
||
|
|
||
|
moonColor = Color.black;
|
||
|
moonBrightColor = Color.black;
|
||
|
moonBrightRange = 0.0f;
|
||
|
moonEmission = 0.0f;
|
||
|
starsScintillation = 0.0f;
|
||
|
starfieldIntensity = 0.0f;
|
||
|
milkyWayIntensity = 0.0f;
|
||
|
|
||
|
fogScale = 0.0f;
|
||
|
fogBlend = 0.0f;
|
||
|
fogDensity = 0.0f;
|
||
|
fogDistance = 0.0f;
|
||
|
heightFogBlend = 0.0f;
|
||
|
heightFogDensity = 0.0f;
|
||
|
heightFogDistance = 0.0f;
|
||
|
heightFogStart = 0.0f;
|
||
|
heightFogEnd = 0.0f;
|
||
|
|
||
|
dynamicCloudLayer1Altitude = 0.0f;
|
||
|
dynamicCloudLayer1Direction = 0.0f;
|
||
|
dynamicCloudLayer1Speed = 0.0f;
|
||
|
dynamicCloudLayer1Color1 = Color.black;
|
||
|
dynamicCloudLayer1Color2 = Color.black;
|
||
|
dynamicCloudLayer1Density = 0.0f;
|
||
|
staticCloudColor = Color.black;
|
||
|
staticCloudScattering = 0.0f;
|
||
|
staticCloudExtinction = 0.0f;
|
||
|
staticCloudPower = 0.0f;
|
||
|
staticCloudIntensity = 0.0f;
|
||
|
staticCloudRotationSpeed = 0.0f;
|
||
|
|
||
|
lightIntensity = 0.0f;
|
||
|
lightColor = Color.black;
|
||
|
ambientIntensity = 0.0f;
|
||
|
ambientSkyColor = Color.black;
|
||
|
ambientEquatorColor = Color.black;
|
||
|
ambientGroundColor = Color.black;
|
||
|
reflectionIntensity = 0.0f;
|
||
|
|
||
|
rainColor = Color.black;
|
||
|
snowColor = Color.black;
|
||
|
rainIntensity = 0.0f;
|
||
|
snowIntensity = 0.0f;
|
||
|
windSpeed = 0.0f;
|
||
|
windDirection = 0.0f;
|
||
|
rainLightVolume = 0.0f;
|
||
|
rainMediumVolume = 0.0f;
|
||
|
rainHeavyVolume = 0.0f;
|
||
|
windLightVolume = 0.0f;
|
||
|
windMediumVolume = 0.0f;
|
||
|
windHeavyVolume = 0.0f;
|
||
|
wetness = 0.0f;
|
||
|
snowAmount = 0.0f;
|
||
|
covarage = 0.0f;
|
||
|
outputColor1 = Color.black;
|
||
|
outputColor2 = Color.black;
|
||
|
outputColor3 = Color.black;
|
||
|
|
||
|
for (int i = 0; i < profiles.Length; ++i)
|
||
|
{
|
||
|
var profile = profiles[i].profile;
|
||
|
float weight = profiles[i].weight;
|
||
|
|
||
|
N += profile.scattering.N * weight;
|
||
|
kr += profile.scattering.kr * weight;
|
||
|
km += profile.scattering.km * weight;
|
||
|
m_lambda += profile.scattering.lambda * weight;
|
||
|
rayleigh += GetCurveValue (profile.scattering.rayleighCurve, profile.scattering.rayleighCurveIndex) * weight;
|
||
|
mie += GetCurveValue (profile.scattering.mieCurve, profile.scattering.mieCurveIndex) * weight;
|
||
|
scattering += GetCurveValue(profile.scattering.scatteringCurve, profile.scattering.scatteringCurveIndex) * weight;
|
||
|
nightIntensity += GetCurveValue (profile.scattering.nightIntensityCurve, profile.scattering.nightIntensityCurveIndex) * weight;
|
||
|
sunDiskIntensity += GetCurveValue (profile.scattering.sunDiskIntensityCurve, profile.scattering.sunDiskIntensityCurveIndex) * weight;
|
||
|
exposure += GetCurveValue (profile.scattering.exposureCurve, profile.scattering.exposureCurveIndex) * weight;
|
||
|
rayleighColor += GetGradientValue (profile.scattering.rayleighGradientColor, profile.scattering.rayleighGradientIndex) * weight;
|
||
|
mieColor += GetGradientValue (profile.scattering.mieGradientColor, profile.scattering.mieGradientIndex) * weight;
|
||
|
sunDiskColor += GetGradientValue (profile.scattering.sunDiskGradientColor, profile.scattering.sunDiskGradientIndex) * weight;
|
||
|
|
||
|
moonColor += GetGradientValue (profile.deepSpace.moonColorGradientColor, profile.deepSpace.moonColorGradientIndex) * weight;
|
||
|
moonBrightColor += GetGradientValue (profile.deepSpace.moonBrightColorGradientColor, profile.deepSpace.moonBrightColorGradientIndex) * weight;
|
||
|
moonBrightRange += GetCurveValue (profile.deepSpace.moonBrightRangeCurve, profile.deepSpace.moonBrightRangeCurveIndex) * weight;
|
||
|
moonEmission += GetCurveValue (profile.deepSpace.moonEmissionCurve, profile.deepSpace.moonEmissionCurveIndex) * weight;
|
||
|
starsScintillation += profile.deepSpace.starsScintillation * weight;
|
||
|
starfieldIntensity += GetCurveValue (profile.deepSpace.starfieldIntensityCurve, profile.deepSpace.starfieldIntensityCurveIndex) * weight;
|
||
|
milkyWayIntensity += GetCurveValue (profile.deepSpace.milkyWayIntensityCurve, profile.deepSpace.milkyWayIntensityCurveIndex) * weight;
|
||
|
|
||
|
fogScale += profile.fogScattering.fogScale * weight;
|
||
|
fogBlend += GetCurveValue (profile.fogScattering.fogBlendCurve, profile.fogScattering.fogBlendCurveIndex) * weight;
|
||
|
fogDensity += GetCurveValue(profile.fogScattering.fogDensityCurve, profile.fogScattering.fogDensityCurveIndex) * weight;
|
||
|
fogDistance += GetCurveValue (profile.fogScattering.fogDistanceCurve, profile.fogScattering.fogDistanceCurveIndex) * weight;
|
||
|
heightFogBlend += GetCurveValue (profile.fogScattering.heightFogBlendCurve, profile.fogScattering.heightFogBlendCurveIndex) * weight;
|
||
|
heightFogDensity += GetCurveValue (profile.fogScattering.heightFogDensityCurve, profile.fogScattering.heightFogDensityCurveIndex) * weight;
|
||
|
heightFogDistance += GetCurveValue (profile.fogScattering.heightFogDistanceCurve, profile.fogScattering.heightFogDistanceCurveIndex) * weight;
|
||
|
heightFogStart += GetCurveValue (profile.fogScattering.heightFogStartCurve, profile.fogScattering.heightFogStartCurveIndex) * weight;
|
||
|
heightFogEnd += GetCurveValue (profile.fogScattering.heightFogEndCurve, profile.fogScattering.heightFogEndCurveIndex) * weight;
|
||
|
|
||
|
switch (options.cloudMode)
|
||
|
{
|
||
|
case 1:
|
||
|
dynamicCloudLayer1Altitude += profile.clouds.dynamicCloudLayer1Altitude * weight;
|
||
|
dynamicCloudLayer1Direction += profile.clouds.dynamicCloudLayer1Direction * weight;
|
||
|
dynamicCloudLayer1Speed += profile.clouds.dynamicCloudLayer1Speed * weight;
|
||
|
dynamicCloudLayer1Density += GetCurveValue (profile.clouds.dynamicCloudLayer1DensityCurve, profile.clouds.dynamicCloudLayer1DensityCurveIndex) * weight;
|
||
|
dynamicCloudLayer1Color1 += GetGradientValue (profile.clouds.dynamicCloudLayer1GradientColor1, profile.clouds.dynamicCloudLayer1GradientColor1Index) * weight;
|
||
|
dynamicCloudLayer1Color2 += GetGradientValue (profile.clouds.dynamicCloudLayer1GradientColor2, profile.clouds.dynamicCloudLayer1GradientColor2Index) * weight;
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
staticCloudColor += GetGradientValue(profile.clouds.staticCloudColor, profile.clouds.staticCloudColorIndex) * weight;
|
||
|
staticCloudScattering += GetCurveValue(profile.clouds.staticCloudScatteringCurve, profile.clouds.staticCloudScatteringCurveIndex) * weight;
|
||
|
staticCloudExtinction += GetCurveValue(profile.clouds.staticCloudExtinctionCurve, profile.clouds.staticCloudExtinctionCurveIndex) * weight;
|
||
|
staticCloudPower += GetCurveValue(profile.clouds.staticCloudPowerCurve, profile.clouds.staticCloudPowerCurveIndex) * weight;
|
||
|
staticCloudIntensity += GetCurveValue(profile.clouds.staticCloudIntensityCurve, profile.clouds.staticCloudIntensityCurveIndex) * weight;
|
||
|
staticCloudRotationSpeed += profile.clouds.staticCloudRotationSpeed * weight;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
lightIntensity += GetCurveValue (profile.lighting.directionalLightIntensityCurve, profile.lighting.directionalLightIntensityCurveIndex) * weight;
|
||
|
lightColor += GetGradientValue (profile.lighting.directionalLightGradientColor, profile.lighting.directionalLightGradientColorIndex) * weight;
|
||
|
ambientIntensity += GetCurveValue (profile.lighting.ambientIntensityCurve, profile.lighting.ambientIntensityCurveIndex) * weight;
|
||
|
ambientSkyColor += GetGradientValue (profile.lighting.ambientSkyGradientColor, profile.lighting.ambientSkyGradientColorIndex) * weight;
|
||
|
ambientEquatorColor += GetGradientValue (profile.lighting.equatorGradientColor, profile.lighting.equatorGradientColorIndex) * weight;
|
||
|
ambientGroundColor += GetGradientValue (profile.lighting.groundGradientColor, profile.lighting.groundGradientColorIndex) * weight;
|
||
|
reflectionIntensity += GetCurveValue (profile.lighting.reflectionIntensityCurve, profile.lighting.reflectionIntensityCurveIndex) * weight;
|
||
|
|
||
|
if (options.particlesMode == 1 || options.keepWeatherUpdate)
|
||
|
{
|
||
|
rainColor += GetGradientValue (profile.weather.weatherRainGradientColor, profile.weather.weatherRainGradientColorIndex) * weight;
|
||
|
snowColor += GetGradientValue (profile.weather.weatherSnowGradientColor, profile.weather.weatherSnowGradientColorIndex) * weight;
|
||
|
rainIntensity += GetCurveValue (profile.weather.weatherRainIntensityCurve, profile.weather.weatherRainIntensityCurveIndex) * weight;
|
||
|
snowIntensity += GetCurveValue (profile.weather.weatherSnowIntensityCurve, profile.weather.weatherSnowIntensityCurveIndex) * weight;
|
||
|
windSpeed += GetCurveValue (profile.weather.weatherWindSpeedCurve, profile.weather.weatherWindSpeedCurveIndex) * weight;
|
||
|
windDirection += GetCurveValue (profile.weather.weatherWindDirectionCurve, profile.weather.weatherWindDirectionCurveIndex) * weight;
|
||
|
rainLightVolume += profile.weather.weatherRainLightVolume * weight;
|
||
|
rainMediumVolume += profile.weather.weatherRainMediumVolume * weight;
|
||
|
rainHeavyVolume += profile.weather.weatherRainHeavyVolume * weight;
|
||
|
windLightVolume += profile.weather.weatherWindLightVolume * weight;
|
||
|
windMediumVolume += profile.weather.weatherWindMediumVolume * weight;
|
||
|
windHeavyVolume += profile.weather.weatherWindHeavyVolume * weight;
|
||
|
}
|
||
|
|
||
|
if (options.keepWeatherUpdate)
|
||
|
{
|
||
|
wetness += GetCurveValue (profile.weather.weatherWetnessCurve, profile.weather.weatherWetnessCurveIndex) * weight;
|
||
|
snowAmount += GetCurveValue (profile.weather.weatherSnowAmountCurve, profile.weather.weatherSnowAmountCurveIndex) * weight;
|
||
|
covarage += GetCurveValue (profile.weather.weatherCovarageCurve, profile.weather.weatherCovarageCurveIndex) * weight;
|
||
|
outputColor1 += GetGradientValue (profile.weather.weatherOutputColor1GradientColor, profile.weather.weatherOutputColor1Index) * weight;
|
||
|
outputColor2 += GetGradientValue (profile.weather.weatherOutputColor2GradientColor, profile.weather.weatherOutputColor2Index) * weight;
|
||
|
outputColor3 += GetGradientValue (profile.weather.weatherOutputColor3GradientColor, profile.weather.weatherOutputColor3Index) * weight;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Updates the profiles and calendar days.
|
||
|
/// </summary>
|
||
|
public void UpdateProfiles ()
|
||
|
{
|
||
|
timeOfDay.UpdateCalendar (timeOfDay.selectableDayList);
|
||
|
calendarDayProfile = GetCalendarDayProfile ();
|
||
|
nextCalendarDayProfile = GetNextCalendarDayProfile();
|
||
|
|
||
|
if (weatherNumber == 0)
|
||
|
{
|
||
|
currentDayProfile = calendarDayProfile;
|
||
|
if (!isBlendingWeathers)
|
||
|
{
|
||
|
sourceWeatherProfile = calendarDayProfile;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Start and Stop Sound Effects.
|
||
|
private void SoundPlayController(float volume, AudioSource sound)
|
||
|
{
|
||
|
sound.volume = volume;
|
||
|
if (volume > 0)
|
||
|
{
|
||
|
if (!sound.isPlaying) sound.Play ();
|
||
|
}
|
||
|
else if (sound.isPlaying) sound.Stop ();
|
||
|
}
|
||
|
|
||
|
//It Needs to be Updated Only Once When the Scene Starts.
|
||
|
private void InitializeShaderUniforms ()
|
||
|
{
|
||
|
Shader.SetGlobalTexture (Uniforms._SunTexture, sunTexture);
|
||
|
Shader.SetGlobalTexture (Uniforms._MoonTexture, moonTexture);
|
||
|
Shader.SetGlobalTexture (Uniforms._CloudNoise, cloudNoise);
|
||
|
if (!isBlendingWeathers)
|
||
|
{
|
||
|
SetStaticCloudTexture(currentDayProfile.clouds.staticCloudTexture, currentDayProfile.clouds.staticCloudTexture);
|
||
|
}
|
||
|
Shader.SetGlobalTexture (Uniforms._StarfieldTexture, starfieldTexture);
|
||
|
Shader.SetGlobalTexture (Uniforms._StarNoiseTexture, starNoiseTexture);
|
||
|
Shader.SetGlobalVector (Uniforms._MieG, new Vector3(0.4375f, 1.5625f, 1.5f));
|
||
|
Shader.SetGlobalFloat (Uniforms._Pi316, 0.0596831f);
|
||
|
Shader.SetGlobalFloat (Uniforms._Pi14, 0.07957747f);
|
||
|
Shader.SetGlobalFloat (Uniforms._Pi, m_pi);
|
||
|
Shader.SetGlobalFloat (Uniforms._LightSpeed, options.lightSpeed);
|
||
|
Shader.SetGlobalFloat (Uniforms._MieDepth, options.mieDepth);
|
||
|
Shader.SetGlobalFloat (Uniforms._SunSize, options.sunSize);
|
||
|
Shader.SetGlobalFloat (Uniforms._MoonSize, options.moonSize);
|
||
|
Shader.SetGlobalInt (Uniforms._SunsetColorMode, options.sunsetColorMode);
|
||
|
}
|
||
|
|
||
|
//It Needs to be Constantly Updated.
|
||
|
private void UpdateShaderUniforms ()
|
||
|
{
|
||
|
Shader.SetGlobalFloat (Uniforms._Kr, kr);
|
||
|
Shader.SetGlobalFloat (Uniforms._Km, km);
|
||
|
Shader.SetGlobalFloat(Uniforms._Scattering, scattering * 60.0f);
|
||
|
Shader.SetGlobalFloat (Uniforms._NightIntensity, nightIntensity);
|
||
|
Shader.SetGlobalColor (Uniforms._RayleighColor, rayleighColor);
|
||
|
Shader.SetGlobalColor (Uniforms._MieColor, mieColor);
|
||
|
Shader.SetGlobalColor (Uniforms._SunDiskColor, sunDiskColor);
|
||
|
Shader.SetGlobalFloat (Uniforms._SunDiskIntensity, sunDiskIntensity);
|
||
|
Shader.SetGlobalFloat (Uniforms._Exposure, exposure);
|
||
|
Shader.SetGlobalVector (Uniforms._SunDirection, transform.InverseTransformDirection (-sunTransform.transform.forward));
|
||
|
Shader.SetGlobalVector (Uniforms._MoonDirection, transform.InverseTransformDirection (- moonTransform.transform.forward));
|
||
|
switch (options.wavelengthMode)
|
||
|
{
|
||
|
case 0:
|
||
|
Shader.SetGlobalVector (Uniforms._Br, new Vector3(0.00519673f, 0.0121427f, 0.0296453f) * rayleigh);
|
||
|
Shader.SetGlobalVector (Uniforms._Bm, new Vector3(0.005721017f, 0.004451339f, 0.003146905f) * mie);
|
||
|
break;
|
||
|
case 1:
|
||
|
Shader.SetGlobalVector (Uniforms._Br, GetBetaRay() * rayleigh);
|
||
|
Shader.SetGlobalVector (Uniforms._Bm, GetBetaMie() * mie);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
Shader.SetGlobalColor (Uniforms._MoonColor, moonColor);
|
||
|
Shader.SetGlobalColor (Uniforms._MoonBrightColor, moonBrightColor);
|
||
|
Shader.SetGlobalFloat (Uniforms._MoonBrightRange, moonBrightRange);
|
||
|
Shader.SetGlobalFloat (Uniforms._MoonEmission, moonEmission);
|
||
|
Shader.SetGlobalMatrix (Uniforms._MoonMatrix, moonTransform.transform.worldToLocalMatrix);
|
||
|
Shader.SetGlobalVector (Uniforms._StarfieldColorBalance, options.starfieldColor);
|
||
|
Shader.SetGlobalFloat (Uniforms._StarfieldIntensity, starfieldIntensity);
|
||
|
Shader.SetGlobalFloat (Uniforms._MilkyWayIntensity, milkyWayIntensity);
|
||
|
Shader.SetGlobalMatrix (Uniforms._NoiseMatrix, m_noiseMatrix);
|
||
|
|
||
|
Shader.SetGlobalFloat (Uniforms._FogScale, fogScale);
|
||
|
Shader.SetGlobalFloat (Uniforms._FogBlend, fogBlend);
|
||
|
Shader.SetGlobalFloat(Uniforms._FogDensity, fogDensity);
|
||
|
Shader.SetGlobalFloat (Uniforms._FogDistance, fogDistance);
|
||
|
Shader.SetGlobalFloat (Uniforms._HeightFogBlend, heightFogBlend);
|
||
|
Shader.SetGlobalFloat (Uniforms._HeightFogDensity, heightFogDensity);
|
||
|
Shader.SetGlobalFloat (Uniforms._HeightFogDistance, heightFogDistance);
|
||
|
Shader.SetGlobalFloat (Uniforms._HeightFogStart, options.planetRadius + heightFogStart);
|
||
|
Shader.SetGlobalFloat (Uniforms._HeightFogEnd, options.planetRadius + heightFogEnd);
|
||
|
|
||
|
//TODO Cloud Layers.
|
||
|
switch (options.cloudMode)
|
||
|
{
|
||
|
case 1:
|
||
|
Shader.SetGlobalFloat (Uniforms._DynamicCloudLayer1Altitude, dynamicCloudLayer1Altitude);
|
||
|
Shader.SetGlobalFloat (Uniforms._DynamicCloudLayer1Direction, dynamicCloudLayer1Direction);
|
||
|
Shader.SetGlobalFloat (Uniforms._DynamicCloudLayer1Speed, dynamicCloudLayer1Speed);
|
||
|
Shader.SetGlobalFloat (Uniforms._DynamicCloudLayer1Density, Mathf.Lerp (25.0f, 0.0f, dynamicCloudLayer1Density));
|
||
|
Shader.SetGlobalColor (Uniforms._DynamicCloudLayer1Color1, dynamicCloudLayer1Color1);
|
||
|
Shader.SetGlobalColor (Uniforms._DynamicCloudLayer1Color2, dynamicCloudLayer1Color2);
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
Shader.SetGlobalColor(Uniforms._StaticCloudColor, staticCloudColor);
|
||
|
Shader.SetGlobalFloat(Uniforms._StaticCloudScattering, staticCloudScattering);
|
||
|
Shader.SetGlobalFloat(Uniforms._StaticCloudExtinction, staticCloudExtinction);
|
||
|
Shader.SetGlobalFloat(Uniforms._StaticCloudPower, staticCloudPower);
|
||
|
Shader.SetGlobalFloat(Uniforms._StaticCloudIntensity, staticCloudIntensity);
|
||
|
Shader.SetGlobalFloat(Uniforms._StaticCloudRotationSpeed, m_cloudRotationSpeed);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (options.particlesMode == 1)
|
||
|
{
|
||
|
rainColor.a = 0.5f;
|
||
|
snowColor.a = 0.5f;
|
||
|
rainMaterial.SetColor (Uniforms._RainColor, rainColor);
|
||
|
snowMaterial.SetColor (Uniforms._SnowColor, snowColor);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void SetStaticCloudTexture(Texture2D source, Texture2D destination)
|
||
|
{
|
||
|
Shader.SetGlobalTexture(Uniforms._StaticCloudTextureSource, source);
|
||
|
Shader.SetGlobalTexture(Uniforms._StaticCloudTextureDestination, destination);
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Configure the sky material with its appropriate shader.
|
||
|
/// </summary>
|
||
|
public void ConfigureShaders ()
|
||
|
{
|
||
|
switch (options.shaderMode)
|
||
|
{
|
||
|
case 0://Pixel Shader.
|
||
|
skydome.gameObject.SetActive (false);
|
||
|
RenderSettings.skybox = skyMaterial;
|
||
|
Shader.SetGlobalInt (Uniforms._CullMode, 2);
|
||
|
switch (options.cloudMode)
|
||
|
{
|
||
|
case 0:
|
||
|
skyMaterial.shader = Shader.Find ("Azure[Sky]/Pixel Sky");
|
||
|
break;
|
||
|
|
||
|
case 1:
|
||
|
skyMaterial.shader = Shader.Find ("Azure[Sky]/Pixel Dynamic Cloud");
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
skyMaterial.shader = Shader.Find("Azure[Sky]/Pixel Static Cloud");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case 1://Vertex Shader.
|
||
|
skydome.gameObject.SetActive (true);
|
||
|
RenderSettings.skybox = null;
|
||
|
Shader.SetGlobalInt (Uniforms._CullMode, 1);
|
||
|
switch (options.cloudMode)
|
||
|
{
|
||
|
case 0:
|
||
|
skyMaterial.shader = Shader.Find ("Azure[Sky]/Vertex Sky");
|
||
|
break;
|
||
|
|
||
|
case 1:
|
||
|
skyMaterial.shader = Shader.Find ("Azure[Sky]/Vertex Dynamic Cloud");
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
skyMaterial.shader = Shader.Find ("Azure[Sky]/Vertex Static Cloud");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Activates/Deactivates the Particles.
|
||
|
/// </summary>
|
||
|
/// <param name="value">Value.</param>
|
||
|
public void SetParticlesActive (bool value)
|
||
|
{
|
||
|
if (rainParticle) rainParticle.gameObject.SetActive (value);
|
||
|
if (snowParticle) snowParticle.gameObject.SetActive (value);
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Activates/Deactivates the Particles.
|
||
|
/// </summary>
|
||
|
/// <param name="value">Value.</param>
|
||
|
public void SetParticlesActive (int value)
|
||
|
{
|
||
|
bool isTrue = value != 0;
|
||
|
if (rainParticle) rainParticle.gameObject.SetActive (isTrue);
|
||
|
if (snowParticle) snowParticle.gameObject.SetActive (isTrue);
|
||
|
}
|
||
|
}
|
||
|
}
|