コード例 #1
0
 /// <inheritdoc/>
 protected override Task <bool> Initialize(EditorServiceGame editorGame)
 {
     game = editorGame;
     return(Task.FromResult(true));
 }
コード例 #2
0
 /// <inheritdoc/>
 protected override Task <bool> Initialize(EditorServiceGame editorGame)
 {
     Game = editorGame;
     Game.Script.AddTask(Update);
     return(Task.FromResult(true));
 }
コード例 #3
0
        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));
        }
コード例 #4
0
        /// <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();
        }
コード例 #5
0
        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));
        }
コード例 #6
0
 protected override Task <bool> Initialize(EditorServiceGame editorGame)
 {
     Game = editorGame;
     Game.ExceptionThrown += GameOnExceptionThrown;
     return(Task.FromResult(true));
 }
コード例 #7
0
ファイル: AssetHighlighter.cs プロジェクト: Ethereal77/stride
 /// <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);
コード例 #8
0
        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);
        }