using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Text; #if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; namespace Light2D { /// /// Sprite with dual color support. Grabs sprite from GameSpriteRenderer field. /// [ExecuteInEditMode] public class LightObstacleSprite : CustomSprite { /// /// Renderer from which sprite will be used. /// public Renderer GameSpriteRenderer; /// /// Color is packed in mesh UV1. /// public Color AdditiveColor; private Color _oldSecondaryColor; private Renderer _oldGameSpriteRenderer; private SpriteRenderer _oldUnitySprite; private CustomSprite _oldCustomSprite; protected override void OnEnable() { #if UNITY_EDITOR if (Material == null) { Material = AssetDatabase.LoadAssetAtPath("Assets/Light2D/Materials/DualColor.mat"); } #endif base.OnEnable(); if (GameSpriteRenderer == null && transform.parent != null) GameSpriteRenderer = transform.parent.gameObject.GetComponent(); gameObject.layer = LightingSystem.Instance.LightObstaclesLayer; UpdateMeshData(true); } private void UpdateSecondaryColor() { var uv1 = new Vector2( Util.DecodeFloatRGBA((Vector4)AdditiveColor), Util.DecodeFloatRGBA(new Vector4(AdditiveColor.a, 0, 0))); for (int i = 0; i < _uv1.Length; i++) { _uv1[i] = uv1; } } protected override void UpdateMeshData(bool forceUpdate = false) { if (_meshRenderer == null || _meshFilter == null || IsPartOfStaticBatch) return; if (GameSpriteRenderer != null && (GameSpriteRenderer != _oldGameSpriteRenderer || forceUpdate || (_oldUnitySprite != null && _oldUnitySprite.sprite != null && _oldUnitySprite.sprite != Sprite) || (_oldCustomSprite != null && _oldCustomSprite.Sprite != null && _oldCustomSprite.Sprite != Sprite))) { _oldGameSpriteRenderer = GameSpriteRenderer; _oldCustomSprite = GameSpriteRenderer.GetComponent(); if (_oldCustomSprite != null) { Sprite = _oldCustomSprite.Sprite; } else { _oldUnitySprite = GameSpriteRenderer.GetComponent(); if (_oldUnitySprite != null) Sprite = _oldUnitySprite.sprite; } Material.EnableKeyword("NORMAL_TEXCOORD"); } if (_oldSecondaryColor != AdditiveColor || forceUpdate) { UpdateSecondaryColor(); _isMeshDirty = true; _oldSecondaryColor = AdditiveColor; } base.UpdateMeshData(forceUpdate); } } }