private void InitializeGraphicsScreen() { Debug.Assert(GraphicsScreens.Count == 0, "Reset graphics screens before calling InitializeGraphicsScreen()."); var services = Document.Editor.Services; var graphicsService = services.GetInstance <IGraphicsService>().ThrowIfMissing(); // Initialize graphics screens. var graphicsScreen = UseDeferredLighting ? (GraphicsScreen) new DeferredGraphicsScreen(services) : new BasicGraphicsScreen(services); GraphicsScreens.Add(graphicsScreen); GraphicsScreens.Add(new DebugGraphicsScreen(services)); // Add default lighting. var scene = UseDeferredLighting ? ((DeferredGraphicsScreen)graphicsScreen).Scene : ((BasicGraphicsScreen)graphicsScreen).Scene; GameHelper.AddLights(scene); // Add a ground plane (useful for orientation and to check model shadows). if (_groundModelNode == null) { var content = services.GetInstance <ContentManager>().ThrowIfMissing(); _groundModelNode = content.Load <ModelNode>("DigitalRune.Editor.Game/Models/Misc/GroundPlane/GroundPlane").Clone(); } _groundModelNode.IsEnabled = ShowGroundPlane; scene.Children.Add(_groundModelNode); // Add camera. if (CameraNode == null) { var projection = new PerspectiveProjection(); projection.SetFieldOfView( ConstantsF.PiOver4, graphicsService.GraphicsDevice.Viewport.AspectRatio, 0.1f, 10000.0f); CameraNode = new CameraNode(new Camera(projection)) { Name = "CameraPerspective", }; } if (UseDeferredLighting) { ((DeferredGraphicsScreen)graphicsScreen).ActiveCameraNode = CameraNode; } else { ((BasicGraphicsScreen)graphicsScreen).CameraNode = CameraNode; } }
private void Reset(bool resetScreens, bool resetPersistentNodes) { // Remove model node from previous scene. ModelNode?.Parent?.Children.Remove(Document.ModelNode); // Dispose model clones. if (ModelNode != Document.ModelNode) { Dispose(ModelNode); } ModelNode = null; if (GraphicsScreens.Count > 0) { var basicGraphicsScreen = GraphicsScreens[0] as BasicGraphicsScreen; if (basicGraphicsScreen != null) { basicGraphicsScreen.Model = null; } } if (resetScreens) { // Keep these nodes to keep camera orientation and to avoid unnecessary reloading. CameraNode?.Parent?.Children.Remove(CameraNode); _groundModelNode?.Parent?.Children.Remove(_groundModelNode); // Dispose graphics screens. foreach (var graphicsScreen in GraphicsScreens) { graphicsScreen.SafeDispose(); } GraphicsScreens.Clear(); } if (resetPersistentNodes) { Dispose(CameraNode); CameraNode = null; Dispose(_groundModelNode); _groundModelNode = null; } }