Files
3d-fengji/Assets/Enviro 3 - Sky and Weather/Scripts/Runtime/Modules/Sky/EnviroSkyModule.cs
2026-05-20 17:05:47 +08:00

387 lines
15 KiB
C#

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
}
}
}