using System; using System.Linq; using System.Reflection; using UnityEditor; using UnityEngine; namespace ABI.CCK.Scripts.Editor.AssetProcessing { /* public class CCK_AssetPostProcessor { #region Configuration private const string KEY_PREFIX = "ABI.CCK.AssetPostProcessor."; private static bool AutoHumanoid => EditorPrefs.GetBool("ABI_CCK_AssetPostProcessor_AutoHumanoid", false); private static bool AutoReadWrite => EditorPrefs.GetBool("ABI_CCK_AssetPostProcessor_AutoReadWrite", false); private static bool AutoBlendShapeNormals => EditorPrefs.GetBool("ABI_CCK_AssetPostProcessor_AutoBlendshapeNormals", false); private static bool AutoTextureStreaming => EditorPrefs.GetBool("ABI_CCK_AssetPostProcessor_AutoTextureStreaming", false); #endregion private static bool _isProcessingModel; private static ModelImporter _modelImporter; private static PropertyInfo _legacyBlendShapeImporter; private static PropertyInfo legacyBlendShapeImporter { get { if(_legacyBlendShapeImporter != null) return _legacyBlendShapeImporter; Type modelImporterType = typeof(ModelImporter); _legacyBlendShapeImporter = modelImporterType.GetProperty( "legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public ); return _legacyBlendShapeImporter; } } #region Asset Post Processing Events private void OnPreprocessModel() { _isProcessingModel = false; _modelImporter = assetImporter as ModelImporter; if (_modelImporter == null) return; // Check if we have already processed this model if (!ShouldProcessAsset(_modelImporter.assetPath, out string assetKey)) return; _isProcessingModel = true; SessionState.SetBool(assetKey, true); SetModelImporterSettings(_modelImporter); } private void OnPostprocessMeshHierarchy(GameObject root) { if (!_isProcessingModel) return; if (!AutoHumanoid) return; // Check if the model should be humanoid var childTransforms = root.GetComponentsInChildren(); // Check if the model has enough bones to be humanoid if (childTransforms.Length < HumanTrait.RequiredBoneCount) return; // Check if the model has enough *potential* humanoid bones to be humanoid int potentialHumanBoneCount = childTransforms.Count(childTransform => childTransform.name.IndexOf("armature", StringComparison.OrdinalIgnoreCase) >= 0 || childTransform.name.IndexOf("hip", StringComparison.OrdinalIgnoreCase) >= 0 || childTransform.name.IndexOf("hand", StringComparison.OrdinalIgnoreCase) >= 0 || childTransform.name.IndexOf("head", StringComparison.OrdinalIgnoreCase) >= 0); // IKSystem will still filter it if it doesn't have enough bones // VRIK requires hips to head, arms, and either both legs or neither leg. if (potentialHumanBoneCount < 3) return; _modelImporter.animationType = ModelImporterAnimationType.Human; } private void OnPreprocessTexture() { TextureImporter textureImporter = assetImporter as TextureImporter; if (textureImporter == null) return; if (!ShouldProcessAsset(textureImporter.assetPath, out string assetKey)) return; SessionState.SetBool(assetKey, true); SetTextureImporterSettings(textureImporter); } private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { foreach (string deletedAsset in deletedAssets) { string assetKey = KEY_PREFIX + AssetDatabase.AssetPathToGUID(deletedAsset); SessionState.EraseBool(assetKey); // Remove the asset from the list of processed assets, so it can be processed again if re-imported CCK_AutoCleanupProcessor.OnProcessDeletedAsset(deletedAsset); } } #endregion #region Private Methods private static bool ShouldProcessAsset(string assetPath, out string assetKey) { assetKey = KEY_PREFIX + AssetDatabase.AssetPathToGUID(assetPath); return !SessionState.GetBool(assetKey, false); } // TODO: Is there anything else we need to set? private static void SetModelImporterSettings(ModelImporter modelImporter) { if (AutoReadWrite) modelImporter.isReadable = true; if (AutoBlendShapeNormals) modelImporter.importBlendShapeNormals = ModelImporterNormals.Import; //if(modelImporter.importBlendShapeNormals != ModelImporterNormals.Calculate) legacyBlendShapeImporter.SetValue(modelImporter, true); } private static void SetTextureImporterSettings(TextureImporter textureImporter) { if (AutoTextureStreaming) textureImporter.streamingMipmaps = true; } #endregion } */ }