GibTreaty

Hit Glow Vertex Effect

Nov 14th, 2015
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.72 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3.  
  4. public class HitGlowEffect : MonoBehaviour {
  5.  
  6.     [SerializeField]
  7.     MeshFilter[] _meshFilters;
  8.  
  9.     [SerializeField]
  10.     List<HitPosition> _hitPositions = new List<HitPosition>();
  11.  
  12.     void Update() {
  13.         if(_hitPositions.Count > 0) {
  14.             UpdateHits();
  15.             UpdateVertexColors();
  16.         }
  17.     }
  18.  
  19.     void UpdateHits() {
  20.         for(int i = _hitPositions.Count - 1; i > -1; i--) {
  21.             HitPosition hitPosition = _hitPositions[i];
  22.  
  23.             if(hitPosition.Time > 0)
  24.                 hitPosition.Time = Mathf.Max(hitPosition.Time - Time.deltaTime, 0);
  25.  
  26.             if(hitPosition.Time == 0)
  27.                 _hitPositions.RemoveAt(i);
  28.             else
  29.                 _hitPositions[i] = hitPosition;
  30.         }
  31.     }
  32.  
  33.     void UpdateVertexColors() {
  34.         for(int m = 0; m < _meshFilters.Length; m++) {
  35.             MeshFilter _meshFilter = _meshFilters[m];
  36.  
  37.             Vector3[] vertices = _meshFilter.mesh.vertices;
  38.             Color[] colors = new Color[vertices.Length];
  39.  
  40.             //_meshFilter.transform.world
  41.  
  42.             for(int i = 0; i < vertices.Length; i++) {
  43.                 Vector3 position = _meshFilter.transform.TransformPoint(vertices[i]);
  44.                 position = transform.InverseTransformPoint(position);
  45.                 colors[i] = CalculateColor(position);
  46.             }
  47.  
  48.             _meshFilter.mesh.vertices = vertices;
  49.             _meshFilter.mesh.colors = colors;
  50.         }
  51.     }
  52.  
  53.     Color CalculateColor(Vector3 position) {
  54.         Color color = Color.clear;
  55.         float alpha = 0;
  56.  
  57.         for(int i = 0; i < _hitPositions.Count; i++) {
  58.             HitPosition hitPosition = _hitPositions[i];
  59.  
  60.             if(hitPosition.Distance <= 0) continue;
  61.  
  62.             float distance = (position - hitPosition.Position).sqrMagnitude;
  63.  
  64.             if(distance < hitPosition.Distance * hitPosition.Distance) {
  65.                 float finalDistance = 1 - (Mathf.Sqrt(distance) / hitPosition.Distance);
  66.  
  67.                 //color += (hitPosition.Color * finalDistance * Mathf.Min(hitPosition.Time, 1));
  68.                 color = AddColors((hitPosition.Color * finalDistance * Mathf.Min(hitPosition.Time, 1)), color);
  69.                 alpha = Mathf.Max(alpha, finalDistance);
  70.             }
  71.         }
  72.  
  73.         color.a *= alpha;
  74.  
  75.         return color;
  76.     }
  77.  
  78.     Color AddColors(Color colorA, Color colorB) {
  79.         //float a = colorA.a + colorB.a * (1 - colorA.a);
  80.         float a = colorA.a + colorB.a * (1 - colorA.a);
  81.  
  82.         if(a < 1.0e-6) return Color.clear;
  83.  
  84.         return new Color(
  85.             (colorA.r * colorA.a + colorB.r * colorB.a * (1 - colorA.a)) / a,
  86.             (colorA.g * colorA.a + colorB.g * colorB.a * (1 - colorA.a)) / a,
  87.             (colorA.b * colorA.a + colorB.b * colorB.a * (1 - colorA.a)) / a,
  88.             a
  89.         );
  90.     }
  91.  
  92.     Color BlendColors(Color colorA, Color colorB) {
  93.         Color color = new Color();
  94.         color.a = 1 - (1 - colorA.a) * (1 - colorB.a);
  95.  
  96.         if(color.a < 1.0e-6) return color;
  97.  
  98.         color.r = colorA.r * colorA.a / color.a + colorB.r * colorB.a * (1 - colorA.a) / color.a;
  99.         color.g = colorA.r * colorA.a / color.a + colorB.g * colorB.a * (1 - colorA.a) / color.a;
  100.         color.b = colorA.b * colorA.a / color.a + colorB.b * colorB.a * (1 - colorA.a) / color.a;
  101.  
  102.         return color;
  103.     }
  104.  
  105.     public void AddHit(HitPosition hitPosition) {
  106.         hitPosition.Position = transform.InverseTransformPoint(hitPosition.Position);
  107.         _hitPositions.Add(hitPosition);
  108.     }
  109.  
  110.     public void Reset() {
  111.         _hitPositions.Clear();
  112.         UpdateVertexColors();
  113.     }
  114.  
  115.     [System.Serializable]
  116.     public struct HitPosition {
  117.  
  118.         [SerializeField]
  119.         Vector3 _position;
  120.  
  121.         [SerializeField]
  122.         float _distance;
  123.  
  124.         [SerializeField, ColorUsage(true, true, 0, 10, .125f, 3)]
  125.         Color _color;
  126.  
  127.         [SerializeField]
  128.         float _time;
  129.  
  130.         #region Properties
  131.         public Color Color {
  132.             get { return _color; }
  133.             set { _color = value; }
  134.         }
  135.  
  136.         public float Distance {
  137.             get { return _distance; }
  138.             set { _distance = value; }
  139.         }
  140.  
  141.         public Vector3 Position {
  142.             get { return _position; }
  143.             set { _position = value; }
  144.         }
  145.  
  146.         public float Time {
  147.             get { return _time; }
  148.             set { _time = value; }
  149.         }
  150.         #endregion
  151.  
  152.         public HitPosition(Vector3 position, Color color, float distance, float time) {
  153.             _position = position;
  154.             _color = color;
  155.             _distance = distance;
  156.             _time = time;
  157.         }
  158.     }
  159. }
Advertisement
Add Comment
Please, Sign In to add comment