Exemplo n.º 1
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;
        }
Exemplo n.º 2
0
        public SceneRenderer(GameSettingsAsset gameSettings)
        {
            if (gameSettings == null) throw new ArgumentNullException(nameof(gameSettings));

            // Initialize services
            Services = new ServiceRegistry();
            ContentManager = new ContentManager(Services);

            var renderingSettings = gameSettings.Get<RenderingSettings>();
            GraphicsDevice = GraphicsDevice.New(DeviceCreationFlags.None, new[] { renderingSettings.DefaultGraphicsProfile });

            var graphicsDeviceService = new GraphicsDeviceServiceLocal(Services, GraphicsDevice);
            EffectSystem = new EffectSystem(Services);
            GraphicsContext = new GraphicsContext(GraphicsDevice);
            Services.AddService(typeof(GraphicsContext), GraphicsContext);

            SceneSystem = new SceneSystem(Services);

            // Create game systems
            GameSystems = new GameSystemCollection(Services);
            GameSystems.Add(new GameFontSystem(Services));
            GameSystems.Add(new UISystem(Services));
            GameSystems.Add(EffectSystem);
            GameSystems.Add(SceneSystem);
            GameSystems.Initialize();

            // Fake presenter
            // TODO GRAPHICS REFACTOR: This is needed be for render stage setup
            GraphicsDevice.Presenter = new RenderTargetGraphicsPresenter(GraphicsDevice,
                Texture.New2D(GraphicsDevice, renderingSettings.DefaultBackBufferWidth, renderingSettings.DefaultBackBufferHeight,
                    renderingSettings.ColorSpace == ColorSpace.Linear ? PixelFormat.R8G8B8A8_UNorm_SRgb : PixelFormat.R8G8B8A8_UNorm, TextureFlags.ShaderResource | TextureFlags.RenderTarget),
                PixelFormat.D24_UNorm_S8_UInt);

            SceneSystem.MainRenderFrame = RenderFrame.FromTexture(GraphicsDevice.Presenter.BackBuffer, GraphicsDevice.Presenter.DepthStencilBuffer);
        }
Exemplo n.º 3
0
 private void UpdateGameSettings(GameSettingsAsset currentGameSettings)
 {
     databaseGameSettings.GetOrCreate <EditorSettings>().RenderingMode             = currentGameSettings.GetOrCreate <EditorSettings>().RenderingMode;
     databaseGameSettings.GetOrCreate <RenderingSettings>().ColorSpace             = currentGameSettings.GetOrCreate <RenderingSettings>().ColorSpace;
     databaseGameSettings.GetOrCreate <Navigation.NavigationSettings>().Groups     = currentGameSettings.GetOrCreate <Navigation.NavigationSettings>().Groups;
     databaseGameSettings.GetOrCreate <RenderingSettings>().DefaultGraphicsProfile = currentGameSettings.GetOrCreate <RenderingSettings>().DefaultGraphicsProfile;
 }
        private void UpdateGameSettings(GameSettingsAsset gameSettings)
        {
            currentGameSettings = AssetCloner.Clone(gameSettings, AssetClonerFlags.RemoveUnloadableObjects);

            bool shouldRefreshAllThumbnails = false;

            if (renderingMode != gameSettings.GetOrCreate <EditorSettings>().RenderingMode)
            {
                renderingMode = gameSettings.GetOrCreate <EditorSettings>().RenderingMode;
                shouldRefreshAllThumbnails = true;
            }
            if (colorSpace != gameSettings.GetOrCreate <RenderingSettings>().ColorSpace)
            {
                colorSpace = gameSettings.GetOrCreate <RenderingSettings>().ColorSpace;
                shouldRefreshAllThumbnails = true;
            }
            if (graphicsProfile != gameSettings.GetOrCreate <RenderingSettings>().DefaultGraphicsProfile)
            {
                graphicsProfile            = gameSettings.GetOrCreate <RenderingSettings>().DefaultGraphicsProfile;
                shouldRefreshAllThumbnails = true;
            }
            if (shouldRefreshAllThumbnails)
            {
                var allAssets = session.AllAssets.Select(x => x.AssetItem).ToList();
                Task.Run(() => AddThumbnailAssetItems(allAssets, QueuePosition.First));
            }
        }
