add weather and time
This commit is contained in:
@@ -0,0 +1,387 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using System;
|
||||
|
||||
namespace Enviro
|
||||
{
|
||||
[Serializable]
|
||||
public class EnviroSky
|
||||
{
|
||||
public enum SkyMode
|
||||
{
|
||||
Normal,
|
||||
Simple
|
||||
}
|
||||
|
||||
public SkyMode skyMode;
|
||||
|
||||
public enum MoonMode
|
||||
{
|
||||
Realistic,
|
||||
Simple,
|
||||
Off
|
||||
}
|
||||
public MoonMode moonMode;
|
||||
|
||||
public bool forcedSkyboxSetup = true;
|
||||
//Front Colors
|
||||
[GradientUsage(true)]
|
||||
public Gradient frontColorGradient0,frontColorGradient1,frontColorGradient2,frontColorGradient3,frontColorGradient4,frontColorGradient5;
|
||||
|
||||
//Back Colors
|
||||
[GradientUsage(true)]
|
||||
public Gradient backColorGradient0,backColorGradient1,backColorGradient2,backColorGradient3,backColorGradient4,backColorGradient5;
|
||||
|
||||
//Other Colors
|
||||
[GradientUsage(true)]
|
||||
public Gradient sunDiscColorGradient, moonColorGradient, moonGlowColorGradient;
|
||||
|
||||
//Textures
|
||||
public Cubemap starsTex;
|
||||
public Cubemap starsTwinklingTex;
|
||||
public Cubemap galaxyTex;
|
||||
public Texture2D sunTex;
|
||||
public Texture2D moonTex;
|
||||
public Texture2D moonGlowTex;
|
||||
|
||||
//Distribution
|
||||
[Range(-0.1f,1f)]
|
||||
public float distribution0,distribution1,distribution2,distribution3;
|
||||
|
||||
public AnimationCurve mieScatteringIntensityCurve,moonGlowIntensityCurve,starIntensityCurve,galaxyIntensityCurve;
|
||||
public AnimationCurve intensityCurve = new AnimationCurve(new Keyframe(0,1), new Keyframe(1,1));
|
||||
public float intensity, sunScale, moonScale;
|
||||
|
||||
[Range(0f,2f)]
|
||||
public float mieScatteringMultiplier = 1.0f;
|
||||
|
||||
[Range(0f,1f)]
|
||||
public float starsTwinklingSpeed = 0.1f;
|
||||
[Range(-2f,2f)]
|
||||
public float moonPhase;
|
||||
public AnimationCurve skyExposureHDRP;
|
||||
#if ENVIRO_HDRP
|
||||
public UnityEngine.Rendering.HighDefinition.SkyAmbientMode skyAmbientModeHDRP = UnityEngine.Rendering.HighDefinition.SkyAmbientMode.Dynamic;
|
||||
#endif
|
||||
[ColorUsage(false,true)]
|
||||
public Color skyColorTint = Color.white;
|
||||
|
||||
[Range(0f,2f)]
|
||||
public float skyColorExponent = 1.0f;
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
[ExecuteInEditMode]
|
||||
public class EnviroSkyModule : EnviroModule
|
||||
{
|
||||
public Enviro.EnviroSky Settings;
|
||||
public EnviroSkyModule preset;
|
||||
|
||||
public bool showSkyControls;
|
||||
public bool showSkySunControls;
|
||||
public bool showSkyMoonControls;
|
||||
public bool showSkyStarsControls;
|
||||
|
||||
#if ENVIRO_HDRP
|
||||
UnityEngine.Rendering.HighDefinition.VisualEnvironment visualEnvironment;
|
||||
UnityEngine.Rendering.HighDefinition.EnviroHDRPSky enviroHDRPSky;
|
||||
#endif
|
||||
|
||||
public Material mySkyboxMat;
|
||||
|
||||
private float starsTwinkling;
|
||||
|
||||
public override void Enable()
|
||||
{
|
||||
if(EnviroManager.instance == null)
|
||||
return;
|
||||
|
||||
#if !ENVIRO_HDRP
|
||||
SetupSkybox ();
|
||||
#endif
|
||||
}
|
||||
|
||||
public override void Disable()
|
||||
{
|
||||
|
||||
|
||||
#if !ENVIRO_HDRP
|
||||
if(mySkyboxMat != null)
|
||||
DestroyImmediate(mySkyboxMat);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Update Method
|
||||
public override void UpdateModule ()
|
||||
{
|
||||
if(!active)
|
||||
return;
|
||||
|
||||
if(EnviroManager.instance == null)
|
||||
return;
|
||||
#if !ENVIRO_HDRP
|
||||
|
||||
if(mySkyboxMat == null || (mySkyboxMat != RenderSettings.skybox && Settings.forcedSkyboxSetup))
|
||||
SetupSkybox ();
|
||||
|
||||
UpdateSkybox (mySkyboxMat);
|
||||
#else
|
||||
UpdateHDRPSky ();
|
||||
#endif
|
||||
|
||||
if(EnviroManager.instance != null && EnviroManager.instance.Time != null && Settings.moonMode == EnviroSky.MoonMode.Realistic)
|
||||
UpdateMoonPhase ();
|
||||
}
|
||||
|
||||
public void SetupSkybox ()
|
||||
{
|
||||
if(mySkyboxMat == null)
|
||||
{
|
||||
mySkyboxMat = new Material (Shader.Find("Enviro/Skybox"));
|
||||
RenderSettings.skybox = mySkyboxMat;
|
||||
}
|
||||
else
|
||||
{
|
||||
RenderSettings.skybox = mySkyboxMat;
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateSkybox (Material mat)
|
||||
{
|
||||
float solarTime = EnviroManager.instance.solarTime;
|
||||
|
||||
|
||||
Shader.SetGlobalColor("_FrontColor1",Settings.frontColorGradient1.Evaluate(solarTime));
|
||||
Shader.SetGlobalColor("_FrontColor2",Settings.frontColorGradient2.Evaluate(solarTime));
|
||||
Shader.SetGlobalColor("_FrontColor5",Settings.frontColorGradient5.Evaluate(solarTime)); ;
|
||||
Shader.SetGlobalColor("_BackColor1",Settings.backColorGradient1.Evaluate(solarTime));
|
||||
Shader.SetGlobalColor("_BackColor2",Settings.backColorGradient2.Evaluate(solarTime));
|
||||
Shader.SetGlobalColor("_BackColor5",Settings.backColorGradient5.Evaluate(solarTime));
|
||||
|
||||
Shader.SetGlobalColor("_SkyColorTint",Settings.skyColorTint);
|
||||
|
||||
Shader.SetGlobalColor("_SunColor",Settings.sunDiscColorGradient.Evaluate(solarTime));
|
||||
mat.SetColor("_MoonColor",Settings.moonColorGradient.Evaluate(solarTime));
|
||||
mat.SetColor("_MoonGlowColor",Settings.moonGlowColorGradient.Evaluate(solarTime));
|
||||
|
||||
Shader.SetGlobalFloat("_Intensity", Settings.intensity * Settings.intensityCurve.Evaluate(solarTime));
|
||||
Shader.SetGlobalFloat("_SkyColorExponent", Settings.skyColorExponent);
|
||||
Shader.SetGlobalFloat("_MieScatteringIntensity", Settings.mieScatteringIntensityCurve.Evaluate(solarTime) * Settings.mieScatteringMultiplier);
|
||||
|
||||
mat.SetFloat("_MoonGlowIntensity", Settings.moonGlowIntensityCurve.Evaluate(solarTime));
|
||||
mat.SetFloat("_StarIntensity", Settings.starIntensityCurve.Evaluate(solarTime));
|
||||
mat.SetFloat("_GalaxyIntensity", Settings.galaxyIntensityCurve.Evaluate(solarTime));
|
||||
|
||||
Shader.SetGlobalFloat("_frontBackDistribution0",Settings.distribution0);
|
||||
Shader.SetGlobalFloat("_frontBackDistribution1",Settings.distribution1);
|
||||
|
||||
if (Settings.skyMode == EnviroSky.SkyMode.Simple)
|
||||
{
|
||||
Shader.EnableKeyword("ENVIRO_SIMPLESKY");
|
||||
}
|
||||
else
|
||||
{
|
||||
Shader.DisableKeyword("ENVIRO_SIMPLESKY");
|
||||
Shader.SetGlobalColor("_FrontColor0",Settings.frontColorGradient0.Evaluate(solarTime));
|
||||
Shader.SetGlobalColor("_BackColor0",Settings.backColorGradient0.Evaluate(solarTime));
|
||||
Shader.SetGlobalColor("_FrontColor3",Settings.frontColorGradient3.Evaluate(solarTime));
|
||||
Shader.SetGlobalColor("_FrontColor4",Settings.frontColorGradient4.Evaluate(solarTime));
|
||||
Shader.SetGlobalColor("_BackColor3",Settings.backColorGradient3.Evaluate(solarTime));
|
||||
Shader.SetGlobalColor("_BackColor4",Settings.backColorGradient4.Evaluate(solarTime));
|
||||
Shader.SetGlobalFloat("_frontBackDistribution2",Settings.distribution2);
|
||||
Shader.SetGlobalFloat("_frontBackDistribution3",Settings.distribution3);
|
||||
|
||||
if(Settings.galaxyTex != null)
|
||||
mat.SetTexture("_GalaxyTex",Settings.galaxyTex);
|
||||
}
|
||||
|
||||
|
||||
if(Settings.moonMode == EnviroSky.MoonMode.Off)
|
||||
mat.SetVector("_SkyMoonParameters", new Vector4(Settings.moonPhase,Settings.moonScale,Settings.moonScale,0f));
|
||||
else
|
||||
mat.SetVector("_SkyMoonParameters", new Vector4(Settings.moonPhase,Settings.moonScale,Settings.moonScale,1f));
|
||||
|
||||
mat.SetVector("_SkySunParameters", new Vector4(Settings.sunScale,Settings.sunScale,Settings.sunScale,Settings.sunScale));
|
||||
|
||||
if(Settings.starsTex != null)
|
||||
mat.SetTexture("_StarsTex",Settings.starsTex);
|
||||
if(Settings.starsTwinklingTex != null)
|
||||
mat.SetTexture("_StarsTwinklingTex",Settings.starsTwinklingTex);
|
||||
if(Settings.sunTex != null)
|
||||
mat.SetTexture("_SunTex",Settings.sunTex);
|
||||
if(Settings.moonTex != null)
|
||||
mat.SetTexture("_MoonTex",Settings.moonTex);
|
||||
if(Settings.moonGlowTex != null)
|
||||
mat.SetTexture("_MoonGlowTex",Settings.moonGlowTex);
|
||||
|
||||
Shader.SetGlobalVector("_SunDir",-EnviroManager.instance.Objects.sun.transform.forward);
|
||||
Shader.SetGlobalVector("_MoonDir",EnviroManager.instance.Objects.moon.transform.forward);
|
||||
|
||||
//Deactivate flat and cirrus clouds when no flat clouds module found.
|
||||
if(EnviroManager.instance.FlatClouds == null)
|
||||
{
|
||||
Shader.SetGlobalFloat("_CirrusClouds",0f);
|
||||
Shader.SetGlobalFloat("_FlatClouds",0f);
|
||||
}
|
||||
//Deactivate auroira when no flat clouds module found.
|
||||
if(EnviroManager.instance.Aurora == null)
|
||||
{
|
||||
Shader.SetGlobalFloat("_Aurora",0f);
|
||||
}
|
||||
|
||||
mat.SetFloat("_StarsTwinkling", Settings.starsTwinklingSpeed);
|
||||
|
||||
if (Settings.starsTwinklingSpeed > 0.0f)
|
||||
{
|
||||
starsTwinkling += Settings.starsTwinklingSpeed * Time.deltaTime;
|
||||
Quaternion rot = Quaternion.Euler(starsTwinkling, starsTwinkling, starsTwinkling);
|
||||
Matrix4x4 NoiseRot = Matrix4x4.TRS(Vector3.zero, rot, new Vector3(1, 1, 1));
|
||||
mat.SetMatrix("_StarsTwinklingMatrix", NoiseRot);
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateMoonPhase ()
|
||||
{
|
||||
float angle = Vector3.SignedAngle(EnviroManager.instance.Objects.moon.transform.forward, EnviroManager.instance.Objects.sun.transform.forward, -EnviroManager.instance.transform.forward);
|
||||
|
||||
if (EnviroManager.instance.Time.Settings.latitude >= 0)
|
||||
{
|
||||
if (angle < 0)
|
||||
{
|
||||
Settings.moonPhase = EnviroHelper.Remap(angle, 0f, -180f, -2f, 0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
Settings.moonPhase = EnviroHelper.Remap(angle, 0f, 180f, 2f, 0f);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (angle < 0)
|
||||
{
|
||||
Settings.moonPhase = EnviroHelper.Remap(angle, 0f, -180f, 2f, 0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
Settings.moonPhase = EnviroHelper.Remap(angle, 0f, 180f, -2f, 0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if ENVIRO_HDRP
|
||||
public void UpdateHDRPSky ()
|
||||
{
|
||||
if(EnviroManager.instance.volumeHDRP != null && EnviroManager.instance.volumeProfileHDRP != null)
|
||||
{
|
||||
if(visualEnvironment == null)
|
||||
{
|
||||
UnityEngine.Rendering.HighDefinition.VisualEnvironment TempEnv;
|
||||
|
||||
if (EnviroManager.instance.volumeProfileHDRP.TryGet<UnityEngine.Rendering.HighDefinition.VisualEnvironment>(out TempEnv))
|
||||
{
|
||||
visualEnvironment = TempEnv;
|
||||
}
|
||||
else
|
||||
{
|
||||
EnviroManager.instance.volumeProfileHDRP.Add<UnityEngine.Rendering.HighDefinition.VisualEnvironment>();
|
||||
|
||||
if (EnviroManager.instance.volumeProfileHDRP.TryGet<UnityEngine.Rendering.HighDefinition.VisualEnvironment>(out TempEnv))
|
||||
{
|
||||
visualEnvironment = TempEnv;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
visualEnvironment.skyType.value = 990;
|
||||
visualEnvironment.skyType.overrideState = true;
|
||||
visualEnvironment.skyAmbientMode.value = Settings.skyAmbientModeHDRP;
|
||||
visualEnvironment.skyAmbientMode.overrideState = true;
|
||||
}
|
||||
|
||||
if(enviroHDRPSky == null)
|
||||
{
|
||||
UnityEngine.Rendering.HighDefinition.EnviroHDRPSky TempSky;
|
||||
if (EnviroManager.instance.volumeProfileHDRP.TryGet<UnityEngine.Rendering.HighDefinition.EnviroHDRPSky>(out TempSky))
|
||||
{
|
||||
enviroHDRPSky = TempSky;
|
||||
}
|
||||
else
|
||||
{
|
||||
EnviroManager.instance.volumeProfileHDRP.Add<UnityEngine.Rendering.HighDefinition.EnviroHDRPSky>();
|
||||
|
||||
if (EnviroManager.instance.volumeProfileHDRP.TryGet<UnityEngine.Rendering.HighDefinition.EnviroHDRPSky>(out TempSky))
|
||||
{
|
||||
enviroHDRPSky = TempSky;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
enviroHDRPSky.skyIntensityMode.overrideState = true;
|
||||
enviroHDRPSky.skyIntensityMode.value = UnityEngine.Rendering.HighDefinition.SkyIntensityMode.Exposure;
|
||||
enviroHDRPSky.exposure.overrideState = true;
|
||||
|
||||
enviroHDRPSky.exposure.value = Settings.skyExposureHDRP.Evaluate(EnviroManager.instance.solarTime);
|
||||
|
||||
enviroHDRPSky.updateMode.overrideState = true;
|
||||
|
||||
if(Application.isPlaying)
|
||||
enviroHDRPSky.updateMode.value = UnityEngine.Rendering.HighDefinition.EnvironmentUpdateMode.OnChanged;
|
||||
else
|
||||
enviroHDRPSky.updateMode.value = UnityEngine.Rendering.HighDefinition.EnvironmentUpdateMode.Realtime;
|
||||
|
||||
/* if (UnityEngine.Rendering.RenderPipelineManager.currentPipeline is UnityEngine.Rendering.HighDefinition.HDRenderPipeline)
|
||||
{
|
||||
if(EnviroManager.instance.updateSkyAndLightingHDRP)
|
||||
{
|
||||
UnityEngine.Rendering.HighDefinition.HDRenderPipeline hd = (UnityEngine.Rendering.HighDefinition.HDRenderPipeline)UnityEngine.Rendering.RenderPipelineManager.currentPipeline;
|
||||
hd.RequestSkyEnvironmentUpdate();
|
||||
}
|
||||
} */
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//Save and Load
|
||||
public void LoadModuleValues ()
|
||||
{
|
||||
if(preset != null)
|
||||
{
|
||||
Settings = JsonUtility.FromJson<Enviro.EnviroSky>(JsonUtility.ToJson(preset.Settings));
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log("Please assign a saved module to load from!");
|
||||
}
|
||||
}
|
||||
|
||||
public void SaveModuleValues ()
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
EnviroSkyModule t = ScriptableObject.CreateInstance<EnviroSkyModule>();
|
||||
t.name = "Sky Module";
|
||||
t.Settings = JsonUtility.FromJson<Enviro.EnviroSky>(JsonUtility.ToJson(Settings));
|
||||
|
||||
string assetPathAndName = UnityEditor.AssetDatabase.GenerateUniqueAssetPath(EnviroHelper.assetPath + "/New " + t.name + ".asset");
|
||||
UnityEditor.AssetDatabase.CreateAsset(t, assetPathAndName);
|
||||
UnityEditor.AssetDatabase.SaveAssets();
|
||||
UnityEditor.AssetDatabase.Refresh();
|
||||
#endif
|
||||
}
|
||||
|
||||
public void SaveModuleValues (EnviroSkyModule module)
|
||||
{
|
||||
module.Settings = JsonUtility.FromJson<Enviro.EnviroSky>(JsonUtility.ToJson(Settings));
|
||||
#if UNITY_EDITOR
|
||||
UnityEditor.EditorUtility.SetDirty(module);
|
||||
UnityEditor.AssetDatabase.SaveAssets();
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user