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
{
///
/// Skin和Shader的关系类
///
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> _reldict1 = new Dictionary>();
//存储模型与Shader效果的关系--ModelConfig
private static Dictionary> _relDict2 = new Dictionary>();
//存储效果与属性信息的关系--ModelConfig
private static Dictionary _relDict3 = new Dictionary();
#endregion
#region//静态构造函数
//构造函数
static FSkinShaderRelation()
{
#region //状态与Shader的关系
//正常状态
var list = new List();
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();
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();
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITYSTATE_GROWN, FSkinStatusCode.Grown, FSkinTypeCode.None, FSkinPartCode.Body));
_reldict1[(int)FSkinStatusCode.Grown] = list;
//死亡状态
list = new List();
list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITYSTATE_DEAD, FSkinStatusCode.Dead, FSkinTypeCode.None, FSkinPartCode.Body));
_reldict1[(int)FSkinStatusCode.Dead] = list;
//霸体状态
list = new List();
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();
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();
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();
list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITYSTATE_GROWN, FModelEffectCode.Transparent, FSkinTypeCode.None, ModelTypeCode.None));
_relDict2[(int)FModelEffectCode.Transparent] = list1;
//溶解效果
list1 = new List();
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();
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();
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();
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();
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();
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();
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 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 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 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 GetEffectProperties(FModelEffectCode modelEffect, string cfgParams)
{
return GetEffectProperties((int)modelEffect, cfgParams);
}
//获取效果的属性信息
public static Dictionary 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 GetEffectProperties(FModelEffectCode modelEffect, string[] cfgParams)
{
return GetEffectProperties((int)modelEffect, cfgParams);
}
#endregion
#region//静态公共函数 -- 用于解析字符串
///
/// 解析Color字符串,字符串格式:255_255_255_255
///
/// 255_255_255_255
/// 输出的Color
///
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;
}
///
/// 解析四向量的字符串 格式:1_2_3_4
///
///
///
///
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;
}
///
/// 解析float的字符串 格式:1.2047
///
///
///
///
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 AnalyzeCfgParams(string[] cfgValues)
{
Dictionary result = new Dictionary();
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
}
}