Exemplo n.º 5
0
 protected override void ComputeParameterHash(BinarySerializationWriter writer)
 {
     base.ComputeParameterHash(writer);
     if (IsDefaultScene())
     {
         var gameSettings = GameSettingsAsset.CreateFromPackage(package, context.Platform);
         writer.Write(gameSettings);
     }
 }
Exemplo n.º 6
0
            public NavmeshBuildCommand(string url, AssetItem assetItem, NavigationMeshAsset value, AssetCompilerContext context)
                : base(url, value, assetItem.Package)
            {
                gameSettingsAsset = context.GetGameSettingsAsset();
                asset             = value;
                assetUrl          = url;

                Version = 1; // Removed separate debug model stored in the navigation mesh
            }
Exemplo n.º 7
0
            private bool IsDefaultScene()
            {
                var defaultScene = GameSettingsAsset.GetDefaultScene(package);

                if (defaultScene == null)
                {
                    return(false);
                }
                return(defaultScene.Location == Url);
            }
Exemplo n.º 8
0
        public ThumbnailAssetBuildUnit(AssetItem asset, GameSettingsAsset gameSettings, GameStudioThumbnailService thumbnailService, int priorityOrder)
            : base(new AssetBuildUnitIdentifier(ThumbnailBuildUnitContextId, asset.Id))
        {
            this.asset            = asset;
            this.thumbnailService = thumbnailService;
            this.gameSettings     = gameSettings;

            PriorityMajor = DefaultAssetBuilderPriorities.ThumbnailPriority;
            PriorityMinor = priorityOrder;
        }
Exemplo n.º 9
0
            protected override Task <ResultStatus> DoCommandOverride(ICommandContext commandContext)
            {
                var assetManager = new AssetManager();

                var rootEntity = asset.Hierarchy.Entities[asset.Hierarchy.RootEntity];

                assetManager.Save(Url, rootEntity);

                // Save the default settings
                if (IsDefaultScene())
                {
                    assetManager.Save(GameSettings.AssetUrl, GameSettingsAsset.CreateFromPackage(package, context.Platform));
                }

                return(Task.FromResult(ResultStatus.Successful));
            }
Exemplo n.º 10
0
        public ListBuildStep Compile(AssetItem asset, GameSettingsAsset gameSettings)
        {
            // Mark thumbnail as being compiled
            lock (hashLock)
            {
                thumbnailQueueHash.Remove(asset);
                if (thumbnailsInProgressAndContinuation.ContainsKey(asset.Id) && System.Diagnostics.Debugger.IsAttached)
                {
                    // Virgile: This case should not happen, but it happened to me once and could not reproduce.
                    // Please let me know if it happens to you.
                    // Note: this is likely not critical and should work fine even if it happens.
                    System.Diagnostics.Debugger.Break();
                }
                thumbnailsInProgressAndContinuation[asset.Id] = null;
            }

            return(thumbnailCompiler.Compile(asset, gameSettings, HasStaticThumbnail(asset.Asset.GetType())));
        }
Exemplo n.º 11
0
        public GameStudioDatabase(GameStudioBuilderService assetBuilderService, GameSettingsProviderService settingsProvider)
        {
            this.assetBuilderService = assetBuilderService;
            this.settingsProvider    = settingsProvider;

            CompilerContext.Platform = PlatformType.Windows;

            databaseGameSettings = GameSettingsFactory.Create();
            //// TODO: get the best available between 10 and 11
            //databaseGameSettings.GetOrCreate<RenderingSettings>().DefaultGraphicsProfile = GraphicsProfile.Level_11_0;
            CompilerContext.SetGameSettingsAsset(databaseGameSettings);
            CompilerContext.CompilationContext = typeof(EditorGameCompilationContext);

            UpdateGameSettings(settingsProvider.CurrentGameSettings);
            settingsProvider.GameSettingsChanged += OnGameSettingsChanged;

            ((AssetDependencyManager)assetBuilderService.SessionViewModel.DependencyManager).AssetChanged += OnAssetChanged;
        }
