Exemple #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;
        }
        public void ProcessMessage(GameReady gameReadyMessage)
        {
            battleViewer.DisableCancelFindButton();
            var kernelPlayer1 = new Player(0);
            var kernelPlayer2 = new Player(1);

            LocalPlayer  = new LocalPlayer(battleViewer, kernelPlayer1, this, gameManager.UserName);
            OnlinePlayer = new OnlinePlayer(kernelPlayer2, this, gameReadyMessage.Opponent.Login);
            ((OnlinePlayer)OnlinePlayer).OnEnable();
            IEnumerable <GameObject> opponentTeam = ClientFruitonFactory.CreateClientFruitonTeam(gameReadyMessage.OpponentTeam.FruitonIDs, battleViewer.Board);
            IEnumerable <GameObject> currentTeam  = ClientFruitonFactory.CreateClientFruitonTeam(gameManager.CurrentFruitonTeam.FruitonIDs, battleViewer.Board);

            // The opponent team is obtained from the server with the correctly set positions.
            battleViewer.InitializeTeam(opponentTeam, kernelPlayer2, kernelPlayer2.id == 0, gameReadyMessage.OpponentTeam.Positions.ToArray());

            GameSettings kernelSettings = GameSettingsFactory.CreateGameSettings(gameReadyMessage.MapId, battleViewer.GameMode);

            var fruitons = new haxe.root.Array <object>();

            foreach (var fruiton in currentTeam)
            {
                fruitons.push(fruiton.GetComponent <ClientFruiton>().KernelFruiton);
            }
            foreach (var fruiton in opponentTeam)
            {
                fruitons.push(fruiton.GetComponent <ClientFruiton>().KernelFruiton);
            }
            IsLocalPlayerFirst = gameReadyMessage.StartsFirst;
            Player player1;
            Player player2;

            // If the local player begins, the game will be started with kernelPlayer1 as first argument.
            if (IsLocalPlayerFirst)
            {
                battleViewer.InitializeTeam(currentTeam, kernelPlayer1, kernelPlayer1.id == 0, GameManager.Instance.CurrentFruitonTeam.Positions.ToArray());
                player1 = kernelPlayer1;
                player2 = kernelPlayer2;
            }
            // If the online opponent begins, we need to flip the positions to the opposite side because we do not receive
            // the new positions from the server. The first argument has to be the online opponent = kernelPlayer2.
            else
            {
                var width            = GameState.WIDTH;
                var height           = GameState.HEIGHT;
                var flippedPositions = BattleHelper.FlipCoordinates(GameManager.Instance.CurrentFruitonTeam.Positions, width, height);
                battleViewer.InitializeTeam(currentTeam, kernelPlayer1, kernelPlayer1.id == 0, flippedPositions.ToArray());
                player1 = kernelPlayer2;
                player2 = kernelPlayer1;
                battleViewer.DisableEndTurnButton();
            }
            Kernel = new Kernel(player1, player2, fruitons, kernelSettings, false, false);

            SendReadyMessage();
            battleViewer.InitializePlayersInfo();
            BattleReady();
        }
        public AIBattle(BattleViewer battleViewer, AIType aiType)
            : base(battleViewer)
        {
            int[] aiTeamIDs;

            var kernelPlayer1 = new Player(0);
            var kernelPlayer2 = new Player(1);

            HumanPlayer = new LocalPlayer(battleViewer, kernelPlayer1, this, GameManager.Instance.UserName);
            AiPlayer    = CreateAI(aiType, battleViewer, kernelPlayer2, this, out aiTeamIDs);

            IEnumerable <GameObject> humanTeam;
            IEnumerable <Position>   coords;
            IEnumerable <Position>   flippedCoords;
            IEnumerable <GameObject> aiTeam = ClientFruitonFactory.CreateClientFruitonTeam(aiTeamIDs, battleViewer.Board);

            if (aiType == AIType.Tutorial)
            {
                int[] humanTeamIDs = { 2, 5, 15, 14, 12, 17, 21, 21, 30, 25 };
                humanTeam = ClientFruitonFactory.CreateClientFruitonTeam(humanTeamIDs, battleViewer.Board);
                coords    = Tutorial.CreatePositionsForArtificialTeam(humanTeam.Select(gameObject =>
                                                                                       gameObject.GetComponent <ClientFruiton>().KernelFruiton));
            }
            else
            {
                humanTeam = ClientFruitonFactory.CreateClientFruitonTeam(gameManager.CurrentFruitonTeam.FruitonIDs, battleViewer.Board);
                coords    = gameManager.CurrentFruitonTeam.Positions;
            }
            battleViewer.InitializeTeam(humanTeam, kernelPlayer1, kernelPlayer1.id == 0, coords.ToArray());
            flippedCoords = BattleHelper.FlipCoordinates(coords, GameState.WIDTH, GameState.HEIGHT);
            battleViewer.InitializeTeam(aiTeam, kernelPlayer2, kernelPlayer2.id == 0, flippedCoords.ToArray());

            var fruitons = new Array <object>();

            foreach (var fruiton in humanTeam)
            {
                fruitons.push(fruiton.GetComponent <ClientFruiton>().KernelFruiton);
            }
            foreach (var fruiton in aiTeam)
            {
                fruitons.push(fruiton.GetComponent <ClientFruiton>().KernelFruiton);
            }

            Array <int>  maps           = GameManager.Instance.FruitonDatabase.getMapsIds();
            int          rndMapId       = maps[Random.Range(0, maps.length)];
            GameSettings kernelSettings = GameSettingsFactory.CreateGameSettings(rndMapId, battleViewer.GameMode);

            bool infiniteTurnTime = battleViewer.battleType == BattleType.TutorialBattle;

            Kernel = new Kernel(kernelPlayer1, kernelPlayer2, fruitons, kernelSettings, false, infiniteTurnTime);
            BattleReady();
        }
