UI/ModelPreviewer.razor
@using Sandbox;
@using Sandbox.UI;
@namespace CryptidHunt

<root>
    <button class="modelPreviewButton" onclick=@Previous>❮</button>
    <div class="modelPreviewerer">
        @if (CanSeeAsset)
        {
            <ModelPreview [email protected] @ref=ModelPreviewRef></ModelPreview>
        }
        else
        {
            ModelPreviewRef = null;
            <div class="secret">[LOCKED]</div>
        }
        <div class="modelInfo">@(CanSeeAsset? CurrentPreview.Name: "???") - @CurrentPreview.Author</div>
    </div>
    <button class="modelPreviewButton" onclick=@Next>❯</button>
</root>

@code
{
    public struct ModelPreviewPreset
    {
        public string Name;
        public string Path;
        public string Author;
        public Angles Rotation;
        public bool IsSecret = false;

        public ModelPreviewPreset()
        {
        }

        public static ModelPreviewPreset[] All => new ModelPreviewPreset[]
        {
            new ModelPreviewPreset { Name = "Polewik", Path = "models/polewik/polewik.vmdl", Author = "Grodbert", Rotation = new Angles( 20, 10, 0 ), IsSecret = true },
            new ModelPreviewPreset { Name = "Ammo Pack", Path = "models/items/ammo.vmdl", Author = "Luke", Rotation = new Angles( 20, 45, 0 ) },
            new ModelPreviewPreset { Name = "Bear Trap", Path = "models/items/beartrap.vmdl", Author = "Luke", Rotation = new Angles( 35, 45, 0 ) },
            new ModelPreviewPreset { Name = "Locked Chest", Path = "models/items/chest.vmdl", Author = "Luke", Rotation = new Angles( 0, -60, -20 ) },
            new ModelPreviewPreset { Name = "Crowbar", Path = "models/items/crowbar.vmdl", Author = "Luke", Rotation = new Angles( 15, 45, 60 ) },
            new ModelPreviewPreset { Name = "Key", Path = "models/items/key.vmdl", Author = "Luke", Rotation = new Angles( 0, 30, 180 ) },
            new ModelPreviewPreset { Name = "Lock", Path = "models/items/lock.vmdl", Author = "Luke", Rotation = new Angles( 0, 235, 0 ) },
            new ModelPreviewPreset { Name = "Medkit", Path = "models/items/medkit.vmdl", Author = "Luke", Rotation = new Angles( -20, 225, 0 ) },
            new ModelPreviewPreset { Name = "Bed", Path = "models/items/bed.vmdl", Author = "Luke", Rotation = new Angles( -20, 0, 0 )},
            new ModelPreviewPreset { Name = "Page", Path = "models/items/page.vmdl", Author = "Luke", Rotation = new Angles( 60, 20, 0 ) },
            new ModelPreviewPreset { Name = "Sign", Path = "models/items/sign.vmdl", Author = "Luke", Rotation = new Angles( 0, 90, 0 )},
            new ModelPreviewPreset { Name = "Palos Verdes Brain", Path = "models/brain/brain.vmdl", Author = "Grodbert", Rotation = new Angles( 20, 10, 0 ), IsSecret = true },
        };
    }

    public int CurrentSelected = 0;
    public ModelPreviewPreset CurrentPreview => ModelPreviewPreset.All[CurrentSelected];

    public ModelPreview ModelPreviewRef;

    public bool CanSeeAsset => !CurrentPreview.IsSecret || Settings.Instance.BeatenTheGame;

    public void Previous()
    {
        CurrentSelected = (CurrentSelected - 1) % ModelPreviewPreset.All.Count();
        if (CurrentSelected <= -1)
            CurrentSelected = ModelPreviewPreset.All.Count() - 1;

        ApplyAsset();
    }

    public void Next()
    {
        CurrentSelected = (CurrentSelected + 1) % ModelPreviewPreset.All.Count();
        ApplyAsset();
    }

    private void ApplyAsset()
    {
        if (!ModelPreviewRef.IsValid())
        {
            return;
        }

        // TODO: rndtrash: the intended preview angles don't look right
        // ModelPreviewRef.Renderer.WorldRotation = CurrentPreview.Rotation;
    }

    /// <summary>
    /// the hash determines if the system should be rebuilt. If it changes, it will be rebuilt
    /// </summary>
    protected override int BuildHash() => System.HashCode.Combine(CurrentSelected, Settings.Instance.BeatenTheGame);
}