Exemplo n.º 12
0
        /// <summary>
        /// Generates a <see cref="ListBuildStep"/> to compile the thumbnail of the given asset.
        /// </summary>
        /// <param name="assetItem">The asset to compile.</param>
        /// <param name="gameSettings">The current game settings</param>
        /// <param name="staticThumbnail">If the asset has to be compiled as well in the case of non static thumbnail</param>
        /// <returns>A <see cref="ListBuildStep"/> containing the build steps to generate the thumbnail of the given asset.</returns>
        public ListBuildStep Compile(AssetItem assetItem, GameSettingsAsset gameSettings, bool staticThumbnail)
        {
            if (assetItem == null)
            {
                throw new ArgumentNullException(nameof(assetItem));
            }

            using (var context = new ThumbnailCompilerContext
            {
                Platform = PlatformType.Windows
            })
            {
                context.SetGameSettingsAsset(gameSettings);
                context.CompilationContext = typeof(PreviewCompilationContext);

                context.Properties.Set(ThumbnailGenerator.Key, generator);
                context.ThumbnailBuilt += builtAction;

                var result = new AssetCompilerResult();

                if (!staticThumbnail)
                {
                    //compile the actual asset
                    result = dependenciesCompiler.Prepare(context, assetItem);
                }

                //compile the actual thumbnail
                var thumbnailStep = CompileItem(context, result, assetItem);

                foreach (var buildStep in result.BuildSteps)
                {
                    BuildStep.LinkBuildSteps(buildStep, thumbnailStep);
                }
                result.BuildSteps.Add(thumbnailStep);
                return(result.BuildSteps);
            }
        }
 public static void SetGameSettingsAsset(this AssetCompilerContext context, GameSettingsAsset gameSettingsAsset)
 {
     context.Properties.Set(GameSettingsAssetKey, gameSettingsAsset);
 }
Exemplo n.º 14
0
 /// <summary>
 /// Initializes a new instance of the <see cref="GameSettingsChangedEventArgs"/> class.
 /// </summary>
 /// <param name="gameSettings">A copy of the current game settings asset.</param>
 public GameSettingsChangedEventArgs(GameSettingsAsset gameSettings)
 {
     GameSettings = gameSettings;
 }
Exemplo n.º 15
0
        /// <summary>
        /// Checks if a default scene exists for this game package.
        /// </summary>
        /// <param name="log">The log to output the result of the validation.</param>
        public override void Run(ILogger log)
        {
            if (log == null)
            {
                throw new ArgumentNullException("log");
            }

            foreach (var package in Session.Packages)
            {
                // Make sure package has its assets loaded
                if (package.State < PackageState.AssetsReady)
                {
                    continue;
                }

                var hasGameExecutable = package.Profiles.SelectMany(profile => profile.ProjectReferences).Any(projectRef => projectRef.Type == ProjectType.Executable);
                if (!hasGameExecutable)
                {
                    continue;
                }

                // Find game settings
                var       gameSettingsAssetItem = package.Assets.Find(GameSettingsAsset.GameSettingsLocation);
                AssetItem defaultScene          = null;

                // If game settings is found, try to find default scene inside
                if (gameSettingsAssetItem != null)
                {
                    var defaultSceneRuntime = ((GameSettingsAsset)gameSettingsAssetItem.Asset).DefaultScene;
                    if (defaultSceneRuntime != null)
                    {
                        var defaultSceneReference = AttachedReferenceManager.GetAttachedReference(defaultSceneRuntime);
                        if (defaultSceneReference != null)
                        {
                            // Find it either by Url or Id
                            defaultScene = package.Assets.Find(defaultSceneReference.Id) ?? package.Assets.Find(defaultSceneReference.Url);

                            // Check it is actually a scene asset
                            if (defaultScene != null && !(defaultScene.Asset is SceneAsset))
                            {
                                defaultScene = null;
                            }
                        }
                    }
                }

                // Find or create default scene
                if (defaultScene == null)
                {
                    defaultScene = package.Assets.Find(GameSettingsAsset.DefaultSceneLocation);
                    if (defaultScene != null && !(defaultScene.Asset is SceneAsset))
                    {
                        defaultScene = null;
                    }
                }

                // Otherwise, try to find any scene
                if (defaultScene == null)
                {
                    defaultScene = package.Assets.FirstOrDefault(x => x.Asset is SceneAsset);
                }

                // Nothing found, let's create an empty one
                if (defaultScene == null)
                {
                    log.Error(package, null, AssetMessageCode.DefaultSceneNotFound, null);

                    var defaultSceneName  = NamingHelper.ComputeNewName(GameSettingsAsset.DefaultSceneLocation, package.Assets, a => a.Location);
                    var defaultSceneAsset = SceneAsset.Create();

                    defaultScene = new AssetItem(defaultSceneName, defaultSceneAsset);
                    package.Assets.Add(defaultScene);
                    defaultScene.IsDirty = true;
                }

                // Create game settings if not done yet
                if (gameSettingsAssetItem == null)
                {
                    log.Error(package, null, AssetMessageCode.AssetNotFound, GameSettingsAsset.GameSettingsLocation);

                    var gameSettingsAsset = new GameSettingsAsset();

                    gameSettingsAsset.DefaultScene = AttachedReferenceManager.CreateSerializableVersion <Scene>(defaultScene.Id, defaultScene.Location);

                    gameSettingsAssetItem = new AssetItem(GameSettingsAsset.GameSettingsLocation, gameSettingsAsset);
                    package.Assets.Add(gameSettingsAssetItem);

                    gameSettingsAssetItem.IsDirty = true;
                }
            }
        }
