using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
[ExecuteInEditMode]
|
|
|
|
public class FogVolumeData : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
bool _ForceNoRenderer;
|
|
public bool ForceNoRenderer
|
|
{
|
|
get { return _ForceNoRenderer; }
|
|
set
|
|
{
|
|
if (_ForceNoRenderer != value)
|
|
{
|
|
_ForceNoRenderer = value;
|
|
ToggleFogVolumeRenderers();
|
|
}
|
|
}
|
|
}
|
|
[SerializeField]
|
|
Camera _GameCamera;
|
|
|
|
public Camera GameCamera
|
|
{
|
|
get { return _GameCamera; }
|
|
set
|
|
{
|
|
if (_GameCamera != value)
|
|
{
|
|
_GameCamera = value;
|
|
RefreshCamera();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void setDownsample(int val)
|
|
{
|
|
if (_GameCamera.GetComponent<FogVolumeRenderer>())
|
|
_GameCamera.GetComponent<FogVolumeRenderer>()._Downsample = val;
|
|
}
|
|
|
|
void RefreshCamera()
|
|
{
|
|
//refresh all fog folumes assigned camera
|
|
//print("Refresh");
|
|
|
|
FindFogVolumes();
|
|
foreach (FogVolume _FogVolumes in SceneFogVolumes)
|
|
{
|
|
_FogVolumes.AssignCamera();
|
|
}
|
|
ToggleFogVolumeRenderers();
|
|
}
|
|
|
|
[SerializeField]
|
|
List<Camera> FoundCameras;
|
|
|
|
void OnEnable()
|
|
{
|
|
Initialize();
|
|
|
|
}
|
|
|
|
void Initialize()
|
|
{
|
|
if (FoundCameras == null)
|
|
FoundCameras = new List<Camera>();
|
|
FindCamera();
|
|
RefreshCamera();
|
|
if (FoundCameras.Count == 0)
|
|
Debug.Log("Definetly, no camera available for Fog Volume");
|
|
}
|
|
|
|
[SerializeField]
|
|
FogVolume[] SceneFogVolumes;
|
|
|
|
public void FindFogVolumes()
|
|
{
|
|
SceneFogVolumes = (FogVolume[])FindObjectsOfType(typeof(FogVolume));
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
|
|
if (GameCamera == null)
|
|
{
|
|
Debug.Log("No Camera available for Fog Volume. Trying to find another one");
|
|
Initialize();
|
|
}
|
|
|
|
#if UNITY_EDITOR
|
|
for (int i = 0; i < SceneFogVolumes.Length; i++)
|
|
{
|
|
FogVolume SlotFogVolume = SceneFogVolumes[i];
|
|
if(SlotFogVolume==null)
|
|
{
|
|
//reset and rebuild
|
|
SceneFogVolumes = null;
|
|
FindFogVolumes();
|
|
}
|
|
}
|
|
|
|
|
|
if (SceneFogVolumes.Length == 0)
|
|
DestroyImmediate(gameObject);
|
|
#endif
|
|
|
|
|
|
}
|
|
void ToggleFogVolumeRenderers()
|
|
{
|
|
if (FoundCameras != null)
|
|
for (int i = 0; i < FoundCameras.Count; i++)
|
|
{
|
|
if (FoundCameras[i] != _GameCamera)
|
|
{
|
|
if (FoundCameras[i].GetComponent<FogVolumeRenderer>())
|
|
FoundCameras[i].GetComponent<FogVolumeRenderer>().enabled = false;
|
|
}
|
|
else if (FoundCameras[i].GetComponent<FogVolumeRenderer>() &&
|
|
!_ForceNoRenderer)
|
|
{
|
|
FoundCameras[i].GetComponent<FogVolumeRenderer>().enabled = true;
|
|
}
|
|
else
|
|
{
|
|
var FVRenderer = FoundCameras[i].GetComponent<FogVolumeRenderer>();
|
|
if (FVRenderer == null)
|
|
{
|
|
if (ForceNoRenderer) { continue; }
|
|
FVRenderer = FoundCameras[i].gameObject.AddComponent<FogVolumeRenderer>();
|
|
}
|
|
|
|
if(ForceNoRenderer)
|
|
{
|
|
FVRenderer.enabled = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
public void FindCamera()
|
|
{
|
|
//We will try to assign the typical MainCamera first. This search will be performed only when the field is null
|
|
//This is just an initial attempt on assigning any camera available when the field 'Camera' is null.
|
|
//We will be able to select any other camera later
|
|
if (FoundCameras != null && FoundCameras.Count > 0) FoundCameras.Clear();
|
|
//Find all cameras in scene and store
|
|
Camera[] CamerasFound = (Camera[])FindObjectsOfType(typeof(Camera));
|
|
for (int i = 0; i < CamerasFound.Length; i++)
|
|
if (
|
|
!CamerasFound[i].name.Contains("FogVolumeCamera")
|
|
&&
|
|
!CamerasFound[i].name.Contains("Shadow Camera")
|
|
&&
|
|
CamerasFound[i].gameObject.hideFlags == HideFlags.None)//not you!
|
|
FoundCameras.Add(CamerasFound[i]);
|
|
|
|
if (GameCamera == null)
|
|
GameCamera = Camera.main;
|
|
|
|
//No MainCamera? Try to find any!
|
|
if (GameCamera == null)
|
|
{
|
|
foreach (Camera FoundCamera in FoundCameras)
|
|
{
|
|
// Many effects may use hidden cameras, so let's filter a little bit until we get something valid
|
|
if (FoundCamera.isActiveAndEnabled)
|
|
if (FoundCamera.gameObject.activeInHierarchy)
|
|
if (FoundCamera.gameObject.hideFlags == HideFlags.None)
|
|
{
|
|
GameCamera = FoundCamera;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (GameCamera != null)
|
|
{
|
|
// Debug.Log("Fog Volume has been assigned with camera: " + GameCamera);
|
|
//if (FindObjectOfType<FogVolumeCamera>())
|
|
// FindObjectOfType<FogVolumeCamera>().SceneCamera = GameCamera;
|
|
|
|
//NOTE: This makes sure we have a depth texture which will be either free (deferred, etc) or internally generated through a replacement shader
|
|
//Now, objects must be able to do shadow casting. If you’re using surface shaders, add the "addshadow" directive
|
|
//only “opaque” objects (that which have their materials and shaders setup to use render queue <= 2500) are rendered into the depth texture.
|
|
//GameCamera.depthTextureMode = DepthTextureMode.Depth;
|
|
}
|
|
|
|
}
|
|
public Camera GetFogVolumeCamera
|
|
{
|
|
get
|
|
{
|
|
return GameCamera;
|
|
}
|
|
}
|
|
|
|
void OnDisable()
|
|
{
|
|
FoundCameras.Clear();
|
|
SceneFogVolumes = null;
|
|
}
|
|
}
|