Exemple #4
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;
        }
        public OfflineBattle(BattleViewer battleViewer) : base(battleViewer)
        {
            var    kernelPlayer1 = new Player(0);
            var    kernelPlayer2 = new Player(1);
            string login         = GameManager.Instance.UserName;

            Player1 = new LocalPlayer(battleViewer, kernelPlayer1, this, "Player 1");
            Player2 = new LocalPlayer(battleViewer, kernelPlayer2, this, "Player 2");

            IEnumerable <GameObject> currentTeam  = ClientFruitonFactory.CreateClientFruitonTeam(gameManager.CurrentFruitonTeam.FruitonIDs, battleViewer.Board);
            IEnumerable <GameObject> opponentTeam = ClientFruitonFactory.CreateClientFruitonTeam(gameManager.OfflineOpponentTeam.FruitonIDs, battleViewer.Board);

            RepeatedField <Position> coords = gameManager.CurrentFruitonTeam.Positions;

            battleViewer.InitializeTeam(currentTeam, kernelPlayer1, kernelPlayer1.id == 0, coords.ToArray());
            RepeatedField <Position> flippedCoords = BattleHelper.FlipCoordinates(coords, GameState.WIDTH, GameState.HEIGHT);

            battleViewer.InitializeTeam(opponentTeam, kernelPlayer2, kernelPlayer2.id == 0, flippedCoords.ToArray());

            var fruitons = new Array <object>();

            foreach (var fruiton in currentTeam)
            {
                fruitons.push(fruiton.GetComponent <ClientFruiton>().KernelFruiton);
            }
            foreach (var fruiton in opponentTeam)
            {
                fruitons.push(fruiton.GetComponent <ClientFruiton>().KernelFruiton);
            }

            Array <int>  maps           = GameManager.Instance.FruitonDatabase.getMapsIds();
            int          rndMapId       = maps[Random.Range(0, maps.length)];
            GameSettings kernelSettings = GameSettingsFactory.CreateGameSettings(rndMapId, battleViewer.GameMode);

            Kernel = new Kernel(kernelPlayer1, kernelPlayer2, fruitons, kernelSettings, false, false);
            BattleReady();
        }
        /// <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(nameof(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
                var defaultSceneRuntime   = ((GameSettingsAsset)gameSettingsAssetItem?.Asset)?.DefaultScene;
                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 = DefaultAssetFactory <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.AssetForPackageNotFound, GameSettingsAsset.GameSettingsLocation, package.FullPath.GetFileName());

                    var gameSettingsAsset = GameSettingsFactory.Create();

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

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

                    gameSettingsAssetItem.IsDirty = true;
                }
            }
        }
