升级水插件

This commit is contained in:
2026-01-31 00:32:49 +08:00
parent a739d2fe3b
commit 4123e83573
293 changed files with 13449 additions and 2853 deletions

View File

@@ -1,8 +1,9 @@
// Crest Water System
// Copyright © 2024 Wave Harmonic. All rights reserved.
// FIXME: Broken for BIRP on MacOS. Either platform specific problem or bug in Unity.
#if UNITY_EDITOR
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
@@ -11,16 +12,38 @@ namespace WaveHarmonic.Crest
partial class SurfaceRenderer
{
RenderTexture _WaterLevelDepthTexture;
internal RenderTexture WaterLevelDepthTexture => _WaterLevelDepthTexture;
internal RenderTexture WaterLevelDepthTexture { get; private set; }
RenderTargetIdentifier _WaterLevelDepthTarget;
Material _WaterLevelDepthMaterial;
internal RenderTexture GetWaterLevelDepthTexture(Camera camera)
{
// Do not use SeparateViewpoint here, as this is called outside the camera loop.
if (_Water.SingleViewpoint)
{
return WaterLevelDepthTexture;
}
else if (_PerCameraLevelDepthTexture.ContainsKey(camera))
{
return _PerCameraLevelDepthTexture[camera];
}
return null;
}
const string k_WaterLevelDepthTextureName = "Crest Water Level Depth Texture";
void ExecuteWaterLevelDepthTexture(Camera camera, CommandBuffer buffer)
{
Helpers.CreateRenderTargetTextureReference(ref _WaterLevelDepthTexture, ref _WaterLevelDepthTarget);
_WaterLevelDepthTexture.name = k_WaterLevelDepthTextureName;
if (_Water.SingleViewpoint && _WaterLevelDepthTexture == null)
{
_WaterLevelDepthTexture = new(0, 0, 0);
WaterLevelDepthTexture = _WaterLevelDepthTexture;
}
LoadCameraDataLDT(camera);
WaterLevelDepthTexture.name = k_WaterLevelDepthTextureName;
if (_WaterLevelDepthMaterial == null)
{
@@ -41,11 +64,19 @@ namespace WaveHarmonic.Crest
// Depth texture.
// Always release to handle screen size changes.
_WaterLevelDepthTexture.Release();
WaterLevelDepthTexture.Release();
descriptor.graphicsFormat = UnityEngine.Experimental.Rendering.GraphicsFormat.R32_SFloat;
descriptor.depthBufferBits = 0;
Helpers.SafeCreateRenderTexture(ref _WaterLevelDepthTexture, descriptor);
_WaterLevelDepthTexture.Create();
WaterLevelDepthTexture.descriptor = descriptor;
WaterLevelDepthTexture.Create();
_WaterLevelDepthTarget = new
(
WaterLevelDepthTexture,
mipLevel: 0,
CubemapFace.Unknown,
depthSlice: -1 // Bind all XR slices.
);
// Convert.
Helpers.Blit(buffer, _WaterLevelDepthTarget, Rendering.BIRP.UtilityMaterial, (int)Rendering.BIRP.UtilityPass.Copy);
@@ -81,4 +112,48 @@ namespace WaveHarmonic.Crest
#endif
}
}
// Multiple Viewpoints
// Technically, this should always store an RT per camera, as it is screen-space.
// But having it opt-in is not a bad idea.
partial class SurfaceRenderer
{
internal Dictionary<Camera, RenderTexture> _PerCameraLevelDepthTexture = new();
void LoadCameraDataLDT(Camera camera)
{
if (_Water.SingleViewpoint)
{
return;
}
if (!_PerCameraLevelDepthTexture.ContainsKey(camera))
{
var descriptor = new RenderTextureDescriptor(camera.pixelWidth, camera.pixelHeight)
{
graphicsFormat = UnityEngine.Experimental.Rendering.GraphicsFormat.None,
depthBufferBits = 32,
};
WaterLevelDepthTexture = new(descriptor);
_PerCameraLevelDepthTexture.Add(camera, WaterLevelDepthTexture);
}
else
{
WaterLevelDepthTexture = _PerCameraLevelDepthTexture[camera];
}
}
internal void RemoveCameraDataLDT(Camera camera)
{
if (_PerCameraLevelDepthTexture.ContainsKey(camera))
{
_PerCameraLevelDepthTexture[camera].Release();
Helpers.Destroy(_PerCameraLevelDepthTexture[camera]);
_PerCameraLevelDepthTexture.Remove(camera);
}
}
}
}
#endif