namespace Editor.Assets; [AssetPreview( "scene" )] class PreviewScene : AssetPreview { public override float PreviewWidgetCycleSpeed => 0.2f; public override bool UsePixelEvaluatorForThumbs => true; public override float VideoLength => 6.0f; Rotation baseRotation; public PreviewScene( Asset asset ) : base( asset ) { } /// /// Create the model or whatever needs to be viewed /// public override async Task InitializeAsset() { using ( EditorUtility.DisableTextureStreaming() ) { var sf = Asset.LoadResource(); if ( sf is null ) return; using ( Scene.Push() ) { Scene.Load( sf ); } while ( Scene.IsLoading ) { await Task.Delay( 100 ); } using ( Scene.Push() ) { if ( !Scene.Camera.IsValid() ) { var camera = new GameObject( true, "camera" ); var cc = camera.Components.Create(); cc.FieldOfView = 40; cc.BackgroundColor = "#19181a"; cc.ZFar = 100000; cc.ZNear = 1; } // tonemapping is gonna fuck us up foreach ( var x in Scene.GetAllComponents() ) { x.Destroy(); } Scene.Camera.FieldOfView = 60; if ( !Scene.Camera.Components.Get().IsValid() ) { var bloom = Scene.Camera.Components.Create(); bloom.Threshold = 0.2f; bloom.Strength = 0.2f; } SceneCenter = Scene.Camera.WorldPosition; baseRotation = Scene.Camera.WorldRotation; TryAddDefaultLighting( Scene ); } } } float time = 0; public override void UpdateScene( float cycle, float timeStep ) { time += timeStep; using ( Scene.Push() ) { if ( IsRenderingVideo ) { Camera.WorldPosition = SceneCenter + baseRotation.Right * (cycle).Remap( 0, 1, -1, 1 ) * 100; Camera.WorldRotation = baseRotation; } else { Camera.WorldPosition = SceneCenter + baseRotation.Right * MathF.Sin( cycle * 2.0f ) * 100; Camera.WorldRotation = baseRotation; } } base.UpdateScene( cycle, timeStep ); } static void TryAddDefaultLighting( Scene scene ) { if ( scene.Components.GetInDescendantsOrSelf( true ).IsValid() ) return; if ( scene.Components.GetInDescendantsOrSelf( true ).IsValid() ) return; if ( scene.Components.GetInDescendantsOrSelf( true ).IsValid() ) return; var go = scene.CreateObject(); go.Name = "Directional Light"; go.WorldRotation = Rotation.From( 90, 0, 0 ); var light = go.Components.Create(); light.LightColor = Color.White; scene.SceneWorld.AmbientLightColor = "#557685"; } }