protected override void PostAssetCreation(AssetTemplateGeneratorParameters parameters, AssetItem assetItem)
        {
            base.PostAssetCreation(parameters, assetItem);
            var material = parameters.GetTag(MaterialKey);

            ((PrimitiveProceduralModelBase)((ProceduralModelAsset)assetItem.Asset).Type).MaterialInstance.Material = material;
        }
Пример #2
0
        /// <inheritdoc />
        protected override IEnumerable <AssetItem> CreateAssets(AssetTemplateGeneratorParameters parameters)
        {
            var importedAssets = new List <AssetItem>();

            foreach (var assetItem in base.CreateAssets(parameters))
            {
                if (assetItem.Asset is SoundAsset soundAsset)
                {
                    using (var media = new FFmpegMedia())
                    {
                        media.Open(soundAsset.Source.ToWindowsPath());
                        var audioStreams = media.Streams.OfType <AudioStream>().ToList();
                        foreach (var audioTrack in audioStreams)
                        {
                            var assetCopy = AssetCloner.Clone(soundAsset);
                            assetCopy.Index      = audioTrack.Index;
                            assetCopy.SampleRate = audioTrack.SampleRate;

                            // If there's more than one streams, append the track index to the asset name
                            var fileLocation = audioStreams.Count > 1
                                ? (UFile)(assetItem.Location + " track " + audioTrack.Index)
                                : assetItem.Location;
                            importedAssets.Add(new AssetItem(fileLocation, assetCopy));
                        }
                    }
                }
            }

            return(MakeUniqueNames(importedAssets));
        }
        protected override IEnumerable <AssetItem> CreateAssets(AssetTemplateGeneratorParameters parameters)
        {
            var files = parameters.Tags.Get(SourceFilesPathKey);

            if (files == null)
            {
                return(base.CreateAssets(parameters));
            }

            var importParameters = new AssetImporterParameters {
                Logger = parameters.Logger
            };

            importParameters.SelectedOutputTypes.Add(typeof(SkeletonAsset), true);

            var importedAssets = new List <AssetItem>();

            foreach (var file in files)
            {
                // TODO: should we allow to select the importer?
                var importer = AssetRegistry.FindImporterForFile(file).OfType <ModelAssetImporter>().FirstOrDefault();
                if (importer == null)
                {
                    parameters.Logger.Warning($"No importer found for file \"{file}\"");
                    continue;
                }

                var assets = importer.Import(file, importParameters).Select(x => new AssetItem(UPath.Combine(parameters.TargetLocation, x.Location), x.Asset)).ToList();
                // Create unique names amongst the list of assets
                importedAssets.AddRange(MakeUniqueNames(assets));
            }

            return(importedAssets);
        }
        protected override void PostAssetCreation(AssetTemplateGeneratorParameters parameters, AssetItem assetItem)
        {
            base.PostAssetCreation(parameters, assetItem);
            var model = parameters.GetTag(ModelKey);

            ((ConvexHullColliderShapeDesc)((ColliderShapeAsset)assetItem.Asset).ColliderShapes[0]).Model = model;
        }
        protected override void PostAssetCreation(AssetTemplateGeneratorParameters parameters, AssetItem assetItem)
        {
            base.PostAssetCreation(parameters, assetItem);
            var texture = parameters.GetTag(TextureKey);

            ((SkyboxAsset)assetItem.Asset).CubeMap = texture;
        }
Пример #6
0
        /// <inheritdoc />
        protected override IEnumerable <AssetItem> CreateAssets(AssetTemplateGeneratorParameters parameters)
        {
            var importedAssets = new List <AssetItem>();

            foreach (var assetItem in base.CreateAssets(parameters))
            {
                if (assetItem.Asset is SoundAsset soundAsset)
                {
                    using (var media = new FFmpegMedia())
                    {
                        media.Open(soundAsset.Source.ToWindowsPath());
                        foreach (var audioTrack in media.Streams.OfType <AudioStream>().ToList())
                        {
                            var assetCopy = AssetCloner.Clone(soundAsset);
                            assetCopy.Index      = audioTrack.Index;
                            assetCopy.SampleRate = audioTrack.SampleRate;

                            importedAssets.Add(new AssetItem(assetItem.Location + (audioTrack.Index > 0 ? " track " + audioTrack.Index : ""), assetCopy));
                        }
                    }
                }
            }

            return(MakeUniqueNames(importedAssets));
        }