Exemple #7
0
        private BuildResultCode BuildMaster()
        {
            try
            {
                PackageSessionPublicHelper.FindAndSetMSBuildVersion();
            }
            catch (Exception e)
            {
                var message = "Could not find a compatible version of MSBuild.\r\n\r\n" +
                              "Check that you have a valid installation with the required workloads, or go to [www.visualstudio.com/downloads](https://www.visualstudio.com/downloads) to install a new one.\r\n\r\n" +
                              e;
                builderOptions.Logger.Error(message);
                return(BuildResultCode.BuildError);
            }

            AssetCompilerContext context        = null;
            PackageSession       projectSession = null;

            try
            {
                var sessionLoadParameters = new PackageLoadParameters
                {
                    AutoCompileProjects     = !builderOptions.DisableAutoCompileProjects,
                    ExtraCompileProperties  = builderOptions.ExtraCompileProperties,
                    RemoveUnloadableObjects = true,
                    BuildConfiguration      = builderOptions.ProjectConfiguration,
                };

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

                projectSession = projectSessionResult.Session;

                // Find loaded package (either xkpkg or csproj) -- otherwise fallback to first one
                var packageFile = (UFile)builderOptions.PackageFile;
                var package     = projectSession.LocalPackages.FirstOrDefault(x => x.FullPath == packageFile || (x.Container is SolutionProject project && project.FullPath == packageFile))
                                  ?? projectSession.LocalPackages.First();

                // 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 [{GameSettingsAsset.GameSettingsLocation}]. Use a Default One");
                    gameSettingsAsset = GameSettingsFactory.Create();
                }

                // Create context
                context = new AssetCompilerContext
                {
                    Platform           = builderOptions.Platform,
                    CompilationContext = typeof(AssetCompilationContext),
                    BuildConfiguration = builderOptions.ProjectConfiguration,
                    Package            = package,
                };

                // Command line properties
                foreach (var property in builderOptions.Properties)
                {
                    context.OptionProperties.Add(property.Key, property.Value);
                }

                // Set current game settings
                context.SetGameSettingsAsset(gameSettingsAsset);

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

                context.Properties.Set(BuildAssetNode.VisitRuntimeTypes, true);
                var assetBuildResult = assetBuilder.Prepare(context);
                assetBuildResult.CopyTo(builderOptions.Logger);
                if (assetBuildResult.HasErrors)
                {
                    return(BuildResultCode.BuildError);
                }

                // Setup the remote process build
                var remoteBuilderHelper = new PackageBuilderRemoteHelper(projectSession.AssemblyContainer, builderOptions);

                var indexName = "index." + package.Meta.Name;
                // Add runtime identifier (if any) to avoid clash when building multiple at the same time (this happens when using ExtrasBuildEachRuntimeIdentifier feature of MSBuild.Sdk.Extras)
                if (builderOptions.Properties.TryGetValue("RuntimeIdentifier", out var runtimeIdentifier))
                {
                    indexName += $".{runtimeIdentifier}";
                }

                // Create the builder
                builder = new Builder(builderOptions.Logger, buildDirectory, indexName)
                {
                    ThreadCount = builderOptions.ThreadCount, TryExecuteRemote = remoteBuilderHelper.TryExecuteRemote
                };

                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, indexName, outputDirectory, builder.DisableCompressionIds, context.GetCompilationMode() != CompilationMode.AppStore);

                return(result);
            }
            finally
            {
                builder?.Dispose();
                // Dispose the session (in order to unload assemblies)
                projectSession?.Dispose();
                context?.Dispose();

                // Make sure that MSBuild doesn't hold anything else
                VSProjectHelper.Reset();
            }
        }