Exemplo n.º 16
0
 private void UpdateCurrentGameSettings()
 {
     currentPackage      = session.CurrentProject?.Package;
     CurrentGameSettings = currentPackage?.GetGameSettingsAssetOrDefault() ?? GameSettingsFactory.Create();
     RaiseGameSettings(CurrentGameSettings);
 }
Exemplo n.º 17
0
 private void RaiseGameSettings(GameSettingsAsset gameSettingsAsset)
 {
     GameSettingsChanged?.Invoke(this, new GameSettingsChangedEventArgs(AssetCloner.Clone(gameSettingsAsset)));
 }
Exemplo n.º 18
0
        private BuildResultCode BuildMaster()
        {
            // Only querying graphics platform, let's load package, print it and exit
            if (builderOptions.GetGraphicsPlatform)
            {
                return(BuildGetGraphicsPlatform());
            }

            assetLogger = new RemoteLogForwarder(builderOptions.Logger, builderOptions.LogPipeNames);
            GlobalLogger.GlobalMessageLogged += assetLogger;
            PackageSession projectSession = null;

            try
            {
                // TODO handle solution file + package-id ?

                // When the current platform is not on windows, we need to make sure that all plugins are build, so we
                // setup auto-compile when loading the session
                var sessionLoadParameters = new PackageLoadParameters
                {
                    AutoCompileProjects    = builderOptions.Platform != PlatformType.Windows || !builderOptions.DisableAutoCompileProjects,
                    ExtraCompileProperties = builderOptions.ExtraCompileProperties,
                };

                // Loads the root Package
                var projectSessionResult = PackageSession.Load(builderOptions.PackageFile, sessionLoadParameters);
                if (projectSessionResult.HasErrors)
                {
                    projectSessionResult.CopyTo(builderOptions.Logger);
                    return(BuildResultCode.BuildError);
                }

                projectSession = projectSessionResult.Session;

                // Check build configuration
                var package = projectSession.LocalPackages.Last();

                // Check build profile
                var sharedProfile = package.Profiles.FindSharedProfile();
                var buildProfile  = package.Profiles.FirstOrDefault(pair => pair.Name == builderOptions.BuildProfile);
                if (buildProfile == null)
                {
                    builderOptions.Logger.Error("Unable to find profile [{0}] in package [{1}]", builderOptions.BuildProfile, package.FullPath);
                    return(BuildResultCode.BuildError);
                }

                // Setup variables
                var buildDirectory  = builderOptions.BuildDirectory;
                var outputDirectory = builderOptions.OutputDirectory;

                // Process game settings asset
                var gameSettingsAsset = package.GetGameSettingsAsset();
                if (gameSettingsAsset == null)
                {
                    builderOptions.Logger.Warning("Could not find game settings asset at location [{0}]. Use a Default One", GameSettingsAsset.GameSettingsLocation);
                    gameSettingsAsset = new GameSettingsAsset();
                }

                // Create context
                var context = new AssetCompilerContext
                {
                    Profile  = builderOptions.BuildProfile,
                    Platform = builderOptions.Platform
                };
                context.SetGameSettingsAsset(gameSettingsAsset);

                // Copy properties from shared profiles to context properties
                if (sharedProfile != null)
                {
                    sharedProfile.Properties.CopyTo(context.PackageProperties, true);
                }

                // Copy properties from build profile
                buildProfile.Properties.CopyTo(context.PackageProperties, true);

                // Builds the project
                var assetBuilder = new PackageCompiler(new RootPackageAssetEnumerator(package));
                assetBuilder.AssetCompiled += RegisterBuildStepProcessedHandler;

                var assetBuildResult = assetBuilder.Compile(context);
                assetBuildResult.CopyTo(builderOptions.Logger);
                if (assetBuildResult.HasErrors)
                {
                    return(BuildResultCode.BuildError);
                }

                // Create the builder
                var indexName = "index." + builderOptions.BuildProfile;
                builder = new Builder(builderOptions.Logger, buildDirectory, builderOptions.BuildProfile, indexName)
                {
                    ThreadCount = builderOptions.ThreadCount
                };
                builder.MonitorPipeNames.AddRange(builderOptions.MonitorPipeNames);

                // Add build steps generated by AssetBuilder
                builder.Root.Add(assetBuildResult.BuildSteps);

                // Run builder
                var result = builder.Run(Builder.Mode.Build);
                builder.WriteIndexFile(false);

                // Fill list of bundles
                var bundlePacker = new BundlePacker();
                bundlePacker.Build(builderOptions.Logger, projectSession, buildProfile, indexName, outputDirectory, builder.DisableCompressionIds);

                return(result);
            }
            finally
            {
                if (builder != null)
                {
                    builder.Dispose();
                }

                // Dispose the session (in order to unload assemblies)
                if (projectSession != null)
                {
                    projectSession.Dispose();
                }

                // Flush and close logger
                GlobalLogger.GlobalMessageLogged -= assetLogger;
                assetLogger.Dispose();
            }
        }
