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();
}
}