Exemple #8
0
        private BuildResultCode BuildMaster()
        {
            // Only querying graphics platform, let's load package, print it and exit
            if (builderOptions.GetGraphicsPlatform)
            {
                return(BuildGetGraphicsPlatform());
            }

            AssetCompilerContext context        = null;
            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 = GameSettingsFactory.Create();
                }

                // Create context
                context = new AssetCompilerContext
                {
                    Profile            = builderOptions.BuildProfile,
                    Platform           = builderOptions.Platform,
                    BuildConfiguration = builderOptions.ProjectConfiguration
                };

                // Command line properties
                foreach (var property in builderOptions.Properties)
                {
                    context.OptionProperties.Add(property.Key, property.Value);
                }

                // Set current game settings
                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);
                }

                // Add specific steps to generate shaders
                // TODO: This doesn't really belong here, where should we move it?
                //assetBuildResult.BuildSteps.Add(new WaitBuildStep());
                //assetBuildResult.BuildSteps.Add(new CompileDefaultSceneEffectCommand(context, package, assetBuildResult));

                // 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
            {
                builder?.Dispose();
                // Dispose the session (in order to unload assemblies)
                projectSession?.Dispose();
                context?.Dispose();
            }
        }
Exemple #9
0
        protected override bool Generate(SessionTemplateGeneratorParameters parameters)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }
            // Structure of files to generate:
            //     $Name$.xkpkg
            //     $Name$.targets
            //     Assets\
            //     $Name$.Game\
            //     $Name$.Windows\
            //     $Name$.Android\
            //     $Name$.iOS\

            var logger          = parameters.Logger;
            var platforms       = parameters.GetTag(PlatformsKey);
            var name            = parameters.Name;
            var outputDirectory = parameters.OutputDirectory;
            var orientation     = parameters.GetTag(OrientationKey);

            // Generate the package
            var package = NewPackageTemplateGenerator.GeneratePackage(parameters);

            // Generate projects for this package
            var session = parameters.Session;

            var sharedProfile = package.Profiles.FindSharedProfile();

            // Setup the assets folder
            Directory.CreateDirectory(UPath.Combine(outputDirectory, (UDirectory)"Assets/Shared"));

            //write gitignore
            WriteGitIgnore(parameters);

            var previousCurrent = session.CurrentPackage;

            session.CurrentPackage = package;

            var projectGameName = Utilities.BuildValidNamespaceName(name) + ".Game";

            var stepIndex = 0;
            var stepCount = platforms.Count + 1;

            // Log progress
            ProjectTemplateGeneratorHelper.Progress(logger, $"Generating {projectGameName}...", stepIndex++, stepCount);

            // Generate the Game library
            var projectGameReference = ProjectTemplateGeneratorHelper.GenerateTemplate(parameters, platforms, package, "ProjectLibrary.Game/ProjectLibrary.Game.ttproj", projectGameName, PlatformType.Shared, null, null, ProjectType.Library, orientation);

            projectGameReference.Type = ProjectType.Library;
            sharedProfile.ProjectReferences.Add(projectGameReference);

            // Add Effects as an asset folder in order to load xksl
            sharedProfile.AssetFolders.Add(new AssetFolder(projectGameName + "/Effects"));

            // Generate executable projects for each platform
            ProjectTemplateGeneratorHelper.UpdatePackagePlatforms(parameters, platforms, orientation, projectGameReference.Id, name, package, false);

            // Add asset packages
            CopyAssetPacks(parameters);

            // Load assets from HDD
            package.LoadTemporaryAssets(logger);

            // Validate assets
            package.ValidateAssets(true, false, logger);

            // Setup GraphicsCompositor using DefaultGraphicsCompositor
            var graphicsProfile      = parameters.GetTag(GraphicsProfileKey);
            var defaultCompositorUrl = graphicsProfile >= GraphicsProfile.Level_10_0 ? XenkoPackageUpgrader.DefaultGraphicsCompositorLevel10Url : XenkoPackageUpgrader.DefaultGraphicsCompositorLevel9Url;
            var defaultCompositor    = session.FindAsset(defaultCompositorUrl);

            var graphicsCompositor = new AssetItem("GraphicsCompositor", defaultCompositor.CreateDerivedAsset());

            package.Assets.Add(graphicsCompositor);
            graphicsCompositor.IsDirty = true;

            // Setup GameSettingsAsset
            var gameSettingsAsset = GameSettingsFactory.Create();

            gameSettingsAsset.GetOrCreate <EditorSettings>().RenderingMode = parameters.GetTag(IsHDRKey) ? RenderingMode.HDR : RenderingMode.LDR;
            gameSettingsAsset.GraphicsCompositor = AttachedReferenceManager.CreateProxyObject <GraphicsCompositor>(graphicsCompositor.ToReference());

            var renderingSettings = gameSettingsAsset.GetOrCreate <RenderingSettings>();

            renderingSettings.DefaultGraphicsProfile = parameters.GetTag(GraphicsProfileKey);
            renderingSettings.DisplayOrientation     = (RequiredDisplayOrientation)orientation;

            var gameSettingsAssetItem = new AssetItem(GameSettingsAsset.GameSettingsLocation, gameSettingsAsset);

            package.Assets.Add(gameSettingsAssetItem);
            gameSettingsAssetItem.IsDirty = true;

            // Add assets to the package
            AddAssets(parameters, package, projectGameReference, projectGameName);

            // Log done
            ProjectTemplateGeneratorHelper.Progress(logger, "Done", stepCount, stepCount);

            session.CurrentPackage = previousCurrent;
            return(true);
        }
