|  |  |  |  | namespace MagicaVoxelToolbox | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  |     using System.Collections; | 
					
						
							|  |  |  |  |     using System.Collections.Generic; | 
					
						
							|  |  |  |  |     using UnityEngine; | 
					
						
							|  |  |  |  |     using UnityEditor; | 
					
						
							|  |  |  |  |     using MagicaVoxelToolbox; | 
					
						
							|  |  |  |  |     using MagicaVoxelToolbox.Saving; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     public class VoxelToUnityWindow : MoenenEditorWindow | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         #region --- SUB --- | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public struct PathData | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             public string Path; | 
					
						
							|  |  |  |  |             public string Extension; | 
					
						
							|  |  |  |  |             public string Root; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public enum Task | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             Prefab = 0, | 
					
						
							|  |  |  |  |             Lod = 1, | 
					
						
							|  |  |  |  |             Material = 2, | 
					
						
							|  |  |  |  |             Obj = 3, | 
					
						
							|  |  |  |  |             ToJson = 4, | 
					
						
							|  |  |  |  |             ToVox = 5, | 
					
						
							|  |  |  |  |             ToQb = 6, | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public enum ExportMod | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             Specified = 0, | 
					
						
							|  |  |  |  |             OriginalPath = 1, | 
					
						
							|  |  |  |  |             AskEverytime = 2, | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public enum PivotMod | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             Specified = 0, | 
					
						
							|  |  |  |  |             MagicaVoxelWorldMod = 1, | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public enum _25DSpriteNum | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             _1 = 1, | 
					
						
							|  |  |  |  |             _4 = 4, | 
					
						
							|  |  |  |  |             _8 = 8, | 
					
						
							|  |  |  |  |             _16 = 16, | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public enum FacingOption | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             PositiveZInUnity = 0, | 
					
						
							|  |  |  |  |             NegativeZInUnity = 1, | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         #endregion | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         #region --- VAR --- | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         // Global | 
					
						
							|  |  |  |  |         private static Vector2[] SHADER_VALUE_REMAP_SOURCE = new Vector2[SHADER_PROPERTY_NUM] { | 
					
						
							|  |  |  |  |             new Vector2(0, 100), | 
					
						
							|  |  |  |  |             new Vector2(0, 100), | 
					
						
							|  |  |  |  |             new Vector2(0, 100), | 
					
						
							|  |  |  |  |             new Vector2(0, 100), | 
					
						
							|  |  |  |  |             new Vector2(0, 100), | 
					
						
							|  |  |  |  |             new Vector2(0, 100), | 
					
						
							|  |  |  |  |             new Vector2(0, 100), | 
					
						
							|  |  |  |  |             new Vector2(0, 100), | 
					
						
							|  |  |  |  |             new Vector2(1, 2), | 
					
						
							|  |  |  |  |             new Vector2(0, 100), | 
					
						
							|  |  |  |  |             new Vector2(0, 100), | 
					
						
							|  |  |  |  |             new Vector2(1, 5), | 
					
						
							|  |  |  |  |             new Vector2(0, 100), | 
					
						
							|  |  |  |  |         }; | 
					
						
							|  |  |  |  |         private const int SHADER_NUM = VoxelData.MaterialData.SHADER_NUM; | 
					
						
							|  |  |  |  |         private const int SHADER_PROPERTY_NUM = VoxelData.MaterialData.SHADER_PROPERTY_NUM; | 
					
						
							|  |  |  |  |         private static readonly string[] SHADER_NAMES = new string[SHADER_NUM] { "Diffuse", "Metal", "Plastic", "Glass", "Emiss", }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         // Short | 
					
						
							|  |  |  |  |         private static ExportMod TheExportMod | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             get | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 return (ExportMod)ExportModIndex.Value; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             set | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 ExportModIndex.Value = (int)value; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static Core_Voxel.LightMapSupportType LightMapSupportMode | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             get | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 return (Core_Voxel.LightMapSupportType)LightMapSupportTypeIndex.Value; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             set | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 LightMapSupportTypeIndex.Value = (int)value; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static Shader TheDiffuseShader | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             get | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 return Shader.Find(Shader_Paths[0]); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             set | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 Shader_Paths[0].Value = value ? value.name : "Mobile/Diffuse"; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static Shader TheMetalShader | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             get | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 return Shader.Find(Shader_Paths[1]); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             set | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 Shader_Paths[1].Value = value ? value.name : "Mobile/Diffuse"; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static Shader ThePlasticShader | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             get | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 return Shader.Find(Shader_Paths[2]); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             set | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 Shader_Paths[2].Value = value ? value.name : "Mobile/Diffuse"; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static Shader TheGlassShader | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             get | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 return Shader.Find(Shader_Paths[3]); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             set | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 Shader_Paths[3].Value = value ? value.name : "Mobile/Diffuse"; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static Shader TheEmissionShader | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             get | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 return Shader.Find(Shader_Paths[4]); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             set | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 Shader_Paths[4].Value = value ? value.name : "Mobile/Diffuse"; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static Shader[] TheShaders | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             get | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 return new Shader[SHADER_NUM] { | 
					
						
							|  |  |  |  |                     Shader.Find(Shader_Paths[0]), | 
					
						
							|  |  |  |  |                     Shader.Find(Shader_Paths[1]), | 
					
						
							|  |  |  |  |                     Shader.Find(Shader_Paths[2]), | 
					
						
							|  |  |  |  |                     Shader.Find(Shader_Paths[3]), | 
					
						
							|  |  |  |  |                     Shader.Find(Shader_Paths[4]), | 
					
						
							|  |  |  |  |                 }; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static string[] ShaderKeywords | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             get | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 return new string[SHADER_PROPERTY_NUM] { | 
					
						
							|  |  |  |  |                     Shader_Keywords[0], | 
					
						
							|  |  |  |  |                     Shader_Keywords[1], | 
					
						
							|  |  |  |  |                     Shader_Keywords[2], | 
					
						
							|  |  |  |  |                     Shader_Keywords[3], | 
					
						
							|  |  |  |  |                     Shader_Keywords[4], | 
					
						
							|  |  |  |  |                     Shader_Keywords[5], | 
					
						
							|  |  |  |  |                     Shader_Keywords[6], | 
					
						
							|  |  |  |  |                     Shader_Keywords[7], | 
					
						
							|  |  |  |  |                     Shader_Keywords[8], | 
					
						
							|  |  |  |  |                     Shader_Keywords[9], | 
					
						
							|  |  |  |  |                     Shader_Keywords[10], | 
					
						
							|  |  |  |  |                     Shader_Keywords[11], | 
					
						
							|  |  |  |  |                     Shader_Keywords[12], | 
					
						
							|  |  |  |  |                 }; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static Vector2[] ShaderValueRemaps | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             get | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 return new Vector2[SHADER_PROPERTY_NUM] { | 
					
						
							|  |  |  |  |                     Shader_ValueRemaps[0], | 
					
						
							|  |  |  |  |                     Shader_ValueRemaps[1], | 
					
						
							|  |  |  |  |                     Shader_ValueRemaps[2], | 
					
						
							|  |  |  |  |                     Shader_ValueRemaps[3], | 
					
						
							|  |  |  |  |                     Shader_ValueRemaps[4], | 
					
						
							|  |  |  |  |                     Shader_ValueRemaps[5], | 
					
						
							|  |  |  |  |                     Shader_ValueRemaps[6], | 
					
						
							|  |  |  |  |                     Shader_ValueRemaps[7], | 
					
						
							|  |  |  |  |                     Shader_ValueRemaps[8], | 
					
						
							|  |  |  |  |                     Shader_ValueRemaps[9], | 
					
						
							|  |  |  |  |                     Shader_ValueRemaps[10], | 
					
						
							|  |  |  |  |                     Shader_ValueRemaps[11], | 
					
						
							|  |  |  |  |                     Shader_ValueRemaps[12], | 
					
						
							|  |  |  |  |                 }; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         // Data | 
					
						
							|  |  |  |  |         private Vector2 MasterScrollPosition; | 
					
						
							|  |  |  |  |         private static bool AboutFold_Contact = false; | 
					
						
							|  |  |  |  |         private static bool AboutFold_Ad = false; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         // Selection | 
					
						
							|  |  |  |  |         private static Dictionary<Object, PathData> TaskMap = new Dictionary<Object, PathData>(); | 
					
						
							|  |  |  |  |         private static int VoxNum = 0; | 
					
						
							|  |  |  |  |         private static int QbNum = 0; | 
					
						
							|  |  |  |  |         private static int FolderNum = 0; | 
					
						
							|  |  |  |  |         private static int ObjNum = 0; | 
					
						
							|  |  |  |  |         private static int JsonNum = 0; | 
					
						
							|  |  |  |  |         private static Texture2D VoxFileIcon = null; | 
					
						
							|  |  |  |  |         private static Texture2D QbFileIcon = null; | 
					
						
							|  |  |  |  |         private static Texture2D JsonFileIcon = null; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         // Saving | 
					
						
							|  |  |  |  |         private static EditorSavingBool ViewPanelOpen = new EditorSavingBool("V2U.ViewPanelOpen", true); | 
					
						
							|  |  |  |  |         private static EditorSavingBool CreatePanelOpen = new EditorSavingBool("V2U.CreatePanelOpen", true); | 
					
						
							|  |  |  |  |         private static EditorSavingBool SettingPanelOpen = new EditorSavingBool("V2U.SettingPanelOpen", false); | 
					
						
							|  |  |  |  |         private static EditorSavingBool AboutPanelOpen = new EditorSavingBool("V2U.AboutPanelOpen", false); | 
					
						
							|  |  |  |  |         private static EditorSavingBool ModelGenerationSettingPanelOpen = new EditorSavingBool("V2U.ModelGenerationSettingPanelOpen", false); | 
					
						
							|  |  |  |  |         private static EditorSavingBool OptimizationSettingPanelOpen = new EditorSavingBool("V2U.OptimizationSettingPanelOpen", false); | 
					
						
							|  |  |  |  |         private static EditorSavingBool ShaderSettingPanelOpen = new EditorSavingBool("V2U.ShaderSettingPanelOpen", false); | 
					
						
							|  |  |  |  |         private static EditorSavingBool SpriteGenerationSettingPanelOpen = new EditorSavingBool("V2U.SpriteGenerationSettingPanelOpen", false); | 
					
						
							|  |  |  |  |         private static EditorSavingBool SystemSettingPanelOpen = new EditorSavingBool("V2U.SystemSettingPanelOpen", false); | 
					
						
							|  |  |  |  |         private static EditorSavingBool ToolPanelOpen = new EditorSavingBool("V2U.ToolPanelOpen", true); | 
					
						
							|  |  |  |  |         private static EditorSavingBool ColorfulTitle = new EditorSavingBool("V2U.ColorfulTitle", true); | 
					
						
							|  |  |  |  |         private static EditorSavingString ExportPath = new EditorSavingString("V2U.ExportPath", "Assets"); | 
					
						
							|  |  |  |  |         private static EditorSavingInt LightMapSupportTypeIndex = new EditorSavingInt("V2U.LightMapSupportTypeIndex", 0); | 
					
						
							|  |  |  |  |         private static EditorSavingInt ExportModIndex = new EditorSavingInt("V2U.ExportModIndex", 2); | 
					
						
							|  |  |  |  |         private static EditorSavingFloat ModelScale = new EditorSavingFloat("V2U.ModelScale", 0.1f); | 
					
						
							|  |  |  |  |         private static EditorSavingInt LodNum = new EditorSavingInt("V2U.LodNum", 2); | 
					
						
							|  |  |  |  |         private static EditorSavingBool LogMessage = new EditorSavingBool("V2U.LogMessage", true); | 
					
						
							|  |  |  |  |         private static EditorSavingBool ShowDialog = new EditorSavingBool("V2U.ShowDialog", true); | 
					
						
							|  |  |  |  |         private static EditorSavingBool EditorDockToScene = new EditorSavingBool("V2U.EditorDockToScene", true); | 
					
						
							|  |  |  |  |         private static EditorSavingVector3 ModelPivot = new EditorSavingVector3("V2U.ModelPivot", Vector3.one * 0.5f); | 
					
						
							|  |  |  |  |         private static EditorSavingBool OptimizeFront = new EditorSavingBool("V2U.OptimizeFront", true); | 
					
						
							|  |  |  |  |         private static EditorSavingBool OptimizeBack = new EditorSavingBool("V2U.OptimizeBack", true); | 
					
						
							|  |  |  |  |         private static EditorSavingBool OptimizeUp = new EditorSavingBool("V2U.OptimizeUp", true); | 
					
						
							|  |  |  |  |         private static EditorSavingBool OptimizeDown = new EditorSavingBool("V2U.OptimizeDown", true); | 
					
						
							|  |  |  |  |         private static EditorSavingBool OptimizeLeft = new EditorSavingBool("V2U.OptimizeLeft", true); | 
					
						
							|  |  |  |  |         private static EditorSavingBool OptimizeRight = new EditorSavingBool("V2U.OptimizeRight", true); | 
					
						
							|  |  |  |  |         private static EditorSavingBool FacingYPlusInMV = new EditorSavingBool("V2U.FacingYPlusInMV", true); | 
					
						
							|  |  |  |  |         private static EditorSavingInt CurrentShowingShaderIndex = new EditorSavingInt("V2U.CurrentShowingShaderIndex", 0); | 
					
						
							|  |  |  |  |         private static EditorSavingInt ReplacementModeIndex = new EditorSavingInt("V2U.ReplacementModeIndex", 0); | 
					
						
							|  |  |  |  |         private static EditorSavingString ShaderMainTextureKeyword = new EditorSavingString("V2U.ShaderMainTextureKeyword", "_MainTex");// Keyword Using in VEditor | 
					
						
							|  |  |  |  |         private static EditorSavingString[] Shader_Paths = new EditorSavingString[5] { | 
					
						
							|  |  |  |  |             new EditorSavingString("V2U.ShaderPath_Diffuse", "Mobile/Diffuse"), | 
					
						
							|  |  |  |  |             new EditorSavingString("V2U.ShaderPath_Matel", "Standard"), | 
					
						
							|  |  |  |  |             new EditorSavingString("V2U.ShaderPath_Plastic", "Standard"), | 
					
						
							|  |  |  |  |             new EditorSavingString("V2U.ShaderPath_Glass", "Sprites/Default"), | 
					
						
							|  |  |  |  |             new EditorSavingString("V2U.ShaderPath_Emission", "Sprites/Default"), | 
					
						
							|  |  |  |  |         }; | 
					
						
							|  |  |  |  |         private static EditorSavingString[] Shader_Keywords = new EditorSavingString[SHADER_PROPERTY_NUM] { | 
					
						
							|  |  |  |  |             new EditorSavingString("V2U.ShaderKeyword_MetalWeight", "$c_Color"),		// 0-100 0-1 | 
					
						
							|  |  |  |  | 			new EditorSavingString("V2U.ShaderKeyword_MetalRough", "_Metallic"),		// 0-100 0-1 | 
					
						
							|  |  |  |  | 			new EditorSavingString("V2U.ShaderKeyword_MetalSpecular",""),   // 0-100 0-1 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			new EditorSavingString("V2U.ShaderKeyword_PlasticWeight","$c_Color"),		// 0-100 0-1 | 
					
						
							|  |  |  |  | 			new EditorSavingString("V2U.ShaderKeyword_PlasticRough","_Metallic"),		// 0-100 0-1 | 
					
						
							|  |  |  |  | 			new EditorSavingString("V2U.ShaderKeyword_PlasticSpecular",""), // 0-100 0-1 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			new EditorSavingString("V2U.ShaderKeyword_GlassWeight","$a_Color"),		// 0-100 0-1 | 
					
						
							|  |  |  |  | 			new EditorSavingString("V2U.ShaderKeyword_GlassRough",""),			// 0-100 0-1 | 
					
						
							|  |  |  |  | 			new EditorSavingString("V2U.ShaderKeyword_GlassRefract",""),		// 1-2   0-1 | 
					
						
							|  |  |  |  | 			new EditorSavingString("V2U.ShaderKeyword_GlassAttenuate",""), // 0-100 0-1 | 
					
						
							|  |  |  |  | 			  | 
					
						
							|  |  |  |  | 			new EditorSavingString("V2U.ShaderKeyword_EmitWeight","$c_Color"),		// 0-100 0-1 | 
					
						
							|  |  |  |  | 			new EditorSavingString("V2U.ShaderKeyword_EmitPower",""),			// 1-5   0-4 | 
					
						
							|  |  |  |  | 			new EditorSavingString("V2U.ShaderKeyword_EmitLdr",""),				// 0-100 0-1 | 
					
						
							|  |  |  |  | 		}; | 
					
						
							|  |  |  |  |         private static EditorSavingVector2[] Shader_ValueRemaps = new EditorSavingVector2[SHADER_PROPERTY_NUM] { | 
					
						
							|  |  |  |  |             new EditorSavingVector2("V2U.ShaderValueRemap_MetalWeight", new Vector2(0.5f, 1f)), | 
					
						
							|  |  |  |  |             new EditorSavingVector2("V2U.ShaderValueRemap_MetalRough", new Vector2(0f, 0.8f)), | 
					
						
							|  |  |  |  |             new EditorSavingVector2("V2U.ShaderValueRemap_MetalSpecular", new Vector2(0f, 0.8f)), | 
					
						
							|  |  |  |  |             new EditorSavingVector2("V2U.ShaderValueRemap_PlasticWeight", new Vector2(0.5f, 1f)), | 
					
						
							|  |  |  |  |             new EditorSavingVector2("V2U.ShaderValueRemap_PlasticRough", new Vector2(0f, 0.2f)), | 
					
						
							|  |  |  |  |             new EditorSavingVector2("V2U.ShaderValueRemap_PlasticSpecular", new Vector2(0f, 0.2f)), | 
					
						
							|  |  |  |  |             new EditorSavingVector2("V2U.ShaderValueRemap_GlassWeight", new Vector2(0.8f, 0.3f)), | 
					
						
							|  |  |  |  |             new EditorSavingVector2("V2U.ShaderValueRemap_GlassRough", new Vector2(0f, 1f)), | 
					
						
							|  |  |  |  |             new EditorSavingVector2("V2U.ShaderValueRemap_GlassRefract", new Vector2(0f, 1f)), | 
					
						
							|  |  |  |  |             new EditorSavingVector2("V2U.ShaderValueRemap_GlassAttenuate", new Vector2(0f, 1f)), | 
					
						
							|  |  |  |  |             new EditorSavingVector2("V2U.ShaderValueRemap_EmitWeight", new Vector2(0.5f, 1f)), | 
					
						
							|  |  |  |  |             new EditorSavingVector2("V2U.ShaderValueRemap_EmitPower", new Vector2(0f, 1f)), | 
					
						
							|  |  |  |  |             new EditorSavingVector2("V2U.ShaderValueRemap_EmitLdr", new Vector2(0f, 1f)), | 
					
						
							|  |  |  |  |         }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         #endregion | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         #region --- MSG --- | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         [MenuItem("Tools/MagicaVoxel Toolbox/Toolbox")] | 
					
						
							|  |  |  |  |         public static void OpenWindow() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             var inspector = typeof(Editor).Assembly.GetType("UnityEditor.InspectorWindow"); | 
					
						
							|  |  |  |  |             VoxelToUnityWindow window = inspector != null ? | 
					
						
							|  |  |  |  |                 GetWindow<VoxelToUnityWindow>("Voxel To Unity", true, inspector) : | 
					
						
							|  |  |  |  |                 GetWindow<VoxelToUnityWindow>("Voxel To Unity", true); | 
					
						
							|  |  |  |  |             window.minSize = new Vector2(275, 400); | 
					
						
							|  |  |  |  |             window.maxSize = new Vector2(600, 1000); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private void OnEnable() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             Window_Enable(); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private void OnFocus() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             RefreshSelection(); | 
					
						
							|  |  |  |  |             Repaint(); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private void OnSelectionChange() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             RefreshSelection(); | 
					
						
							|  |  |  |  |             Repaint(); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private void OnGUI() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             MasterScrollPosition = GUILayout.BeginScrollView(MasterScrollPosition, GUI.skin.scrollView); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             TitleGUI(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             Window_Main(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             GUILayout.EndScrollView(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (Event.current.type == EventType.MouseDown) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 GUI.FocusControl(null); | 
					
						
							|  |  |  |  |                 Repaint(); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private void TitleGUI() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             const string MAIN_TITLE = "Voxel to Unity"; | 
					
						
							|  |  |  |  |             const string MAIN_TITLE_RICH = "<color=#ff3333>V</color><color=#ffcc00>o</color><color=#ffff33>x</color><color=#33ff33>e</color><color=#33ccff>l</color><color=#eeeeee> to Unity</color>"; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             Space(6); | 
					
						
							|  |  |  |  |             LayoutV(() => | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 GUIStyle style = new GUIStyle() | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     alignment = TextAnchor.LowerCenter, | 
					
						
							|  |  |  |  |                     fontSize = 12, | 
					
						
							|  |  |  |  |                     fontStyle = FontStyle.Bold | 
					
						
							|  |  |  |  |                 }; | 
					
						
							|  |  |  |  |                 style.normal.textColor = Color.white; | 
					
						
							|  |  |  |  |                 style.richText = true; | 
					
						
							|  |  |  |  |                 Rect rect = GUIRect(0, 18); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 GUIStyle shadowStyle = new GUIStyle(style) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     richText = false | 
					
						
							|  |  |  |  |                 }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 EditorGUI.DropShadowLabel(rect, MAIN_TITLE, shadowStyle); | 
					
						
							|  |  |  |  |                 GUI.Label(rect, ColorfulTitle ? MAIN_TITLE_RICH : MAIN_TITLE, style); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             }); | 
					
						
							|  |  |  |  |             Space(6); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         #endregion | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         #region --- API --- | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public static void Window_Enable() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             LoadSetting(); | 
					
						
							|  |  |  |  |             RefreshSelection(); | 
					
						
							|  |  |  |  |             RefreshMergeSetting(); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public static void Window_Main() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             ViewGUI(); | 
					
						
							|  |  |  |  |             CreateGUI(); | 
					
						
							|  |  |  |  |             // ToolGUI(); | 
					
						
							|  |  |  |  |             SettingGUI(); | 
					
						
							|  |  |  |  |             // AboutGUI(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (GUI.changed) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 SaveSetting(); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         #endregion | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         #region --- GUI --- | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static void ViewGUI() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             LayoutF(() => | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 bool addSpaceFlag = true; | 
					
						
							|  |  |  |  |                 Space(2); | 
					
						
							|  |  |  |  |                 int iconSize = 26; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 LayoutH(() => | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     // Init | 
					
						
							|  |  |  |  |                     GUIStyle labelStyle = new GUIStyle(GUI.skin.label) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         alignment = TextAnchor.MiddleLeft, | 
					
						
							|  |  |  |  |                         fontSize = 10 | 
					
						
							|  |  |  |  |                     }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     // Icons | 
					
						
							|  |  |  |  |                     if (FolderNum > 0) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         if (VoxNum + QbNum + JsonNum <= 0) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             // None With Folder | 
					
						
							|  |  |  |  |                             EditorGUI.HelpBox(GUIRect(0, iconSize + 14), "There are NO .vox or .qb file in selecting folder.", MessageType.Warning); | 
					
						
							|  |  |  |  |                             addSpaceFlag = false; | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                     else if (VoxNum + QbNum + JsonNum <= 0) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         if (ObjNum > 0) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             // Selecting Not Voxel File | 
					
						
							|  |  |  |  |                             EditorGUI.HelpBox(GUIRect(0, iconSize + 14), "The file selecting is NOT .vox or .qb file.", MessageType.Warning); | 
					
						
							|  |  |  |  |                             addSpaceFlag = false; | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                         else | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             // None | 
					
						
							|  |  |  |  |                             EditorGUI.HelpBox(GUIRect(0, iconSize + 14), "Select *.vox, *.qb, *.json or folder in Project View.", MessageType.Info); | 
					
						
							|  |  |  |  |                             addSpaceFlag = false; | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     Space(4); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     if (VoxNum > 0) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         // Vox | 
					
						
							|  |  |  |  |                         LayoutH(() => | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             if (VoxFileIcon) | 
					
						
							|  |  |  |  |                             { | 
					
						
							|  |  |  |  |                                 GUI.DrawTexture(GUIRect(iconSize, iconSize), VoxFileIcon); | 
					
						
							|  |  |  |  |                             } | 
					
						
							|  |  |  |  |                         }, true); | 
					
						
							|  |  |  |  |                         GUI.Label(GUIRect(0, iconSize), ".vox\n× " + VoxNum.ToString(), labelStyle); | 
					
						
							|  |  |  |  |                         Space(4); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     if (QbNum > 0) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         // Qb | 
					
						
							|  |  |  |  |                         LayoutH(() => | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             if (QbFileIcon) | 
					
						
							|  |  |  |  |                             { | 
					
						
							|  |  |  |  |                                 GUI.DrawTexture(GUIRect(iconSize, iconSize), QbFileIcon); | 
					
						
							|  |  |  |  |                             } | 
					
						
							|  |  |  |  |                         }, true); | 
					
						
							|  |  |  |  |                         GUI.Label(GUIRect(0, iconSize), ".qb\n× " + QbNum.ToString(), labelStyle); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     if (JsonNum > 0) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         // Json | 
					
						
							|  |  |  |  |                         LayoutH(() => | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             if (JsonFileIcon) | 
					
						
							|  |  |  |  |                             { | 
					
						
							|  |  |  |  |                                 GUI.DrawTexture(GUIRect(iconSize, iconSize), JsonFileIcon); | 
					
						
							|  |  |  |  |                             } | 
					
						
							|  |  |  |  |                         }, true); | 
					
						
							|  |  |  |  |                         GUI.Label(GUIRect(0, iconSize), ".json\n× " + JsonNum.ToString(), labelStyle); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 Space(addSpaceFlag ? 16 : 6); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // Scale Too Small Warning | 
					
						
							|  |  |  |  |                 if (ModelScale == 0) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     EditorGUI.HelpBox(GUIRect(0, iconSize + 14), "Model scale has been set to 0. Your model will be invisible.", MessageType.Error); | 
					
						
							|  |  |  |  |                     Space(6); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 else if (ModelScale <= 0.0001f) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     EditorGUI.HelpBox(GUIRect(0, iconSize + 14), "Model scale is too small. Your may not able to see them.", MessageType.Warning); | 
					
						
							|  |  |  |  |                     Space(6); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // Combine Warning | 
					
						
							|  |  |  |  |                 if (!OptimizeFront || !OptimizeBack || !OptimizeLeft || !OptimizeRight || !OptimizeUp || !OptimizeDown) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     EditorGUI.HelpBox(GUIRect(0, iconSize + 14), "Faces in some direction will NOT be combine.\nSee \"Setting\" > \"Optimization\".", MessageType.Info); | 
					
						
							|  |  |  |  |                     Space(6); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             }, "Selecting Files", ViewPanelOpen, true); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static void CreateGUI() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             LayoutF(() => | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 bool oldEnable = GUI.enabled; | 
					
						
							|  |  |  |  |                 GUI.enabled = VoxNum > 0 || QbNum > 0; | 
					
						
							|  |  |  |  |                 int buttonHeight = 34; | 
					
						
							|  |  |  |  |                 string s = VoxNum + QbNum > 1 ? "s" : ""; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 var dotStyle = new GUIStyle(GUI.skin.label) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     richText = true, | 
					
						
							|  |  |  |  |                     alignment = TextAnchor.MiddleLeft, | 
					
						
							|  |  |  |  |                 }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 Space(6); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 Rect rect = new Rect(); | 
					
						
							|  |  |  |  |                 if (GUI.Button(rect = GUIRect(0, buttonHeight), "Create Prefab" + s)) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     // Create Prefab | 
					
						
							|  |  |  |  |                     DoTask(Task.Prefab); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 GUI.Label(rect, GUI.enabled ? "   <color=#33ccff>●</color>" : "", dotStyle); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // Space(4); | 
					
						
							|  |  |  |  |                 // if (GUI.Button(rect = GUIRect(0, buttonHeight), "Create LOD Prefab" + s)) { | 
					
						
							|  |  |  |  |                 // 	// Create LOD Prefab | 
					
						
							|  |  |  |  |                 // 	DoTask(Task.Lod); | 
					
						
							|  |  |  |  |                 // } | 
					
						
							|  |  |  |  |                 // GUI.Label(rect, GUI.enabled ? "   <color=#33ccff>●</color>" : "", dotStyle); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // Space(4); | 
					
						
							|  |  |  |  |                 // bool oldE = GUI.enabled; | 
					
						
							|  |  |  |  |                 // GUI.enabled = oldE && VoxNum > 0; | 
					
						
							|  |  |  |  |                 // if (GUI.Button(rect = GUIRect(0, buttonHeight), "Create Material Prefab" + s)) { | 
					
						
							|  |  |  |  |                 // 	// Create Material Prefab | 
					
						
							|  |  |  |  |                 // 	DoTask(Task.Material); | 
					
						
							|  |  |  |  |                 // } | 
					
						
							|  |  |  |  |                 // GUI.Label(rect, GUI.enabled ? "   <color=#33ccff>●</color>" : "", dotStyle); | 
					
						
							|  |  |  |  |                 // GUI.enabled = oldE; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // Space(4); | 
					
						
							|  |  |  |  |                 // if (GUI.Button(rect = GUIRect(0, buttonHeight), "Create Obj File" + s)) { | 
					
						
							|  |  |  |  |                 // 	// Create Obj File | 
					
						
							|  |  |  |  |                 // 	DoTask(Task.Obj); | 
					
						
							|  |  |  |  |                 // } | 
					
						
							|  |  |  |  |                 // GUI.Label(rect, GUI.enabled ? "   <color=#33ff66>●</color>" : "", dotStyle); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // Space(4); | 
					
						
							|  |  |  |  |                 // LayoutH(() => { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // 	GUI.enabled = VoxNum > 0 || QbNum > 0; | 
					
						
							|  |  |  |  |                 // 	if (GUI.Button(rect = GUIRect(0, buttonHeight), "   To Json")) { | 
					
						
							|  |  |  |  |                 // 		// To Json | 
					
						
							|  |  |  |  |                 // 		DoTask(Task.ToJson); | 
					
						
							|  |  |  |  |                 // 	} | 
					
						
							|  |  |  |  |                 // 	GUI.Label(rect, GUI.enabled ? "   <color=#cccccc>●</color>" : "", dotStyle); | 
					
						
							|  |  |  |  |                 // 	Space(2); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // 	GUI.enabled = JsonNum > 0 || QbNum > 0; | 
					
						
							|  |  |  |  |                 // 	if (GUI.Button(rect = GUIRect(0, buttonHeight), "  To Vox")) { | 
					
						
							|  |  |  |  |                 // 		// To Vox | 
					
						
							|  |  |  |  |                 // 		DoTask(Task.ToVox); | 
					
						
							|  |  |  |  |                 // 	} | 
					
						
							|  |  |  |  |                 // 	GUI.Label(rect, GUI.enabled ? "   <color=#cc66ff>●</color>" : "", dotStyle); | 
					
						
							|  |  |  |  |                 // 	Space(2); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // 	GUI.enabled = JsonNum > 0 || VoxNum > 0; | 
					
						
							|  |  |  |  |                 // 	if (GUI.Button(rect = GUIRect(0, buttonHeight), " To Qb")) { | 
					
						
							|  |  |  |  |                 // 		// To Qb | 
					
						
							|  |  |  |  |                 // 		DoTask(Task.ToQb); | 
					
						
							|  |  |  |  |                 // 	} | 
					
						
							|  |  |  |  |                 // 	GUI.Label(rect, GUI.enabled ? "   <color=#cc66ff>●</color>" : "", dotStyle); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // Space(6); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // // Export To | 
					
						
							|  |  |  |  |                 // LayoutV(() => { | 
					
						
							|  |  |  |  |                 // 	GUI.enabled = true; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // 	Space(4); | 
					
						
							|  |  |  |  |                 LayoutH(() => | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     GUI.Label(GUIRect(0, 18), "Export To:"); | 
					
						
							|  |  |  |  |                     TheExportMod = (ExportMod)EditorGUI.EnumPopup(GUIRect(110, 18), TheExportMod); | 
					
						
							|  |  |  |  |                 }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 if (TheExportMod == ExportMod.Specified) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     Space(4); | 
					
						
							|  |  |  |  |                     LayoutH(() => | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         Space(6); | 
					
						
							|  |  |  |  |                         EditorGUI.SelectableLabel(GUIRect(0, 18), ExportPath, GUI.skin.textField); | 
					
						
							|  |  |  |  |                         if (GUI.Button(GUIRect(60, 18), "Browse", EditorStyles.miniButtonMid)) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             BrowseExportPath(); | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                     }); | 
					
						
							|  |  |  |  |                     Space(2); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 // 	Space(2); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // 	GUI.enabled = oldEnable; | 
					
						
							|  |  |  |  |                 // }, true); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // Space(4); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // GUI.enabled = oldEnable; | 
					
						
							|  |  |  |  |             }, "Create", CreatePanelOpen, true); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static void ToolGUI() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             LayoutF(() => | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 var dotStyle = new GUIStyle(GUI.skin.label) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     fontSize = 9, | 
					
						
							|  |  |  |  |                     richText = true, | 
					
						
							|  |  |  |  |                     alignment = TextAnchor.MiddleLeft, | 
					
						
							|  |  |  |  |                 }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // Rigging Editor | 
					
						
							|  |  |  |  |                 LayoutH(() => | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     GUIRect(16, 26); | 
					
						
							|  |  |  |  |                     Rect rect = new Rect(); | 
					
						
							|  |  |  |  |                     if (GUI.Button(rect = GUIRect(0, 28), " Rigging Editor")) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         VoxelEditorWindow.OpenWindow(VoxelEditorWindow.EditorMode.Rigging, EditorDockToScene); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                     GUI.Label(rect, "   <color=#33ccff>●</color>", dotStyle); | 
					
						
							|  |  |  |  |                     GUIRect(16, 26); | 
					
						
							|  |  |  |  |                 }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 Space(4); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // Skeletal Animation Editor | 
					
						
							|  |  |  |  |                 LayoutH(() => | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     GUIRect(16, 26); | 
					
						
							|  |  |  |  |                     Rect rect = new Rect(); | 
					
						
							|  |  |  |  |                     if (GUI.Button(rect = GUIRect(0, 28), " Skeletal Animation Editor")) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         var window = VoxelEditorWindow.OpenWindow(VoxelEditorWindow.EditorMode.Skeletal, EditorDockToScene); | 
					
						
							|  |  |  |  |                         if (window) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             window.OpenSkeletal(); | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                     GUI.Label(rect, "   <color=#33cccc>●</color>", dotStyle); | 
					
						
							|  |  |  |  |                     GUIRect(16, 26); | 
					
						
							|  |  |  |  |                 }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 Space(4); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // Sprite Editor | 
					
						
							|  |  |  |  |                 LayoutH(() => | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     GUIRect(16, 26); | 
					
						
							|  |  |  |  |                     Rect rect = new Rect(); | 
					
						
							|  |  |  |  |                     if (GUI.Button(rect = GUIRect(0, 28), " Sprite Editor")) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         VoxelEditorWindow.OpenWindow(VoxelEditorWindow.EditorMode.Sprite, EditorDockToScene); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                     GUI.Label(rect, "   <color=#ffcc00>●</color>", dotStyle); | 
					
						
							|  |  |  |  |                     GUIRect(16, 26); | 
					
						
							|  |  |  |  |                 }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 Space(4); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // Map Generator | 
					
						
							|  |  |  |  |                 LayoutH(() => | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     GUIRect(16, 26); | 
					
						
							|  |  |  |  |                     Rect rect = new Rect(); | 
					
						
							|  |  |  |  |                     if (GUI.Button(rect = GUIRect(0, 28), " Map Generator")) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         var window = VoxelEditorWindow.OpenWindow(VoxelEditorWindow.EditorMode.MapGenerator, EditorDockToScene); | 
					
						
							|  |  |  |  |                         if (window) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             window.OpenGenerator(); | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                     GUI.Label(rect, "   <color=#cc66ff>●</color>", dotStyle); | 
					
						
							|  |  |  |  |                     GUIRect(16, 26); | 
					
						
							|  |  |  |  |                 }); | 
					
						
							|  |  |  |  |                 Space(4); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // Character Generator | 
					
						
							|  |  |  |  |                 LayoutH(() => | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     GUIRect(16, 26); | 
					
						
							|  |  |  |  |                     Rect rect = new Rect(); | 
					
						
							|  |  |  |  |                     if (GUI.Button(rect = GUIRect(0, 28), " Character Generator")) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         var window = VoxelEditorWindow.OpenWindow(VoxelEditorWindow.EditorMode.CharacterGenerator, EditorDockToScene); | 
					
						
							|  |  |  |  |                         if (window) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             window.OpenGenerator(); | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                     GUI.Label(rect, "   <color=#cc66ff>●</color>", dotStyle); | 
					
						
							|  |  |  |  |                     GUIRect(16, 26); | 
					
						
							|  |  |  |  |                 }); | 
					
						
							|  |  |  |  |                 Space(4); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // Prefab Combiner | 
					
						
							|  |  |  |  |                 LayoutH(() => | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     GUIRect(16, 26); | 
					
						
							|  |  |  |  |                     Rect rect = new Rect(); | 
					
						
							|  |  |  |  |                     if (GUI.Button(rect = GUIRect(0, 28), " Prefab Combiner")) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         var window = VoxelEditorWindow.OpenWindow(VoxelEditorWindow.EditorMode.PrefabCombiner, EditorDockToScene); | 
					
						
							|  |  |  |  |                         if (window) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             window.OpenCombiner(); | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                     GUI.Label(rect, "   <color=#33ccff>●</color>", dotStyle); | 
					
						
							|  |  |  |  |                     GUIRect(16, 26); | 
					
						
							|  |  |  |  |                 }); | 
					
						
							|  |  |  |  |                 Space(4); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 Space(4); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             }, "Tools", ToolPanelOpen, true); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static void SettingGUI() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             LayoutF(() => | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 const int HEIGHT = 16; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // Model Generation | 
					
						
							|  |  |  |  |                 LayoutF(() => | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     Space(2); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     // Pivot | 
					
						
							|  |  |  |  |                     LayoutH(() => | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         EditorGUI.LabelField(GUIRect(48, 18), "Pivot"); | 
					
						
							|  |  |  |  |                         ModelPivot.Value = EditorGUI.Vector3Field(GUIRect(0, 18), "", ModelPivot); | 
					
						
							|  |  |  |  |                     }); | 
					
						
							|  |  |  |  |                     Space(2); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     // Scale | 
					
						
							|  |  |  |  |                     ModelScale.Value = Mathf.Max(EditorGUI.FloatField(GUIRect(0, HEIGHT), "Scale (unit/voxel)", ModelScale), 0f); | 
					
						
							|  |  |  |  |                     Space(4); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     // LOD | 
					
						
							|  |  |  |  |                     LodNum.Value = Mathf.Clamp(EditorGUI.IntField(GUIRect(0, HEIGHT), "LOD Num", LodNum), 2, 4); | 
					
						
							|  |  |  |  |                     Space(4); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     // Facing Y+ | 
					
						
							|  |  |  |  |                     FacingYPlusInMV.Value = (FacingOption)EditorGUI.EnumPopup(GUIRect(0, HEIGHT), "Y+ in MagicaVoxel is", (FacingOption)(FacingYPlusInMV.Value ? 0 : 1)) == 0; | 
					
						
							|  |  |  |  |                     Space(4); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     // LightMapSupportType | 
					
						
							|  |  |  |  |                     LightMapSupportMode = (Core_Voxel.LightMapSupportType)EditorGUI.EnumPopup(GUIRect(0, HEIGHT), "Lightmap", LightMapSupportMode); | 
					
						
							|  |  |  |  |                     Space(4); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     // Replacement Mode | 
					
						
							|  |  |  |  |                     ReplacementModeIndex.Value = (int)(Core_File.ReplacementMode)EditorGUI.EnumPopup(GUIRect(0, HEIGHT), new GUIContent("Object Replacement", "Only for sub objects inside prefab"), (Core_File.ReplacementMode)ReplacementModeIndex.Value); | 
					
						
							|  |  |  |  |                     Space(4); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 }, "Model Generation", ModelGenerationSettingPanelOpen, true); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // Optimization | 
					
						
							|  |  |  |  |                 LayoutF(() => | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     LayoutH(() => | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         OptimizeLeft.Value = EditorGUI.ToggleLeft(GUIRect(0, HEIGHT), "Combine X-", OptimizeLeft); | 
					
						
							|  |  |  |  |                         Space(2); | 
					
						
							|  |  |  |  |                         OptimizeRight.Value = EditorGUI.ToggleLeft(GUIRect(0, HEIGHT), "Combine X+", OptimizeRight); | 
					
						
							|  |  |  |  |                     }); | 
					
						
							|  |  |  |  |                     Space(2); | 
					
						
							|  |  |  |  |                     LayoutH(() => | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         OptimizeDown.Value = EditorGUI.ToggleLeft(GUIRect(0, HEIGHT), "Combine Y-", OptimizeDown); | 
					
						
							|  |  |  |  |                         Space(2); | 
					
						
							|  |  |  |  |                         OptimizeUp.Value = EditorGUI.ToggleLeft(GUIRect(0, HEIGHT), "Combine Y+", OptimizeUp); | 
					
						
							|  |  |  |  |                     }); | 
					
						
							|  |  |  |  |                     Space(2); | 
					
						
							|  |  |  |  |                     LayoutH(() => | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         OptimizeBack.Value = EditorGUI.ToggleLeft(GUIRect(0, HEIGHT), "Combine Z-", OptimizeBack); | 
					
						
							|  |  |  |  |                         Space(2); | 
					
						
							|  |  |  |  |                         OptimizeFront.Value = EditorGUI.ToggleLeft(GUIRect(0, HEIGHT), "Combine Z+", OptimizeFront); | 
					
						
							|  |  |  |  |                     }); | 
					
						
							|  |  |  |  |                     Space(6); | 
					
						
							|  |  |  |  |                     EditorGUI.HelpBox( | 
					
						
							|  |  |  |  |                         GUIRect(0, 32), | 
					
						
							|  |  |  |  |                         "The check boxes above will make faces only combines on specified directions.", | 
					
						
							|  |  |  |  |                         MessageType.Info | 
					
						
							|  |  |  |  |                     ); | 
					
						
							|  |  |  |  |                     Space(6); | 
					
						
							|  |  |  |  |                 }, "Optimization", OptimizationSettingPanelOpen, true); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // Shaders | 
					
						
							|  |  |  |  |                 LayoutF(() => | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     // Bar | 
					
						
							|  |  |  |  |                     LayoutH(() => | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         for (int i = 0; i < SHADER_NUM; i++) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             var style = i == 0 ? EditorStyles.miniButtonLeft : i == SHADER_NUM - 1 ? EditorStyles.miniButtonRight : EditorStyles.miniButtonMid; | 
					
						
							|  |  |  |  |                             if (CurrentShowingShaderIndex == i) | 
					
						
							|  |  |  |  |                             { | 
					
						
							|  |  |  |  |                                 style = new GUIStyle(style) | 
					
						
							|  |  |  |  |                                 { | 
					
						
							|  |  |  |  |                                     normal = style.active, | 
					
						
							|  |  |  |  |                                 }; | 
					
						
							|  |  |  |  |                             } | 
					
						
							|  |  |  |  |                             if (GUI.Button(GUIRect(0, 16), SHADER_NAMES[i], style)) | 
					
						
							|  |  |  |  |                             { | 
					
						
							|  |  |  |  |                                 CurrentShowingShaderIndex.Value = i; | 
					
						
							|  |  |  |  |                                 GUI.FocusControl(null); | 
					
						
							|  |  |  |  |                             } | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                     }); | 
					
						
							|  |  |  |  |                     Space(4); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     switch (CurrentShowingShaderIndex) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                         default: | 
					
						
							|  |  |  |  |                         case 0: | 
					
						
							|  |  |  |  |                             // Diffuse | 
					
						
							|  |  |  |  |                             LayoutV(() => | 
					
						
							|  |  |  |  |                             { | 
					
						
							|  |  |  |  |                                 Space(2); | 
					
						
							|  |  |  |  |                                 TheDiffuseShader = (Shader)EditorGUI.ObjectField(GUIRect(0, 16), "Diffuse Shader", TheDiffuseShader, typeof(Shader), false); | 
					
						
							|  |  |  |  |                                 Space(2); | 
					
						
							|  |  |  |  |                                 ShaderMainTextureKeyword.Value = EditorGUI.TextField(GUIRect(0, 16), "MainText Keyword", ShaderMainTextureKeyword.Value); | 
					
						
							|  |  |  |  |                                 Space(2); | 
					
						
							|  |  |  |  |                             }, true); | 
					
						
							|  |  |  |  |                             Space(2); | 
					
						
							|  |  |  |  |                             break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                         case 1: | 
					
						
							|  |  |  |  |                             // Metal | 
					
						
							|  |  |  |  |                             LayoutV(() => | 
					
						
							|  |  |  |  |                             { | 
					
						
							|  |  |  |  |                                 Space(2); | 
					
						
							|  |  |  |  |                                 TheMetalShader = (Shader)EditorGUI.ObjectField(GUIRect(0, 16), "Metal Shader", TheMetalShader, typeof(Shader), false); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                                 // Prop | 
					
						
							|  |  |  |  |                                 ShaderPropertyGUI(-1, ""); | 
					
						
							|  |  |  |  |                                 Space(2); | 
					
						
							|  |  |  |  |                                 ShaderPropertyGUI(0, "Weight"); | 
					
						
							|  |  |  |  |                                 Space(6); | 
					
						
							|  |  |  |  |                                 ShaderPropertyGUI(1, "Rough"); | 
					
						
							|  |  |  |  |                                 Space(6); | 
					
						
							|  |  |  |  |                                 ShaderPropertyGUI(2, "Specular"); | 
					
						
							|  |  |  |  |                                 Space(6); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                             }, true); | 
					
						
							|  |  |  |  |                             Space(2); | 
					
						
							|  |  |  |  |                             break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                         case 2: | 
					
						
							|  |  |  |  |                             // Plastic | 
					
						
							|  |  |  |  |                             LayoutV(() => | 
					
						
							|  |  |  |  |                             { | 
					
						
							|  |  |  |  |                                 Space(2); | 
					
						
							|  |  |  |  |                                 ThePlasticShader = (Shader)EditorGUI.ObjectField(GUIRect(0, 16), "Plastic Shader", ThePlasticShader, typeof(Shader), false); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                                 // Prop | 
					
						
							|  |  |  |  |                                 ShaderPropertyGUI(-1, ""); | 
					
						
							|  |  |  |  |                                 Space(2); | 
					
						
							|  |  |  |  |                                 ShaderPropertyGUI(3, "Weight"); | 
					
						
							|  |  |  |  |                                 Space(6); | 
					
						
							|  |  |  |  |                                 ShaderPropertyGUI(4, "Rough"); | 
					
						
							|  |  |  |  |                                 Space(6); | 
					
						
							|  |  |  |  |                                 ShaderPropertyGUI(5, "Specular"); | 
					
						
							|  |  |  |  |                                 Space(6); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                             }, true); | 
					
						
							|  |  |  |  |                             Space(2); | 
					
						
							|  |  |  |  |                             break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                         case 3: | 
					
						
							|  |  |  |  |                             // Glass | 
					
						
							|  |  |  |  |                             LayoutV(() => | 
					
						
							|  |  |  |  |                             { | 
					
						
							|  |  |  |  |                                 Space(2); | 
					
						
							|  |  |  |  |                                 TheGlassShader = (Shader)EditorGUI.ObjectField(GUIRect(0, 16), "Glass Shader", TheGlassShader, typeof(Shader), false); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                                 // Prop | 
					
						
							|  |  |  |  |                                 ShaderPropertyGUI(-1, ""); | 
					
						
							|  |  |  |  |                                 Space(2); | 
					
						
							|  |  |  |  |                                 ShaderPropertyGUI(6, "Weight"); | 
					
						
							|  |  |  |  |                                 Space(6); | 
					
						
							|  |  |  |  |                                 ShaderPropertyGUI(7, "Rough"); | 
					
						
							|  |  |  |  |                                 Space(6); | 
					
						
							|  |  |  |  |                                 ShaderPropertyGUI(8, "Refract"); | 
					
						
							|  |  |  |  |                                 Space(6); | 
					
						
							|  |  |  |  |                                 ShaderPropertyGUI(9, "Attenuate"); | 
					
						
							|  |  |  |  |                                 Space(6); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                             }, true); | 
					
						
							|  |  |  |  |                             Space(2); | 
					
						
							|  |  |  |  |                             break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                         case 4: | 
					
						
							|  |  |  |  |                             // Emission | 
					
						
							|  |  |  |  |                             LayoutV(() => | 
					
						
							|  |  |  |  |                             { | 
					
						
							|  |  |  |  |                                 Space(2); | 
					
						
							|  |  |  |  |                                 TheEmissionShader = (Shader)EditorGUI.ObjectField(GUIRect(0, 16), "Emission Shader", TheEmissionShader, typeof(Shader), false); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                                 // Prop | 
					
						
							|  |  |  |  |                                 ShaderPropertyGUI(-1, ""); | 
					
						
							|  |  |  |  |                                 Space(2); | 
					
						
							|  |  |  |  |                                 ShaderPropertyGUI(10, "Weight"); | 
					
						
							|  |  |  |  |                                 Space(6); | 
					
						
							|  |  |  |  |                                 ShaderPropertyGUI(11, "Power"); | 
					
						
							|  |  |  |  |                                 Space(6); | 
					
						
							|  |  |  |  |                                 ShaderPropertyGUI(12, "LDR"); | 
					
						
							|  |  |  |  |                                 Space(6); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                             }, true); | 
					
						
							|  |  |  |  |                             Space(2); | 
					
						
							|  |  |  |  |                             break; | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     if (CurrentShowingShaderIndex != 0) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         Space(2); | 
					
						
							|  |  |  |  |                         EditorGUI.HelpBox( | 
					
						
							|  |  |  |  |                             GUIRect(0, 72), | 
					
						
							|  |  |  |  |                             "Add tag for keyword will make it represent color. No tag means float.\n" + | 
					
						
							|  |  |  |  |                             "\"$a\" = alpha \"$r\" = r \"$g\" = g\n\"$b\" = b \"$c\" = rgb\n eg. \"$aTint\", \"$r_Color\", \"FloatValue\"", | 
					
						
							|  |  |  |  |                             MessageType.Info | 
					
						
							|  |  |  |  |                         ); | 
					
						
							|  |  |  |  |                         Space(6); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 }, "Shader", ShaderSettingPanelOpen, true); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // System | 
					
						
							|  |  |  |  |                 LayoutF(() => | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     Space(2); | 
					
						
							|  |  |  |  |                     LayoutH(() => | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         LogMessage.Value = EditorGUI.Toggle(GUIRect(HEIGHT, HEIGHT), LogMessage); | 
					
						
							|  |  |  |  |                         GUI.Label(GUIRect(0, 18), "Log To Console"); | 
					
						
							|  |  |  |  |                         Space(2); | 
					
						
							|  |  |  |  |                         ShowDialog.Value = EditorGUI.Toggle(GUIRect(HEIGHT, HEIGHT), ShowDialog); | 
					
						
							|  |  |  |  |                         GUI.Label(GUIRect(0, 18), "Dialog Window"); | 
					
						
							|  |  |  |  |                     }); | 
					
						
							|  |  |  |  |                     Space(2); | 
					
						
							|  |  |  |  |                     LayoutH(() => | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         ColorfulTitle.Value = EditorGUI.Toggle(GUIRect(HEIGHT, HEIGHT), ColorfulTitle); | 
					
						
							|  |  |  |  |                         GUI.Label(GUIRect(0, 18), "Colorful Title"); | 
					
						
							|  |  |  |  |                         EditorDockToScene.Value = EditorGUI.Toggle(GUIRect(HEIGHT, HEIGHT), EditorDockToScene); | 
					
						
							|  |  |  |  |                         GUI.Label(GUIRect(0, 18), "Dock Editor To Scene"); | 
					
						
							|  |  |  |  |                     }); | 
					
						
							|  |  |  |  |                     Space(2); | 
					
						
							|  |  |  |  |                 }, "System", SystemSettingPanelOpen, true); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             }, "Setting", SettingPanelOpen, true); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         #endregion | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         #region --- TSK --- | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public static void DoTask(Task task) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (TaskMap.Count == 0) { return; } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (TheExportMod == ExportMod.AskEverytime && !BrowseExportPath()) { return; } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             RefreshMergeSetting(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             string failMessage = "[Voxel] Failed to create model for {0} model{1}."; | 
					
						
							|  |  |  |  |             int successedNum = 0; | 
					
						
							|  |  |  |  |             int failedNum = 0; | 
					
						
							|  |  |  |  |             int taskCount = TaskMap.Count; | 
					
						
							|  |  |  |  |             bool useLOD = task == Task.Lod; | 
					
						
							|  |  |  |  |             bool useMaterial = task == Task.Material; | 
					
						
							|  |  |  |  |             var resultList = new List<Core_Voxel.Result>(); | 
					
						
							|  |  |  |  |             Util.ProgressBar("Creating", "Starting task...", 0f); | 
					
						
							|  |  |  |  |             Util.StartWatch(); | 
					
						
							|  |  |  |  |             ForAllSelection((pathData) => | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 try | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     string fileName = Util.GetNameWithoutExtension(pathData.Path); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     Util.ProgressBar("Creating", string.Format("[{1}/{2}] Creating {0}", fileName, successedNum + failedNum + 1, taskCount), (float)(successedNum + failedNum + 1) / (taskCount + 1)); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     VoxelData voxelData = null; | 
					
						
							|  |  |  |  |                     switch (task) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         case Task.Prefab: | 
					
						
							|  |  |  |  |                             // Model | 
					
						
							|  |  |  |  |                             if (pathData.Extension == ".vox" || pathData.Extension == ".qb") | 
					
						
							|  |  |  |  |                             { | 
					
						
							|  |  |  |  |                                 voxelData = VoxelFile.GetVoxelData( | 
					
						
							|  |  |  |  |                                     Util.FileToByte(pathData.Path), | 
					
						
							|  |  |  |  |                                     pathData.Extension == ".vox" | 
					
						
							|  |  |  |  |                                 ); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                                 // Rotate 180 in Y-Axis (No Rig Data) | 
					
						
							|  |  |  |  |                                 if (!FacingYPlusInMV) | 
					
						
							|  |  |  |  |                                 { | 
					
						
							|  |  |  |  |                                     voxelData.Rotate180InY(); | 
					
						
							|  |  |  |  |                                 } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                                 // Create Result | 
					
						
							|  |  |  |  |                                 var result = Core_Voxel.CreateLodModel( | 
					
						
							|  |  |  |  |                                     voxelData, | 
					
						
							|  |  |  |  |                                     ModelScale, | 
					
						
							|  |  |  |  |                                     useLOD ? LodNum : 1, | 
					
						
							|  |  |  |  |                                     useMaterial, | 
					
						
							|  |  |  |  |                                     LightMapSupportMode, | 
					
						
							|  |  |  |  |                                     ModelPivot | 
					
						
							|  |  |  |  |                                 ); | 
					
						
							|  |  |  |  |                                 if (TheExportMod == ExportMod.OriginalPath) | 
					
						
							|  |  |  |  |                                 { | 
					
						
							|  |  |  |  |                                     result.ExportRoot = Util.GetParentPath(pathData.Path); | 
					
						
							|  |  |  |  |                                     result.ExportSubRoot = ""; | 
					
						
							|  |  |  |  |                                 } | 
					
						
							|  |  |  |  |                                 else | 
					
						
							|  |  |  |  |                                 { | 
					
						
							|  |  |  |  |                                     result.ExportRoot = ExportPath; | 
					
						
							|  |  |  |  |                                     result.ExportSubRoot = pathData.Root; | 
					
						
							|  |  |  |  |                                 } | 
					
						
							|  |  |  |  |                                 result.FileName = fileName; | 
					
						
							|  |  |  |  |                                 result.Extension = task == Task.Obj ? ".obj" : ".prefab"; | 
					
						
							|  |  |  |  |                                 result.IsRigged = false; | 
					
						
							|  |  |  |  |                                 result.WithAvatar = false; | 
					
						
							|  |  |  |  |                                 resultList.Add(result); | 
					
						
							|  |  |  |  |                             } | 
					
						
							|  |  |  |  |                             break; | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                     successedNum++; | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 catch (System.Exception ex) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     failMessage += "\n[path] " + pathData.Path + "\n" + ex.Message; | 
					
						
							|  |  |  |  |                     failedNum++; | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             // File | 
					
						
							|  |  |  |  |             try | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 Core_File.CreateFileForResult( | 
					
						
							|  |  |  |  |                     resultList, | 
					
						
							|  |  |  |  |                     useMaterial ? TheShaders : new Shader[1] { TheDiffuseShader }, | 
					
						
							|  |  |  |  |                     ShaderKeywords, | 
					
						
							|  |  |  |  |                     ShaderValueRemaps, | 
					
						
							|  |  |  |  |                     ModelScale, | 
					
						
							|  |  |  |  |                     ModelPivot, | 
					
						
							|  |  |  |  |                     (Core_File.ReplacementMode)ReplacementModeIndex.Value, | 
					
						
							|  |  |  |  |                     ShaderMainTextureKeyword.Value | 
					
						
							|  |  |  |  |                 ); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 double taskTime = Util.StopWatchAndGetTime(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // Log Messages | 
					
						
							|  |  |  |  |                 if (successedNum > 0) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     string msg = string.Format("[Voxel] {0} model{1} created in {2}sec.", successedNum, (successedNum > 1 ? "s" : ""), taskTime.ToString("0.00")); | 
					
						
							|  |  |  |  |                     if (LogMessage) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         Debug.Log(msg); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                     if (ShowDialog) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         Util.Dialog("Success", msg, "OK"); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 if (failedNum > 0) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     string msg = string.Format(failMessage, failedNum.ToString(), (failedNum > 1 ? "s" : "")); | 
					
						
							|  |  |  |  |                     if (LogMessage) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         Debug.LogWarning(msg); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                     if (ShowDialog) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         Util.Dialog("Warning", msg, "OK"); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             catch (System.Exception ex) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 Debug.LogError(ex.Message); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             Util.ClearProgressBar(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         #endregion | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         #region --- LGC --- | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public static void LoadSetting() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             ViewPanelOpen.Load(); | 
					
						
							|  |  |  |  |             CreatePanelOpen.Load(); | 
					
						
							|  |  |  |  |             SettingPanelOpen.Load(); | 
					
						
							|  |  |  |  |             AboutPanelOpen.Load(); | 
					
						
							|  |  |  |  |             ModelGenerationSettingPanelOpen.Load(); | 
					
						
							|  |  |  |  |             SpriteGenerationSettingPanelOpen.Load(); | 
					
						
							|  |  |  |  |             SystemSettingPanelOpen.Load(); | 
					
						
							|  |  |  |  |             ToolPanelOpen.Load(); | 
					
						
							|  |  |  |  |             ColorfulTitle.Load(); | 
					
						
							|  |  |  |  |             ExportPath.Load(); | 
					
						
							|  |  |  |  |             ExportModIndex.Load(); | 
					
						
							|  |  |  |  |             ModelScale.Load(); | 
					
						
							|  |  |  |  |             LodNum.Load(); | 
					
						
							|  |  |  |  |             LogMessage.Load(); | 
					
						
							|  |  |  |  |             ShowDialog.Load(); | 
					
						
							|  |  |  |  |             LightMapSupportTypeIndex.Load(); | 
					
						
							|  |  |  |  |             OptimizationSettingPanelOpen.Load(); | 
					
						
							|  |  |  |  |             ShaderSettingPanelOpen.Load(); | 
					
						
							|  |  |  |  |             OptimizeFront.Load(); | 
					
						
							|  |  |  |  |             OptimizeBack.Load(); | 
					
						
							|  |  |  |  |             OptimizeUp.Load(); | 
					
						
							|  |  |  |  |             OptimizeDown.Load(); | 
					
						
							|  |  |  |  |             OptimizeLeft.Load(); | 
					
						
							|  |  |  |  |             OptimizeRight.Load(); | 
					
						
							|  |  |  |  |             EditorDockToScene.Load(); | 
					
						
							|  |  |  |  |             ModelPivot.Load(); | 
					
						
							|  |  |  |  |             FacingYPlusInMV.Load(); | 
					
						
							|  |  |  |  |             CurrentShowingShaderIndex.Load(); | 
					
						
							|  |  |  |  |             ReplacementModeIndex.Load(); | 
					
						
							|  |  |  |  |             ShaderMainTextureKeyword.Load(); | 
					
						
							|  |  |  |  |             for (int i = 0; i < Shader_Paths.Length; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 Shader_Paths[i].Load(); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             for (int i = 0; i < Shader_Keywords.Length; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 Shader_Keywords[i].Load(); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             for (int i = 0; i < Shader_ValueRemaps.Length; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 Shader_ValueRemaps[i].Load(); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static void SaveSetting() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             ViewPanelOpen.TrySave(); | 
					
						
							|  |  |  |  |             CreatePanelOpen.TrySave(); | 
					
						
							|  |  |  |  |             SettingPanelOpen.TrySave(); | 
					
						
							|  |  |  |  |             AboutPanelOpen.TrySave(); | 
					
						
							|  |  |  |  |             ModelGenerationSettingPanelOpen.TrySave(); | 
					
						
							|  |  |  |  |             SpriteGenerationSettingPanelOpen.TrySave(); | 
					
						
							|  |  |  |  |             SystemSettingPanelOpen.TrySave(); | 
					
						
							|  |  |  |  |             ToolPanelOpen.TrySave(); | 
					
						
							|  |  |  |  |             ColorfulTitle.TrySave(); | 
					
						
							|  |  |  |  |             ExportPath.TrySave(); | 
					
						
							|  |  |  |  |             ExportModIndex.TrySave(); | 
					
						
							|  |  |  |  |             ModelScale.TrySave(); | 
					
						
							|  |  |  |  |             LodNum.TrySave(); | 
					
						
							|  |  |  |  |             LogMessage.TrySave(); | 
					
						
							|  |  |  |  |             ShowDialog.TrySave(); | 
					
						
							|  |  |  |  |             LightMapSupportTypeIndex.TrySave(); | 
					
						
							|  |  |  |  |             OptimizationSettingPanelOpen.TrySave(); | 
					
						
							|  |  |  |  |             ShaderSettingPanelOpen.TrySave(); | 
					
						
							|  |  |  |  |             OptimizeFront.TrySave(); | 
					
						
							|  |  |  |  |             OptimizeBack.TrySave(); | 
					
						
							|  |  |  |  |             OptimizeUp.TrySave(); | 
					
						
							|  |  |  |  |             OptimizeDown.TrySave(); | 
					
						
							|  |  |  |  |             OptimizeLeft.TrySave(); | 
					
						
							|  |  |  |  |             OptimizeRight.TrySave(); | 
					
						
							|  |  |  |  |             EditorDockToScene.TrySave(); | 
					
						
							|  |  |  |  |             ModelPivot.TrySave(); | 
					
						
							|  |  |  |  |             FacingYPlusInMV.TrySave(); | 
					
						
							|  |  |  |  |             CurrentShowingShaderIndex.TrySave(); | 
					
						
							|  |  |  |  |             ReplacementModeIndex.TrySave(); | 
					
						
							|  |  |  |  |             ShaderMainTextureKeyword.TrySave(); | 
					
						
							|  |  |  |  |             for (int i = 0; i < Shader_Paths.Length; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 Shader_Paths[i].TrySave(); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             for (int i = 0; i < Shader_Keywords.Length; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 Shader_Keywords[i].TrySave(); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             for (int i = 0; i < Shader_ValueRemaps.Length; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 Shader_ValueRemaps[i].TrySave(); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static void RefreshSelection() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             VoxNum = 0; | 
					
						
							|  |  |  |  |             QbNum = 0; | 
					
						
							|  |  |  |  |             FolderNum = 0; | 
					
						
							|  |  |  |  |             JsonNum = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             // Fix Selection | 
					
						
							|  |  |  |  |             var fixedSelection = new List<KeyValuePair<Object, string>>(); | 
					
						
							|  |  |  |  |             for (int i = 0; i < Selection.objects.Length; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 fixedSelection.Add(new KeyValuePair<Object, string>( | 
					
						
							|  |  |  |  |                     Selection.objects[i], | 
					
						
							|  |  |  |  |                     AssetDatabase.GetAssetPath(Selection.objects[i])) | 
					
						
							|  |  |  |  |                 ); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             for (int i = 0; i < fixedSelection.Count; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 if (!fixedSelection[i].Key) { continue; } | 
					
						
							|  |  |  |  |                 var pathI = fixedSelection[i].Value; | 
					
						
							|  |  |  |  |                 for (int j = 0; j < fixedSelection.Count; j++) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     if (i == j || !fixedSelection[j].Key) { continue; } | 
					
						
							|  |  |  |  |                     var pathJ = fixedSelection[j].Value; | 
					
						
							|  |  |  |  |                     if (Util.IsChildPathCompair(pathJ, pathI)) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         fixedSelection[j] = new KeyValuePair<Object, string>(null, null); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             UpdateTaskMap(fixedSelection); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public static void UpdateTaskMap(List<KeyValuePair<Object, string>> fixedSelection) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             // Get Task Map | 
					
						
							|  |  |  |  |             TaskMap.Clear(); | 
					
						
							|  |  |  |  |             for (int i = 0; i < fixedSelection.Count; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 if (ReferenceEquals(fixedSelection[i].Key, null)) { continue; } | 
					
						
							|  |  |  |  |                 var obj = fixedSelection[i].Key; | 
					
						
							|  |  |  |  |                 var path = fixedSelection[i].Value; | 
					
						
							|  |  |  |  |                 path = Util.FixPath(path); | 
					
						
							|  |  |  |  |                 var ex = Util.GetExtension(path); | 
					
						
							|  |  |  |  |                 if (AssetDatabase.IsValidFolder(path)) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     FolderNum++; | 
					
						
							|  |  |  |  |                     var files = Util.GetFilesIn(path, "*.vox", "*.qb", "*.json"); | 
					
						
							|  |  |  |  |                     for (int j = 0; j < files.Length; j++) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         var filePath = Util.FixedRelativePath(files[j].FullName); | 
					
						
							|  |  |  |  |                         var fileEx = Util.GetExtension(filePath); | 
					
						
							|  |  |  |  |                         if (fileEx == ".vox" || fileEx == ".qb" || fileEx == ".json") | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             var fileObj = AssetDatabase.LoadAssetAtPath<Object>(filePath); | 
					
						
							|  |  |  |  |                             if (fileObj && !TaskMap.ContainsKey(fileObj)) | 
					
						
							|  |  |  |  |                             { | 
					
						
							|  |  |  |  |                                 TaskMap.Add(fileObj, new PathData() | 
					
						
							|  |  |  |  |                                 { | 
					
						
							|  |  |  |  |                                     Path = filePath, | 
					
						
							|  |  |  |  |                                     Extension = fileEx, | 
					
						
							|  |  |  |  |                                     Root = Util.FixPath(filePath.Substring( | 
					
						
							|  |  |  |  |                                         path.Length, | 
					
						
							|  |  |  |  |                                         filePath.Length - path.Length - Util.GetNameWithExtension(filePath).Length | 
					
						
							|  |  |  |  |                                     )), | 
					
						
							|  |  |  |  |                                 }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                                 if (fileEx == ".vox") | 
					
						
							|  |  |  |  |                                 { | 
					
						
							|  |  |  |  |                                     VoxNum++; | 
					
						
							|  |  |  |  |                                     FixVoxIcon(fileObj); | 
					
						
							|  |  |  |  |                                 } | 
					
						
							|  |  |  |  |                                 else if (fileEx == ".qb") | 
					
						
							|  |  |  |  |                                 { | 
					
						
							|  |  |  |  |                                     QbNum++; | 
					
						
							|  |  |  |  |                                     FixQbIcon(fileObj); | 
					
						
							|  |  |  |  |                                 } | 
					
						
							|  |  |  |  |                                 else if (fileEx == ".json") | 
					
						
							|  |  |  |  |                                 { | 
					
						
							|  |  |  |  |                                     JsonNum++; | 
					
						
							|  |  |  |  |                                     FixJsonIcon(fileObj); | 
					
						
							|  |  |  |  |                                 } | 
					
						
							|  |  |  |  |                             } | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 else if (ex == ".vox" || ex == ".qb" || ex == ".json") | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     if (!TaskMap.ContainsKey(obj)) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         TaskMap.Add(obj, new PathData() | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             Path = path, | 
					
						
							|  |  |  |  |                             Extension = ex, | 
					
						
							|  |  |  |  |                             Root = "", | 
					
						
							|  |  |  |  |                         }); | 
					
						
							|  |  |  |  |                         if (ex == ".vox") | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             VoxNum++; | 
					
						
							|  |  |  |  |                             FixVoxIcon(obj); | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                         else if (ex == ".qb") | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             QbNum++; | 
					
						
							|  |  |  |  |                             FixQbIcon(obj); | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                         else if (ex == ".json") | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             JsonNum++; | 
					
						
							|  |  |  |  |                             FixJsonIcon(obj); | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             ObjNum = Selection.objects.Length; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static void ForAllSelection(System.Action<PathData> action) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             foreach (var key_Value in TaskMap) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 action(key_Value.Value); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static void FixVoxIcon(Object vox) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (!VoxFileIcon) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 VoxFileIcon = AssetPreview.GetMiniThumbnail(vox); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |         private static void FixQbIcon(Object qb) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (!QbFileIcon) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 QbFileIcon = AssetPreview.GetMiniThumbnail(qb); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |         private static void FixJsonIcon(Object json) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (!JsonFileIcon) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 JsonFileIcon = AssetPreview.GetMiniThumbnail(json); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static bool BrowseExportPath() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             string newPath = Util.FixPath(EditorUtility.OpenFolderPanel("Select Export Path", ExportPath, "")); | 
					
						
							|  |  |  |  |             if (!string.IsNullOrEmpty(newPath)) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 newPath = Util.FixedRelativePath(newPath); | 
					
						
							|  |  |  |  |                 if (!string.IsNullOrEmpty(newPath)) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     ExportPath.Value = newPath; | 
					
						
							|  |  |  |  |                     return true; | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 else | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     Util.Dialog("Warning", "Export path must in Assets folder.", "OK"); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             return false; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         #endregion | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         #region --- UTL --- | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public static void RefreshMergeSetting() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             Core_Voxel.SetMergeInDirection(OptimizeFront, OptimizeBack, OptimizeUp, OptimizeDown, OptimizeLeft, OptimizeRight); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static void ShaderPropertyGUI(int index, string name) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             const int GAP = 12; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (index < 0) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 // Title | 
					
						
							|  |  |  |  |                 LayoutH(() => | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     EditorGUI.LabelField(GUIRect(0, 16), ""); | 
					
						
							|  |  |  |  |                     EditorGUI.LabelField(GUIRect(0, 16), "Keyword", EditorStyles.centeredGreyMiniLabel); | 
					
						
							|  |  |  |  |                     Space(GAP); | 
					
						
							|  |  |  |  |                     EditorGUI.LabelField(GUIRect(18 * 4 + 30 + 2 + 2, 16), "Remap", EditorStyles.centeredGreyMiniLabel); | 
					
						
							|  |  |  |  |                 }); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             else | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 // Content | 
					
						
							|  |  |  |  |                 LayoutH(() => | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     EditorGUI.LabelField(GUIRect(0, 16), name); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     Shader_Keywords[index].Value = EditorGUI.TextField(GUIRect(0, 16), Shader_Keywords[index]); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     Space(GAP); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     bool oldE = GUI.enabled; | 
					
						
							|  |  |  |  |                     GUI.enabled = false; | 
					
						
							|  |  |  |  |                     EditorGUI.FloatField(GUIRect(18, 16), SHADER_VALUE_REMAP_SOURCE[index].x); | 
					
						
							|  |  |  |  |                     Space(2); | 
					
						
							|  |  |  |  |                     EditorGUI.FloatField(GUIRect(30, 16), SHADER_VALUE_REMAP_SOURCE[index].y); | 
					
						
							|  |  |  |  |                     GUI.enabled = oldE; | 
					
						
							|  |  |  |  |                     EditorGUI.LabelField(GUIRect(18, 16), "→", EditorStyles.centeredGreyMiniLabel); | 
					
						
							|  |  |  |  |                     Vector2 newRemap = Vector2.zero; | 
					
						
							|  |  |  |  |                     newRemap.x = EditorGUI.FloatField(GUIRect(18, 16), Shader_ValueRemaps[index].Value.x); | 
					
						
							|  |  |  |  |                     Space(2); | 
					
						
							|  |  |  |  |                     newRemap.y = EditorGUI.FloatField(GUIRect(18, 16), Shader_ValueRemaps[index].Value.y); | 
					
						
							|  |  |  |  |                     Shader_ValueRemaps[index].Value = newRemap; | 
					
						
							|  |  |  |  |                 }); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         #endregion | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     [CustomEditor(typeof(DefaultAsset)), CanEditMultipleObjects] | 
					
						
							|  |  |  |  |     public class VoxelInspector : Editor | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private void OnEnable() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (HasVoxelTarget()) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 VoxelToUnityWindow.Window_Enable(); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public override void OnInspectorGUI() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             base.OnInspectorGUI(); | 
					
						
							|  |  |  |  |             if (HasVoxelTarget()) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 bool oldE = GUI.enabled; | 
					
						
							|  |  |  |  |                 GUI.enabled = true; | 
					
						
							|  |  |  |  |                 VoxelToUnityWindow.Window_Main(); | 
					
						
							|  |  |  |  |                 GUI.enabled = oldE; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private bool HasVoxelTarget() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             for (int i = 0; i < targets.Length; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 string path = AssetDatabase.GetAssetPath(targets[i]); | 
					
						
							|  |  |  |  |                 string ex = Util.GetExtension(path); | 
					
						
							|  |  |  |  |                 if (ex == ".vox" || ex == ".qb" || Util.HasFileIn(path, "*.vox", "*.qb")) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     return true; | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             return false; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | } |