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