/// <inheritdoc/> protected override Task <bool> Initialize(EditorServiceGame editorGame) { game = editorGame; return(Task.FromResult(true)); }
/// <inheritdoc/> protected override Task <bool> Initialize(EditorServiceGame editorGame) { Game = editorGame; Game.Script.AddTask(Update); return(Task.FromResult(true)); }
protected override Task <bool> Initialize(EditorServiceGame editorGame) { game = (EntityHierarchyEditorGame)editorGame; editorScene = game.EditorScene; var transformMainGizmoRenderStage = new RenderStage("TransformGizmoOpaque", "Main"); var transformTransparentGizmoRenderStage = new RenderStage("TransformGizmoTransparent", "Main") { SortMode = new BackToFrontSortMode() }; game.EditorSceneSystem.GraphicsCompositor.RenderStages.Add(transformMainGizmoRenderStage); game.EditorSceneSystem.GraphicsCompositor.RenderStages.Add(transformTransparentGizmoRenderStage); var meshRenderFeature = game.EditorSceneSystem.GraphicsCompositor.RenderFeatures.OfType <MeshRenderFeature>().First(); // Reset all stages for TransformationGrizmoGroup meshRenderFeature.RenderStageSelectors.Add(new SimpleGroupToRenderStageSelector { RenderGroup = TransformationGizmo.TransformationGizmoGroupMask, }); meshRenderFeature.RenderStageSelectors.Add(new MeshTransparentRenderStageSelector { EffectName = EditorGraphicsCompositorHelper.EditorForwardShadingEffect, RenderGroup = TransformationGizmo.TransformationGizmoGroupMask, OpaqueRenderStage = transformMainGizmoRenderStage, TransparentRenderStage = transformTransparentGizmoRenderStage, }); meshRenderFeature.PipelineProcessors.Add(new MeshPipelineProcessor { TransparentRenderStage = transformTransparentGizmoRenderStage }); var editorCompositor = (EditorTopLevelCompositor)game.EditorSceneSystem.GraphicsCompositor.Game; editorCompositor.PostGizmoCompositors.Add(new ClearRenderer { ClearFlags = ClearRendererFlags.DepthOnly }); editorCompositor.PostGizmoCompositors.Add(new SingleStageRenderer { RenderStage = transformMainGizmoRenderStage, Name = "Transform Opaque Gizmos" }); editorCompositor.PostGizmoCompositors.Add(new SingleStageRenderer { RenderStage = transformTransparentGizmoRenderStage, Name = "Transform Transparent Gizmos" }); TranslationGizmo = new TranslationGizmo(); RotationGizmo = new RotationGizmo(); ScaleGizmo = new ScaleGizmo(); TranslationGizmo.TransformationEnded += OnGizmoTransformationFinished; ScaleGizmo.TransformationEnded += OnGizmoTransformationFinished; RotationGizmo.TransformationEnded += OnGizmoTransformationFinished; transformationGizmos.Add(TranslationGizmo); transformationGizmos.Add(RotationGizmo); transformationGizmos.Add(ScaleGizmo); Services.Get <IEditorGameEntitySelectionService>().SelectionUpdated += UpdateModifiedEntitiesList; // Initialize and add the Gizmo entities to the gizmo scene MicrothreadLocalDatabases.MountCommonDatabase(); // initialize the gizmo foreach (var gizmo in transformationGizmos) { gizmo.Initialize(game.Services, editorScene); } // Deactivate all transformation gizmo by default foreach (var gizmo in transformationGizmos) { gizmo.IsEnabled = false; } // set the default active transformation gizmo ActiveTransformationGizmo = TranslationGizmo; // Start update script (with priority 1 so that it happens after UpdateModifiedEntitiesList is called -- which usually happens from a EditorGameComtroller.PostAction() which has a default priority 0) game.Script.AddTask(Update, 1); return(Task.FromResult(true)); }
/// <summary> /// Initializes a new instance of the <see cref="EditorContentLoader"/> class /// </summary> /// <param name="gameDispatcher">The dispatcher to the game thread.</param> /// <param name="logger">The logger to use to log operations.</param> /// <param name="asset">The asset associated with this instance.</param> /// <param name="game">The editor game associated with this instance.</param> public EditorContentLoader(IDispatcherService gameDispatcher, ILogger logger, AssetViewModel asset, EditorServiceGame game) { if (asset == null) { throw new ArgumentNullException(nameof(asset)); } GameDispatcher = gameDispatcher ?? throw new ArgumentNullException(nameof(gameDispatcher)); Session = asset.Session; Session.AssetPropertiesChanged += AssetPropertiesChanged; Game = game ?? throw new ArgumentNullException(nameof(game)); Asset = asset; Manager = new LoaderReferenceManager(GameDispatcher, this); this.logger = logger; database = asset.ServiceProvider.Get <GameStudioDatabase>(); settingsProvider = asset.ServiceProvider.Get <GameSettingsProviderService>(); settingsProvider.GameSettingsChanged += GameSettingsChanged; currentRenderingMode = settingsProvider.CurrentGameSettings.GetOrCreate <EditorSettings>().RenderingMode; currentColorSpace = settingsProvider.CurrentGameSettings.GetOrCreate <RenderingSettings>().ColorSpace; currentNavigationGroupsHash = settingsProvider.CurrentGameSettings.GetOrDefault <NavigationSettings>().ComputeGroupsHash(); }
protected override Task <bool> Initialize(EditorServiceGame editorGame) { if (editorGame == null) { throw new ArgumentNullException(nameof(editorGame)); } game = (EntityHierarchyEditorGame)editorGame; var pickingRenderStage = game.EditorSceneSystem.GraphicsCompositor.RenderStages.First(x => x.Name == "Picking"); // TODO: Move selection/wireframe render stage in EditorGameComponentGizmoService (as last render step?) var selectionRenderStage = new RenderStage("SelectionGizmo", "Wireframe"); selectionRenderStage.Filter = new WireframeFilter(); var lightProbeGizmoRenderStage = new RenderStage("LightProbeGizmo", "Main"); var lightProbeWireframeRenderStage = new RenderStage("LightProbeWireframe", "Main"); game.EditorSceneSystem.GraphicsCompositor.RenderStages.Add(selectionRenderStage); game.EditorSceneSystem.GraphicsCompositor.RenderStages.Add(lightProbeGizmoRenderStage); game.EditorSceneSystem.GraphicsCompositor.RenderStages.Add(lightProbeWireframeRenderStage); // Meshes var meshRenderFeature = game.EditorSceneSystem.GraphicsCompositor.RenderFeatures.OfType <MeshRenderFeature>().First(); meshRenderFeature.RenderStageSelectors.Add(new SimpleGroupToRenderStageSelector { EffectName = EditorGraphicsCompositorHelper.EditorForwardShadingEffect, RenderGroup = LightProbeGizmo.LightProbeGroupMask, RenderStage = lightProbeGizmoRenderStage }); meshRenderFeature.RenderStageSelectors.Add(new SimpleGroupToRenderStageSelector { EffectName = EditorGraphicsCompositorHelper.EditorForwardShadingEffect + ".Picking", RenderGroup = LightProbeGizmo.LightProbeGroupMask, RenderStage = pickingRenderStage, }); meshRenderFeature.RenderStageSelectors.Add(new SimpleGroupToRenderStageSelector { EffectName = EditorGraphicsCompositorHelper.EditorForwardShadingEffect + ".Wireframe", RenderGroup = LightProbeGizmo.LightProbeGroupMask, RenderStage = selectionRenderStage, }); meshRenderFeature.RenderFeatures.Add(new WireframeRenderFeature()); meshRenderFeature.RenderStageSelectors.Add(new SimpleGroupToRenderStageSelector { EffectName = EditorGraphicsCompositorHelper.EditorForwardShadingEffect, RenderGroup = LightProbeWireGroupMask, RenderStage = lightProbeWireframeRenderStage, }); meshRenderFeature.PipelineProcessors.Add(new AntiAliasLinePipelineProcessor { RenderStage = lightProbeWireframeRenderStage }); var editorCompositor = (EditorTopLevelCompositor)game.EditorSceneSystem.GraphicsCompositor.Game; editorCompositor.PostGizmoCompositors.Add(new SingleStageRenderer { RenderStage = lightProbeWireframeRenderStage, Name = "LightProbe Wireframe Gizmos" }); editorCompositor.PostGizmoCompositors.Add(new ClearRenderer { ClearFlags = ClearRendererFlags.DepthOnly }); editorCompositor.PostGizmoCompositors.Add(new SingleStageRenderer { RenderStage = lightProbeGizmoRenderStage, Name = "LightProbe Gizmos" }); editorCompositor.PostGizmoCompositors.Add(new SingleStageRenderer { RenderStage = selectionRenderStage, Name = "LightProbe Selection Gizmo" }); // Add debug entity debugEntity = new Entity("Navigation debug entity"); game.EditorScene.Entities.Add(debugEntity); var color = Color.Yellow; color.A = 0x9F; wireframeMaterial = CreateDebugMaterial(color); game.Script.AddTask(Update); return(Task.FromResult(true)); }
protected override Task <bool> Initialize(EditorServiceGame editorGame) { Game = editorGame; Game.ExceptionThrown += GameOnExceptionThrown; return(Task.FromResult(true)); }
/// <summary> /// Highlights the given asset in the scene viewport. /// </summary> /// <param name="controller"></param> /// <param name="game"></param> /// <param name="assetItem"></param> /// <param name="duration"></param> /// <remarks>This method is executed from the scene game thread.</remarks> public abstract void Highlight(IEditorGameController controller, EditorServiceGame game, AssetItem assetItem, float duration);
protected override async Task <bool> Initialize(EditorServiceGame editorGame) { if (editorGame is null) { throw new ArgumentNullException(nameof(editorGame)); } if (editorGame is not SceneEditorGame sceneEditorGame) { throw new ArgumentException($"{nameof(game)} is not of type {nameof(EntityHierarchyEditorGame)}."); } game = sceneEditorGame; if (editor.Controller is not SceneEditorController controller) { throw new ArgumentNullException(nameof(sceneEditorController)); } sceneEditorController = controller; 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); }