Пример #1
0
        /// <summary>
        /// Loads the block from a file of virtual file system.
        /// </summary>
        /// <param name="path">The virtual file path.</param>
        /// <param name="errorString">The information on an error.</param>
        /// <returns><see cref="NeoAxis.DataBlock"/> if the block has been loaded; otherwise, <b>null</b>.</returns>
        public static DataBlock LoadFromVirtualFile(string path, out string errorString)
        {
            errorString = null;

            if (!VirtualFile.Exists(path))
            {
                errorString = string.Format("File not found \"{0}\".", path);
                return(null);
            }

            try
            {
                byte[] data = VirtualFile.ReadAllBytes(path);

                string    error;
                DataBlock dataBlock = DataBlock.Parse(data, false, out error);
                if (dataBlock == null)
                {
                    errorString = string.Format("Parsing data block failed \"{0}\" ({1}).",
                                                path, error);
                }

                return(dataBlock);
            }
            catch (Exception)
            {
                errorString = string.Format("Reading file failed \"{0}\".", path);
                return(null);
            }
        }
Пример #2
0
            protected override void Load()
            {
                if (Owner.LoadedBlock == null)
                {
                    var settingsFileName = Owner.Name + ".settings";
                    if (VirtualFile.Exists(settingsFileName))
                    {
                        //!!!!check errors
                        var block = TextBlockUtility.LoadFromVirtualFile(settingsFileName);

                        Owner.LoadedBlock = block;
                    }
                    else
                    {
                        //!!!!так?

                        var block = new TextBlock();
                        var child = block.AddChild(".component", MetadataManager.GetTypeOfNetType(typeof(Component_Font)).Name);

                        //default configuration
                        var b1 = child.AddChild("CharacterRanges");
                        var b2 = b1.AddChild("Value");
                        b2.SetAttribute("Count", "2");
                        b2.SetAttribute("0", "32 127");
                        b2.SetAttribute("1", "160 191");

                        Owner.LoadedBlock = block;
                    }
                }

                base.Load();
            }
        public void ComponentCreate()
        {
            ComponentDestroy();

            if (EnabledInHierarchyAndIsNotResource)
            {
                var fileName = LoadFile.GetByReference;
                if (!string.IsNullOrEmpty(fileName) && VirtualFile.Exists(fileName))
                {
                    createdComponent = ResourceManager.LoadSeparateInstance <Component>(fileName, true, null);
                }
                else
                {
                    var type = CreateType.Value;
                    if (type != null)
                    {
                        createdComponent = ComponentUtility.CreateComponent(type, null, true, true);
                    }
                }

                if (createdComponent != null)
                {
                    ComponentCreated?.Invoke(this);
                }
            }
        }
        static bool fileExists(string fileName)
        {
            //!!!!!right?
            EngineThreading.CheckMainThread();

            ////watermark
            //if( fileName == WmImage.GetName() )
            //   return true;
            return(VirtualFile.Exists(fileName));
        }
Пример #5
0
        void ProcessCubemaps()
        {
            processedEnvironmentCubemap = null;
            processedIrradianceCubemap  = null;

            var sourceFileName = Cubemap.Value?.LoadFile.Value?.ResourceName;

            if (string.IsNullOrEmpty(sourceFileName))
            {
                var getByReference = Cubemap.GetByReference;
                if (!string.IsNullOrEmpty(getByReference))
                {
                    try
                    {
                        if (Path.GetExtension(getByReference) == ".image")
                        {
                            sourceFileName = getByReference;
                        }
                    }
                    catch { }
                }
            }

            if (!string.IsNullOrEmpty(sourceFileName))
            {
                bool skip = false;
                if (sourceFileName.Length > 11)
                {
                    var s = sourceFileName.Substring(sourceFileName.Length - 11);
                    if (s == "_GenEnv.dds" || s == "_GenIrr.dds")
                    {
                        skip = true;
                    }
                }

                if (!skip)
                {
                    if (!CubemapProcessing.GetOrGenerate(sourceFileName, false, 0, out var envVirtualFileName, out var irrVirtualFileName, out var error))
                    {
                        Log.Error(error);
                        return;
                    }

                    if (VirtualFile.Exists(envVirtualFileName))
                    {
                        processedEnvironmentCubemap = ResourceManager.LoadResource <Component_Image>(envVirtualFileName);
                    }
                    if (VirtualFile.Exists(irrVirtualFileName))
                    {
                        processedIrradianceCubemap = ResourceManager.LoadResource <Component_Image>(irrVirtualFileName);
                    }
                }
            }
        }
