From 90d511f742a29aafce3ff111cdd19392f3bca3e5 Mon Sep 17 00:00:00 2001 From: Marian Brinkmann Date: Fri, 13 May 2022 12:57:47 +0200 Subject: [PATCH 1/5] Reorder Shader GUI Changed the order of the shader gui panels --- Editor/Scripts/TMP3D_UnlitShaderGUI.cs | 12 ++++++------ package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Editor/Scripts/TMP3D_UnlitShaderGUI.cs b/Editor/Scripts/TMP3D_UnlitShaderGUI.cs index b4050cb..dee6c93 100644 --- a/Editor/Scripts/TMP3D_UnlitShaderGUI.cs +++ b/Editor/Scripts/TMP3D_UnlitShaderGUI.cs @@ -56,18 +56,18 @@ protected override void DoGUI() EndPanel(); - s_outline = BeginPanel("Outline", s_outlineFeature, s_outline); - if (s_outline) + s_3D = BeginPanel("3D", s_3D); + if (s_3D) { - DoOutlinePanel(); + Do3DPanel(); } EndPanel(); - s_3D = BeginPanel("3D", s_3D); - if (s_3D) + s_outline = BeginPanel("Outline", s_outlineFeature, s_outline); + if (s_outline) { - Do3DPanel(); + DoOutlinePanel(); } EndPanel(); diff --git a/package.json b/package.json index 657cf55..39d8357 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.ikaroon.tmp3d", - "version": "0.1.0-pre.2", + "version": "0.1.0", "displayName": "Text Mesh Pro 3D Support", "description": "An extension for Text Mesh Pro that makes 3D text possible using shaders.", "unity": "2020.3", From ed4ae02cf1145ddc9b9c6fa85adc2f11a7b4387f Mon Sep 17 00:00:00 2001 From: Marian Brinkmann Date: Fri, 13 May 2022 13:02:10 +0200 Subject: [PATCH 2/5] Outline feature, Italic Changed outline feature to shader feature to disable it completely Added support for italic text rendering Changed sample files to reflect the new features --- CHANGELOG.md | 3 + README.md | 21 +++--- Runtime/Shaders/Lib/TMP3D_Common.cginc | 71 ++++++++++--------- Runtime/Shaders/Lib/TMP3D_Structs.cginc | 2 +- Runtime/Shaders/TMP3D_Unlit.shader | 8 ++- .../SamplesSolidText/Fonts/ARVO SDF3D.asset | 12 +++- .../Scenes/Sample_TMP3D.unity | 2 +- 7 files changed, 70 insertions(+), 49 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c275fcd..8e07609 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,12 +4,15 @@ All notable changes to this project will be documented in this file. ## [Unreleased] ### Added - Support for bold text rendering +- Support for italic text rendering - Custom Shader GUI for easier material editing - Raymarching options for more control - Support for more raymarching algorithms for the future ### Changed - Raymarching usage for more control and new algorithms in the future +- Boundaries structure for raymarching +- Outline rendering is now a shader feature and can be fully disabled ### Removed - Unused shader uniforms diff --git a/README.md b/README.md index d073c01..85e830b 100644 --- a/README.md +++ b/README.md @@ -12,16 +12,19 @@ An extension for Text Mesh Pro that makes 3D text possible using shaders. - [x] 3D character properties and animation - [x] Outline support - [x] Bold text support -- [ ] Italic text support +- [x] Italic text support - [ ] Solid, surface shader - [ ] Solid, unlit shader (UI) - [ ] Documentation ### In Evaluation -- [ ] Bevelled text -- [ ] Full fledged freeform text using textures +- [ ] Bevelled text[^1] +- [ ] Full fledged freeform text using textures[^1] - [ ] Translucent, unlit shader -- [ ] VR optimizations +- [ ] VR optimizations[^2] + +[^1]: Tempering with the SDF values in the distance makes raymarching more difficult, I need to find a good way of evaluating the shortest distance. +[^2]: I currently don't have access to any VR device and, therefore, cannot optimize for it right now. ## Compatibility @@ -31,12 +34,12 @@ An extension for Text Mesh Pro that makes 3D text possible using shaders. | DirectX 12 | :heavy_check_mark: Compatible | :heavy_check_mark: Compatible | :heavy_check_mark: Compatible | | Vulkan | :heavy_check_mark: Compatible | :heavy_check_mark: Compatible | :heavy_check_mark: Compatible | | OpenGL Core | :heavy_check_mark: Compatible | :warning: Invalid | :heavy_check_mark: Compatible | -| OpenGLES2[^1] | :x: Incompatible | :warning: Invalid | :x: Incompatible | +| OpenGLES2[^3] | :x: Incompatible | :warning: Invalid | :x: Incompatible | | OpenGLES3 | :heavy_check_mark: Compatible | :warning: Invalid | :heavy_check_mark: Compatible | -| Metal[^2] | :wavy_dash: To Be Tested | :wavy_dash: To Be Tested | :wavy_dash: To Be Tested | +| Metal[^4] | :wavy_dash: To Be Tested | :wavy_dash: To Be Tested | :wavy_dash: To Be Tested | -[^1]: Support for OpenGLES2 is currently **NOT** planned. -[^2]: I currently don't have access to any Mac and, therefore, cannot test it for Metal right now. +[^3]: Support for OpenGLES2 is currently **NOT** planned. +[^4]: I currently don't have access to any Mac and, therefore, cannot test it for Metal right now. If the shader doesn't work for a compatible combination try to reimport the shader file first! When the issue persists contact me! @@ -49,6 +52,8 @@ When the issue persists contact me! 3. Select `Add package from git URL...` 4. Enter `https://github.com/Ikaroon/TMP3D.git` as url and confirm +This method will always install the current state of the git. To get a released version head to the [release page](https://github.com/Ikaroon/TMP3D/releases)! + ## How to use To understand how to setup a TextMeshPro for 3D you can check out the sample in the package. For downloading that follow these steps: 1. Open the package manager in Unity from `Window>Package Manager` diff --git a/Runtime/Shaders/Lib/TMP3D_Common.cginc b/Runtime/Shaders/Lib/TMP3D_Common.cginc index efe31f0..791fa64 100644 --- a/Runtime/Shaders/Lib/TMP3D_Common.cginc +++ b/Runtime/Shaders/Lib/TMP3D_Common.cginc @@ -12,8 +12,8 @@ float InverseLerp(float a, float b, float x) float SampleSDF3D(float3 mask3D, tmp3d_g2f input) { float2 maskUV = float2(0, 0); - maskUV.x = saturate(lerp(input.boundariesUV.x, input.boundariesUV.z, mask3D.x)); - maskUV.y = saturate(lerp(input.boundariesUV.y, input.boundariesUV.w, mask3D.y)); + maskUV.x = saturate(lerp(input.boundariesUV.x, input.boundariesUV.x + input.boundariesUV.z, mask3D.x)); + maskUV.y = saturate(lerp(input.boundariesUV.y, input.boundariesUV.y + input.boundariesUV.w, mask3D.y)); return tex2D(_MainTex, maskUV).a; } @@ -34,16 +34,17 @@ void ClipBounds(float3 mask3D) float3 PositionToMask(float3 localPos, tmp3d_g2f input) { - float3 mask3D = float3(-1,-1,-1); - mask3D.x = InverseLerp(input.boundariesLocal.x, input.boundariesLocal.z, localPos.x); - mask3D.y = InverseLerp(input.boundariesLocal.y, input.boundariesLocal.w, localPos.y); + float3 mask3D = float3(-1, -1, -1); + mask3D.y = InverseLerp(input.boundariesLocal.y, input.boundariesLocal.y + input.boundariesLocal.w, localPos.y); + float xOffset = saturate(mask3D.y) * input.boundariesLocalZ.z; + mask3D.x = InverseLerp(input.boundariesLocal.x, input.boundariesLocal.x + input.boundariesLocal.z, localPos.x - xOffset); mask3D.z = InverseLerp(input.boundariesLocalZ.x, input.boundariesLocalZ.y, localPos.z); return mask3D; } float GradientToLocalLength(tmp3d_g2f input) { - float l = abs(input.boundariesLocal.x - input.boundariesLocal.z); + float l = input.boundariesLocal.z; return l * 0.01 * _GradientScale; } @@ -62,7 +63,7 @@ tmp3d_v2g TMP3D_VERT(tmp3d_a2v input) } // "Creates a vertex" with an offset and boundary values -tmp3d_g2f CreateVertex(tmp3d_v2g input, float3 positionOffset, float4 boundariesUV, float4 boundariesLocal, float2 boundariesLocalZ) +tmp3d_g2f CreateVertex(tmp3d_v2g input, float3 positionOffset, float4 boundariesUV, float4 boundariesLocal, float4 boundariesLocalZ) { tmp3d_g2f output; @@ -92,7 +93,7 @@ tmp3d_g2f CreateVertex(tmp3d_v2g input, float3 positionOffset, float4 boundaries return output; } -void TMP3D_FILLGEOMETRY(triangle tmp3d_v2g input[3], inout TriangleStream triStream, float3 def, float3 normal, float4 boundariesUV, float4 boundariesLocal, float2 boundariesLocalZ) +void TMP3D_FILLGEOMETRY(triangle tmp3d_v2g input[3], inout TriangleStream triStream, float3 def, float3 normal, float4 boundariesUV, float4 boundariesLocal, float4 boundariesLocalZ) { // Top triStream.RestartStrip(); @@ -131,7 +132,7 @@ void TMP3D_FILLGEOMETRY(triangle tmp3d_v2g input[3], inout TriangleStream triStream, float3 def, float3 normal, float4 boundariesUV, float4 boundariesLocal, float2 boundariesLocalZ) +void TMP3D_FILLGEOMETRY_INVERTED(triangle tmp3d_v2g input[3], inout TriangleStream triStream, float3 def, float3 normal, float4 boundariesUV, float4 boundariesLocal, float4 boundariesLocalZ) { // Top triStream.RestartStrip(); @@ -180,25 +181,25 @@ void TMP3D_GEOM(triangle tmp3d_v2g input[3], inout TriangleStream tri float depth = input[0].texcoord2.r; float3 normal = input[0].normal * depth; - float minUVx = min(input[0].texcoord0.x, min(input[1].texcoord0.x, input[2].texcoord0.x)); - float minUVy = min(input[0].texcoord0.y, min(input[1].texcoord0.y, input[2].texcoord0.y)); - float maxUVx = max(input[0].texcoord0.x, max(input[1].texcoord0.x, input[2].texcoord0.x)); - float maxUVy = max(input[0].texcoord0.y, max(input[1].texcoord0.y, input[2].texcoord0.y)); - float4 boundariesUV = float4(minUVx, minUVy, maxUVx, maxUVy); + float skewUV = abs(input[1].texcoord0.x - input[0].texcoord0.x); + float widthUV = abs(input[2].texcoord0.x - input[1].texcoord0.x); + float heightUV = abs(input[1].texcoord0.y - input[0].texcoord0.y); + float xUV = min(input[0].texcoord0.x, input[2].texcoord0.x); + float yUV = min(input[0].texcoord0.y, input[1].texcoord0.y); + float4 boundariesUV = float4(xUV, yUV, widthUV, heightUV); float3 v0local = mul(unity_WorldToObject, float4(input[0].position.xyz, 1)).xyz; float3 v1local = mul(unity_WorldToObject, float4(input[1].position.xyz, 1)).xyz; float3 v2local = mul(unity_WorldToObject, float4(input[2].position.xyz, 1)).xyz; - float minWorldx = min(v0local.x, min(v1local.x, v2local.x)); - float minWorldy = min(v0local.y, min(v1local.y, v2local.y)); - float maxWorldx = max(v0local.x, max(v1local.x, v2local.x)); - float maxWorldy = max(v0local.y, max(v1local.y, v2local.y)); - float4 boundariesLocal = float4(minWorldx, minWorldy, maxWorldx, maxWorldy); + float skewLocal = abs(v1local.x - v0local.x); + float widthLocal = abs(v2local.x - v1local.x); + float heightLocal = abs(v1local.y - v0local.y); + float xLocal = min(v0local.x, v2local.x); + float yLocal = min(v0local.y, v1local.y); + float4 boundariesLocal = float4(xLocal, yLocal, widthLocal, heightLocal); - float minWorldz = min(v0local.z, min(v1local.z, v2local.z)); - float maxWorldz = max(v0local.z, max(v1local.z, v2local.z)); - float2 boundariesLocalZ = float2(minWorldz - depth, maxWorldz); + float4 boundariesLocalZ = float4(-depth, 0, skewLocal, skewUV); TMP3D_FILLGEOMETRY(input, triStream, def, normal, boundariesUV, boundariesLocal, boundariesLocalZ); } @@ -213,25 +214,25 @@ void TMP3D_GEOM_INVERTED(triangle tmp3d_v2g input[3], inout TriangleStream3D Text m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: aadddd7b82985b240b284d433fa64263, type: 2} m_sharedMaterial: {fileID: 2928379036357712455, guid: aadddd7b82985b240b284d433fa64263, type: 2} From 969b40f4f26d9956e7c966b4b9502963afc0244b Mon Sep 17 00:00:00 2001 From: Marian Brinkmann Date: Fri, 13 May 2022 13:37:59 +0200 Subject: [PATCH 3/5] Debug rendering Added debug rendering options to show used raymarching steps and 3d uvs --- CHANGELOG.md | 1 + Editor/Scripts/TMP3D_UnlitShaderGUI.cs | 10 +++++++ README.md | 1 + Runtime/Shaders/Lib/Raymarching/Common.cginc | 24 +++++++++++++++ .../Lib/Raymarching/PenaltyMarcher.cginc | 12 ++++---- .../Lib/Raymarching/StandardMarcher.cginc | 12 ++++---- Runtime/Shaders/TMP3D_Unlit.shader | 29 ++++++++++++++----- 7 files changed, 69 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e07609..b65e9cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. - Custom Shader GUI for easier material editing - Raymarching options for more control - Support for more raymarching algorithms for the future +- Debug options to show used steps and the 3D uvs ### Changed - Raymarching usage for more control and new algorithms in the future diff --git a/Editor/Scripts/TMP3D_UnlitShaderGUI.cs b/Editor/Scripts/TMP3D_UnlitShaderGUI.cs index dee6c93..a914d28 100644 --- a/Editor/Scripts/TMP3D_UnlitShaderGUI.cs +++ b/Editor/Scripts/TMP3D_UnlitShaderGUI.cs @@ -11,6 +11,7 @@ public class TMP3D_UnlitShaderGUI : TMP_BaseShaderGUI static TMP3D_ShaderFeature s_volumeModeFeature; static TMP3D_ShaderFeature s_raymarchModeFeature; static TMP3D_ShaderFeature s_maxStepsFeature; + static ShaderFeature s_debugFeature; static bool s_general = true; static bool s_outline = true; @@ -44,6 +45,13 @@ static TMP3D_UnlitShaderGUI() keywords = new[] { "_MAXSTEPS_32", "_MAXSTEPS_64", "_MAXSTEPS_96", "_MAXSTEPS_128" }, keywordLabels = new[] { new GUIContent("32"), new GUIContent("64"), new GUIContent("96"), new GUIContent("128") } }; + s_debugFeature = new ShaderFeature() + { + undoLabel = "Debug", + label = new GUIContent("Debug Mode"), + keywords = new[] { "DEBUG_STEPS", "DEBUG_MASK" }, + keywordLabels = new[] { new GUIContent("None"), new GUIContent("Steps"), new GUIContent("Mask") } + }; } protected override void DoGUI() @@ -129,6 +137,8 @@ void DoDebugPanel() DoFloat("_GradientScale", "Gradient Scale"); DoFloat("_TextureWidth", "Texture Width"); DoFloat("_TextureHeight", "Texture Height"); + s_debugFeature.ReadState(m_Material); + s_debugFeature.DoPopup(m_Editor, m_Material); EditorGUI.indentLevel -= 1; EditorGUILayout.Space(); } diff --git a/README.md b/README.md index 85e830b..9908735 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ An extension for Text Mesh Pro that makes 3D text possible using shaders. - [x] Outline support - [x] Bold text support - [x] Italic text support +- [x] Debug rendering - [ ] Solid, surface shader - [ ] Solid, unlit shader (UI) - [ ] Documentation diff --git a/Runtime/Shaders/Lib/Raymarching/Common.cginc b/Runtime/Shaders/Lib/Raymarching/Common.cginc index f0d5366..1b4d453 100644 --- a/Runtime/Shaders/Lib/Raymarching/Common.cginc +++ b/Runtime/Shaders/Lib/Raymarching/Common.cginc @@ -8,6 +8,30 @@ float3 Temp_ViewDir; float3 Temp_LocalStartPos; +float3 Temp_LocalPos; +float3 GetRaymarchLocalPos() +{ + return Temp_LocalPos; +} + +float Temp_Bound; +float GetRaymarchBound() +{ + return Temp_Bound; +} + +float Temp_Value; +float GetRaymarchValue() +{ + return Temp_Value; +} + +float3 Temp_Mask3D; +float3 GetRaymarchMask3D() +{ + return Temp_Mask3D; +} + void PrepareTMP3DRaymarch(tmp3d_g2f input) { float3 viewDir = normalize(input.worldPos.xyz - _WorldSpaceCameraPos.xyz); diff --git a/Runtime/Shaders/Lib/Raymarching/PenaltyMarcher.cginc b/Runtime/Shaders/Lib/Raymarching/PenaltyMarcher.cginc index 380b53e..a6f9c47 100644 --- a/Runtime/Shaders/Lib/Raymarching/PenaltyMarcher.cginc +++ b/Runtime/Shaders/Lib/Raymarching/PenaltyMarcher.cginc @@ -16,14 +16,14 @@ void InitializeRaymarcher(tmp3d_g2f input) temp_Input = input; } -void NextRaymarch(out float3 localPos, out float bound, out float value, float offset) +void NextRaymarch(float offset) { - localPos = GetRaymarchLocalPosition(temp_Progress); - float3 mask3D = PositionToMask(localPos, temp_Input); - bound = IsInBounds(mask3D); - value = 1 - SampleSDF3D(saturate(mask3D), temp_Input); + Temp_LocalPos = GetRaymarchLocalPosition(temp_Progress); + Temp_Mask3D = PositionToMask(Temp_LocalPos, temp_Input); + Temp_Bound = IsInBounds(Temp_Mask3D); + Temp_Value = 1 - SampleSDF3D(saturate(Temp_Mask3D), temp_Input); - float sdfDistance = max((value - offset) * GradientToLocalLength(temp_Input), _RaymarchMinStep); + float sdfDistance = max((Temp_Value - offset) * GradientToLocalLength(temp_Input), _RaymarchMinStep); float3 viewDir = GetRaymarchLocalDirection(); float length1 = length(normalize(viewDir.xy) * sdfDistance); float length2 = length(viewDir.xy); diff --git a/Runtime/Shaders/Lib/Raymarching/StandardMarcher.cginc b/Runtime/Shaders/Lib/Raymarching/StandardMarcher.cginc index 4f0f49a..e2a3a08 100644 --- a/Runtime/Shaders/Lib/Raymarching/StandardMarcher.cginc +++ b/Runtime/Shaders/Lib/Raymarching/StandardMarcher.cginc @@ -14,14 +14,14 @@ void InitializeRaymarcher(tmp3d_g2f input) temp_Input = input; } -void NextRaymarch(out float3 localPos, out float bound, out float value, float offset) +void NextRaymarch(float offset) { - localPos = GetRaymarchLocalPosition(temp_Progress); - float3 mask3D = PositionToMask(localPos, temp_Input); - bound = IsInBounds(mask3D); - value = 1 - SampleSDF3D(saturate(mask3D), temp_Input); + Temp_LocalPos = GetRaymarchLocalPosition(temp_Progress); + Temp_Mask3D = PositionToMask(Temp_LocalPos, temp_Input); + Temp_Bound = IsInBounds(Temp_Mask3D); + Temp_Value = 1 - SampleSDF3D(saturate(Temp_Mask3D), temp_Input); - float sdfDistance = max((value - offset) * GradientToLocalLength(temp_Input), _RaymarchMinStep); + float sdfDistance = max((Temp_Value - offset) * GradientToLocalLength(temp_Input), _RaymarchMinStep); float3 viewDir = GetRaymarchLocalDirection(); float length1 = length(normalize(viewDir.xy) * sdfDistance); float length2 = length(viewDir.xy); diff --git a/Runtime/Shaders/TMP3D_Unlit.shader b/Runtime/Shaders/TMP3D_Unlit.shader index 0b1051f..188dc59 100644 --- a/Runtime/Shaders/TMP3D_Unlit.shader +++ b/Runtime/Shaders/TMP3D_Unlit.shader @@ -58,6 +58,7 @@ Shader "TextMeshPro/3D/Unlit" #pragma multi_compile __ OUTLINE_ON #pragma multi_compile _RAYMARCHER_STANDARD _RAYMARCHER_PENALTY #pragma multi_compile _MAXSTEPS_32 _MAXSTEPS_64 _MAXSTEPS_96 _MAXSTEPS_128 + #pragma multi_compile __ DEBUG_STEPS DEBUG_MASK #pragma require geometry @@ -107,6 +108,17 @@ Shader "TextMeshPro/3D/Unlit" #endif } + fragOutput ValidateOutput(fragOutput output, int step) + { + #if DEBUG_STEPS + float stepDensity = (float)step / (float)MAX_STEPS; + output.color = float4(stepDensity.x, 0, 0, 1); + #elif DEBUG_MASK + output.color = float4(GetRaymarchMask3D().xyz, 1); + #endif + return output; + } + fragOutput TMP3D_FRAG_UNLIT(tmp3d_g2f input) { UNITY_SETUP_INSTANCE_ID(input); @@ -124,17 +136,18 @@ Shader "TextMeshPro/3D/Unlit" InitializeRaymarcher(input); - for (int i = 0; i < MAX_STEPS; i++) + for (int i = 0; i <= MAX_STEPS; i++) { - float3 localPos; - float bound; - float value; float offset = edge; #if OUTLINE_ON offset += lerp(_OutlineWidth, 0, outline); #endif - NextRaymarch(localPos, bound, value, offset); + NextRaymarch(offset); + float3 localPos = GetRaymarchLocalPos(); + float bound = GetRaymarchBound(); + float value = GetRaymarchValue(); + float3 mask3D = GetRaymarchMask3D(); #if OUTLINE_ON if (value <= edge + _OutlineWidth) @@ -146,7 +159,7 @@ Shader "TextMeshPro/3D/Unlit" if (bound < 0 && outline > 0.5) { - return o; + return ValidateOutput(o, i); } #endif @@ -161,11 +174,11 @@ Shader "TextMeshPro/3D/Unlit" o.depth = compute_depth(UnityObjectToClipPos(localPos)); o.color = float4(c.rgb * input.color, 1); - return o; + return ValidateOutput(o, i); } } - return o; + return ValidateOutput(o, MAX_STEPS); } ENDCG From 3bb61a1e6a92a4603042d5353a58855b4fe8a063 Mon Sep 17 00:00:00 2001 From: Marian Brinkmann <65419234+Ikaroon@users.noreply.github.com> Date: Fri, 13 May 2022 21:57:18 +0200 Subject: [PATCH 4/5] Updated readme release version Updated readme to show the correct release version --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9908735..9994662 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@