Пример #7
0
        protected override IEnumerable <AssetItem> CreateAssets(AssetTemplateGeneratorParameters parameters)
        {
            var sources = parameters.Tags.Get(SourceFilesPathKey);

            if (sources == null)
            {
                return(base.CreateAssets(parameters));
            }

            var assets      = new List <AssetItem>();
            var defaultName = parameters.Name;

            foreach (var source in sources)
            {
                // Use the source file name for the asset name if it is valid
                parameters.Name = source.GetFileNameWithoutExtension();
                if (string.IsNullOrWhiteSpace(parameters.Name))
                {
                    parameters.Name = defaultName;
                }

                var assetImport = base.CreateAssets(parameters).First();
                ((IAssetWithSource)assetImport.Asset).Source = source;
                assets.Add(assetImport);
            }
            return(assets);
        }
        /// <inheritdoc />
        protected override IEnumerable <AssetItem> CreateAssets(AssetTemplateGeneratorParameters parameters)
        {
            var files = parameters.Tags.Get(SourceFilesPathKey);

            if (files == null)
            {
                return(base.CreateAssets(parameters));
            }

            var importedAssets = new List <AssetItem>();

            foreach (var file in files)
            {
                using (var media = new FFmpegMedia())
                {
                    media.Open(file.ToWindowsPath());

                    var videoStream = media.Streams.OfType <VideoStream>().FirstOrDefault();
                    if (videoStream != null)
                    {
                        var videoItem = ImportVideo(file, videoStream);
                        importedAssets.Add(videoItem);
                    }
                }
            }

            return(MakeUniqueNames(importedAssets));
        }
        protected override IEnumerable <AssetItem> CreateAssets(AssetTemplateGeneratorParameters parameters)
        {
            var sources = parameters.Tags.Get(SourceFilesPathKey);

            if (sources == null)
            {
                return(base.CreateAssets(parameters));
            }

            SpriteSheetAsset asset;

            if (parameters.Description.Id == SpriteSheetId)
            {
                asset = SpriteSheetSprite2DFactory.Create();
            }
            else if (parameters.Description.Id == UISpriteSheetId)
            {
                asset = SpriteSheetUIFactory.Create();
            }
            else
            {
                throw new ArgumentException("Invalid template description for this generator.");
            }

            using (var textureTool = new TextureTool())
            {
                foreach (var source in sources)
                {
                    int width  = 0;
                    int height = 0;
                    parameters.Logger.Verbose($"Processing image \"{source}\"");
                    try
                    {
                        var image = textureTool.Load(source.ToString(), false);
                        width  = image.Width;
                        height = image.Height;
                    }
                    catch (Exception)
                    {
                        parameters.Logger.Warning($"Unable to retrieve the size of \"{source}\"");
                    }
                    var spriteInfo = new SpriteInfo
                    {
                        Name          = source.GetFileNameWithoutExtension(),
                        TextureRegion = new Rectangle(0, 0, width, height),
                        Source        = source
                    };
                    asset.Sprites.Add(spriteInfo);
                }
            }

            return(new AssetItem(GenerateLocation(parameters), asset).Yield());
        }
        protected override async Task <bool> PrepareAssetCreation(AssetTemplateGeneratorParameters parameters)
        {
            if (!await base.PrepareAssetCreation(parameters))
            {
                return(false);
            }

            var modelViewModel = await BrowseForAsset(parameters.Package, new[] { typeof(IModelAsset) }, new UFile(parameters.Name).GetFullDirectory(), "Select a model to use to generate the hull - _cancel to leave the model empty_");

            var model = ContentReferenceHelper.CreateReference <Model>(modelViewModel);

            parameters.SetTag(ModelKey, model);
            return(true);
        }
