UI/ZonePanel.razor
@using HC3.Terraforming
@using Sandbox;
@using Sandbox.UI;
@inherits BaseCanvas
@namespace HC3

<root>
    <div class="screen-canvas">
        @foreach (var zone in BuildingZone.Instance.GetAllPreview())
        {
            var cost = BuildingZone.Instance.GetChunkCost(zone.Item1);
            @if (IsOffScreen(zone.Item2)) continue;
            <div class="zone-purchase" style="@GetPos(zone.Item2)">
                <div class="zone-name">PURCHASE</div>
                <div class="zone-cost">$@(cost)</div>
            </div>
        }
    </div>
</root>

@code
{
    private static Vector2 ScreenSafezone = new(0.05f, 0.95f);

    string GetPos(Vector3 pos)
    {
        var toScreen = Scene.Camera.PointToScreenNormal(pos, out bool isBehind);

        toScreen = new(toScreen.x.Clamp(ScreenSafezone.x, ScreenSafezone.y), toScreen.y.Clamp(ScreenSafezone.x, ScreenSafezone.y));

        return $"top: {Length.Fraction(toScreen.y)}px; left: {Length.Fraction(toScreen.x)}px;";
    }

    bool IsOffScreen(Vector3 pos)
    {
        var toScreen = Scene.Camera.PointToScreenPixels(pos, out bool isBehind);
        return isBehind;
    }


    protected override int BuildHash() => System.HashCode.Combine(base.BuildHash(), Time.Now);

    protected override void OnTreeFirstBuilt()
    {
        RegisterAs( "ZoneCanvas" );
    }

    protected override void OnUpdate()
    {
        base.OnUpdate();

		if ( BuildingZone.Instance is { IsValid: true } buildingZone )
		{
			buildingZone.PurchaseMode = IsVisible;
		}
    }
}