Water/WaterController.Surface.cs

Part of a WaterController component managing surface visual properties. Defines synced editable properties for surface color, blur, reflection, shoreline, tension and two ripple textures, and applies them to tile renderers via WaterSurfaceAttributes().

File Access
namespace AtmokineticAssets;

// Also add:

//Ice
//Caustics

public sealed partial class WaterController : Component, Component.ExecuteInEditor
{
	// Surface
	[Property, Feature("Attributes"), Group("Surface"), Title("Color"), Order(1)]
	[Sync]
	public Color WaterSurfaceColor { get; set { field = value; _surfaceAttributesDirty = true; } } = Color.Parse( "#c5d9ff" ).Value;

	[Property, Feature("Attributes"), Group("Surface"), Title("Blur"), Order(2)]
	[Sync]
	public float WaterSurfaceBlur { get; set { field = value; _surfaceAttributesDirty = true; } } = 0;

	// Reflection
	[Property, Feature("Attributes"), Group("Reflection"), Title("Color"), Order(3)]
	[Sync]
	public Color WaterReflectionColor { get; set { field = value; _surfaceAttributesDirty = true; } } = Color.Parse( "#c5d9ff" ).Value;

	[Property, Feature("Attributes"), Group("Reflection"), Title("Blur"), Order(4)]
	[Sync]
	public float WaterReflectionBlur { get; set { field = value; _surfaceAttributesDirty = true; } } = 0;

	[Property, Feature("Attributes"), Group("Reflection"), Title("Distance"), Order(5)]
	[Sync]
	public float WaterReflectionDistance { get; set { field = value; _surfaceAttributesDirty = true; } } = 4f;

	[Property, Feature("Attributes"), Group("Reflection"), Title("Threshold"), Order(6)]
	[Sync]
	public Vector2 WaterReflectionThreshold { get; set { field = value; _surfaceAttributesDirty = true; } } = new Vector2( 0, 0.25f );

	// Shoreline
	[Property, Feature("Attributes"), Group("Shoreline"), Title("Fade"), Order(7)]
	[Sync]
	public float WaterShorelineFade { get; set { field = value; _surfaceAttributesDirty = true; } } = 2f;

	// Tension
	[Property, Feature("Attributes"), Group("Tension"), Title("Distance"), Order(8)]
	[Sync]
	public float WaterTensionDistance { get; set { field = value; _surfaceAttributesDirty = true; } } = 2f;

	[Property, Feature("Attributes"), Group("Tension"), Title("Refraction"), Order(9)]
	[Sync]
	public float WaterTensionRefraction { get; set { field = value; _surfaceAttributesDirty = true; } } = 0.1f;

	// Texture A
	[Property, Feature("Attributes"), Group("Water Ripples A"), Title("Texture A"), Order(10)]
	[Sync]
	public Texture WaterRipplesTextureA { get; set { field = value; _surfaceAttributesDirty = true; } } = Texture.Load("textures/tex-water_ripples.vtex");

	[Property, Feature("Attributes"), Group("Water Ripples A"), Title("Scale A"), Order(11)]
	[Sync]
	public float WaterRipplesScaleA { get; set { field = value; _surfaceAttributesDirty = true; } } = 0.01f;

	[Property, Feature("Attributes"), Group("Water Ripples A"), Title("Rotation A"), Order(12)]
	[Sync]
	public float WaterRipplesRotationA { get; set { field = value; _surfaceAttributesDirty = true; } } = 0f;

	[Property, Feature("Attributes"), Group("Water Ripples A"), Title("Speed A"), Order(13)]
	[Sync]
	public float WaterRipplesSpeedA { get; set { field = value; _surfaceAttributesDirty = true; } } = 0.1f;

	[Property, Feature("Attributes"), Group("Water Ripples A"), Title("Refraction A"), Order(14)]
	[Sync]
	public float WaterRipplesRefractionA { get; set { field = value; _surfaceAttributesDirty = true; } } = 0.05f;

	[Property, Feature("Attributes"), Group("Water Ripples A"), Title("Displacement A"), Order(15)]
	[Sync]
	public float WaterRipplesDisplacementA { get; set { field = value; _surfaceAttributesDirty = true; } } = 0.5f;

	// Texture B
	[Property, Feature("Attributes"), Group("Water Ripples B"), Title("Texture B"), Order(16)]
	[Sync]
	public Texture WaterRipplesTextureB { get; set { field = value; _surfaceAttributesDirty = true; } } = Texture.Load("textures/tex-water_ripples.vtex");