Пример #11
0
        protected override IEnumerable <AssetItem> CreateAssets(AssetTemplateGeneratorParameters parameters)
        {
            // Find default graphics compositor to create a derived asset from
            var graphicsCompositor = SupportedTemplatesToUrl.TryGetValue(parameters.Description.Id, out var graphicsCompositorUrl) ? parameters.Package.FindAsset(graphicsCompositorUrl) : null;

            // Something went wrong, create an empty asset
            if (graphicsCompositor == null)
            {
                return(base.CreateAssets(parameters));
            }

            // Create derived asset
            return(new[] { new AssetItem(GenerateLocation(parameters), graphicsCompositor.CreateDerivedAsset()) });
        }
        protected override async Task <bool> PrepareAssetCreation(AssetTemplateGeneratorParameters parameters)
        {
            if (!await base.PrepareAssetCreation(parameters))
            {
                return(false);
            }

            var acceptedTypes     = AssetRegistry.GetAssetTypes(typeof(Material));
            var materialViewModel = await BrowseForAsset(parameters.Package, acceptedTypes, new UFile(parameters.Name).GetFullDirectory(), "Select a material to use for this model - _cancel to leave the material empty_");

            var material = ContentReferenceHelper.CreateReference <Material>(materialViewModel);

            parameters.SetTag(MaterialKey, material);
            return(true);
        }
        protected override IEnumerable <AssetItem> CreateAssets(AssetTemplateGeneratorParameters parameters)
        {
            // Find default graphics compositor to create a derived asset from
            var graphicsCompositorUrl = parameters.Description.Id == Level9TemplateId ? XenkoPackageUpgrader.DefaultGraphicsCompositorLevel9Url : XenkoPackageUpgrader.DefaultGraphicsCompositorLevel10Url;
            var graphicsCompositor    = parameters.Package.FindAsset(graphicsCompositorUrl);

            // Something went wrong, create an empty asset
            if (graphicsCompositor == null)
            {
                return(base.CreateAssets(parameters));
            }

            // Create derived asset
            return(new[] { new AssetItem(GenerateLocation(parameters), graphicsCompositor.CreateDerivedAsset()) });
        }
        protected override async Task <bool> PrepareAssetCreation(AssetTemplateGeneratorParameters parameters)
        {
            if (!await base.PrepareAssetCreation(parameters))
            {
                return(false);
            }

            var acceptedTypes    = AssetRegistry.GetAssetTypes(typeof(Texture));
            var textureViewModel = await BrowseForAsset(parameters.Package, acceptedTypes, new UFile(parameters.Name).GetFullDirectory(), "Select a cubemap texture to use for this skybox - _cancel to leave the texture empty_");

            var texture = ContentReferenceHelper.CreateReference <Texture>(textureViewModel);

            parameters.SetTag(TextureKey, texture);
            return(true);
        }
Пример #15
0
        protected override async Task <bool> PrepareAssetCreation(AssetTemplateGeneratorParameters parameters)
        {
            if (!parameters.Unattended)
            {
                var window = new ScriptNameWindow(parameters.Description.DefaultOutputName, parameters.Namespace);
                await window.ShowModal();

                if (window.Result == DialogResult.Cancel)
                {
                    return(false);
                }

                parameters.Namespace = window.Namespace;
                parameters.Tags.Set(ClassNameKey, window.ClassName);

                var ask = Xenko.Core.Assets.Editor.Settings.EditorSettings.AskBeforeSavingNewScripts.GetValue();
                if (ask)
                {
                    var buttons = DialogHelper.CreateButtons(new[]
                    {
                        Tr._p("Button", "Save"),
                        Tr._p("Button", "Cancel")
                    }, 1, 2);
                    var message        = Tr._p("Message", "You can't use scripts until you save them. Do you want to save now?");
                    var checkedMessage = Xenko.Core.Assets.Editor.Settings.EditorSettings.AlwaysSaveNewScriptsWithoutAsking;
                    var result         = await EditorViewModel.Instance.ServiceProvider.Get <IDialogService>().CheckedMessageBox(message, false, checkedMessage, buttons, MessageBoxImage.Question);

                    if (result.IsChecked == true)
                    {
                        Xenko.Core.Assets.Editor.Settings.EditorSettings.AskBeforeSavingNewScripts.SetValue(false);
                        Xenko.Core.Assets.Editor.Settings.EditorSettings.Save();
                    }
                    parameters.Tags.Set(SaveSessionKey, result.Result == 1);
                }
                else
                {
                    parameters.Tags.Set(SaveSessionKey, true);
                }
            }
            else
            {
                // TODO: Some templates save, some don't (and behavior can even change in Unattended mode)
                // For consistency, should this be moved to a common parameters.Saving?
                parameters.Tags.Set(SaveSessionKey, false);
            }

            return(true);
        }
