Пример #1
0
        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;
            }
        }
Пример #2
0
        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;
            }
        }