using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using System;

[AddComponentMenu("UI/Effects/Gradient")]
[RequireComponent(typeof(Text))]
public class Gradient : BaseMeshEffect
{
public Color colorTop = Color.white;
public Color colorCenter = Color.grey;
public Color colorBottom = Color.black;

public bool MultiplyTextColor = false;

public static Color32 Multiply(Color32 a, Color32 b)
{
a.r = (byte)((a.r * b.r) >> 8);
a.g = (byte)((a.g * b.g) >> 8);
a.b = (byte)((a.b * b.b) >> 8);
a.a = (byte)((a.a * b.a) >> 8);
return a;
}

private void ModifyVertices(VertexHelper vh)
{
List<UIVertex> verts = new List<UIVertex>(vh.currentVertCount);
vh.GetUIVertexStream(verts);
vh.Clear();

int step = 6;

for (int i = 0; i < verts.Count; i += step)
{
//6 point
var tl = multiplyColor(verts[i + 0], colorTop);
var tr = multiplyColor(verts[i + 1], colorTop);
var bl = multiplyColor(verts[i + 4], colorBottom);
var br = multiplyColor(verts[i + 3], colorBottom);
var cl = calcCenterVertex(verts[i + 0], verts[i + 4]);
var cr = calcCenterVertex(verts[i + 1], verts[i + 2]);

vh.AddVert(tl);
vh.AddVert(tr);
vh.AddVert(cr);
vh.AddVert(cr);
vh.AddVert(cl);
vh.AddVert(tl);

vh.AddVert(cl);
vh.AddVert(cr);
vh.AddVert(br);
vh.AddVert(br);
vh.AddVert(bl);
vh.AddVert(cl);
}

for (int i = 0; i < vh.currentVertCount; i += 12)
{
vh.AddTriangle(i + 0, i + 1, i + 2);
vh.AddTriangle(i + 3, i + 4, i + 5);
vh.AddTriangle(i + 6, i + 7, i + 8);
vh.AddTriangle(i + 9, i + 10, i + 11);
}
}

private UIVertex multiplyColor(UIVertex vertex, Color color)
{
if (MultiplyTextColor)
vertex.color = Multiply(vertex.color, color);
else
vertex.color = color;
return vertex;
}

private UIVertex calcCenterVertex(UIVertex top, UIVertex bottom)
{
UIVertex center;
center.normal = (top.normal + bottom.normal) / 2;
center.position = (top.position + bottom.position) / 2;
center.tangent = (top.tangent + bottom.tangent) / 2;
center.uv0 = (top.uv0 + bottom.uv0) / 2;
center.uv1 = (top.uv1 + bottom.uv1) / 2;

if (MultiplyTextColor)
{
//multiply color
var color = Color.Lerp(top.color, bottom.color, 0.5f);
center.color = Multiply(color, colorCenter);
}
else
{
center.color = colorCenter;
}

return center;
}

#region implemented abstract members of BaseMeshEffect

public override void ModifyMesh(VertexHelper vh)
{
if (!this.IsActive())
{
return;
}

ModifyVertices(vh);
}

#endregion
}

最新文章

  1. 开源地图SharpMap源码解析-(1)简介
  2. jquery获取和设置表单数据
  3. OLE填充EXCEL 多SHEET
  4. ruby -- 问题解决(六)link_to to destroy not working
  5. csuoj 1334: 好老师
  6. SQL —— 视图
  7. WIN10 64位下VS2015 MFC直接添加 halcon 12的CPP文件实现视觉检测
  8. cocos2d游戏界面卡住声音正常播放的问题分析
  9. 深入理解C++中的explicitkeyword
  10. jemalloc/jemalloc.h: No such file or directory
  11. requirejs-define jquery 快速初学实例(一)
  12. 软碟通UltraISO 9.65.3237官方注册版
  13. 循环语句 ,for语句
  14. 【charger battery 充電 充電器 電池】停充的種類
  15. 使用 Linux 文件恢复工具
  16. spring事务相关
  17. 从头到尾使用Geth的说明-2-cli可用命令-有2个地方标红,之后查查源码后看看能不能解决
  18. SharePoint &ldquo;File not found&rdquo; 错误
  19. Could not find com.android.tools.build:aapt2:3.2.0-alpha14-4748712.
  20. Java Spring+Mysql+Mybatis 实现用户登录注册功能

热门文章

  1. maven项目pom.xml报未找到指定路径文件
  2. Linux系统Shell脚本第三章:for、while循环及脚本实操
  3. Windows10 WSL开启SSH登录
  4. ARM的发展史以及架构解析
  5. web服务器应答状态代码(status)及其含义
  6. elastalert部署和使用
  7. python对文件的处理方法
  8. 直播平台搭建源码,canvas 画一条波浪线 进度条
  9. 使用FormData上传图片
  10. 由Restart()想到的