public void Generate(TemplateGeneratorParameters parameters)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException("parameters");
            }
            parameters.Validate();

            var name            = parameters.Name;
            var outputDirectory = parameters.OutputDirectory;

            // Creates the package
            var package = NewPackage(name);

            // Setup the default namespace
            package.Meta.RootNamespace = parameters.Namespace;

            // Setup the path to save it
            package.FullPath = UPath.Combine(outputDirectory, new UFile(name + Package.PackageFileExtension));

            // Set the package
            parameters.Package = package;

            // Add it to the current session
            var session = parameters.Session;

            session.Packages.Add(package);

            // Load missing references
            session.LoadMissingReferences(parameters.Logger);
        }
示例#2
0
        private static int Main(string[] args)
        {
            Console.WriteLine(@"Bootstrapping: " + args[0]);

            var xenkoDir     = Environment.GetEnvironmentVariable("SiliconStudioXenkoDir");
            var xenkoPkgPath = UPath.Combine(xenkoDir, new UFile("Xenko.xkpkg"));

            var session = PackageSession.Load(xenkoPkgPath);

            var generator = TemplateSampleGenerator.Default;

            var logger = new LoggerResult();

            var parameters = new TemplateGeneratorParameters {
                Session = session.Session
            };

            var outputPath = UPath.Combine(new UDirectory(xenkoDir), new UDirectory("samplesGenerated"));

            outputPath = UPath.Combine(outputPath, new UDirectory(args[0]));

            var xenkoTemplates = session.Session.Packages.First().Templates;

            parameters.Description     = xenkoTemplates.First(x => x.Group.StartsWith("Samples") && x.Id == new Guid(args[1]));
            parameters.Name            = args[0];
            parameters.Namespace       = args[0];
            parameters.OutputDirectory = outputPath;
            parameters.Logger          = logger;

            generator.Generate(parameters);

            var updaterTemplate = xenkoTemplates.First(x => x.FullPath.ToString().EndsWith("UpdatePlatforms.xktpl"));

            parameters.Description = updaterTemplate;

            var updater = UpdatePlatformsTemplateGenerator.Default;

            var gameSettingsAsset = session.Session.Packages.Last().GetGameSettingsAsset();
            var renderingSettings = gameSettingsAsset.Get <RenderingSettings>();

            var updateParams = new GameTemplateParameters
            {
                Common = parameters,
                ForcePlatformRegeneration = true,
                GraphicsProfile           = renderingSettings.DefaultGraphicsProfile,
                IsHDR       = false,
                Orientation = (DisplayOrientation)renderingSettings.DisplayOrientation,
                Platforms   = AssetRegistry.SupportedPlatforms.ToList()
            };

            updater.Generate(updateParams);

            Console.WriteLine(logger.ToText());

            return(logger.HasErrors ? 1 : 0);
        }
        public override Action PrepareForRun(TemplateGeneratorParameters parameters)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException("parameters");
            }
            parameters.Validate();

            return(() => Generate(parameters));
        }
        public static void AddOption(TemplateGeneratorParameters parameters, string optionName, object optionValue)
        {
            if (!parameters.Tags.TryGetValue(OptionsKey, out Dictionary<string, object> options))
            {
                options = new Dictionary<string, object>();
                parameters.Tags.Add(OptionsKey, options);
            }

            options[optionName] = optionValue;
        }
        public static ProjectTemplate PrepareTemplate(TemplateGeneratorParameters parameters, Package package, UFile templateRelativePath, PlatformType platformType, GraphicsPlatform? graphicsPlatform, ProjectType projectType)
        {
            if (platformType != PlatformType.Shared && !graphicsPlatform.HasValue)
            {
                throw new ArgumentException(@"Expecting a value for GraphicsPlatform when platformType is specified.", nameof(graphicsPlatform));
            }

            var rootTemplateDir = parameters.Description.TemplateDirectory;

            var templateFilePath = UPath.Combine(rootTemplateDir, templateRelativePath);
            var projectTemplate = ProjectTemplate.Load(templateFilePath);
            // TODO: Assemblies are not configurable from the outside
            projectTemplate.Assemblies.Add(typeof(ProjectType).Assembly.FullName);
            projectTemplate.Assemblies.Add(typeof(StrideConfig).Assembly.FullName);
            projectTemplate.Assemblies.Add(typeof(GraphicsPlatform).Assembly.FullName);
            projectTemplate.Assemblies.Add(typeof(DisplayOrientation).Assembly.FullName);

            AddOption(parameters, "Package", package);
            AddOption(parameters, "PackageName", package.Meta.Name);

            // PackageNameCode, same as PackageName without '.' and ' '.
            AddOption(parameters, "PackageNameCode",
                package.Meta.Name.Replace(" ", string.Empty)
                                 .Replace(".", string.Empty));

            AddOption(parameters, "PackageDisplayName", package.Meta.Title ?? package.Meta.Name);
            // Escape illegal characters for the short name
            AddOption(parameters, "PackageNameShort", Utilities.BuildValidClassName(package.Meta.Name.Replace(" ", string.Empty)));

            AddOption(parameters, "CurrentPlatform", platformType);
            if (platformType != PlatformType.Shared)
            {
                AddOption(parameters, "CurrentGraphicsPlatform", graphicsPlatform);
            }

            AddOption(parameters, "ProjectType", projectType);
            AddOption(parameters, "Namespace", parameters.Namespace ?? Utilities.BuildValidNamespaceName(package.Meta.Name));

            if (platformType == PlatformType.Windows)
            {
                var isNETFramework = RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework");
                AddOption(parameters, "TargetFramework", isNETFramework ? "net461" : "net5.0-windows");
            }

            return projectTemplate;
        }
        public static SolutionProject GenerateTemplate(TemplateGeneratorParameters parameters, ICollection<SelectedSolutionPlatform> platforms, UFile templateRelativePath, string projectName, PlatformType platformType, GraphicsPlatform? graphicsPlatform, ProjectType projectType, DisplayOrientation orientation, Guid? projectGuid = null)
        {
            AddOption(parameters, "Platforms", platforms.Select(x => x.Platform).ToList());
            AddOption(parameters, "CurrentPlatform", platformType);
            AddOption(parameters, "Orientation", orientation);

            var project = GenerateTemplate(parameters, templateRelativePath, projectName, platformType, graphicsPlatform, projectType, out List<string> generatedFiles, projectGuid);

            // Special case for sdfx files
            foreach (var file in generatedFiles)
            {
                if (file.EndsWith(".sdfx"))
                {
                    ConvertSdfxToCSharp(file);
                }
            }

            return project;
        }