Пример #6
0
		void SceneCreate( Component_Scene source )
		{
			SceneDestroy();

			var fileName = ComponentUtility.GetOwnedFileNameOfComponent( source );
			if( !string.IsNullOrEmpty( fileName ) && VirtualFile.Exists( fileName ) )
				createdScene = ResourceManager.LoadSeparateInstance<Component>( fileName, true, null ) as Component_Scene;

			if( createdScene != null )
				SceneCreated?.Invoke( this );

			createdSceneSource = source;
		}
Пример #7
0
        bool InitInternal(string language, bool localizeEngine)
        {
            this.language       = language;
            this.localizeEngine = localizeEngine;

            //alternative loader
            TextBlock rootBlock = null;
            bool      error2    = false;

            if (AlternativeLanguageFileLoaderHandler != null)
            {
                AlternativeLanguageFileLoaderHandler(ref rootBlock, ref error2);
            }
            if (error2)
            {
                return(false);
            }

            //default loader
            if (rootBlock == null)
            {
                //!!!!локализация дополнений
                //!!!!!еще можно изменить Engine.language. сделать уровни видать.

                //!!!!!!
                string fileName = Path.Combine(Path.Combine(LanguagesDirectory, language), "Engine.language");
                if (VirtualFile.Exists(fileName))
                {
                    string error;
                    rootBlock = TextBlockUtility.LoadFromVirtualFile(fileName, out error);
                    if (rootBlock == null)
                    {
                        Log.Fatal("Parsing file failed \"{0}\" ({1}).", fileName, error);
                        return(false);
                    }
                }
            }

            if (rootBlock != null)
            {
                ParseLanguageTextBlock(rootBlock);
            }

            return(true);
        }
Пример #8
0
            //public Sound Sound
            //{
            //	get { return sound; }
            //}

            //Sound GetSoundByMode( SoundModes mode )
            //{
            //	soundByMode.TryGetValue( mode, out var sound );
            //	return sound;
            //}

            public Sound LoadSoundByMode(SoundModes mode)
            {
                if (!soundByMode.TryGetValue(mode, out var sound))
                {
                    //!!!!threading

                    var v            = owner.LoadFile.Value;
                    var resourceName = v != null ? v.ResourceName : "";

                    if (VirtualFile.Exists(resourceName))
                    {
                        sound = SoundWorld.SoundCreate(resourceName, mode);
                    }

                    soundByMode.Add(mode, sound);
                }
                return(sound);
            }
        public static string GetParameter(string virtualTextureFileName, string parameterName, out string error)
        {
            string fileName = virtualTextureFileName + ".settings";

            if (!VirtualFile.Exists(fileName))
            {
                error = "";
                return("");
            }

            var block = TextBlockUtility.LoadFromVirtualFile(fileName, out error);

            if (block == null)
            {
                return("");
            }

            error = "";
            return(block.GetAttribute(parameterName));
        }
Пример #10
0
            protected override void Load()
            {
                if (Owner.LoadedBlock == null)
                {
                    var settingsFileName = Owner.Name + ".settings";
                    if (VirtualFile.Exists(settingsFileName))
                    {
                        var block = TextBlockUtility.LoadFromVirtualFile(settingsFileName);
                        Owner.LoadedBlock = block;
                    }
                    else
                    {
                        var block = new TextBlock();
                        var child = block.AddChild(".component", MetadataManager.GetTypeOfNetType(typeof(Component_Import3D)).Name);

                        Owner.LoadedBlock = block;
                    }
                }

                base.Load();
            }
Пример #11
0
        /// <summary>
        /// Reads a value from \'ProjectSettings.component\' without loading it as component. The method can be used to load data before engine initialized.
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        public static string ReadParameterFromFile(string parameter, string defaultValue = "")
        {
            if (VirtualFile.Exists(FileName))
            {
                try
                {
                    var key = parameter + " = ";

                    foreach (var line in VirtualFile.ReadAllLines(FileName))
                    {
                        var index = line.IndexOf(key);
                        if (index != -1)
                        {
                            return(line.Substring(index + key.Length));
                        }
                    }
                }
                catch { }
            }
            return(defaultValue);
        }
