123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- using UnityEngine;
- using UnityEditor;
- using System.Linq;
- using System.IO;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine.TextCore;
- using UnityEngine.TextCore.LowLevel;
- using TMPro;
- namespace TMPro
- {
- public static class TMP_FontAsset_CreationMenu
- {
- /*
- [MenuItem("Assets/Create/TextMeshPro/Font Asset Fallback", false, 105)]
- public static void CreateFallbackFontAsset()
- {
- Object target = Selection.activeObject;
- // Make sure the selection is a font file
- if (target == null || target.GetType() != typeof(TMP_FontAsset))
- {
- Debug.LogWarning("A Font file must first be selected in order to create a Font Asset.");
- return;
- }
- TMP_FontAsset sourceFontAsset = (TMP_FontAsset)target;
- string sourceFontFilePath = AssetDatabase.GetAssetPath(target);
- string folderPath = Path.GetDirectoryName(sourceFontFilePath);
- string assetName = Path.GetFileNameWithoutExtension(sourceFontFilePath);
- string newAssetFilePathWithName = AssetDatabase.GenerateUniqueAssetPath(folderPath + "/" + assetName + " - Fallback.asset");
- //// Create new TM Font Asset.
- TMP_FontAsset fontAsset = ScriptableObject.CreateInstance<TMP_FontAsset>();
- AssetDatabase.CreateAsset(fontAsset, newAssetFilePathWithName);
- fontAsset.version = "1.1.0";
- fontAsset.faceInfo = sourceFontAsset.faceInfo;
- fontAsset.m_SourceFontFileGUID = sourceFontAsset.m_SourceFontFileGUID;
- fontAsset.m_SourceFontFile_EditorRef = sourceFontAsset.m_SourceFontFile_EditorRef;
- fontAsset.atlasPopulationMode = TMP_FontAsset.AtlasPopulationMode.Dynamic;
- int atlasWidth = fontAsset.atlasWidth = sourceFontAsset.atlasWidth;
- int atlasHeight = fontAsset.atlasHeight = sourceFontAsset.atlasHeight;
- int atlasPadding = fontAsset.atlasPadding = sourceFontAsset.atlasPadding;
- fontAsset.atlasRenderMode = sourceFontAsset.atlasRenderMode;
- // Initialize array for the font atlas textures.
- fontAsset.atlasTextures = new Texture2D[1];
- // Create and add font atlas texture
- Texture2D texture = new Texture2D(atlasWidth, atlasHeight, TextureFormat.Alpha8, false);
- Color32[] colors = new Color32[atlasWidth * atlasHeight];
- texture.SetPixels32(colors);
- texture.name = assetName + " Atlas";
- fontAsset.atlasTextures[0] = texture;
- AssetDatabase.AddObjectToAsset(texture, fontAsset);
- // Add free rectangle of the size of the texture.
- int packingModifier = ((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP ? 0 : 1;
- fontAsset.m_FreeGlyphRects = new List<GlyphRect>() { new GlyphRect(0, 0, atlasWidth - packingModifier, atlasHeight - packingModifier) };
- fontAsset.m_UsedGlyphRects = new List<GlyphRect>();
- // Create new Material and Add it as Sub-Asset
- Material tmp_material = new Material(sourceFontAsset.material);
- tmp_material.name = texture.name + " Material";
- tmp_material.SetTexture(ShaderUtilities.ID_MainTex, texture);
- tmp_material.SetFloat(ShaderUtilities.ID_TextureWidth, atlasWidth);
- tmp_material.SetFloat(ShaderUtilities.ID_TextureHeight, atlasHeight);
- tmp_material.SetFloat(ShaderUtilities.ID_GradientScale, atlasPadding + packingModifier);
- tmp_material.SetFloat(ShaderUtilities.ID_WeightNormal, fontAsset.normalStyle);
- tmp_material.SetFloat(ShaderUtilities.ID_WeightBold, fontAsset.boldStyle);
- fontAsset.material = tmp_material;
- AssetDatabase.AddObjectToAsset(tmp_material, fontAsset);
- // Add Font Asset Creation Settings
- // TODO
- // Not sure if this is still necessary in newer versions of Unity.
- EditorUtility.SetDirty(fontAsset);
- AssetDatabase.SaveAssets();
- }
- */
- //[MenuItem("Assets/Create/TextMeshPro/Font Asset #%F12", true)]
- //public static bool CreateFontAssetMenuValidation()
- //{
- // return false;
- //}
- [MenuItem("Assets/Create/TextMeshPro/Font Asset #%F12", false, 100)]
- public static void CreateFontAsset()
- {
- Object target = Selection.activeObject;
- // Make sure the selection is a font file
- if (target == null || target.GetType() != typeof(Font))
- {
- Debug.LogWarning("A Font file must first be selected in order to create a Font Asset.");
- return;
- }
- Font sourceFont = (Font)target;
- string sourceFontFilePath = AssetDatabase.GetAssetPath(target);
- string folderPath = Path.GetDirectoryName(sourceFontFilePath);
- string assetName = Path.GetFileNameWithoutExtension(sourceFontFilePath);
- string newAssetFilePathWithName = AssetDatabase.GenerateUniqueAssetPath(folderPath + "/" + assetName + " SDF.asset");
- //// Create new TM Font Asset.
- TMP_FontAsset fontAsset = ScriptableObject.CreateInstance<TMP_FontAsset>();
- AssetDatabase.CreateAsset(fontAsset, newAssetFilePathWithName);
- fontAsset.version = "1.1.0";
- // Set face information
- FontEngine.InitializeFontEngine();
- FontEngine.LoadFontFace(sourceFont, 90);
- fontAsset.faceInfo = FontEngine.GetFaceInfo();
- // Set font reference and GUID
- fontAsset.m_SourceFontFileGUID = AssetDatabase.AssetPathToGUID(sourceFontFilePath);
- fontAsset.m_SourceFontFile_EditorRef = sourceFont;
- fontAsset.atlasPopulationMode = AtlasPopulationMode.Dynamic;
- // Default atlas resolution is 1024 x 1024.
- int atlasWidth = fontAsset.atlasWidth = 1024;
- int atlasHeight = fontAsset.atlasHeight = 1024;
- int atlasPadding = fontAsset.atlasPadding = 9;
- fontAsset.atlasRenderMode = GlyphRenderMode.SDFAA;
- // Initialize array for the font atlas textures.
- fontAsset.atlasTextures = new Texture2D[1];
- // Create atlas texture of size zero.
- Texture2D texture = new Texture2D(0, 0, TextureFormat.Alpha8, false);
- texture.name = assetName + " Atlas";
- fontAsset.atlasTextures[0] = texture;
- AssetDatabase.AddObjectToAsset(texture, fontAsset);
- // Add free rectangle of the size of the texture.
- int packingModifier = ((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP ? 0 : 1;
- fontAsset.freeGlyphRects = new List<GlyphRect>() { new GlyphRect(0, 0, atlasWidth - packingModifier, atlasHeight - packingModifier) };
- fontAsset.usedGlyphRects = new List<GlyphRect>();
- // Create new Material and Add it as Sub-Asset
- Shader default_Shader = Shader.Find("TextMeshPro/Distance Field");
- Material tmp_material = new Material(default_Shader);
- tmp_material.name = texture.name + " Material";
- tmp_material.SetTexture(ShaderUtilities.ID_MainTex, texture);
- tmp_material.SetFloat(ShaderUtilities.ID_TextureWidth, atlasWidth);
- tmp_material.SetFloat(ShaderUtilities.ID_TextureHeight, atlasHeight);
- tmp_material.SetFloat(ShaderUtilities.ID_GradientScale, atlasPadding + packingModifier);
- tmp_material.SetFloat(ShaderUtilities.ID_WeightNormal, fontAsset.normalStyle);
- tmp_material.SetFloat(ShaderUtilities.ID_WeightBold, fontAsset.boldStyle);
- fontAsset.material = tmp_material;
- AssetDatabase.AddObjectToAsset(tmp_material, fontAsset);
- // Add Font Asset Creation Settings
- fontAsset.creationSettings = new FontAssetCreationSettings(fontAsset.m_SourceFontFileGUID, fontAsset.faceInfo.pointSize, 0, atlasPadding, 0, 1024, 1024, 7, string.Empty, (int)GlyphRenderMode.SDFAA);
- // Not sure if this is still necessary in newer versions of Unity.
- EditorUtility.SetDirty(fontAsset);
- AssetDatabase.SaveAssets();
- }
- }
- }
|