Water/WaterController.cs

Component that controls water behavior and rendering. It sets up reflection camera, GPU buffer for simulation, colliders/buoyancy, discovers tiles, updates simulation and ring effects each frame, and draws gizmos for tile mode.

Native InteropFile Access
namespace AtmokineticAssets;
// Also add:

//Caustics
//Weather (Rain, Ice)
//Caustics
//Depth

//Finish Area Mode

public sealed partial class WaterController : Component, Component.ExecuteInEditor
{
	public enum WaterModeEnumeration
	{
		Tiles,
		//Area,
		//Custom
	}

	[Property, Feature("General")]
	public WaterModeEnumeration WaterMode { get; set; } = WaterModeEnumeration.Tiles;

	protected override void OnAwake()
	{
		CreateWaterReflectionPlanarCamera();
	
		rippleBuffer = new GpuBuffer<WaterSimulation>(1);
		currentBufferSize = 1;
	}

	protected override void OnStart()
	{
		GameObject.Tags.Add("water");
		CalculateBounds();
		CreateWaterCollider();
		CreateWaterBuoyancy();
		DiscoverBakedTiles();
		WaterSurfaceAttributes();
		ApplyWaterReflectionModeToTiles();

		_tilesStarted = true;	
	}

	protected override void OnEnabled()
	{
		_lastSnappedPosition = new Vector2( float.MinValue, float.MinValue );
	}


	protected override void OnPreRender()
	{
		RenderWaterReflectionPlanar();
	}

	protected override void OnUpdate()
	{
		// switch(WetnessVolumeMode)
		// {
		// 	case WetnessVolumeModeEnumeration.Cube:
		// 		UpdateWetnessVolumeCubeBuffer();
		// 		break;

		// 	case WetnessVolumeModeEnumeration.Cylinder:
		// 		UpdateWetnessVolumeCylinderBuffer();
		// 		break;
		// }
		
		// 	Log.Info( component.GetType().Name );
			
		UpdateRings();
		UpdateWaterSimulation();
		WaterSurfaceAttributes();
		
		// Culling changes as the camera moves, so the tiles' reflection mode has to
		// keep up - a fully culled water falls back to the cubemap. Only push to the
		// tiles when the resolved mode actually changes; the camera itself is
		// enabled/disabled to match by RenderWaterReflectionPlanar.
		if ( IsWaterReflectionPlanarRendering() != _lastWaterReflectionPlanarRendering )
			ApplyWaterReflectionModeToTiles();
	}

	protected override void OnDestroy()
	{
		rippleBuffer?.Dispose();
	}

	protected override void DrawGizmos()
	{
		switch(WaterMode)
		{
			case WaterModeEnumeration.Tiles:	

				DrawWaterTileGizmo();		
				break;
			/*
			case WaterModeEnumeration.Area:
				break;
		
			case WaterModeEnumeration.Custom:
				break;
			*/
		}

		// switch(WetnessVolumeMode)
		// {
		// 	case WetnessVolumeModeEnumeration.Cube:
		// 		DrawWetnessVolumeCubeGizmos();
		// 		break;

		// 	case WetnessVolumeModeEnumeration.Cylinder:
		// 		DrawWetnessVolumeCylinderGizmos();
		// 		break;
		// }

		//Water Reflection Planar
		ShowWaterReflectionPlanarCameraGameObject();

		WaterSurfaceAttributes();
	}
}