You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

269 lines
7.1 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
[System.Serializable]
public class EnviroVolumeCloudsQualitySettings
{
// Reprojection
public enum ReprojectionPixelSize
{
Off,
Low,
Medium,
High
}
public enum CloudDetailQuality
{
Low,
High
}
[Header("Clouds Height Settings")]
[Tooltip("Clouds start height.")]
public float bottomCloudHeight = 3000f;
[Tooltip("Clouds end height.")]
public float topCloudHeight = 7000f;
[Header("Raymarch Step Settings")]
[Range(32, 256)]
[Tooltip("Number of raymarching samples.")]
public int raymarchSteps = 150;
[Tooltip("Increase performance by using less steps when clouds are hidden by objects.")]
[Range(0.1f, 1f)]
public float stepsInDepthModificator = 0.75f;
[Tooltip("Increase performance by using early exit expensive raymarching. Higher values = more performant but less accurate lighting.")]
[Range(0.0f, 0.5f)]
public float transmissionToExit = 0.05f;
[Range(1, 8)]
[Header("Resolution, Upsample and Reprojection")]
[Tooltip("Downsampling of clouds rendering. 1 = full res, 2 = half Res, ...")]
public int cloudsRenderResolution = 1;
public ReprojectionPixelSize reprojectionPixelSize;
[Header("Clouds Modelling")]
[Tooltip("LOD Distance for using lower res 3d texture for far away clouds. ")]
[Range(0f, 1f)]
public float lodDistance = 0.5f;
[Tooltip("The UV scale of base noise. High Values = Low performance!")]
[Range(2f, 100f)]
public float baseNoiseUV = 20f;
[Tooltip("The UV scale of detail noise. High Values = Low performance!")]
[Range(2f, 100f)]
public float detailNoiseUV = 50f;
[Tooltip("Enable to use a curl noise to further enhance the detail erode.")]
public bool useCurlNoise = false;
[Tooltip("Resolution of Base Noise Texture.")]
public CloudDetailQuality baseQuality;
[Tooltip("Resolution of Detail Noise Texture.")]
public CloudDetailQuality detailQuality;
}
[System.Serializable]
public class EnviroVolumeCloudsQuality : ScriptableObject
{
public EnviroVolumeCloudsQualitySettings qualitySettings;
}
public static class EnviroCloudsQualityCreation
{
#if UNITY_EDITOR
[MenuItem("Assets/Create/Enviro/Volume Clouds Quality")]
public static EnviroVolumeCloudsQuality CreateNewEnviroCloudsQualityPreset()
{
EnviroVolumeCloudsQuality preset = ScriptableObject.CreateInstance<EnviroVolumeCloudsQuality>();
// Create and save the new profile with unique name
string path = "Assets/Enviro - Sky and Weather/Enviro Standard/Profiles/Clouds Quality";
string assetPathAndName = AssetDatabase.GenerateUniqueAssetPath (path + "/New " + "Clouds Quality" + ".asset");
AssetDatabase.CreateAsset (preset, assetPathAndName);
AssetDatabase.SaveAssets ();
AssetDatabase.Refresh();
return preset;
}
#endif
public static GameObject GetAssetPrefab(string name)
{
#if UNITY_EDITOR
string[] assets = AssetDatabase.FindAssets(name, null);
for (int idx = 0; idx < assets.Length; idx++)
{
string path = AssetDatabase.GUIDToAssetPath(assets[idx]);
if (path.Contains(".prefab"))
{
return AssetDatabase.LoadAssetAtPath<GameObject>(path);
}
}
#endif
return null;
}
public static AudioClip GetAudioClip(string name)
{
#if UNITY_EDITOR
string[] assets = AssetDatabase.FindAssets(name, null);
for (int idx = 0; idx < assets.Length; idx++)
{
string path = AssetDatabase.GUIDToAssetPath(assets[idx]);
if (path.Contains(".wav"))
{
return AssetDatabase.LoadAssetAtPath<AudioClip>(path);
}
}
#endif
return null;
}
public static Cubemap GetAssetCubemap(string name)
{
#if UNITY_EDITOR
string[] assets = AssetDatabase.FindAssets(name, null);
for (int idx = 0; idx < assets.Length; idx++)
{
string path = AssetDatabase.GUIDToAssetPath(assets[idx]);
if (path.Contains(".png"))
{
return AssetDatabase.LoadAssetAtPath<Cubemap>(path);
}
else if (path.Contains(".jpg"))
{
return AssetDatabase.LoadAssetAtPath<Cubemap>(path);
}
}
#endif
return null;
}
public static EnviroProfile GetDefaultProfile(string name)
{
#if UNITY_EDITOR
string[] assets = AssetDatabase.FindAssets(name, null);
for (int idx = 0; idx < assets.Length; idx++)
{
string path = AssetDatabase.GUIDToAssetPath(assets[idx]);
if (path.Contains(".asset"))
{
return AssetDatabase.LoadAssetAtPath<EnviroProfile>(path);
}
}
#endif
return null;
}
public static Texture GetAssetTexture(string name)
{
#if UNITY_EDITOR
string[] assets = AssetDatabase.FindAssets(name, null);
for (int idx = 0; idx < assets.Length; idx++)
{
string path = AssetDatabase.GUIDToAssetPath(assets[idx]);
if (path.Length > 0)
{
return AssetDatabase.LoadAssetAtPath<Texture>(path);
}
}
#endif
return null;
}
public static Gradient CreateGradient(Color clr1, float time1, Color clr2, float time2)
{
Gradient nG = new Gradient ();
GradientColorKey[] gClr = new GradientColorKey[2];
GradientAlphaKey[] gAlpha = new GradientAlphaKey[2];
gClr [0].color = clr1;
gClr [0].time = time1;
gClr [1].color = clr2;
gClr [1].time = time2;
gAlpha [0].alpha = 1f;
gAlpha [0].time = 0f;
gAlpha [1].alpha = 1f;
gAlpha [1].time = 1f;
nG.SetKeys (gClr, gAlpha);
return nG;
}
public static Gradient CreateGradient(List<Color> clrs,List<float>times)
{
Gradient nG = new Gradient ();
GradientColorKey[] gClr = new GradientColorKey[clrs.Count];
GradientAlphaKey[] gAlpha = new GradientAlphaKey[2];
for (int i = 0; i < clrs.Count; i++) {
gClr [i].color = clrs [i];
gClr [i].time = times[i];
}
gAlpha [0].alpha = 1f;
gAlpha [0].time = 0f;
gAlpha [1].alpha = 1f;
gAlpha [1].time = 1f;
nG.SetKeys (gClr, gAlpha);
return nG;
}
public static Gradient CreateGradient(List<Color> clrs, List<float> times, List<float> alpha, List<float> timesAlpha)
{
Gradient nG = new Gradient();
GradientColorKey[] gClr = new GradientColorKey[clrs.Count];
GradientAlphaKey[] gAlpha = new GradientAlphaKey[alpha.Count];
for (int i = 0; i < clrs.Count; i++)
{
gClr[i].color = clrs[i];
gClr[i].time = times[i];
}
for (int i = 0; i < alpha.Count; i++)
{
gAlpha[i].alpha = alpha[i];
gAlpha[i].time = timesAlpha[i];
}
nG.SetKeys(gClr, gAlpha);
return nG;
}
public static Color GetColor (string hex)
{
Color clr = new Color ();
ColorUtility.TryParseHtmlString (hex, out clr);
return clr;
}
public static Keyframe CreateKey (float value, float time)
{
Keyframe k = new Keyframe();
k.value = value;
k.time = time;
return k;
}
public static Keyframe CreateKey (float value, float time, float inTangent, float outTangent)
{
Keyframe k = new Keyframe();
k.value = value;
k.time = time;
k.inTangent = inTangent;
k.outTangent = outTangent;
return k;
}
}