升级水插件

This commit is contained in:
2026-01-08 22:30:55 +08:00
parent febff82d24
commit ca68084264
415 changed files with 18138 additions and 7134 deletions

View File

@@ -1,9 +1,8 @@
// Crest Water System
// Crest Water System
// Copyright © 2024 Wave Harmonic. All rights reserved.
#if d_UnityURP
using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
@@ -12,55 +11,38 @@ namespace WaveHarmonic.Crest
{
sealed partial class SampleShadowsURP : ScriptableRenderPass
{
const string k_Name = "Crest Shadow Data";
static SampleShadowsURP s_Instance;
internal static bool Created => s_Instance != null;
WaterRenderer _Water;
SampleShadowsURP(RenderPassEvent renderPassEvent)
{
this.renderPassEvent = renderPassEvent;
}
internal static void Enable()
internal static void Enable(WaterRenderer water)
{
s_Instance ??= new(RenderPassEvent.AfterRenderingSkybox);
RenderPipelineManager.beginCameraRendering -= EnqueuePass;
RenderPipelineManager.beginCameraRendering += EnqueuePass;
RenderPipelineManager.activeRenderPipelineTypeChanged -= s_Instance.OnActiveRenderPipelineTypeChanged;
RenderPipelineManager.activeRenderPipelineTypeChanged += s_Instance.OnActiveRenderPipelineTypeChanged;
s_Instance ??= new(RenderPassEvent.AfterRenderingShadows);
s_Instance._Water = water;
}
internal static void Disable()
internal static void EnqueuePass(ScriptableRenderContext context, Camera camera)
{
// TODO: Currently on RP change this method can be called with Enable ever being called leading to null
// exceptions. It can be removed once those problems are sorted.
if (s_Instance != null)
if (s_Instance == null)
{
RenderPipelineManager.activeRenderPipelineTypeChanged -= s_Instance.OnActiveRenderPipelineTypeChanged;
return;
}
RenderPipelineManager.beginCameraRendering -= EnqueuePass;
}
var water = s_Instance._Water;
void OnActiveRenderPipelineTypeChanged()
{
Disable();
}
static void EnqueuePass(ScriptableRenderContext context, Camera camera)
{
var water = WaterRenderer.Instance;
if (water == null || !water._ShadowLod.Enabled)
if (!water._ShadowLod.Enabled)
{
return;
}
#if UNITY_EDITOR
if (!WaterRenderer.IsWithinEditorUpdate || EditorApplication.isPaused)
if (!WaterRenderer.IsWithinEditorUpdate)
{
return;
}
@@ -84,7 +66,7 @@ namespace WaveHarmonic.Crest
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
#endif
{
var water = WaterRenderer.Instance;
var water = _Water;
if (water == null || !water._ShadowLod.Enabled)
{
@@ -103,30 +85,16 @@ namespace WaveHarmonic.Crest
var camera = renderingData.cameraData.camera;
#if !UNITY_6000_0_OR_NEWER
var buffer = CommandBufferPool.Get(k_Name);
var buffer = CommandBufferPool.Get(WaterRenderer.k_DrawLodData);
#endif
// We need to check the mask or it will cause entire pipeline to output black. Appears to only affect URP.
var isStereoRendering = renderingData.cameraData.xrRendering && XRHelpers.IsSinglePass &&
camera.stereoTargetEye == StereoTargetEyeMask.Both;
// Disable for XR SPI otherwise input will not have correct world position.
if (isStereoRendering)
{
buffer.DisableShaderKeyword("STEREO_INSTANCING_ON");
}
Rendering.URP.DisableXR(buffer, renderingData.cameraData);
water._ShadowLod.BuildCommandBuffer(water, buffer);
// Restore matrices otherwise remaining render will have incorrect matrices. Each pass is responsible for
// restoring matrices if required.
buffer.SetViewProjectionMatrices(camera.worldToCameraMatrix, camera.projectionMatrix);
// Restore XR SPI as we cannot rely on remaining pipeline to do it for us.
if (isStereoRendering)
{
buffer.EnableShaderKeyword("STEREO_INSTANCING_ON");
}
Rendering.URP.EnableXR(buffer, renderingData.cameraData);
#if !UNITY_6000_0_OR_NEWER
context.ExecuteCommandBuffer(buffer);