102 lines
3.4 KiB
C#
102 lines
3.4 KiB
C#
// Crest Water System
|
|
// Copyright © 2024 Wave Harmonic. All rights reserved.
|
|
|
|
using UnityEngine;
|
|
using UnityEngine.Rendering;
|
|
|
|
namespace WaveHarmonic.Crest
|
|
{
|
|
partial class UnderwaterRenderer
|
|
{
|
|
bool _HasMaskCommandBuffersBeenRegistered;
|
|
bool _HasEffectCommandBuffersBeenRegistered;
|
|
|
|
void OnEnableLegacy()
|
|
{
|
|
SetupMask();
|
|
OnEnableMask();
|
|
SetupUnderwaterEffect();
|
|
|
|
// Handle this internally rather than relying on Water Renderer.
|
|
Camera.onPreRender -= OnBeforeLegacyRender;
|
|
Camera.onPreRender += OnBeforeLegacyRender;
|
|
Camera.onPostRender -= OnAfterLegacyRender;
|
|
Camera.onPostRender += OnAfterLegacyRender;
|
|
RenderPipelineManager.activeRenderPipelineTypeChanged -= OnDisableLegacy;
|
|
RenderPipelineManager.activeRenderPipelineTypeChanged += OnDisableLegacy;
|
|
}
|
|
|
|
void OnDisableLegacy()
|
|
{
|
|
Camera.onPreRender -= OnBeforeLegacyRender;
|
|
Camera.onPostRender -= OnAfterLegacyRender;
|
|
RenderPipelineManager.activeRenderPipelineTypeChanged -= OnDisableLegacy;
|
|
|
|
OnDisableMask();
|
|
}
|
|
|
|
internal void LateUpdate()
|
|
{
|
|
if (!Active)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!RenderPipelineHelper.IsLegacy)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Helpers.SetGlobalKeyword("CREST_UNDERWATER_BEFORE_TRANSPARENT", _EnableShaderAPI);
|
|
}
|
|
|
|
void OnBeforeLegacyRender(Camera camera)
|
|
{
|
|
XRHelpers.Update(camera);
|
|
XRHelpers.SetInverseViewProjectionMatrix(camera);
|
|
|
|
if (ShouldRender(camera, Pass.Mask))
|
|
{
|
|
// It could be either one event.
|
|
camera.AddCommandBuffer(CameraEvent.BeforeGBuffer, _MaskCommandBuffer);
|
|
camera.AddCommandBuffer(CameraEvent.BeforeDepthTexture, _MaskCommandBuffer);
|
|
OnPreRenderMask(camera);
|
|
_HasMaskCommandBuffersBeenRegistered = true;
|
|
}
|
|
|
|
if (ShouldRender(camera, Pass.Effect))
|
|
{
|
|
var @event = _EnableShaderAPI ? CameraEvent.BeforeForwardAlpha : CameraEvent.AfterForwardAlpha;
|
|
camera.AddCommandBuffer(@event, _EffectCommandBuffer);
|
|
OnPreRenderUnderwaterEffect(camera);
|
|
_HasEffectCommandBuffersBeenRegistered = true;
|
|
}
|
|
|
|
_FirstRender = false;
|
|
}
|
|
|
|
void OnAfterLegacyRender(Camera camera)
|
|
{
|
|
if (_HasMaskCommandBuffersBeenRegistered)
|
|
{
|
|
// It could be either one event.
|
|
camera.RemoveCommandBuffer(CameraEvent.BeforeGBuffer, _MaskCommandBuffer);
|
|
camera.RemoveCommandBuffer(CameraEvent.BeforeDepthTexture, _MaskCommandBuffer);
|
|
_MaskCommandBuffer?.Clear();
|
|
}
|
|
|
|
if (_HasEffectCommandBuffersBeenRegistered)
|
|
{
|
|
var @event = _EnableShaderAPI ? CameraEvent.BeforeForwardAlpha : CameraEvent.AfterForwardAlpha;
|
|
camera.RemoveCommandBuffer(@event, _EffectCommandBuffer);
|
|
_EffectCommandBuffer?.Clear();
|
|
}
|
|
|
|
_HasMaskCommandBuffersBeenRegistered = false;
|
|
_HasEffectCommandBuffersBeenRegistered = false;
|
|
|
|
OnAfterCameraRender(camera);
|
|
}
|
|
}
|
|
}
|