Пример #16
0
        protected override IEnumerable <AssetItem> CreateAssets(AssetTemplateGeneratorParameters parameters)
        {
            var desc       = parameters.Description;
            var scriptFile = Path.ChangeExtension(desc.FullPath, HtmlFileAsset.Extension);

            var scriptContent = File.ReadAllText(scriptFile);

            parameters.Name = parameters.Tags.Get(ClassNameKey);
            var location = GenerateLocation(parameters);

            scriptContent = scriptContent.Replace("##Scriptname##", location.GetFileNameWithoutExtension());

            var asset = (HtmlFileAsset)ObjectFactoryRegistry.NewInstance(typeof(HtmlFileAsset));

            asset.Id   = SourceCodeAsset.GenerateIdFromLocation(parameters.Package.Meta.Name, location);
            asset.Text = scriptContent;
            yield return(new AssetItem(location, asset));
        }
        protected override IEnumerable <AssetItem> CreateAssets(AssetTemplateGeneratorParameters parameters)
        {
            var desc = parameters.Description as TemplateAssetFactoryDescription;

            if (desc == null)
            {
                yield break;
            }

            var factory = desc.GetFactory();

            if (factory == null)
            {
                throw new InvalidOperationException("Unable to find the asset factory associated to this template.");
            }

            var asset = factory.New();

            yield return(new AssetItem(GenerateLocation(parameters), asset));
        }
Пример #18
0
        protected override async Task <bool> PrepareAssetCreation(AssetTemplateGeneratorParameters parameters)
        {
            var description = (TemplateAssetDescription)parameters.Description;
            var assetType   = description.GetAssetType();
            var files       = parameters.SourceFiles.Count > 0 ? parameters.SourceFiles : await BrowseForSourceFiles(description, true);

            while (files == null)
            {
                var assetTypeName = TypeDescriptorFactory.Default.AttributeRegistry.GetAttribute <DisplayAttribute>(assetType)?.Name ?? assetType.Name;
                var buttons       = DialogHelper.CreateButtons(new[]
                {
                    Tr._p("Button", "Create"),
                    Tr._p("Button", "Select a source..."),
                    Tr._p("Button", "Cancel")
                }, 1, 3);
                var result = await DialogHelper.MessageBox(DispatcherService.Create(),
                                                           string.Format(Tr._p("Message", "Do you want to create this {0} without a source file?"), assetTypeName),
                                                           EditorViewModel.Instance.EditorName, buttons, MessageBoxImage.Question);

                // Close without clicking a button or Cancel
                if (result == 0 || result == 3)
                {
                    return(false);
                }

                // Create without source
                if (result == 1)
                {
                    break;
                }

                // Display the file picker again
                files = await BrowseForSourceFiles(description, true);
            }

            parameters.Tags.Add(SourceFilesPathKey, files);
            return(await base.PrepareAssetCreation(parameters));
        }
Пример #19
0
 protected override void PostAssetCreation(AssetTemplateGeneratorParameters parameters, AssetItem assetItem)
 {
     parameters.RequestSessionSave = parameters.TryGetTag(SaveSessionKey);
 }
