zombie_mp/Assets/KriptoFX/VolumetricBloodFX/Scripts/BFX_BloodDecalLayers.cs
Sewmina Dilshan 68183e5317 initial
2021-08-23 13:28:33 +05:30

82 lines
2.7 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BFX_BloodDecalLayers : MonoBehaviour
{
public LayerMask DecalLayers = 1;
public DecalLayersProperty DecalRenderingMode = DecalLayersProperty.DrawToSelectedLayers;
public DepthMode LayerDepthResoulution = DepthMode.FullScreen;
DepthTextureMode defaultMode;
RenderTexture rt;
Camera depthCamera;
void OnEnable()
{
var currentCam = GetComponent<Camera>();
defaultMode = currentCam.depthTextureMode;
if (currentCam.renderingPath == RenderingPath.Forward)
{
currentCam.depthTextureMode |= DepthTextureMode.Depth;
}
var go = new GameObject("DecalLayersCamera");
go.transform.parent = currentCam.transform;
go.transform.localPosition = Vector3.zero;
go.transform.localRotation = Quaternion.identity;
depthCamera = go.AddComponent<Camera>();
depthCamera.CopyFrom(currentCam);
depthCamera.renderingPath = RenderingPath.Forward;
depthCamera.depth = currentCam.depth - 1;
depthCamera.cullingMask = DecalLayers;
CreateDepthTexture();
depthCamera.targetTexture = rt;
Shader.SetGlobalTexture("_LayerDecalDepthTexture", rt);
Shader.EnableKeyword("USE_CUSTOM_DECAL_LAYERS");
if (DecalRenderingMode == DecalLayersProperty.IgnoreSelectedLayers) Shader.EnableKeyword("USE_CUSTOM_DECAL_LAYERS_IGNORE_MODE");
}
void OnDisable()
{
GetComponent<Camera>().depthTextureMode = defaultMode;
RenderTexture.ReleaseTemporary(rt);
Shader.DisableKeyword("USE_CUSTOM_DECAL_LAYERS");
if (DecalRenderingMode == DecalLayersProperty.IgnoreSelectedLayers) Shader.DisableKeyword("USE_CUSTOM_DECAL_LAYERS_IGNORE_MODE");
}
void CreateDepthTexture()
{
switch (LayerDepthResoulution)
{
case DepthMode.FullScreen:
rt = RenderTexture.GetTemporary(Screen.width, Screen.height, 24, RenderTextureFormat.Depth);
break;
case DepthMode.HalfScreen:
rt = RenderTexture.GetTemporary((int)(Screen.width * 0.5f), (int)(Screen.height * 0.5f), 24, RenderTextureFormat.Depth);
break;
case DepthMode.QuarterScreen:
rt = RenderTexture.GetTemporary((int)(Screen.width * 0.25f), (int)(Screen.height * 0.25f), 24, RenderTextureFormat.Depth);
break;
default:
break;
};
}
public enum DecalLayersProperty
{
DrawToSelectedLayers,
IgnoreSelectedLayers
}
public enum DepthMode
{
FullScreen,
HalfScreen,
QuarterScreen
}
}