ExportModelSettings.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. using UnityEditor;
  2. using UnityEngine;
  3. namespace UnityEditor.Formats.Fbx.Exporter
  4. {
  5. [CustomEditor (typeof(ExportModelSettings))]
  6. internal class ExportModelSettingsEditor : UnityEditor.Editor
  7. {
  8. private const float LabelWidth = 175;
  9. private const float FieldOffset = 18;
  10. private string[] exportFormatOptions = new string[]{ "ASCII", "Binary" };
  11. private string[] includeOptions = new string[]{"Model(s) Only", "Animation Only", "Model(s) + Animation"};
  12. private string[] lodOptions = new string[]{"All Levels", "Highest", "Lowest"};
  13. public const string singleHierarchyOption = "Local Pivot";
  14. public const string multiHerarchyOption = "Local Centered";
  15. private string hierarchyDepOption = "";
  16. private string[] objPositionOptions { get { return new string[]{hierarchyDepOption, "World Absolute"}; }}
  17. private bool disableIncludeDropdown = false;
  18. public void SetIsSingleHierarchy(bool singleHierarchy){
  19. if (singleHierarchy) {
  20. hierarchyDepOption = singleHierarchyOption;
  21. return;
  22. }
  23. hierarchyDepOption = multiHerarchyOption;
  24. }
  25. public void DisableIncludeDropdown(bool disable){
  26. disableIncludeDropdown = disable;
  27. }
  28. public override void OnInspectorGUI ()
  29. {
  30. var exportSettings = ((ExportModelSettings)target).info;
  31. EditorGUIUtility.labelWidth = LabelWidth;
  32. GUILayout.BeginHorizontal();
  33. EditorGUILayout.LabelField(new GUIContent("Export Format", "Export the FBX file in the standard binary format." +
  34. " Select ASCII to export the FBX file in ASCII format."), GUILayout.Width(LabelWidth - FieldOffset));
  35. exportSettings.SetExportFormat((ExportSettings.ExportFormat)EditorGUILayout.Popup((int)exportSettings.ExportFormat, exportFormatOptions) );
  36. GUILayout.EndHorizontal();
  37. GUILayout.BeginHorizontal();
  38. EditorGUILayout.LabelField(new GUIContent("Include", "Select whether to export models, animation or both."), GUILayout.Width(LabelWidth - FieldOffset));
  39. EditorGUI.BeginDisabledGroup(disableIncludeDropdown);
  40. exportSettings.SetModelAnimIncludeOption((ExportSettings.Include)EditorGUILayout.Popup((int)exportSettings.ModelAnimIncludeOption, includeOptions));
  41. EditorGUI.EndDisabledGroup ();
  42. GUILayout.EndHorizontal();
  43. GUILayout.BeginHorizontal();
  44. EditorGUILayout.LabelField(new GUIContent("LOD level", "Select which LOD to export."), GUILayout.Width(LabelWidth - FieldOffset));
  45. // greyed out if animation only
  46. EditorGUI.BeginDisabledGroup(exportSettings.ModelAnimIncludeOption == ExportSettings.Include.Anim);
  47. exportSettings.SetLODExportType((ExportSettings.LODExportType)EditorGUILayout.Popup((int)exportSettings.LODExportType, lodOptions));
  48. EditorGUI.EndDisabledGroup ();
  49. GUILayout.EndHorizontal();
  50. GUILayout.BeginHorizontal();
  51. EditorGUILayout.LabelField(new GUIContent("Object(s) Position", "Select an option for exporting object's transform."), GUILayout.Width(LabelWidth - FieldOffset));
  52. // greyed out if animation only
  53. EditorGUI.BeginDisabledGroup(exportSettings.ModelAnimIncludeOption == ExportSettings.Include.Anim);
  54. exportSettings.SetObjectPosition((ExportSettings.ObjectPosition)EditorGUILayout.Popup((int)exportSettings.ObjectPosition, objPositionOptions));
  55. EditorGUI.EndDisabledGroup ();
  56. GUILayout.EndHorizontal();
  57. GUILayout.BeginHorizontal();
  58. EditorGUILayout.LabelField(new GUIContent("Animated Skinned Mesh",
  59. "If checked, animation on objects with skinned meshes will be exported"), GUILayout.Width(LabelWidth - FieldOffset));
  60. // greyed out if model
  61. EditorGUI.BeginDisabledGroup(exportSettings.ModelAnimIncludeOption == ExportSettings.Include.Model);
  62. exportSettings.SetAnimatedSkinnedMesh(EditorGUILayout.Toggle(exportSettings.AnimateSkinnedMesh));
  63. EditorGUI.EndDisabledGroup ();
  64. GUILayout.EndHorizontal ();
  65. exportSettings.SetUseMayaCompatibleNames(EditorGUILayout.Toggle (
  66. new GUIContent ("Compatible Naming",
  67. "In Maya some symbols such as spaces and accents get replaced when importing an FBX " +
  68. "(e.g. \"foo bar\" becomes \"fooFBXASC032bar\"). " +
  69. "On export, convert the names of GameObjects so they are Maya compatible." +
  70. (exportSettings.UseMayaCompatibleNames ? "" :
  71. "\n\nWARNING: Disabling this feature may result in lost material connections," +
  72. " and unexpected character replacements in Maya.")
  73. ),
  74. exportSettings.UseMayaCompatibleNames));
  75. GUILayout.BeginHorizontal();
  76. EditorGUILayout.LabelField(new GUIContent("Export Unrendered",
  77. "If checked, meshes will be exported even if they don't have a Renderer component."), GUILayout.Width(LabelWidth - FieldOffset));
  78. // greyed out if animation only
  79. EditorGUI.BeginDisabledGroup(exportSettings.ModelAnimIncludeOption == ExportSettings.Include.Anim);
  80. exportSettings.SetExportUnredererd(EditorGUILayout.Toggle(exportSettings.ExportUnrendered));
  81. EditorGUI.EndDisabledGroup ();
  82. GUILayout.EndHorizontal ();
  83. GUILayout.BeginHorizontal();
  84. EditorGUILayout.LabelField(new GUIContent("Preserve Import Settings",
  85. "If checked, the import settings from the overwritten FBX will be carried over to the new version."), GUILayout.Width(LabelWidth - FieldOffset));
  86. // greyed out if exporting outside assets folder
  87. EditorGUI.BeginDisabledGroup(ExportSettings.instance.ExportOutsideProject);
  88. exportSettings.SetPreserveImportSettings(EditorGUILayout.Toggle(exportSettings.PreserveImportSettings));
  89. EditorGUI.EndDisabledGroup();
  90. GUILayout.EndHorizontal();
  91. }
  92. }
  93. internal interface IExportOptions {
  94. ExportSettings.ExportFormat ExportFormat { get; }
  95. ExportSettings.Include ModelAnimIncludeOption { get; }
  96. ExportSettings.LODExportType LODExportType { get; }
  97. ExportSettings.ObjectPosition ObjectPosition { get; }
  98. bool AnimateSkinnedMesh { get; }
  99. bool UseMayaCompatibleNames { get; }
  100. bool AllowSceneModification { get; }
  101. bool ExportUnrendered { get; }
  102. bool PreserveImportSettings { get; }
  103. Transform AnimationSource { get; }
  104. Transform AnimationDest { get; }
  105. }
  106. internal abstract class ExportOptionsSettingsBase<T> : ScriptableObject where T : ExportOptionsSettingsSerializeBase, new()
  107. {
  108. private T m_info = new T();
  109. public T info {
  110. get { return m_info; }
  111. set { m_info = value; }
  112. }
  113. }
  114. internal class ExportModelSettings : ExportOptionsSettingsBase<ExportModelSettingsSerialize>
  115. {}
  116. [System.Serializable]
  117. internal abstract class ExportOptionsSettingsSerializeBase : IExportOptions
  118. {
  119. [SerializeField]
  120. private ExportSettings.ExportFormat exportFormat = ExportSettings.ExportFormat.ASCII;
  121. [SerializeField]
  122. private bool animatedSkinnedMesh = false;
  123. [SerializeField]
  124. private bool mayaCompatibleNaming = true;
  125. [System.NonSerialized]
  126. private Transform animSource;
  127. [System.NonSerialized]
  128. private Transform animDest;
  129. public ExportSettings.ExportFormat ExportFormat { get { return exportFormat; } }
  130. public void SetExportFormat(ExportSettings.ExportFormat format){ this.exportFormat = format; }
  131. public bool AnimateSkinnedMesh { get { return animatedSkinnedMesh; } }
  132. public void SetAnimatedSkinnedMesh(bool animatedSkinnedMesh){ this.animatedSkinnedMesh = animatedSkinnedMesh; }
  133. public bool UseMayaCompatibleNames { get { return mayaCompatibleNaming; } }
  134. public void SetUseMayaCompatibleNames(bool useMayaCompNames){ this.mayaCompatibleNaming = useMayaCompNames; }
  135. public Transform AnimationSource { get { return animSource; } }
  136. public void SetAnimationSource(Transform source) { this.animSource = source; }
  137. public Transform AnimationDest { get { return animDest; } }
  138. public void SetAnimationDest(Transform dest) { this.animDest = dest; }
  139. public abstract ExportSettings.Include ModelAnimIncludeOption { get; }
  140. public abstract ExportSettings.LODExportType LODExportType { get; }
  141. public abstract ExportSettings.ObjectPosition ObjectPosition { get; }
  142. public abstract bool ExportUnrendered { get; }
  143. public virtual bool PreserveImportSettings { get; }
  144. public abstract bool AllowSceneModification { get; }
  145. }
  146. [System.Serializable]
  147. internal class ExportModelSettingsSerialize : ExportOptionsSettingsSerializeBase
  148. {
  149. [SerializeField]
  150. private ExportSettings.Include include = ExportSettings.Include.ModelAndAnim;
  151. [SerializeField]
  152. private ExportSettings.LODExportType lodLevel = ExportSettings.LODExportType.All;
  153. [SerializeField]
  154. private ExportSettings.ObjectPosition objectPosition = ExportSettings.ObjectPosition.LocalCentered;
  155. [SerializeField]
  156. private bool exportUnrendered = true;
  157. private bool preserveImportSettings = false;
  158. public override ExportSettings.Include ModelAnimIncludeOption { get { return include; } }
  159. public void SetModelAnimIncludeOption(ExportSettings.Include include) { this.include = include; }
  160. public override ExportSettings.LODExportType LODExportType { get { return lodLevel; } }
  161. public void SetLODExportType(ExportSettings.LODExportType lodLevel){ this.lodLevel = lodLevel; }
  162. public override ExportSettings.ObjectPosition ObjectPosition { get { return objectPosition; } }
  163. public void SetObjectPosition(ExportSettings.ObjectPosition objPos){ this.objectPosition = objPos; }
  164. public override bool ExportUnrendered { get { return exportUnrendered; } }
  165. public void SetExportUnredererd(bool exportUnrendered){ this.exportUnrendered = exportUnrendered; }
  166. public override bool PreserveImportSettings { get { return preserveImportSettings; } }
  167. public void SetPreserveImportSettings(bool preserveImportSettings){ this.preserveImportSettings = preserveImportSettings && !ExportSettings.instance.ExportOutsideProject; }
  168. public override bool AllowSceneModification { get { return false; } }
  169. }
  170. }