Пример #20
0
        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);
        }
        protected override async Task <bool> PrepareAssetCreation(AssetTemplateGeneratorParameters parameters)
        {
            var result = await base.PrepareAssetCreation(parameters);

            if (!result)
            {
                return(false);
            }

            var files = parameters.Tags.Get(SourceFilesPathKey);

            if (files is null)
            {
                return(true);
            }

            var showDeduplicateMaterialsCheckBox = files.Any(x => ImportAssimpCommand.IsSupportingExtensions(x.GetFileExtension()));
            var showFbxDedupeNotSupportedWarning = showDeduplicateMaterialsCheckBox && files.Any(x => ImportFbxCommand.IsSupportingExtensions(x.GetFileExtension()));
            // Load settings from the last time this template was used for this project
            var profile = parameters.Package.UserSettings.Profile;
            var window  = new ModelAssetTemplateWindow
            {
                Parameters =
                {
                    ImportMaterials                  = ModelFromFileTemplateSettings.ImportMaterials.GetValue(profile,      true),
                    ShowDeduplicateMaterialsCheckBox = showDeduplicateMaterialsCheckBox,
                    ShowFbxDedupeNotSupportedWarning = showFbxDedupeNotSupportedWarning,
                    DeduplicateMaterials             = ModelFromFileTemplateSettings.DeduplicateMaterials.GetValue(profile, true),
                    ImportTextures = ModelFromFileTemplateSettings.ImportTextures.GetValue(profile,       true),
                    ImportSkeleton = ModelFromFileTemplateSettings.ImportSkeleton.GetValue(profile,       true)
                }
            };

            var skeletonId = ModelFromFileTemplateSettings.DefaultSkeleton.GetValue();
            var skeleton   = SessionViewModel.Instance?.GetAssetById(skeletonId);

            if (skeleton != null)
            {
                window.Parameters.ReuseSkeleton   = true;
                window.Parameters.SkeletonToReuse = ContentReferenceHelper.CreateReference <Skeleton>(skeleton);
            }

            await window.ShowModal();

            if (window.Result == DialogResult.Cancel)
            {
                return(false);
            }

            // Apply settings
            var skeletonToReuse = window.Parameters.ReuseSkeleton ? window.Parameters.SkeletonToReuse : null;

            parameters.Tags.Set(ImportMaterialsKey, window.Parameters.ImportMaterials);
            parameters.Tags.Set(DeduplicateMaterialsKey, window.Parameters.DeduplicateMaterials);
            parameters.Tags.Set(ImportTexturesKey, window.Parameters.ImportTextures);
            parameters.Tags.Set(ImportSkeletonKey, window.Parameters.ImportSkeleton);
            parameters.Tags.Set(SkeletonToUseKey, skeletonToReuse);

            // Save settings
            ModelFromFileTemplateSettings.ImportMaterials.SetValue(window.Parameters.ImportMaterials, profile);
            ModelFromFileTemplateSettings.DeduplicateMaterials.SetValue(window.Parameters.DeduplicateMaterials, profile);
            ModelFromFileTemplateSettings.ImportTextures.SetValue(window.Parameters.ImportTextures, profile);
            ModelFromFileTemplateSettings.ImportSkeleton.SetValue(window.Parameters.ImportSkeleton, profile);
            skeletonId = AttachedReferenceManager.GetAttachedReference(skeletonToReuse)?.Id ?? AssetId.Empty;
            ModelFromFileTemplateSettings.DefaultSkeleton.SetValue(skeletonId, profile);
            parameters.Package.UserSettings.Save();

            return(true);
        }
