From f9d9c228ae38c337aa07a5d048a5d3a96014d906 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Mon, 15 Jun 2020 15:39:05 -0700 Subject: [PATCH] Various dead-end attempts at font loading and rendering --- .../ConformalDecals/Parts/decal-text.cfg | 57 +++++ .../Plugins/ConformalDecals.dll | Bin 0 -> 46592 bytes .../Plugins/ConformalDecals.dll | Bin 37888 -> 47104 bytes Source/ConformalDecals/ConformalDecals.csproj | 7 + .../MaterialTextureProperty.cs | 5 +- Source/ConformalDecals/ModuleConformalText.cs | 41 ++++ Source/ConformalDecals/Text/DecalFont.cs | 8 + Source/ConformalDecals/Text/FontLoader.cs | 36 +++ Source/ConformalDecals/Text/TextRenderer.cs | 146 ++++++++++++ Source/ConformalDecals/Util/TextureUtils.cs | 216 ++++++++++++++---- 10 files changed, 473 insertions(+), 43 deletions(-) create mode 100644 Distribution/GameData/ConformalDecals/Parts/decal-text.cfg create mode 100644 Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll create mode 100644 Source/ConformalDecals/ModuleConformalText.cs create mode 100644 Source/ConformalDecals/Text/DecalFont.cs create mode 100644 Source/ConformalDecals/Text/FontLoader.cs create mode 100644 Source/ConformalDecals/Text/TextRenderer.cs diff --git a/Distribution/GameData/ConformalDecals/Parts/decal-text.cfg b/Distribution/GameData/ConformalDecals/Parts/decal-text.cfg new file mode 100644 index 0000000..8ff0413 --- /dev/null +++ b/Distribution/GameData/ConformalDecals/Parts/decal-text.cfg @@ -0,0 +1,57 @@ +PART +{ + name = conformaldecals-text + module = Part + author = Andrew Cassidy + MODEL + { + model = ConformalDecals/Assets/decal-blank + scale = 1.0, 1.0, 1.0 + } + rescaleFactor = 1 + + // Attachment + attachRules = 1,1,0,0,1 + node_attach = 0.0, 0.0, 0.1, 0.0, 0.0, -1.0 + + // Tech + TechRequired = start + + // Info + cost = 75 + category = Structural + + // CDL-F Flag Decal + title = Conformal Text + + // Peel-N-Stik Adhesive Decals + manufacturer = #LOC_ConformalDecals_agent-peel-n-stick_title + + // A simple switchable flag. Can either use the mission flag or select a specific flag to use. + description = #LOC_ConformalDecals_flag-description + + // conformal decal sticker flag + tags = #LOC_ConformalDecals_flag-tags + + bulkheadProfiles = srf + + // Parameters + mass = 0.0005 + dragModel = NONE + angularDrag = 0.0 + crashTolerance = 10 + maxTemp = 2000 + breakingForce = 350 + breakingTorque = 150 + physicalSignificance = NONE + + MODULE + { + name = ModuleConformalText + + useBaseNormal = true + + defaultDepth = 0.2 + defaultCutoff = 0 + } +} diff --git a/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll new file mode 100644 index 0000000000000000000000000000000000000000..151c7523fa2c9b5e27fe49c9c214a6d60cf92072 GIT binary patch literal 46592 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�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 literal 37888 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

&iETtLya&ck7g|dA>D^YJQr+T@#B7 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 T+|QEV{(N)s|1a^s%LD%h@kJ$; diff --git a/Source/ConformalDecals/ConformalDecals.csproj b/Source/ConformalDecals/ConformalDecals.csproj index 7cce8a8..13a5b8a 100644 --- a/Source/ConformalDecals/ConformalDecals.csproj +++ b/Source/ConformalDecals/ConformalDecals.csproj @@ -43,6 +43,9 @@ dlls\UnityEngine.dll + + dlls\UnityEngine.AssetBundleModule.dll + dlls\UnityEngine.CoreModule.dll @@ -60,9 +63,13 @@ + + + + diff --git a/Source/ConformalDecals/MaterialModifiers/MaterialTextureProperty.cs b/Source/ConformalDecals/MaterialModifiers/MaterialTextureProperty.cs index e6004bb..57cd291 100644 --- a/Source/ConformalDecals/MaterialModifiers/MaterialTextureProperty.cs +++ b/Source/ConformalDecals/MaterialModifiers/MaterialTextureProperty.cs @@ -18,7 +18,10 @@ namespace ConformalDecals.MaterialModifiers { [SerializeField] private Vector2 _textureOffset; [SerializeField] private Vector2 _textureScale = Vector2.one; - public Texture2D Texture => _texture; + public Texture2D Texture { + get => _texture; + set => _texture = value; + } public string TextureUrl { get => _textureUrl; diff --git a/Source/ConformalDecals/ModuleConformalText.cs b/Source/ConformalDecals/ModuleConformalText.cs new file mode 100644 index 0000000..322e4de --- /dev/null +++ b/Source/ConformalDecals/ModuleConformalText.cs @@ -0,0 +1,41 @@ +using ConformalDecals.Util; +using TMPro; +using UnityEngine; + +namespace ConformalDecals { + public class ModuleConformalText: ModuleConformalDecal { + private const string DefaultFlag = "Squad/Flags/default"; + + [KSPField(isPersistant = true)] public string text = "Hello World!"; + + public override void OnLoad(ConfigNode node) { + base.OnLoad(node); + + SetText(text); + } + + public override void OnStart(StartState state) { + base.OnStart(state); + + SetText(text); + } + + private void SetText(string newText) { + if (!HighLogic.LoadedSceneIsEditor) return; + + this.Log("Rendering text for part"); + var fonts = Resources.FindObjectsOfTypeAll(); + + foreach (var font in fonts) { + this.Log($"Font: {font.name}"); + foreach (var fallback in font.fallbackFontAssets) { + this.Log($" Fallback: {fallback.name}"); + } + } + + materialProperties.AddOrGetTextureProperty("_Decal", true).Texture = TextRenderer.RenderToTexture(fonts[0], newText); + + UpdateMaterials(); + } + } +} \ No newline at end of file diff --git a/Source/ConformalDecals/Text/DecalFont.cs b/Source/ConformalDecals/Text/DecalFont.cs new file mode 100644 index 0000000..b61d2bb --- /dev/null +++ b/Source/ConformalDecals/Text/DecalFont.cs @@ -0,0 +1,8 @@ +using UnityEngine; + +namespace ConformalDecals.Text { + public class DecalFont : ScriptableObject { + [SerializeField] public string foo1; + [SerializeField] public string foo2; + } +} \ No newline at end of file diff --git a/Source/ConformalDecals/Text/FontLoader.cs b/Source/ConformalDecals/Text/FontLoader.cs new file mode 100644 index 0000000..26f369e --- /dev/null +++ b/Source/ConformalDecals/Text/FontLoader.cs @@ -0,0 +1,36 @@ +using System.IO; +using System.Collections; +using System.Collections.Generic; +using TMPro; +using UnityEngine; + +namespace ConformalDecals.Text { + + [DatabaseLoaderAttrib(new[] {"kspfont"})] + public class FontLoader : DatabaseLoader { + public static List fonts; + + public override IEnumerator Load(UrlDir.UrlFile urlFile, FileInfo fileInfo) { + fonts ??= new List(); + + Debug.Log($"[ConformalDecals] '{urlFile.fullPath}'"); + var bundle = AssetBundle.LoadFromFile(urlFile.fullPath); + if (!bundle) { + Debug.Log($"[ConformalDecals] could not load font asset {urlFile.fullPath}"); + } + else { + var loadedFoo = bundle.LoadAllAssets(); + Debug.Log(loadedFoo[0].foo1); + Debug.Log(loadedFoo[0].foo2); + var loadedFonts = bundle.LoadAllAssets(); + foreach (var font in loadedFonts) { + Debug.Log($"[ConformalDecals] adding font {font.name}" ); + fonts.Add(font); + Debug.Log($"ConformalDecals] isReadable: {font.atlas.isReadable}"); + } + } + + yield break; + } + } +} \ No newline at end of file diff --git a/Source/ConformalDecals/Text/TextRenderer.cs b/Source/ConformalDecals/Text/TextRenderer.cs new file mode 100644 index 0000000..e9bfe89 --- /dev/null +++ b/Source/ConformalDecals/Text/TextRenderer.cs @@ -0,0 +1,146 @@ +using System; +using ConformalDecals.Util; +using TMPro; +using UnityEngine; + +namespace ConformalDecals { + public class TextRenderer { + private struct GlyphInfo { + public TMP_Glyph glyph; + public Vector2Int size; + public Vector2Int position; + public int fontIndex; + public bool needsResample; + } + + private struct FontInfo { + public TMP_FontAsset font; + public Texture2D fontAtlas; + public Color32[] fontAtlasColors; + } + + public static Texture2D RenderToTexture(TMP_FontAsset font, string text) { + Debug.Log($"Rendering text: {text}"); + var charArray = text.ToCharArray(); + var glyphInfoArray = new GlyphInfo[charArray.Length]; + var fontInfoArray = new FontInfo[charArray.Length]; + + var baseScale = font.fontInfo.Scale; + + var padding = (int) font.fontInfo.Padding; + var ascender = (int) font.fontInfo.Ascender; + var descender = (int) font.fontInfo.Descender; + var baseline = (int) baseScale * (descender + padding); + Debug.Log($"baseline: {baseline}"); + Debug.Log($"ascender: {ascender}"); + Debug.Log($"descender: {descender}"); + Debug.Log($"baseScale: {baseScale}"); + + fontInfoArray[0].font = font; + + int xAdvance = 0; + for (var i = 0; i < charArray.Length; i++) { + + var glyphFont = TMP_FontUtilities.SearchForGlyph(font, charArray[i], out var glyph); + + if (glyphFont == font) { + glyphInfoArray[i].fontIndex = 0; + } + else { + for (int f = 1; i < charArray.Length; i++) { + if (fontInfoArray[f].font == null) { + fontInfoArray[f].font = glyphFont; + glyphInfoArray[i].fontIndex = f; + break; + } + + if (fontInfoArray[f].font == glyphFont) { + glyphInfoArray[i].fontIndex = f; + break; + } + } + } + + Debug.Log($"getting font info for character: '{charArray[i]}'"); + Debug.Log($"character font: {glyphFont.name}"); + + glyphInfoArray[i].glyph = glyph; + glyphInfoArray[i].needsResample = false; + + float elementScale = glyph.scale; + + if (glyphFont == font) { + if (!Mathf.Approximately(elementScale, 1)) { + glyphInfoArray[i].needsResample = true; + } + + elementScale *= baseScale; + } + else { + var fontScale = glyphFont.fontInfo.Scale / glyphFont.fontInfo.PointSize; + if (!Mathf.Approximately(fontScale, baseScale)) { + glyphInfoArray[i].needsResample = true; + } + + elementScale *= fontScale; + } + + Debug.Log($"character scale: {glyphFont.fontInfo.Scale / glyphFont.fontInfo.PointSize}"); + Debug.Log($"character needs resampling: {glyphInfoArray[i].needsResample}"); + + glyphInfoArray[i].size.x = (int) ((glyph.width + (padding * 2)) * elementScale); + glyphInfoArray[i].size.y = (int) ((glyph.height + (padding * 2)) * elementScale); + glyphInfoArray[i].position.x = (int) ((xAdvance + glyph.xOffset - padding) * elementScale); + glyphInfoArray[i].position.y = (int) ((baseline + glyph.yOffset - padding) * elementScale); + + Debug.Log($"character size: {glyphInfoArray[i].size}"); + Debug.Log($"character position: {glyphInfoArray[i].position}"); + } + + // calculate texture bounds + int xOffset = glyphInfoArray[0].position.x; + var textureWidth = (glyphInfoArray[charArray.Length - 1].position.x + glyphInfoArray[charArray.Length - 1].size.x) - xOffset; + var textureHeight = (int) baseScale * (ascender + descender + padding * 2); + + // ensure texture sizes are powers of 2 + textureWidth = Mathf.NextPowerOfTwo(textureWidth); + textureHeight = Mathf.NextPowerOfTwo(textureHeight); + Debug.Log($"texture is {textureWidth} x {textureHeight}"); + + var texture = new Texture2D(textureWidth, textureHeight, TextureFormat.Alpha8, true); + + var colors = new Color32[textureWidth * textureHeight]; + + for (var i = 0; i < fontInfoArray.Length; i++) { + if (fontInfoArray[i].font == null) break; + fontInfoArray[i].fontAtlas = fontInfoArray[i].font.atlas; + fontInfoArray[i].fontAtlasColors = fontInfoArray[i].fontAtlas.GetPixels32(); + } + + for (int i = 0; i < charArray.Length; i++) { + var glyphInfo = glyphInfoArray[i]; + var glyph = glyphInfo.glyph; + var fontInfo = fontInfoArray[glyphInfo.fontIndex]; + + var srcPos = new Vector2Int((int) glyph.x, (int) glyph.y); + var dstPos = glyphInfo.position; + dstPos.x += xOffset; + var dstSize = glyphInfo.size; + + Debug.Log($"rendering character number {i}"); + + if (glyphInfo.needsResample) { + var srcSize = new Vector2(glyph.width, glyph.height); + TextureUtils.BlitRectBilinearAlpha(fontInfo.fontAtlas, srcPos, srcSize, texture, colors, dstPos, dstSize, TextureUtils.BlitMode.Add); + } + else { + TextureUtils.BlitRectAlpha(fontInfo.fontAtlas, fontInfo.fontAtlasColors, srcPos, texture, colors, dstPos, dstSize, TextureUtils.BlitMode.Add); + } + } + + texture.Apply(true); + + return texture; + } + } +} \ No newline at end of file diff --git a/Source/ConformalDecals/Util/TextureUtils.cs b/Source/ConformalDecals/Util/TextureUtils.cs index 0d86ae6..f835afe 100644 --- a/Source/ConformalDecals/Util/TextureUtils.cs +++ b/Source/ConformalDecals/Util/TextureUtils.cs @@ -2,11 +2,183 @@ using UnityEngine; namespace ConformalDecals.Util { public static class TextureUtils { + public enum BlitMode { + Set, + Add, + } + + public static Color32 AddColor32(Color32 color1, Color32 color2) { + return new Color32((byte) (color1.r + color2.r), (byte) (color1.g + color2.g), (byte) (color1.b + color2.b), (byte) (color1.a + color2.a)); + } + + public static Color32 AddColor32Clamped(Color32 color1, Color32 color2) { + var r = color1.r + color2.r; + var g = color1.g + color2.g; + var b = color1.b + color2.b; + var a = color1.a + color2.a; + if (r > byte.MaxValue) r = byte.MaxValue; + if (g > byte.MaxValue) g = byte.MaxValue; + if (b > byte.MaxValue) b = byte.MaxValue; + if (a > byte.MaxValue) a = byte.MaxValue; + + return new Color32((byte) r, (byte) g, (byte) b, (byte) a); + } + + public static void ClearTexture(Color32[] colors, Color32 clearColor = default) { + for (var i = 0; i < colors.Length; i++) { + colors[i] = clearColor; + } + } + + public static void BlitRectAlpha( + Texture2D src, Color32[] srcColors, Vector2Int srcPos, + Texture2D dst, Color32[] dstColors, Vector2Int dstPos, + Vector2Int size, BlitMode mode) { + + ClipRect(src, ref srcPos, dst, ref dstPos, ref size); + + if (size.x <= 0 || size.y <= 0) return; + + int srcIndex = srcPos.x + srcPos.y * src.width; + int dstIndex = dstPos.x + dstPos.y * dst.width; + + for (int dy = size.y - 1; dy >= 0; dy--) { + + for (int dx = size.x - 1; dx >= 0; dx--) { + switch (mode) { + case BlitMode.Set: + dstColors[dstIndex + dx].a = srcColors[srcIndex + dx].a; + break; + case BlitMode.Add: + var s = srcColors[srcIndex + dx].a; + var d = dstColors[dstIndex + dx].a; + var sum = s + d; + if (sum > byte.MaxValue) sum = byte.MaxValue; + dstColors[dstIndex + dx].a = (byte) sum; + break; + } + } + + srcIndex += src.width; + dstIndex += dst.width; + } + } + public static void BlitRect( Texture2D src, Color32[] srcColors, Vector2Int srcPos, Texture2D dst, Color32[] dstColors, Vector2Int dstPos, - Vector2Int size) { + Vector2Int size, BlitMode mode) { + + ClipRect(src, ref srcPos, dst, ref dstPos, ref size); + + if (size.x <= 0 || size.y <= 0) return; + int srcIndex = srcPos.x + srcPos.y * src.width; + int dstIndex = dstPos.x + dstPos.y * dst.width; + + for (int dy = 0; dy < size.y; dy++) { + + for (int dx = 0; dx < size.x; dx++) { + switch (mode) { + case BlitMode.Set: + dstColors[dstIndex + dx] = srcColors[srcIndex + dx]; + break; + case BlitMode.Add: + dstColors[dstIndex + dx] = AddColor32Clamped(srcColors[srcIndex + dx], dstColors[dstIndex + dx]); + break; + } + } + + srcIndex += src.width; + dstIndex += dst.width; + } + } + + public static void BlitRectBilinearAlpha( + Texture2D src, Vector2Int srcPos, Vector2 srcSize, + Texture2D dst, Color32[] dstColors, Vector2Int dstPos, Vector2Int dstSize, + BlitMode mode) { + + var sizeRatio = dstSize / srcSize; + + ClipRect(src, ref srcPos, dst, ref dstPos, ref srcSize, ref dstSize); + + if (dstSize.x <= 0 || dstSize.y <= 0) return; + + var srcPixel = new Vector2(1.0f / src.width, 1.0f / src.height); + var srcStart = (srcPos * srcPixel) + (srcPixel / 2); + var srcStep = sizeRatio * srcPixel; + var srcY = srcStart.y; + + int dstIndex = dstPos.x + dstPos.y * dst.width; + for (int dy = 0; + dy < dstSize.y; + dy++) { + var srcX = srcStart.x; + + for (int dx = 0; dx < dstSize.x; dx++) { + switch (mode) { + case BlitMode.Set: + dstColors[dstIndex + dx].a = (byte) (src.GetPixelBilinear(srcX, srcY).a * byte.MaxValue); + break; + case BlitMode.Add: + var s = (byte) (src.GetPixelBilinear(srcX, srcY).a * byte.MaxValue); + var d = dstColors[dstIndex + dx].a; + var sum = s + d; + if (sum > byte.MaxValue) sum = byte.MaxValue; + dstColors[dstIndex + dx].a = (byte) sum; + break; + } + + srcX += srcStep.x; + } + + srcY += srcStep.y; + dstIndex += dst.width; + } + } + + public static void BlitRectBilinear( + Texture2D src, Vector2Int srcPos, Vector2 srcSize, + Texture2D dst, Color32[] dstColors, Vector2Int dstPos, Vector2Int dstSize, + BlitMode mode) { + + var sizeRatio = dstSize / srcSize; + + ClipRect(src, ref srcPos, dst, ref dstPos, ref srcSize, ref dstSize); + + if (dstSize.x <= 0 || dstSize.y <= 0) return; + + var srcPixel = new Vector2(1.0f / src.width, 1.0f / src.height); + var srcStart = (srcPos * srcPixel) + (srcPixel / 2); + var srcStep = sizeRatio * srcPixel; + var srcY = srcStart.y; + + int dstIndex = dstPos.x + dstPos.y * dst.width; + for (int dy = 0; + dy < dstSize.y; + dy++) { + var srcX = srcStart.x; + + for (int dx = 0; dx < dstSize.x; dx++) { + switch (mode) { + case BlitMode.Set: + dstColors[dstIndex + dx] = src.GetPixelBilinear(srcX, srcY); + break; + case BlitMode.Add: + dstColors[dstIndex + dx] = AddColor32Clamped(src.GetPixelBilinear(srcX, srcY), dstColors[dstIndex + dx]); + break; + } + + srcX += srcStep.x; + } + + srcY += srcStep.y; + dstIndex += dst.width; + } + } + + private static void ClipRect(Texture2D src, ref Vector2Int srcPos, Texture2D dst, ref Vector2Int dstPos, ref Vector2Int size) { if (srcPos.x < 0) { size.x += srcPos.x; dstPos.x -= srcPos.x; @@ -35,30 +207,10 @@ namespace ConformalDecals.Util { if (srcPos.y + size.y > src.height) size.y = src.height - srcPos.y; if (dstPos.x + size.x > dst.width) size.x = dst.width - srcPos.x; if (dstPos.y + size.y > dst.height) size.y = dst.height - srcPos.y; - - if (size.x <= 0) return; - if (size.y <= 0) return; - - int srcIndex = srcPos.x + srcPos.y * src.width; - int dstIndex = dstPos.x + dstPos.y * dst.width; - - for (int dy = 0; dy < size.y; dy++) { - - for (int dx = 0; dx < size.x; dx++) { - dstColors[dstIndex + dx] = srcColors[srcIndex + dx]; - } - - srcIndex += src.width; - dstIndex += dst.width; - } } - public static void BlitRectBilinear( - Texture2D src, Vector2Int srcPos, Vector2 srcSize, - Texture2D dst, Color32[] dstColors, Vector2Int dstPos, Vector2Int dstSize) { - + private static void ClipRect(Texture2D src, ref Vector2Int srcPos, Texture2D dst, ref Vector2Int dstPos, ref Vector2 srcSize, ref Vector2Int dstSize) { var sizeRatio = dstSize / srcSize; - if (srcPos.x < 0) { dstSize.x += (int) (srcPos.x * sizeRatio.x); dstPos.x -= (int) (srcPos.x * sizeRatio.x); @@ -106,26 +258,6 @@ namespace ConformalDecals.Util { dstSize.y = dst.height - srcPos.y; srcSize.y = (int) (dstSize.y / sizeRatio.y); } - - var srcPixel = new Vector2(1.0f / src.width, 1.0f / src.height); - - var srcStart = (srcPos * srcPixel) + (srcPixel / 2); - var srcStep = sizeRatio * srcPixel; - - var srcY = srcStart.y; - int dstIndex = dstPos.x + dstPos.y * dst.width; - - for (int dy = 0; dy < dstSize.y; dy++) { - var srcX = srcStart.x; - - for (int dx = 0; dx < dstSize.x; dx++) { - dstColors[dstIndex + dx] = src.GetPixelBilinear(srcX, srcY); - srcX += srcStep.x; - } - - srcY += srcStep.y; - dstIndex += dst.width; - } } } } \ No newline at end of file