diff --git a/MiraAPI/Utilities/Assets/TmpSpriteUtils.cs b/MiraAPI/Utilities/Assets/TmpSpriteUtils.cs index 6160a01..061587b 100644 --- a/MiraAPI/Utilities/Assets/TmpSpriteUtils.cs +++ b/MiraAPI/Utilities/Assets/TmpSpriteUtils.cs @@ -30,6 +30,10 @@ public static class TmpSpriteUtils spriteAsset.name = assetName; spriteAsset.spriteSheet = sourceTexture; + TMP_SpriteAsset spriteAssetMasked = ScriptableObject.CreateInstance(); + spriteAssetMasked.name = assetName + ".Masked"; + spriteAssetMasked.spriteSheet = sourceTexture; + if (!_spriteShader) { _spriteShader = Shader.Find("TextMeshPro/Sprite"); @@ -40,7 +44,6 @@ public static class TmpSpriteUtils name = assetName + " Material", }; 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_StencilID, 1);*/ material.SetFloat(ShaderUtilities.ID_StencilComp, 0); @@ -53,15 +56,36 @@ public static class TmpSpriteUtils spriteAsset.spriteInfoList = new Il2CppSystem.Collections.Generic.List(); + 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(); + AddSpriteToAsset(spriteAsset, rect, assetName, scale); + AddSpriteToAsset(spriteAssetMasked, rect, assetName + ".Masked", scale); spriteAsset.DontUnload().DontDestroy(); spriteAsset.UpdateLookupTables(); spriteAsset.fallbackSpriteAssets = new(); + spriteAssetMasked.DontUnload().DontDestroy(); + spriteAssetMasked.UpdateLookupTables(); + spriteAssetMasked.fallbackSpriteAssets = new(); AssetHolder.fallbackSpriteAssets.Add(spriteAsset); + AssetHolder.fallbackSpriteAssets.Add(spriteAssetMasked); AssetHolder.UpdateLookupTables(); LoadedSprites.Add(assetName, spriteAsset); + LoadedSprites.Add(assetName + ".Masked", spriteAssetMasked); return spriteAsset; }