Пример #22
0
        private void CreateCameraScript(SessionTemplateGeneratorParameters parameters, Package package, ProjectReference projectGameReference, string projectGameName, Entity cameraEntity, AssetItem sceneAssetItem)
        {
            var logger = parameters.Logger;

            // 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(projectGameName)
            {
                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);

            parameters.Logger.Verbose("Restore NuGet packages...");
            VSProjectHelper.RestoreNugetPackages(parameters.Logger, parameters.Session.SolutionPath).Wait();

            logger.Verbose("Compiling game assemblies...");
            parameters.Session.UpdateAssemblyReferences(logger);

            if (package.State < PackageState.DependenciesReady)
            {
                logger.Warning("Assembly references were not compiled properly");
                return;
            }
            logger.Verbose("Game assemblies compiled...");

            // Create the Camera script in Camera entity
            // Since we rely on lot of string check, added some null checking and try/catch to not crash the apps in case something went wrong
            // We only emit warnings rather than errors, so that the user could continue
            try
            {
                var gameAssembly = package.LoadedAssemblies.FirstOrDefault(x => x.ProjectReference == projectGameReference)?.Assembly;
                if (gameAssembly == null)
                {
                    logger.Warning("Can't load Game assembly");
                    return;
                }

                var cameraScriptType = package.LoadedAssemblies.First(x => x.ProjectReference == projectGameReference).Assembly.GetType($"{parameters.Namespace}.{CameraScriptDefaultOutputName}");
                if (cameraScriptType == null)
                {
                    logger.Warning($"Could not find script '{CameraScriptDefaultOutputName}' in Game assembly");
                    return;
                }

                cameraEntity.Add((EntityComponent)Activator.CreateInstance(cameraScriptType));
                sceneAssetItem.IsDirty = true;
            }
            catch (Exception e)
            {
                logger.Warning($"Could not instantiate {CameraScriptDefaultOutputName} script", e);
            }
        }
Пример #23
0
        protected override async Task <bool> PrepareAssetCreation(AssetTemplateGeneratorParameters parameters)
        {
            if (!parameters.Unattended)
            {
                string defaultClassName = parameters.Description.DefaultOutputName;

                if (parameters.Tags.TryGetValue(DefaultClassNameKey, out string className) && !string.IsNullOrEmpty(className))
                {
                    defaultClassName = className;
                }

                bool enableTemplateSelect = parameters.TryGetTag(EnableTemplateSelectKey);

                IEnumerable <TemplateAssetDescription> scriptTemplates = null;

                if (enableTemplateSelect)
                {
                    scriptTemplates = GetScriptTemplateAssetDescriptions(TemplateManager.FindTemplates(TemplateScope.Asset, parameters.Package.Session));
                }

                var window = new ScriptNameWindow(defaultClassName, parameters.Namespace, parameters.Description as TemplateAssetDescription, enableTemplateSelect, scriptTemplates);

                await window.ShowModal();

                if (window.Result == DialogResult.Cancel)
                {
                    return(false);
                }

                parameters.Namespace = window.Namespace;
                parameters.Tags.Set(ClassNameKey, window.ClassName);
                parameters.Description = window.ScriptTemplate;

                var ask = Stride.Core.Assets.Editor.Settings.EditorSettings.AskBeforeSavingNewScripts.GetValue();
                if (ask)
                {
                    var buttons = DialogHelper.CreateButtons(new[]
                    {
                        Tr._p("Button", "Save"),
                        Tr._p("Button", "Cancel")
                    }, 1, 2);
                    var message        = Tr._p("Message", "You can't use scripts until you save them. Do you want to save now?");
                    var checkedMessage = Stride.Core.Assets.Editor.Settings.EditorSettings.AlwaysSaveNewScriptsWithoutAsking;
                    var result         = await EditorViewModel.Instance.ServiceProvider.Get <IDialogService>().CheckedMessageBox(message, false, checkedMessage, buttons, MessageBoxImage.Question);

                    if (result.IsChecked == true)
                    {
                        Stride.Core.Assets.Editor.Settings.EditorSettings.AskBeforeSavingNewScripts.SetValue(false);
                        Stride.Core.Assets.Editor.Settings.EditorSettings.Save();
                    }
                    parameters.Tags.Set(SaveSessionKey, result.Result == 1);
                }
                else
                {
                    parameters.Tags.Set(SaveSessionKey, true);
                }
            }
            else
            {
                // TODO: Some templates save, some don't (and behavior can even change in Unattended mode)
                // For consistency, should this be moved to a common parameters.Saving?
                parameters.Tags.Set(SaveSessionKey, false);
            }

            return(true);
        }
Пример #24
0
 public static void SetClassName(AssetTemplateGeneratorParameters parameters, string className) => parameters.Tags.Set(ClassNameKey, className);