Exemplo n.º 19
0
 private void UpdateGameSettings(GameSettingsAsset currentGameSettings)
 {
     previewGameSettings.GetOrCreate <EditorSettings>().RenderingMode = currentGameSettings.GetOrCreate <EditorSettings>().RenderingMode;
     previewGameSettings.GetOrCreate <RenderingSettings>().ColorSpace = currentGameSettings.GetOrCreate <RenderingSettings>().ColorSpace;
 }
        /// <summary>
        /// Checks if a default scene exists for this game package.
        /// </summary>
        /// <param name="log">The log to output the result of the validation.</param>
        public override void Run(ILogger log)
        {
            if (log == null) throw new ArgumentNullException("log");

            foreach (var package in Session.Packages)
            {
                // Make sure package has its assets loaded
                if (package.State < PackageState.AssetsReady)
                    continue;

                var hasGameExecutable = package.Profiles.SelectMany(profile => profile.ProjectReferences).Any(projectRef => projectRef.Type == ProjectType.Executable);
                if (!hasGameExecutable)
                {
                    continue;
                }

                // Find game settings
                var gameSettingsAssetItem = package.Assets.Find(GameSettingsAsset.GameSettingsLocation);
                AssetItem defaultScene = null;

                // If game settings is found, try to find default scene inside
                if (gameSettingsAssetItem != null)
                {
                    var defaultSceneRuntime = ((GameSettingsAsset)gameSettingsAssetItem.Asset).DefaultScene;
                    if (defaultSceneRuntime != null)
                    {
                        var defaultSceneReference = AttachedReferenceManager.GetAttachedReference(defaultSceneRuntime);
                        if (defaultSceneReference != null)
                        {
                            // Find it either by Url or Id
                            defaultScene = package.Assets.Find(defaultSceneReference.Id) ?? package.Assets.Find(defaultSceneReference.Url);

                            // Check it is actually a scene asset
                            if (defaultScene != null && !(defaultScene.Asset is SceneAsset))
                                defaultScene = null;
                        }
                    }
                }

                // Find or create default scene
                if (defaultScene == null)
                {
                    defaultScene = package.Assets.Find(GameSettingsAsset.DefaultSceneLocation);
                    if (defaultScene != null && !(defaultScene.Asset is SceneAsset))
                        defaultScene = null;
                }

                // Otherwise, try to find any scene
                if (defaultScene == null)
                    defaultScene = package.Assets.FirstOrDefault(x => x.Asset is SceneAsset);

                // Nothing found, let's create an empty one
                if (defaultScene == null)
                {
                    log.Error(package, null, AssetMessageCode.DefaultSceneNotFound, null);

                    var defaultSceneName = NamingHelper.ComputeNewName(GameSettingsAsset.DefaultSceneLocation, package.Assets, a => a.Location);
                    var defaultSceneAsset = SceneAsset.Create();

                    defaultScene = new AssetItem(defaultSceneName, defaultSceneAsset);
                    package.Assets.Add(defaultScene);
                    defaultScene.IsDirty = true;
                }

                // Create game settings if not done yet
                if (gameSettingsAssetItem == null)
                {
                    log.Error(package, null, AssetMessageCode.AssetNotFound, GameSettingsAsset.GameSettingsLocation);

                    var gameSettingsAsset = new GameSettingsAsset();

                    gameSettingsAsset.DefaultScene = AttachedReferenceManager.CreateSerializableVersion<Scene>(defaultScene.Id, defaultScene.Location);

                    gameSettingsAssetItem = new AssetItem(GameSettingsAsset.GameSettingsLocation, gameSettingsAsset);
                    package.Assets.Add(gameSettingsAssetItem);

                    gameSettingsAssetItem.IsDirty = true;
                }
            }
        }
