|
|
- //CHANGE LOG
-
- /*
- ----[ v 3.2.1 ]----
- * Fog Volume data will ignore cameras without HideFlags.None
- * Less garbage allocation
- * Replaced PointLight component with a general purpose FogVolumeLight component
- * Added a LightManager component that is now responsible for handling lights
- It is automatically added to each FogVolume
- * Added spot lights
- * Added Fog Volume lights (point and spot) that work without a real point or spotlight
- * Added Fog Volume to the menu bar, including new options for light creation
- * New 'Light visibility' option in the inspector allows to modify the culling behaviour of point lights
- * Depth buffer won't be affected now with the camera clip planes.
- * A textured Fog Volume can be now excluded from the low-res process. Useful to render FV with a different camera, i.e water refraction
- * Directional Light allows now multiple volumes. User will have to reasign the target volume.
- * "Render in scene view" is now a per-volume option
- * Added an option to receive a depth map externally "_CustomCameraDepthTexture"
- * FV shadow map faded at the edges, so pixels are not stretched
- * Added Directional light option to the 'Fog Volume' menu
- - Only available when a directional light and at least one FogVolume is present
-
- ----[ v 3.2.1p1 ]----
- * Fixed an error that didn't update FrustumPlanes correctly
- * Camera script shows a message when user adds FogVolume.cs to the camera. The camera is then cleaned OnEnable()
- * Reasigned ShadowProjectorMesh when it is null
-
- ----[ v 3.2.1p2 ]----
- * Fixed a bug related with visibility
- * Mesh filter is hidden from inspector
- * Lights can now be turned on/off without the need for toggling "Real-time search".
- * Camera script can be removed when "Disable camera script"== ON in FogVolumeData
- * Directional light debug miniature can be moved now
- * Added a culling mask field for depth pass
- * LightManager is correctly hidden from inspector
- * Fixed unneeded shadow work performed in Depth pass
-
- ----[ v 3.2.1p3 ] ----
- * Better depth-buffer behaviour on non-windows platforms
- * Glitch fixing: shading rounding precission -venus scene-, more solid editing of quality-settings, better scene-game viewports relationship.
- * Lights now works on OpenGL (there was a too-many-uniforms error)
- * Better behaviour of surrogates in Mac
- * Better CPU perf
- * Updated VR showroom (now mostly event driven, using SteamVR's libs, improved VR start location -counter transformed start into meat space-, etc)
-
-
-
-
- ----[ v 3.2.1p4 ] ----
- * Added FogVolumePrimitiveManager which supports up to 20 primitives that can be visible at the same time.
- * The total amount of supported primitives is the same as for lights and is set to 1000. Only the 20 closest to the camera will be taken into account.
- * Fixed a bug where removing a light would always return false.
- * Overhauled the FogVolume menu to make it more accessible.
- * Reduced garbage allocation for version before Unity 2017.3 (GeometryUtility.CalculateFrustumPlanes()).
- * FogVolumeLightManager methods that are meant to be accessed by the user are:
- - AddSimulatedSpotLight()
- - AddSimulatedPointLight()
- - AddPointLight()
- - AddSpotLight()
- - RemoveLight()
- - SetPointOfInterest()
- * FogVolumePrimitiveManager methods that are meant to be accessed by the user are:
- - AddPrimitiveBox()
- - AddPrimitiveSphere()
- - RemovePrimitie()
- - SetPointOfInterest()
-
-
-
- ----[ v 3.3 ] ----
- * Fixed a bug that made primitives to not work in the build
- * Each FogVolume will now store it's material.
- - The path where the materials are stored is specified by the constant MaterialPath.
-
- ----[ v 3.3.1 ] ----
- * Unity returned FALSE with SystemInfo.supports3DTextures in webgl. But it is supported, so removed that damn thing to enable 3D textures in webgl.
-
- ----[ v 3.4 ] ----
- * Improved VR support. Parent object is not required now
- * Bilateral upsampling done for stereo rendering
- * DeNoise executed when not in play
- */
-
- using UnityEngine;
- using System.Reflection;
- using System.Collections.Generic;
- using System.Runtime.Serialization.Formatters;
- using UnityEngine.SceneManagement;
- #if UNITY_EDITOR
- using UnityEditor.SceneManagement;
- #endif
- using UnityEngine.Profiling;
- using FogVolumeUtilities;
-
- #if UNITY_EDITOR
- using UnityEditor;
- using System.IO;
- #endif
-
- [ExecuteInEditMode]
- //[RequireComponent(typeof(FogVolumeLightManager))]
- public class FogVolume : MonoBehaviour
- {
- #region InspectorData
- #if UNITY_EDITOR
- public bool showLighting,
- OtherTAB,
- showGradient,
- showPointLights,
- showNoiseProperties,
- showVolumeProperties,
- showColorTab,
- tempShadowCaster,
- showCustomizationOptions,
- showDebugOptions,
- showOtherOptions,
- generalInfo,
- TexturesGroup;
-
- public string BackgroundImagesPath;
- #endif
- #endregion
-
- public enum FogType
- {
- Uniform = 0,
- Textured = 1
- }
-
- public FogType _FogType;
- public bool RenderableInSceneView = true;
- GameObject FogVolumeGameObject;
- public FogVolume ShadowCaster;
- public Texture2D _PerformanceLUT;
- //public float bias = .5f;
- public Vector3 fogVolumeScale = new Vector3(20, 20, 20);
- [SerializeField]
- public Color FogMainColor = Color.white;
- public Color _FogColor = Color.white;
- public bool _AmbientAffectsFogColor = false;
- [Range(1, 5)]
- public float Exposure = 2.5f;
- [Range(-.5f, .5f)]
- public float Offset = 0;
- [Range(.01f, 3)]
- public float Gamma = 1;
- public bool Tonemap = false;
- public float Visibility = 25;
- [HideInInspector]
- public bool ColorAdjust = false;
- [Header("Lighting")]
- public int _SelfShadowSteps = 3;
- public int ShadowCameraSkippedFrames = 0;
- public Color _SelfShadowColor = Color.black;
- public float VolumeFogInscatteringAnisotropy = .5f;
- public float VolumeFogInscatteringIntensity = .1f;
- public float VolumeFogInscatteringStartDistance = 10f;
- public float VolumeFogInscatteringTransitionWideness = 1;
- public Color VolumeFogInscatteringColor = Color.white;
- public bool VolumeFogInscattering = false;
- public float HeightAbsorption, HeightAbsorptionMin = -1, HeightAbsorptionMax = -1;
- public bool SunAttached;
- [SerializeField]
- public Light Sun = null;
- [SerializeField]
- public bool _ShadeNoise = false;
- public bool _DirectionalLighting = false;
- public float _DirectionalLightingDistance = .01f;
- // public float DirectionalLightingClamp = 2;
- public float DirectLightingShadowDensity = 1;
- public Color LightExtinctionColor = new Color(81 / 255f, 45 / 255f, 26 / 255f, 0);
- public int DirectLightingShadowSteps = 1;
- public bool bAbsorption = true;
- public float Absorption = .5f;
- public float _LightExposure = 1;
- public bool Lambert = false;
- public float LambertianBias = 1;
- public float NormalDistance = .01f;
- public float DirectLightingAmount = 1;
- public float DirectLightingDistance = 10;
- [Range(1, 3)]
- public float ShadowBrightness = 1;
- public Color _AmbientColor = Color.gray;
- bool _ProxyVolume = false;
- // [SerializeField]
- // [Range(1, 10)]
- // public float Shade = 1;
- [SerializeField]
- [Range(.0f, .15f)]
- public float ShadowShift = 0.0094f;
- [Range(0, 5)]
- public float PointLightsIntensity = 1;
- // public PointLight[] PointLights;
- // public List<PointLight> PointLightsList;
- public float PointLightingDistance = 1000, PointLightingDistance2Camera = 50;
-
- public float PointLightCullSizeMultiplier = 1.0f;
- public bool PointLightsActive = false;
-
- public bool EnableInscattering = false;
- public Color InscatteringColor = Color.white;
- public Texture2D _LightHaloTexture, CoverageTex;
- public bool LightHalo;
- public float _HaloWidth = .75f;
- public float _HaloOpticalDispersion = 1;
- public float _HaloRadius = 1;
- public float _HaloIntensity = 1;
- public float _HaloAbsorption = .5f;
- [Range(-1, 1)]
- public float
- InscatteringShape = 0;
- public float InscatteringIntensity = .2f, InscatteringStartDistance = 00, InscatteringTransitionWideness = 1;
-
- [Header("Noise")]
- public bool EnableNoise = false;
-
- public int Octaves = 1;
- public float _DetailMaskingThreshold = 18;
- // public float DetailSamplingBaseOpacityLimit = .3f;
- public bool bSphericalFade = false;
- public float SphericalFadeDistance = 10;
- public float DetailDistance = 500;
- public float DetailTiling = 1;
- public float _DetailRelativeSpeed = 10;
- public float _BaseRelativeSpeed = 1;
- public float _NoiseDetailRange = .5f, _Curl = .5f;
- public float BaseTiling = 8;
- public float Coverage = 1.5f;
- public float NoiseDensity = 1;
- // [SerializeField]
- // public bool Procedural = false;
- //[SerializeField]
- //bool DoubleLayer = false;
- //[SerializeField]
- public float _3DNoiseScale = 80;
- // [SerializeField]
- [Range(10f, 300)]
- public int Iterations = 85;
-
- public FogVolumeRenderer.BlendMode _BlendMode = FogVolumeRenderer.BlendMode.TraditionalTransparency;
- //[SerializeField]
- // [Range(10, 2000)]
- public float IterationStep = 500, _OptimizationFactor = 0;
- public enum SamplingMethod
- {
- Eye2Box = 0,
- ViewAligned = 1
- }
- public SamplingMethod _SamplingMethod = (SamplingMethod)0;
- public enum DebugMode
- {
- Lit,
- Iterations,
- Inscattering,
- VolumetricShadows,
- VolumeFogInscatterClamp,
- VolumeFogPhase
- }
- public bool _VisibleByReflectionProbeStatic = true;
- FogVolumeRenderer _FogVolumeRenderer = null;
- public GameObject GameCameraGO = null;
- public DebugMode _DebugMode = DebugMode.Lit;
- public bool useHeightGradient = false;
- public float GradMin = 1, GradMax = -1, GradMin2 = -1, GradMax2 = -1;
- public Texture3D _NoiseVolume2;
- public Texture3D _NoiseVolume = null;
- [Range(0f, 10)]
-
- public float NoiseIntensity = 0.3f;
-
- public void setNoiseIntensity(float value)
- {
- NoiseIntensity = value;
- }
- //[Range(1, 200)]
-
- [Range(0f, 5f)]
- public float
- NoiseContrast = 12;
- public float FadeDistance = 5000;
- [Range(0, 20)]
- public float Vortex = 0;
- public enum VortexAxis
- {
- X = 0,
- Y = 1,
- Z = 2
- }
-
-
- public VortexAxis _VortexAxis = (VortexAxis)2;
-
- public bool bVolumeFog = false;
- public bool VolumeFogInscatterColorAffectedWithFogColor = true;
- public enum LightScatterMethod
- {
- BeersLaw = 0,
- InverseSquare = 1,
-
- Linear = 2
- }
- public LightScatterMethod _LightScatterMethod = (LightScatterMethod)1;
- [Range(0, 360)]
- public float rotation = 0;
- [Range(0, 10)]
- public float RotationSpeed = 0;
- public Vector4 Speed = new Vector4(0, 0, 0, 0);
- public Vector4 Stretch = new Vector4(0, 0, 0, 0);
- [SerializeField]
- [Header("Collision")]
- public bool SceneCollision = true;
- public bool ShowPrimitives = false;
- public bool EnableDistanceFields = false;
- //public List<FogVolumePrimitive> PrimitivesList;
- public float _PrimitiveEdgeSoftener = 1;
- public float _PrimitiveCutout = 0;
- public float Constrain = 0;
- [SerializeField]
- //[Range(1, 200)]
- //float _SceneIntersectionThreshold = 1000;
- //[SerializeField]
- [Range(1, 200)]
- public float _SceneIntersectionSoftness = 1;
- [SerializeField]
- [Range(0, .1f)]
- public float _jitter = 0.0045f;
- public MeshRenderer FogRenderer = null;
- public Texture2D[] _InspectorBackground;
- public int _InspectorBackgroundIndex = 0;
-
- public string Description = "";
- [Header("Gradient")]
- public bool EnableGradient = false;
- public Texture2D Gradient;
-
- // #if UNITY_EDITOR
- [SerializeField]
- public bool HideWireframe = true;
- // #endif
- [SerializeField]
- public bool SaveMaterials = false;
- [SerializeField]
- public bool RequestSavingMaterials = false;
- [SerializeField]
- public int
- DrawOrder = 0;
-
- [SerializeField]
- public bool ShowDebugGizmos = false;
- MeshFilter filter;
- Mesh mesh;
- public RenderTexture RT_Opacity, RT_OpacityBlur;
-
- public float ShadowCutoff = 1f;
- Vector3 currentFogVolume = Vector3.one;
- public bool CastShadows = false;
- public GameObject ShadowCameraGO;
- public int shadowCameraPosition = 20;
- public int ShadowCameraPosition
- {
- set
- {
- if (value != shadowCameraPosition)
- {
- shadowCameraPosition = value;
- _ShadowCamera.CameraTransform();
- }
- }
- get
- {
- return shadowCameraPosition;
- }
- }
- public ShadowCamera _ShadowCamera;
-
- public float _PushAlpha = 1;
- public float GetVisibility()
- {
- return Visibility;
- }
-
- // public Material _FogMaterial { get { return FogMaterial; } }
- [SerializeField]
- Material fogMaterial = null;
- public Material FogMaterial
- {
- get
- {
- if (fogMaterial == null)
- {
- CreateMaterial();
- }
- return fogMaterial;
- }
- }
- public Shader FogVolumeShader;
-
- #if UNITY_EDITOR
- private string m_prevFVName = null;
- #endif
-
-
- void RemoveMaterial()
- {
- #if UNITY_EDITOR
- Scene activeScene = EditorSceneManager.GetActiveScene();
- string activeScenePath =
- activeScene.path.Substring(0,
- activeScene.path.Length - activeScene.name.Length -
- 7);
- string materialName = m_prevFVName + "_Material";
- string[] materials = AssetDatabase.FindAssets(materialName);
- if (materials.Length != 0)
- {
- AssetDatabase.DeleteAsset(activeScenePath + "/" + activeScene.name + "/" +
- materialName + ".mat");
- }
- #endif
- }
-
- void CreateMaterial()
- {
- if (SaveMaterials)
- {
- #if UNITY_EDITOR
- Scene activeScene = EditorSceneManager.GetActiveScene();
-
- if (activeScene.path.Length == 0)
- {
- Debug.LogWarning("The scene must be saved in order to enable 'SaveMaterials'!");
- FogVolumeShader = Shader.Find("Hidden/FogVolume");
- fogMaterial = new Material(FogVolumeShader);
- SaveMaterials = false;
- return;
- }
-
- string activeScenePath =
- activeScene.path.Substring(0,
- activeScene.path.Length - activeScene.name.Length -
- 7);
- string materialName = FogVolumeGameObject.name + "_Material.mat";
- string[] materials = AssetDatabase.FindAssets(materialName);
- if (materials.Length == 0)
- {
- FogVolumeShader = Shader.Find("Hidden/FogVolume");
- fogMaterial = new Material(FogVolumeShader);
-
- bool subfolderExists = false;
- string[] subfolders = AssetDatabase.GetSubFolders(activeScenePath);
- for (int i = 0; i < subfolders.Length; i++)
- {
- if (subfolders[i].Substring(subfolders[i].Length - activeScene.name.Length, activeScene.name.Length) == activeScene.name)
- {
- subfolderExists = true;
- break;
- }
- }
-
- if (!subfolderExists)
- {
- AssetDatabase.CreateFolder(activeScenePath, activeScene.name);
- }
-
- AssetDatabase.CreateAsset(fogMaterial,
- activeScenePath + "/" + activeScene.name + "/" +
- materialName);
- }
- else
- {
- fogMaterial =
- AssetDatabase.LoadAssetAtPath(activeScenePath + "/" + activeScene.name +
- "/" + materialName,
- typeof(Material)) as Material;
- }
- #else
- FogVolumeShader = Shader.Find("Hidden/FogVolume");
- fogMaterial = new Material(FogVolumeShader);
- #endif
- }
- else
- {
- DestroyImmediate(fogMaterial);
- FogVolumeShader = Shader.Find("Hidden/FogVolume");
-
- // FogVolumeShader.maximumLOD = 600;
- fogMaterial = new Material(FogVolumeShader);
- try
- {
- fogMaterial.name = FogVolumeGameObject.name + " Material";
- }
- catch
- {
- print(name);
- }
- fogMaterial.hideFlags = HideFlags.HideAndDontSave;
-
- }
- }
-
- //void SetCameraDepth()
- //{
- // if (ForwardRenderingCamera)
- // ForwardRenderingCamera.depthTextureMode |= DepthTextureMode.Depth;
- //}
- #if UNITY_EDITOR
- void CreateLayer(string LayerName)
- {
- // https://forum.unity3d.com/threads/adding-layer-by-script.41970/reply?quote=2274824
- SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
- SerializedProperty layers = tagManager.FindProperty("layers");
- bool ExistLayer = false;
- //print(ExistLayer);
- for (int i = 8; i < layers.arraySize; i++)
- {
- SerializedProperty layerSP = layers.GetArrayElementAtIndex(i);
-
- //print(layerSP.stringValue);
- if (layerSP.stringValue == LayerName)
- {
- ExistLayer = true;
- break;
- }
-
- }
- for (int j = 8; j < layers.arraySize; j++)
- {
- SerializedProperty layerSP = layers.GetArrayElementAtIndex(j);
- if (layerSP.stringValue == "" && !ExistLayer)
- {
- layerSP.stringValue = LayerName;
- tagManager.ApplyModifiedProperties();
-
- break;
- }
- }
-
- // print(layers.arraySize);
- }
-
-
-
- #endif
- [SerializeField]
- GameObject ShadowProjector;
- MeshRenderer ShadowProjectorRenderer;
- MeshFilter ShadowProjectorMeshFilter;
- Material ShadowProjectorMaterial;
- //Shader ShadowProjectorShader;
- public Mesh ShadowProjectorMesh;
- public Color ShadowColor = new Color(.5f, .5f, .5f, .25f);
- //Vector3 ShadowProjectorScaleBackup = new Vector3(20, 20, 20);
- //Vector3 ShadowProjectorPositionBackup;
- public UnityEngine.Rendering.CompareFunction _ztest = UnityEngine.Rendering.CompareFunction.Disabled;
-
- void ShadowProjectorLock()
- {
- if (ShadowProjector)
- {
- ShadowProjector.transform.position = new Vector3(
- FogVolumeGameObject.transform.position.x,
- ShadowProjector.transform.position.y,
- FogVolumeGameObject.transform.position.z);
-
- Vector3 ShadowProjectorScale = new Vector3(fogVolumeScale.x, ShadowProjector.transform.localScale.y, fogVolumeScale.z);
- ShadowProjector.transform.localScale = ShadowProjectorScale;
-
- ShadowProjector.transform.localRotation = new Quaternion();
- }
- }
- void ShadowMapSetup()
- {
- if (ShadowCameraGO)
- {
- //print(ShadowCameraGO.name);
- //DestroyImmediate(ShadowCameraGO);
- // ShadowCameraGO.hideFlags = HideFlags.None;
- // ShadowCameraGO.hideFlags = HideFlags.HideInHierarchy;
- ShadowCameraGO.GetComponent<Camera>().cullingMask = 1 << LayerMask.NameToLayer("FogVolumeShadowCaster");
- ShadowCameraGO.GetComponent<Camera>().renderingPath = RenderingPath.Forward;
- _ShadowCamera.CameraTransform();
- }
- //The volume must be square, sir
- if (CastShadows)
- {
- fogVolumeScale.z = fogVolumeScale.x;
- }
-
-
-
- //Create shadow projector
- if (CastShadows)
- {
- ShadowProjector = GameObject.Find(FogVolumeGameObject.name + " Shadow Projector");
- if (ShadowProjector == null)
- {
- ShadowProjector = new GameObject();
-
- ShadowProjector.AddComponent<MeshFilter>();
- ShadowProjector.AddComponent<MeshRenderer>();
- ShadowProjector.transform.parent = FogVolumeGameObject.transform;
- ShadowProjector.transform.position = FogVolumeGameObject.transform.position;
- ShadowProjector.transform.rotation = FogVolumeGameObject.transform.rotation;
- ShadowProjector.transform.localScale = fogVolumeScale;
- ShadowProjector.GetComponent<MeshRenderer>().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
- ShadowProjector.GetComponent<MeshRenderer>().receiveShadows = false;
- ShadowProjector.GetComponent<MeshRenderer>().reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off;
- ShadowProjector.GetComponent<MeshRenderer>().lightProbeUsage = UnityEngine.Rendering.LightProbeUsage.Off;
- }
-
- //ShadowProjector.hideFlags = HideFlags.DontSave;
-
-
- ShadowProjectorMeshFilter = ShadowProjector.GetComponent<MeshFilter>();
- //doesnt work ShadowProjectorMesh = Resources.Load("ShadowVolume") as Mesh;
- ShadowProjectorMeshFilter.mesh = ShadowProjectorMesh;
- //3.1.3 for some reason, the mesh is lost in the VR showroom
- if (ShadowProjectorMesh == null)
- {
- GameObject tempShadowBoxGO = GameObject.CreatePrimitive(PrimitiveType.Cube);
- ShadowProjectorMesh = tempShadowBoxGO.GetComponent<MeshFilter>().mesh;
- DestroyImmediate(tempShadowBoxGO, true);
- }
-
- if (ShadowProjector.GetComponent<MeshFilter>().sharedMesh == null)
- ShadowProjector.GetComponent<MeshFilter>().mesh = ShadowProjectorMesh;
-
- if (ShadowProjectorMesh == null) print("Missing mesh");
-
- ShadowProjectorRenderer = ShadowProjector.GetComponent<MeshRenderer>();
- ShadowProjectorRenderer.lightProbeUsage = UnityEngine.Rendering.LightProbeUsage.Off;
- ShadowProjectorRenderer.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off;
- ShadowProjectorRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
- ShadowProjectorRenderer.receiveShadows = false;
- ShadowProjectorMaterial = ShadowProjectorRenderer.sharedMaterial;
- ShadowProjector.name = FogVolumeGameObject.name + " Shadow Projector";
- if (ShadowProjectorMaterial == null)
- {
- ShadowProjectorMaterial = new Material(Shader.Find("Fog Volume/Shadow Projector"));
- //ShadowProjectorMaterial = new Material(Shader.Find("Diffuse"));
-
- ShadowProjectorMaterial.name = "Shadow Projector Material";
- // ShadowProjectorMaterial.hideFlags = HideFlags.HideAndDontSave;
-
- }
- ShadowProjectorRenderer.sharedMaterial = ShadowProjectorMaterial;
- }
- }
-
- void SetShadowProyectorLayer()
- {
- //lets hide it when we don't render it in scene view. We will send it to the UI layer to make it easy
- if (ShadowProjector)
- {
- if (RenderableInSceneView == false)
- {
- if (ShadowProjector.layer == LayerMask.NameToLayer("Default"))
- {
- ShadowProjector.layer = LayerMask.NameToLayer("UI");
- // print("switch projector to UI");
- }
- }
- else
- {
- if (ShadowProjector.layer == LayerMask.NameToLayer("UI"))
- {
- ShadowProjector.layer = LayerMask.NameToLayer("Default");
- // print("switch projector to Default");
- }
- }
- }
- }
-
- void FindDirectionalLight()
- {
- //pick a light
- Light[] SceneLights = FindObjectsOfType<Light>();
- //first, try to get it from light settings
- if (!Sun)
- Sun = RenderSettings.sun;
-
- //not yet?
- if (!Sun)
- foreach (Light TempLight in SceneLights)
- {
-
- if (TempLight.type == LightType.Directional)
- {
- Sun = TempLight;
- break;
- }
- }
-
- if (Sun == null)
- {
- Debug.LogError("Fog Volume: No valid light found\nDirectional light is required. Light component can be disabled.");
- return;
- }
- else
- {
-
- //remove fog layers from light 3.1.8. Light must not affect the volume we want to use as density for the screen effect
- Sun.cullingMask &= ~(1 << LayerMask.NameToLayer("FogVolumeUniform"));
- Sun.cullingMask &= ~(1 << LayerMask.NameToLayer("FogVolume"));
- Sun.cullingMask &= ~(1 << LayerMask.NameToLayer("FogVolumeSurrogate"));
- // Sun.cullingMask &= ~(1 << LayerMask.NameToLayer("FogVolumeShadowCaster"));
- }
- }
- private Plane[] FrustumPlanes;
- Camera GameCamera;
- Material SurrogateMaterial;
- BoxCollider _BoxCollider;
- public FogVolumeData _FogVolumeData;
- GameObject _FogVolumeDataGO;
- public void FindFogVolumeData()
- {
- if (_FogVolumeDataGO == null)
- {
- FogVolumeData[] aFVD = FindObjectsOfType<FogVolumeData>();
-
- if (aFVD.Length == 0)
- {
- _FogVolumeDataGO = new GameObject();
- _FogVolumeData = _FogVolumeDataGO.AddComponent<FogVolumeData>();
- _FogVolumeDataGO.name = "Fog Volume Data";
- }
- else
- {
- _FogVolumeDataGO = aFVD[0].gameObject;
- _FogVolumeData = aFVD[0];
- }
- }
- else { _FogVolumeData = _FogVolumeDataGO.GetComponent<FogVolumeData>(); }
-
- }
- /* With ExcludeFromLowRes enabled a textured FV is excluded from the low-res process.
- * So it can be rendered by another camera, for example, a water reflection or refraction camera
- * Then, we have to feed it with a custom DepthTexture that ignores the clip planes. _CameraDepthTexture is not valid because
- * the clip planes of a camera like MirrorReflection.cs break FV. The provided shader Depth.shader will generate
- * a valid depth texture
- */
- public bool ExcludeFromLowRes = false;
- void MoveToLayer()
- {
- if (!CastShadows)
- {
- if (!ExcludeFromLowRes)
- {
- if (_FogType == FogType.Textured)
- {
- if (FogVolumeGameObject.layer != LayerMask.NameToLayer("FogVolume"))
- {
- FogVolumeGameObject.layer = LayerMask.NameToLayer("FogVolume");
- // print("Moved to FogVolume layer");
- }
-
-
- }
- else
- {
- if (FogVolumeGameObject.layer != LayerMask.NameToLayer("FogVolumeUniform"))
- {
- FogVolumeGameObject.layer = LayerMask.NameToLayer("FogVolumeUniform");
- // FogMaterial.DisableKeyword("ExternalDepth");
- }
- }
- }
-
- }
- }
- public void AssignCamera()
- {
-
- FindFogVolumeData();
- if (_FogVolumeDataGO == null) return;//wait til update check
-
- if (_FogVolumeData.GetFogVolumeCamera != null)
- GameCameraGO = _FogVolumeData.GetFogVolumeCamera.gameObject;
-
- if (GameCameraGO == null)
- {
-
- //Debug.Log("No camera available in "+gameObject.name);
- this.enabled = false;
- return;
- }
- else
- this.enabled = true;
-
- GameCamera = GameCameraGO.GetComponent<Camera>();
-
- _FogVolumeRenderer = GameCameraGO.GetComponent<FogVolumeRenderer>();
- if (_FogVolumeRenderer == null)
- {
- if (!_FogVolumeData.ForceNoRenderer)
- {
- _FogVolumeRenderer = GameCameraGO.AddComponent<FogVolumeRenderer>();
- _FogVolumeRenderer.enabled = true;
- }
- }
- else
- if (_FogVolumeData.ForceNoRenderer == false)//3.1.8 Lets preserve that option
- _FogVolumeRenderer.enabled = true;
- }
- void SetIcon()
- {
- #if UNITY_EDITOR
- Texture Icon = Resources.Load("FogVolumeIcon") as Texture;
- //Icon.hideFlags = HideFlags.HideAndDontSave;
- var editorGUI = typeof(EditorGUIUtility);
- var bindingFlags = BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.NonPublic;
- var args = new object[] { gameObject, Icon };
- editorGUI.InvokeMember("SetIconForObject", bindingFlags, null, null, args);
- #endif
- }
-
-
- int MessageDelay;
- void OnEnable()
- {
- m_lightManager = null;
- m_primitiveManager = null;
- #if UNITY_EDITOR
- m_prevFVName = gameObject.name;
- fogMaterial = null;
- #endif
- SetIcon();
- //Low resolution renderer setup
- AssignCamera();
-
- SurrogateMaterial = Resources.Load("Fog Volume Surrogate", typeof(Material)) as Material;
- FindDirectionalLight();
- _BoxCollider = GetComponent<BoxCollider>();
-
- if (_BoxCollider == null)
- _BoxCollider = gameObject.AddComponent<BoxCollider>();
-
- _BoxCollider.hideFlags = HideFlags.HideAndDontSave;
-
- _BoxCollider.isTrigger = true;
-
- FogVolumeGameObject = this.gameObject;
- #if UNITY_EDITOR
- CreateLayer("FogVolumeShadowCaster");
- CreateLayer("FogVolume");
- CreateLayer("FogVolumeSurrogate");
- CreateLayer("FogVolumeUniform");
- #endif
- FogRenderer = FogVolumeGameObject.GetComponent<MeshRenderer>();
- if (FogRenderer == null)
- FogRenderer = FogVolumeGameObject.AddComponent<MeshRenderer>();
-
- FogRenderer.sharedMaterial = FogMaterial;
- ToggleKeyword();
-
- // FogRenderer.lightProbeUsage = UnityEngine.Rendering.LightProbeUsage.Off;
-
- //Shadow cam setup (GO, camera, components)
- if (FogRenderer.shadowCastingMode == UnityEngine.Rendering.ShadowCastingMode.On)
- {
- string ShadowCameraName = FogVolumeGameObject.name + " Shadow Camera";
- ShadowCameraGO = GameObject.Find(ShadowCameraName);
- if (ShadowCameraGO == null)
- {
- ShadowCameraGO = new GameObject(ShadowCameraName);
- ShadowCameraGO.transform.parent = FogVolumeGameObject.transform;
- ShadowCameraGO.AddComponent<Camera>();
- Camera ShadowCamera = ShadowCameraGO.GetComponent<Camera>();
- ShadowCamera.orthographic = true;
- ShadowCamera.depth = -6;
- ShadowCamera.clearFlags = CameraClearFlags.Color;
- ShadowCamera.backgroundColor = new Color(0, 0, 0, 0);
- ShadowCamera.allowHDR = false;
- ShadowCamera.allowMSAA = false;
- _ShadowCamera = ShadowCameraGO.AddComponent<ShadowCamera>();
-
-
-
- }
- //ShadowCameraGO.hideFlags = HideFlags.None;
- ShadowCameraGO.hideFlags = HideFlags.HideInHierarchy;
- _ShadowCamera = ShadowCameraGO.GetComponent<ShadowCamera>();
- ShadowMapSetup();
- //-----------------------------
- }
-
- if (filter == null)
- {
- filter = gameObject.GetComponent<MeshFilter>();
- CreateBoxMesh(transform.localScale);
- transform.localScale = Vector3.one;
- }
- filter.hideFlags = HideFlags.HideInInspector;
- UpdateBoxMesh();
-
- _PerformanceLUT = Resources.Load("PerformanceLUT") as Texture2D;
-
- //first check
- GetShadowMap();
- _FogVolumeData.FindFogVolumes();//3.2
- #region LoadBackgroundImages
- #if UNITY_EDITOR
- // string BackgroundImagesPath = Application.dataPath + "/FogVolume/Scripts/Themes/png";
- #endif
- #endregion
-
- if (FrustumPlanes == null) { FrustumPlanes = new Plane[6]; }
- _InitializeLightManagerIfNeccessary();
- _InitializePrimitiveManagerIfNeccessary();
- }
- public float PointLightCPUMaxDistance = 1;
- GameObject PointLightsCameraGO = null;
- Camera PointLightsCamera = null;
- float GetPointLightDistance2Camera(Vector3 lightPosition)
- {
- PointLightsCameraGO = Camera.current.gameObject;//so it works in scene view too
-
- float Distance = (lightPosition - PointLightsCameraGO.transform.position).magnitude;
- // print(Distance);
- return Distance;
- }
-
- public float PointLightScreenMargin = 1f;
-
- //bool PointLightRangeVisible(PointLight p)
- //{
- // Collider pCol = p.GetComponent<SphereCollider>();
- // bool visible = true;
- // if (Application.isPlaying)
- // {
- // if (GeometryUtility.TestPlanesAABB(FrustumPlanes, pCol.bounds))
- // visible = true;
- // else
- // visible = false;
-
- // }
- // else
- // visible = PointIsVisible(p.transform.position);
-
- // // print(visible);
- // return visible;
- //}
-
- bool PointIsVisible(Vector3 point)
- {
- PointLightsCamera = PointLightsCameraGO.GetComponent<Camera>();//for scene view!
- //possible TODO: attenuate light when it is outside view
- float marginNeg = 0 - PointLightScreenMargin;
- float marginPos = 1 + PointLightScreenMargin;
- bool visible = true;
- Vector3 screenPoint = PointLightsCamera.WorldToViewportPoint(point);
-
- if (screenPoint.z > marginNeg && screenPoint.x > marginNeg && screenPoint.x < marginPos
- && screenPoint.y > marginNeg && screenPoint.y < marginPos)
- {
- // print("visible");
- visible = true;
- }
- else
- {
- //print("no visible");
- visible = false;
- }
-
- return visible;
- }
-
- //bool isPointLightInVisibleRange(PointLight light)
- //{
- // Vector3 position = light.gameObject.transform.position;
- // float Distance = GetPointLightDistance2Camera(position);
-
-
- // if (Distance > PointLightingDistance2Camera)
- // return false;
- // else
- // {
- // return PointLightRangeVisible(light);
- // }
- //}
- public bool PointLightsRealTimeUpdate = true;
- public bool PointLightBoxCheck = true;
-
-
-
-
- public bool PointIsInsideVolume(Vector3 PointPosition)
- {
-
- //todo: rotation!
- bool result = false;
- float FogVolumeXmax = gameObject.transform.position.x + fogVolumeScale.x / 2;
- float FogVolumeXmin = gameObject.transform.position.x - fogVolumeScale.x / 2;
-
- float FogVolumeYmax = gameObject.transform.position.y + fogVolumeScale.y / 2;
- float FogVolumeYmin = gameObject.transform.position.y - fogVolumeScale.y / 2;
-
- float FogVolumeZmax = gameObject.transform.position.z + fogVolumeScale.z / 2;
- float FogVolumeZmin = gameObject.transform.position.z - fogVolumeScale.z / 2;
-
- if (FogVolumeXmax > PointPosition.x && FogVolumeXmin < PointPosition.x)
- {
- // print("x dentro");
- if (FogVolumeYmax > PointPosition.y && FogVolumeYmin < PointPosition.y)
- {
- // print("y dentro");
- if (FogVolumeZmax > PointPosition.z && FogVolumeZmin < PointPosition.z)
- {
- // print("dentro");
- result = true;
- }
- }
-
- }
- // else
- // print("fuera");
- // print("nombre luz: " + FogLights.name);
- // print("x maximo: " + FogVolumeXmax + " x minimo: " + FogVolumeXmin);
- return result;
- }
- /*
- Vector4[] PrimitivePositions = new Vector4[20];
- Transform[] PrimitivePositionsTransform = new Transform[20];
- public Vector4[] GetPrimitivesPositions()
- {
- int index = 0;
-
- foreach (FogVolumePrimitive guy in PrimitivesList)
- {
- index = Mathf.Min(16, index);
- PrimitivePositionsTransform[index] = guy.GetTransform;
-
- PrimitivePositions[index] = this.gameObject.transform.
- InverseTransformPoint(PrimitivePositionsTransform[index].position);
- index++;
- }
- return PrimitivePositions;
- }
- Matrix4x4[] PrimitivesMatrixTransform = new Matrix4x4[20];
- Transform[] PrimitivesTransform = new Transform[20];
- public Matrix4x4[] GetPrimitivesTransform()
- {
- int index = 0;
-
- foreach (FogVolumePrimitive guy in PrimitivesList)
- {
- PrimitivesTransform[index] = guy.GetTransform;
-
-
- PrimitivesMatrixTransform[index].SetTRS(
- PrimitivesTransform[index].position,
- Quaternion.Inverse(PrimitivesTransform[index].rotation) * (gameObject.transform.rotation),
-
- Vector3.one
- )
-
- ;
-
- // MatrixTransform[index] = MatrixTransform[index].inverse;
- index++;
-
- }
- return PrimitivesMatrixTransform;
- }
-
- Vector4[] Scales = new Vector4[20];
- public Vector4[] GetPrimitivesScale()
- {
- int index = 0;
-
- foreach (FogVolumePrimitive guy in PrimitivesList)
- {
- Scales[index] = guy.GetPrimitiveScale;
- index++;
- }
- return Scales;
- }
- */
- // Vector4[] PointlightPositions = new Vector4[256];
- // Transform[] PointlightPositionsTransform = new Transform[256];
- //public Vector4[] GetPointLightPositions()
- //{
- // int index = 0;
-
-
- // if (PointLightsList.Count > 0)
- // foreach (PointLight guy in PointLightsList)
- // {
- // index = Mathf.Min(255, index);
- // // Positions[index] = guy.GetPointLightPosition;
- // if (guy != null)
- // {
- // PointlightPositionsTransform[index] = guy.GetTransform;
-
- // PointlightPositions[index] = this.gameObject.transform.
- // InverseTransformPoint(PointlightPositionsTransform[index].position);
- // }
- // index++;
-
- // }
- // return PointlightPositions;
- //}
-
- Vector3 LocalDirectionalSunLight(Light Sun)
- {
- return transform.InverseTransformVector(-Sun.transform.forward);
- }
- // Color[] PointlightColors = new Color[256];
- //public Color[] GetPointLightColors()
- //{
- // int index = 0;
-
- // if (PointLightsList.Count > 0)
- // foreach (PointLight guy in PointLightsList)
- // {
- // index = Mathf.Min(255, index);
- // if (guy != null)
- // PointlightColors[index] = guy.GetPointLightColor;
-
- // index++;
- // }
- // return PointlightColors;
- //}
-
- // float[] PointLightIntensity = new float[256];
- //public float[] GetPointLightIntensity()
- //{
- // int index = 0;
-
- // if (PointLightsList.Count > 0)
- // foreach (PointLight guy in PointLightsList)
- // {
- // index = Mathf.Min(255, index);
- // if (guy != null)
- // {
- // PointLightIntensity[index] = guy.GetPointLightIntensity * PointLightsIntensity
- // //distance fade
- // * (1 - Mathf.Clamp01(GetPointLightDistance2Camera(guy.gameObject.transform.position) / PointLightingDistance2Camera));
- // }
- // index++;
- // }
- // return PointLightIntensity;
- //}
- // float[] PointlightRange = new float[256];
- //public float[] GetPointLightRanges()
- //{
- // int index = 0;
-
- // if (PointLightsList.Count > 0)
- // foreach (PointLight guy in PointLightsList)
- // {
- // index = Mathf.Min(256, index);
- // if (guy != null)
- // PointlightRange[index] = guy.GetPointLightRange;
-
- // index++;
- // }
- // return PointlightRange;
- //}
- /*
- void PrimitivesVisible()
- {
- int index = 0;
-
- foreach (FogVolumePrimitive guy in PrimitivesList)
- {
- if (guy == null)
- {
- PrimitivesList.Remove(guy);
- break;
- }
-
- if (guy)
- {
- if (ShowPrimitives)
- guy.GetComponent<Renderer>().enabled = true;
- else
- guy.GetComponent<Renderer>().enabled = false;
- }
- index++;
- }
- }
- */
- public bool PrimitivesRealTimeUpdate = true;
- /*
- public FogVolumePrimitive[] Primitives;
- void ClearPrimitiveList()
- {
- if (PrimitivesList != null && PrimitivesRealTimeUpdate)
- PrimitivesList.Clear();
- if (PrimitivesList == null)
- PrimitivesList = new List<FogVolumePrimitive>();
- }
- void CreatePrimitiveList()
- {
-
- if (PrimitivesRealTimeUpdate)
- Primitives = FindObjectsOfType(typeof(FogVolumePrimitive)) as FogVolumePrimitive[];
- ClearPrimitiveList();
-
- for (int i = 0; i < Primitives.Length; i++)
- {
- if (Primitives[i] != null &&
- Primitives[i].GetComponent<FogVolumePrimitive>().enabled &&
- PointIsInsideVolume(Primitives[i].transform.position))
- {
- if (PrimitivesRealTimeUpdate)
- PrimitivesList.Add(Primitives[i]);
-
- }
- }
-
-
-
- PrimitivesVisible();
- }
- */
- void OnDisable()
- {
- m_lightManager = null;
- m_primitiveManager = null;
-
- }
-
- static public void Wireframe(GameObject obj, bool Enable)
- {
- #if UNITY_EDITOR
- //not valid in 5.5
- // EditorUtility.SetSelectedWireframeHidden(obj.GetComponent<Renderer>(), Enable);
- if (Enable)
- EditorUtility.SetSelectedRenderState(obj.GetComponent<Renderer>(), EditorSelectedRenderState.Wireframe);
- else
- EditorUtility.SetSelectedRenderState(obj.GetComponent<Renderer>(), EditorSelectedRenderState.Highlight);
- #endif
- }
- void OnBecameVisible()
- { }
- public bool IsVisible;
-
- void GetShadowMap()
- {
- if (!FogRenderer)
- FogRenderer = FogVolumeGameObject.GetComponent<MeshRenderer>();
- //if (FogRenderer.isVisible){//Visible by ANY camera '-_-
-
- if (IsVisible)
- {
- if (FogRenderer != null && FogRenderer.shadowCastingMode == UnityEngine.Rendering.ShadowCastingMode.Off)
- {
- CastShadows = false;
- }
- if (FogRenderer.shadowCastingMode == UnityEngine.Rendering.ShadowCastingMode.On)
- {
- if (_FogType == FogType.Textured)
- CastShadows = true;
- else
- FogRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;//revert if fog is uniform
- }
-
- //allow self shadows? not for now, since the result will be incorrect
- //if (FogRenderer.receiveShadows)
- // CastShadows = false;
- if (CastShadows && _ShadowCamera == null)
- {
- ShadowMapSetup();
- RT_OpacityBlur = _ShadowCamera.GetOpacityBlurRT();
- }
- if (_ShadowCamera)
- {
- //_ShadowCamera.enabled = CastShadows;
- ShadowCameraGO.SetActive(CastShadows);
- }
- if (CastShadows)
- {
- RT_Opacity = _ShadowCamera.GetOpacityRT();
- // Debug.Log(RT_Opacity);
- }
- else if (ShadowCaster && FogRenderer.receiveShadows)
- {
- RT_Opacity = ShadowCaster.RT_Opacity;
- RT_OpacityBlur = ShadowCaster.RT_OpacityBlur;
- //same dimensions than caster
- fogVolumeScale.x = ShadowCaster.fogVolumeScale.x;
- fogVolumeScale.z = fogVolumeScale.x;
- }
- if (CastShadows)
- {
- FogVolumeGameObject.layer = LayerMask.NameToLayer("FogVolumeShadowCaster");
- }
- // else
- // FogVolumeGameObject.layer = LayerMask.NameToLayer("FogVolume");
- //if (!CastShadows && !RT_Opacity)
- // FogMaterial.SetTexture("LightshaftTex", null);
-
- if (CastShadows && ShadowCaster)
- FogMaterial.DisableKeyword("VOLUME_SHADOWS");
- if (ShadowCaster && ShadowCaster.CastShadows || FogRenderer.receiveShadows)
- FogMaterial.EnableKeyword("VOLUME_SHADOWS");
-
- if (ShadowCaster && !ShadowCaster.CastShadows || !FogRenderer.receiveShadows)
- FogMaterial.DisableKeyword("VOLUME_SHADOWS");
- }
- }
-
- public bool CreateSurrogate = true;
-
- // private float m_cameraNearClipPlane = 0.0f;
- // private float m_cameraFarClipPlane = 0.0f;
- public bool InjectCustomDepthBuffer = false;
-
-
- void Update()
- {
- #if UNITY_EDITOR
-
- if (MessageDelay < 101)
- MessageDelay++;
- if(MessageDelay>100)
- if (GameCamera.depthTextureMode == DepthTextureMode.None)
- Debug.LogWarning("............ATTENTION, this camera is not generating the required Depth for Fog Volume. " +
- "Add -EnableDepthInForwardCamera.cs- to this camera");
-
- if (RequestSavingMaterials)
- {
- CreateMaterial();
- RequestSavingMaterials = false;
- }
-
- if (FogVolumeGameObject.name != m_prevFVName)
- {
- if (SaveMaterials)
- {
- RemoveMaterial();
- m_prevFVName = FogVolumeGameObject.name;
- CreateMaterial();
- }
- }
- #endif
-
- //External depth:
- if (InjectCustomDepthBuffer && FogMaterial.IsKeywordEnabled("ExternalDepth") == false && ExcludeFromLowRes)
- {
- FogMaterial.EnableKeyword("ExternalDepth");
- // Debug.Log("Enabled keyword ExternalDepth");
- }
-
- if (FogMaterial.IsKeywordEnabled("ExternalDepth") == true && ExcludeFromLowRes && !InjectCustomDepthBuffer)
- {
- FogMaterial.DisableKeyword("ExternalDepth");
- // Debug.Log("Disabled keyword ExternalDepth");
- }
- //Debug.Log("Rendering " + gameObject.name + "\n Layer: " + LayerMask.LayerToName(gameObject.layer) + "\n External depth keyword: " + FogMaterial.IsKeywordEnabled("ExternalDepth"));
-
- //#if UNITY_EDITOR
- if (GameCamera == null)
- AssignCamera();
- //#endif
-
- if (PointLightCullSizeMultiplier < 1.0f) { PointLightCullSizeMultiplier = 1.0f; }
- if (m_lightManager != null)
- {
- m_lightManager.DrawDebugData = ShowDebugGizmos;
- m_lightManager.SetPointLightCullSizeMultiplier(PointLightCullSizeMultiplier);
- }
-
- if (m_primitiveManager != null) { m_primitiveManager.SetVisibility(ShowPrimitives); }
-
- if (GameCamera != null)
- {
- //if ((GameCamera.nearClipPlane != m_cameraNearClipPlane) ||
- // (GameCamera.farClipPlane != m_cameraFarClipPlane))
- //{
- // m_cameraNearClipPlane = GameCamera.nearClipPlane;
- // m_cameraFarClipPlane = GameCamera.farClipPlane;
- FrustumPlanes = GeometryUtility.CalculateFrustumPlanes(GameCamera);
-
- // }
-
-
- if (Application.isPlaying)
- {
- if (GeometryUtility.TestPlanesAABB(FrustumPlanes, _BoxCollider.bounds))
- {
- IsVisible = true;
- // Debug.Log(gameObject.name + " Visible by "+ GameCamera.name);
- }
- else
- {
- IsVisible = false;
- // Debug.Log(gameObject.name + " Not visible by " + GameCamera.name);
- }
- }
-
- else
-
- IsVisible = true;
- }
- // print(IsVisible);
- if (EnableNoise || EnableGradient)
- _FogType = FogType.Textured;
- else
- _FogType = FogType.Uniform;
-
- #if UNITY_EDITOR
- UpdateBoxMesh();
- ShadowProjectorLock();
- Visibility = Mathf.Max(1, Visibility);
- IterationStep = Mathf.Max(1, IterationStep);
- //InscatteringIntensity = Mathf.Max(0, InscatteringIntensity);
- //NoiseIntensity = Mathf.Max(0, NoiseIntensity);
- InscatteringTransitionWideness = Mathf.Max(1, InscatteringTransitionWideness);
- InscatteringStartDistance = Mathf.Max(0, InscatteringStartDistance);
- if (_NoiseVolume == null)
- EnableNoise = false;
-
- fogVolumeScale.x = Mathf.Max(fogVolumeScale.x, .001f);
- fogVolumeScale.y = Mathf.Max(fogVolumeScale.y, .001f);
- fogVolumeScale.z = Mathf.Max(fogVolumeScale.z, .001f);
-
- if (ShadowProjector == null && CastShadows)
- {
- // print("ShadowMapSetup()");
- ShadowMapSetup();
- }
- SetShadowProyectorLayer();
- if (!Sun) FindDirectionalLight();
-
- MoveToLayer();
-
- StaticEditorFlags flags;
- flags = GameObjectUtility.GetStaticEditorFlags(gameObject);
- if (_VisibleByReflectionProbeStatic && GameObjectUtility.GetStaticEditorFlags(gameObject) != StaticEditorFlags.ReflectionProbeStatic)
- {
- //print("Fog Volume visible for Static reflection probes");
- GameObjectUtility.SetStaticEditorFlags(gameObject, StaticEditorFlags.ReflectionProbeStatic);
- }
-
- if (!_VisibleByReflectionProbeStatic && flags == StaticEditorFlags.ReflectionProbeStatic)
- {
- // print("Fog Volume not visible for Static reflection probes");
- flags = flags & ~StaticEditorFlags.ReflectionProbeStatic;
- GameObjectUtility.SetStaticEditorFlags(gameObject, flags);
- }
- #endif
-
- RenderSurrogate();
- if (ShadowProjector != null && CastShadows)
- {
-
- // ShadowProjectorMaterial.SetTexture("_MainTex", RT_OpacityBlur);
-
- ShadowProjectorMaterial.SetColor("_ShadowColor", ShadowColor);
- }
- // FogMaterial.SetTexture("LightshaftTex", RT_Opacity);
- //if (Camera.current != null)
- //{
- // Vector3 ForwardCameraVector = Camera.current.transform.forward;
- // FogMaterial.SetVector("_SliceNormal", ForwardCameraVector);
- // print(ForwardCameraVector);
- //}
- //
- if (FogMaterial.GetTexture("_NoiseVolume") == null && _NoiseVolume != null || FogMaterial.GetTexture("_NoiseVolume") != _NoiseVolume)
- {
- FogMaterial.SetTexture("_NoiseVolume", _NoiseVolume);
- // Debug.Log("Updating tex");
- }
- if (FogMaterial.GetTexture("_NoiseVolume2") == null && _NoiseVolume2 != null || FogMaterial.GetTexture("_NoiseVolume2") != _NoiseVolume2)
- {
- FogMaterial.SetTexture("_NoiseVolume2", _NoiseVolume2);
-
- }
-
- if (FogMaterial.GetTexture("CoverageTex") == null && CoverageTex != null || FogMaterial.GetTexture("CoverageTex") != CoverageTex)
- {
- FogMaterial.SetTexture("CoverageTex", CoverageTex);
-
- }
-
- //GetComponent<LightProbeProxyVolume>().Update();
- }
-
- public void RenderSurrogate()
- {
-
- if (IsVisible)
- {
- if (GameCameraGO == null) AssignCamera();
- var renderer = GameCameraGO.GetComponent<FogVolumeRenderer>();
- if (renderer == null)
- {
- if (!_FogVolumeData.ForceNoRenderer)
- {
- renderer = GameCameraGO.AddComponent<FogVolumeRenderer>();
- renderer.enabled = true;
- }
- }
- if (!_FogVolumeData.ForceNoRenderer && renderer._Downsample > 0 && CreateSurrogate && mesh != null &&
- _FogType == FogVolume.FogType.Textured)
- {
-
- Graphics.DrawMesh(mesh, transform.position, transform.rotation, SurrogateMaterial,
- LayerMask.NameToLayer("FogVolumeSurrogate"),
- //GameCamera,//it blinks
- null,
- 0, null, false, false, false);
-
- // if(EnableNoise)
- // FogMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
- }
-
- }
- }
-
- void UpdateParams()
- {
- if (IsVisible)
- {
- if (_PerformanceLUT && _DebugMode == DebugMode.Iterations)
- FogMaterial.SetTexture("_PerformanceLUT", _PerformanceLUT);
-
- if (_DebugMode != DebugMode.Lit)
- FogMaterial.SetInt("_DebugMode", (int)_DebugMode);
-
- if (FogType.Textured == _FogType)
- {
- FogMaterial.SetInt("_SrcBlend", (int)_BlendMode);
- // print((int)_BlendMode);
- }
- else
- //set it as standard alpha blend for uniform fog
- FogMaterial.SetInt("_SrcBlend", (int)FogVolumeRenderer.BlendMode.TraditionalTransparency);
- FogMaterial.SetInt("_ztest", (int)_ztest);
-
- Profiler.BeginSample("FogVolume Pointlights update");
- if (m_lightManager != null)
- {
- if (m_lightManager.CurrentLightCount > 0 &&
- PointLightsActive &&
- SystemInfo.graphicsShaderLevel > 30)
- {
- FogMaterial.SetVectorArray("_LightPositions",
- m_lightManager.GetLightPositionArray());
- FogMaterial.SetVectorArray("_LightRotations", m_lightManager.GetLightRotationArray());
- FogMaterial.SetColorArray("_LightColors", m_lightManager.GetLightColorArray());
- FogMaterial.SetVectorArray("_LightData", m_lightManager.GetLightData());
-
- FogMaterial.SetFloat("PointLightingDistance", 1.0f / PointLightingDistance);//spherical range clamp
- FogMaterial.SetFloat("PointLightingDistance2Camera",
- 1.0f / PointLightingDistance2Camera);//draw distance
-
-
- }
- }
- Profiler.EndSample();
- Profiler.BeginSample("FogVolume Primitives update");
- if (m_primitiveManager != null)
- if (m_primitiveManager.CurrentPrimitiveCount > 0 && EnableDistanceFields)
- {
- FogMaterial.SetFloat("Constrain", Constrain);
- FogMaterial.SetVectorArray("_PrimitivePosition", m_primitiveManager.GetPrimitivePositionArray());
- FogMaterial.SetVectorArray("_PrimitiveScale", m_primitiveManager.GetPrimitiveScaleArray());
- FogMaterial.SetInt("_PrimitiveCount", m_primitiveManager.VisiblePrimitiveCount);
- FogMaterial.SetMatrixArray("_PrimitivesTransform", m_primitiveManager.GetPrimitiveTransformArray());
- FogMaterial.SetFloat("_PrimitiveEdgeSoftener", 1 / _PrimitiveEdgeSoftener);
- FogMaterial.SetFloat("_PrimitiveCutout", _PrimitiveCutout);
- FogMaterial.SetVectorArray("_PrimitiveData", m_primitiveManager.GetPrimitiveDataArray());
- }
- Profiler.EndSample();
- Profiler.BeginSample("FogVolume PARAMETERS");
- // FogMaterial.SetVector("_CameraForward", Camera.current.transform.forward);
-
- if (Sun && Sun.enabled)
- {
- FogMaterial.SetFloat("_LightExposure", _LightExposure);
- if (LightHalo && _LightHaloTexture)
- {
- FogMaterial.SetTexture("_LightHaloTexture", _LightHaloTexture);
- FogMaterial.SetFloat("_HaloOpticalDispersion", _HaloOpticalDispersion);
- FogMaterial.SetFloat("_HaloWidth", _HaloWidth.Remap(0, 1, 10, 1));
- FogMaterial.SetFloat("_HaloIntensity", _HaloIntensity * 2000);
- FogMaterial.SetFloat("_HaloRadius", _HaloRadius.Remap(0, 1, 2, .1f));
- FogMaterial.SetFloat("_HaloAbsorption", _HaloAbsorption.Remap(0, 1, 0, 16));
- }
-
- FogMaterial.SetVector("L", -Sun.transform.forward);
- Shader.SetGlobalVector("L", -Sun.transform.forward);
- FogMaterial.SetVector("_LightLocalDirection", LocalDirectionalSunLight(Sun));
-
- if (EnableInscattering)
- {
- FogMaterial.SetFloat("_InscatteringIntensity", InscatteringIntensity * 50);
- FogMaterial.SetFloat("InscatteringShape", InscatteringShape);
- FogMaterial.SetFloat("InscatteringTransitionWideness", InscatteringTransitionWideness);
- FogMaterial.SetColor("_InscatteringColor", InscatteringColor);
- }
-
- if (VolumeFogInscattering)
- {
- FogMaterial.SetFloat("VolumeFogInscatteringIntensity", VolumeFogInscatteringIntensity * 50);
- FogMaterial.SetFloat("VolumeFogInscatteringAnisotropy", VolumeFogInscatteringAnisotropy);
- FogMaterial.SetColor("VolumeFogInscatteringColor", VolumeFogInscatteringColor);
- VolumeFogInscatteringStartDistance = Mathf.Max(0, VolumeFogInscatteringStartDistance);
- FogMaterial.SetFloat("VolumeFogInscatteringStartDistance", VolumeFogInscatteringStartDistance);
- VolumeFogInscatteringTransitionWideness = Mathf.Max(.01f, VolumeFogInscatteringTransitionWideness);
- FogMaterial.SetFloat("VolumeFogInscatteringTransitionWideness", VolumeFogInscatteringTransitionWideness);
- }
-
- FogMaterial.SetColor("_LightColor", Sun.color * Sun.intensity);
-
- if (EnableNoise && _NoiseVolume != null)
- {
- FogMaterial.SetFloat("_NoiseDetailRange", _NoiseDetailRange * 1f);
- FogMaterial.SetFloat("_Curl", _Curl);
- if (_DirectionalLighting)
- {
- FogMaterial.SetFloat("_DirectionalLightingDistance", _DirectionalLightingDistance);
- //FogMaterial.SetFloat("DirectionalLightingClamp", DirectionalLightingClamp);
- FogMaterial.SetInt("DirectLightingShadowSteps", DirectLightingShadowSteps);
- FogMaterial.SetFloat("DirectLightingShadowDensity", DirectLightingShadowDensity);
- }
- }
- }
- FogMaterial.SetFloat("_Cutoff", ShadowCutoff);
- FogMaterial.SetFloat("Absorption", Absorption);
- LightExtinctionColor.r = Mathf.Max(.1f, LightExtinctionColor.r);
- LightExtinctionColor.g = Mathf.Max(.1f, LightExtinctionColor.g);
- LightExtinctionColor.b = Mathf.Max(.1f, LightExtinctionColor.b);
- FogMaterial.SetColor("LightExtinctionColor", LightExtinctionColor);
- //if (Procedural)
- // FogMaterial.EnableKeyword("USE_PROCEDURAL");
- //else
- // FogMaterial.DisableKeyword("USE_PROCEDURAL");
-
- //if (EnableNoise && _NoiseVolume)
- //{
- if (Vortex > 0)
- {
- FogMaterial.SetFloat("_Vortex", Vortex);
- FogMaterial.SetFloat("_Rotation", Mathf.Deg2Rad * rotation);
- FogMaterial.SetFloat("_RotationSpeed", -RotationSpeed);
- }
- DetailDistance = Mathf.Max(1, DetailDistance);
- FogMaterial.SetFloat("DetailDistance", DetailDistance);
- FogMaterial.SetFloat("Octaves", Octaves);
- FogMaterial.SetFloat("_DetailMaskingThreshold", _DetailMaskingThreshold);
- //FogMaterial.SetFloat("_DetailSamplingBaseOpacityLimit", DetailSamplingBaseOpacityLimit);
- // FogMaterial.SetTexture("_NoiseVolume", _NoiseVolume);
- //FogMaterial.SetTexture("noise2D", noise2D);
- FogMaterial.SetVector("_VolumePosition", gameObject.transform.position);
- FogMaterial.SetFloat("gain", NoiseIntensity);
- FogMaterial.SetFloat("threshold", NoiseContrast * 0.5f - 5);
- FogMaterial.SetFloat("_3DNoiseScale", _3DNoiseScale * .001f);
- FadeDistance = Mathf.Max(1, FadeDistance);
- FogMaterial.SetFloat("FadeDistance", FadeDistance);
- FogMaterial.SetFloat("STEP_COUNT", Iterations);
- FogMaterial.SetFloat("DetailTiling", DetailTiling);
- FogMaterial.SetFloat("BaseTiling", BaseTiling * .1f);
- FogMaterial.SetFloat("Coverage", Coverage);
- FogMaterial.SetFloat("NoiseDensity", NoiseDensity);
- FogMaterial.SetVector("Speed", Speed * .1f);
- FogMaterial.SetVector("Stretch", new Vector4(1, 1, 1, 1) + Stretch * .01f);
- if (useHeightGradient)
- {
- //FogMaterial.SetFloat("GradMin", GradMin);
- // FogMaterial.SetFloat("GradMax", GradMax);
- FogMaterial.SetVector("_VerticalGradientParams", new Vector4(GradMin, GradMax, GradMin2, GradMax2));
- }
- FogMaterial.SetColor("_AmbientColor", _AmbientColor);
-
- if (FogRenderer.lightProbeUsage == UnityEngine.Rendering.LightProbeUsage.UseProxyVolume)
- _ProxyVolume = true;
- else _ProxyVolume = false;
-
- FogMaterial.SetFloat("_ProxyVolume", _ProxyVolume == false ? 0 : 1);
- //FogMaterial.SetFloat("Shade", Shade);
- FogMaterial.SetFloat("ShadowBrightness", ShadowBrightness);
- FogMaterial.SetFloat("_DetailRelativeSpeed", _DetailRelativeSpeed);
- FogMaterial.SetFloat("_BaseRelativeSpeed", _BaseRelativeSpeed);
- if (bSphericalFade)
- {
- SphericalFadeDistance = Mathf.Max(1, SphericalFadeDistance);
- FogMaterial.SetFloat("SphericalFadeDistance", SphericalFadeDistance);
- }
- FogMaterial.SetVector("VolumeSize", new Vector4(fogVolumeScale.x, fogVolumeScale.y, fogVolumeScale.z, 0));
- // }
-
- FogMaterial.SetFloat("Exposure", Mathf.Max(0, Exposure));
- FogMaterial.SetFloat("Offset", Offset);
- FogMaterial.SetFloat("Gamma", Gamma);
- if (Gradient != null)
- FogMaterial.SetTexture("_Gradient", Gradient);
-
- FogMaterial.SetFloat("InscatteringStartDistance", InscatteringStartDistance);
- Vector3 VolumeSize = currentFogVolume;
- FogMaterial.SetVector("_BoxMin", VolumeSize * -.5f);
- FogMaterial.SetVector("_BoxMax", VolumeSize * .5f);
- FogMaterial.SetColor("_Color", FogMainColor);
- FogMaterial.SetColor("_FogColor", _FogColor);
- FogMaterial.SetInt("_AmbientAffectsFogColor", _AmbientAffectsFogColor ? 1 : 0);
- //FogMaterial.SetFloat("_SceneIntersectionThreshold", _SceneIntersectionThreshold);
-
- FogMaterial.SetFloat("_SceneIntersectionSoftness", _SceneIntersectionSoftness);
- // FogMaterial.SetFloat("_RayStep", IterationStep * .001f);
- FogMaterial.SetFloat("_RayStep", IterationStep * .001f);
- FogMaterial.SetFloat("_OptimizationFactor", _OptimizationFactor);
- FogMaterial.SetFloat("_Visibility", bVolumeFog && EnableNoise &&
- _NoiseVolume || EnableGradient ? Visibility * 100 : Visibility);
- FogRenderer.sortingOrder = DrawOrder;
- FogMaterial.SetInt("VolumeFogInscatterColorAffectedWithFogColor", VolumeFogInscatterColorAffectedWithFogColor ? 1 : 0);
- FogMaterial.SetFloat("_FOV", GameCamera.fieldOfView);
- FogMaterial.SetFloat("HeightAbsorption", HeightAbsorption);
- FogMaterial.SetVector("_AmbientHeightAbsorption", new Vector4(HeightAbsorptionMin, HeightAbsorptionMax, HeightAbsorption, 0));
- FogMaterial.SetFloat("NormalDistance", NormalDistance);
- FogMaterial.SetFloat("DirectLightingAmount", DirectLightingAmount);
- DirectLightingDistance = Mathf.Max(1, DirectLightingDistance);
- FogMaterial.SetFloat("DirectLightingDistance", DirectLightingDistance);
- FogMaterial.SetFloat("LambertianBias", LambertianBias);
- //if (SceneCollision)
- FogMaterial.SetFloat("_jitter", _jitter);
- FogMaterial.SetInt("SamplingMethod", (int)_SamplingMethod);
-
- //if (_FogVolumeRenderer)
- FogMaterial.SetFloat("_PushAlpha", _PushAlpha);
-
- if (_ShadeNoise && EnableNoise)
- {
- FogMaterial.SetColor("_SelfShadowColor", _SelfShadowColor);
- FogMaterial.SetInt("_SelfShadowSteps", _SelfShadowSteps);
- FogMaterial.SetFloat("ShadowShift", ShadowShift);
- }
-
- Profiler.EndSample();
- }
- }
- void LateUpdate()
- {
-
- }
-
- public bool UseConvolvedLightshafts = false;
-
- void OnWillRenderObject()
- {
- GetShadowMap();
-
- #if UNITY_EDITOR
- ToggleKeyword();
- //since I can not set a Camera in DrawMesh (It blinks all the time), I have to make the surrogate not visible in Scene view
-
- if(Camera.current.name == "SceneCamera")
- SurrogateMaterial.EnableKeyword("_EDITOR_WINDOW");
- else
- SurrogateMaterial.DisableKeyword("_EDITOR_WINDOW");
-
- Wireframe(FogVolumeGameObject, HideWireframe);
-
- if (ShadowProjector != null)
- ShadowProjector.SetActive(CastShadows);
-
- //3.1.8 added && !ShadowCaster
- if (ShadowCameraGO != null && !ShadowCaster)
- ShadowCameraGO.SetActive(CastShadows);
-
- // FogMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
- #endif
- // if (SystemInfo.graphicsShaderLevel < 40) PointLightsActive = false;
- if (PointLightsActive && SystemInfo.graphicsShaderLevel > 30)
- {
- _InitializeLightManagerIfNeccessary();
- if (m_lightManager != null)
- {
- if (PointLightsRealTimeUpdate)
- {
- m_lightManager.Deinitialize();
- if (PointLightBoxCheck) { m_lightManager.FindLightsInFogVolume(); }
- else { m_lightManager.FindLightsInScene(); }
- }
-
- if (m_lightManager.AlreadyUsesTransformForPoI == false)
- {
- m_lightManager.SetPointOfInterest(_FogVolumeData.GameCamera.transform);
- }
-
- m_lightManager.ManualUpdate(ref FrustumPlanes);
- }
- FogMaterial.SetInt("_LightsCount", GetVisibleLightCount());
- }
- else { _DeinitializeLightManagerIfNeccessary(); }
- // else
- // FogMaterial.SetInt("_LightsCount", 0);
-
- if (EnableDistanceFields)
- {
- _InitializePrimitiveManagerIfNeccessary();
- if (m_primitiveManager != null)
- {
- if (PrimitivesRealTimeUpdate)
- {
- m_primitiveManager.Deinitialize();
- m_primitiveManager.FindPrimitivesInFogVolume();
-
- }
- if (m_primitiveManager.AlreadyUsesTransformForPoI == false)
- {
- m_primitiveManager.SetPointOfInterest(_FogVolumeData.GameCamera.transform);
- }
-
- m_primitiveManager.ManualUpdate(ref FrustumPlanes);
- }
- FogMaterial.SetInt("_PrimitivesCount", GetVisiblePrimitiveCount());
- }
- else { _DeinitializePrimitiveManagerIfNeccessary(); }
- //CreatePrimitiveList();
-
- //3.1.7 maybe not!
- //else
- //if (PrimitivesList != null)
- // if (PrimitivesList.Count > 0)
- // PrimitivesList.Clear();
-
- if (RT_Opacity != null)
- {
-
- Shader.SetGlobalTexture("RT_Opacity", RT_Opacity);
-
- if (UseConvolvedLightshafts)
- {
- FogMaterial.SetTexture("LightshaftTex", RT_OpacityBlur);
-
- }
- else
- {
- FogMaterial.SetTexture("LightshaftTex", RT_Opacity);
-
- }
- }
-
- UpdateParams();
- if (!RenderableInSceneView && (Camera.current.name == "SceneCamera"))
- {
- // FogMaterial.EnableKeyword("RENDER_SCENE_VIEW");
- FogMaterial.SetVector("_BoxMin", new Vector3(0, 0, 0));
- FogMaterial.SetVector("_BoxMax", new Vector3(0, 0, 0));
- }
- else
- {
- // FogMaterial.DisableKeyword("RENDER_SCENE_VIEW");
- FogMaterial.SetVector("_BoxMin", currentFogVolume * -.5f);
- FogMaterial.SetVector("_BoxMax", currentFogVolume * .5f);
- }
-
- //FogMaterial.DisableKeyword("RENDER_SCENE_VIEW");
- }
-
- void ToggleKeyword()
- {
- if (IsVisible)
- {
- Profiler.BeginSample("FogVolume KEYWORDS");
-
- if (_jitter > 0)
- FogMaterial.EnableKeyword("JITTER");
- else
- FogMaterial.DisableKeyword("JITTER");
-
- if (_DebugMode != DebugMode.Lit)
- FogMaterial.EnableKeyword("DEBUG");
- else
- FogMaterial.DisableKeyword("DEBUG");
-
- switch (_SamplingMethod)
- {
- case SamplingMethod.Eye2Box:
- FogMaterial.DisableKeyword("SAMPLING_METHOD_ViewAligned");
- FogMaterial.EnableKeyword("SAMPLING_METHOD_Eye2Box");
- break;
-
- case SamplingMethod.ViewAligned:
- FogMaterial.EnableKeyword("SAMPLING_METHOD_ViewAligned");
- FogMaterial.DisableKeyword("SAMPLING_METHOD_Eye2Box");
- break;
- }
-
-
- if (LightHalo && _LightHaloTexture)
- FogMaterial.EnableKeyword("HALO");
- else
- FogMaterial.DisableKeyword("HALO");
-
- if (ShadowCaster != null)
- {
- if (ShadowCaster.SunAttached == true)
- {
- FogMaterial.EnableKeyword("LIGHT_ATTACHED");
- }
- if (ShadowCaster.SunAttached == false)
- {
- FogMaterial.DisableKeyword("LIGHT_ATTACHED");
-
- }
- }
-
- if (Vortex > 0)
- {
- FogMaterial.EnableKeyword("Twirl");
- //print((int)_VortexAxis);
- switch (_VortexAxis)
- {
- case VortexAxis.X:
- FogMaterial.EnableKeyword("Twirl_X");
- FogMaterial.DisableKeyword("Twirl_Y");
- FogMaterial.DisableKeyword("Twirl_Z");
- break;
-
- case VortexAxis.Y:
- FogMaterial.DisableKeyword("Twirl_X");
- FogMaterial.EnableKeyword("Twirl_Y");
- FogMaterial.DisableKeyword("Twirl_Z");
- break;
-
- case VortexAxis.Z:
- FogMaterial.DisableKeyword("Twirl_X");
- FogMaterial.DisableKeyword("Twirl_Y");
- FogMaterial.EnableKeyword("Twirl_Z");
- break;
- }
- }
- else
- {
- FogMaterial.DisableKeyword("Twirl_X");
- FogMaterial.DisableKeyword("Twirl_Y");
- FogMaterial.DisableKeyword("Twirl_Z");
- }
- if (Lambert && Sun && EnableNoise)
- FogMaterial.EnableKeyword("_LAMBERT_SHADING");
- else
- FogMaterial.DisableKeyword("_LAMBERT_SHADING");
-
-
-
-
-
- //POINTLIGHTS
- if (/*PointLightsList != null && PointLightsList.Count > 0 &&*/
- PointLightsActive && SystemInfo.graphicsShaderLevel > 30)
- {
- // FogMaterial.EnableKeyword("POINTLIGHTS");//not in use anymore, not needed
-
- switch (_LightScatterMethod)
- {
- case LightScatterMethod.BeersLaw:
- FogMaterial.EnableKeyword("ATTEN_METHOD_1");
- FogMaterial.DisableKeyword("ATTEN_METHOD_2");
- FogMaterial.DisableKeyword("ATTEN_METHOD_3");
- // FogMaterial.DisableKeyword("ATTEN_METHOD_4");
- break;
-
- case LightScatterMethod.InverseSquare:
- FogMaterial.DisableKeyword("ATTEN_METHOD_1");
- FogMaterial.EnableKeyword("ATTEN_METHOD_2");
- FogMaterial.DisableKeyword("ATTEN_METHOD_3");
- // FogMaterial.DisableKeyword("ATTEN_METHOD_4");
- break;
-
- //case LightScatterMethod.Gaussian:
- // FogMaterial.DisableKeyword("ATTEN_METHOD_1");
- // FogMaterial.DisableKeyword("ATTEN_METHOD_2");
- // FogMaterial.EnableKeyword("ATTEN_METHOD_3");
- // FogMaterial.DisableKeyword("ATTEN_METHOD_4");
- // break;
-
-
- case LightScatterMethod.Linear:
- FogMaterial.DisableKeyword("ATTEN_METHOD_1");
- FogMaterial.DisableKeyword("ATTEN_METHOD_2");
- FogMaterial.EnableKeyword("ATTEN_METHOD_3");
- // FogMaterial.EnableKeyword("ATTEN_METHOD_4");
- break;
- }
- }
- else
- {
- FogMaterial.DisableKeyword("ATTEN_METHOD_1");
- FogMaterial.DisableKeyword("ATTEN_METHOD_2");
- FogMaterial.DisableKeyword("ATTEN_METHOD_3");
- }
-
- //////////////////
- if (EnableNoise && _NoiseVolume && useHeightGradient)
- FogMaterial.EnableKeyword("HEIGHT_GRAD");
- else
- FogMaterial.DisableKeyword("HEIGHT_GRAD");
-
- if (ColorAdjust)
- FogMaterial.EnableKeyword("ColorAdjust");
- else
- FogMaterial.DisableKeyword("ColorAdjust");
-
- if (bVolumeFog)
- FogMaterial.EnableKeyword("VOLUME_FOG");
- else
- FogMaterial.DisableKeyword("VOLUME_FOG");
-
- if (FogMaterial)
- {
- if (EnableGradient && Gradient != null)
- FogMaterial.EnableKeyword("_FOG_GRADIENT");
- else
- FogMaterial.DisableKeyword("_FOG_GRADIENT");
-
- // if (EnableNoise && !SystemInfo.supports3DTextures)
- // Debug.Log("Noise not supported. SM level found: " + SystemInfo.graphicsShaderLevel / 10);
-
- if (EnableNoise/* && SystemInfo.supports3DTextures*/)
- FogMaterial.EnableKeyword("_FOG_VOLUME_NOISE");
- else
- {
- FogMaterial.DisableKeyword("_FOG_VOLUME_NOISE");
- }
-
- if (EnableInscattering && Sun && Sun.enabled && Sun.isActiveAndEnabled)
- FogMaterial.EnableKeyword("_INSCATTERING");
- else
- FogMaterial.DisableKeyword("_INSCATTERING");
-
- if (VolumeFogInscattering && Sun && Sun.enabled && bVolumeFog)
- FogMaterial.EnableKeyword("_VOLUME_FOG_INSCATTERING");
- else
- FogMaterial.DisableKeyword("_VOLUME_FOG_INSCATTERING");
-
- //if (SceneCollision)
- FogMaterial.SetFloat("Collisions", SceneCollision ? 1 : 0);
- // FogMaterial.EnableKeyword("_COLLISION");
- // else
- // FogMaterial.DisableKeyword("_COLLISION");
-
- if (ShadowShift > 0 && EnableNoise && Sun && _ShadeNoise)
- FogMaterial.EnableKeyword("_SHADE");
- else
- FogMaterial.DisableKeyword("_SHADE");
-
- //if (EnableNoise && DoubleLayer && SystemInfo.supports3DTextures)
- // FogMaterial.EnableKeyword("_DOUBLE_LAYER");
- //else
- // FogMaterial.DisableKeyword("_DOUBLE_LAYER");
-
- if (Tonemap)
- FogMaterial.EnableKeyword("_TONEMAP");
- else
- FogMaterial.DisableKeyword("_TONEMAP");
-
- if (bSphericalFade)
- FogMaterial.EnableKeyword("SPHERICAL_FADE");
- else
- FogMaterial.DisableKeyword("SPHERICAL_FADE");
-
- if (/*m_primitiveManager != null && m_primitiveManager.VisiblePrimitiveCount > 0 &&*/ EnableDistanceFields)
- FogMaterial.EnableKeyword("DF");
- else
- FogMaterial.DisableKeyword("DF");
-
- if (bAbsorption)
- FogMaterial.EnableKeyword("ABSORPTION");
- else
- FogMaterial.DisableKeyword("ABSORPTION");
-
- if (_DirectionalLighting && EnableNoise && _NoiseVolume != null && _DirectionalLightingDistance > 0 && DirectLightingShadowDensity > 0)
- FogMaterial.EnableKeyword("DIRECTIONAL_LIGHTING");
- else
- FogMaterial.DisableKeyword("DIRECTIONAL_LIGHTING");
- }
- Profiler.EndSample();
- }
- }
-
-
- public void UpdateBoxMesh()
- {
- if (currentFogVolume != fogVolumeScale || filter == null)
- {
- CreateBoxMesh(fogVolumeScale);
- //update shadow camera too
- ShadowMapSetup();
- //update collider bounds
- _BoxCollider.size = fogVolumeScale;
- m_hasUpdatedBoxMesh = true;
- }
- transform.localScale = Vector3.one;//otherwise, it won't work correctly
- }
-
- public bool HasUpdatedBoxMesh
- {
- get
- {
- bool ret = m_hasUpdatedBoxMesh;
- m_hasUpdatedBoxMesh = false;
- return ret;
- }
- }
-
- private bool m_hasUpdatedBoxMesh = false;
-
- void CreateBoxMesh(Vector3 scale)
- {
- currentFogVolume = scale;
-
- // You can change that line to provide another MeshFilter
- if (filter == null)
- filter = gameObject.AddComponent<MeshFilter>();
-
- if (mesh == null)
- {
- mesh = new Mesh();
- mesh.name = gameObject.name;
- filter.sharedMesh = mesh;
- }
- mesh.Clear();
-
-
-
- float width = scale.y;
- float height = scale.z;
- float length = scale.x;
-
- #region Vertices
- Vector3 p0 = new Vector3(-length * .5f, -width * .5f, height * .5f);
- Vector3 p1 = new Vector3(length * .5f, -width * .5f, height * .5f);
- Vector3 p2 = new Vector3(length * .5f, -width * .5f, -height * .5f);
- Vector3 p3 = new Vector3(-length * .5f, -width * .5f, -height * .5f);
-
- Vector3 p4 = new Vector3(-length * .5f, width * .5f, height * .5f);
- Vector3 p5 = new Vector3(length * .5f, width * .5f, height * .5f);
- Vector3 p6 = new Vector3(length * .5f, width * .5f, -height * .5f);
- Vector3 p7 = new Vector3(-length * .5f, width * .5f, -height * .5f);
-
- Vector3[] vertices = new Vector3[]
- {
- // Bottom
- p0, p1, p2, p3,
-
- // Left
- p7, p4, p0, p3,
-
- // Front
- p4, p5, p1, p0,
-
- // Back
- p6, p7, p3, p2,
-
- // Right
- p5, p6, p2, p1,
-
- // Top
- p7, p6, p5, p4
- };
- #endregion
-
- #region Normales
- Vector3 up = Vector3.up;
- Vector3 down = Vector3.down;
- Vector3 front = Vector3.forward;
- Vector3 back = Vector3.back;
- Vector3 left = Vector3.left;
- Vector3 right = Vector3.right;
-
- Vector3[] normales = new Vector3[]
- {
- // Bottom
- down, down, down, down,
-
- // Left
- left, left, left, left,
-
- // Front
- front, front, front, front,
-
- // Back
- back, back, back, back,
-
- // Right
- right, right, right, right,
-
- // Top
- up, up, up, up
- };
- #endregion
-
- #region UVs
- Vector2 _00 = new Vector2(0f, 0f);
- Vector2 _10 = new Vector2(1f, 0f);
- Vector2 _01 = new Vector2(0f, 1f);
- Vector2 _11 = new Vector2(1f, 1f);
-
- Vector2[] uvs = new Vector2[]
- {
- // Bottom
- _11, _01, _00, _10,
-
- // Left
- _11, _01, _00, _10,
-
- // Front
- _11, _01, _00, _10,
-
- // Back
- _11, _01, _00, _10,
-
- // Right
- _11, _01, _00, _10,
-
- // Top
- _11, _01, _00, _10,
- };
- #endregion
-
- #region Triangles
- int[] triangles = new int[]
- {
- // Bottom
- 3, 1, 0,
- 3, 2, 1,
-
- // Left
- 3 + 4 * 1, 1 + 4 * 1, 0 + 4 * 1,
- 3 + 4 * 1, 2 + 4 * 1, 1 + 4 * 1,
-
- // Front
- 3 + 4 * 2, 1 + 4 * 2, 0 + 4 * 2,
- 3 + 4 * 2, 2 + 4 * 2, 1 + 4 * 2,
-
- // Back
- 3 + 4 * 3, 1 + 4 * 3, 0 + 4 * 3,
- 3 + 4 * 3, 2 + 4 * 3, 1 + 4 * 3,
-
- // Right
- 3 + 4 * 4, 1 + 4 * 4, 0 + 4 * 4,
- 3 + 4 * 4, 2 + 4 * 4, 1 + 4 * 4,
-
- // Top
- 3 + 4 * 5, 1 + 4 * 5, 0 + 4 * 5,
- 3 + 4 * 5, 2 + 4 * 5, 1 + 4 * 5,
-
- };
- #endregion
-
- mesh.vertices = vertices;
- mesh.triangles = triangles;
- mesh.normals = normales;
- mesh.uv = uvs;
- mesh.RecalculateBounds();
- ;
- }
- //won't work if the icon is not in Assets/Gizmos
- //void OnDrawGizmosSelected()
- //{
-
- // Gizmos.DrawIcon(transform.position, "FogVolume/Gizmos/FogVolumeIcon.png", true);
- //}
-
-
- private FogVolumeLightManager m_lightManager = null;
-
-
- private void _InitializeLightManagerIfNeccessary()
- {
- if (m_lightManager == null)
- {
- m_lightManager = GetComponent<FogVolumeLightManager>();
- if (m_lightManager == null)
- {
- m_lightManager = gameObject.AddComponent<FogVolumeLightManager>();
- }
- m_lightManager.Initialize();
- if (PointLightBoxCheck)
- {
- m_lightManager.FindLightsInFogVolume();
- }
- else
- {
- m_lightManager.FindLightsInScene();
- }
- }
- }
-
-
- private void _DeinitializeLightManagerIfNeccessary()
- {
- if (m_lightManager != null)
- {
- m_lightManager.Deinitialize();
- }
- }
-
- public int GetVisibleLightCount()
- {
- if (m_lightManager != null) { return m_lightManager.VisibleLightCount; }
- return 0;
- }
- public int GetTotalLightCount()
- {
- if (m_lightManager != null) { return m_lightManager.CurrentLightCount; }
- return 0;
- }
-
-
- private FogVolumePrimitiveManager m_primitiveManager;
-
- private void _InitializePrimitiveManagerIfNeccessary()
- {
- if (m_primitiveManager == null)
- {
- m_primitiveManager = GetComponent<FogVolumePrimitiveManager>();
- if (m_primitiveManager == null)
- {
- m_primitiveManager = gameObject.AddComponent<FogVolumePrimitiveManager>();
- }
- m_primitiveManager.Initialize();
- m_primitiveManager.FindPrimitivesInFogVolume();
- }
- }
-
- private void _DeinitializePrimitiveManagerIfNeccessary()
- {
- if (m_primitiveManager != null) { m_primitiveManager.Deinitialize(); }
- }
-
- public int GetVisiblePrimitiveCount()
- {
- if (m_primitiveManager != null) { return m_primitiveManager.VisiblePrimitiveCount; }
-
- return 0;
- }
-
- public int GetTotalPrimitiveCount()
- {
- if (m_primitiveManager != null) { return m_primitiveManager.CurrentPrimitiveCount; }
-
- return 0;
- }
- }
-
|