VoxelScriptedImporterEditor.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. #if UNITY_2017_1_OR_NEWER
  2. using UnityEngine;
  3. using UnityEditor;
  4. using UnityEditor.Experimental.AssetImporters;
  5. using System;
  6. namespace VoxelImporter
  7. {
  8. [CustomEditor(typeof(VoxelScriptedImporter)), CanEditMultipleObjects]
  9. public class VoxelScriptedImporterEditor : ScriptedImporterEditor
  10. {
  11. private static bool advancedMode;
  12. private static bool generateLightmapUVsAdvanced = false;
  13. private SerializedProperty legacyVoxImportProp;
  14. private SerializedProperty importModeProp;
  15. private SerializedProperty importScaleProp;
  16. private SerializedProperty importOffsetProp;
  17. private SerializedProperty combineFacesProp;
  18. private SerializedProperty ignoreCavityProp;
  19. private SerializedProperty outputStructureProp;
  20. private SerializedProperty generateLightmapUVsProp;
  21. private SerializedProperty generateLightmapUVsAngleErrorProp;
  22. private SerializedProperty generateLightmapUVsAreaErrorProp;
  23. private SerializedProperty generateLightmapUVsHardAngleProp;
  24. private SerializedProperty generateLightmapUVsPackMarginProp;
  25. private SerializedProperty generateTangentsProp;
  26. private SerializedProperty meshFaceVertexOffsetProp;
  27. private SerializedProperty retainExistingProp;
  28. private SerializedProperty loadFromVoxelFileProp;
  29. private SerializedProperty generateMipMapsProp;
  30. private SerializedProperty colliderTypeProp;
  31. private readonly GUIContent[] ImportModeStrings =
  32. {
  33. new GUIContent(VoxelBase.ImportMode.LowTexture.ToString()),
  34. new GUIContent(VoxelBase.ImportMode.LowPoly.ToString()),
  35. };
  36. private readonly int[] ImportModeValues =
  37. {
  38. (int)VoxelBase.ImportMode.LowTexture,
  39. (int)VoxelBase.ImportMode.LowPoly,
  40. };
  41. private readonly GUIContent[] ColliderTypeStrings =
  42. {
  43. new GUIContent(VoxelScriptedImporter.ColliderType.None.ToString()),
  44. new GUIContent(VoxelScriptedImporter.ColliderType.Box.ToString()),
  45. new GUIContent(VoxelScriptedImporter.ColliderType.Sphere.ToString()),
  46. new GUIContent(VoxelScriptedImporter.ColliderType.Capsule.ToString()),
  47. new GUIContent(VoxelScriptedImporter.ColliderType.Mesh.ToString()),
  48. };
  49. private readonly int[] ColliderTypeValues =
  50. {
  51. (int)VoxelScriptedImporter.ColliderType.None,
  52. (int)VoxelScriptedImporter.ColliderType.Box,
  53. (int)VoxelScriptedImporter.ColliderType.Sphere,
  54. (int)VoxelScriptedImporter.ColliderType.Capsule,
  55. (int)VoxelScriptedImporter.ColliderType.Mesh,
  56. };
  57. public override void OnEnable()
  58. {
  59. base.OnEnable();
  60. legacyVoxImportProp = serializedObject.FindProperty("legacyVoxImport");
  61. importModeProp = serializedObject.FindProperty("importMode");
  62. importScaleProp = serializedObject.FindProperty("importScale");
  63. importOffsetProp = serializedObject.FindProperty("importOffset");
  64. combineFacesProp = serializedObject.FindProperty("combineFaces");
  65. ignoreCavityProp = serializedObject.FindProperty("ignoreCavity");
  66. outputStructureProp = serializedObject.FindProperty("outputStructure");
  67. generateLightmapUVsProp = serializedObject.FindProperty("generateLightmapUVs");
  68. generateLightmapUVsAngleErrorProp = serializedObject.FindProperty("generateLightmapUVsAngleError");
  69. generateLightmapUVsAreaErrorProp = serializedObject.FindProperty("generateLightmapUVsAreaError");
  70. generateLightmapUVsHardAngleProp = serializedObject.FindProperty("generateLightmapUVsHardAngle");
  71. generateLightmapUVsPackMarginProp = serializedObject.FindProperty("generateLightmapUVsPackMargin");
  72. generateTangentsProp = serializedObject.FindProperty("generateTangents");
  73. meshFaceVertexOffsetProp = serializedObject.FindProperty("meshFaceVertexOffset");
  74. retainExistingProp = serializedObject.FindProperty("retainExisting");
  75. loadFromVoxelFileProp = serializedObject.FindProperty("loadFromVoxelFile");
  76. generateMipMapsProp = serializedObject.FindProperty("generateMipMaps");
  77. colliderTypeProp = serializedObject.FindProperty("colliderType");
  78. }
  79. public override void OnInspectorGUI()
  80. {
  81. var vtarget = target as VoxelScriptedImporter;
  82. if (vtarget == null)
  83. {
  84. base.OnInspectorGUI();
  85. return;
  86. }
  87. #region Simple
  88. {
  89. EditorGUI.BeginChangeCheck();
  90. var mode = GUILayout.Toolbar(advancedMode ? 1 : 0, VoxelBaseEditor.Edit_AdvancedModeStrings);
  91. if (EditorGUI.EndChangeCheck())
  92. {
  93. advancedMode = mode != 0 ? true : false;
  94. }
  95. }
  96. #endregion
  97. #region Settings
  98. {
  99. EditorGUILayout.LabelField("Settings", EditorStyles.boldLabel);
  100. EditorGUI.indentLevel++;
  101. {
  102. if (advancedMode)
  103. {
  104. if (vtarget.fileType == VoxelBase.FileType.vox)
  105. {
  106. EditorGUILayout.PropertyField(legacyVoxImportProp, new GUIContent("Legacy Vox Import", "Import with legacy behavior up to Version 1.1.2.\nMultiple objects do not correspond.\nIt is deprecated for future use.\nThis is left for compatibility."));
  107. }
  108. EditorGUILayout.IntPopup(importModeProp, ImportModeStrings, ImportModeValues, new GUIContent("Import Mode"));
  109. }
  110. EditorGUILayout.PropertyField(importScaleProp);
  111. EditorGUILayout.PropertyField(importOffsetProp);
  112. }
  113. EditorGUI.indentLevel--;
  114. }
  115. #endregion
  116. #region Optimize
  117. if (advancedMode)
  118. {
  119. EditorGUILayout.LabelField("Optimize", EditorStyles.boldLabel);
  120. EditorGUI.indentLevel++;
  121. {
  122. EditorGUILayout.PropertyField(combineFacesProp, new GUIContent("Combine Voxel Faces"));
  123. EditorGUILayout.PropertyField(ignoreCavityProp, new GUIContent("Ignore Cavity"));
  124. }
  125. EditorGUI.indentLevel--;
  126. }
  127. #endregion
  128. #region Output
  129. if (advancedMode)
  130. {
  131. EditorGUILayout.LabelField("Output", EditorStyles.boldLabel);
  132. EditorGUI.indentLevel++;
  133. {
  134. EditorGUILayout.PropertyField(outputStructureProp, new GUIContent("Voxel Structure", "Save the structure information."));
  135. }
  136. EditorGUI.indentLevel--;
  137. }
  138. #endregion
  139. #region Mesh
  140. if (advancedMode)
  141. {
  142. EditorGUILayout.LabelField("Mesh", EditorStyles.boldLabel);
  143. EditorGUI.indentLevel++;
  144. {
  145. EditorGUILayout.PropertyField(generateLightmapUVsProp, new GUIContent("Generate Lightmap UVs", "Generate lightmap UVs into UV2."));
  146. if (generateLightmapUVsProp.boolValue)
  147. {
  148. EditorGUI.indentLevel++;
  149. generateLightmapUVsAdvanced = EditorGUILayout.Foldout(generateLightmapUVsAdvanced, new GUIContent("Advanced"));
  150. if (generateLightmapUVsAdvanced)
  151. {
  152. {
  153. EditorGUI.BeginChangeCheck();
  154. EditorGUILayout.Slider(generateLightmapUVsHardAngleProp, 0f, 180f, new GUIContent("Hard Angle", "Angle between neighbor triangles that will generate seam."));
  155. if (EditorGUI.EndChangeCheck())
  156. {
  157. generateLightmapUVsHardAngleProp.floatValue = Mathf.Round(generateLightmapUVsHardAngleProp.floatValue);
  158. }
  159. }
  160. {
  161. EditorGUI.BeginChangeCheck();
  162. EditorGUILayout.Slider(generateLightmapUVsPackMarginProp, 1f, 64f, new GUIContent("Pack Margin", "Measured in pixels, assuming mesh will cover an entire 1024x1024 lightmap."));
  163. if (EditorGUI.EndChangeCheck())
  164. {
  165. generateLightmapUVsPackMarginProp.floatValue = Mathf.Round(generateLightmapUVsPackMarginProp.floatValue);
  166. }
  167. }
  168. {
  169. EditorGUI.BeginChangeCheck();
  170. EditorGUILayout.Slider(generateLightmapUVsAngleErrorProp, 1f, 75f, new GUIContent("Angle Error", "Measured in percents. Angle error measures deviation of UV angles from geometry angles. Area error measures deviation of UV triangles area from geometry triangles if they were uniformly scaled."));
  171. if (EditorGUI.EndChangeCheck())
  172. {
  173. generateLightmapUVsAngleErrorProp.floatValue = Mathf.Round(generateLightmapUVsAngleErrorProp.floatValue);
  174. }
  175. }
  176. {
  177. EditorGUI.BeginChangeCheck();
  178. EditorGUILayout.Slider(generateLightmapUVsAreaErrorProp, 1f, 75f, new GUIContent("Area Error"));
  179. if (EditorGUI.EndChangeCheck())
  180. {
  181. generateLightmapUVsAreaErrorProp.floatValue = Mathf.Round(generateLightmapUVsAreaErrorProp.floatValue);
  182. }
  183. }
  184. }
  185. EditorGUI.indentLevel--;
  186. }
  187. EditorGUILayout.PropertyField(generateTangentsProp, new GUIContent("Generate Tangents", "Generate Tangents."));
  188. EditorGUILayout.Slider(meshFaceVertexOffsetProp, 0f, 0.01f, new GUIContent("Vertex Offset", "Increase this value if flickering of polygon gaps occurs at low resolution."));
  189. }
  190. EditorGUI.indentLevel--;
  191. }
  192. #endregion
  193. #region Material
  194. if (advancedMode)
  195. {
  196. EditorGUILayout.LabelField("Material", EditorStyles.boldLabel);
  197. EditorGUI.indentLevel++;
  198. {
  199. EditorGUILayout.PropertyField(retainExistingProp, new GUIContent("Retain Existing Materials", "When disabled, existing settings are always discarded."));
  200. EditorGUILayout.PropertyField(loadFromVoxelFileProp, new GUIContent("Import Materials"));
  201. }
  202. EditorGUI.indentLevel--;
  203. }
  204. #endregion
  205. #region Texture
  206. if (advancedMode)
  207. {
  208. EditorGUILayout.LabelField("Texture", EditorStyles.boldLabel);
  209. EditorGUI.indentLevel++;
  210. {
  211. EditorGUILayout.PropertyField(generateMipMapsProp, new GUIContent("Generate Mip Maps"));
  212. }
  213. EditorGUI.indentLevel--;
  214. }
  215. #endregion
  216. #region Collider
  217. if (advancedMode)
  218. {
  219. EditorGUILayout.LabelField("Collider", EditorStyles.boldLabel);
  220. EditorGUI.indentLevel++;
  221. {
  222. EditorGUILayout.IntPopup(colliderTypeProp, ColliderTypeStrings, ColliderTypeValues, new GUIContent("Generate Colliders"));
  223. }
  224. EditorGUI.indentLevel--;
  225. }
  226. #endregion
  227. ApplyRevertGUI();
  228. }
  229. }
  230. }
  231. #endif