Editor/Tileset/TilesetResource/PreviewTileset.cs
using Editor;
using Editor.Assets;
using Sandbox;
using System.Threading.Tasks;

namespace SpriteTools;

[AssetPreview( "tileset" )]
class PreviewTileset : AssetPreview
{
	internal Texture texture;

	public override bool IsAnimatedPreview => false;

	public PreviewTileset ( Asset asset ) : base( asset )
	{
		if ( !asset.TryLoadResource<TilesetResource>( out var tileset ) )
			return;

		var filePath = tileset?.FilePath;
		if ( filePath is null || !Editor.FileSystem.Content.FileExists( filePath ) )
			return;

		var image = Texture.LoadFromFileSystem( tileset?.FilePath, Editor.FileSystem.Content );
		if ( image is not null )
		{
			texture = image;
		}
	}

	public override Task InitializeAsset ()
	{
		using ( Scene.Push() )
		{
			PrimaryObject = new GameObject();
			PrimaryObject.WorldTransform = Transform.Zero;

			if ( texture is not null )
			{
				var sprite = PrimaryObject.AddComponent<Sandbox.SpriteRenderer>();
				var resource = new Sprite();
				var anim = new Sprite.Animation();
				var frame = new Sprite.Frame();
				frame.Texture = texture;

				anim.Frames.Add( frame );
				resource.Animations.Add( anim );
				sprite.Sprite = resource;

				var aspect = (float)texture.Width / (float)texture.Height;
				sprite.Size = new Vector2( 16 * aspect, 16 );

				if ( aspect > 1 )
				{
					sprite.Size = new Vector2( 16, 16 / aspect );
				}
			}

			Camera.Orthographic = true;
			Camera.OrthographicHeight = 16;
		}

		return Task.CompletedTask;
	}

	public override void UpdateScene ( float cycle, float timeStep )
	{
		base.UpdateScene( cycle, timeStep );

		Camera.Orthographic = true;
		Camera.OrthographicHeight = 16;
		Camera.WorldPosition = Vector3.Forward * -200;
		Camera.WorldRotation = Rotation.LookAt( Vector3.Forward );
	}
}