Пример #12
0
        static void ReadCachedInfoFile(string destFileNameBase, out string sourceFileHash, out int sourceFileSize)          //, out PixelFormat sourceFileFormat )
        {
            sourceFileHash = "";
            sourceFileSize = 0;
            //sourceFileFormat = PixelFormat.Unknown;

            GetDestFileNames(destFileNameBase, out var infoFileName, out var envFileName, out var irrFileName);

            if (VirtualFile.Exists(envFileName) && VirtualFile.Exists(irrFileName))
            {
                var block = TextBlockUtility.LoadFromVirtualFile(infoFileName, out _);
                if (block != null)
                {
                    try
                    {
                        sourceFileHash = block.GetAttribute("SourceFileHash");
                        sourceFileSize = int.Parse(block.GetAttribute("SourceFileSize"));
                        //sourceFileFormat = (PixelFormat)Enum.Parse( typeof( PixelFormat ), block.GetAttribute( "SourceFileFormat" ) );
                    }
                    catch { }
                }
            }
        }
Пример #13
0
        protected override void OnResultCompile()
        {
            if (Result == null)
            {
                GpuTexture result = null;

                PixelFormat createFormatV = CreateFormat;
                if (createFormatV != PixelFormat.Unknown)
                {
                    //create

                    Vector2I size = CreateSize;
                    if (size.X > 0 && size.Y > 0)
                    {
                        //!!!!!что еще проверить?

                        //!!!!3d support

                        TypeEnum type        = CreateType;
                        bool     mipmaps     = CreateMipmaps;
                        int      arrayLayers = CreateArrayLayers;
                        Usages   usage       = CreateUsage;
                        int      fsaa        = CreateFSAA;

                        int depth;
                        if (type == TypeEnum._2D)
                        {
                            depth = 1;
                        }
                        else if (type == TypeEnum.Cube)
                        {
                            depth = 6;
                        }
                        else
                        {
                            depth = CreateDepth;
                        }

                        GpuTexture.Usages gpuUsage = 0;
                        if ((usage & Usages.Dynamic) != 0)
                        {
                            gpuUsage |= GpuTexture.Usages.Dynamic;
                        }
                        else
                        {
                            gpuUsage |= GpuTexture.Usages.Static;
                        }
                        if ((usage & Usages.WriteOnly) != 0)
                        {
                            gpuUsage |= GpuTexture.Usages.WriteOnly;
                        }
                        if ((usage & Usages.AutoMipmaps) != 0)
                        {
                            gpuUsage |= GpuTexture.Usages.AutoMipmap;
                        }
                        if ((usage & Usages.RenderTarget) != 0)
                        {
                            gpuUsage |= GpuTexture.Usages.RenderTarget;
                        }
                        if ((usage & Usages.ReadBack) != 0)
                        {
                            gpuUsage |= GpuTexture.Usages.ReadBack;
                        }
                        if ((usage & Usages.BlitDestination) != 0)
                        {
                            gpuUsage |= GpuTexture.Usages.BlitDestination;
                        }

                        //!!!!!почему для других не Discardable?
                        if ((gpuUsage & GpuTexture.Usages.Dynamic) != 0 && (gpuUsage & GpuTexture.Usages.WriteOnly) != 0)
                        {
                            gpuUsage |= GpuTexture.Usages.DynamicWriteOnlyDiscardable;
                        }

                        result = new GpuTexture(type, size, depth, mipmaps, arrayLayers, createFormatV, gpuUsage, fsaa, out var error2);
                        if (!string.IsNullOrEmpty(error2))
                        {
                            result.Dispose();
                            result = null;

                            Log.Warning("Unable to create texture. " + error2);
                        }
                    }
                }
                else
                {
                    //load

                    //!!!!3d support

                    //!!!!!проверять наличие файла. если нет, то он по дефолту создает 512 512 Unknown формат. это какая-то хрень. надо разрулить

                    //!!!!threading


                    //!!!!!каждый раз проверять будет если нет файла. где еще так?

                    string[] loadCubeMap6Files = null;
                    string   loadFromOneFile   = null;

                    if (AnyCubemapSideIsSpecified())
                    {
                        if (AllCubemapSidesAreaSpecified())
                        {
                            loadCubeMap6Files = new string[6];
                            for (int n = 0; n < 6; n++)
                            {
                                var v = GetLoadCubeSide(n);
                                if (v != null)
                                {
                                    loadCubeMap6Files[n] = v.ResourceName;
                                }

                                if (string.IsNullOrEmpty(loadCubeMap6Files[n]) || !VirtualFile.Exists(loadCubeMap6Files[n]))
                                {
                                    loadCubeMap6Files = null;
                                    break;
                                }
                            }
                        }
                    }
                    else
                    {
                        var v = LoadFile.Value;
                        loadFromOneFile = v != null ? v.ResourceName : "";
                        if (string.IsNullOrEmpty(loadFromOneFile) || !VirtualFile.Exists(loadFromOneFile))
                        {
                            loadFromOneFile = null;
                        }
                    }

                    //!!!!
                    //bool RenderToTexture = false;
                    //if( RenderToTexture )
                    //	result = RenderToTextureTest();
                    //else
                    if (loadFromOneFile != null)
                    {
                        result = LoadOneTexture(loadFromOneFile);
                    }
                    else if (loadCubeMap6Files != null)
                    {
                        result = LoadCubeTexture(loadCubeMap6Files);
                    }
                }

                Result = result;
            }
        }
        public static bool SetParameter(string virtualTextureFileName, string parameterName, string parameterValue, out string error)
        {
            string fileName = virtualTextureFileName + ".settings";

            if (!VirtualFile.Exists(fileName) && string.IsNullOrEmpty(parameterValue))
            {
                //no sense to update
                error = "";
                return(true);
            }

            TextBlock block = null;

            if (VirtualFile.Exists(fileName))
            {
                block = TextBlockUtility.LoadFromVirtualFile(fileName, out error);
                if (block == null)
                {
                    return(false);
                }
            }
            else
            {
                block = new TextBlock();
            }

            if (!string.IsNullOrEmpty(parameterValue))
            {
                block.SetAttribute(parameterName, parameterValue);
            }
            else
            {
                block.DeleteAttribute(parameterName);
            }

            if (block.Children.Count != 0 || block.Attributes.Count != 0)
            {
                if (!TextBlockUtility.SaveToVirtualFile(block, fileName, out error))
                {
                    return(false);
                }
            }
            else
            {
                if (VirtualFile.Exists(fileName))
                {
                    try
                    {
                        File.Delete(VirtualPathUtility.GetRealPathByVirtual(fileName));
                    }
                    catch (Exception e)
                    {
                        error = e.Message;
                        return(false);
                    }
                }
            }

            error = "";
            return(true);
        }
