public void OverlayImage(Sprite sprite, TextureDownloadInfo imageDownloadInfo) { try { string spriteIndex = imageDownloadInfo.spriteIndex; string messageIndex = imageDownloadInfo.messageIndex; foreach (CustomText currentMessage in _chatMessages) { if (currentMessage.messageInfo == null || !currentMessage.hasRendered) { continue; } foreach (EmoteInfo e in currentMessage.messageInfo.parsedEmotes.Values) { if (e.textureIndex == spriteIndex) { Drawing.OverlayImage(currentMessage, e); } } foreach (BadgeInfo b in currentMessage.messageInfo.parsedBadges.Values) { if (b.textureIndex == spriteIndex) { Drawing.OverlayImage(currentMessage, b); } } } } catch (Exception e) { Plugin.Log($"Exception when overlaying emote! {e.ToString()}"); } }
public void OverlayAnimatedImage(Texture2D texture, Rect[] uvs, float delay, TextureDownloadInfo imageDownloadInfo) { try { string spriteIndex = imageDownloadInfo.spriteIndex; string messageIndex = imageDownloadInfo.messageIndex; if (ImageDownloader.CachedTextures.ContainsKey(spriteIndex)) { // If the animated image already exists, check if its only a single frame and replace it with the full animation if so var animationInfo = ImageDownloader.CachedTextures[spriteIndex]?.animInfo; if (animationInfo != null && animationInfo.uvs.Length == 1) { foreach (CustomText currentMessage in _chatMessages) { for (int i = currentMessage.emoteRenderers.Count - 1; i >= 0; i--) { CustomImage img = currentMessage.emoteRenderers[i]; if (img.spriteIndex == spriteIndex) { imagePool.Free(img); currentMessage.emoteRenderers.RemoveAt(i); } } } } } // Setup our CachedTextureData and CachedAnimationData, registering the animation if there is more than one uv in the array ImageDownloader.CachedTextures[spriteIndex] = new CachedSpriteData(null, uvs[0].width, uvs[0].height); ImageDownloader.CachedTextures[spriteIndex].animInfo = new CachedAnimationData(uvs.Length > 1 ? AnimationController.Instance.Register(spriteIndex, uvs, delay) : 0, texture, uvs, delay); if (ChatConfig.Instance.DrawShadows) { var _shadowMaterial = Instantiate(Drawing.CropMaterialColorMultiply); _shadowMaterial.mainTexture = texture; _shadowMaterial.SetVector("_CropFactors", new Vector4(uvs[0].x, uvs[0].y, uvs[0].width, uvs[0].height)); _shadowMaterial.SetColor("_Color", Color.black.ColorWithAlpha(0.2f)); _shadowMaterial.renderQueue = 3001; ImageDownloader.CachedTextures[spriteIndex].animInfo.shadowMaterial = _shadowMaterial; } var _animMaterial = Instantiate(Drawing.CropMaterial); _animMaterial.mainTexture = texture; _animMaterial.SetVector("_CropFactors", new Vector4(uvs[0].x, uvs[0].y, uvs[0].width, uvs[0].height)); ImageDownloader.CachedTextures[spriteIndex].animInfo.imageMaterial = _animMaterial; foreach (CustomText currentMessage in _chatMessages) { if (currentMessage.messageInfo == null || !currentMessage.hasRendered) { continue; } foreach (EmoteInfo e in currentMessage.messageInfo.parsedEmotes) { if (e.textureIndex == spriteIndex) { Drawing.OverlayImage(currentMessage, e); } } } } catch (Exception e) { Plugin.Log($"Exception when overlaying animated emote! {e.ToString()}"); } }
public void OverlayAnimatedImage(Texture2D texture, Rect[] uvs, float[] delays, bool isDelayConsistent, int width, int height, TextureDownloadInfo imageDownloadInfo) { try { string spriteIndex = imageDownloadInfo.spriteIndex; string messageIndex = imageDownloadInfo.messageIndex; ImageDownloader.CachedTextures.TryGetValue(spriteIndex, out var cachedTex); CachedAnimationData oldAnimInfo = cachedTex?.animInfo; // Create the shaders which will cycle through our animation texture sheet var animInfo = new CachedAnimationData(uvs.Length > 1 ? AnimationController.Instance.Register(spriteIndex, uvs, delays) : new AnimControllerData(spriteIndex, uvs, delays), texture, uvs, delays); // Try to create our animMaterial and shadowMaterial if they don't already exist Material _animMaterial = oldAnimInfo?.imageMaterial; Material _shadowMaterial = oldAnimInfo?.shadowMaterial; if (_animMaterial == null) { _animMaterial = Instantiate(Drawing.CropMaterial); _animMaterial.SetVector("_CropFactors", new Vector4(uvs[0].x, uvs[0].y, uvs[0].width, uvs[0].height)); } if (ChatConfig.instance.DrawShadows) { if (_shadowMaterial == null) { _shadowMaterial = Instantiate(Drawing.CropMaterialColorMultiply); _shadowMaterial.SetVector("_CropFactors", new Vector4(uvs[0].x, uvs[0].y, uvs[0].width, uvs[0].height)); _shadowMaterial.SetColor("_Color", Color.black.ColorWithAlpha(0.2f)); _shadowMaterial.renderQueue = 3001; } _shadowMaterial.mainTexture = texture; animInfo.shadowMaterial = _shadowMaterial; } _animMaterial.mainTexture = texture; animInfo.imageMaterial = _animMaterial; var newCachedSpriteData = new CachedSpriteData(imageDownloadInfo.type, animInfo, isDelayConsistent, width, height); ImageDownloader.CachedTextures[spriteIndex] = newCachedSpriteData; if (cachedTex != null && oldAnimInfo != null && oldAnimInfo.uvs.Length == 1) { foreach (CustomText currentMessage in _chatMessages) { for (int i = currentMessage.emoteRenderers.Count - 1; i >= 0; i--) { CustomImage img = currentMessage.emoteRenderers[i]; if (img.spriteIndex == spriteIndex) { Plugin.Log("Freeing old emote!"); imagePool.Free(img); currentMessage.emoteRenderers.RemoveAt(i); } } } } foreach (CustomText currentMessage in _chatMessages) { if (currentMessage.messageInfo == null || !currentMessage.hasRendered) { continue; } foreach (EmoteInfo e in currentMessage.messageInfo.parsedEmotes.Values) { if (e.textureIndex == spriteIndex) { Drawing.OverlayImage(currentMessage, e); } } } } catch (Exception e) { Plugin.Log($"Exception when overlaying animated emote! {e.ToString()}"); } }