示例#7
0
        public static ProjectReference GenerateTemplate(TemplateGeneratorParameters parameters, Package package, UFile templateRelativePath, string projectName, PlatformType platformType, GraphicsPlatform?graphicsPlatform, ProjectType projectType, out List <string> generatedFiles, Guid?projectGuidArg = null)
        {
            var options             = GetOptions(parameters);
            var projectTemplate     = PrepareTemplate(parameters, package, templateRelativePath, platformType, graphicsPlatform, projectType);
            var outputDirectoryPath = UPath.Combine(parameters.OutputDirectory, (UDirectory)projectName);

            Directory.CreateDirectory(outputDirectoryPath);

            generatedFiles = new List <string>();
            parameters.Logger.Verbose($"Generating {projectName}...");

            var projectGuid = projectGuidArg ?? Guid.NewGuid();

            projectTemplate.Generate(outputDirectoryPath, projectName, projectGuid, parameters.Logger, options, generatedFiles);

            // Mark the package as dirty
            package.IsDirty = true;

            return(new ProjectReference(projectGuid, UPath.Combine(outputDirectoryPath, (UFile)(projectName + ".csproj")), ProjectType.Library));
        }
示例#8
0
        public static SolutionProject GenerateTemplate(TemplateGeneratorParameters parameters, UFile templateRelativePath, string projectName, PlatformType platformType, GraphicsPlatform?graphicsPlatform, ProjectType projectType, out List <string> generatedFiles, Guid?projectGuidArg = null)
        {
            var options             = GetOptions(parameters);
            var outputDirectoryPath = UPath.Combine(parameters.OutputDirectory, (UDirectory)projectName);

            Directory.CreateDirectory(outputDirectoryPath);

            generatedFiles = new List <string>();
            parameters.Logger.Verbose($"Generating {projectName}...");

            var projectGuid     = projectGuidArg ?? Guid.NewGuid();
            var packagePath     = UPath.Combine(outputDirectoryPath, (UFile)(projectName + Package.PackageFileExtension));
            var projectFullPath = UPath.Combine(outputDirectoryPath, (UFile)(projectName + ".csproj"));

            var package = new Package
            {
                Meta =
                {
                    Name    = projectName,
                    Version = new PackageVersion("1.0.0.0")
                },
                FullPath = packagePath,
                IsDirty  = true,
            };

            package.AssetFolders.Add(new AssetFolder("Assets"));
            package.ResourceFolders.Add("Resources");

            var projectTemplate = PrepareTemplate(parameters, package, templateRelativePath, platformType, graphicsPlatform, projectType);

            projectTemplate.Generate(outputDirectoryPath, projectName, projectGuid, parameters.Logger, options, generatedFiles);

            var project = new SolutionProject(package, projectGuid, projectFullPath);

            project.Type     = projectType;
            project.Platform = platformType;

            return(project);
        }