Пример #15
0
        static bool Generate(string sourceFileName, string sourceFileHash, int sourceFileSize, int specifiedSize, out string error)
        {
            var text         = $"Generating cubemap \"{Path.GetFileName( sourceFileName )}\"...";
            var notification = Editor.ScreenNotifications.ShowSticky(text);

            var destFileNameBase = GetDestFileNameBase(sourceFileName);

            GetDestFileNames(destFileNameBase, out var infoFileName, out var envFileName, out var irrFileName);

            string temporaryGeneratedFile = "";

            try
            {
                var sourceRealFileName = VirtualPathUtility.GetRealPathByVirtual(sourceFileName);
                {
                    //convert .image to 6 face HDR image

                    if (Path.GetExtension(sourceRealFileName) == ".image")
                    {
                        var image = ResourceManager.LoadResource <Component_Image>(sourceFileName, out error);
                        if (image == null)
                        {
                            return(false);
                        }

                        string[] loadCubeMap6Files = null;
                        string   loadFromOneFile   = null;
                        {
                            if (image.AnyCubemapSideIsSpecified())
                            {
                                if (image.AllCubemapSidesAreaSpecified())
                                {
                                    loadCubeMap6Files = new string[6];
                                    for (int n = 0; n < 6; n++)
                                    {
                                        var v = image.GetLoadCubeSide(n);
                                        if (v != null)
                                        {
                                            loadCubeMap6Files[n] = v.ResourceName;
                                        }

                                        if (string.IsNullOrEmpty(loadCubeMap6Files[n]) || !VirtualFile.Exists(loadCubeMap6Files[n]))
                                        {
                                            loadCubeMap6Files = null;
                                            break;
                                        }
                                    }
                                }
                            }
                            else
                            {
                                var v = image.LoadFile.Value;
                                loadFromOneFile = v != null ? v.ResourceName : "";
                                if (string.IsNullOrEmpty(loadFromOneFile) || !VirtualFile.Exists(loadFromOneFile))
                                {
                                    loadFromOneFile = null;
                                }
                            }
                        }

                        if (loadFromOneFile != null)
                        {
                            sourceRealFileName = VirtualPathUtility.GetRealPathByVirtual(loadFromOneFile);
                        }
                        else if (loadCubeMap6Files != null)
                        {
                            temporaryGeneratedFile = Path.GetTempPath() + Guid.NewGuid().ToString() + ".hdr";
                            sourceRealFileName     = temporaryGeneratedFile;

                            ImageUtility.Image2D image2D = null;

                            for (int face = 0; face < 6; face++)
                            {
                                if (!ImageUtility.LoadFromVirtualFile(loadCubeMap6Files[face], out var data, out var size, out _, out var format, out _, out _, out error))
                                {
                                    return(false);
                                }

                                if (image2D == null)
                                {
                                    image2D = new ImageUtility.Image2D(PixelFormat.Float32RGB, size * new Vector2I(4, 3));
                                }

                                Vector2I index = Vector2I.Zero;
                                switch (face)
                                {
                                case 0: index = new Vector2I(2, 1); break;

                                case 1: index = new Vector2I(0, 1); break;

                                case 2: index = new Vector2I(1, 0); break;

                                case 3: index = new Vector2I(1, 2); break;

                                case 4: index = new Vector2I(1, 1); break;

                                case 5: index = new Vector2I(3, 1); break;
                                }

                                var faceImage = new ImageUtility.Image2D(format, size, data);
                                image2D.Blit(index * size, faceImage);
                            }

                            if (!ImageUtility.Save(temporaryGeneratedFile, image2D.Data, image2D.Size, 1, image2D.Format, 1, 0, out error))
                            {
                                return(false);
                            }
                        }
                        else
                        {
                            error = "The image wrong configured.";
                            return(false);
                        }
                    }
                }

                int sizeEnv = 32;
                if (specifiedSize == 0)
                {
                    //detect size

                    if (!ImageUtility.LoadFromRealFile(sourceRealFileName, out _, out var sourceSize, out _, out _, out _, out _, out error))
                    {
                        return(false);
                    }

                    //!!!!если кубемапа

                    if (Math.Abs((double)sourceSize.X / (double)sourceSize.Y - 1.333333) <= 0.001)
                    {
                        sizeEnv = sourceSize.X / 4;
                    }
                    else
                    {
                        //!!!!
                        sizeEnv = MathEx.NextPowerOfTwo(sourceSize.X / 3);
                    }

                    if (sizeEnv == 0)
                    {
                        sizeEnv = 1;
                    }
                }
                else
                {
                    sizeEnv = specifiedSize;
                }

                int sizeIrr = 32;

                var destRealFileNameBase = VirtualPathUtility.GetRealPathByVirtual(destFileNameBase);
                var infoRealFileName     = VirtualPathUtility.GetRealPathByVirtual(infoFileName);
                var envRealFileName      = VirtualPathUtility.GetRealPathByVirtual(envFileName);
                var irrRealFileName      = VirtualPathUtility.GetRealPathByVirtual(irrFileName);

                //delete old files
                if (File.Exists(infoRealFileName))
                {
                    File.Delete(infoRealFileName);
                }
                if (File.Exists(envRealFileName))
                {
                    File.Delete(envRealFileName);
                }
                if (File.Exists(irrRealFileName))
                {
                    File.Delete(irrRealFileName);
                }

                var destDirectory = Path.GetDirectoryName(destRealFileNameBase);
                if (!Directory.Exists(destDirectory))
                {
                    Directory.CreateDirectory(destDirectory);
                }

                var irradianceValues = new List <Vector3>();

                if (!GenerateFile(sourceRealFileName, false, sizeEnv, envRealFileName, irradianceValues, out error))
                {
                    return(false);
                }
                if (!GenerateFile(sourceRealFileName, true, sizeIrr, irrRealFileName, null, out error))
                {
                    return(false);
                }

                //make .info file
                {
                    var block = new TextBlock();
                    block.SetAttribute("SourceFileHash", sourceFileHash);
                    block.SetAttribute("SourceFileSize", sourceFileSize.ToString());
                    //block.SetAttribute( "SourceFileFormat", sourceFileFormat.ToString() );

                    for (int n = 0; n < irradianceValues.Count; n++)
                    {
                        block.SetAttribute("Irradiance" + n.ToString(), irradianceValues[n].ToString());
                    }

                    if (!TextBlockUtility.SaveToRealFile(block, infoRealFileName, out error))
                    {
                        return(false);
                    }
                }
            }
            catch (Exception e)
            {
                error = e.Message;
                return(false);
            }
            finally
            {
                notification.Close();

                try
                {
                    if (File.Exists(temporaryGeneratedFile))
                    {
                        File.Delete(temporaryGeneratedFile);
                    }
                }
                catch { }
            }

            error = "";
            return(true);
        }
        public override void Register()
        {
            //Upload to the Store
            {
                var a = new EditorAction();
                //!!!!
                a.Name = "Prepare for the Store";
                //a.Name = "Upload to the Store";
                a.Description        = "Uploads the selected product or all products in the selected folder to the NeoAxis Store.";
                a.CommonType         = EditorAction.CommonTypeEnum.General;
                a.ImageSmall         = Properties.Resources.Package_16;
                a.ImageBig           = Properties.Resources.Package_32;
                a.QatSupport         = true;
                a.ContextMenuSupport = EditorContextMenuWinForms.MenuTypeEnum.Resources;
                a.RibbonText         = ("Upload", "");

                a.GetState += delegate(EditorAction.GetStateContext context)
                {
                    if (context.ObjectsInFocus.DocumentWindow == null && context.ObjectsInFocus.Objects.Length != 0)
                    {
                        var fileItems = context.ObjectsInFocus.Objects.OfType <ContentBrowserItem_File>();
                        foreach (var fileItem in fileItems)
                        {
                            if (fileItem.IsDirectory)
                            {
                                bool skip = false;

                                if (context.Holder == EditorAction.HolderEnum.ContextMenu)
                                {
                                    var files = Directory.GetFiles(fileItem.FullPath, "*.store", SearchOption.AllDirectories);
                                    if (files.Length == 0)
                                    {
                                        skip = true;
                                    }
                                }

                                if (!skip)
                                {
                                    context.Enabled = true;
                                    break;
                                }
                            }

                            if (!fileItem.IsDirectory && Path.GetExtension(fileItem.FullPath).ToLower() == ".store")
                            {
                                context.Enabled = true;
                                break;
                            }
                        }
                    }
                };

                a.Click += delegate(EditorAction.ClickContext context)
                {
                    if (context.ObjectsInFocus.DocumentWindow == null && context.ObjectsInFocus.Objects.Length != 0)
                    {
                        var realFileNames = new ESet <string>();
                        {
                            var fileItems = context.ObjectsInFocus.Objects.OfType <ContentBrowserItem_File>();
                            foreach (var fileItem in fileItems)
                            {
                                if (fileItem.IsDirectory)
                                {
                                    realFileNames.AddRangeWithCheckAlreadyContained(Directory.GetFiles(fileItem.FullPath, "*.store", SearchOption.AllDirectories));
                                }

                                if (!fileItem.IsDirectory && Path.GetExtension(fileItem.FullPath).ToLower() == ".store")
                                {
                                    realFileNames.AddWithCheckAlreadyContained(fileItem.FullPath);
                                    break;
                                }
                            }
                        }

                        var virtualFileNames = new List <string>();
                        foreach (var realFileName in realFileNames)
                        {
                            var virtualFileName = VirtualPathUtility.GetVirtualPathByReal(realFileName);
                            if (VirtualFile.Exists(virtualFileName))
                            {
                                virtualFileNames.Add(virtualFileName);
                            }
                        }
                        if (virtualFileNames.Count == 0)
                        {
                            return;
                        }

                        var text = "Upload selected products to the store?\n\n";
                        foreach (var fileName in virtualFileNames)
                        {
                            text += fileName + "\n";
                        }
                        if (EditorMessageBox.ShowQuestion(text, EMessageBoxButtons.OKCancel) == EDialogResult.Cancel)
                        {
                            return;
                        }

                        //process
                        var item = ScreenNotifications.ShowSticky("Processing...");
                        try
                        {
                            foreach (var fileName in virtualFileNames)
                            {
                                var res = ResourceManager.LoadResource(fileName, true);
                                if (res != null)
                                {
                                    var product = res.ResultComponent as Component_StoreProduct;
                                    if (product != null)
                                    {
                                        if (!product.BuildArchive())
                                        {
                                            return;
                                        }
                                    }
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            Log.Warning(e.Message);
                            return;
                        }
                        finally
                        {
                            item.Close();
                        }

                        if (virtualFileNames.Count > 1)
                        {
                            ScreenNotifications.Show("The products were prepared successfully.");
                        }
                        else
                        {
                            ScreenNotifications.Show("The product was prepared successfully.");
                        }

                        //open folder in the Explorer
                        Win32Utility.ShellExecuteEx(null, Component_StoreProduct.writeToDirectory);
                    }
                };

                EditorActions.Register(a);
            }
        }