639 lines
39 KiB
C#
639 lines
39 KiB
C#
using Thousandto.Code.Logic;
|
|
using Thousandto.Core.Asset;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using UnityEngine;
|
|
|
|
namespace Thousandto.Code.Logic
|
|
{
|
|
/// <summary>
|
|
/// Skin和Shader的关系类
|
|
/// </summary>
|
|
public class FSkinShaderRelation
|
|
{
|
|
#region//常量信息
|
|
//属性的分割字符
|
|
public static char[] CN_PROPERTY_SPLIT_CHAR = new char[] { ';' };
|
|
//颜色的分割字符
|
|
public static char[] CN_COLOR_SPLIT_CHAR = new char[] { '_' };
|
|
//纹理类型的分割字符
|
|
public static char[] CN_TEXTURE_TYPE_SPLIT_CHAR = new char[] { ':' };
|
|
#endregion
|
|
|
|
#region//私有变量
|
|
//存储状态与Shader效果的关系 //FSkinStatusCode
|
|
private static Dictionary<int, List<ShaderRelation1>> _reldict1 = new Dictionary<int, List<ShaderRelation1>>();
|
|
//存储模型与Shader效果的关系--ModelConfig
|
|
private static Dictionary<int, List<ShaderRelation2>> _relDict2 = new Dictionary<int, List<ShaderRelation2>>();
|
|
//存储效果与属性信息的关系--ModelConfig
|
|
private static Dictionary<int, ShaderEffectPropertyInfo> _relDict3 = new Dictionary<int, ShaderEffectPropertyInfo>();
|
|
#endregion
|
|
|
|
#region//静态构造函数
|
|
//构造函数
|
|
static FSkinShaderRelation()
|
|
{
|
|
#region //状态与Shader的关系
|
|
|
|
//正常状态
|
|
var list = new List<ShaderRelation1>();
|
|
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW, FSkinStatusCode.Normal, FSkinTypeCode.LocalPlayer, FSkinPartCode.Body));
|
|
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALWING_SHOW, FSkinStatusCode.Normal, FSkinTypeCode.LocalPlayer, FSkinPartCode.Wing));
|
|
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_PLAYER_SHOW, FSkinStatusCode.Normal, FSkinTypeCode.Player, FSkinPartCode.Body));
|
|
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_WING_SHOW, FSkinStatusCode.Normal, FSkinTypeCode.Player, FSkinPartCode.Wing));
|
|
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER, FSkinStatusCode.Normal, FSkinTypeCode.Monster, FSkinPartCode.Body));
|
|
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_BOSS, FSkinStatusCode.Normal, FSkinTypeCode.BossMonster, FSkinPartCode.Body));
|
|
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SPECIAL, FSkinStatusCode.Normal, FSkinTypeCode.SpecMonster, FSkinPartCode.Body));
|
|
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER, FSkinStatusCode.Normal, FSkinTypeCode.NPC, FSkinPartCode.Body));
|
|
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_PET, FSkinStatusCode.Normal, FSkinTypeCode.Pet, FSkinPartCode.Body));
|
|
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_PET, FSkinStatusCode.Normal, FSkinTypeCode.LocalPet, FSkinPartCode.Body));
|
|
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_WING, FSkinStatusCode.Normal, FSkinTypeCode.None, FSkinPartCode.Wing));
|
|
_reldict1[(int)FSkinStatusCode.Normal] = list;
|
|
|
|
//被击状态
|
|
list = new List<ShaderRelation1>();
|
|
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITYSTATE_BEHIT, FSkinStatusCode.BeHit, FSkinTypeCode.None, FSkinPartCode.Body));
|
|
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALWING, FSkinStatusCode.BeHit, FSkinTypeCode.LocalPlayer, FSkinPartCode.Wing));
|
|
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_WING, FSkinStatusCode.BeHit, FSkinTypeCode.None, FSkinPartCode.Wing));
|
|
_reldict1[(int)FSkinStatusCode.BeHit] = list;
|
|
|
|
//出生状态
|
|
list = new List<ShaderRelation1>();
|
|
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITYSTATE_GROWN, FSkinStatusCode.Grown, FSkinTypeCode.None, FSkinPartCode.Body));
|
|
_reldict1[(int)FSkinStatusCode.Grown] = list;
|
|
|
|
//死亡状态
|
|
list = new List<ShaderRelation1>();
|
|
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITYSTATE_DEAD, FSkinStatusCode.Dead, FSkinTypeCode.None, FSkinPartCode.Body));
|
|
_reldict1[(int)FSkinStatusCode.Dead] = list;
|
|
|
|
//霸体状态
|
|
list = new List<ShaderRelation1>();
|
|
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITYSTATE_SUPERARMOR, FSkinStatusCode.SuperArmor, FSkinTypeCode.None, FSkinPartCode.Body));
|
|
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITYSTATE_SUPERARMOR_WING, FSkinStatusCode.SuperArmor, FSkinTypeCode.None, FSkinPartCode.Wing));
|
|
_reldict1[(int)FSkinStatusCode.SuperArmor] = list;
|
|
|
|
#endregion
|
|
|
|
#region//模型与Shader的关系
|
|
_relDict3[(int)FModelEffectCode.None] = null;
|
|
//流光的Shader处理
|
|
var list1 = new List<ShaderRelation2>();
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER, FModelEffectCode.Flow, FSkinTypeCode.LocalPlayer, ModelTypeCode.Player));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALWING, FModelEffectCode.Flow, FSkinTypeCode.LocalPlayer, ModelTypeCode.Wing));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER, FModelEffectCode.Flow, FSkinTypeCode.LocalPlayer, ModelTypeCode.Mount));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER, FModelEffectCode.Flow, FSkinTypeCode.LocalPlayer, ModelTypeCode.Weapon));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_WING, FModelEffectCode.Flow, FSkinTypeCode.None, ModelTypeCode.Wing));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_PLAYER, FModelEffectCode.Flow, FSkinTypeCode.None, ModelTypeCode.None));
|
|
_relDict2[(int)FModelEffectCode.Flow] = list1;
|
|
|
|
//边缘光效果
|
|
list1 = new List<ShaderRelation2>();
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_BOSS, FModelEffectCode.Rim, FSkinTypeCode.None, ModelTypeCode.None));
|
|
_relDict2[(int)FModelEffectCode.Rim] = list1;
|
|
|
|
//透明效果
|
|
list1 = new List<ShaderRelation2>();
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITYSTATE_GROWN, FModelEffectCode.Transparent, FSkinTypeCode.None, ModelTypeCode.None));
|
|
_relDict2[(int)FModelEffectCode.Transparent] = list1;
|
|
|
|
//溶解效果
|
|
list1 = new List<ShaderRelation2>();
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITYSTATE_DEAD, FModelEffectCode.Dissolving, FSkinTypeCode.None, ModelTypeCode.None));
|
|
_relDict2[(int)FModelEffectCode.Dissolving] = list1;
|
|
|
|
//brdf效果
|
|
/*
|
|
list1 = new List<ShaderRelation2>();
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_SHOW_ENTITY_GENERALENTITY, FModelEffectCode.Brdf, FSkinTypeCode.None, ModelTypeCode.None));
|
|
_relDict2[(int)FModelEffectCode.Brdf] = list1;
|
|
*/
|
|
list1 = new List<ShaderRelation2>();
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.LocalPlayer, ModelTypeCode.Player));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALWING_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.LocalPlayer, ModelTypeCode.Wing));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.LocalPlayer, ModelTypeCode.Mount));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.LocalPlayer, ModelTypeCode.Weapon));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.LocalPlayer, ModelTypeCode.Monster));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_WING_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.None, ModelTypeCode.Wing));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.NPC, ModelTypeCode.None));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.Monster, ModelTypeCode.None));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.BossMonster, ModelTypeCode.None));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_PLAYER_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.None, ModelTypeCode.None));
|
|
_relDict2[(int)FModelEffectCode.Brdf] = list1;
|
|
|
|
//使用Cube采样来实现Glaze琉璃的效果
|
|
list1 = new List<ShaderRelation2>();
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_CUBE, FModelEffectCode.Cube, FSkinTypeCode.None, ModelTypeCode.None));
|
|
_relDict2[(int)FModelEffectCode.Cube] = list1;
|
|
|
|
//颜色流光的Shader处理
|
|
list1 = new List<ShaderRelation2>();
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_FLUX, FModelEffectCode.Flux, FSkinTypeCode.LocalPlayer, ModelTypeCode.Player));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALWING_FLUX, FModelEffectCode.Flux, FSkinTypeCode.LocalPlayer, ModelTypeCode.Wing));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_FLUX, FModelEffectCode.Flux, FSkinTypeCode.LocalPlayer, ModelTypeCode.Mount));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_FLUX, FModelEffectCode.Flux, FSkinTypeCode.LocalPlayer, ModelTypeCode.Weapon));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_WING_FLUX, FModelEffectCode.Flux, FSkinTypeCode.None, ModelTypeCode.Wing));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_PLAYER_FLUX, FModelEffectCode.Flux, FSkinTypeCode.None, ModelTypeCode.None));
|
|
_relDict2[(int)FModelEffectCode.Flux] = list1;
|
|
|
|
//流光的Shader处理
|
|
list1 = new List<ShaderRelation2>();
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW_FLOW, FModelEffectCode.BrdfFlow, FSkinTypeCode.LocalPlayer, ModelTypeCode.Player));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALWING_SHOW_FLOW, FModelEffectCode.BrdfFlow, FSkinTypeCode.LocalPlayer, ModelTypeCode.Wing));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW_FLOW, FModelEffectCode.BrdfFlow, FSkinTypeCode.LocalPlayer, ModelTypeCode.Mount));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW_FLOW, FModelEffectCode.BrdfFlow, FSkinTypeCode.LocalPlayer, ModelTypeCode.Weapon));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_WING_SHOW_FLOW, FModelEffectCode.BrdfFlow, FSkinTypeCode.None, ModelTypeCode.Wing));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SHOW_FLOW, FModelEffectCode.BrdfFlow, FSkinTypeCode.NPC, ModelTypeCode.None));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SHOW_FLOW, FModelEffectCode.BrdfFlow, FSkinTypeCode.Monster, ModelTypeCode.None));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SHOW_FLOW, FModelEffectCode.BrdfFlow, FSkinTypeCode.BossMonster, ModelTypeCode.None));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_PLAYER_SHOW_FLOW, FModelEffectCode.BrdfFlow, FSkinTypeCode.None, ModelTypeCode.None));
|
|
_relDict2[(int)FModelEffectCode.BrdfFlow] = list1;
|
|
|
|
//流光的Shader处理
|
|
list1 = new List<ShaderRelation2>();
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW_FLUX, FModelEffectCode.BrdfFlux, FSkinTypeCode.LocalPlayer, ModelTypeCode.Player));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALWING_SHOW_FLUX, FModelEffectCode.BrdfFlux, FSkinTypeCode.LocalPlayer, ModelTypeCode.Wing));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW_FLUX, FModelEffectCode.BrdfFlux, FSkinTypeCode.LocalPlayer, ModelTypeCode.Mount));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW_FLUX, FModelEffectCode.BrdfFlux, FSkinTypeCode.LocalPlayer, ModelTypeCode.Weapon));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_WING_SHOW_FLUX, FModelEffectCode.BrdfFlux, FSkinTypeCode.None, ModelTypeCode.Wing));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SHOW_FLUX, FModelEffectCode.BrdfFlux, FSkinTypeCode.NPC, ModelTypeCode.None));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SHOW_FLUX, FModelEffectCode.BrdfFlux, FSkinTypeCode.Monster, ModelTypeCode.None));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SHOW_FLUX, FModelEffectCode.BrdfFlux, FSkinTypeCode.BossMonster, ModelTypeCode.None));
|
|
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_PLAYER_SHOW_FLUX, FModelEffectCode.BrdfFlux, FSkinTypeCode.None, ModelTypeCode.None));
|
|
_relDict2[(int)FModelEffectCode.BrdfFlux] = list1;
|
|
|
|
#endregion
|
|
|
|
#region//效果对应的参数的
|
|
_relDict3[(int)FModelEffectCode.None] = null;
|
|
_relDict3[(int)FModelEffectCode.Flow] = new ShaderEffectPropertyInfo(FModelEffectCode.Flow
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTEX) //纹理
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWCOLOR) //颜色
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWCOLOR2) //颜色
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWSPEED) //速度
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTILECOUNT) //折叠次数
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWSTRENGTH) //流光强度
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTYPE) //方向
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLASHSPEED) //闪烁速度
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLASHCOLOR) //闪烁颜色
|
|
);
|
|
_relDict3[(int)FModelEffectCode.Rim] = new ShaderEffectPropertyInfo(FModelEffectCode.Rim
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_RIMPOWER) //边缘光的集中度
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_RIMCOLOR) //边缘光颜色
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_INNERCOLORPOWER) //边缘光内部颜色的强度
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_INNERCOLOR) //边缘光内部颜色
|
|
);
|
|
_relDict3[(int)FModelEffectCode.Dissolving] = new ShaderEffectPropertyInfo(FModelEffectCode.Dissolving
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_GRAYTIME) //灰色时间
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_DISSTIME) //溶解的时间
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_TIMELINE) //时间线,用于设置当前的状态
|
|
);
|
|
|
|
_relDict3[(int)FModelEffectCode.Transparent] = new ShaderEffectPropertyInfo(FModelEffectCode.Transparent
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_COLOR) //颜色
|
|
);
|
|
|
|
_relDict3[(int)FModelEffectCode.AlphaTest] = new ShaderEffectPropertyInfo(FModelEffectCode.AlphaTest
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_CUTOFF) //cut值
|
|
);
|
|
_relDict3[(int)FModelEffectCode.Brdf] = new ShaderEffectPropertyInfo(FModelEffectCode.Brdf);
|
|
_relDict3[(int)FModelEffectCode.Cube] = new ShaderEffectPropertyInfo(FModelEffectCode.Cube
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_ENVCUBE) //环境Cube
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_ENVCUBEMIXER) //混合值
|
|
);
|
|
|
|
_relDict3[(int)FModelEffectCode.Flux] = new ShaderEffectPropertyInfo(FModelEffectCode.Flux
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTEX) //纹理
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWCOLOR) //颜色1
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWCOLOR2) //颜色2
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWSPEED) //速度
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTILECOUNT) //折叠次数
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWSTRENGTH) //流光强度
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLASHSPEED) //闪烁速度
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLASHCOLOR) //闪烁颜色
|
|
);
|
|
_relDict3[(int)FModelEffectCode.BrdfFlow] = new ShaderEffectPropertyInfo(FModelEffectCode.BrdfFlow
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTEX) //纹理
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWCOLOR) //颜色
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWCOLOR2) //颜色
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWSPEED) //速度
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTILECOUNT) //折叠次数
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWSTRENGTH) //流光强度
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTYPE) //方向
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLASHSPEED) //闪烁速度
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLASHCOLOR) //闪烁颜色
|
|
);
|
|
_relDict3[(int)FModelEffectCode.BrdfFlux] = new ShaderEffectPropertyInfo(FModelEffectCode.BrdfFlux
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTEX) //纹理
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWCOLOR) //颜色1
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWCOLOR2) //颜色2
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWSPEED) //速度
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTILECOUNT) //折叠次数
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWSTRENGTH) //流光强度
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLASHSPEED) //闪烁速度
|
|
, Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLASHCOLOR) //闪烁颜色
|
|
);
|
|
#endregion
|
|
|
|
}
|
|
#endregion
|
|
|
|
#region//公共接口
|
|
|
|
//获取某个状态的Shader
|
|
public static string GetStatusShader(FSkinTypeCode skinType, int part, FSkinStatusCode status)
|
|
{
|
|
List<ShaderRelation1> rlist = _reldict1[(int)status];
|
|
if (rlist != null)
|
|
{
|
|
int idx = -1;
|
|
int noneIdx = -1;
|
|
|
|
//先对Skin做比较
|
|
for (int i = 0; i < rlist.Count; i++)
|
|
{
|
|
if (rlist[i].SkinCode == skinType)
|
|
{
|
|
if (rlist[i].PartCode == part)
|
|
{
|
|
idx = i;
|
|
break;
|
|
}
|
|
else if (rlist[i].PartCode == FSkinPartCode.Body)
|
|
{
|
|
noneIdx = i;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if (idx < 0 )
|
|
{//如果没有精确匹配,再选择SkinType==None的某个部位的Shader
|
|
for (int i = 0; i < rlist.Count; i++)
|
|
{
|
|
if (rlist[i].SkinCode == FSkinTypeCode.None)
|
|
{
|
|
if (rlist[i].PartCode == part)
|
|
{
|
|
idx = i;
|
|
break;
|
|
}
|
|
else if (noneIdx < 0 && rlist[i].PartCode == FSkinPartCode.Body)
|
|
{
|
|
noneIdx = i;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//最后获取查找信息
|
|
idx = idx < 0 ? noneIdx : idx;
|
|
|
|
if (idx < 0)
|
|
{
|
|
//Debug.LogError("没有从关系中找到Shader:" + skinType + ";;" + part + ";;" + status);
|
|
return null;
|
|
}
|
|
|
|
return rlist[idx].ShaderName;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
//获取某个模型的Shader
|
|
public static string GetModelShader(FSkinTypeCode skinType, ModelTypeCode modelType, int modelEffect)
|
|
{
|
|
if (_relDict2.ContainsKey(modelEffect))
|
|
{
|
|
List<ShaderRelation2> rlist = _relDict2[modelEffect];
|
|
if (rlist != null)
|
|
{
|
|
int idx = -1;
|
|
int noneIdx = -1;
|
|
|
|
//先对Skin做比较
|
|
for (int i = 0; i < rlist.Count; i++)
|
|
{
|
|
if (rlist[i].SkinCode == skinType)
|
|
{
|
|
if (rlist[i].ModelType == modelType)
|
|
{
|
|
idx = i;
|
|
break;
|
|
}
|
|
else if (rlist[i].ModelType == ModelTypeCode.None)
|
|
{
|
|
noneIdx = i;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if (idx < 0)
|
|
{//如果没有精确匹配,再选择SkinType==None的某个模型的Shader
|
|
for (int i = 0; i < rlist.Count; i++)
|
|
{
|
|
if (rlist[i].SkinCode == FSkinTypeCode.None)
|
|
{
|
|
if (rlist[i].ModelType == modelType)
|
|
{
|
|
idx = i;
|
|
break;
|
|
}
|
|
else if (noneIdx < 0 && rlist[i].ModelType == ModelTypeCode.None)
|
|
{
|
|
noneIdx = i;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//最后获取查找信息
|
|
idx = idx < 0 ? noneIdx : idx;
|
|
|
|
if (idx < 0)
|
|
{
|
|
Debug.LogError("没有从关系中找到Shader:"+ skinType+";;"+ modelType+";;"+ (FModelEffectCode)modelEffect);
|
|
return null;
|
|
}
|
|
|
|
return rlist[idx].ShaderName;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
//获取效果参数
|
|
public static ShaderEffectPropertyInfo GetEffectPropertyInfo(int modelEffect)
|
|
{
|
|
if (_relDict3.ContainsKey(modelEffect))
|
|
{
|
|
return _relDict3[modelEffect];
|
|
}
|
|
return null;
|
|
}
|
|
//获取效果属性
|
|
public static Dictionary<int, object> GetEffectProperties(int modelEffect, string cfgParams)
|
|
{
|
|
if (modelEffect < 0) return null;
|
|
if (cfgParams == null) return null;
|
|
if (_relDict3.ContainsKey(modelEffect))
|
|
{
|
|
var rel = _relDict3[modelEffect];
|
|
if (rel != null)
|
|
{
|
|
var arr = cfgParams.Split(CN_PROPERTY_SPLIT_CHAR, StringSplitOptions.RemoveEmptyEntries);
|
|
return rel.AnalyzeCfgParams(arr);
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
//获取效果属性
|
|
public static Dictionary<int, object> GetEffectProperties(FModelEffectCode modelEffect, string cfgParams)
|
|
{
|
|
return GetEffectProperties((int)modelEffect, cfgParams);
|
|
}
|
|
|
|
//获取效果的属性信息
|
|
public static Dictionary<int, object> GetEffectProperties(int modelEffect, string[] cfgParams)
|
|
{
|
|
if (modelEffect < 0) return null;
|
|
if (_relDict3.ContainsKey(modelEffect))
|
|
{
|
|
var rel = _relDict3[modelEffect];
|
|
if (rel != null)
|
|
{
|
|
return rel.AnalyzeCfgParams(cfgParams);
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
//获取效果的属性信息
|
|
public static Dictionary<int, object> GetEffectProperties(FModelEffectCode modelEffect, string[] cfgParams)
|
|
{
|
|
return GetEffectProperties((int)modelEffect, cfgParams);
|
|
}
|
|
#endregion
|
|
|
|
#region//静态公共函数 -- 用于解析字符串
|
|
/// <summary>
|
|
/// 解析Color字符串,字符串格式:255_255_255_255
|
|
/// </summary>
|
|
/// <param name="text">255_255_255_255</param>
|
|
/// <param name="color">输出的Color</param>
|
|
/// <returns></returns>
|
|
public static bool TryParseColorText(string text, ref Color color)
|
|
{
|
|
var arr = text.Split(CN_COLOR_SPLIT_CHAR, StringSplitOptions.RemoveEmptyEntries);
|
|
bool isValid = false;
|
|
if (arr.Length >= 3)
|
|
{
|
|
int r = 255, g = 255, b = 255, a = 255;
|
|
isValid = int.TryParse(arr[0], out r);
|
|
isValid = isValid && int.TryParse(arr[1], out g);
|
|
isValid = isValid && int.TryParse(arr[2], out b);
|
|
if (arr.Length > 3 && isValid)
|
|
{
|
|
isValid = int.TryParse(arr[3], out a);
|
|
}
|
|
if (isValid)
|
|
{
|
|
color = new Color((float)r / 255f, (float)g / 255f, (float)b / 255f, (float)a / 255f);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 解析四向量的字符串 格式:1_2_3_4
|
|
/// </summary>
|
|
/// <param name="text"></param>
|
|
/// <param name="vector"></param>
|
|
/// <returns></returns>
|
|
public static bool TryParseVectorText(string text, ref Vector4 vector)
|
|
{
|
|
var arr = text.Split(CN_COLOR_SPLIT_CHAR, StringSplitOptions.RemoveEmptyEntries);
|
|
bool isValid = false;
|
|
if (arr.Length >= 4)
|
|
{
|
|
float v1 = 1, v2 = 1, v3 = 1, v4 = 1;
|
|
isValid = float.TryParse(arr[0], out v1);
|
|
isValid = isValid && float.TryParse(arr[1], out v2);
|
|
isValid = isValid && float.TryParse(arr[2], out v3);
|
|
isValid = isValid && float.TryParse(arr[3], out v4);
|
|
if (isValid)
|
|
{
|
|
vector = new Vector4(v1, v2, v3, v4);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 解析float的字符串 格式:1.2047
|
|
/// </summary>
|
|
/// <param name="text"></param>
|
|
/// <param name="f"></param>
|
|
/// <returns></returns>
|
|
public static bool TryParseFloatText(string text, ref float f)
|
|
{
|
|
return float.TryParse(text, out f);
|
|
}
|
|
#endregion
|
|
|
|
#region //内部子类
|
|
//Shader与Skin的关系1
|
|
//根据当前Skin状态,来获取各个部位的Shader信息
|
|
private class ShaderRelation1
|
|
{
|
|
public FSkinTypeCode SkinCode { get; set; }
|
|
public int PartCode { get; set; }
|
|
public FSkinStatusCode EffectType { get; set; }
|
|
public string ShaderName { get; set; }
|
|
public ShaderRelation1(string name, FSkinStatusCode c1, FSkinTypeCode c2, int c3)
|
|
{
|
|
|
|
EffectType = c1;
|
|
SkinCode = c2;
|
|
PartCode = c3;
|
|
ShaderName = name;
|
|
}
|
|
}
|
|
|
|
//Shader与Skin的关系2
|
|
//这个关系所属与关系1的Normal状态,但是他的优先级更高
|
|
//根据设置效果,来获取当前Skin中某个模型的Shader
|
|
private class ShaderRelation2
|
|
{
|
|
public FSkinTypeCode SkinCode { get; set; }
|
|
public ModelTypeCode ModelType { get; set; }
|
|
public FModelEffectCode EffectType { get; set; }
|
|
public String ShaderName { get; set; }
|
|
|
|
public ShaderRelation2(string name, FModelEffectCode c1, FSkinTypeCode c2, ModelTypeCode c3)
|
|
{
|
|
EffectType = c1;
|
|
SkinCode = c2;
|
|
ModelType = c3;
|
|
ShaderName = name;
|
|
}
|
|
|
|
}
|
|
|
|
//Shader效果的信息
|
|
public class ShaderEffectPropertyInfo
|
|
{
|
|
public FModelEffectCode EffectType { get; set; }
|
|
public int[] PropertyIDs { get; set; }
|
|
public ShaderPropertyType[] PropertyTypes { get; set; }
|
|
public ShaderEffectPropertyInfo(FModelEffectCode effect, params int[] propertyIDs)
|
|
{
|
|
EffectType = effect;
|
|
if (propertyIDs == null) propertyIDs = new int[0];
|
|
PropertyIDs = propertyIDs;
|
|
PropertyTypes = new ShaderPropertyType[propertyIDs.Length];
|
|
for (int i = 0; i < propertyIDs.Length; i++)
|
|
{
|
|
var pID = PropertyIDs[i];
|
|
PropertyTypes[i] = ShaderManager.SharedInstance.GetShaderPropertyType(pID);
|
|
}
|
|
}
|
|
|
|
//分析配置参数
|
|
public Dictionary<int, object> AnalyzeCfgParams(string[] cfgValues)
|
|
{
|
|
Dictionary<int, object> result = new Dictionary<int, object>();
|
|
|
|
for (int i = 0; i < cfgValues.Length && i < PropertyIDs.Length && i < PropertyTypes.Length; i++)
|
|
{
|
|
var val = cfgValues[i];
|
|
var pID = PropertyIDs[i];
|
|
if (!string.IsNullOrEmpty(val) && pID > 0)
|
|
{
|
|
val = val.Trim();
|
|
var pType = PropertyTypes[i];
|
|
switch (pType)
|
|
{
|
|
case ShaderPropertyType.Color:
|
|
{
|
|
Color c = Color.black;
|
|
if (TryParseColorText(val, ref c))
|
|
{
|
|
result[pID] = c;
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("颜色解析失败:" + pID + ";;" + val);
|
|
}
|
|
}
|
|
break;
|
|
case ShaderPropertyType.Vector:
|
|
{
|
|
Vector4 v = Vector4.zero;
|
|
if (TryParseVectorText(val, ref v))
|
|
{
|
|
result[pID] = v;
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("Vector解析失败:" + pID + ";;" + val);
|
|
}
|
|
|
|
}
|
|
break;
|
|
case ShaderPropertyType.TexEnv:
|
|
{
|
|
if (!string.IsNullOrEmpty(val)) //这里再判断一次,是因为之前做了一次Trim();
|
|
{
|
|
//判断当前值是否全路径
|
|
if (val.StartsWith("Texture/"))
|
|
{
|
|
result[pID] = val;
|
|
}
|
|
else
|
|
{
|
|
result[pID] = AssetUtils.GetImageAssetPath(ImageTypeCode.Shader, val);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("纹理名字为空." + pID + ";;" + val);
|
|
}
|
|
}
|
|
break;
|
|
case ShaderPropertyType.Float:
|
|
case ShaderPropertyType.Range:
|
|
{
|
|
float f = 0;
|
|
if (TryParseFloatText(val, ref f))
|
|
{
|
|
result[pID] = f;
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("float解析失败:" + pID + ";;" + val);
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
}
|
|
#endregion
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|