示例#9
0
        private static void GenerateUnitTestProject(string outputDirectory, string templateFile, string name)
        {
            var projectTemplate = ProjectTemplate.Load(templateFile);

            // Force reference to Paradox.Assets (to have acess to SolutionPlatform)
            projectTemplate.Assemblies.Add(typeof(GraphicsProfile).Assembly.FullName);
            projectTemplate.Assemblies.Add(typeof(ParadoxConfig).Assembly.FullName);

            var options = new Dictionary <string, object>();

            var session = new PackageSession();
            var result  = new LoggerResult();

            var templateGeneratorParameters = new TemplateGeneratorParameters();

            templateGeneratorParameters.OutputDirectory = outputDirectory;
            templateGeneratorParameters.Session         = session;
            templateGeneratorParameters.Name            = name;
            templateGeneratorParameters.Logger          = result;
            templateGeneratorParameters.Description     = new TemplateDescription();

            PackageUnitTestGenerator.Default.Generate(templateGeneratorParameters);
            if (result.HasErrors)
            {
                Console.WriteLine("Error generating package: {0}", result.ToText());
                return;
            }

            var package = templateGeneratorParameters.Package;

            var previousCurrent = session.CurrentPackage;

            session.CurrentPackage = package;

            // Compute Paradox Sdk relative path
            // We are supposed to be in standard output binary folder, so Paradox root should be at ..\..
            var paradoxPath         = UDirectory.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), new UDirectory(@"..\.."));
            var paradoxRelativePath = new UDirectory(paradoxPath)
                                      .MakeRelative(outputDirectory)
                                      .ToString()
                                      .Replace('/', '\\');

            paradoxRelativePath = paradoxRelativePath.TrimEnd('\\');

            options["Namespace"]             = name;
            options["Package"]               = package;
            options["Platforms"]             = new List <SolutionPlatform>(AssetRegistry.SupportedPlatforms);
            options["ParadoxSdkRelativeDir"] = paradoxRelativePath;

            // Generate project template
            var projectGuid = Guid.NewGuid();

            result = projectTemplate.Generate(outputDirectory, name, projectGuid, options);
            if (result.HasErrors)
            {
                Console.WriteLine("Error generating solution: {0}", result.ToText());
                return;
            }

            var sharedProfile = package.Profiles[PlatformType.Shared];

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

            // Add Windows test as Shared library
            var projectWindowsRef = new ProjectReference();

            projectWindowsRef.Id       = projectGuid;
            projectWindowsRef.Location = UPath.Combine(outputDirectory, (UFile)(name + ".Windows.csproj"));
            projectWindowsRef.Type     = SiliconStudio.Assets.ProjectType.Library;
            sharedProfile.ProjectReferences.Add(projectWindowsRef);

            // Generate executable projects for each platform
            foreach (var platform in AssetRegistry.SupportedPlatforms)
            {
                var platformProfile = new PackageProfile(platform.Name)
                {
                    Platform = platform.Type
                };
                platformProfile.AssetFolders.Add(new AssetFolder("Assets/" + platform.Name));

                // Log progress
                var projectName = name + "." + platform.Type;

                // Create project reference
                var projectPlatformRef = new ProjectReference();
                projectPlatformRef.Id       = projectGuid;
                projectPlatformRef.Location = UPath.Combine(outputDirectory, (UFile)(projectName + ".csproj"));
                projectPlatformRef.Type     = SiliconStudio.Assets.ProjectType.Executable;

                platformProfile.ProjectReferences.Add(projectPlatformRef);

                // Add build configuration per platform
                platform.Properties.CopyTo(platformProfile.Properties, true);

                package.Profiles.Add(platformProfile);
            }

            session.CurrentPackage = previousCurrent;

            result = session.Save();
            if (result.HasErrors)
            {
                Console.WriteLine("Error saving package: {0}", result.ToText());
                return;
            }
        }
