Files
2026-11-01 23:39:55 +02:00

83 lines
2.8 KiB
C#

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
//-----------------------------------------------------------------------
// Author: Colby-O
// File: PSXEffectFeature.cs
//-----------------------------------------------------------------------
namespace ColbyO.VNTG.PSX
{
public sealed class PSXEffectFeature : ScriptableRendererFeature
{
[Header("Settings")]
[SerializeField] private RenderPassEvent _renderEvent = RenderPassEvent.BeforeRenderingPostProcessing;
private Shader _psxEffectShader;
private Material _material;
private PSXEffectPass _psxEffectPass;
private PSXSetGlobalParamters _psxSetGlobalParamtersPass;
public override void Create()
{
if (_psxEffectShader == null)
_psxEffectShader = Shader.Find("Hidden/PSXMaster_URP");
if (_material == null)
_material = CoreUtils.CreateEngineMaterial(_psxEffectShader);
_psxSetGlobalParamtersPass ??= new PSXSetGlobalParamters()
{
renderPassEvent = RenderPassEvent.BeforeRendering
};
_psxEffectPass ??= new PSXEffectPass(_material)
{
renderPassEvent = _renderEvent
};
}
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
if (_material == null || _psxEffectPass == null)
{
Debug.LogWarning("PSX Feature missing material or pass.");
return;
}
VolumeStack stack = VolumeManager.instance.stack;
PSXEffectSettings settings = stack.GetComponent<PSXEffectSettings>();
bool isGameCamera = renderingData.cameraData.cameraType == CameraType.Game;
bool isSceneView = renderingData.cameraData.cameraType == CameraType.SceneView && settings.ShowInSceneView.value;
bool isActive = settings != null && settings.IsActive() && (isGameCamera || isSceneView);
if (isActive)
{
_psxSetGlobalParamtersPass.Setup(settings.AmbientColor.value);
_psxEffectPass.Setup(_material);
renderer.EnqueuePass(_psxSetGlobalParamtersPass);
renderer.EnqueuePass(_psxEffectPass);
}
else
{
_psxSetGlobalParamtersPass.Setup(Color.black);
renderer.EnqueuePass(_psxSetGlobalParamtersPass);
}
}
protected override void Dispose(bool disposing)
{
if (_material != null)
{
CoreUtils.Destroy(_material);
_material = null;
}
base.Dispose(disposing);
}
}
}