Example #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);
        }
Example #2
0
        public GameStudioPreviewService(SessionViewModel session)
        {
            if (session == null)
            {
                throw new ArgumentNullException(nameof(session));
            }
            this.session         = session;
            Dispatcher           = session.Dispatcher;
            AssetBuilderService  = session.ServiceProvider.Get <GameStudioBuilderService>();
            gameSettingsProvider = session.ServiceProvider.Get <GameSettingsProviderService>();

            Logger          = GlobalLogger.GetLogger("Preview");
            loggerDebugPage = EditorDebugTools.CreateLogDebugPage(Logger, "Preview");

            previewGameSettings = GameSettingsFactory.Create();
            previewGameSettings.GetOrCreate <RenderingSettings>().DefaultGraphicsProfile = GraphicsProfile.Level_11_0;
            UpdateGameSettings(gameSettingsProvider.CurrentGameSettings);
            previewCompileContext.SetGameSettingsAsset(previewGameSettings);
            previewCompileContext.CompilationContext = typeof(PreviewCompilationContext);

            previewGameThread = new Thread(SafeAction.Wrap(StrideUIThread))
            {
                IsBackground = true, Name = "PreviewGame Thread"
            };
            previewGameThread.SetApartmentState(ApartmentState.STA);
            previewGameThread.Start();

            // Wait for the window handle to be generated on the proper thread
            initializationSignal.WaitOne();
            host = new GameEngineHost(windowHandle);

            session.AssetPropertiesChanged           += OnAssetPropertyChanged;
            gameSettingsProvider.GameSettingsChanged += OnGameSettingsChanged;
        }
        public EditorGameGraphicsCompositorService([NotNull] IEditorGameController controller, [NotNull] GameEditorViewModel editor)
        {
            if (controller == null)
            {
                throw new ArgumentNullException(nameof(controller));
            }
            if (editor == null)
            {
                throw new ArgumentNullException(nameof(editor));
            }

            this.controller  = controller;
            this.editor      = editor;
            settingsProvider = editor.ServiceProvider.Get <GameSettingsProviderService>();
        }
        public GameStudioThumbnailService(SessionViewModel session, GameSettingsProviderService settingsProvider, GameStudioBuilderService assetBuilderService)
        {
            this.session             = session;
            this.assetBuilderService = assetBuilderService;

            generator        = new ThumbnailGenerator((EffectCompilerBase)assetBuilderService.EffectCompiler);
            compilerRegistry = new AssetCompilerRegistry {
                DefaultCompiler = new CustomAssetThumbnailCompiler()
            };
            thumbnailCompiler = new ThumbnailListCompiler(generator, ThumbnailBuilt, compilerRegistry);

            gameSettingsProviderService = settingsProvider;
            gameSettingsProviderService.GameSettingsChanged += GameSettingsChanged;
            UpdateGameSettings(settingsProvider.CurrentGameSettings);
            StartPushNotificationsTask();
        }
Example #5
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.GetOrCreate <NavigationSettings>().ComputeGroupsHash();
        }
Example #6
0
        public override void InitializeSession(SessionViewModel session)
        {
            var fallbackDirectory = UPath.Combine(EditorSettings.FallbackBuildCacheDirectory, new UDirectory(XenkoGameStudio.EditorName));
            var buildDirectory    = fallbackDirectory;

            try
            {
                var package = session.CurrentProject ?? session.LocalPackages.First();
                if (package != null)
                {
                    // In package, we override editor build directory to be per-project and be shared with game build directory
                    buildDirectory = $"{package.PackagePath.GetFullDirectory().ToWindowsPath()}\\obj\\xenko\\assetbuild\\data";
                }

                // Attempt to create the directory to ensure it is valid.
                if (!Directory.Exists(buildDirectory))
                {
                    Directory.CreateDirectory(buildDirectory);
                }
            }
            catch (Exception)
            {
                buildDirectory = fallbackDirectory;
            }

            var pluginService    = session.ServiceProvider.Get <IAssetsPluginService>();
            var previewFactories = new Dictionary <Type, AssetPreviewFactory>();

            foreach (var xenkoPlugin in pluginService.Plugins.OfType <XenkoAssetsPlugin>())
            {
                var pluginTypes = xenkoPlugin.GetType().Assembly.GetTypes();
                foreach (var type in pluginTypes)
                {
                    var localType = type;
                    if (typeof(IAssetPreview).IsAssignableFrom(type))
                    {
                        var previewAttribute = type.GetCustomAttribute <AssetPreviewAttribute>();
                        if (previewAttribute != null)
                        {
                            previewFactories.Add(previewAttribute.AssetType, (builder, game, asset) => (IAssetPreview)Activator.CreateInstance(localType));
                        }
                    }
                }
            }

            var settingsProvider = new GameSettingsProviderService(session);

            session.ServiceProvider.RegisterService(settingsProvider);

            var builderService = new GameStudioBuilderService(session, settingsProvider, buildDirectory);

            session.ServiceProvider.RegisterService(builderService);
            session.ServiceProvider.RegisterService(builderService.Database); // TODO: this should be removed, the AssetBuilderService is reachable from anywhere now

            var previewService = new GameStudioPreviewService(session);

            previewService.RegisterAssetPreviewFactories(previewFactories);
            session.ServiceProvider.RegisterService(previewService);

            var thumbnailService = new GameStudioThumbnailService(session, settingsProvider, builderService);

            session.ServiceProvider.RegisterService(thumbnailService);

            var xenkoDebugService = new XenkoDebugService(session.ServiceProvider);

            session.ServiceProvider.RegisterService(xenkoDebugService);

            GameStudioViewModel.GameStudio.Preview   = new PreviewViewModel(session);
            GameStudioViewModel.GameStudio.Debugging = new DebuggingViewModel(GameStudioViewModel.GameStudio, xenkoDebugService);
        }