From 2a7d40616dc6d3fbee08f9cff11288518c10e187 Mon Sep 17 00:00:00 2001 From: Perfare Date: Sun, 22 Oct 2017 23:48:31 +0800 Subject: [PATCH] add OpenFolderDialog --- Unity Studio/OpenFolderDialog.cs | 237 +++++++++++++++++++++++ Unity Studio/Unity Studio-x86.csproj | 1 + Unity Studio/Unity Studio.csproj | 1 + Unity Studio/UnityStudioForm.Designer.cs | 23 +-- Unity Studio/UnityStudioForm.cs | 163 +++++++--------- Unity Studio/UnityStudioForm.resx | 52 +++-- 6 files changed, 334 insertions(+), 143 deletions(-) create mode 100644 Unity Studio/OpenFolderDialog.cs diff --git a/Unity Studio/OpenFolderDialog.cs b/Unity Studio/OpenFolderDialog.cs new file mode 100644 index 0000000..2cacc77 --- /dev/null +++ b/Unity Studio/OpenFolderDialog.cs @@ -0,0 +1,237 @@ +using System; +using System.IO; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace Unity_Studio +{ + class OpenFolderDialog + { + /// + /// Gets/sets folder in which dialog will be open. + /// + public string InitialFolder { get; set; } + + /// + /// Gets/sets directory in which dialog will be open if there is no recent directory available. + /// + public string DefaultFolder { get; set; } + + /// + /// Gets selected folder. + /// + public string Folder { get; private set; } + + + internal DialogResult ShowDialog(IWin32Window owner) + { + if (Environment.OSVersion.Version.Major >= 6) + { + return ShowVistaDialog(owner); + } + else + { + return ShowLegacyDialog(owner); + } + } + + private DialogResult ShowVistaDialog(IWin32Window owner) + { + var frm = (NativeMethods.IFileDialog)(new NativeMethods.FileOpenDialogRCW()); + uint options; + frm.GetOptions(out options); + options |= NativeMethods.FOS_PICKFOLDERS | NativeMethods.FOS_FORCEFILESYSTEM | NativeMethods.FOS_NOVALIDATE | NativeMethods.FOS_NOTESTFILECREATE | NativeMethods.FOS_DONTADDTORECENT; + frm.SetOptions(options); + if (this.InitialFolder != null) + { + NativeMethods.IShellItem directoryShellItem; + var riid = new Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE"); //IShellItem + if (NativeMethods.SHCreateItemFromParsingName(this.InitialFolder, IntPtr.Zero, ref riid, out directoryShellItem) == NativeMethods.S_OK) + { + frm.SetFolder(directoryShellItem); + } + } + if (this.DefaultFolder != null) + { + NativeMethods.IShellItem directoryShellItem; + var riid = new Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE"); //IShellItem + if (NativeMethods.SHCreateItemFromParsingName(this.DefaultFolder, IntPtr.Zero, ref riid, out directoryShellItem) == NativeMethods.S_OK) + { + frm.SetDefaultFolder(directoryShellItem); + } + } + + if (frm.Show(owner.Handle) == NativeMethods.S_OK) + { + NativeMethods.IShellItem shellItem; + if (frm.GetResult(out shellItem) == NativeMethods.S_OK) + { + IntPtr pszString; + if (shellItem.GetDisplayName(NativeMethods.SIGDN_FILESYSPATH, out pszString) == NativeMethods.S_OK) + { + if (pszString != IntPtr.Zero) + { + try + { + this.Folder = Marshal.PtrToStringAuto(pszString); + return DialogResult.OK; + } + finally + { + Marshal.FreeCoTaskMem(pszString); + } + } + } + } + } + return DialogResult.Cancel; + } + + private DialogResult ShowLegacyDialog(IWin32Window owner) + { + using (var frm = new FolderBrowserDialog()) + { + if (this.InitialFolder != null) { frm.SelectedPath = this.InitialFolder; } + if (frm.ShowDialog(owner) == DialogResult.OK) + { + this.Folder = Path.GetDirectoryName(frm.SelectedPath); + return DialogResult.OK; + } + else + { + return DialogResult.Cancel; + } + } + } + } + + internal static class NativeMethods + { + + #region Constants + + public const uint FOS_PICKFOLDERS = 0x00000020; + public const uint FOS_FORCEFILESYSTEM = 0x00000040; + public const uint FOS_NOVALIDATE = 0x00000100; + public const uint FOS_NOTESTFILECREATE = 0x00010000; + public const uint FOS_DONTADDTORECENT = 0x02000000; + + public const uint S_OK = 0x0000; + + public const uint SIGDN_FILESYSPATH = 0x80058000; + + #endregion + + + #region COM + + [ComImport, ClassInterface(ClassInterfaceType.None), TypeLibType(TypeLibTypeFlags.FCanCreate), Guid("DC1C5A9C-E88A-4DDE-A5A1-60F82A20AEF7")] + internal class FileOpenDialogRCW { } + + + [ComImport(), Guid("42F85136-DB7E-439C-85F1-E4075D135FC8"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + internal interface IFileDialog + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [PreserveSig()] + uint Show([In, Optional] IntPtr hwndOwner); //IModalWindow + + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint SetFileTypes([In] uint cFileTypes, [In, MarshalAs(UnmanagedType.LPArray)] IntPtr rgFilterSpec); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint SetFileTypeIndex([In] uint iFileType); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint GetFileTypeIndex(out uint piFileType); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint Advise([In, MarshalAs(UnmanagedType.Interface)] IntPtr pfde, out uint pdwCookie); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint Unadvise([In] uint dwCookie); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint SetOptions([In] uint fos); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint GetOptions(out uint fos); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void SetDefaultFolder([In, MarshalAs(UnmanagedType.Interface)] IShellItem psi); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint SetFolder([In, MarshalAs(UnmanagedType.Interface)] IShellItem psi); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint GetFolder([MarshalAs(UnmanagedType.Interface)] out IShellItem ppsi); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint GetCurrentSelection([MarshalAs(UnmanagedType.Interface)] out IShellItem ppsi); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint SetFileName([In, MarshalAs(UnmanagedType.LPWStr)] string pszName); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint GetFileName([MarshalAs(UnmanagedType.LPWStr)] out string pszName); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint SetTitle([In, MarshalAs(UnmanagedType.LPWStr)] string pszTitle); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint SetOkButtonLabel([In, MarshalAs(UnmanagedType.LPWStr)] string pszText); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint SetFileNameLabel([In, MarshalAs(UnmanagedType.LPWStr)] string pszLabel); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint GetResult([MarshalAs(UnmanagedType.Interface)] out IShellItem ppsi); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint AddPlace([In, MarshalAs(UnmanagedType.Interface)] IShellItem psi, uint fdap); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint SetDefaultExtension([In, MarshalAs(UnmanagedType.LPWStr)] string pszDefaultExtension); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint Close([MarshalAs(UnmanagedType.Error)] uint hr); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint SetClientGuid([In] ref Guid guid); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint ClearClientData(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint SetFilter([MarshalAs(UnmanagedType.Interface)] IntPtr pFilter); + } + + + [ComImport, Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + internal interface IShellItem + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint BindToHandler([In] IntPtr pbc, [In] ref Guid rbhid, [In] ref Guid riid, [Out, MarshalAs(UnmanagedType.Interface)] out IntPtr ppvOut); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint GetParent([MarshalAs(UnmanagedType.Interface)] out IShellItem ppsi); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint GetDisplayName([In] uint sigdnName, out IntPtr ppszName); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint GetAttributes([In] uint sfgaoMask, out uint psfgaoAttribs); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + uint Compare([In, MarshalAs(UnmanagedType.Interface)] IShellItem psi, [In] uint hint, out int piOrder); + } + + #endregion + + + [DllImport("shell32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + internal static extern int SHCreateItemFromParsingName([MarshalAs(UnmanagedType.LPWStr)] string pszPath, IntPtr pbc, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out IShellItem ppv); + } +} \ No newline at end of file diff --git a/Unity Studio/Unity Studio-x86.csproj b/Unity Studio/Unity Studio-x86.csproj index ea12102..1b79939 100644 --- a/Unity Studio/Unity Studio-x86.csproj +++ b/Unity Studio/Unity Studio-x86.csproj @@ -130,6 +130,7 @@ Code + Resource1.resx True diff --git a/Unity Studio/Unity Studio.csproj b/Unity Studio/Unity Studio.csproj index 92d233f..e85bccb 100644 --- a/Unity Studio/Unity Studio.csproj +++ b/Unity Studio/Unity Studio.csproj @@ -130,6 +130,7 @@ Code + True True diff --git a/Unity Studio/UnityStudioForm.Designer.cs b/Unity Studio/UnityStudioForm.Designer.cs index b369aac..3f7918a 100644 --- a/Unity Studio/UnityStudioForm.Designer.cs +++ b/Unity Studio/UnityStudioForm.Designer.cs @@ -99,9 +99,7 @@ this.timer = new System.Windows.Forms.Timer(this.components); this.timerOpenTK = new System.Windows.Forms.Timer(this.components); this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.openFolderDialog1 = new System.Windows.Forms.OpenFileDialog(); this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); - this.saveFolderDialog1 = new System.Windows.Forms.SaveFileDialog(); this.treeTip = new System.Windows.Forms.ToolTip(this.components); this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); this.showOriginalFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -818,28 +816,11 @@ this.openFileDialog1.Multiselect = true; this.openFileDialog1.RestoreDirectory = true; // - // openFolderDialog1 - // - this.openFolderDialog1.AddExtension = false; - this.openFolderDialog1.CheckFileExists = false; - this.openFolderDialog1.FileName = "Select folder"; - this.openFolderDialog1.Filter = "Folders|*."; - this.openFolderDialog1.RestoreDirectory = true; - this.openFolderDialog1.Title = "Browse for folder"; - // // saveFileDialog1 // - this.saveFileDialog1.Filter = "FBX file|*.fbx|Collada|*.dae"; + this.saveFileDialog1.Filter = "FBX file|*.fbx"; this.saveFileDialog1.RestoreDirectory = true; // - // saveFolderDialog1 - // - this.saveFolderDialog1.AddExtension = false; - this.saveFolderDialog1.FileName = "Select folder or write folder name to create"; - this.saveFolderDialog1.Filter = "Folders|*."; - this.saveFolderDialog1.RestoreDirectory = true; - this.saveFolderDialog1.Title = "Browse for folder"; - // // contextMenuStrip1 // this.contextMenuStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); @@ -953,9 +934,7 @@ private System.Windows.Forms.ToolStripMenuItem exportAll3DMenuItem; private System.Windows.Forms.ToolStripMenuItem exportSelected3DMenuItem; private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.OpenFileDialog openFolderDialog1; private System.Windows.Forms.SaveFileDialog saveFileDialog1; - private System.Windows.Forms.SaveFileDialog saveFolderDialog1; private System.Windows.Forms.ToolStripComboBox assetGroupOptions; private System.Windows.Forms.ToolStripMenuItem openAfterExport; private System.Windows.Forms.ToolStripMenuItem showExpOpt; diff --git a/Unity Studio/UnityStudioForm.cs b/Unity Studio/UnityStudioForm.cs index 8c1d10f..729ded3 100644 --- a/Unity Studio/UnityStudioForm.cs +++ b/Unity Studio/UnityStudioForm.cs @@ -127,84 +127,70 @@ namespace Unity_Studio private void loadFolder_Click(object sender, EventArgs e) { - /*FolderBrowserDialog folderBrowserDialog1 = new FolderBrowserDialog(); - - folderBrowserDialog1.Description = "Load all Unity assets from folder and subfolders"; - folderBrowserDialog1.ShowNewFolderButton = false; - //folderBrowserDialog1.SelectedPath = "E:\\Assets\\Unity"; - folderBrowserDialog1.SelectedPath = "E:\\Assets\\Unity\\WebPlayer\\Porsche\\92AAF1\\defaultGeometry";*/ - - if (openFolderDialog1.ShowDialog() == DialogResult.OK) + var openFolderDialog1 = new OpenFolderDialog(); + if (openFolderDialog1.ShowDialog(this) == DialogResult.OK) { - //mainPath = folderBrowserDialog1.SelectedPath; - mainPath = openFolderDialog1.FileName; - if (Path.GetFileName(mainPath) == "Select folder") - { mainPath = Path.GetDirectoryName(mainPath); } + mainPath = openFolderDialog1.Folder; + resetForm(); - if (Directory.Exists(mainPath)) + //TODO find a way to read data directly instead of merging files + MergeSplitAssets(mainPath); + + for (int t = 0; t < fileTypes.Length; t++) { - resetForm(); - - //TODO find a way to read data directly instead of merging files - MergeSplitAssets(mainPath); - - for (int t = 0; t < fileTypes.Length; t++) + string[] fileNames = Directory.GetFiles(mainPath, fileTypes[t], SearchOption.AllDirectories); + #region sort specific types alphanumerically + if (fileNames.Length > 0 && (t == 1 || t == 2)) { - string[] fileNames = Directory.GetFiles(mainPath, fileTypes[t], SearchOption.AllDirectories); - #region sort specific types alphanumerically - if (fileNames.Length > 0 && (t == 1 || t == 2)) + var sortedList = fileNames.ToList(); + sortedList.Sort((s1, s2) => { - var sortedList = fileNames.ToList(); - sortedList.Sort((s1, s2) => - { - string pattern = "([A-Za-z\\s]*)([0-9]*)"; - string h1 = Regex.Match(Path.GetFileNameWithoutExtension(s1), pattern).Groups[1].Value; - string h2 = Regex.Match(Path.GetFileNameWithoutExtension(s2), pattern).Groups[1].Value; - if (h1 != h2) - return h1.CompareTo(h2); - string t1 = Regex.Match(Path.GetFileNameWithoutExtension(s1), pattern).Groups[2].Value; - string t2 = Regex.Match(Path.GetFileNameWithoutExtension(s2), pattern).Groups[2].Value; - if (t1 != "" && t2 != "") - return int.Parse(t1).CompareTo(int.Parse(t2)); - return 0; - }); - foreach (var i in sortedList) - { - unityFiles.Add(i); - unityFilesHash.Add(Path.GetFileName(i)); - } - + string pattern = "([A-Za-z\\s]*)([0-9]*)"; + string h1 = Regex.Match(Path.GetFileNameWithoutExtension(s1), pattern).Groups[1].Value; + string h2 = Regex.Match(Path.GetFileNameWithoutExtension(s2), pattern).Groups[1].Value; + if (h1 != h2) + return h1.CompareTo(h2); + string t1 = Regex.Match(Path.GetFileNameWithoutExtension(s1), pattern).Groups[2].Value; + string t2 = Regex.Match(Path.GetFileNameWithoutExtension(s2), pattern).Groups[2].Value; + if (t1 != "" && t2 != "") + return int.Parse(t1).CompareTo(int.Parse(t2)); + return 0; + }); + foreach (var i in sortedList) + { + unityFiles.Add(i); + unityFilesHash.Add(Path.GetFileName(i)); } - #endregion - else + + } + #endregion + else + { + foreach (var i in fileNames) { - foreach (var i in fileNames) - { - unityFiles.Add(i); - unityFilesHash.Add(Path.GetFileName(i)); - } + unityFiles.Add(i); + unityFilesHash.Add(Path.GetFileName(i)); } } - - unityFiles = unityFiles.Distinct().ToList(); - progressBar1.Value = 0; - progressBar1.Maximum = unityFiles.Count; - ThreadPool.QueueUserWorkItem(delegate - { - //use a for loop because list size can change - for (int f = 0; f < unityFiles.Count; f++) - { - var fileName = unityFiles[f]; - StatusStripUpdate("Loading " + Path.GetFileName(fileName)); - LoadAssetsFile(fileName); - ProgressBarPerformStep(); - } - unityFilesHash.Clear(); - assetsfileListHash.Clear(); - BuildAssetStrucutres(); - }); } - else { StatusStripUpdate("Selected path deos not exist."); } + + unityFiles = unityFiles.Distinct().ToList(); + progressBar1.Value = 0; + progressBar1.Maximum = unityFiles.Count; + ThreadPool.QueueUserWorkItem(delegate + { + //use a for loop because list size can change + for (int f = 0; f < unityFiles.Count; f++) + { + var fileName = unityFiles[f]; + StatusStripUpdate("Loading " + Path.GetFileName(fileName)); + LoadAssetsFile(fileName); + ProgressBarPerformStep(); + } + unityFilesHash.Clear(); + assetsfileListHash.Clear(); + BuildAssetStrucutres(); + }); } } @@ -238,16 +224,10 @@ namespace Unity_Studio int extractedCount = 0; List bundleFiles = new List(); - /*FolderBrowserDialog folderBrowserDialog1 = new FolderBrowserDialog(); - folderBrowserDialog1.Description = "Extract all Unity bundles from folder and subfolders"; - folderBrowserDialog1.ShowNewFolderButton = false;*/ - - if (openFolderDialog1.ShowDialog() == DialogResult.OK) + var openFolderDialog1 = new OpenFolderDialog(); + if (openFolderDialog1.ShowDialog(this) == DialogResult.OK) { - string startPath = openFolderDialog1.FileName; - if (Path.GetFileName(startPath) == "Select folder") - { startPath = Path.GetDirectoryName(startPath); } - + string startPath = openFolderDialog1.Folder; string[] fileTypes = new string[6] { "*.unity3d", "*.unity3d.lz4", "*.assetbundle", "*.assetbundle-*", "*.bundle", "*.bytes" }; foreach (var fileType in fileTypes) { @@ -317,7 +297,6 @@ namespace Unity_Studio } StatusStripUpdate("Finished loading " + assetsfileList.Count + " files with " + (assetListView.Items.Count + sceneTreeView.Nodes.Count) + " exportable assets."); treeSearch.Select(); - saveFolderDialog1.InitialDirectory = mainPath; })); } @@ -445,15 +424,13 @@ namespace Unity_Studio { if (AllClassStructures.Count > 0) { - if (saveFolderDialog1.ShowDialog() == DialogResult.OK) + var saveFolderDialog1 = new OpenFolderDialog(); + if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK) { progressBar1.Value = 0; progressBar1.Maximum = AllClassStructures.Count; - var savePath = saveFolderDialog1.FileName; - if (Path.GetFileName(savePath) == "Select folder or write folder name to create") - { savePath = Path.GetDirectoryName(saveFolderDialog1.FileName); } - + var savePath = saveFolderDialog1.Folder; foreach (var version in AllClassStructures) { if (version.Value.Count > 0) @@ -1067,12 +1044,12 @@ namespace Unity_Studio for (int j = 0; j < 3; j++) { normal2Data[indiceData[i + j]] += normal; - normalCalculatedCount[indiceData[i + j]] ++; + normalCalculatedCount[indiceData[i + j]]++; } } for (int i = 0; i < m_Mesh.m_VertexCount; i++) { - if(normalCalculatedCount[i] == 0) + if (normalCalculatedCount[i] == 0) normal2Data[i] = new Vector3(0, 1, 0); else normal2Data[i] /= normalCalculatedCount[i]; @@ -1444,11 +1421,10 @@ namespace Unity_Studio { if (sceneTreeView.Nodes.Count > 0) { - if (saveFolderDialog1.ShowDialog() == DialogResult.OK) + var saveFolderDialog1 = new OpenFolderDialog(); + if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK) { - var savePath = saveFolderDialog1.FileName; - if (Path.GetFileName(savePath) == "Select folder or write folder name to create") - { savePath = Path.GetDirectoryName(saveFolderDialog1.FileName); } + var savePath = saveFolderDialog1.Folder; savePath = savePath + "\\"; switch ((bool)Properties.Settings.Default["showExpOpt"]) { @@ -1547,7 +1523,8 @@ namespace Unity_Studio private void ExportAssets_Click(object sender, EventArgs e) { - if (exportableAssets.Count > 0 && saveFolderDialog1.ShowDialog() == DialogResult.OK) + var saveFolderDialog1 = new OpenFolderDialog(); + if (exportableAssets.Count > 0 && saveFolderDialog1.ShowDialog(this) == DialogResult.OK) { timer.Stop(); List toExportAssets = null; @@ -1572,9 +1549,7 @@ namespace Unity_Studio ThreadPool.QueueUserWorkItem(delegate { Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); - var savePath = saveFolderDialog1.FileName; - if (Path.GetFileName(savePath) == "Select folder or write folder name to create") - { savePath = Path.GetDirectoryName(saveFolderDialog1.FileName); } + var savePath = saveFolderDialog1.Folder; int toExport = toExportAssets.Count; int exportedCount = 0; @@ -1789,7 +1764,7 @@ namespace Unity_Studio loadShader("vs", ShaderType.VertexShader, pgmBlackID, out vsID); loadShader("fsBlack", ShaderType.FragmentShader, pgmBlackID, out fsID); GL.LinkProgram(pgmBlackID); - + attributeVertexPosition = GL.GetAttribLocation(pgmID, "vertexPosition"); attributeNormalDirection = GL.GetAttribLocation(pgmID, "normalDirection"); attributeVertexColor = GL.GetAttribLocation(pgmColorID, "vertexColor"); diff --git a/Unity Studio/UnityStudioForm.resx b/Unity Studio/UnityStudioForm.resx index 1a36536..f732ecb 100644 --- a/Unity Studio/UnityStudioForm.resx +++ b/Unity Studio/UnityStudioForm.resx @@ -117,10 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 325, 17 - + + 312, 17 + abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWYZ 1234567890.:,;'\"(!?)+-*/= @@ -139,32 +138,31 @@ The quick brown fox jumps over the lazy dog. 1234567890 The quick brown fox jumps over the lazy dog. 1234567890 - - 440, 17 - - - 556, 17 - - + + 432, 17 + + + 553, 17 + + + 17, 17 + + 636, 17 - + Unity asset files|*.*|Unity bundle files|*.*|Unity asset files|level*; globalgamemanagers; mainData; CustomAssetBundle-*; CAB-*; BuildPlayer-*; *.assets; *.sharedAssets|Unity bundle files|*.unity3d; *.unity3d.lz4; *.assetbundle; *.bundle; *.bytes - - 169, 17 - - - 776, 17 - - - 17, 17 - - - 912, 17 - - - + + 784, 17 + + + 928, 17 + + + 147, 17 + + 67 - + \ No newline at end of file