Mask/MaskGizmoDrawer.cs
using System;
using Sandbox.Spawners;

namespace Sandbox.Mask;

public static class MaskGizmoDrawer
{
	/// <summary>
	/// Size of each debug cube.
	/// </summary>
	public const float CubeSize = 20.0f;

	/// <summary>
	/// Space between samples.
	/// </summary>
	public const float SampleSpacing = 30.0f;

	public static void Draw(
		MaskField maskField,
		Terrain terrain,
		Vector3 center,
		BBox bounds )
	{
		
		for ( float x = 0; x < maskField.WorldSize; x += SampleSpacing )
		{
			for ( float y = 0; y < maskField.WorldSize; y += SampleSpacing )
			{
				var terrainLocal = new Vector3(
					maskField.WorldOffset.x + x,
					maskField.WorldOffset.y + y,
					0
				);

				var worldPos = terrain.WorldTransform.PointToWorld( terrainLocal );

				float value = SpawnUtils.SampleMaskAt(
					maskField,
					terrain,
					worldPos
				);

				if ( value <= 0.001f )
					continue;

				value = value.Clamp( 0.0f, 1.0f );

				Gizmo.Draw.Color = Color.Lerp(
					Color.Black,
					Color.White,
					value
				);

				Gizmo.Draw.SolidBox(
					BBox.FromPositionAndSize(
						worldPos,
						CubeSize
					)
				);
			}
		}
	}
}