Ejemplo n.º 1
0
        protected override async Task <bool> Initialize(EditorServiceGame editorGame)
        {
            if (editorGame == null)
            {
                throw new ArgumentNullException(nameof(editorGame));
            }
            game = editorGame as SceneEditorGame;
            if (game == null)
            {
                throw new ArgumentException($"{nameof(game)} is not of type {nameof(EntityHierarchyEditorGame)}");
            }

            sceneEditorController = editor.Controller as SceneEditorController;
            if (sceneEditorController == null)
            {
                throw new ArgumentNullException(nameof(sceneEditorController));
            }

            gameSettingsProviderService = editor.ServiceProvider.Get <GameSettingsProviderService>();
            gameSettingsProviderService.GameSettingsChanged += GameSettingsProviderServiceOnGameSettingsChanged;
            await navigationMeshManager.Initialize();

            game.SceneAdded   += GameOnSceneAdded;
            game.SceneRemoved += GameOnSceneRemoved;

            // Add debug entity
            rootDebugEntity = new Entity("Navigation debug entity");
            game.EditorScene.Entities.Add(rootDebugEntity);

            // Handle added/updated navigation meshes so that they can be made visible when this scene is shown
            editor.Session.AssetPropertiesChanged += OnAssetPropertiesChanged;
            editor.Session.DeletedAssetsChanged   += OnDeletedAssetsChanged;

            editorGame.Script.AddTask(async() =>
            {
                while (editorGame.IsRunning)
                {
                    Update();
                    await editorGame.Script.NextFrame();
                }
            });

            // Initial update
            foreach (var asset in editor.Session.AllAssets)
            {
                if (asset.AssetType == typeof(NavigationMeshAsset))
                {
                    await UpdateNavigationMeshLink(asset);
                }
            }

            // Update linked navigation meshes when loaded content has changed
            //  this happens when a navigation mesh gets recompiled by changes in the scene or navigation mesh asset
            navigationMeshManager.Changed += NavigationMeshManagerOnChanged;

            SetDynamicNavigationSystem(game.GameSystems.OfType <DynamicNavigationMeshSystem>().FirstOrDefault());
            game.GameSystems.CollectionChanged += GameSystemsOnCollectionChanged;

            return(true);
        }
Ejemplo n.º 2
0
        protected override void OnRealized()
        {
            // Base implementation
            base.OnRealized();

            // Make the context current
            MakeCurrent();

            // Load OpenGL functions
            GL.LoadOpenGL();

            // Set the size of the viewport
            ResizeViewport();

            // Create the scene
            _editorScene = new SceneEditorScene();

            // Initialize events
            _editorScene.GameElementAdded   += _editorSceneGameElementAdded;
            _editorScene.GameElementRemoved += _editorSceneGameElementRemoved;

            // Create the game and add the scene
            _editorGame = new SceneEditorGame(_editorScene);

            // Enable depth testing
            RendererManager.DepthTest();

            // Enable blending
            RendererManager.Blending();

            // Enable face culling
            RendererManager.FaceCulling();

            // Enable Multi Samples
            RendererManager.MultiSample();

            // Enable depth mask
            RendererManager.DepthMask();

            // Start the editor game
            _editorGame.Start();

            // Initialize the renderer manager
            RendererManager.Initialize();

            // Focus on the editor
            GrabFocus();

            // Start updating the scene
            Gdk.Threads.AddIdle(120, OnUpdateFrameClock);

            // Refresh the game elements tree
            ((MainWindow)Toplevel).RefreshGameElementsTree();
        }