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

205 lines
6.0 KiB

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