Files
ichni_Creator_Studio/Packages/NBShaders/Editor/ParticleBaseGUI.cs
SoulliesOfficial 1a3d37d9b5 一些特效
2025-06-28 03:01:03 -04:00

2205 lines
121 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
using UnityEngine.Rendering;
using stencilTestHelper;
using UnityEditor.AnimatedValues;
namespace UnityEditor
{
public class ParticleBaseGUI : ShaderGUI
{
private ShaderGUIHelper helper = new ShaderGUIHelper();
public List<Material> mats = new List<Material>();
private Shader shader;
private MaterialEditor matEditor;
public List<W9ParticleShaderFlags> shaderFlags = new List<W9ParticleShaderFlags>();
private int lastFlagBit;
private bool isCustomedStencil = false;
private StencilValuesConfig _stencilValuesConfig;
public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] props)
{
//一定要初始化在第一行
mats.Clear();
shaderFlags.Clear();
for (int i = 0; i < materialEditor.targets.Length; i++)
{
var _targetMat = materialEditor.targets[i] as Material;
mats.Add(_targetMat);
shaderFlags.Add(new W9ParticleShaderFlags(mats[i]));
}
matEditor = materialEditor;
if (!_stencilValuesConfig)
{
_stencilValuesConfig = AssetDatabase.LoadAssetAtPath<StencilValuesConfig>("Packages/com.xuanxuan.nb.shaders/Shader/StencilConfig.asset");
}
matEditor = materialEditor;
isCustomedStencil = false;
helper.Init(materialEditor, props, shaderFlags.ToArray(), mats);
DrawBigBlockFoldOut(W9ParticleShaderFlags.foldOutBitMeshOption,3,"模式设置", () => DrawMeshOptions());
DrawBigBlockFoldOut(W9ParticleShaderFlags.foldOutBitMainTexOption,3,"主贴图功能", () => DrawMainTexOptions());
DrawBigBlockFoldOut(W9ParticleShaderFlags.foldOutBitBaseOption,3,"基本全局功能", () => DrawBaseOptions());
DrawBigBlockFoldOut(W9ParticleShaderFlags.foldOutBitFeatureOption,3,"特别功能", () => DrawFeatureOptions());
DrawBigBlockFoldOut(W9ParticleShaderFlags.foldOutTaOption,4,"TA调试", () => DrawTaOptions());
//遍历整个场景,看哪些 粒子系统 用了这个材质。会填充m_RenderersUsingThisMaterial
if (mats.Count == 1)
{
CacheRenderersUsingThisMaterial(mats[0], 0);
if (!_uieffectEnabled||_uiParticleEnabled)
{
DoVertexStreamsArea(mats[0], m_RenderersUsingThisMaterial, 0);//填充stream和stremList
}
else
{
mats[0].DisableKeyword("_CUSTOMDATA");
}
}
DoAfterDraw();
// int flagBit = mat.GetInteger(W9ParticleShaderFlags.FlagsId);
// if (flagBit != lastFlagBit)
// {
// FlagBitTest.Log(mat);
// lastFlagBit = flagBit;
// }
// Debug.Log(mat.GetInt(W9ParticleShaderFlags.FlagsId));
// Debug.Log(shaderFlag.CheckFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_USETEXCOORD2));
}
bool _uieffectEnabled = false;
bool _uiParticleEnabled = false;
bool _noiseEnabled = false;//扭曲
// bool _uieffectSpriteMode = false;
private MeshSourceMode _meshSourceMode;
private TransparentMode _transparentMode;
public void DrawMeshOptions()
{
// if (shaderFlag.CheckIsUVModeOn(W9ParticleShaderFlags.UVMode.DefaultUVChannel))
// {
// EditorGUILayout.LabelField("UVMode.DefaultUVChannel");
// }
// if (shaderFlag.CheckIsUVModeOn(W9ParticleShaderFlags.UVMode.SpecialUVChannel))
// {
// EditorGUILayout.LabelField("UVMode.SpecialUVChannel");
// }
// if (shaderFlag.CheckIsUVModeOn(W9ParticleShaderFlags.UVMode.PolarOrTwirl))
// {
// EditorGUILayout.LabelField("UVMode.PolarOrTwirl");
// }
// if (shaderFlag.CheckIsUVModeOn(W9ParticleShaderFlags.UVMode.Cylinder))
// {
// EditorGUILayout.LabelField("UVMode.Cylinder");
// }
// SetMeshSourceModeToOriginSet();//防止就旧数据被复写。
// SetUVModeByOldSettings();
helper.DrawPopUp("Mesh来源模式","_MeshSourceMode",_meshSourceModeNames,drawBlock: mode =>
{
_meshSourceMode = (MeshSourceMode)mode;
if (_meshSourceMode == MeshSourceMode.UIEffectRawImage || _meshSourceMode == MeshSourceMode.UIEffectSprite || _meshSourceMode == MeshSourceMode.UIEffectBaseMap||_meshSourceMode == MeshSourceMode.UIParticle)
{
_uieffectEnabled = true;
}
else
{
_uieffectEnabled = false;
}
if (_meshSourceMode == MeshSourceMode.UIParticle)
{
_uiParticleEnabled = true;
}
else
{
_uiParticleEnabled = false;
}
if (checkIsParicleSystem)
{
if (!(_meshSourceMode != MeshSourceMode.Particle || !_uiParticleEnabled))
{
EditorGUILayout.HelpBox("检测到材质用在粒子系统上,和设置不匹配",MessageType.Error);
}
}
else
{
//这个不能Log因为在Project面板下打开是不知道在不在粒子系统里的。
// if (_meshSourceMode == MeshSourceMode.Particle)
// {
// EditorGUILayout.HelpBox("检测到材质没有用在粒子系统上,和设置不匹配",MessageType.Error);
// }
}
});
// helper.DrawToggle("2D/UI模式", "_UIEffect_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_UIEFFECT_ON ,drawBlock:(isToggle) =>
// {
// _uieffectEnabled = isToggle;
// if (isToggle)
// {
// matEditor.ShaderProperty(helper.GetProperty("_Color"), "贴图颜色叠加");
// // mat.renderQueue = 3000 + (int)helper.GetProperty("_QueueBias").floatValue;
// helper.DrawToggle("精灵模式",flagBitsName:W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_UIEFFECT_SPRITE_MODE,flagIndex:1,drawBlock:
// isSpriteModeToggle =>
// {
// _uieffectSpriteMode = isSpriteModeToggle;
// });
// }
// else
// {
// shaderFlag.ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_UIEFFECT_SPRITE_MODE,null,1);
// EditorGUILayout.Space();
// // mat.renderQueue = 3100 + (int)helper.GetProperty("_QueueBias").floatValue; //3D粒子永远最前显示
// }
// });
helper.DrawPopUp("透明模式","_TransparentMode",transparentModeNames);
if (mats.Count == 1)
{
_transparentMode = (TransparentMode)mats[0].GetFloat("_TransparentMode");
if (_transparentMode == TransparentMode.CutOff)
{
matEditor.ShaderProperty(helper.GetProperty("_Cutoff"),"裁剪位置");
}
if (_transparentMode == TransparentMode.Transparent)
{
helper.DrawPopUp("混合模式","_Blend",blendModeNames);
}
}
}
public void DrawMainTexOptions()
{
Action drawAfterMainTex = ()=>
{
if (_meshSourceMode != MeshSourceMode.UIEffectSprite)
{
bool hasMainTex = mats[0].GetTexture("_MainTex") || mats[0].GetTexture("_BaseMap");
DrawUVModeSelect(W9ParticleShaderFlags.foldOutBit2UVModeMainTex,4,"主贴图UV来源",W9ParticleShaderFlags.FLAG_BIT_UVMODE_POS_0_MAINTEX,0,hasMap:hasMainTex);
}
if (!_uieffectEnabled||_uiParticleEnabled)
{
DrawCustomDataSelect("主贴图X轴偏移自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_MAINTEX_OFFSET_X,0);
DrawCustomDataSelect("主贴图Y轴偏移自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_MAINTEX_OFFSET_Y,0);
}
if (_meshSourceMode != MeshSourceMode.UIEffectSprite)
{
helper.DrawVector4In2Line("_BaseMapMaskMapOffset", "偏移速度");
helper.DrawSlider("主贴图旋转", "_BaseMapUVRotation", 0f, 360f);
}
DrawNoiseAffectBlock(() =>
{
helper.DrawSlider("主贴图扭曲强度","_TexDistortion_intensity",-1.0f,1.0f);
});
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutBitHueShift,3,"主贴图色相偏移","_HueShift_Toggle",W9ParticleShaderFlags.FLAG_BIT_HUESHIFT_ON,isIndentBlock:true,drawBlock:(isToggle)=>{
helper.DrawSlider("色相","_HueShift",0,1);
DrawCustomDataSelect("色相自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_HUESHIFT,0);
});
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutBitSaturability,3,"主贴图饱和度","_ChangeSaturability_Toggle",W9ParticleShaderFlags.FLAG_BIT_SATURABILITY_ON,isIndentBlock:true,drawBlock:(isToggle)=>{
helper.DrawSlider("饱和度","_Saturability",0,1);
DrawCustomDataSelect("饱和度强度自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_SATURATE,1);
});
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutMianTexContrast,4,"主贴图对比度","_Contrast_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_MAINTEX_CONTRAST,1,isIndentBlock:true,drawBlock:(isToggle)=>{
matEditor.ShaderProperty(helper.GetProperty("_ContrastMidColor"),"对比度中值颜色");
helper.DrawSlider("对比度","_Contrast",0,5);
DrawCustomDataSelect("对比度自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_2_CUSTOMDATA_MAINTEX_CONTRAST,2);
});
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutMainTexColorRefine,4,"主贴图颜色修正","_BaseMapColorRefine_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_MAINTEX_COLOR_REFINE,1,isIndentBlock:true,drawBlock:
(isToggle) =>
{
helper.DrawVector4Componet("A:主颜色相乘","_BaseMapColorRefine","x",false);
helper.DrawVector4Componet("B:主颜色Power","_BaseMapColorRefine","y",false);
helper.DrawVector4Componet("B:主颜色Power后相乘","_BaseMapColorRefine","z",false);
helper.DrawVector4Componet("A/B线性差值","_BaseMapColorRefine","w",true,0f,1f);
});
};
if (!_uieffectEnabled || _uiParticleEnabled || _meshSourceMode == MeshSourceMode.UIEffectBaseMap)
{
DrawTextureFoldOut(W9ParticleShaderFlags.foldOutBitBaseMap,3,"主贴图","_BaseMap","_BaseColor",drawWrapMode:true,flagBitsName:W9ParticleShaderFlags.FLAG_BIT_WRAPMODE_BASEMAP,flagIndex:2,drawBlock:
theBaseMap =>
{
drawAfterMainTex();
});
// helper.DrawTexture("主贴图","_BaseMap","_BaseColor",drawWrapMode:true,flagBitsName:W9ParticleShaderFlags.FLAG_BIT_WRAPMODE_BASEMAP,flagIndex:2);
}
else
{
//实际上贴图来自_MainTex
matEditor.ShaderProperty(helper.GetProperty("_Color"), "贴图颜色叠加");
helper.DrawVector4In2Line("_UI_MainTex_ST", "Tilling","Offset");
drawAfterMainTex();
}
}
public void DrawBaseOptions()
{
helper.DrawFloat("整体颜色强度","_BaseColorIntensityForTimeline");
helper.DrawSlider("整体透明度","_AlphaAll",0f,1f);
if (!_uieffectEnabled)
{
helper.DrawPopUp("深度测试","_ZTest",Enum.GetNames(typeof(CompareFunction)));
}
else
{
helper.GetProperty("_ZTest").floatValue = 4.0f;//UI层使用默认值LessEqual
}
// helper.DrawPopUp("时间模式","_TimeMode",Enum.GetNames(typeof(TimeMode)));
helper.DrawPopUp("渲染面向","_Cull",Enum.GetNames(typeof(RenderFace)));
if (!_uieffectEnabled)
{
if (mats.Count == 1)
{
if (_transparentMode == TransparentMode.Transparent)
{
bool isBackFirstPass = false;
helper.DrawToggle("预渲染反面", "_BackFristPassToggle", drawBlock: (isToggle) =>
{
mats[0].SetShaderPassEnabled("SRPDefaultUnlit", isToggle);
isBackFirstPass = isToggle;
});
if (isBackFirstPass)
{
EditorGUILayout.HelpBox("预渲染反面会导致打断动态合批,请谨慎使用。",MessageType.Warning);
mats[0].SetFloat("_Cull", (float)RenderFace.Front);
}
helper.DrawToggle("强制深度写入", "_ForceZWriteToggle");
}
}
EditorGUILayout.BeginHorizontal();
helper.DrawToggle("背面颜色","_BaseBackColor_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_BACKCOLOR,drawBlock:
(isToggle) =>
{
matEditor.ColorProperty(helper.GetProperty("_BaseBackColor"), "");
});
EditorGUILayout.EndHorizontal();
}
// helper.DrawToggle("使用3U作为UV来源","_UseUV1_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_USETEXCOORD2);
if (!_uieffectEnabled)
{
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutBitDistanceFade, 3,"近距离透明","_DistanceFade_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_DISTANCEFADE_ON,isIndentBlock:true,drawBlock:(isToggle) =>
{
helper.DrawVector4In2Line("_Fade","透明过度范围");
});
}
else
{
for (int i = 0; i < mats.Count; i++)
{
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_DISTANCEFADE_ON);
}
}
if (!_uieffectEnabled)
{
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutBitSoftParticles,3,"软粒子","_SoftParticlesEnabled",shaderKeyword:"_SOFTPARTICLES_ON",isIndentBlock:true,drawBlock:
(isToggle) =>
{
helper.DrawVector4In2Line("_SoftParticleFadeParams","远近裁剪面");
});
helper.DrawToggle("剔除主角色",shaderKeyword:"_STENCIL_WITHOUT_PLAYER", drawBlock: isToggle =>
{
if (isToggle)
{
for (int i = 0; i < mats.Count; i++)
{
StencilTestHelper.SetMaterialStencil(mats[i], "ParticleWithoutPlayer", _stencilValuesConfig,
out int queue);
}
isCustomedStencil = true;
}
},drawEndChangeCheck: isToggle =>
{
if (!isToggle)
{
helper.GetProperty("_CustomStencilTest").floatValue = 0f;
}
});
helper.DrawToggle("忽略顶点色","_IgnoreVetexColor_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_IGNORE_VERTEX_COLOR,flagIndex:1);
helper.DrawSlider("雾影响强度","_fogintensity",0f,1f);
}
else
{
helper.GetProperty("_fogintensity").floatValue = 0;
}
}
public void DrawFeatureOptions()
{
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutBitMask,3,"遮罩","_Mask_Toggle",shaderKeyword:"_MASKMAP_ON",fontStyle:FontStyle.Bold,drawBlock:(isToggle) =>{
// helper.DrawToggle("遮罩","_Mask_Toggle",shaderKeyword:"_MASKMAP_ON",fontStyle:FontStyle.Bold,drawBlock: (isToggle) =>{
// if (isToggle)
// {
DrawTextureFoldOut(W9ParticleShaderFlags.foldOutBitMaskMap,3,"遮罩贴图","_MaskMap",drawWrapMode:true,flagBitsName:W9ParticleShaderFlags.FLAG_BIT_WRAPMODE_MASKMAP,flagIndex:2,drawBlock:
theMaskMap =>
{
// if (theMaskMap)
// {
DrawUVModeSelect(W9ParticleShaderFlags.foldOutBit2UVModeMaskMap,4,"遮罩贴图UV来源",W9ParticleShaderFlags.FLAG_BIT_UVMODE_POS_0_MASKMAP,0,hasMap:theMaskMap);
DrawCustomDataSelect("Mask图X轴偏移自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_MASK_OFFSET_X,0);
DrawCustomDataSelect("Mask图Y轴偏移自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_MASK_OFFSET_Y,0);
helper.DrawVector4Componet("遮罩强度","_MaskMapVec","x",false);
helper.DrawVector4In2Line("_MaskMapOffsetAnition","遮罩偏移速度");
helper.DrawFloat("遮罩旋转","_MaskMapUVRotation");
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutBitMaskRotate,3,"遮罩旋转速度","_Mask_RotationToggle",W9ParticleShaderFlags
.FLAG_BIT_PARTILCE_MASKMAPROTATIONANIMATION_ON,isIndentBlock:false,drawBlock: (isToggle2) =>{
helper.DrawFloat("旋转速度", "_MaskMapRotationSpeed");
});
// EditorGUI.BeginDisabledGroup(!_noiseEnabled);
//
// EditorGUI.EndDisabledGroup();
DrawNoiseAffectBlock(() => {helper.DrawSlider("遮罩扭曲强度","_MaskDistortion_intensity",-2,2);});
//没有必要自动归位
// if(!_noiseEnabled)
// {
// helper.GetProperty("_MaskDistortion_intensity").floatValue = 0f;
// }
// }
});
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutBitMask2,3,"遮罩2","_Mask2_Toggle",flagBitsName:W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_MASK_MAP2,flagIndex:1,isIndentBlock:true,drawBlock:
(isToggle) =>
{
helper.DrawTexture("遮罩2贴图","_MaskMap2",drawWrapMode:true,flagBitsName:W9ParticleShaderFlags.FLAG_BIT_WRAPMODE_MASKMAP2,flagIndex:2,
drawBlock:theMaskMap2Texture =>
{
DrawUVModeSelect(W9ParticleShaderFlags.foldOutBit2UVModeMaskMap2,4,"遮罩2UV来源",W9ParticleShaderFlags.FLAG_BIT_UVMODE_POS_0_MASKMAP_2,0,hasMap:theMaskMap2Texture);
helper.DrawVector4In2Line("_MaskMapOffsetAnition",secondLineLabel:"遮罩2偏移速度");
});
// helper.DrawTexture("遮罩2贴图","_MaskMap2",drawWrapMode:true,flagBitsName:W9ParticleShaderFlags.FLAG_BIT_WRAPMODE_MASKMAP2,flagIndex:2);
});
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutBitMask3,3,"遮罩3",flagBitsName:W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_MASK_MAP3,flagIndex:1,isIndentBlock:true,drawBlock:
(isToggle) =>
{
helper.DrawTexture("遮罩3贴图","_MaskMap3",drawWrapMode:true,flagBitsName:W9ParticleShaderFlags.FLAG_BIT_WRAPMODE_MASKMAP3,flagIndex:2,drawBlock:theMaskMap3Texture=>
{
DrawUVModeSelect(W9ParticleShaderFlags.foldOutBit2UVModeMaskMap3,4,"遮罩3UV来源",W9ParticleShaderFlags.FLAG_BIT_UVMODE_POS_0_MASKMAP_3,0,hasMap:theMaskMap3Texture);
helper.DrawVector4In2Line("_MaskMap3OffsetAnition",firstLineLabel:"遮罩3偏移速度");
});
});
// helper.DrawTexture("遮罩贴图","_MaskMap",drawWrapMode:true,flagBitsName:W9ParticleShaderFlags.FLAG_BIT_WRAPMODE_MASKMAP,flagIndex:2);
// if (mat.GetTexture("_MaskMap"))
// }
});
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutBitNoise,3,"扭曲","_noisemapEnabled",shaderKeyword:"_NOISEMAP",fontStyle:FontStyle.Bold,drawBlock:(isToggle) => {
_noiseEnabled = isToggle;
helper.DrawToggle("用于屏幕扰动",shaderKeyword:"_SCREEN_DISTORT_MODE",drawBlock: isScreenDistortToggle =>
{
if (isScreenDistortToggle)
{
//强制设置为Clamp模式。
for (int i = 0; i < mats.Count; i++)
{
shaderFlags[i].SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_WRAPMODE_BASEMAP, index: 2);
}
}
});
// if (isToggle)
// {
// EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("扭曲贴图RG双通道则为FlowMap,FlowMap贴图设置应该去掉sRGB勾选");
DrawTextureFoldOut(W9ParticleShaderFlags.foldOutBitNoiseMap,3,"扭曲贴图","_NoiseMap",drawWrapMode:true,flagBitsName:W9ParticleShaderFlags.FLAG_BIT_WRAPMODE_NOISEMAP,flagIndex:2,drawBlock:
theNoiseMap =>
{
DrawUVModeSelect(W9ParticleShaderFlags.foldOutBit2UVModeNoiseMap,4,"扭曲贴图UV来源",W9ParticleShaderFlags.FLAG_BIT_UVMODE_POS_0_NOISE_MAP,0);
helper.DrawSlider("主贴图扭曲强度","_TexDistortion_intensity",-1.0f,1.0f);
DrawCustomDataSelect("扭曲强度自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_NOISE_INTENSITY,1);
helper.DrawVector4In2Line("_DistortionDirection","扭曲方向强度");
DrawCustomDataSelect("扭曲方向强度X自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_2_CUSTOMDATA_NOISE_DIRECTION_X,2);
DrawCustomDataSelect("扭曲方向强度Y自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_2_CUSTOMDATA_NOISE_DIRECTION_Y,2);
helper.DrawSlider("扭曲旋转","_NoiseMapUVRotation",0f,360f);
helper.DrawVector4In2Line("_NoiseOffset","扭曲偏移速度");
helper.DrawToggle("0.5为中值,双向扭曲","_DistortionBothDirection_Toggle",flagBitsName:W9ParticleShaderFlags.FLAG_BIT_PARTICLE_NOISEMAP_NORMALIZEED_ON,isIndentBlock:false);
});
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutBitNoiseMaskToggle,3,"扭曲遮罩","_noiseMaskMap_Toggle",flagBitsName:W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_NOISE_MASKMAP,flagIndex:1,drawBlock:
isNoiseMaskToggle =>
{
// if (isNoiseMaskToggle)
// {
helper.DrawTexture("扭曲遮罩贴图","_NoiseMaskMap",drawWrapMode:true,flagBitsName:W9ParticleShaderFlags.FLAG_BIT_WRAPMODE_NOISE_MASKMAP,drawBlock:
theNoiseMaskMap =>
{
DrawUVModeSelect(W9ParticleShaderFlags.foldOutBit2UVModeNoiseMaskMap,4,"扭曲遮罩贴图UV来源",W9ParticleShaderFlags.FLAG_BIT_UVMODE_POS_0_NOISE_MASK_MAP,0,theNoiseMaskMap);
});
// }
});
// }
});
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutBitDistortionChoraticaberrat, 3,"扭曲色散","_Distortion_Choraticaberrat_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CHORATICABERRAT,isIndentBlock:true,fontStyle:FontStyle.Bold,drawBlock:
(is_Choraticaberrat_Toggle) =>
{
// if (is_Choraticaberrat_Toggle)
// {
DrawNoiseAffectBlock(() => { helper.DrawToggle("色散强度受扭曲强度影响","_Distortion_Choraticaberrat_WithNoise_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_NOISE_CHORATICABERRAT_WITH_NOISE);});
helper.DrawVector4Componet("色散强度", "_DistortionDirection", "z", false);
DrawCustomDataSelect("色散强度自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_CHORATICABERRAT_INTENSITY,0);
// }
});
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutBitEmission,3,"流光","_EmissionEnabled",shaderKeyword:"_EMISSION",isIndentBlock:true,fontStyle:FontStyle.Bold,drawBlock: (isToggle) =>{
// if (isToggle)
// {
helper.DrawTexture("流光贴图","_EmissionMap","_EmissionMapColor",drawWrapMode:true,flagBitsName:W9ParticleShaderFlags.FLAG_BIT_WRAPMODE_EMISSIONMAP,flagIndex:2,drawBlock:theEmissionMap=>
{
DrawUVModeSelect(W9ParticleShaderFlags.foldOutBit2UVModeEmissionMap,4,"流光贴图UV来源",W9ParticleShaderFlags.FLAG_BIT_UVMODE_POS_0_EMISSION_MAP,0,theEmissionMap);
});
helper.DrawFloat("流光颜色强度","_EmissionMapColorIntensity");
helper.DrawSlider("流光贴图旋转","_EmissionMapUVRotation",0f,360f);
DrawNoiseAffectBlock(() => {helper.DrawFloat("流光贴图扭曲强度","_Emi_Distortion_intensity"); });
//没有必要自动归位
// if (!_noiseEnabled)
// {
// helper.GetProperty("_Emi_Distortion_intensity").floatValue = 0;
// }
helper.DrawVector4In2Line("_EmissionMapUVOffset", "流光贴图偏移速度");
// helper.DrawSlider("LiuuvRapSoft","_uvRapSoft",0f,1f);
// helper.DrawFloat("_CustomData2X","_CustomData2X");
// }
});
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutDissolve,3,"溶解","_Dissolve_Toggle",shaderKeyword:"_DISSOLVE",isIndentBlock:true,fontStyle:FontStyle.Bold,drawBlock:(isToggle) =>{
// if (isToggle)
// {
DrawTextureFoldOut(W9ParticleShaderFlags.foldOutDissolveMap,3,"溶解贴图","_DissolveMap",drawScaleOffset:false,drawWrapMode:true,flagBitsName:W9ParticleShaderFlags.FLAG_BIT_WRAPMODE_DISSOLVE_MAP,flagIndex:2,drawBlock:(dissolveTex)=>
{
matEditor.TextureScaleOffsetProperty(helper.GetProperty("_DissolveMap"));
DrawCustomDataSelect("溶解贴图X轴偏移自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_DISSOLVE_OFFSET_X,1);
DrawCustomDataSelect("溶解贴图Y轴偏移自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_DISSOLVE_OFFSET_Y,1);
DrawUVModeSelect(W9ParticleShaderFlags.foldOutBit2UVModeDissolveMap,4,"溶解贴图UV来源",W9ParticleShaderFlags.FLAG_BIT_UVMODE_POS_0_DISSOLVE_MAP,0);
helper.DrawVector4In2Line("_DissolveOffsetRotateDistort","溶解贴图偏移速度");
helper.DrawVector4Componet("溶解贴图旋转","_DissolveOffsetRotateDistort","z",true,0f,360f);
});
helper.DrawToggle("溶解度黑白值测试","_Dissolve_Test_Toggle",shaderKeyword:"_DISSOLVE_EDITOR_TEST");
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutDissolveVoronoi,3,"程序化噪波叠加","_DissolveVoronoi_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_DISSOVLE_VORONOI,flagIndex:1,isIndentBlock:true,drawBlock:isVoronoiToggle=>{
// if (isVoronoiToggle)
// {
// helper.DrawVector4Componet("噪波1缩放","_DissolveVoronoi_Vec","x",false);
helper.DrawVector4In2Line("_DissolveVoronoi_Vec","噪波1缩放");
helper.DrawVector4Componet("噪波1速度","_DissolveVoronoi_Vec2","z",false);
helper.DrawVector4In2Line("_DissolveVoronoi_Vec4","噪波1偏移");
DrawCustomDataSelect("噪波1偏移速度X自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_2_CUSTOMDATA_DISSOLVE_NOISE1_OFFSET_X,2);
DrawCustomDataSelect("噪波1偏移速度Y自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_2_CUSTOMDATA_DISSOLVE_NOISE1_OFFSET_Y,2);
helper.DrawVector4In2Line("_DissolveVoronoi_Vec3","噪波1偏移速度");
EditorGUILayout.Space();
helper.DrawVector4In2Line("_DissolveVoronoi_Vec",secondLineLabel:"噪波2缩放");
// helper.DrawVector4Componet("噪波2缩放","_DissolveVoronoi_Vec","z",false);
helper.DrawVector4Componet("噪波2速度","_DissolveVoronoi_Vec2","w",false);
helper.DrawVector4In2Line("_DissolveVoronoi_Vec4",secondLineLabel: "噪波2偏移");
DrawCustomDataSelect("噪波2偏移速度X自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_2_CUSTOMDATA_DISSOLVE_NOISE2_OFFSET_X,2);
DrawCustomDataSelect("噪波2偏移速度Y自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_2_CUSTOMDATA_DISSOLVE_NOISE2_OFFSET_Y,2);
helper.DrawVector4In2Line("_DissolveVoronoi_Vec3",secondLineLabel: "噪波2偏移速度");
EditorGUILayout.Space();
EditorGUILayout.Space();
helper.DrawVector4Componet("噪波1和噪波2混合系数(圆尖)","_DissolveVoronoi_Vec2","x",true);
helper.DrawVector4Componet("噪波整体和溶解贴图混合系数","_DissolveVoronoi_Vec2","y",true);
EditorGUILayout.Space();
// }
});
DrawNoiseAffectBlock(()=>{
helper.DrawVector4Componet("溶解贴图扭曲强度","_DissolveOffsetRotateDistort","w",false);
});
helper.DrawVector4In2Line("_Dissolve_Vec2","溶解丝滑度(溶解值黑白调整)");
helper.DrawVector4Componet("溶解强度","_Dissolve","x",true,-1f,2f);
DrawCustomDataSelect("溶解强度自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_DISSOLVE_INTENSITY,0);
helper.DrawVector4Componet("溶解硬度","_Dissolve","w",true,0f,1f);
// else
// {
//
// Vector4 value = helper.GetProperty("_DissolveOffsetRotateDistort").vectorValue;
// value = new Vector4(value.x, value.y, value.z, 0);
// helper.GetProperty("_DissolveOffsetRotateDistort").vectorValue = value;
// }
helper.DrawVector4Componet("溶解描边范围","_Dissolve","y",true,0f,1f);
matEditor.ColorProperty(helper.GetProperty("_DissolveLineColor"),"溶解描边颜色");
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutDissolveRampMap,3,"溶解Ramp图功能","_Dissolve_useRampMap_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_DISSOVLE_USE_RAMP,flagIndex:1,isIndentBlock:true,drawBlock:
isDissolveUseRampToggle =>
{
// if (isDissolveUseRampToggle)
// {
helper.DrawTexture("溶解Ramp图","_DissolveRampMap","_DissolveRampColor",drawScaleOffset:true,drawWrapMode:true,flagBitsName:W9ParticleShaderFlags.FLAG_BIT_WRAPMODE_DISSOLVE_RAMPMAP,flagIndex:2);
// }
});
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutDissolveMask,3,"局部溶解","_DissolveMask_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_DISSOLVE_MASK,drawBlock:
(isToggle) =>
{
// if (isToggle)
// {
helper.DrawTexture("局部溶解蒙版","_DissolveMaskMap",drawWrapMode:true,flagBitsName:W9ParticleShaderFlags.FLAG_BIT_WRAPMODE_DISSOLVE_MASKMAP,flagIndex:2);
DrawUVModeSelect(W9ParticleShaderFlags.foldOutBit2UVModeDissolveMaskMap,4,"局部溶解蒙板UV来源",W9ParticleShaderFlags.FLAG_BIT_UVMODE_POS_0_DISSOLVE_MASK_MAP,0);
helper.DrawVector4Componet("局部控制强度","_Dissolve","z",false);
DrawCustomDataSelect("局部溶解强度自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_DISSOLVE_MASK_INTENSITY,1);
// }
});
// }
});
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutColorBlend,3,"颜色渐变","_ColorBlendMap_Toggle",shaderKeyword:"_COLORMAPBLEND",isIndentBlock:true,fontStyle:FontStyle.Bold,drawBlock:(isToggle) =>
{
// if (isToggle)
// {
helper.DrawTexture("颜色渐变贴图","_ColorBlendMap",drawWrapMode:true,flagBitsName:W9ParticleShaderFlags.FLAG_BIT_WRAPMODE_COLORBLENDMAP,flagIndex:2);
matEditor.ColorProperty(helper.GetProperty("_ColorBlendColor"), "颜色渐变叠加");
DrawUVModeSelect(W9ParticleShaderFlags.foldOutBit2UVModeColorBlendMap,4,"颜色渐变贴图UV来源",W9ParticleShaderFlags.FLAG_BIT_UVMODE_POS_0_COLOR_BLEND_MAP,0);
helper.DrawVector4In2Line("_ColorBlendMapOffset","颜色渐变贴图偏移速度");
// }
});
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutFresnel,3,"菲涅尔","_fresnelEnabled",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_FRESNEL_ON,isIndentBlock:true,fontStyle:FontStyle.Bold,drawBlock:
(isToggle) =>
{
// if (isToggle)
// {
helper.DrawPopUp("菲涅尔模式","_FresnelMode",Enum.GetNames(typeof(FresnelMode)));
helper.DrawVector4Componet("菲涅尔强度","_FresnelUnit","z",true);
if (mats.Count == 1)
{
FresnelMode fresnelMode = (FresnelMode)mats[0].GetFloat("_FresnelMode");
switch (fresnelMode)
{
case FresnelMode.Color:
matEditor.ColorProperty(helper.GetProperty("_FresnelColor"), "菲涅尔颜色");
shaderFlags[0].SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_FRESNEL_COLOR_ON);
shaderFlags[0].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_FRESNEL_FADE_ON);
break;
case FresnelMode.Fade:
shaderFlags[0].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_FRESNEL_COLOR_ON);
shaderFlags[0].SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_FRESNEL_FADE_ON);
break;
}
}
helper.DrawVector4Componet("菲涅尔位置","_FresnelUnit","x",true,-1f,1f);
DrawCustomDataSelect("菲尼尔位置自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_FRESNEL_OFFSET,0);
helper.DrawVector4Componet("菲涅尔范围","_FresnelUnit","y",true,0f,10f);
helper.DrawVector4Componet("菲涅尔硬度","_FresnelUnit","w",true,0f,1f);
helper.DrawToggle("翻转菲涅尔","_InvertFresnel_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_FRESNEL_INVERT_ON);
matEditor.VectorProperty(helper.GetProperty("_FresnelRotation"),"菲涅尔方向偏移");
// }
});
if (!_uieffectEnabled)
{
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutDepthOutline,3,"深度描边", "_DepthOutline_Toggle",
flagBitsName: W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_DEPTH_OUTLINE,fontStyle:FontStyle.Bold, flagIndex: 1,
isIndentBlock: true, drawBlock:
(isToggle) =>
{
// if (isToggle)
// {
matEditor.ColorProperty(helper.GetProperty("_DepthOutline_Color"), "深度描边颜色");
helper.DrawVector4In2Line("_DepthOutline_Vec", "深度描边距离");
// }
});
helper.DrawToggle("深度贴花", "_DepthDecal_Toggle", shaderKeyword: "_DEPTH_DECAL",fontStyle:FontStyle.Bold, drawBlock: (isToggle) =>
{
if (isToggle)
{
for (int i = 0; i < mats.Count; i++)
{
StencilTestHelper.SetMaterialStencil(mats[i], "ParticleBaseDecal", _stencilValuesConfig,
out int ignore);
}
isCustomedStencil = true;
helper.GetProperty("_Cull").floatValue = (float)RenderFace.Back;
helper.GetProperty("_ZTest").floatValue = (float)CompareFunction.GreaterEqual;
}
},drawEndChangeCheck: (isToggle) =>
{
if (!isToggle)
{
if (!isToggle)
{
helper.GetProperty("_CustomStencilTest").floatValue = 0f;
helper.GetProperty("_Cull").floatValue = (float)RenderFace.Front;
helper.GetProperty("_ZTest").floatValue = (float)CompareFunction.LessEqual;
}
}
}
);
}
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutVertexOffset,3,"顶点偏移","_VertexOffset_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_VERTEX_OFFSET_ON,isIndentBlock:true,fontStyle:FontStyle.Bold,drawBlock:
isToggle =>
{
// if (isToggle)
// {
helper.DrawTexture("顶点偏移贴图","_VertexOffset_Map",drawScaleOffset:true,drawWrapMode:true,flagBitsName:W9ParticleShaderFlags.FLAG_BIT_WRAPMODE_VERTEXOFFSETMAP,flagIndex:2);
DrawCustomDataSelect("顶点扰动X轴偏移自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_VERTEX_OFFSET_X,1);
DrawCustomDataSelect("顶点扰动Y轴偏移自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_VERTEX_OFFSET_Y,1);
DrawUVModeSelect(W9ParticleShaderFlags.foldOutBit2UVModeVertexOffsetMap,4,"顶点偏移贴图UV来源",W9ParticleShaderFlags.FLAG_BIT_UVMODE_POS_0_VERTEX_OFFSET_MAP,0);
helper.DrawVector4In2Line("_VertexOffset_Vec","顶点偏移动画");
helper.DrawVector4Componet("顶点偏移强度","_VertexOffset_Vec","z",false);
DrawCustomDataSelect("顶点扰动强度自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_VERTEXOFFSET_INTENSITY,1);
helper.DrawToggle("顶点偏移从零开始","_VertexOffset_StartFromZero",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_VERTEXOFFSET_START_FROM_ZERO,1);
helper.DrawToggle("顶点偏移使用法线方向","_VertexOffset_NormalDir_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_VERTEX_OFFSET_NORMAL_DIR,isIndentBlock:false,drawBlock:
isToggle =>
{
if (!isToggle)
{
matEditor.ShaderProperty(helper.GetProperty("_VertexOffset_CustomDir"),"顶点偏移本地方向");
}
});
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutVertexOffsetMask,4,"顶点偏移遮罩","_VertexOffset_Mask_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_VERTEXOFFSET_MASKMAP,1,
drawBlock:isMaskToggle =>
{
helper.DrawTexture("顶点偏移遮罩图","_VertexOffset_MaskMap",drawScaleOffset:true,drawWrapMode:true,flagBitsName:W9ParticleShaderFlags.FLAG_BIT_WRAPMODE_VERTEXOFFSET_MASKMAP,flagIndex:2);
DrawCustomDataSelect("顶点扰动遮罩X轴偏移自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_3_CUSTOMDATA_VERTEX_OFFSET_MASK_X,3);
DrawCustomDataSelect("顶点扰动遮罩Y轴偏移自定义曲线",W9ParticleShaderFlags.FLAGBIT_POS_3_CUSTOMDATA_VERTEX_OFFSET_MASK_Y,3);
DrawUVModeSelect(W9ParticleShaderFlags.foldOutBit2UVModeVertexOffsetMaskMap,4,"顶点偏移遮罩图UV来源",W9ParticleShaderFlags.FLAG_BIT_UVMODE_POS_0_VERTEX_OFFSET_MASKMAP,0);
helper.DrawVector4In2Line("_VertexOffset_MaskMap_Vec","顶点偏移遮罩动画");
helper.DrawVector4Componet("顶点偏移遮罩强度","_VertexOffset_MaskMap_Vec","z",true);
});
// }
});
if (!_uieffectEnabled)
{
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutParallexMapping,3,"遮蔽视差", "_ParallaxMapping_Toggle", shaderKeyword: "_PARALLAX_MAPPING",
isIndentBlock: true,fontStyle:FontStyle.Bold, drawBlock:
isTogggle =>
{
// if (isTogggle)
// {
helper.DrawTexture("视差贴图", "_ParallaxMapping_Map", drawWrapMode: true,
flagBitsName: W9ParticleShaderFlags.FLAG_BIT_WRAPMODE_PARALLAXMAPPINGMAP, flagIndex: 2);
helper.DrawSlider("视差", "_ParallaxMapping_Intensity", 0, 0.1f);
helper.DrawVector4Componet("遮蔽视差最小层数","_ParallaxMapping_Vec","x",true,0f,100f);
helper.DrawVector4Componet("遮蔽视差最大层数","_ParallaxMapping_Vec","y",true,0f,100f);
Vector4 parallexMappingVecValue = helper.GetProperty("_ParallaxMapping_Vec").vectorValue;
if (parallexMappingVecValue.y < parallexMappingVecValue.x+1)
{
parallexMappingVecValue.y = parallexMappingVecValue.x+1;
}
helper.GetProperty("_ParallaxMapping_Vec").vectorValue = parallexMappingVecValue;
if (parallexMappingVecValue.y > 20f)
{
EditorGUILayout.HelpBox("遮蔽视差层数过高将影响性能",MessageType.Warning);
}
// }
});
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutPortal,4,"模板视差", "_Portal_Toggle", fontStyle:FontStyle.Bold,drawBlock: isPortalToggle =>
{
// if (isPortalToggle)
// {
if (isPortalToggle)
{
isCustomedStencil = true;
}
helper.DrawToggle("模板视差蒙版", "_Portal_MaskToggle", drawBlock: isPortalMaskToggle =>
{
if (isPortalMaskToggle)
{
for (int i = 0; i < mats.Count; i++)
{
StencilTestHelper.SetMaterialStencil(mats[i], "ParticalBasePortalMask",
_stencilValuesConfig, out int Ignore);
}
if (helper.GetProperty("_TransparentMode").floatValue == (float)TransparentMode.Transparent)
{
helper.GetProperty("_TransparentMode").floatValue = (float)TransparentMode.CutOff;
}
helper.GetProperty("_ZTest").floatValue = (float)CompareFunction.LessEqual;
}
else if(isPortalToggle)
{
for (int i = 0; i < mats.Count; i++)
{
StencilTestHelper.SetMaterialStencil(mats[i], "ParticalBasePortal",
_stencilValuesConfig, out int Ignore);
}
helper.GetProperty("_ZTest").floatValue = (float)CompareFunction.GreaterEqual;
}
});
// }
},drawEndChangeCheck: (isToggle) =>
{
if (!isToggle)
{
helper.GetProperty("_CustomStencilTest").floatValue = 0f;
helper.GetProperty("_TransparentMode").floatValue = (float)TransparentMode.Transparent;
helper.GetProperty("_ZTest").floatValue = (float)CompareFunction.LessEqual;
}
}
);
}
//粒子序列帧融帧的逻辑是将UV0为第一格UV1234推到第二格中间用AnimBlend融合。所以多UV是必然和这个矛盾的。
if (mats.Count == 1)
{
helper.DrawToggle("序列帧融帧(丝滑)", "_FlipbookBlending", shaderKeyword: "_FLIPBOOKBLENDING_ON",
fontStyle: FontStyle.Bold, drawBlock: (isToggle) =>
{
if (isToggle)
{
if (_meshSourceMode == MeshSourceMode.Particle)
{
if (shaderFlags[0].CheckIsUVModeOn(W9ParticleShaderFlags.UVMode.SpecialUVChannel))
{
EditorGUILayout.HelpBox("序列帧融帧和特殊UV通道同时开启粒子序列帧应该影响UV0和UV1两个通道特殊通道只能使用UV3原始UV",
MessageType.Warning);
}
else
{
EditorGUILayout.HelpBox("AnimationSheet的AffectUVChannel需要有UV0和UV1",
MessageType.Info);
}
}
else if (_meshSourceMode == MeshSourceMode.Mesh)
{
EditorGUILayout.HelpBox("需要添加AnimationSheetHelper脚本", MessageType.Info);
}
}
});
}
}
public void DrawTaOptions()
{
if (!_uieffectEnabled)
{
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutZOffset,4,"深度偏移", "_ZOffset_Toggle", fontStyle:FontStyle.Bold,drawBlock: (isToggle) =>
{
// if (isToggle)
// {
matEditor.ShaderProperty(helper.GetProperty("_offsetFactor"), "OffsetFactor");
matEditor.ShaderProperty(helper.GetProperty("_offsetUnits"), "Offset单位");
// }
if(!isToggle)
{
helper.GetProperty("_offsetFactor").floatValue = 0;
helper.GetProperty("_offsetUnits").floatValue = 0;
}
});
}
if (!_uieffectEnabled||_uiParticleEnabled)
{
#region CustomData旧版本
/*
{
EditorGUILayout.Space();
bool isCustomedData1X = false,
isCustomedData1Y = false,
isCustomedData1Z = false,
isCustomedData1W = false,
isCustomedData2X = false,
isCustomedData2Y = false,
isCustomedData2Z = false,
isCustomedData2W = false;
// helper.DrawToggle("CustomData1X主贴图X轴偏移","_CustomData1X_MainTexOffsetX_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1X_MAINTEXOFFSETX,drawBlock:
// (isToggle) => { isCustomedData1X = isToggle;});
// helper.DrawToggle("CustomData1Y主贴图Y轴偏移","_CustomData1Y_MainTexOffsetY_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1Y_MAINTEXOFFSETY,drawBlock:
// (isToggle) => { isCustomedData1Y = isToggle;});
// helper.DrawToggle("CustomData1Z溶解强度","_CustomData1Z_Dissolve_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1Z_DISSOLVE_ON,drawBlock:
// (isToggle) => { isCustomedData1Z = isToggle;});
// helper.DrawToggle("CustomData1W色相偏移","_CustomData1W_HueShift_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1W_HUESHIFT,drawBlock:
// (isToggle) => { isCustomedData1W = isToggle;});
// helper.DrawToggle("CustomData2XMask图X轴偏移","_CustomData2X_MaskMapOffsetX_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2X_MASKMAPOFFSETX,drawBlock:
// (isToggle) => { isCustomedData2X = isToggle;});
// helper.DrawToggle("CustomData2YMask图Y轴偏移","_CustomData2Y_MaskMapOffsetY_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2Y_MASKMAPOFFSETY,drawBlock:
// (isToggle) => { isCustomedData2Y = isToggle;});
// helper.DrawToggle("CustomData2Z菲涅尔范围","_CustomData2Z_FresnelOffset_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2Z_FRESNELOFFSET,drawBlock:
// (isToggle) => { isCustomedData2Z = isToggle;});
helper.DrawPopUp("CustomData1X", "_CustomData1X_MainTexOffsetX_Toggle", CustomData1XModeName,
drawBlock: (f) =>
{
switch ((CustomData1XMode)f)
{
case CustomData1XMode.none:
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1X_MAINTEXOFFSETX, index: 0);
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1X_DISSOLVETEXOFFSETX, index: 1);
isCustomedData1X = false;
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_DISSOLVE_OFFSET_X,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_MAINTEX_OFFSET_X,1);
break;
case CustomData1XMode.MainTexOffsetX:
shaderFlag.SetFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1X_MAINTEXOFFSETX, index: 0);
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1X_DISSOLVETEXOFFSETX, index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.CustomData1X,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_MAINTEX_OFFSET_X,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_DISSOLVE_OFFSET_X,1);
isCustomedData1X = true;
break;
case CustomData1XMode.DissolveTexOffseX:
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1X_MAINTEXOFFSETX, index: 0);
shaderFlag.SetFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1X_DISSOLVETEXOFFSETX, index: 1);
isCustomedData1X = true;
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_MAINTEX_OFFSET_X,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.CustomData1X,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_DISSOLVE_OFFSET_X,1);
break;
}
});
helper.DrawPopUp("CustomData1Y", "_CustomData1Y_MainTexOffsetY_Toggle", CustomData1YModeName,
drawBlock: (f) =>
{
switch ((CustomData1YMode)f)
{
case CustomData1YMode.none:
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1Y_MAINTEXOFFSETY, index: 0);
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1Y_DISSOLVETEXOFFSETY, index: 1);
isCustomedData1Y = false;
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_MAINTEX_OFFSET_Y,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_DISSOLVE_OFFSET_Y,1);
break;
case CustomData1YMode.MainTexOffsetY:
shaderFlag.SetFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1Y_MAINTEXOFFSETY, index: 0);
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1Y_DISSOLVETEXOFFSETY, index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.CustomData1Y,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_MAINTEX_OFFSET_Y,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_DISSOLVE_OFFSET_Y,1);
isCustomedData1Y = true;
break;
case CustomData1YMode.DissolveOffsexY:
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1Y_MAINTEXOFFSETY, index: 0);
shaderFlag.SetFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1Y_DISSOLVETEXOFFSETY, index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_MAINTEX_OFFSET_Y,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.CustomData1Y,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_DISSOLVE_OFFSET_Y,1);
isCustomedData1Y = true;
break;
}
});
helper.DrawPopUp("CustomData1Z", "_CustomData1Z_Dissolve_Toggle", CustomData1ZModeName,
drawBlock: (f) =>
{
switch ((CustomData1ZMode)f)
{
case CustomData1ZMode.none:
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1Z_DISSOLVE_ON, index: 0);
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1Z_NOISE_INTENSITY, index: 1);
isCustomedData1Z = false;
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_DISSOLVE_INTENSITY,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_NOISE_INTENSITY,1);
break;
case CustomData1ZMode.DissolveIntensity:
shaderFlag.SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1Z_DISSOLVE_ON,
index: 0);
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1Z_NOISE_INTENSITY, index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.CustomData1Z,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_DISSOLVE_INTENSITY,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_NOISE_INTENSITY,1);
isCustomedData1Z = true;
break;
case CustomData1ZMode.NoiseIntensity:
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1Z_DISSOLVE_ON, index: 0);
shaderFlag.SetFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1Z_NOISE_INTENSITY, index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_DISSOLVE_INTENSITY,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.CustomData1Z,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_NOISE_INTENSITY,1);
isCustomedData1Z = true;
break;
}
});
helper.DrawPopUp("CustomData1W", "_CustomData1W_HueShift_Toggle", CustomData1WModeName,
drawBlock: (f) =>
{
switch ((CustomData1WMode)f)
{
case CustomData1WMode.none:
shaderFlag.ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1W_HUESHIFT,
index: 0);
shaderFlag.ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1W_SATURATE,
index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_HUESHIFT,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_SATURATE,1);
isCustomedData1W = false;
break;
case CustomData1WMode.HueShift:
shaderFlag.SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1W_HUESHIFT,
index: 0);
shaderFlag.ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1W_SATURATE,
index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.CustomData1W,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_HUESHIFT,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_SATURATE,1);
isCustomedData1W = true;
break;
case CustomData1WMode.Saturate:
shaderFlag.ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1W_HUESHIFT,
index: 0);
shaderFlag.SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1W_SATURATE,
index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_HUESHIFT,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.CustomData1W,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_SATURATE,1);
isCustomedData1W = true;
break;
}
});
helper.DrawPopUp("CustomData2X", "_CustomData2X_MaskMapOffsetX_Toggle", CustomData2XModeName,
drawBlock: (f) =>
{
switch ((CustomData2XMode)f)
{
case CustomData2XMode.none:
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2X_MASKMAPOFFSETX, index: 0);
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2X_VERTEXOFFSETX, index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_MASK_OFFSET_X,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_VERTEX_OFFSET_X,1);
isCustomedData2X = false;
break;
case CustomData2XMode.MaskOffsetX:
shaderFlag.SetFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2X_MASKMAPOFFSETX, index: 0);
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2X_VERTEXOFFSETX, index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.CustomData2X,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_MASK_OFFSET_X,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_VERTEX_OFFSET_X,1);
isCustomedData2X = true;
break;
case CustomData2XMode.VertexOffsetX:
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2X_MASKMAPOFFSETX, index: 0);
shaderFlag.SetFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2X_VERTEXOFFSETX, index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_MASK_OFFSET_X,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.CustomData2X,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_VERTEX_OFFSET_X,1);
isCustomedData2X = true;
break;
}
});
helper.DrawPopUp("CustomData2Y", "_CustomData2Y_MaskMapOffsetY_Toggle", CustomData2YModeName,
drawBlock: (f) =>
{
switch ((CustomData2YMode)f)
{
case CustomData2YMode.none:
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2Y_MASKMAPOFFSETY, index: 0);
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2Y_VERTEXOFFSETY, index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_MASK_OFFSET_Y,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_VERTEX_OFFSET_Y,1);
isCustomedData2Y = false;
break;
case CustomData2YMode.MaskOffsetY:
shaderFlag.SetFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2Y_MASKMAPOFFSETY, index: 0);
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2Y_VERTEXOFFSETY, index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.CustomData2Y,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_MASK_OFFSET_Y,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_VERTEX_OFFSET_Y,1);
isCustomedData2Y = true;
break;
case CustomData2YMode.VertexOffsetY:
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2Y_MASKMAPOFFSETY, index: 0);
shaderFlag.SetFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2Y_VERTEXOFFSETY, index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_MASK_OFFSET_Y,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.CustomData2Y,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_VERTEX_OFFSET_Y,1);
isCustomedData2Y = true;
break;
}
});
helper.DrawPopUp("CustomData2Z", "_CustomData2Z_FresnelOffset_Toggle", CustomData2ZModeName,
drawBlock: (f) =>
{
switch ((CustomData2ZMode)f)
{
case CustomData2ZMode.none:
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2Z_FRESNELOFFSET, index: 0);
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_CUSTOMDATA2Z_VERTEXOFFSET_INTENSITY,
index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_FRESNEL_OFFSET,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_VERTEXOFFSET_INTENSITY,1);
isCustomedData2Z = false;
break;
case CustomData2ZMode.FresnelOffset:
shaderFlag.SetFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2Z_FRESNELOFFSET, index: 0);
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_CUSTOMDATA2Z_VERTEXOFFSET_INTENSITY,
index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.CustomData2Z,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_FRESNEL_OFFSET,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_VERTEXOFFSET_INTENSITY,1);
isCustomedData2Z = true;
break;
case CustomData2ZMode.VertexOffsetIntensity:
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2Z_FRESNELOFFSET, index: 0);
shaderFlag.SetFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_CUSTOMDATA2Z_VERTEXOFFSET_INTENSITY,
index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_FRESNEL_OFFSET,0);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.CustomData2Z,W9ParticleShaderFlags.FLAGBIT_POS_1_CUSTOMDATA_VERTEXOFFSET_INTENSITY,1);
isCustomedData2Z = true;
break;
}
});
helper.DrawPopUp("CustomData2W", "_CustomData2W_Toggle", CustomData2WModeName, drawBlock: (f) =>
{
switch ((CustomData2WMode)f)
{
case CustomData2WMode.none:
shaderFlag.ClearFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2W_CHORATICABERRAT_INTENSITY,
index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_CHORATICABERRAT_INTENSITY,0);
isCustomedData2W = false;
break;
case CustomData2WMode.ChoraticaberratIntensity:
shaderFlag.SetFlagBits(
W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2W_CHORATICABERRAT_INTENSITY,
index: 1);
shaderFlag.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.CustomData2W,W9ParticleShaderFlags.FLAGBIT_POS_0_CUSTOMDATA_CHORATICABERRAT_INTENSITY,0);
isCustomedData2W = true;
break;
}
});
bool isCustomedData1 = isCustomedData1X || isCustomedData1Y || isCustomedData1Z || isCustomedData1W;
isCustomedData1 = isCustomedData1 || shaderFlag.IsCustomData1On();
if (isCustomedData1)
{
shaderFlag.SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1_ON);
}
else
{
shaderFlag.ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1_ON);
}
bool isCustomedData2 = isCustomedData2X || isCustomedData2Y || isCustomedData2Z ||isCustomedData2W;
isCustomedData2 = isCustomedData2 || shaderFlag.IsCustomData2On();
if (isCustomedData2)
{
shaderFlag.SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2_ON);
}
else
{
shaderFlag.ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2_ON);
}
//旧版本结束。
}
*/
#endregion
for (int i = 0; i < mats.Count; i++)
{
if (shaderFlags[i].IsCustomData1On())
{
shaderFlags[i].SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1_ON);
}
else
{
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1_ON);
}
if (shaderFlags[i].IsCustomData2On())
{
shaderFlags[i].SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2_ON);
}
else
{
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2_ON);
}
}
}
// matEditor.RenderQueueField();
helper.DrawRenderQueue(helper.GetProperty("_QueueBias"));
if (isCustomedStencil)
{
helper.GetProperty("_CustomStencilTest").floatValue = 1f;
}
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutCustomStencilTest,4,"模板调试开关","_CustomStencilTest",drawBlock: isTogle =>
{
matEditor.ShaderProperty(helper.GetProperty("_Stencil"),"模板值");
matEditor.ShaderProperty(helper.GetProperty("_StencilComp"),"模板比较方式");
matEditor.ShaderProperty(helper.GetProperty("_StencilOp"),"模板处理方式");
isCustomedStencil = isTogle;
});
if (!isCustomedStencil && !_uieffectEnabled)
{
for (int i = 0; i < mats.Count; i++)
{
StencilTestHelper.SetMaterialStencil(mats[i], "ParticleBaseDefault", _stencilValuesConfig, out int ignore);
}
}
}
void DrawNoiseAffectBlock(Action drawBlock)
{
EditorGUI.BeginDisabledGroup(!_noiseEnabled);
drawBlock();
EditorGUI.EndDisabledGroup();
}
public string[] blendModeNames =
{
"透明度混合AlphaBlend",
"预乘PreMultiply",
"叠加Additive",
"正片叠底Multiply"
};
public enum BlendMode
{
Alpha, // Old school alpha-blending mode, fresnel does not affect amount of transparency
Premultiply, // Physically plausible transparency mode, implemented as alpha pre-multiply
Additive,
Multiply,
Opaque
}
public enum TimeMode
{
Default,
UnScaleTime,
ScriptableTime
}
public enum RenderFace
{
Front = 2,
Back = 1,
Both = 0
}
public enum FresnelMode
{
Color = 0,
Fade = 1
}
public string[] transparentModeNames =
{
"不透明Opaque",
"半透明Transparent",
"不透明裁剪CutOff"
};
public enum TransparentMode
{
Opaque = 0,
Transparent = 1,
CutOff = 2
}
public enum CustomData1XMode
{
none = 0,
MainTexOffsetX = 1,
DissolveTexOffseX = 2
}
private string[] CustomData1XModeName = new string[]
{
"无",
"主贴图X轴偏移",
"溶解贴图X轴偏移"
};
public enum CustomData1YMode
{
none = 0,
MainTexOffsetY = 1,
DissolveOffsexY = 2
}
private string[] CustomData1YModeName = new string[]
{
"无",
"主贴图Y轴偏移",
"溶解贴图Y轴偏移"
};
public enum CustomData1ZMode
{
none = 0,
DissolveIntensity = 1,
NoiseIntensity = 2
}
private string[] CustomData1ZModeName = new string[]
{
"无",
"溶解强度",
"扭曲强度"
};
public enum CustomData1WMode
{
none = 0,
HueShift = 1,
Saturate = 2
}
private string[] CustomData1WModeName = new string[]
{
"无",
"色相偏移",
"饱和度强度"
};
public enum CustomData2XMode
{
none = 0,
MaskOffsetX = 1,
VertexOffsetX = 2
}
private string[] CustomData2XModeName = new string[]
{
"无",
"Mask图X轴偏移",
"顶点扰动X轴偏移"
};
public enum CustomData2YMode
{
none = 0,
MaskOffsetY = 1,
VertexOffsetY = 2
}
private string[] CustomData2YModeName = new string[]
{
"无",
"Mask图Y轴偏移",
"顶点扰动Y轴偏移"
};
public enum CustomData2ZMode
{
none = 0,
FresnelOffset = 1,
VertexOffsetIntensity = 2
}
private string[] CustomData2ZModeName = new string[]
{
"无",
"菲涅尔范围",
"顶点扰动强度"
};
public enum CustomData2WMode
{
none = 0,
ChoraticaberratIntensity = 1
}
private string[] CustomData2WModeName = new string[]
{
"无",
"通道偏移强度"
};
void DoAfterDraw()
{
for (int i = 0; i < mats.Count; i++)
{
switch (_meshSourceMode)
{
case MeshSourceMode.Particle:
shaderFlags[i].SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_IS_PARTICLE_SYSTEM, index: 1);
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_UV_FROM_MESH, index: 1);
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_UIEFFECT_ON, index: 0);
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_UIEFFECT_SPRITE_MODE,
index: 1);
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_UIEFFECT_BASEMAP_MODE,
index: 1);
//如果是粒子系统则不需要走AnimationSheetHelper
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_ANIMATION_SHEET_HELPER);
break;
case MeshSourceMode.Mesh:
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_IS_PARTICLE_SYSTEM,
index: 1);
shaderFlags[i].SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_UV_FROM_MESH, index: 1);
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_UIEFFECT_ON, index: 0);
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_UIEFFECT_SPRITE_MODE,
index: 1);
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_UIEFFECT_BASEMAP_MODE,
index: 1);
break;
case MeshSourceMode.UIEffectRawImage:
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_IS_PARTICLE_SYSTEM,
index: 1);
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_UV_FROM_MESH, index: 1);
shaderFlags[i].SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_UIEFFECT_ON, index: 0);
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_UIEFFECT_SPRITE_MODE,
index: 1);
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_UIEFFECT_BASEMAP_MODE,
index: 1);
break;
case MeshSourceMode.UIEffectSprite:
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_IS_PARTICLE_SYSTEM,
index: 1);
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_UV_FROM_MESH, index: 1);
shaderFlags[i].SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_UIEFFECT_ON, index: 0);
shaderFlags[i].SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_UIEFFECT_SPRITE_MODE,
index: 1);
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_UIEFFECT_BASEMAP_MODE,
index: 1);
break;
case MeshSourceMode.UIEffectBaseMap:
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_IS_PARTICLE_SYSTEM,
index: 1);
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_UV_FROM_MESH, index: 1);
shaderFlags[i].SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_UIEFFECT_ON, index: 0);
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_UIEFFECT_SPRITE_MODE,
index: 1);
shaderFlags[i].SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_UIEFFECT_BASEMAP_MODE,
index: 1);
break;
}
if (!shaderFlags[i].CheckIsUVModeOn(W9ParticleShaderFlags.UVMode.SpecialUVChannel))
{
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_USE_TEXCOORD1, index: 1);
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_USE_TEXCOORD2, index: 1);
}
if (!shaderFlags[i].CheckIsUVModeOn(W9ParticleShaderFlags.UVMode.Cylinder))
{
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_CYLINDER_CORDINATE, index: 1);
}
TransparentMode transparentMode = (TransparentMode)mats[i].GetFloat("_TransparentMode");
switch (_transparentMode)
{
case TransparentMode.Opaque:
mats[i].SetInt("_ZWrite", (int)1);
mats[i].renderQueue = 2100 + (int)helper.GetProperty("_QueueBias").floatValue; //3D粒子永远最前显示
mats[i].SetInt("_Blend", (int)BlendMode.Opaque);
break;
case TransparentMode.Transparent:
if (helper.GetProperty("_ForceZWriteToggle").floatValue > 0.5f)
{
mats[i].SetInt("_ZWrite", (int)1);
}
else
{
mats[i].SetInt("_ZWrite", (int)0);
}
int defaultQueue = 3100;
if (_uieffectEnabled||_uiParticleEnabled)
{
defaultQueue = 3000;
}
mats[i].renderQueue = defaultQueue + (int)helper.GetProperty("_QueueBias").floatValue; //3D粒子永远最前显示
BlendMode bm = (BlendMode)mats[i].GetFloat("_Blend");
if (bm == BlendMode.Opaque)
{
mats[i].SetFloat("_Blend", (float)BlendMode.Alpha); //如果设置错误则强制设置。
}
break;
case TransparentMode.CutOff:
mats[i].SetInt("_ZWrite", (int)1);
mats[i].renderQueue = 2450 + (int)helper.GetProperty("_QueueBias").floatValue; //3D粒子永远最前显示
mats[i].SetInt("_Blend", (int)BlendMode.Opaque);
break;
}
if (_transparentMode == TransparentMode.CutOff)
{
mats[i].EnableKeyword("_ALPHATEST_ON");
}
else
{
mats[i].DisableKeyword("_ALPHATEST_ON");
}
// blendMode
BlendMode blendMode = (BlendMode)mats[i].GetFloat("_Blend");
switch (blendMode)
{
case BlendMode.Alpha:
mats[i].SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
mats[i].SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
// mat.DisableKeyword("_ALPHAPREMULTIPLY_ON");
break;
case BlendMode.Premultiply:
mats[i].SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
mats[i].SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
// mat.EnableKeyword("_ALPHAPREMULTIPLY_ON");
break;
case BlendMode.Additive:
mats[i].SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
mats[i].SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.One);
// mat.DisableKeyword("_ALPHAPREMULTIPLY_ON");
break;
case BlendMode.Multiply:
mats[i].SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.DstColor);
mats[i].SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
// mat.DisableKeyword("_ALPHAPREMULTIPLY_ON");
// mat.EnableKeyword("_ALPHAMODULATE_ON");
break;
case BlendMode.Opaque:
mats[i].SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
mats[i].SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
break;
}
TimeMode timeMode = (TimeMode)mats[i].GetFloat("_TimeMode");
switch (timeMode)
{
case TimeMode.Default:
// setMaterialFlags(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_UNSCALETIME_ON, false);
// setMaterialFlags(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_SCRIPTABLETIME_ON, false);
shaderFlags[i].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_UNSCALETIME_ON);
shaderFlags[i].CheckFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_SCRIPTABLETIME_ON);
break;
case TimeMode.UnScaleTime:
// setMaterialFlags(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_UNSCALETIME_ON, true);
// setMaterialFlags(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_SCRIPTABLETIME_ON, false);
shaderFlags[i].SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_UNSCALETIME_ON);
shaderFlags[i].CheckFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_SCRIPTABLETIME_ON);
break;
case TimeMode.ScriptableTime:
// setMaterialFlags(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_UNSCALETIME_ON, false);
// setMaterialFlags(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_SCRIPTABLETIME_ON, true);
shaderFlags[i].CheckFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_UNSCALETIME_ON);
shaderFlags[i].SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_SCRIPTABLETIME_ON);
break;
}
}
}
public static GUIContent VertexStreams = new GUIContent("顶点流统计",
"The vertex streams needed for this Material to function properly.");
public static string streamPositionText = "Position (POSITION.xyz)";
public static string streamNormalText = "Normal (NORMAL.xyz)";
public static string streamColorText = "Color (COLOR.xyzw)";
public static string streamUVText = "UV (TEXCOORD0.xy)";
public static string streamUV3Text = "UV3 (TEXCOORD0.zw)";
public static string streamUV2Text = "UV2 (TEXCOORD0.zw)";
public static string streamUV2AndAnimBlendText = "UV2 (TEXCOORD3.zw)";
public static string streamUV3AndAnimBlendText = "UV3 (TEXCOORD3.zw)";
public static string streamAnimBlendText = "AnimBlend (TEXCOORD3.x)";
public static string streamTangentText = "Tangent (TANGENT.xyzw)";
public static string streamCustom1Text = "Custom1.xyzw(TEXCOORD1.xyzw)";
public static string streamCustom2Text = "Custom2.xyzw(TEXCOORD2.xyzw)";
public static GUIContent streamApplyToAllSystemsText = new GUIContent("使粒子与材质顶点流相同",
"Apply the vertex stream layout to all Particle Systems using this material");
public static string undoApplyCustomVertexStreams = L10n.Tr("Apply custom vertex streams from material");
List<ParticleSystemRenderer> m_RenderersUsingThisMaterial = new List<ParticleSystemRenderer>();
private bool checkIsParicleSystem = false;
void CacheRenderersUsingThisMaterial(Material material, int matID)
{
checkIsParicleSystem = false;
m_RenderersUsingThisMaterial.Clear();
#if UNITY_2022_1_OR_NEWER
ParticleSystemRenderer[] renderers =
UnityEngine.Object.FindObjectsByType(typeof(ParticleSystemRenderer),FindObjectsSortMode.None) as ParticleSystemRenderer[];
#else
ParticleSystemRenderer[] renderers =
UnityEngine.Object.FindObjectsOfType(typeof(ParticleSystemRenderer)) as ParticleSystemRenderer[];
#endif
foreach (ParticleSystemRenderer renderer in renderers)
{
if (renderer.sharedMaterial == material || renderer.trailMaterial == material)
{
checkIsParicleSystem = true;
shaderFlags[matID].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_ANIMATION_SHEET_HELPER,index:1);//如果是粒子系统用就主动关掉Helper的类型。
m_RenderersUsingThisMaterial.Add(renderer);
}
}
}
//雨轩UnityEditorInternal命名空间下提供 一个类ReorderableList可以实现通过拖曳来达到列表元素的重新排序。
private static ReorderableList vertexStreamList;
//构建粒子系统顶点流界面
public void DoVertexStreamsArea(Material material, List<ParticleSystemRenderer> renderers,
int matID, bool useLighting = false)
{
EditorGUILayout.Space();
// bool useFlipbookBlending = (material.GetFloat("_FlipbookBlending") > 0.0f);
bool useFlipbookBlending = material.IsKeywordEnabled("_FLIPBOOKBLENDING_ON");
bool useSpecialUVChannel = shaderFlags[matID].CheckIsUVModeOn(W9ParticleShaderFlags.UVMode.SpecialUVChannel);
bool isUseUV3ForSpecialUV =
shaderFlags[matID].CheckFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_USE_TEXCOORD2, index:1);
// bool CustomDataEnabled = (material.GetFloat("_CustomData") > 0.0f);
bool isCustomData1 = shaderFlags[matID].CheckFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA1_ON);
bool isCustomData2 = shaderFlags[matID].CheckFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_CUSTOMDATA2_ON);
// Build the list of expected vertex streams
List<ParticleSystemVertexStream> streams = new List<ParticleSystemVertexStream>();
List<string> streamList = new List<string>();
streams.Add(ParticleSystemVertexStream.Position); //必然会传递有顶点位置信息
streamList.Add(streamPositionText); //记录顶点位置信息给GUI面板用
bool needTangent = false;
bool needNormal = false;
needNormal = (material.GetFloat("_VertexOffset_NormalDir_Toggle") > 0.5f);
//如果有灯光,必有法线信息。如果有法线贴图,必有顶点切线法线信息。
//菲涅尔效果需要用到法线内容。
if (material.GetFloat("_fresnelEnabled") > 0.5f)
{
needNormal = true;
needTangent = true;
}
if (material.GetFloat("_ParallaxMapping_Toggle") > 0.5f)
{
needTangent = true;
}
bool useUV3AsMainUV = shaderFlags[matID].CheckFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_USETEXCOORD2);
if (needTangent)
{
streams.Add(ParticleSystemVertexStream.Tangent);
streamList.Add(streamTangentText);
}
if (needNormal)
{
streams.Add(ParticleSystemVertexStream.Normal);
streamList.Add(streamNormalText);
}
//粒子着色器,必有顶点颜色信息。
streams.Add(ParticleSystemVertexStream.Color);
streamList.Add(streamColorText);
//TEXCOORD0填充
//必有顶点第一套UV信息。
streams.Add(ParticleSystemVertexStream.UV);
streamList.Add(streamUVText);
//在做动画序列帧时,需要:TEXCOORD1(xy为正常uvzw为Blend用的第二套uv):TEXCOORD2(x为Blend混合值)
if (useFlipbookBlending && useSpecialUVChannel)
{
streams.Add(ParticleSystemVertexStream.UV2);
streamList.Add(streamUV2Text);
}
else if (useSpecialUVChannel & !useFlipbookBlending)
{
if (isUseUV3ForSpecialUV)
{
streams.Add(ParticleSystemVertexStream.UV3);
streamList.Add(streamUV3Text);
}
else
{
streams.Add(ParticleSystemVertexStream.UV2);
streamList.Add(streamUV2Text);
}
}
else if (useFlipbookBlending & !useSpecialUVChannel)
{
if (!streams.Contains(ParticleSystemVertexStream.UV2))
{
streams.Add(ParticleSystemVertexStream.UV2);
streamList.Add(streamUV2Text);
}
}
else if(isCustomData1 || isCustomData2)
{
streams.Add(ParticleSystemVertexStream.UV2);
streamList.Add(streamUV2Text);
}
//填充TEXCOORD1
bool isFillSkipUV2 = false;//因为如果要使用UV3粒子系统必须填充UV2才能激活
if (isCustomData1 || isCustomData2 || useFlipbookBlending)
{
streams.Add(ParticleSystemVertexStream.Custom1XYZW);
streamList.Add(streamCustom1Text);
}
else if(useSpecialUVChannel & isUseUV3ForSpecialUV)
{
streams.Add(ParticleSystemVertexStream.UV2);
streamList.Add("TEXCOORD1.xy");
isFillSkipUV2 = true;
}
//填充TEXCOORD2
if (isCustomData2 || useFlipbookBlending)
{
streams.Add(ParticleSystemVertexStream.Custom2XYZW);
streamList.Add(streamCustom2Text);
}
else if(useSpecialUVChannel & isUseUV3ForSpecialUV & !isFillSkipUV2)
{
streams.Add(ParticleSystemVertexStream.UV2);
streamList.Add("TEXCOORD2.xy");
isFillSkipUV2 = true;
}
//填充TEXCOORD3
if (useFlipbookBlending)
{
streams.Add(ParticleSystemVertexStream.AnimBlend);
streamList.Add(streamAnimBlendText);
if (useSpecialUVChannel)
{
if (isUseUV3ForSpecialUV)
{
streams.Add(ParticleSystemVertexStream.UV3);
streamList.Add(streamUV3AndAnimBlendText);
}
}
}
else if(useSpecialUVChannel & isUseUV3ForSpecialUV & !isFillSkipUV2)
{
streams.Add(ParticleSystemVertexStream.UV2);
streamList.Add("TEXCOORD3.xy");
}
// //如果是融合序列帧则要跨越到Texcoord3
// //如果是使用UV3则需要用一个UV2开启来让粒子系统输出UV3
// if (useFlipbookBlending || isUseUV3ForSpecialUV)
// {
//
// //利用Custom1XYZW跨过TEXCOORD1;
// if (!streams.Contains(ParticleSystemVertexStream.Custom1XYZW))
// {
//
// }
//
// //利用Custom1XYZW跨过TEXCOORD2;
// if (!streams.Contains(ParticleSystemVertexStream.Custom2XYZW))
// {
// streams.Add(ParticleSystemVertexStream.Custom2XYZW);
// streamList.Add(streamCustom2Text);
// }
//
//
// }
//
//
// if (isCustomData1 || isCustomData2) //是否在使用后可以自定义开启,不需要另外写开关
// {
// if (!streams.Contains(ParticleSystemVertexStream.UV2))
// {
// streams.Add(ParticleSystemVertexStream.UV2); //需要跨过UV2,所以加入UV2
// streamList.Add(streamUV2Text);
// }
//
// if (!streams.Contains(ParticleSystemVertexStream.Custom1XYZW))
// {
// streams.Add(ParticleSystemVertexStream.Custom1XYZW);
// streamList.Add(streamCustom1Text);
// }
//
// if (isCustomData2)
// {
// if (!streams.Contains(ParticleSystemVertexStream.Custom2XYZW))
// {
// streams.Add(ParticleSystemVertexStream.Custom2XYZW);
// streamList.Add(streamCustom2Text);
// }
// }
// }
//可排序列表绘制。
//创建一个可排序列表
vertexStreamList = new ReorderableList(streamList, typeof(string), false, true, false, false);
//创建表头。ReorderableList下面还有很多回调。可以按需选择。
vertexStreamList.drawHeaderCallback = (Rect rect) => { EditorGUI.LabelField(rect, "Vertex Streams"); };
vertexStreamList.DoLayoutList(); //执行表格绘制。
// Display a warning if any renderers have incorrect vertex streams
string Warnings = "";
List<ParticleSystemVertexStream> rendererStreams = new List<ParticleSystemVertexStream>();
foreach (ParticleSystemRenderer renderer in renderers) //每个使用该材质的粒子系统都会进行比较
{
renderer.GetActiveVertexStreams(rendererStreams); //获得ParticleSystemRenderer的顶点流
if (!rendererStreams.SequenceEqual(streams)) //重点!是否和我们拼装的顶点流一致。
Warnings += "-" + renderer.name + "\n";
}
//
if (!string.IsNullOrEmpty(Warnings))
{
//如果有Warning
EditorGUILayout.HelpBox(
"下面的粒子系统Renderer顶点流不正确:\n" +
Warnings, MessageType.Error, true);
// Set the streams on all systems using this materialz
if (GUILayout.Button("使粒子与材质顶点流相同", EditorStyles.miniButton,
GUILayout.ExpandWidth(true)))
{
//做一个撤回记录。
Undo.RecordObjects(renderers.Where(r => r != null).ToArray(), "Apply custom vertex streams from material");
//重点!直接赋值我们拼装好的顶点流。
foreach (ParticleSystemRenderer renderer in renderers)
{
renderer.SetActiveVertexStreams(streams);
}
}
}
//从2022.3.11开始添加这个功能。
#if UNITY_2022_3_OR_NEWER && !(UNITY_2022_3_0 ||UNITY_2022_3_1||UNITY_2022_3_2||UNITY_2022_3_3||UNITY_2022_3_4||UNITY_2022_3_5||UNITY_2022_3_6||UNITY_2022_3_7||UNITY_2022_3_8||UNITY_2022_3_9||UNITY_2022_3_10)
// Display a warning if any renderers have incorrect vertex streams
string trailWarnings = "";
List<ParticleSystemVertexStream> trailRendererStreams = new List<ParticleSystemVertexStream>();
foreach (ParticleSystemRenderer renderer in renderers) //每个使用该材质的粒子系统都会进行比较
{
renderer.GetActiveTrailVertexStreams(trailRendererStreams); //获得ParticleSystemRenderer的顶点流
if (!trailRendererStreams.SequenceEqual(streams)) //重点!是否和我们拼装的顶点流一致。
trailWarnings += "-" + renderer.name + "\n";
}
if (!string.IsNullOrEmpty(trailWarnings))
{
//如果有Warning
EditorGUILayout.HelpBox(
"下面的粒子系统Renderer拖尾顶点流不正确:\n" +
trailWarnings, MessageType.Error, true);
// Set the streams on all systems using this material
if (GUILayout.Button("使粒子拖尾与材质顶点流相同", EditorStyles.miniButton,
GUILayout.ExpandWidth(true)))
{
//做一个撤回记录。
Undo.RecordObjects(renderers.Where(r => r != null).ToArray(), "Apply custom vertex streams from material");
//重点!直接赋值我们拼装好的顶点流。
foreach (ParticleSystemRenderer renderer in renderers)
{
renderer.SetActiveTrailVertexStreams(streams);
}
}
}
#endif
/*
*/
}
private string[] _customDataOptions =
{
"**不使用**",
"CustomData1_X",
"CustomData1_Y",
"CustomData1_Z",
"CustomData1_W",
"CustomData2_X",
"CustomData2_Y",
"CustomData2_Z",
"CustomData2_W"
};
public void DrawCustomDataSelect(string label, int dataBitPos, int dataIndex)
{
// if(!_isUseParticleSystem)return;//只有粒子系统才会处理相关内容。
if (mats.Count != 1) return; //仅单选触发
if(!(_meshSourceMode == MeshSourceMode.Particle || _uiParticleEnabled) ) return;
EditorGUI.showMixedValue =
helper.GetProperty(shaderFlags[0].GetCustomDataFlagPropertyName(dataIndex)).hasMixedValue;
W9ParticleShaderFlags.CutomDataComponent component = shaderFlags[0].GetCustomDataFlag(dataBitPos, dataIndex);
EditorGUI.BeginChangeCheck();
GUIContent[] optionGUIContents = new GUIContent[_customDataOptions.Length];
for (int i = 0; i < optionGUIContents.Length; i++)
{
optionGUIContents[i] = new GUIContent(_customDataOptions[i]);
}
component = (W9ParticleShaderFlags.CutomDataComponent)EditorGUILayout.Popup(new GUIContent(label), (int)component, optionGUIContents);
if (EditorGUI.EndChangeCheck())
{
shaderFlags[0].SetCustomDataFlag(component,dataBitPos,dataIndex);
}
EditorGUI.showMixedValue = false;
}
private string[] _uvModeNames =
{
"默认UV通道",
"特殊UV通道",
"极坐标|旋转",
"圆柱无缝"
};
enum SpecialUVChannelMode
{
UV2_Texcoord1,
UV3_Texcoord2
}
public void DrawUVModeSelect(int foldOutFlagBit, int foldOutFlagIndex,string label, int dataBitPos, int dataIndex,bool hasMap = true)
{
if (mats.Count != 1) return; //仅单选触发
EditorGUI.BeginDisabledGroup(!hasMap);
EditorGUI.indentLevel++;
// EditorGUILayout.BeginHorizontal();
EditorGUI.showMixedValue = helper.GetProperty(shaderFlags[0].GetUVModePropName(dataIndex)).hasMixedValue;
W9ParticleShaderFlags.UVMode uvMode = shaderFlags[0].GetUVMode(dataBitPos, dataIndex);
EditorGUI.BeginChangeCheck();
GUIContent[] optinGUIContents = new GUIContent[_uvModeNames.Length];
for (int i = 0; i < _uvModeNames.Length; i++)
{
optinGUIContents[i] = new GUIContent(_uvModeNames[i]);
}
// uvMode = (W9ParticleShaderFlags.UVMode)EditorGUILayout.Popup(new GUIContent(label), (int)uvMode,optinGUIContents);
EditorGUILayout.BeginHorizontal();
Rect rect = EditorGUILayout.GetControlRect();
var labelRect = new Rect(rect.x + 2f, rect.y, rect.width - 2f, rect.height);
var popUpRect = helper.GetRectAfterLabelWidth(rect,true);
uvMode = (W9ParticleShaderFlags.UVMode) EditorGUI.Popup(popUpRect, (int)uvMode, optinGUIContents);
bool foldOutState = shaderFlags[0].CheckFlagBits(foldOutFlagBit, index: foldOutFlagIndex);
AnimBool animBool = GetAnimBool(foldOutFlagBit, foldOutFlagIndex-3, foldOutFlagIndex);
animBool.target = foldOutState;
animBool.target = EditorGUI.Foldout(rect, animBool.target, string.Empty, true);
foldOutState = animBool.target;
if (foldOutState)
{
shaderFlags[0].SetFlagBits(foldOutFlagBit, index: foldOutFlagIndex);
}
else
{
shaderFlags[0].ClearFlagBits(foldOutFlagBit, index: foldOutFlagIndex);
}
EditorGUI.LabelField(labelRect,label);
EditorGUILayout.EndHorizontal();
if (EditorGUI.EndChangeCheck())
{
shaderFlags[0].SetUVMode(uvMode, dataBitPos, dataIndex);
}
EditorGUI.showMixedValue = false;
EditorGUI.indentLevel++;
// if (foldOutState)
// {
float faded = animBool.faded;
if (faded == 0) faded = 0.0001f;
EditorGUILayout.BeginFadeGroup(faded);
if (uvMode != W9ParticleShaderFlags.UVMode.DefaultUVChannel)
{
EditorGUILayout.LabelField("以下设置材质内通用:",EditorStyles.boldLabel);
}
switch (uvMode)
{
case W9ParticleShaderFlags.UVMode.SpecialUVChannel:
helper.DrawPopUp("特殊UV通道选择","_SpecialUVChannelMode", Enum.GetNames(typeof(SpecialUVChannelMode)),
drawBlock:
specialUVChannelMode =>
{
//这个设置就是全局的。
SpecialUVChannelMode spUVMode = (SpecialUVChannelMode)specialUVChannelMode;
switch (spUVMode)
{
case SpecialUVChannelMode.UV2_Texcoord1:
shaderFlags[0].SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_USE_TEXCOORD1,index:1);
shaderFlags[0].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_USE_TEXCOORD2,index:1);
break;
case SpecialUVChannelMode.UV3_Texcoord2:
shaderFlags[0].ClearFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_USE_TEXCOORD1,index:1);
shaderFlags[0].SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_USE_TEXCOORD2,index:1);
break;
}
});
break;
case W9ParticleShaderFlags.UVMode.PolarOrTwirl:
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutBitTwril,3,"旋转扭曲","_UTwirlEnabled",flagBitsName:W9ParticleShaderFlags.FLAG_BIT_PARTICLE_UTWIRL_ON,drawBlock:(isToggle) =>{
helper.DrawVector4In2Line("_TWParameter","旋转扭曲中心");
helper.DrawFloat("旋转扭曲强度","_TWStrength");
});
DrawToggleFoldOut(W9ParticleShaderFlags.foldOutBitPolar,3,"极坐标", "_PolarCoordinatesEnabled",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_POLARCOORDINATES_ON,drawBlock:(isToggle) =>{
// helper.DrawToggle("极坐标只影响特殊功能","_PolarCordinateOnlySpecialFunciton_Toggle",W9ParticleShaderFlags.FLAG_BIT_PARTICLE_PC_ONLYSPECIALFUNC);
helper.DrawVector4In2Line("_PCCenter","极坐标中心");
helper.DrawVector4Componet("极坐标强度","_PCCenter","z",true,0f,1f);
});
break;
case W9ParticleShaderFlags.UVMode.Cylinder:
EditorGUILayout.LabelField("圆柱模式消耗比较大,慎用");
helper.DrawVector4XYZComponet("圆柱坐标旋转","_CylinderUVRotate");
helper.DrawVector4XYZComponet("圆柱坐标偏移","_CylinderUVPosOffset");
Matrix4x4 cylinderMatrix =
Matrix4x4.Translate(helper.GetProperty("_CylinderUVPosOffset").vectorValue) *
Matrix4x4.Rotate(Quaternion.Euler(helper.GetProperty("_CylinderUVRotate").vectorValue));
helper.GetProperty("_CylinderMatrix0").vectorValue =cylinderMatrix.GetRow(0);
helper.GetProperty("_CylinderMatrix1").vectorValue =cylinderMatrix.GetRow(1);
helper.GetProperty("_CylinderMatrix2").vectorValue =cylinderMatrix.GetRow(2);
helper.GetProperty("_CylinderMatrix3").vectorValue =cylinderMatrix.GetRow(3);
shaderFlags[0].SetFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_CYLINDER_CORDINATE,index:1);
break;
}
// }
EditorGUILayout.EndFadeGroup();
EditorGUI.indentLevel--;
EditorGUI.indentLevel--;
EditorGUI.EndDisabledGroup();
}
private string[] _meshSourceModeNames =
{
"粒子系统",
"模型(非粒子发射)",
"2D RawImage",
"2D 精灵",
"2D 材质贴图",
"2D UIParticle"
};
enum MeshSourceMode
{
Particle,
Mesh,
UIEffectRawImage,
UIEffectSprite,
UIEffectBaseMap,
UIParticle
}
void SetUVModeByOldSettings()
{
bool isTwril = shaderFlags[0].CheckFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_UTWIRL_ON);
bool isPolar = shaderFlags[0].CheckFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_POLARCOORDINATES_ON);
bool baseMapNoPolar =
shaderFlags[0].CheckFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_PC_ONLYSPECIALFUNC);
for (int j = 0; j < 16; j++)
{
if (isTwril || isPolar)
{
if (j == 0)
{
if (baseMapNoPolar)
{
shaderFlags[0].SetUVMode(W9ParticleShaderFlags.UVMode.DefaultUVChannel, j * 2);
continue;
}
}
shaderFlags[0].SetUVMode(W9ParticleShaderFlags.UVMode.PolarOrTwirl, j * 2);
}
}
}
public void DrawTextureFoldOut(int foldOutFlagBit,int foldOutFlagIndex,string label, string texturePropertyName,
string colorPropertyName = null, bool drawScaleOffset = true, bool drawWrapMode = false,
int flagBitsName = 0, int flagIndex = 2, Action<Texture> drawBlock = null)
{
bool foldOutState = shaderFlags[0].CheckFlagBits(foldOutFlagBit, index: foldOutFlagIndex);
AnimBool animBool = GetAnimBool(foldOutFlagBit, foldOutFlagIndex - 3, foldOutFlagIndex);
animBool.target = foldOutState;
helper.DrawTextureFoldOut(ref animBool, label, texturePropertyName, colorPropertyName, drawScaleOffset,
drawWrapMode, flagBitsName, flagIndex, drawBlock);
foldOutState = animBool.target;
if (foldOutState)
{
shaderFlags[0].SetFlagBits(foldOutFlagBit, index: foldOutFlagIndex);
}
else
{
shaderFlags[0].ClearFlagBits(foldOutFlagBit, index: foldOutFlagIndex);
}
}
public void DrawToggleFoldOut(int foldOutFlagBit,int foldOutFlagIndex, string label, string propertyName = null,
int flagBitsName = 0,
int flagIndex = 0, string shaderKeyword = null, string shaderPassName = null, bool isIndentBlock = true, FontStyle fontStyle = FontStyle.Normal,
Action<bool> drawBlock = null,Action<bool> drawEndChangeCheck = null)
{
bool foldOutState = shaderFlags[0].CheckFlagBits(foldOutFlagBit, index: foldOutFlagIndex);
AnimBool animBool = GetAnimBool(foldOutFlagBit, foldOutFlagIndex - 3, foldOutFlagIndex); //foldOut里的第一组。
animBool.target = foldOutState;
helper.DrawToggleFoldOut(ref animBool, label, propertyName, flagBitsName, flagIndex, shaderKeyword,
shaderPassName, isIndentBlock, fontStyle, drawBlock, drawEndChangeCheck);
foldOutState = animBool.target;
if (foldOutState)
{
shaderFlags[0].SetFlagBits(foldOutFlagBit, index: foldOutFlagIndex);
}
else
{
shaderFlags[0].ClearFlagBits(foldOutFlagBit, index: foldOutFlagIndex);
}
}
public void DrawBigBlockFoldOut(int foldOutFlagBit,int foldOutFlagIndex ,string label, Action drawBlock)
{
bool foldOutState = shaderFlags[0].CheckFlagBits(foldOutFlagBit, index: foldOutFlagIndex);
AnimBool animBool = GetAnimBool(foldOutFlagBit, foldOutFlagIndex - 3, foldOutFlagIndex);
animBool.target = foldOutState;
helper.DrawBigBlockFoldOut(ref animBool, label, drawBlock);
foldOutState = animBool.target;
if (foldOutState)
{
shaderFlags[0].SetFlagBits(foldOutFlagBit, index: foldOutFlagIndex);
}
else
{
shaderFlags[0].ClearFlagBits(foldOutFlagBit, index: foldOutFlagIndex);
}
}
private AnimBool[] animBoolArr = new AnimBool[96];//先假定有3组。和存好的bit一一对应。
//不是
AnimBool GetAnimBool(int flagBit, int AnimBoolIndex,int flagIndex)
{
int bitPos = 0;
for (int i = 0; i < 32; i++)
{
if ((flagBit & (1 << i)) > 0)
{
bitPos = i;
break;
}
}
int arrIndex = AnimBoolIndex * 32 + bitPos;
// Debug.Log(arrIndex.ToString() +"---"+ animBoolArr[arrIndex]);
if (animBoolArr[arrIndex] == null)
{
animBoolArr[arrIndex] = new AnimBool(shaderFlags[0].CheckFlagBits(flagBit,index:flagIndex));
}
return animBoolArr[arrIndex];
}
}
}