namespace Editor.Assets; [AssetPreview( "vmat" )] class PreviewMaterial : AssetPreview { //public override bool IsAnimatedPreview => false; public override float PreviewWidgetCycleSpeed => 0.2f; SkyBox2D skyboxObject; static readonly Model Plane = Model.Load( "models/dev/plane_blend.vmdl" ); public PreviewMaterial( Asset asset ) : base( asset ) { } /// /// Create the model or whatever needs to be viewed /// public override async Task InitializeAsset() { var material = await Material.LoadAsync( Asset.Path ); if ( material is null ) return; using ( Scene.Push() ) { PrimaryObject = new GameObject(); PrimaryObject.WorldTransform = Transform.Zero; if ( material.Flags.IsSky ) { skyboxObject = PrimaryObject.AddComponent(); skyboxObject.SkyMaterial = material; } else { var sprite = PrimaryObject.AddComponent(); sprite.Model = Plane; sprite.MaterialOverride = material; } } } public override void UpdateScene( float cycle, float timeStep ) { // Big fov for skybox preview so you can see a few sides if ( skyboxObject.IsValid() ) { Camera.WorldPosition = Vector3.Zero; Camera.WorldRotation = new Angles( 0, 180 * cycle, 0 ); Camera.FieldOfView = 120; return; } float spin = 180 * cycle; float pitch = 90; Camera.WorldPosition = Vector3.Up * 300; Camera.WorldRotation = new Angles( pitch, 180 + spin, 0 ); PrimaryObject.WorldRotation = new Angles( 0, spin, 0 ); SceneCenter = 0; SceneSize = 55; FrameScene(); } public override Widget CreateToolbar() { var info = new IconButton( "settings" ); info.Layout = Layout.Row(); info.MinimumSize = 16; info.MouseLeftPress = () => OpenSettings( info ); return info; } public void OpenSettings( Widget parent ) { var popup = new PopupWidget( parent ); popup.IsPopup = true; popup.Layout = Layout.Column(); popup.Layout.Margin = 16; var ps = new ControlSheet(); ps.AddProperty( Camera, x => x.BackgroundColor ); ps.AddProperty( PrimaryObject.GetComponent(), x => x.Tint ); //ps.AddProperty( Camera, x => x.EnablePostProcessing ); popup.Layout.Add( ps ); popup.MaximumWidth = 300; popup.Show(); popup.Position = parent.ScreenRect.TopRight - popup.Size; popup.ConstrainToScreen(); } }