Exemple #10
0
        private BuildResultCode BuildMaster()
        {
            // Only querying graphics platform, let's load package, print it and exit
            if (builderOptions.GetGraphicsPlatform)
            {
                return(BuildGetGraphicsPlatform());
            }

            AssetCompilerContext context        = null;
            PackageSession       projectSession = null;

            try
            {
                if (!PackageSessionPublicHelper.FindAndSetMSBuildVersion())
                {
                    var message = "Could not find a compatible version of MSBuild.\r\n\r\n" +
                                  "Check that you have a valid installation with the required workloads, or go to [www.visualstudio.com/downloads](https://www.visualstudio.com/downloads) to install a new one.";
                    builderOptions.Logger.Error(message);
                    return(BuildResultCode.BuildError);
                }

                var sessionLoadParameters = new PackageLoadParameters
                {
                    AutoCompileProjects     = !builderOptions.DisableAutoCompileProjects,
                    ExtraCompileProperties  = builderOptions.ExtraCompileProperties,
                    RemoveUnloadableObjects = true,
                };

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

                projectSession = projectSessionResult.Session;

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

                // Check build profile
                var buildProfile = package.Profiles.FirstOrDefault(pair => pair.Name == builderOptions.BuildProfile);
                if (buildProfile == null)
                {
                    builderOptions.Logger.Error($"Unable to find profile [{builderOptions.BuildProfile}] in package [{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 [{GameSettingsAsset.GameSettingsLocation}]. Use a Default One");
                    gameSettingsAsset = GameSettingsFactory.Create();
                }

                // Create context
                context = new AssetCompilerContext
                {
                    Profile            = builderOptions.BuildProfile,
                    Platform           = builderOptions.Platform,
                    CompilationContext = typeof(AssetCompilationContext),
                    BuildConfiguration = builderOptions.ProjectConfiguration
                };

                // Command line properties
                foreach (var property in builderOptions.Properties)
                {
                    context.OptionProperties.Add(property.Key, property.Value);
                }

                // Set current game settings
                context.SetGameSettingsAsset(gameSettingsAsset);

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

                context.Properties.Set(BuildAssetNode.VisitRuntimeTypes, true);
                var assetBuildResult = assetBuilder.Prepare(context);
                assetBuildResult.CopyTo(builderOptions.Logger);
                if (assetBuildResult.HasErrors)
                {
                    return(BuildResultCode.BuildError);
                }

                // Setup the remote process build
                var remoteBuilderHelper = new PackageBuilderRemoteHelper(projectSession.AssemblyContainer, builderOptions);

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

                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, context.GetCompilationMode() != CompilationMode.AppStore);

                return(result);
            }
            finally
            {
                builder?.Dispose();
                // Dispose the session (in order to unload assemblies)
                projectSession?.Dispose();
                context?.Dispose();

                // Make sure that MSBuild doesn't hold anything else
                VSProjectHelper.Reset();
            }
        }
        protected override bool Generate(SessionTemplateGeneratorParameters parameters)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }
            // Structure of files to generate:
            //     $Name$.sdpkg
            //     $Name$.targets
            //     Assets\
            //     $Name$.Game\
            //     $Name$.Windows\
            //     $Name$.Android\
            //     $Name$.iOS\

            var logger          = parameters.Logger;
            var platforms       = parameters.GetTag(PlatformsKey);
            var name            = parameters.Name;
            var outputDirectory = parameters.OutputDirectory;
            var orientation     = parameters.GetTag(OrientationKey);

            // Generate the package
            //var package = NewPackageTemplateGenerator.GeneratePackage(parameters);

            // Generate projects for this package
            var session = parameters.Session;

            var projectGameName = Utilities.BuildValidNamespaceName(name);

            var stepIndex = 0;
            var stepCount = platforms.Count + 1;

            // Log progress
            ProjectTemplateGeneratorHelper.Progress(logger, $"Generating {projectGameName}...", stepIndex++, stepCount);

            // Generate the Game library
            var project = ProjectTemplateGeneratorHelper.GenerateTemplate(parameters, platforms, "ProjectLibrary.Game/ProjectLibrary.Game.ttproj", projectGameName, PlatformType.Shared, null, ProjectType.Library, orientation);
            var package = project.Package;

            //write gitignore
            WriteGitIgnore(parameters);

            // Setup the assets folder
            //Directory.CreateDirectory(UPath.Combine(package.RootDirectory, (UDirectory)"Assets/Shared"));

            session.Projects.Add(project);

            // Load missing references
            session.LoadMissingDependencies(parameters.Logger);
            // Load dependency assets (needed for camera script template)
            session.LoadMissingAssets(parameters.Logger, project.FlattenedDependencies.Select(x => x.Package).NotNull());

            // Add Effects as an asset folder in order to load sdsl
            package.AssetFolders.Add(new AssetFolder("Effects"));

            var packageParameters = new PackageTemplateGeneratorParameters
            {
                Name            = package.Meta.Name,
                OutputDirectory = package.FullPath.GetFullDirectory(),
                Description     = parameters.Description,
                Package         = package,
                Logger          = parameters.Logger,
                Namespace       = parameters.Namespace
            };

            // Generate executable projects for each platform
            var platformProjects = ProjectTemplateGeneratorHelper.UpdatePackagePlatforms(packageParameters, platforms, orientation, false).ToList();

            // Add asset packages
            CopyAssetPacks(parameters, package);

            // Create camera script
            var cameraScriptTemplate = TemplateManager.FindTemplates(package.Session).OfType <TemplateAssetDescription>().FirstOrDefault(x => x.DefaultOutputName == CameraScriptDefaultOutputName);

            if (cameraScriptTemplate == null)
            {
                throw new InvalidOperationException($"Could not find template for script '{CameraScriptDefaultOutputName}'");
            }

            var cameraScriptParameters = new AssetTemplateGeneratorParameters(string.Empty)
            {
                Name        = cameraScriptTemplate.DefaultOutputName,
                Description = cameraScriptTemplate,
                Namespace   = parameters.Namespace,
                Package     = package,
                Logger      = logger,
                Unattended  = true,
            };

            ScriptTemplateGenerator.SetClassName(cameraScriptParameters, cameraScriptTemplate.DefaultOutputName);
            if (!ScriptTemplateGenerator.Default.PrepareForRun(cameraScriptParameters).Result || !ScriptTemplateGenerator.Default.Run(cameraScriptParameters))
            {
                throw new InvalidOperationException($"Could not create script '{CameraScriptDefaultOutputName}'");
            }

            // Force save after having created the script
            // Note: We do that AFTER GameSettings is dirty, otherwise it would ask for an assembly reload (game settings saved might mean new graphics API)
            SaveSession(parameters);

            // Load missing references
            session.LoadMissingReferences(parameters.Logger);

            // Setup GraphicsCompositor using DefaultGraphicsCompositor
            var graphicsProfile      = parameters.GetTag(GraphicsProfileKey);
            var defaultCompositorUrl = graphicsProfile >= GraphicsProfile.Level_10_0 ? StridePackageUpgrader.DefaultGraphicsCompositorLevel10Url : StridePackageUpgrader.DefaultGraphicsCompositorLevel9Url;
            var defaultCompositor    = session.FindAsset(defaultCompositorUrl);

            var graphicsCompositor = new AssetItem("GraphicsCompositor", defaultCompositor.CreateDerivedAsset());

            package.Assets.Add(graphicsCompositor);
            graphicsCompositor.IsDirty = true;

            // Setup GameSettingsAsset
            var gameSettingsAsset = GameSettingsFactory.Create();

            gameSettingsAsset.GetOrCreate <EditorSettings>().RenderingMode = parameters.GetTag(IsHDRKey) ? RenderingMode.HDR : RenderingMode.LDR;
            gameSettingsAsset.GraphicsCompositor = AttachedReferenceManager.CreateProxyObject <GraphicsCompositor>(graphicsCompositor.ToReference());

            var renderingSettings = gameSettingsAsset.GetOrCreate <RenderingSettings>();

            renderingSettings.DefaultGraphicsProfile = parameters.GetTag(GraphicsProfileKey);
            renderingSettings.DisplayOrientation     = (RequiredDisplayOrientation)orientation;

            var gameSettingsAssetItem = new AssetItem(GameSettingsAsset.GameSettingsLocation, gameSettingsAsset);

            package.Assets.Add(gameSettingsAssetItem);
            gameSettingsAssetItem.IsDirty = true;

            // Add assets to the package
            AddAssets(parameters, package, projectGameName);

            // Log done
            ProjectTemplateGeneratorHelper.Progress(logger, "Done", stepCount, stepCount);

            // Set current project
            session.CurrentProject = platformProjects.FirstOrDefault(x => x.Platform == PlatformType.Windows) ?? project;

            return(true);
        }