Exemplo n.º 21
0
        private BuildResultCode BuildMaster()
        {
            // Only querying graphics platform, let's load package, print it and exit
            if (builderOptions.GetGraphicsPlatform)
            {
                return BuildGetGraphicsPlatform();
            }

            assetLogger = new RemoteLogForwarder(builderOptions.Logger, builderOptions.LogPipeNames);
            GlobalLogger.GlobalMessageLogged += assetLogger;
            PackageSession projectSession = null;
            try
            {
                // TODO handle solution file + package-id ?

                // When the current platform is not on windows, we need to make sure that all plugins are build, so we
                // setup auto-compile when loading the session
                var sessionLoadParameters = new PackageLoadParameters
                {
                    AutoCompileProjects = builderOptions.Platform != PlatformType.Windows || !builderOptions.DisableAutoCompileProjects,
                    ExtraCompileProperties = builderOptions.ExtraCompileProperties,
                };

                // Loads the root Package
                var projectSessionResult = PackageSession.Load(builderOptions.PackageFile, sessionLoadParameters);
                if (projectSessionResult.HasErrors)
                {
                    projectSessionResult.CopyTo(builderOptions.Logger);
                    return BuildResultCode.BuildError;
                }

                projectSession = projectSessionResult.Session;

                // Check build configuration
                var package = projectSession.LocalPackages.Last();

                // Check build profile
                var sharedProfile = package.Profiles.FindSharedProfile();
                var buildProfile = package.Profiles.FirstOrDefault(pair => pair.Name == builderOptions.BuildProfile);
                if (buildProfile == null)
                {
                    builderOptions.Logger.Error("Unable to find profile [{0}] in package [{1}]", builderOptions.BuildProfile, package.FullPath);
                    return BuildResultCode.BuildError;
                }

                // Setup variables
                var buildDirectory = builderOptions.BuildDirectory;
                var outputDirectory = builderOptions.OutputDirectory;

                // Process game settings asset
                var gameSettingsAsset = package.GetGameSettingsAsset();
                if (gameSettingsAsset == null)
                {
                    builderOptions.Logger.Warning("Could not find game settings asset at location [{0}]. Use a Default One", GameSettingsAsset.GameSettingsLocation);
                    gameSettingsAsset = new GameSettingsAsset();
                }

                // Create context
                var context = new AssetCompilerContext
                {
                    Profile = builderOptions.BuildProfile,
                    Platform = builderOptions.Platform
                };
                context.SetGameSettingsAsset(gameSettingsAsset);

                // Copy properties from shared profiles to context properties
                if (sharedProfile != null)
                {
                    sharedProfile.Properties.CopyTo(context.PackageProperties, true);
                }

                // Copy properties from build profile
                buildProfile.Properties.CopyTo(context.PackageProperties, true);

                // Builds the project
                var assetBuilder = new PackageCompiler(new RootPackageAssetEnumerator(package));
                assetBuilder.AssetCompiled += RegisterBuildStepProcessedHandler;

                var assetBuildResult = assetBuilder.Compile(context);
                assetBuildResult.CopyTo(builderOptions.Logger);
                if (assetBuildResult.HasErrors)
                    return BuildResultCode.BuildError;

                // Create the builder
                var indexName = "index." + builderOptions.BuildProfile;
                builder = new Builder(builderOptions.Logger, buildDirectory, builderOptions.BuildProfile, indexName) { ThreadCount = builderOptions.ThreadCount };
                builder.MonitorPipeNames.AddRange(builderOptions.MonitorPipeNames);

                // Add build steps generated by AssetBuilder
                builder.Root.Add(assetBuildResult.BuildSteps);

                // Run builder
                var result = builder.Run(Builder.Mode.Build);
                builder.WriteIndexFile(false);

                // Fill list of bundles
                var bundlePacker = new BundlePacker();
                bundlePacker.Build(builderOptions.Logger, projectSession, buildProfile, indexName, outputDirectory, builder.DisableCompressionIds);

                return result;
            }
            finally
            {
                if (builder != null)
                {
                    builder.Dispose();
                }

                // Dispose the session (in order to unload assemblies)
                if (projectSession != null)
                {
                    projectSession.Dispose();
                }

                // Flush and close logger
                GlobalLogger.GlobalMessageLogged -= assetLogger;
                assetLogger.Dispose();
            }
        }
