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.

206 lines
6.0 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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