	[Property, Feature("Attributes"), Group("Water Ripples B"), Title("Scale B"), Order(17)]
	[Sync]
	public float WaterRipplesScaleB { get; set { field = value; _surfaceAttributesDirty = true; } } = 0.01f;

	[Property, Feature("Attributes"), Group("Water Ripples B"), Title("Rotation B"), Order(18)]
	[Sync]
	public float WaterRipplesRotationB { get; set { field = value; _surfaceAttributesDirty = true; } } = 180f;

	[Property, Feature("Attributes"), Group("Water Ripples B"), Title("Speed B"), Order(19)]
	[Sync]
	public float WaterRipplesSpeedB { get; set { field = value; _surfaceAttributesDirty = true; } } = 0.1f;

	[Property, Feature("Attributes"), Group("Water Ripples B"), Title("Refraction B"), Order(20)]
	[Sync]
	public float WaterRipplesRefractionB { get; set { field = value; _surfaceAttributesDirty = true; } } = 0.05f;

	[Property, Feature("Attributes"), Group("Water Ripples B"), Title("Displacement B"), Order(21)]
	[Sync]
	public float WaterRipplesDisplacementB { get; set { field = value; _surfaceAttributesDirty = true; } } = 0.5f;

	// Starts dirty so the first WaterSurfaceAttributes call always pushes.
	private bool _surfaceAttributesDirty = true;

	public void WaterSurfaceAttributes()
	{
		if ( !_surfaceAttributesDirty )
			return;

		_surfaceAttributesDirty = false;

		foreach ( var renderer in GetTileRenderers() )
		{

			if (WaterSurfaceBlur != 0)
			{	
				renderer.Attributes.SetCombo("D_Enable_Water_Surface_Blur", 1);
			}
			else
			{
				renderer.Attributes.SetCombo("D_Enable_Water_Surface_Blur", 0);
			}

			if (WaterReflectionBlur != 0)
			{
				renderer.Attributes.SetCombo("D_Enable_Water_Reflection_Blur", 1);
			}
			else
			{
				renderer.Attributes.SetCombo("D_Enable_Water_Reflection_Blur", 0);
			}


			// Surface
			renderer.Attributes.Set( "Water Surface Color", WaterSurfaceColor );
			renderer.Attributes.Set( "Water Surface Blur", WaterSurfaceBlur );

			// Reflection
			renderer.Attributes.Set( "Water Reflection Color", WaterReflectionColor );
			renderer.Attributes.Set( "Water Reflection Blur", WaterReflectionBlur );
			renderer.Attributes.Set( "Water Reflection Distance", WaterReflectionDistance );
			renderer.Attributes.Set( "Water Reflection Threshold", WaterReflectionThreshold );

			// Shoreline
			renderer.Attributes.Set( "Water Shoreline Fade", WaterShorelineFade );
			
			// Tension
			renderer.Attributes.Set( "Water Tension Distance", WaterTensionDistance );
			renderer.Attributes.Set( "Water Tension Refraction", WaterTensionRefraction );

			// Water Ripples A
			renderer.Attributes.Set( "WaterRipplesTextureA", WaterRipplesTextureA );
			renderer.Attributes.Set( "Water Ripples Scale A", WaterRipplesScaleA );
			renderer.Attributes.Set( "Water Ripples Rotation A", WaterRipplesRotationA );
			renderer.Attributes.Set( "Water Ripples Speed A", WaterRipplesSpeedA );
			renderer.Attributes.Set( "Water Ripples Refraction A", WaterRipplesRefractionA );
			renderer.Attributes.Set( "Water Ripples Displacement A", WaterRipplesDisplacementA );

			// Water Ripples B
			renderer.Attributes.Set( "WaterRipplesTextureB", WaterRipplesTextureB );
			renderer.Attributes.Set( "Water Ripples Scale B", WaterRipplesScaleB );
			renderer.Attributes.Set( "Water Ripples Rotation B", WaterRipplesRotationB );
			renderer.Attributes.Set( "Water Ripples Speed B", WaterRipplesSpeedB );
			renderer.Attributes.Set( "Water Ripples Refraction B", WaterRipplesRefractionB );
			renderer.Attributes.Set( "Water Ripples Displacement B", WaterRipplesDisplacementB );
		}
	}
}