82 lines
2.7 KiB
C#
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
|
|
}
|
|
}
|