示例#10
0
 public bool AfterRun(TemplateGeneratorParameters parameters)
 {
     return(true);
 }
示例#11
0
 public Func <bool> PrepareForRun(TemplateGeneratorParameters parameters)
 {
     // Nothing to do in the tests
     return(null);
 }
示例#12
0
        public static IReadOnlyDictionary <string, object> GetOptions(TemplateGeneratorParameters parameters)
        {
            Dictionary <string, object> options;

            return(parameters.Tags.TryGetValue(OptionsKey, out options) ? options : new Dictionary <string, object>());
        }
示例#13
0
        public static void UpdatePackagePlatforms(TemplateGeneratorParameters parameters, ICollection <SelectedSolutionPlatform> platforms, DisplayOrientation orientation, Guid sharedProjectGuid, string name, Package package, bool forcePlatformRegeneration)
        {
            if (platforms == null)
            {
                throw new ArgumentNullException(nameof(platforms));
            }
            var logger = parameters.Logger;

            // Setup the ProjectGameGuid to be accessible from exec (in order to be able to link to the game project.
            AddOption(parameters, "ProjectGameGuid", sharedProjectGuid);

            // Add projects
            var stepIndex        = 0;
            var stepCount        = platforms.Count + 1;
            var profilesToRemove = package.Profiles.Where(profile => platforms.All(platform => profile.Platform != PlatformType.Shared && platform.Platform.Type != profile.Platform)).ToList();

            stepCount += profilesToRemove.Count;

            foreach (var platform in platforms)
            {
                stepIndex++;

                // Don't add a platform that is already in the package

                var platformProfile = package.Profiles.FirstOrDefault(profile => profile.Platform == platform.Platform.Type);
                if (platformProfile != null && !forcePlatformRegeneration)
                {
                    continue;
                }

                var projectGuid = Guid.NewGuid();

                if (platformProfile == null)
                {
                    platformProfile = new PackageProfile(platform.Platform.Name)
                    {
                        Platform = platform.Platform.Type
                    };
                    platformProfile.AssetFolders.Add(new AssetFolder("Assets/" + platform.Platform.Name));
                }
                else
                {
                    // We are going to regenerate this platform, so we are removing it before
                    var previousExeProject = platformProfile.ProjectReferences.FirstOrDefault(project => project.Type == ProjectType.Executable);
                    if (previousExeProject != null)
                    {
                        projectGuid = previousExeProject.Id;
                        RemoveProject(previousExeProject, logger);
                        platformProfile.ProjectReferences.Remove(previousExeProject);
                    }
                }

                var templatePath = platform.Template?.TemplatePath ?? $"ProjectExecutable.{platform.Platform.Name}/ProjectExecutable.{platform.Platform.Name}.ttproj";

                // Log progress
                var projectName = Utilities.BuildValidNamespaceName(name) + "." + platform.Platform.Name;
                Progress(logger, $"Generating {projectName}...", stepIndex - 1, stepCount);

                var graphicsPlatform = platform.Platform.Type.GetDefaultGraphicsPlatform();
                var newExeProject    = GenerateTemplate(parameters, platforms, package, templatePath, projectName, platform.Platform.Type, platformProfile.Name, graphicsPlatform, ProjectType.Executable, orientation, projectGuid);
                newExeProject.Type = ProjectType.Executable;

                platformProfile.ProjectReferences.Add(newExeProject);

                if (!package.Profiles.Contains(platformProfile))
                {
                    package.Profiles.Add(platformProfile);
                }

                package.IsDirty = true;
            }

            // Remove existing platform profiles
            foreach (var profileToRemove in profilesToRemove)
            {
                package.Profiles.Remove(profileToRemove);
                package.IsDirty = true;

                foreach (var projectReference in profileToRemove.ProjectReferences)
                {
                    // Try to remove the directory
                    Progress(logger, $"Deleting {projectReference.Location}...", stepIndex++, stepCount);
                    RemoveProject(projectReference, logger);
                }

                // We are completely removing references from profile
                profileToRemove.ProjectReferences.Clear();
            }
        }
示例#14
0
 public void AfterRun(TemplateGeneratorParameters parameters)
 {
 }