Create masked variants of tmp icons

This commit is contained in:
Atony committed 2026-09-19 16:26:35 -05:00
1 parent d41ab95fa4
commit 003d577a09
1 file changed
+25 -1
+25 -1
View File
@@ -30,6 +30,10 @@ public static class TmpSpriteUtils
spriteAsset.name = assetName; spriteAsset.name = assetName;
spriteAsset.spriteSheet = sourceTexture; spriteAsset.spriteSheet = sourceTexture;
TMP_SpriteAsset spriteAssetMasked = ScriptableObject.CreateInstance<TMP_SpriteAsset>();
spriteAssetMasked.name = assetName + ".Masked";
spriteAssetMasked.spriteSheet = sourceTexture;
if (!_spriteShader) if (!_spriteShader)
{ {
_spriteShader = Shader.Find("TextMeshPro/Sprite"); _spriteShader = Shader.Find("TextMeshPro/Sprite");
@@ -40,7 +44,6 @@ public static class TmpSpriteUtils
name = assetName + " Material", name = assetName + " Material",
}; };
material.SetTexture(ShaderUtilities.ID_MainTex, sourceTexture); material.SetTexture(ShaderUtilities.ID_MainTex, sourceTexture);
// TODO: Using these values, the icons will NOT clip through chatboxes. However, this breaks quite literally every other tmp text that isn't masked. Please fix this if a good solution is found.
/*material.SetFloat(ShaderUtilities.ID_StencilComp, 4); /*material.SetFloat(ShaderUtilities.ID_StencilComp, 4);
material.SetFloat(ShaderUtilities.ID_StencilID, 1);*/ material.SetFloat(ShaderUtilities.ID_StencilID, 1);*/
material.SetFloat(ShaderUtilities.ID_StencilComp, 0); material.SetFloat(ShaderUtilities.ID_StencilComp, 0);
@@ -53,15 +56,36 @@ public static class TmpSpriteUtils
spriteAsset.spriteInfoList = new Il2CppSystem.Collections.Generic.List<TMP_Sprite>(); spriteAsset.spriteInfoList = new Il2CppSystem.Collections.Generic.List<TMP_Sprite>();
var maskedMaterial = new Material(_spriteShader)
{
name = assetName + " Masked Material",
};
maskedMaterial.SetTexture(ShaderUtilities.ID_MainTex, sourceTexture);
maskedMaterial.SetFloat(ShaderUtilities.ID_StencilComp, 4);
maskedMaterial.SetFloat(ShaderUtilities.ID_StencilID, 1);
maskedMaterial.SetFloat(ShaderUtilities.ID_StencilOp, 0);
maskedMaterial.SetFloat(ShaderUtilities.ID_StencilWriteMask, 255);
maskedMaterial.SetFloat(ShaderUtilities.ID_StencilReadMask, 255);
maskedMaterial.SetFloat(ShaderUtilities.ShaderTag_CullMode, 0);
spriteAssetMasked.material = maskedMaterial;
spriteAssetMasked.spriteInfoList = new Il2CppSystem.Collections.Generic.List<TMP_Sprite>();
AddSpriteToAsset(spriteAsset, rect, assetName, scale); AddSpriteToAsset(spriteAsset, rect, assetName, scale);
AddSpriteToAsset(spriteAssetMasked, rect, assetName + ".Masked", scale);
spriteAsset.DontUnload().DontDestroy(); spriteAsset.DontUnload().DontDestroy();
spriteAsset.UpdateLookupTables(); spriteAsset.UpdateLookupTables();
spriteAsset.fallbackSpriteAssets = new(); spriteAsset.fallbackSpriteAssets = new();
spriteAssetMasked.DontUnload().DontDestroy();
spriteAssetMasked.UpdateLookupTables();
spriteAssetMasked.fallbackSpriteAssets = new();
AssetHolder.fallbackSpriteAssets.Add(spriteAsset); AssetHolder.fallbackSpriteAssets.Add(spriteAsset);
AssetHolder.fallbackSpriteAssets.Add(spriteAssetMasked);
AssetHolder.UpdateLookupTables(); AssetHolder.UpdateLookupTables();
LoadedSprites.Add(assetName, spriteAsset); LoadedSprites.Add(assetName, spriteAsset);
LoadedSprites.Add(assetName + ".Masked", spriteAssetMasked);
return spriteAsset; return spriteAsset;
} }