TMP3D Logo

- + GitHub (Pre-)Release Date

# Text Mesh Pro 3D @@ -67,10 +67,10 @@ If you still need help, here are some steps how you setup a TextMeshPro for 3D: 1. Create a new FontAsset by using the `Font Asset Creator` from `Window>Text Mesh Pro>Font Asset Creator` 2. Expand the created Asset and select the Material 3. Change the Material's shader to `TextMeshPro/3D/Unlit` -4. Create a TextMeshPro in a scene from `3D Object>Text - TextMeshPro` NOT from `UI>Text - TextMeshPro` this is not supported yet. +4. Create a TextMeshPro in a scene from `3D Object>Text - TextMeshPro` **NOT** from `UI>Text - TextMeshPro` this is not supported yet. 5. Add a TMP3D_Handler component from `Script>Ikaroon.TMP3D>TMP3D_Handler` 6. Apply the FontAsset to the TextMeshPro component -7. You have now acces to 3D text! +7. You have now access to 3D text! ## Notice Work on this project happens in my freetime and, therefore, I cannot promise if and when certain features are added. I am considering to open this up for contribution but for now you can manipulate the code as you please. This project is MIT licensed and may be used freely. (Check the license file for more information) From 2bec6efe7dea1800fbcd67211c5c5fcf93089051 Mon Sep 17 00:00:00 2001 From: Marian Brinkmann <65419234+Ikaroon@users.noreply.github.com> Date: Fri, 13 May 2022 21:59:46 +0200 Subject: [PATCH 5/5] Release in changelog Added release number to changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b65e9cf..7f84844 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Changelog All notable changes to this project will be documented in this file. -## [Unreleased] +## [v0.1.0] - 2022-05-13 ### Added - Support for bold text rendering - Support for italic text rendering