Exemple #12
0
 private void UpdateCurrentGameSettings()
 {
     currentPackage      = session.CurrentProject?.Package;
     CurrentGameSettings = currentPackage?.GetGameSettingsAssetOrDefault() ?? GameSettingsFactory.Create();
     RaiseGameSettings(CurrentGameSettings);
 }
Exemple #13
0
        private BuildResultCode BuildMaster()
        {
            // Only querying graphics platform, let's load package, print it and exit
            if (builderOptions.GetGraphicsPlatform)
            {
                return(BuildGetGraphicsPlatform());
            }

            AssetCompilerContext context        = null;
            PackageSession       projectSession = null;

            try
            {
                // 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,
                    RemoveUnloadableObjects = true,
                };

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

                projectSession = projectSessionResult.Session;

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

                // Check build profile
                var buildProfile = package.Profiles.FirstOrDefault(pair => pair.Name == builderOptions.BuildProfile);
                if (buildProfile == null)
                {
                    builderOptions.Logger.Error($"Unable to find profile [{builderOptions.BuildProfile}] in package [{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 [{GameSettingsAsset.GameSettingsLocation}]. Use a Default One");
                    gameSettingsAsset = GameSettingsFactory.Create();
                }

                // Create context
                context = new AssetCompilerContext
                {
                    Profile            = builderOptions.BuildProfile,
                    Platform           = builderOptions.Platform,
                    CompilationContext = typeof(AssetCompilationContext),
                    BuildConfiguration = builderOptions.ProjectConfiguration
                };

                // Command line properties
                foreach (var property in builderOptions.Properties)
                {
                    context.OptionProperties.Add(property.Key, property.Value);
                }

                // Set current game settings
                context.SetGameSettingsAsset(gameSettingsAsset);

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

                context.Properties.Set(BuildAssetNode.VisitRuntimeTypes, true);
                var assetBuildResult = assetBuilder.Prepare(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
                };

                // Note: try to get exec server if it exists, otherwise use CompilerApp.exe
                builder.SlaveBuilderPath = (string)AppDomain.CurrentDomain.GetData("RealEntryAssemblyFile") ?? typeof(PackageBuilder).Assembly.Location;

                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, context.GetCompilationMode() != CompilationMode.AppStore);

                return(result);
            }
            finally
            {
                builder?.Dispose();
                // Dispose the session (in order to unload assemblies)
                projectSession?.Dispose();
                context?.Dispose();
            }
        }