Exemplo n.º 22
0
        /// <summary>
        /// Checks if a default scene exists for this game package.
        /// </summary>
        /// <param name="log">The log to output the result of the validation.</param>
        public override void Run(ILogger log)
        {
            if (log == null)
            {
                throw new ArgumentNullException("log");
            }

            foreach (var package in Session.Packages)
            {
                var hasGameExecutable = package.Profiles.SelectMany(profile => profile.ProjectReferences).Any(projectRef => projectRef.Type == ProjectType.Executable);
                if (!hasGameExecutable)
                {
                    continue;
                }

                var sharedProfile = package.Profiles.FindSharedProfile();
                if (sharedProfile == null)
                {
                    continue;
                }

                var defaultScene = sharedProfile.Properties.Get(GameSettingsAsset.DefaultScene);

                // If the pdxpkg does not reference any scene
                if (defaultScene == null)
                {
                    log.Error(package, null, AssetMessageCode.DefaultSceneNotFound, null);

                    // Creates a new default scene
                    // Checks we don't overwrite an existing asset
                    const string defaultSceneLocation = "MainScene";
                    var          existingDefault      = package.Assets.Find(defaultSceneLocation);
                    if (existingDefault != null && existingDefault.Asset is SceneAsset)
                    {
                        // A scene at the default location already exists among the assets, let's reference it as the default scene
                        var sceneAsset = new AssetReference <SceneAsset>(existingDefault.Id, existingDefault.Location);
                        GameSettingsAsset.SetDefaultScene(package, sceneAsset);
                    }
                    else if (existingDefault != null)
                    {
                        // Very rare case: the default scene location is occupied by another asset which is not a scene
                        // Compute a new default name to not overwrite the existing asset
                        var newName = NamingHelper.ComputeNewName(defaultSceneLocation, package.Assets, a => a.Location);
                        GameSettingsAsset.CreateAndSetDefaultScene(package, newName);
                    }
                    else
                    {
                        // Creates a new default scene asset
                        GameSettingsAsset.CreateAndSetDefaultScene(package, defaultSceneLocation);
                    }

                    continue;
                }

                // The pdxpkg references an asset
                var defaultAsset = package.Assets.Find(defaultScene.Location);

                if (defaultAsset != null)
                {
                    continue;                       // Default scene exists and is referenced
                }
                // The asset referenced does not exist, create it
                log.Error(package, defaultScene, AssetMessageCode.AssetNotFound, defaultScene);
                GameSettingsAsset.CreateAndSetDefaultScene(package);
            }
        }