This commit is contained in:
SoulliesOfficial
2026-07-17 17:46:16 -04:00
parent b00ac27e3a
commit 40fa80cd70
1178 changed files with 51090 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: af9e4a2cbc9cee94485138c3bc876c62
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 01d5272ee28d1384d9f555c579592a6b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,596 @@
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using NBShader;
namespace NBShaderEditor
{
internal sealed class ParticleBaseHoudiniVATGUI
{
private readonly ShaderGUIHelper _helper;
private static readonly string[] SubModeNames =
{
"SoftBody (Deformation)",
"RigidBody (Pieces)",
"Dynamic Remeshing (Lookup)",
"Particle Sprites (Billboard)"
};
private static readonly string[] SubModeKeywords =
{
"_HOUDINI_VAT_SOFTBODY",
"_HOUDINI_VAT_RIGIDBODY",
"_HOUDINI_VAT_DYNAMIC_REMESH",
"_HOUDINI_VAT_PARTICLE_SPRITE"
};
public ParticleBaseHoudiniVATGUI(ShaderGUIHelper helper)
{
_helper = helper;
}
public void Draw()
{
DrawSubModeSelector();
DrawPlaybackSection();
DrawBoundsSection();
DrawTextureSection();
DrawScaleSection();
DrawParticleSpriteSection();
DrawFlagsSection();
SyncKeywords();
}
public static void AppendRequiredVertexStreams(
Material material,
List<ParticleSystemVertexStream> streams,
List<string> streamList)
{
if (material.GetFloat("_VAT_Toggle") <= 0.5f)
{
return;
}
int subMode = GetMaterialSubMode(material);
bool isParticleMode = IsHoudiniParticleModeEnabled(material);
AddStream(streams, streamList, ParticleSystemVertexStream.Position, ParticleBaseGUI.streamPositionText);
AddStream(streams, streamList, ParticleSystemVertexStream.Normal, ParticleBaseGUI.streamNormalText);
switch (subMode)
{
case 0: // SoftBody needs VAT UV1.
AddVatUV1Stream(streams, streamList, isParticleMode);
break;
case 1: // RigidBody needs VAT UV1, UV2, UV3 (Custom2, vatTexcoord5)
if (isParticleMode)
{
break;
}
AddVatUV1Stream(streams, streamList, isParticleMode);
AddStream(streams, streamList, ParticleSystemVertexStream.Custom2XYZW, ParticleBaseGUI.streamCustom2Text);
AddStream(streams, streamList, ParticleSystemVertexStream.UV, ParticleBaseGUI.streamUVText);
break;
case 2: // DynamicRemeshing needs UV0 (texcoords)
AddStream(streams, streamList, ParticleSystemVertexStream.UV, ParticleBaseGUI.streamUVText);
break;
case 3: // ParticleSprite needs UV0 (corner) + VAT UV1 (particle U/V)
AddStream(streams, streamList, ParticleSystemVertexStream.UV, ParticleBaseGUI.streamUVText);
AddVatUV1Stream(streams, streamList, isParticleMode);
break;
}
}
private List<Material> mats => _helper.mats;
private bool IsResetToolInitializing()
{
return _helper.ResetTool != null && _helper.ResetTool.IsInitResetData;
}
private bool TryGetCurrentSubMode(out int subMode)
{
MaterialProperty property = _helper.GetProperty("_HoudiniVATSubMode");
if (property == null || property.hasMixedValue)
{
subMode = -1;
return false;
}
subMode = Mathf.Clamp(Mathf.RoundToInt(property.floatValue), 0, SubModeNames.Length - 1);
return true;
}
private bool IsSubMode(params int[] subModes)
{
if (IsResetToolInitializing())
{
return true;
}
if (!TryGetCurrentSubMode(out int currentSubMode))
{
return false;
}
for (int i = 0; i < subModes.Length; i++)
{
if (currentSubMode == subModes[i])
{
return true;
}
}
return false;
}
private bool TryGetFloatProperty(string propertyName, out MaterialProperty property)
{
property = _helper.GetProperty(propertyName);
return property != null && !property.hasMixedValue;
}
private bool IsFloatPropertyOn(string propertyName)
{
return TryGetFloatProperty(propertyName, out MaterialProperty property) && property.floatValue > 0.5f;
}
private bool IsFloatPropertyOff(string propertyName)
{
return TryGetFloatProperty(propertyName, out MaterialProperty property) && property.floatValue <= 0.5f;
}
private bool IsFloatPropertyMixed(string propertyName)
{
MaterialProperty property = _helper.GetProperty(propertyName);
return property != null && property.hasMixedValue;
}
private bool ShouldDrawWhenFloatOn(string propertyName)
{
return IsResetToolInitializing() || IsFloatPropertyMixed(propertyName) || IsFloatPropertyOn(propertyName);
}
private bool ShouldDrawWhenFloatOff(string propertyName)
{
return IsResetToolInitializing() || IsFloatPropertyMixed(propertyName) || IsFloatPropertyOff(propertyName);
}
private static int GetMaterialSubMode(Material material)
{
if (!material.HasProperty("_HoudiniVATSubMode"))
{
return 0;
}
return Mathf.Clamp(Mathf.RoundToInt(material.GetFloat("_HoudiniVATSubMode")), 0, SubModeNames.Length - 1);
}
private static bool IsHoudiniParticleModeEnabled(Material material)
{
if (material == null ||
!material.HasProperty("_VAT_Toggle") ||
!material.HasProperty("_VATMode") ||
!material.HasProperty("_MeshSourceMode") ||
material.GetFloat("_VAT_Toggle") <= 0.5f ||
Mathf.RoundToInt(material.GetFloat("_VATMode")) != (int)ParticleBaseGUI.VATMode.Houdini)
{
return false;
}
ParticleBaseGUI.MeshSourceMode meshSourceMode = (ParticleBaseGUI.MeshSourceMode)Mathf.RoundToInt(material.GetFloat("_MeshSourceMode"));
return meshSourceMode == ParticleBaseGUI.MeshSourceMode.Particle ||
meshSourceMode == ParticleBaseGUI.MeshSourceMode.UIParticle;
}
private void DrawSubModeSelector()
{
_helper.DrawPopUp("Houdini VAT Sub Mode", "_HoudiniVATSubMode", SubModeNames);
if (HasUnsupportedParticleMode())
{
EditorGUILayout.HelpBox("该 Houdini VAT 类型需要 Mesh 多 UV 数据,不支持 ParticleSystem VertexStream 模式。", MessageType.Warning);
}
}
private void DrawPlaybackSection()
{
EditorGUILayout.Space();
EditorGUILayout.LabelField("Playback", EditorStyles.boldLabel);
_helper.DrawToggle("Auto Playback", "_B_autoPlayback");
if (ShouldDrawWhenFloatOff("_B_autoPlayback"))
{
_helper.DrawFloat("Display Frame", "_displayFrame");
}
DrawFrameCustomDataSelect();
_helper.DrawFloat("Game Time at First Frame", "_gameTimeAtFirstFrame");
_helper.DrawFloat("Playback Speed", "_playbackSpeed");
_helper.DrawFloat("Houdini FPS", "_houdiniFPS");
_helper.DrawToggle("Interframe Interpolation", "_B_interpolate");
if (IsSubMode(1)) // RigidBody
{
_helper.DrawToggle("Animate First Frame", "_animateFirstFrame");
}
}
private void DrawBoundsSection()
{
EditorGUILayout.Space();
EditorGUILayout.LabelField("Bounds Metadata", EditorStyles.boldLabel);
_helper.DrawFloat("Bound Min X", "_boundMinX");
_helper.DrawFloat("Bound Min Y", "_boundMinY");
_helper.DrawFloat("Bound Min Z", "_boundMinZ");
_helper.DrawFloat("Bound Max X", "_boundMaxX");
_helper.DrawFloat("Bound Max Y", "_boundMaxY");
_helper.DrawFloat("Bound Max Z", "_boundMaxZ");
}
private void DrawFrameCustomDataSelect()
{
const int dataBitPos = W9ParticleShaderFlags.FLAGBIT_POS_2_CUSTOMDATA_VAT_FRAME;
const int dataIndex = 2;
W9ParticleShaderFlags.CutomDataComponent component = GetCurrentCustomDataComponent(dataBitPos, dataIndex);
if (!IsAnyHoudiniParticleModeEnabled() || _helper.shaderFlags == null || _helper.shaderFlags.Length == 0)
{
ClearFrameCustomData(dataBitPos, dataIndex);
return;
}
(string, string) nameTuple = ("VATFrameCustomData", "");
EditorGUI.showMixedValue = CustomDataHasMixedValue(dataBitPos, dataIndex);
EditorGUI.BeginChangeCheck();
EditorGUILayout.BeginHorizontal();
component = (W9ParticleShaderFlags.CutomDataComponent)EditorGUILayout.Popup(new GUIContent("VAT Frame CustomData"), (int)component, ParticleBaseGUI.CustomDataOptions);
EditorGUI.showMixedValue = false;
Action applySelection = () =>
{
for (int i = 0; i < _helper.shaderFlags.Length; i++)
{
if (_helper.shaderFlags[i] is W9ParticleShaderFlags flags)
{
flags.SetCustomDataFlag(component, dataBitPos, dataIndex);
}
}
_helper.ResetTool.CheckOnValueChange(nameTuple);
};
if (EditorGUI.EndChangeCheck())
{
applySelection();
}
_helper.ResetTool.DrawResetModifyButton(
new Rect(),
nameTuple,
resetCallBack: () =>
{
component = W9ParticleShaderFlags.CutomDataComponent.Off;
applySelection();
},
onValueChangedCallBack: applySelection,
checkHasModifyOnValueChange: () => GetCurrentCustomDataComponent(dataBitPos, dataIndex) != W9ParticleShaderFlags.CutomDataComponent.Off,
checkHasMixedValueOnValueChange: () => CustomDataHasMixedValue(dataBitPos, dataIndex));
EditorGUILayout.EndHorizontal();
_helper.ResetTool.EndResetModifyButtonScope();
}
private void ClearFrameCustomData(int dataBitPos, int dataIndex)
{
if (_helper.shaderFlags == null)
{
return;
}
for (int i = 0; i < _helper.shaderFlags.Length; i++)
{
if (_helper.shaderFlags[i] is W9ParticleShaderFlags flags)
{
flags.SetCustomDataFlag(W9ParticleShaderFlags.CutomDataComponent.Off, dataBitPos, dataIndex);
}
}
}
private W9ParticleShaderFlags.CutomDataComponent GetCurrentCustomDataComponent(int dataBitPos, int dataIndex)
{
if (_helper.shaderFlags == null || _helper.shaderFlags.Length == 0)
{
return W9ParticleShaderFlags.CutomDataComponent.Off;
}
if (_helper.shaderFlags[0] is W9ParticleShaderFlags flags)
{
return flags.GetCustomDataFlag(dataBitPos, dataIndex);
}
return W9ParticleShaderFlags.CutomDataComponent.Off;
}
private bool CustomDataHasMixedValue(int dataBitPos, int dataIndex)
{
if (_helper.shaderFlags == null || _helper.shaderFlags.Length == 0)
{
return false;
}
W9ParticleShaderFlags.CutomDataComponent component = W9ParticleShaderFlags.CutomDataComponent.UnKnownOrMixed;
for (int i = 0; i < _helper.shaderFlags.Length; i++)
{
if (!(_helper.shaderFlags[i] is W9ParticleShaderFlags flags))
{
continue;
}
W9ParticleShaderFlags.CutomDataComponent current = flags.GetCustomDataFlag(dataBitPos, dataIndex);
if (component == W9ParticleShaderFlags.CutomDataComponent.UnKnownOrMixed)
{
component = current;
continue;
}
if (component != current)
{
return true;
}
}
return false;
}
private bool IsAnyHoudiniParticleModeEnabled()
{
if (_helper.mats == null)
{
return false;
}
for (int i = 0; i < _helper.mats.Count; i++)
{
if (IsHoudiniParticleModeEnabled(_helper.mats[i]))
{
return true;
}
}
return false;
}
private bool HasUnsupportedParticleMode()
{
if (_helper.mats == null)
{
return false;
}
for (int i = 0; i < _helper.mats.Count; i++)
{
if (IsUnsupportedParticleMode(_helper.mats[i]))
{
return true;
}
}
return false;
}
private static bool IsUnsupportedParticleMode(Material material)
{
return IsHoudiniParticleModeEnabled(material) && GetMaterialSubMode(material) == 1;
}
private void DrawTextureSection()
{
EditorGUILayout.Space();
EditorGUILayout.LabelField("Textures", EditorStyles.boldLabel);
_helper.DrawTexture("Position Texture", "_posTexture", drawScaleOffset: false, drawWrapMode: false);
if (ShouldDrawWhenFloatOn("_B_LOAD_POS_TWO_TEX"))
{
_helper.DrawTexture("Position Texture 2", "_posTexture2", drawScaleOffset: false, drawWrapMode: false);
}
if (ShouldDrawRotationTexture())
{
_helper.DrawTexture("Rotation Texture", "_rotTexture", drawScaleOffset: false, drawWrapMode: false);
}
if (ShouldDrawWhenFloatOn("_B_LOAD_COL_TEX"))
{
_helper.DrawTexture("Color Texture", "_colTexture", drawScaleOffset: false, drawWrapMode: false);
}
if (IsSubMode(2) || ShouldDrawWhenFloatOn("_B_LOAD_LOOKUP_TABLE"))
{
_helper.DrawTexture("Lookup Table", "_lookupTable", drawScaleOffset: false, drawWrapMode: false);
}
}
private void DrawScaleSection()
{
if (IsSubMode(1, 3))
{
EditorGUILayout.Space();
EditorGUILayout.LabelField("Scale", EditorStyles.boldLabel);
_helper.DrawFloat("Global Piece Scale Multiplier", "_globalPscaleMul");
_helper.DrawToggle("Piece Scales in Position Alpha", "_B_pscaleAreInPosA");
}
}
private void DrawParticleSpriteSection()
{
if (!IsSubMode(3))
{
return;
}
EditorGUILayout.Space();
EditorGUILayout.LabelField("Particle Sprite", EditorStyles.boldLabel);
_helper.DrawFloat("Width Base Scale", "_widthBaseScale");
_helper.DrawFloat("Height Base Scale", "_heightBaseScale");
_helper.DrawToggle("Hide Overlapping Origin", "_B_hideOverlappingOrigin");
if (ShouldDrawWhenFloatOn("_B_hideOverlappingOrigin"))
{
_helper.DrawFloat("Origin Effective Radius", "_originRadius");
}
_helper.DrawToggle("Particles Can Spin", "_B_CAN_SPIN");
if (ShouldDrawWhenFloatOn("_B_CAN_SPIN"))
{
_helper.DrawToggle("Compute Spin from Heading", "_B_spinFromHeading");
if (ShouldDrawWhenFloatOff("_B_spinFromHeading"))
{
_helper.DrawFloat("Particle Spin Phase", "_spinPhase");
}
_helper.DrawFloat("Scale by Velocity Amount", "_scaleByVelAmount");
}
_helper.DrawFloat("Particle Texture U Scale", "_particleTexUScale");
_helper.DrawFloat("Particle Texture V Scale", "_particleTexVScale");
}
private void DrawFlagsSection()
{
EditorGUILayout.Space();
EditorGUILayout.LabelField("Flags", EditorStyles.boldLabel);
_helper.DrawToggle("Positions Require Two Textures", "_B_LOAD_POS_TWO_TEX");
if (ShouldDrawCompressedNormalsToggle())
{
_helper.DrawToggle("Use Compressed Normals (no rotTex)", "_B_UNLOAD_ROT_TEX");
}
_helper.DrawToggle("Load Color Texture", "_B_LOAD_COL_TEX");
if (IsSubMode(2))
{
_helper.DrawToggle("Load Lookup Table", "_B_LOAD_LOOKUP_TABLE");
}
}
private bool ShouldDrawRotationTexture()
{
if (IsResetToolInitializing())
{
return true;
}
if (!TryGetCurrentSubMode(out int subMode) || subMode == 3)
{
return false;
}
return IsFloatPropertyMixed("_B_UNLOAD_ROT_TEX") || IsFloatPropertyOff("_B_UNLOAD_ROT_TEX");
}
private bool ShouldDrawCompressedNormalsToggle()
{
if (IsResetToolInitializing())
{
return true;
}
return TryGetCurrentSubMode(out int subMode) && subMode != 3;
}
private void SyncKeywords()
{
if (mats == null)
{
return;
}
foreach (Material mat in mats)
{
if (mat == null)
{
continue;
}
SyncKeywords(mat);
}
}
internal static void SyncKeywords(Material mat)
{
if (mat == null)
{
return;
}
SetSubModeKeyword(mat, GetMaterialSubMode(mat));
}
internal static void ClearKeywords(Material mat)
{
if (mat == null)
{
return;
}
SetSubModeKeyword(mat, -1);
}
private static void SetSubModeKeyword(Material mat, int enabledIndex)
{
for (int i = 0; i < SubModeKeywords.Length; i++)
{
mat.DisableKeyword(SubModeKeywords[i]);
}
if (enabledIndex >= 0 && enabledIndex < SubModeKeywords.Length)
{
mat.EnableKeyword(SubModeKeywords[enabledIndex]);
}
}
private static void AddStream(
List<ParticleSystemVertexStream> streams,
List<string> streamList,
ParticleSystemVertexStream stream,
string streamLabel)
{
if (streams.Contains(stream))
{
return;
}
streams.Add(stream);
streamList.Add(streamLabel);
}
private static void AddVatUV1Stream(
List<ParticleSystemVertexStream> streams,
List<string> streamList,
bool isParticleMode)
{
if (isParticleMode)
{
AddStream(streams, streamList, ParticleSystemVertexStream.UV2, ParticleBaseGUI.streamUV2Text);
return;
}
AddStream(streams, streamList, ParticleSystemVertexStream.Custom1XYZW, ParticleBaseGUI.streamCustom1Text);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1fb3d41607849d44486fbc2549077b59
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,386 @@
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using NBShader;
namespace NBShaderEditor
{
internal sealed class ParticleBaseTyflowVATGUI
{
private const string TyflowSubModeProperty = "_TyFlowVATSubMode";
private const int TyflowSkinModeStart = 2;
private const float TyflowParticleHighestNonSkinMode = 1.5f;
private readonly ShaderGUIHelper _helper;
private static readonly string[] TyflowAnimationModeNames =
{
"Absolute positions",
"Relative offsets",
"Skin (R)",
"Skin (PR)",
"Skin (PRSAVE)",
"Skin (PRSXYZ)"
};
private static readonly string[] TyflowModeKeywords =
{
"_TYFLOW_VAT_ABSOLUTE",
"_TYFLOW_VAT_RELATIVE",
"_TYFLOW_VAT_SKIN_R",
"_TYFLOW_VAT_SKIN_PR",
"_TYFLOW_VAT_SKIN_PRSAVE",
"_TYFLOW_VAT_SKIN_PRSXYZ"
};
public ParticleBaseTyflowVATGUI(ShaderGUIHelper helper)
{
_helper = helper;
}
public void Draw()
{
DrawTyflowSettings();
SyncKeywords();
}
public static void AppendRequiredVertexStreams(
Material material,
List<ParticleSystemVertexStream> streams,
List<string> streamList)
{
if (!IsTyflowParticleModeEnabled(material))
{
return;
}
AddStream(streams, streamList, ParticleSystemVertexStream.UV2, ParticleBaseGUI.streamUV2Text);
}
private void DrawTyflowSettings()
{
_helper.DrawTexture("VAT texture", "_VATTex", drawScaleOffset: false, drawWrapMode: false);
_helper.DrawFloat("ImportScale", "_ImportScale");
_helper.DrawPopUp("TyFlow VAT Sub Mode", TyflowSubModeProperty, TyflowAnimationModeNames);
if (HasUnsupportedParticleMode())
{
EditorGUILayout.HelpBox("该 TyFlow VAT 类型需要 Mesh 多 UV 数据,不支持 ParticleSystem VertexStream 模式。", MessageType.Warning);
}
else if (HasParticleUV2Conflict())
{
EditorGUILayout.HelpBox("TyFlow VAT uses UV2 (TEXCOORD0.zw) as vertexIndex / vertexCount in ParticleSystem mode. Flipbook blending or Special UV (UV2) conflicts with it; VAT takes priority.", MessageType.Warning);
}
_helper.DrawToggle("Deforming skin", "_DeformingSkin");
_helper.DrawFloat("Skin bone count", "_SkinBoneCount");
_helper.DrawToggle("RGBA encoded", "_RGBAEncoded");
_helper.DrawToggle("RGBA half", "_RGBAHalf");
_helper.DrawToggle("Gamma correction", "_LinearToGamma");
_helper.DrawToggle("VAT includes normals", "_VATIncludesNormals");
_helper.DrawToggle("Affects shadows", "_AffectsShadows");
_helper.DrawFloat("Frame", "_Frame");
DrawFrameCustomDataSelect();
_helper.DrawFloat("Frames", "_Frames");
_helper.DrawToggle("Frame interpolation", "_FrameInterpolation");
_helper.DrawToggle("Loop", "_Loop");
_helper.DrawToggle("Interpolate loop", "_InterpolateLoop");
_helper.DrawToggle("Autoplay", "_Autoplay");
_helper.DrawFloat("AutoplaySpeed", "_AutoplaySpeed");
}
private void DrawFrameCustomDataSelect()
{
const int dataBitPos = W9ParticleShaderFlags.FLAGBIT_POS_2_CUSTOMDATA_VAT_FRAME;
const int dataIndex = 2;
W9ParticleShaderFlags.CutomDataComponent component = GetCurrentCustomDataComponent(dataBitPos, dataIndex);
if (!IsAnyTyflowParticleModeEnabled() || _helper.shaderFlags == null || _helper.shaderFlags.Length == 0)
{
if (component != W9ParticleShaderFlags.CutomDataComponent.Off)
{
component = W9ParticleShaderFlags.CutomDataComponent.Off;
for (int i = 0; i < _helper.shaderFlags.Length; i++)
{
if (_helper.shaderFlags[i] is W9ParticleShaderFlags flags)
{
flags.SetCustomDataFlag(component, dataBitPos, dataIndex);
}
}
}
return;
}
(string, string) nameTuple = ("VATFrameCustomData", "");
EditorGUI.showMixedValue = CustomDataHasMixedValue(dataBitPos, dataIndex);
EditorGUI.BeginChangeCheck();
EditorGUILayout.BeginHorizontal();
component = (W9ParticleShaderFlags.CutomDataComponent)EditorGUILayout.Popup(new GUIContent("VAT Frame CustomData"), (int)component, ParticleBaseGUI.CustomDataOptions);
EditorGUI.showMixedValue = false;
Action applySelection = () =>
{
for (int i = 0; i < _helper.shaderFlags.Length; i++)
{
if (_helper.shaderFlags[i] is W9ParticleShaderFlags flags)
{
flags.SetCustomDataFlag(component, dataBitPos, dataIndex);
}
}
_helper.ResetTool.CheckOnValueChange(nameTuple);
};
if (EditorGUI.EndChangeCheck())
{
applySelection();
}
_helper.ResetTool.DrawResetModifyButton(
new Rect(),
nameTuple,
resetCallBack: () =>
{
component = W9ParticleShaderFlags.CutomDataComponent.Off;
applySelection();
},
onValueChangedCallBack: applySelection,
checkHasModifyOnValueChange: () => GetCurrentCustomDataComponent(dataBitPos, dataIndex) != W9ParticleShaderFlags.CutomDataComponent.Off,
checkHasMixedValueOnValueChange: () => CustomDataHasMixedValue(dataBitPos, dataIndex));
EditorGUILayout.EndHorizontal();
_helper.ResetTool.EndResetModifyButtonScope();
}
private W9ParticleShaderFlags.CutomDataComponent GetCurrentCustomDataComponent(int dataBitPos, int dataIndex)
{
if (_helper.shaderFlags == null || _helper.shaderFlags.Length == 0)
{
return W9ParticleShaderFlags.CutomDataComponent.Off;
}
if (_helper.shaderFlags[0] is W9ParticleShaderFlags flags)
{
return flags.GetCustomDataFlag(dataBitPos, dataIndex);
}
return W9ParticleShaderFlags.CutomDataComponent.Off;
}
private bool CustomDataHasMixedValue(int dataBitPos, int dataIndex)
{
if (_helper.shaderFlags == null || _helper.shaderFlags.Length == 0)
{
return false;
}
W9ParticleShaderFlags.CutomDataComponent component = W9ParticleShaderFlags.CutomDataComponent.UnKnownOrMixed;
for (int i = 0; i < _helper.shaderFlags.Length; i++)
{
if (!(_helper.shaderFlags[i] is W9ParticleShaderFlags flags))
{
continue;
}
W9ParticleShaderFlags.CutomDataComponent current = flags.GetCustomDataFlag(dataBitPos, dataIndex);
if (component == W9ParticleShaderFlags.CutomDataComponent.UnKnownOrMixed)
{
component = current;
continue;
}
if (component != current)
{
return true;
}
}
return false;
}
private bool HasUnsupportedParticleMode()
{
if (_helper.mats == null)
{
return false;
}
for (int i = 0; i < _helper.mats.Count; i++)
{
if (IsUnsupportedParticleMode(_helper.mats[i]))
{
return true;
}
}
return false;
}
private bool IsAnyTyflowParticleModeEnabled()
{
if (_helper.mats == null)
{
return false;
}
for (int i = 0; i < _helper.mats.Count; i++)
{
if (IsTyflowParticleModeEnabled(_helper.mats[i]))
{
return true;
}
}
return false;
}
private bool HasParticleUV2Conflict()
{
if (_helper.mats == null || _helper.mats.Count == 0 || _helper.shaderFlags == null || _helper.shaderFlags.Length == 0)
{
return false;
}
for (int i = 0; i < _helper.mats.Count; i++)
{
Material mat = _helper.mats[i];
if (!IsTyflowParticleModeEnabled(mat))
{
continue;
}
W9ParticleShaderFlags flags = _helper.shaderFlags[i] as W9ParticleShaderFlags;
if (flags == null)
{
continue;
}
bool usesFlipbookBlending = mat.IsKeywordEnabled("_FLIPBOOKBLENDING_ON");
bool usesSpecialUVOnUV2 = flags.CheckIsUVModeOn(W9ParticleShaderFlags.UVMode.SpecialUVChannel) &&
!flags.CheckFlagBits(W9ParticleShaderFlags.FLAG_BIT_PARTICLE_1_USE_TEXCOORD2, index: 1);
if (usesFlipbookBlending || usesSpecialUVOnUV2)
{
return true;
}
}
return false;
}
private static bool IsTyflowParticleModeEnabled(Material material)
{
if (material == null ||
!material.HasProperty("_VAT_Toggle") ||
!material.HasProperty("_VATMode") ||
!material.HasProperty("_MeshSourceMode") ||
material.GetFloat("_VAT_Toggle") <= 0.5f ||
Mathf.RoundToInt(material.GetFloat("_VATMode")) != (int)ParticleBaseGUI.VATMode.Tyflow)
{
return false;
}
ParticleBaseGUI.MeshSourceMode meshSourceMode = (ParticleBaseGUI.MeshSourceMode)Mathf.RoundToInt(material.GetFloat("_MeshSourceMode"));
if (meshSourceMode != ParticleBaseGUI.MeshSourceMode.Particle &&
meshSourceMode != ParticleBaseGUI.MeshSourceMode.UIParticle)
{
return false;
}
return GetMaterialSubMode(material) <= TyflowParticleHighestNonSkinMode;
}
private static bool IsUnsupportedParticleMode(Material material)
{
if (material == null ||
!material.HasProperty("_VAT_Toggle") ||
!material.HasProperty("_VATMode") ||
!material.HasProperty("_MeshSourceMode") ||
material.GetFloat("_VAT_Toggle") <= 0.5f ||
Mathf.RoundToInt(material.GetFloat("_VATMode")) != (int)ParticleBaseGUI.VATMode.Tyflow)
{
return false;
}
ParticleBaseGUI.MeshSourceMode meshSourceMode = (ParticleBaseGUI.MeshSourceMode)Mathf.RoundToInt(material.GetFloat("_MeshSourceMode"));
if (meshSourceMode != ParticleBaseGUI.MeshSourceMode.Particle &&
meshSourceMode != ParticleBaseGUI.MeshSourceMode.UIParticle)
{
return false;
}
return GetMaterialSubMode(material) >= TyflowSkinModeStart;
}
private static int GetMaterialSubMode(Material material)
{
if (!material.HasProperty(TyflowSubModeProperty))
{
return 0;
}
return Mathf.Clamp(Mathf.RoundToInt(material.GetFloat(TyflowSubModeProperty)), 0, TyflowModeKeywords.Length - 1);
}
private void SyncKeywords()
{
if (_helper.mats == null)
{
return;
}
for (int i = 0; i < _helper.mats.Count; i++)
{
SyncKeywords(_helper.mats[i]);
}
}
internal static void SyncKeywords(Material mat)
{
if (mat == null)
{
return;
}
SetSubModeKeyword(mat, GetMaterialSubMode(mat));
}
internal static void ClearKeywords(Material mat)
{
if (mat == null)
{
return;
}
SetSubModeKeyword(mat, -1);
}
private static void SetSubModeKeyword(Material mat, int enabledIndex)
{
for (int i = 0; i < TyflowModeKeywords.Length; i++)
{
mat.DisableKeyword(TyflowModeKeywords[i]);
}
if (enabledIndex >= 0 && enabledIndex < TyflowModeKeywords.Length)
{
mat.EnableKeyword(TyflowModeKeywords[enabledIndex]);
}
}
private static void AddStream(
List<ParticleSystemVertexStream> streams,
List<string> streamList,
ParticleSystemVertexStream stream,
string streamLabel)
{
if (streams.Contains(stream))
{
return;
}
streams.Add(stream);
streamList.Add(streamLabel);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8f8ef4dd3fb2478e9fd8071745d57eca
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,20 @@
{
"name": "com.xuanxuan.nb.shaders.Editor",
"rootNamespace": "",
"references": [
"GUID:0e3b0e6ce60c7a34094f8f9822c0b7f2",
"GUID:8495541fcd41b0c40b5b6e6e7a7639d1",
"GUID:8f9e4d586616f13449cfeb86c5f704c2"
],
"includePlatforms": [
"Editor"
],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 5e03fab8dc9c256468083d9bc82a73c3
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4684518ac782305428f8c0434c85d1c0
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,773 @@
using UnityEngine;
namespace NBShader
{
public class W9ParticleShaderFlags : ShaderFlagsBase
{
public const string FlagsName = "_W9ParticleShaderFlags";
public static int FlagsId = Shader.PropertyToID(FlagsName);
public const string Flags1Name = "_W9ParticleShaderFlags1";
public static int Flags1Id = Shader.PropertyToID(Flags1Name);
public const string WrapFlagsName = "_W9ParticleShaderWrapFlags";
public static int WrapFlagsId = Shader.PropertyToID(WrapFlagsName);
public const string foldOutFlagName = "_W9ParticleShaderGUIFoldToggle";
public static int foldOutFlagId = Shader.PropertyToID(foldOutFlagName);
public const string foldOutFlagName1 = "_W9ParticleShaderGUIFoldToggle1";
public static int foldOutFlagId1 = Shader.PropertyToID(foldOutFlagName1);
public const string foldOutFlagName2 = "_W9ParticleShaderGUIFoldToggle2";
public static int foldOutFlagId2 = Shader.PropertyToID(foldOutFlagName2);
public const string colorChannelFlagName = "_W9ParticleShaderColorChannelFlag";
public static int colorChannelFlagId = Shader.PropertyToID(colorChannelFlagName);
public const string pNoiseBlendFlagName = "_W9ParticleShaderPNoiseBlendFlag";
public static int pNoiseBlendFlagId = Shader.PropertyToID(pNoiseBlendFlagName);
// public const string WrapFlags2Name = "_W9ParticleShaderWrapFlags2";
// public static int WrapFlags2Id = Shader.PropertyToID(WrapFlags2Name);
public override int GetShaderFlagsId(int index = 0)
{
switch (index)
{
case 0:
return FlagsId;
case 1:
return Flags1Id;
case 2:
return WrapFlagsId;
//FoldOut必须要紧挨着因为按照Index去拿AnimBool
case 3:
return foldOutFlagId;
case 4:
return foldOutFlagId1;
case 5:
return foldOutFlagId2;
case 6:
return colorChannelFlagId;
case 7:
return pNoiseBlendFlagId;
// case 8:
// return WrapFlags2Id;
default:
return FlagsId;
}
}
protected override string GetShaderFlagsName(int index = 0)
{
switch (index)
{
case 0:
return FlagsName;
case 1:
return Flags1Name;
case 2:
return WrapFlagsName;
case 3:
return foldOutFlagName;
case 4:
return foldOutFlagName1;
case 5:
return colorChannelFlagName;
default:
return FlagsName;
}
}
public W9ParticleShaderFlags(Material material = null) : base(material)
{
}
public const int FLAG_BIT_SATURABILITY_ON = 1 << 0;
public const int FLAG_BIT_PARTICLE_NOISE_CHORATICABERRAT_WITH_NOISE = 1 << 1;
public const int FLAG_BIT_PARTICLE_FRESNEL_FADE_ON = 1 << 2;
public const int FLAG_BIT_PARTICLE_FRESNEL_COLOR_ON = 1 << 3;
public const int FLAG_BIT_PARTICLE_USETEXCOORD2 = 1 << 4;
public const int FLAG_BIT_PARTICLE_DISTANCEFADE_ON = 1 << 5;
public const int FLAG_BIT_PARTICLE_CHORATICABERRAT = 1 << 6;
public const int FLAG_BIT_PARTILCE_MASKMAPROTATIONANIMATION_ON = 1 << 7;
public const int FLAG_BIT_PARTICLE_POLARCOORDINATES_ON = 1 << 8;
public const int FLAG_BIT_PARTICLE_UTWIRL_ON = 1 << 9;
public const int FLAG_BIT_PARTICLE_LINEARTOGAMMA_ON = 1 << 10;
public const int FLAG_BIT_PARTICLE_FRESNEL_ON = 1 << 11;
public const int FLAG_BIT_PARTICLE_NOISEMAP_NORMALIZEED_ON = 1 << 12;
public const int FLAG_BIT_PARTICLE_FRESNEL_COLOR_AFFETCT_BY_ALPHA = 1 << 13;
public const int FLAG_BIT_PARTICLE_UIEFFECT_ON = 1 << 14;
public const int FLAG_BIT_PARTICLE_UNSCALETIME_ON = 1 << 15;
public const int FLAG_BIT_PARTICLE_SCRIPTABLETIME_ON = 1 << 16;
public const int FLAG_BIT_PARTICLE_CUSTOMDATA1_ON = 1 << 17;
public const int FLAG_BIT_PARTICLE_FRESNEL_INVERT_ON = 1 << 18;
public const int FLAG_BIT_HUESHIFT_ON = 1 << 19;
public const int FLAG_BIT_PARTICLE_CUSTOMDATA2_ON = 1 << 20;
public const int FLAG_BIT_PARTICLE_NORMALMAP_MASK_MODE = 1 << 21;
public const int FLAG_BIT_PARTICLE_COLOR_ADJUSTMENT_ONLY_AFFECT_MAINTEX = 1 << 22;
public const int FLAG_BIT_PARTICLE_RAMP_COLOR_MAP_MODE_ON = 1 << 23;
public const int FLAG_BIT_PARTICLE_RAMP_COLOR_BLEND_ADD = 1 << 24;
public const int FLAG_BIT_PARTICLE_COLOR_BLEND_ALPHA_MULTIPLY_MODE = 1 << 25;
public const int FLAG_BIT_PARTICLE_DISSOLVE_RAMP_MAP = 1 << 26;
public const int FLAG_BIT_PARTICLE_DISSOLVE_MASK = 1 << 27;
public const int FLAG_BIT_PARTICLE_BACKCOLOR = 1 << 28;
public const int FLAG_BIT_PARTICLE_COLOR_MULTI_ALPHA = 1 << 29;
public const int FLAG_BIT_PARTICLE_VERTEX_OFFSET_ON = 1 << 30;
public const int FLAG_BIT_PARTICLE_VERTEX_OFFSET_NORMAL_DIR = 1 << 31;
public const int FLAG_BIT_PARTICLE_1_DEPTH_OUTLINE = 1 << 0;
public const int FLAG_BIT_PARTICLE_1_PARALLAX_MAPPING = 1 << 1;
public const int FLAG_BIT_PARTICLE_1_MASKMAP_GRADIENT = 1 << 2;
public const int FLAG_BIT_PARTICLE_1_MASKMAP_2_GRADIENT = 1 << 3;
public const int FLAG_BIT_PARTICLE_1_MASKMAP_3_GRADIENT = 1 << 4;
public const int FLAG_BIT_PARTICLE_1_DISSOLVE_LINE_MASK = 1 << 5;
public const int FLAG_BIT_PARTICLE_1_DISSOLVE_RAMP_MULITPLY = 1 << 6;
public const int FLAG_BIT_PARTICLE_1_MASK_REFINE = 1 << 7;
public const int FLAG_BIT_PARTICLE_1_SCREEN_DISTORT_ALPHA_REFINE = 1 << 8;
public const int FLAG_BIT_PARTICLE_1_IGNORE_VERTEX_COLOR = 1 << 9;
public const int FLAG_BIT_PARTICLE_1_PROGRAM_NOISE_SIMPLE = 1 << 10;
public const int FLAG_BIT_PARTICLE_1_DISSOVLE_USE_RAMP = 1 << 11;
public const int FLAG_BIT_PARTICLE_1_MASK_MAP2 = 1 << 12;
public const int FLAG_BIT_PARTICLE_1_MASK_MAP3 = 1 << 13;
public const int FLAG_BIT_PARTICLE_1_NOISE_MASKMAP = 1 << 14;
public const int FLAG_BIT_PARTICLE_1_ANIMATION_SHEET_HELPER = 1 << 15;
public const int FLAG_BIT_PARTICLE_1_PROGRAM_NOISE_VORONOI = 1 << 16;
public const int FLAG_BIT_PARTICLE_1_UIEFFECT_SPRITE_MODE = 1 << 17;
public const int FLAG_BIT_PARTICLE_1_USE_TEXCOORD1 = 1 << 18;
public const int FLAG_BIT_PARTICLE_1_USE_TEXCOORD2 = 1 << 19;
public const int FLAG_BIT_PARTICLE_1_CYLINDER_CORDINATE = 1 << 20;
public const int FLAG_BIT_PARTICLE_1_UV_FROM_MESH = 1 << 21; //3D条件下如果不是来源于Mesh就默认来源于粒子。
public const int FLAG_BIT_PARTICLE_1_UIEFFECT_BASEMAP_MODE = 1 << 22; //3D条件下如果不是来源于Mesh就默认来源于粒子。
public const int FLAG_BIT_PARTICLE_1_IS_PARTICLE_SYSTEM = 1 << 23; //3D条件下如果不是来源于Mesh就默认来源于粒子。
public const int FLAG_BIT_PARTICLE_1_MAINTEX_CONTRAST = 1 << 24;
public const int FLAG_BIT_PARTICLE_1_VERTEXOFFSET_START_FROM_ZERO = 1 << 25;
public const int FLAG_BIT_PARTICLE_1_VERTEXOFFSET_MASKMAP = 1 << 26;
public const int FLAG_BIT_PARTICLE_1_MAINTEX_COLOR_REFINE = 1 << 27;
public const int FLAG_BIT_PARTICLE_1_BUMP_TEX_UV_FOLLOW_MAINTEX = 1 << 28;
public const int FLAG_BIT_PARTICLE_1_SIXWAY_RAMPMAP = 1 << 29;
public const int FLAG_BIT_PARTICLE_1_MATCAP_MULTY_MODE = 1 << 30;
public const int FLAG_BIT_WRAPMODE_BASEMAP = 1 << 0;
public const int FLAG_BIT_WRAPMODE_MASKMAP = 1 << 1;
public const int FLAG_BIT_WRAPMODE_MASKMAP2 = 1 << 2;
public const int FLAG_BIT_WRAPMODE_NOISEMAP = 1 << 3;
public const int FLAG_BIT_WRAPMODE_EMISSIONMAP = 1 << 4;
public const int FLAG_BIT_WRAPMODE_DISSOLVE_MAP = 1 << 5;
public const int FLAG_BIT_WRAPMODE_DISSOLVE_MASKMAP = 1 << 6;
public const int FLAG_BIT_WRAPMODE_DISSOLVE_RAMPMAP = 1 << 7;
public const int FLAG_BIT_WRAPMODE_COLORBLENDMAP = 1 << 8;
public const int FLAG_BIT_WRAPMODE_VERTEXOFFSETMAP = 1 << 9;
public const int FLAG_BIT_WRAPMODE_PARALLAXMAPPINGMAP = 1 << 10;
public const int FLAG_BIT_WRAPMODE_MASKMAP3 = 1 << 11;
public const int FLAG_BIT_WRAPMODE_NOISE_MASKMAP = 1 << 12;
public const int FLAG_BIT_WRAPMODE_VERTEXOFFSET_MASKMAP = 1 << 13;
public const int FLAG_BIT_WRAPMODE_BUMPTEX = 1 << 14;
public const int FLAG_BIT_WRAPMODE_RAMP_COLOR_MAP = 1 << 15;
// public const int FLAG_BIT_WRAPMODE2_SHAREDUV = 1 << 0;
public const int foldOutBitMeshOption = 1 << 0;
public const int foldOutBitMainTexOption = 1 << 1;
public const int foldOutBitBaseOption = 1 << 2;
public const int foldOutBitFeatureOption = 1 << 3;
public const int foldOutBitBaseMap = 1 << 4;
public const int foldOutBitMask = 1 << 5;
public const int foldOutBitMaskMap = 1 << 6;
public const int foldOutBitMask2 = 1 << 7;
public const int foldOutBitMask3 = 1 << 8;
public const int foldOutBitTwril = 1 << 9;
public const int foldOutBitPolar = 1 << 10;
public const int foldOutBitHueShift = 1 << 11;
public const int foldOutBitSaturability = 1 << 12;
public const int foldOutBitDistanceFade = 1 << 13;
public const int foldOutBitSoftParticles = 1 << 14;
public const int foldOutBitMaskRotate = 1 << 15;
public const int foldOutBitNoise = 1 << 16;
public const int foldOutBitNoiseMap = 1 << 17;
public const int foldOutBitNoiseMaskToggle = 1 << 18;
public const int foldOutBitEmission = 1 << 19;
public const int foldOutBitDistortionChoraticaberrat = 1 << 20;
public const int foldOutDissolve = 1 << 21;
public const int foldOutDissolveMap = 1 << 22;
public const int foldOutProgramNoise = 1 << 23;
public const int foldOutDissolveRampMap = 1 << 24;
public const int foldOutDissolveMask = 1 << 25;
public const int foldOutColorBlend = 1 << 26;
public const int foldOutFresnel = 1 << 27;
public const int foldOutDepthOutline = 1 << 28;
public const int foldOutVertexOffset = 1 << 29;
public const int foldOutParallexMapping = 1 << 30;
// public const int foldOutBit1Portal= 1 << 31;
public const int foldOutBit1UVModeMainTex = 1 << 0;
public const int foldOutBit1UVModeMaskMap = 1 << 1;
public const int foldOutBit1UVModeMaskMap2 = 1 << 2;
public const int foldOutBit1UVModeMaskMap3 = 1 << 3;
public const int foldOutBit1UVModeNoiseMap = 1 << 4;
public const int foldOutBit1UVModeNoiseMaskMap = 1 << 5;
public const int foldOutBit1UVModeEmissionMap = 1 << 6;
public const int foldOutBit1UVModeDissolveMap = 1 << 7;
public const int foldOutBit1UVModeDissolveMaskMap = 1 << 8;
public const int foldOutBit1UVModeColorBlendMap = 1 << 9;
public const int foldOutBit1UVModeVertexOffsetMap = 1 << 10;
public const int foldOutBit1UVModeVertexOffsetMaskMap = 1 << 11;
public const int foldOutBit1UVModeBumpTex = 1 << 12;
public const int foldOutBit1UVModeRampColorMap = 1 << 13;
public const int foldOutBit1UVModeProgramNoise = 1 << 14;
//留一些位置给以后可能会增加的贴图。
public const int foldOutBit1Portal = 1 << 20;
public const int foldOutBit1ZOffset = 1 << 21;
public const int foldOutBit1CustomStencilTest = 1 << 22;
public const int foldOutBit1TaOption = 1 << 23;
public const int foldOutBit1MianTexContrast = 1 << 24;
public const int foldOutBit1VertexOffsetMask = 1 << 25;
public const int foldOutBit1MainTexColorRefine = 1 << 26;
public const int foldOutBit1LightOption = 1 << 27;
public const int foldOutBit1ShaderKeyword = 1 << 28;
public const int foldOutBit1BumpTex = 1 << 29;
public const int foldOutBit2BumpTexToggle = 1 << 0;
public const int foldOutBit2MatCapToggle = 1 << 1;
public const int foldOutBit2RampColor = 1 << 2;
public const int foldOutBit2DissolveLine = 1 << 3;
public const int foldOutBit2BaseBackColor = 1 << 4;
public const int foldOutBit2MaskRefine = 1 << 5;
public const int foldOutBit2ScreenDistortAlphaRefine = 1 << 6;
public const int foldOutBit2ProgramNoiseSimple = 1 << 7;
public const int foldOutBit2ProgramNoiseVoronoi = 1 << 8;
public const int foldOutBit2ColorAdjustment = 1 << 9;
public const int foldOutBit2SharedUV = 1 << 10;
public const int foldOutBit2SharedUVMode = 1 << 11;
public const int foldOutBit2VAT = 1 << 12;
#region CustomDataCodes
public const string CustomDataFlag0Name = "_W9ParticleCustomDataFlag0";
public const string CustomDataFlag1Name = "_W9ParticleCustomDataFlag1";
public const string CustomDataFlag2Name = "_W9ParticleCustomDataFlag2";
public const string CustomDataFlag3Name = "_W9ParticleCustomDataFlag3";
public static int CustomDataFlag0Id = Shader.PropertyToID(CustomDataFlag0Name);
public static int CustomDataFlag1Id = Shader.PropertyToID(CustomDataFlag1Name);
public static int CustomDataFlag2Id = Shader.PropertyToID(CustomDataFlag2Name);
public static int CustomDataFlag3Id = Shader.PropertyToID(CustomDataFlag3Name);
public enum CutomDataComponent
{
Off,
CustomData1X,
CustomData1Y,
CustomData1Z,
CustomData1W,
CustomData2X,
CustomData2Y,
CustomData2Z,
CustomData2W,
UnKnownOrMixed = -1
}
public const int FLAGBIT_POS_0_CUSTOMDATA_MAINTEX_OFFSET_X = 0 * 4;
public const int FLAGBIT_POS_0_CUSTOMDATA_MAINTEX_OFFSET_Y = 1 * 4;
public const int FLAGBIT_POS_0_CUSTOMDATA_DISSOLVE_INTENSITY = 2 * 4;
public const int FLAGBIT_POS_0_CUSTOMDATA_HUESHIFT = 3 * 4;
public const int FLAGBIT_POS_0_CUSTOMDATA_MASK_OFFSET_X = 4 * 4;
public const int FLAGBIT_POS_0_CUSTOMDATA_MASK_OFFSET_Y = 5 * 4;
public const int FLAGBIT_POS_0_CUSTOMDATA_FRESNEL_OFFSET = 6 * 4;
public const int FLAGBIT_POS_0_CUSTOMDATA_CHORATICABERRAT_INTENSITY = 7 * 4;
public const int FLAGBIT_POS_1_CUSTOMDATA_DISSOLVE_OFFSET_X = 0 * 4;
public const int FLAGBIT_POS_1_CUSTOMDATA_DISSOLVE_OFFSET_Y = 1 * 4;
public const int FLAGBIT_POS_1_CUSTOMDATA_NOISE_INTENSITY = 2 * 4;
public const int FLAGBIT_POS_1_CUSTOMDATA_SATURATE = 3 * 4;
public const int FLAGBIT_POS_1_CUSTOMDATA_VERTEX_OFFSET_X = 4 * 4;
public const int FLAGBIT_POS_1_CUSTOMDATA_VERTEX_OFFSET_Y = 5 * 4;
public const int FLAGBIT_POS_1_CUSTOMDATA_VERTEXOFFSET_INTENSITY = 6 * 4;
public const int FLAGBIT_POS_1_CUSTOMDATA_DISSOLVE_MASK_INTENSITY = 7 * 4;
public const int FLAGBIT_POS_2_CUSTOMDATA_DISSOLVE_NOISE1_OFFSET_X = 0 * 4;
public const int FLAGBIT_POS_2_CUSTOMDATA_DISSOLVE_NOISE1_OFFSET_Y = 1 * 4;
public const int FLAGBIT_POS_2_CUSTOMDATA_DISSOLVE_NOISE2_OFFSET_X = 2 * 4;
public const int FLAGBIT_POS_2_CUSTOMDATA_DISSOLVE_NOISE2_OFFSET_Y = 3 * 4;
public const int FLAGBIT_POS_2_CUSTOMDATA_NOISE_DIRECTION_X = 4 * 4;
public const int FLAGBIT_POS_2_CUSTOMDATA_NOISE_DIRECTION_Y = 5 * 4;
public const int FLAGBIT_POS_2_CUSTOMDATA_MAINTEX_CONTRAST = 6 * 4;
public const int FLAGBIT_POS_2_CUSTOMDATA_VAT_FRAME = 7 * 4;
public const int FLAGBIT_POS_3_CUSTOMDATA_VERTEX_OFFSET_MASK_X = 0 * 4;
public const int FLAGBIT_POS_3_CUSTOMDATA_VERTEX_OFFSET_MASK_Y = 1 * 4;
public const int FLAGBIT_POS_3_CUSTOMDATA_SHARED_UV_OFFSET_X = 2 * 4;
public const int FLAGBIT_POS_3_CUSTOMDATA_SHARED_UV_OFFSET_Y = 3 * 4;
public const int FLAGBIT_POS_3_CUSTOMDATA_EMISSION_OFFSET_X = 4 * 4;
public const int FLAGBIT_POS_3_CUSTOMDATA_EMISSION_OFFSET_Y = 5 * 4;
public const int FLAGBIT_POS_3_CUSTOMDATA_COLOR_BLEND_OFFSET_X = 6 * 4;
public const int FLAGBIT_POS_3_CUSTOMDATA_COLOR_BLEND_OFFSET_Y = 7 * 4;
public const int isCustomDataBit = 1 << 3;
public const int Data12Bit = 1 << 2; //true CustomData1 / false CustomData2
public const int DataXYorZWBit = 1 << 1; //true xy / false zw
public const int DataXZorYWBit = 1 << 0; //true xz / false yw
public const int CustomData1XBit = isCustomDataBit | Data12Bit | DataXYorZWBit | DataXZorYWBit;
public const int CustomData1YBit = isCustomDataBit | Data12Bit | DataXYorZWBit;
public const int CustomData1ZBit = isCustomDataBit | Data12Bit | DataXZorYWBit;
public const int CustomData1WBit = isCustomDataBit | Data12Bit;
public const int CustomData2XBit = isCustomDataBit | DataXYorZWBit | DataXZorYWBit;
public const int CustomData2YBit = isCustomDataBit | DataXYorZWBit;
public const int CustomData2ZBit = isCustomDataBit | DataXZorYWBit;
public const int CustomData2WBit = isCustomDataBit;
private int GetCustomDataFlagID(int dataIndex)
{
switch (dataIndex)
{
case 0:
return CustomDataFlag0Id;
case 1:
return CustomDataFlag1Id;
case 2:
return CustomDataFlag2Id;
case 3:
return CustomDataFlag3Id;
}
return 0;
}
public string GetCustomDataFlagPropertyName(int dataIndex)
{
switch (dataIndex)
{
case 0:
return CustomDataFlag0Name;
case 1:
return CustomDataFlag1Name;
case 2:
return CustomDataFlag2Name;
case 3:
return CustomDataFlag3Name;
}
return null;
}
public CutomDataComponent GetCustomDataFlag(int dataBitPos, int dataIndex)
{
int bit = material.GetInteger(GetCustomDataFlagID(dataIndex));
bit = bit >> dataBitPos;
bit &= 15; // binary 1111
if ((bit & isCustomDataBit) == 0)
{
return CutomDataComponent.Off;
}
else if (bit == CustomData1XBit)
{
return CutomDataComponent.CustomData1X;
}
else if (bit == CustomData1YBit)
{
return CutomDataComponent.CustomData1Y;
}
else if (bit == CustomData1ZBit)
{
return CutomDataComponent.CustomData1Z;
}
else if (bit == CustomData1WBit)
{
return CutomDataComponent.CustomData1W;
}
else if (bit == CustomData2XBit)
{
return CutomDataComponent.CustomData2X;
}
else if (bit == CustomData2YBit)
{
return CutomDataComponent.CustomData2Y;
}
else if (bit == CustomData2ZBit)
{
return CutomDataComponent.CustomData2Z;
}
else if (bit == CustomData2WBit)
{
return CutomDataComponent.CustomData2W;
}
else
{
}
Debug.Log("不可能存在的情况");
return CutomDataComponent.Off;
}
public void SetCustomDataFlag(CutomDataComponent cutomDataComponent, int dataBitPos, int dataIndex)
{
int bit = 0;
switch (cutomDataComponent)
{
case CutomDataComponent.Off:
bit = 0;
break;
case CutomDataComponent.CustomData1X:
bit = CustomData1XBit;
break;
case CutomDataComponent.CustomData1Y:
bit = CustomData1YBit;
break;
case CutomDataComponent.CustomData1Z:
bit = CustomData1ZBit;
break;
case CutomDataComponent.CustomData1W:
bit = CustomData1WBit;
break;
case CutomDataComponent.CustomData2X:
bit = CustomData2XBit;
break;
case CutomDataComponent.CustomData2Y:
bit = CustomData2YBit;
break;
case CutomDataComponent.CustomData2Z:
bit = CustomData2ZBit;
break;
case CutomDataComponent.CustomData2W:
bit = CustomData2WBit;
break;
}
bit = bit << dataBitPos;
int clearBit = ~(15 << dataBitPos); //~ (1111 << dataBitPos)
int materialBit = material.GetInteger(GetCustomDataFlagID(dataIndex));
materialBit = materialBit & clearBit;
materialBit = materialBit | bit;
material.SetInteger(GetCustomDataFlagID(dataIndex), materialBit);
}
public bool IsCustomDataOn()
{
int prop0Flag = material.GetInteger(CustomDataFlag0Id);
int prop1Flag = material.GetInteger(CustomDataFlag1Id);
int prop2Flag = material.GetInteger(CustomDataFlag2Id);
int prop3Flag = material.GetInteger(CustomDataFlag3Id);
uint dataOnBit = 0b_1000_1000_1000_1000_1000_1000_1000_1000; //10001000100010001000100010001000;
return ((prop0Flag & dataOnBit) > 0) || ((prop1Flag & dataOnBit) > 0) || ((prop2Flag & dataOnBit) > 0) ||
((prop3Flag & dataOnBit) > 0);
}
bool CheckCustomData(int dataIndex, int flagIndex)
{
int flagID = 0;
switch (flagIndex)
{
case 0:
flagID = CustomDataFlag0Id;
break;
case 1:
flagID = CustomDataFlag1Id;
break;
case 2:
flagID = CustomDataFlag2Id;
break;
case 3:
flagID = CustomDataFlag3Id;
break;
}
int flag = material.GetInteger(flagID);
int i = 0;
while (i < 8)
{
int bit = flag >> (4 * i);
if (dataIndex == 1)
{
if ((bit & 0b_1000) > 0 && (bit & 0b_0100) > 0)
{
return true;
}
}
else if (dataIndex == 2)
{
if ((bit & 0b_1000) > 0 && (bit & 0b_0100) == 0)
{
return true;
}
}
i += 1;
}
return false;
}
public bool IsCustomData1On()
{
if (!IsCustomDataOn())
{
return false;
}
bool isCustomData1On = false;
isCustomData1On |= CheckCustomData(1, 0);
isCustomData1On |= CheckCustomData(1, 1);
isCustomData1On |= CheckCustomData(1, 2);
isCustomData1On |= CheckCustomData(1, 3);
return isCustomData1On;
}
public bool IsCustomData2On()
{
if (!IsCustomDataOn())
{
return false;
}
bool isCustomData1On = false;
isCustomData1On |= CheckCustomData(2, 0);
isCustomData1On |= CheckCustomData(2, 1);
isCustomData1On |= CheckCustomData(2, 2);
isCustomData1On |= CheckCustomData(2, 3);
return isCustomData1On;
}
#endregion
public const string UVModeFlag0Name = "_UVModeFlag0";
public const string UVModeFlagType0Name = "_UVModeFlagType0";
public static int UVModeFlag0PropID = Shader.PropertyToID(UVModeFlag0Name);
public static int UVModeFlagType0PropID = Shader.PropertyToID(UVModeFlagType0Name);
public string GetUVModePropName(int dataIndex)
{
switch (dataIndex)
{
case 0:
return UVModeFlag0Name;
}
return null;
}
public enum UVMode
{
DefaultUVChannel, //0 0b_00 modeIndex 00
SpecialUVChannel, //1 0b_01 modeIndex 00
PolarOrTwirl, //2 0b_10 modeIndex 00
Cylinder, //3 0b_11 modeIndex 00
MainTex, //0 0b_00 modeIndex 01
ScreenUV, //1 0b_01 modeIndex 01
WorldPos, //2 0b_10 modeIndex 01
ObjectPos, //3 0b_11 modeIndex 01
CommonUV, //0 0b_00 modeIndex 10
UnknownOrMixed = -1
}
public const int FLAG_BIT_UVMODE_POS_0_MAINTEX = 0 * 2;
public const int FLAG_BIT_UVMODE_POS_0_MASKMAP = 1 * 2;
public const int FLAG_BIT_UVMODE_POS_0_MASKMAP_2 = 2 * 2;
public const int FLAG_BIT_UVMODE_POS_0_MASKMAP_3 = 3 * 2;
public const int FLAG_BIT_UVMODE_POS_0_NOISE_MAP = 4 * 2;
public const int FLAG_BIT_UVMODE_POS_0_NOISE_MASK_MAP = 5 * 2;
public const int FLAG_BIT_UVMODE_POS_0_EMISSION_MAP = 6 * 2;
public const int FLAG_BIT_UVMODE_POS_0_DISSOLVE_MAP = 7 * 2;
public const int FLAG_BIT_UVMODE_POS_0_DISSOLVE_MASK_MAP = 8 * 2;
public const int FLAG_BIT_UVMODE_POS_0_COLOR_BLEND_MAP = 9 * 2;
public const int FLAG_BIT_UVMODE_POS_0_VERTEX_OFFSET_MAP = 10 * 2;
public const int FLAG_BIT_UVMODE_POS_0_VERTEX_OFFSET_MASKMAP = 11 * 2;
public const int FLAG_BIT_UVMODE_POS_0_BUMPMAP = 12 * 2;
public const int FLAG_BIT_UVMODE_POS_0_RAMP_COLOR_MAP = 13 * 2;
public const int FLAG_BIT_UVMODE_POS_0_PROGRAM_NOISE = 14 * 2;
public const int FLAG_BIT_UVMODE_POS_0_SHAREDUV = 15 * 2;
public void GetUVModeFlagPropID(int flagIndex, out int flagID, out int flagTypeID)
{
switch (flagIndex)
{
case 0:
flagID = UVModeFlag0PropID;
flagTypeID = UVModeFlagType0PropID;
return;
}
flagID = 0;
flagTypeID = 0;
}
public void SetUVMode(UVMode mode, int uvModePos, int flagIndex = 0)
{
GetUVModeFlagPropID(flagIndex, out int uvModeFlagPropId, out int uvModeFlagTypePropId);
int uvModeFlag = material.GetInteger(uvModeFlagPropId);
int uvModeFlagType = material.GetInteger(uvModeFlagTypePropId);
int clearFlag = 0b_11 << uvModePos;
clearFlag = ~ clearFlag;
uvModeFlag &= clearFlag;
int modeBit = (int)mode % 4 << uvModePos;
uvModeFlag |= modeBit;
uvModeFlagType &= clearFlag;
int typeBit = (int)mode / 4 << uvModePos;
uvModeFlagType |= typeBit;
material.SetInteger(uvModeFlagPropId, uvModeFlag);
material.SetInteger(uvModeFlagTypePropId, uvModeFlagType);
}
public UVMode GetUVMode(int uvModePos, int flagIndex = 0)
{
GetUVModeFlagPropID(flagIndex, out int uvModeFlagPropId, out int uvModeFlagTypePropId);
int uvModeFlag = material.GetInteger(uvModeFlagPropId);
uvModeFlag = uvModeFlag >> uvModePos;
uvModeFlag &= 0b_11;
int uvModeFlagType = material.GetInteger(uvModeFlagTypePropId);
uvModeFlagType = uvModeFlagType >> uvModePos;
uvModeFlagType &= 0b_11;
return (UVMode)(uvModeFlag + 4 * uvModeFlagType);
}
public bool CheckIsUVModeOn(UVMode mode)
{
uint uvModeFlag0 = (uint)material.GetInteger(UVModeFlag0PropID);
uint uvModeFlagType0 = (uint)material.GetInteger(UVModeFlagType0PropID);
uint uvModeflagBit = (uint)mode % 4;
uint uvModeflagTypeBit = (uint)mode / 4;
bool isUvMode = false;
for (int i = 0; i < 16; i++)
{
uint checkflagBit = uvModeFlag0 >> (i * 2);
checkflagBit = checkflagBit & 0b_11;
uint checkflagTypeBit = uvModeflagTypeBit >> (i * 2);
checkflagTypeBit = checkflagTypeBit & 0b_11;
if (checkflagBit == uvModeflagBit && checkflagTypeBit == uvModeflagTypeBit)
{
isUvMode = true;
break;
}
}
return isUvMode;
}
public const int FLAG_BIT_COLOR_CHANNEL_POS_0_MAINTEX_ALPHA = 0 * 2;
public const int FLAG_BIT_COLOR_CHANNEL_POS_0_MASKMAP1 = 1 * 2;
public const int FLAG_BIT_COLOR_CHANNEL_POS_0_MASKMAP2 = 2 * 2;
public const int FLAG_BIT_COLOR_CHANNEL_POS_0_MASKMAP3 = 3 * 2;
public const int FLAG_BIT_COLOR_CHANNEL_POS_0_NOISE_MASK = 4 * 2;
public const int FLAG_BIT_COLOR_CHANNEL_POS_0_DISSOLVE_MAP = 5 * 2;
public const int FLAG_BIT_COLOR_CHANNEL_POS_0_DISSOLVE_MASK_MAP = 6 * 2;
public const int FLAG_BIT_COLOR_CHANNEL_POS_0_RAMP_COLOR_MAP = 7 * 2;
public enum ColorChannel
{
X,
Y,
Z,
W,
UnKnownOrMixedValue
}
public void SetColorChanel(ColorChannel channel, int colorChannelFlagPos)
{
int colorChannelFlag = material.GetInteger(colorChannelFlagId);
int clearFlag = 0b_11 << colorChannelFlagPos;
clearFlag = ~ clearFlag;
colorChannelFlag &= clearFlag;
int channelBit = (int)channel << colorChannelFlagPos;
colorChannelFlag |= channelBit;
material.SetInteger(colorChannelFlagId, colorChannelFlag);
}
public ColorChannel GetColorChanel(int colorChannelFlagPos)
{
int colorChannelFlag = material.GetInteger(colorChannelFlagId);
colorChannelFlag = colorChannelFlag >> colorChannelFlagPos;
colorChannelFlag &= 0b_11;
return (ColorChannel)colorChannelFlag;
}
public const int FLAG_BIT_PNOISE_BLEND_POS_0_BASE_BLEND = 0 * 3;
public const int FLAG_BIT_PNOISE_BLEND_POS_0_MASK = 1 * 3;
public const int FLAG_BIT_PNOISE_BLEND_POS_0_DISSOLVE = 2 * 3;
public const int FLAG_BIT_PNOISE_BLEND_POS_0_DISTORT = 3 * 3;
public const int FLAG_BIT_PNOISE_BLEND_POS_0_MAINTEX = 4 * 3;
public enum PNoiseBlendMode
{
NotUse = 0,
Multiply = 1,
Min = 2,
HardLight = 3,
UnKnownOrMixedValue = -1
//后续看看要不要更多吧
}
public void SetPNoiseBlendMode(PNoiseBlendMode mode, int pNoiseBlendModeFlagPos)
{
int pNoiseBlendFlag = material.GetInteger(pNoiseBlendFlagId);
int blendMode = (int)mode;
if (blendMode < 0) return;
int clearFlag = 0b_111 << pNoiseBlendModeFlagPos;
clearFlag = ~clearFlag;
pNoiseBlendFlag &= clearFlag;
int pNoiseBlendBit = blendMode << pNoiseBlendModeFlagPos;
//先不考虑超过4个选项2bit的情况
pNoiseBlendFlag |= pNoiseBlendBit;
material.SetInteger(pNoiseBlendFlagId, pNoiseBlendFlag);
}
public PNoiseBlendMode GetPNoiseBlendMode(int pNoiseBlendModeFlagPos)
{
int pNoiseBlendFlag = material.GetInteger(pNoiseBlendFlagId);
pNoiseBlendFlag = pNoiseBlendFlag >> pNoiseBlendModeFlagPos;
pNoiseBlendFlag &= 0b_111;
//先不考虑超过4个选项2bit的情况
return (PNoiseBlendMode)pNoiseBlendFlag;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b13c8a972207b57458dd444106acbf3a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,16 @@
{
"name": "com.xuanxuan.nb.shaders",
"rootNamespace": "",
"references": [
"GUID:8f9e4d586616f13449cfeb86c5f704c2"
],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 0e3b0e6ce60c7a34094f8f9822c0b7f2
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5fdc89efbf4a9bf4c9449cc01f16d08a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 944a1679494774748b2936893c18c9ce
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,324 @@
#ifndef EFFECT_FLAGS
#define EFFECT_FLAGS
#define FLAG_BIT_SATURABILITY_ON (1 << 0)
#define FLAG_BIT_PARTICLE_NOISE_CHORATICABERRAT_WITH_NOISE (1 << 1)
#define FLAG_BIT_PARTICLE_FRESNEL_FADE_ON (1 << 2)
#define FLAG_BIT_PARTICLE_FRESNEL_COLOR_ON (1 << 3)
#define FLAG_BIT_PARTICLE_USETEXCOORD2 (1 << 4)
#define FLAG_BIT_PARTICLE_DISTANCEFADE_ON (1 << 5)
#define FLAG_BIT_PARTICLE_CHORATICABERRAT (1 << 6)
#define FLAG_BIT_PARTILCE_MASKMAPROTATIONANIMATION_ON (1 << 7)
#define FLAG_BIT_PARTICLE_POLARCOORDINATES_ON (1 << 8)
#define FLAG_BIT_PARTICLE_UTWIRL_ON (1 << 9)
#define FLAG_BIT_PARTICLE_LINEARTOGAMMA_ON (1 << 10)
#define FLAG_BIT_PARTICLE_FRESNEL_ON (1 << 11)
#define FLAG_BIT_PARTICLE_NOISEMAP_NORMALIZEED_ON (1 << 12)
#define FLAG_BIT_PARTICLE_FRESNEL_COLOR_AFFETCT_BY_ALPHA (1 << 13)
#define FLAG_BIT_PARTICLE_UIEFFECT_ON (1 << 14)
#define FLAG_BIT_PARTICLE_UNSCALETIME_ON (1 << 15)
#define FLAG_BIT_PARTICLE_SCRIPTABLETIME_ON (1 << 16)
#define FLAG_BIT_PARTICLE_CUSTOMDATA1_ON (1 << 17)
#define FLAG_BIT_PARTICLE_FRESNEL_INVERT_ON (1 << 18)
#define FLAG_BIT_HUESHIFT_ON (1 << 19)
#define FLAG_BIT_PARTICLE_CUSTOMDATA2_ON (1 << 20)
#define FLAG_BIT_PARTICLE_NORMALMAP_MASK_MODE (1 << 21)
#define FLAG_BIT_PARTICLE_COLOR_ADJUSTMENT_ONLY_AFFECT_MAINTEX (1 << 22)
#define FLAG_BIT_PARTICLE_RAMP_COLOR_MAP_MODE_ON (1 << 23)
#define FLAG_BIT_PARTICLE_RAMP_COLOR_BLEND_ADD (1 << 24)
#define FLAG_BIT_PARTICLE_COLOR_BLEND_ALPHA_MULTIPLY_MODE (1 << 25)
#define FLAG_BIT_PARTICLE_DISSOLVE_RAMP_MAP (1 << 26)
#define FLAG_BIT_PARTICLE_DISSOLVE_MASK (1 << 27)
#define FLAG_BIT_PARTICLE_BACKCOLOR (1 << 28)
#define FLAG_BIT_PARTICLE_COLOR_MULTI_ALPHA (1 << 29)
#define FLAG_BIT_PARTICLE_VERTEX_OFFSET_ON (1 << 30)
#define FLAG_BIT_PARTICLE_VERTEX_OFFSET_NORMAL_DIR (1 << 31)
// uint _W9ParticleShaderFlags;
#define FLAG_BIT_PARTICLE_1_DEPTH_OUTLINE (1 << 0)
#define FLAG_BIT_PARTICLE_1_PARALLAX_MAPPING (1 << 1)
#define FLAG_BIT_PARTICLE_1_MASKMAP_GRADIENT (1 << 2)
#define FLAG_BIT_PARTICLE_1_MASKMAP_2_GRADIENT (1 << 3)
#define FLAG_BIT_PARTICLE_1_MASKMAP_3_GRADIENT (1 << 4)
#define FLAG_BIT_PARTICLE_1_DISSOLVE_LINE_MASK (1 << 5)
#define FLAG_BIT_PARTICLE_1_DISSOLVE_RAMP_MULITPLY (1 << 6)
#define FLAG_BIT_PARTICLE_1_MASK_REFINE (1 << 7)
#define FLAG_BIT_PARTICLE_1_SCREEN_DISTORT_ALPHA_REFINE (1 << 8)
#define FLAG_BIT_PARTICLE_1_IGNORE_VERTEX_COLOR (1 << 9)
#define FLAG_BIT_PARTICLE_1_PROGRAM_NOISE_SIMPLE (1 << 10)
#define FLAG_BIT_PARTICLE_1_DISSOVLE_USE_RAMP (1 << 11)
#define FLAG_BIT_PARTICLE_1_MASK_MAP2 (1 << 12)
#define FLAG_BIT_PARTICLE_1_MASK_MAP3 (1 << 13)
#define FLAG_BIT_PARTICLE_1_NOISE_MASKMAP (1 << 14)
#define FLAG_BIT_PARTICLE_1_ANIMATION_SHEET_HELPER (1 << 15)
#define FLAG_BIT_PARTICLE_1_PROGRAM_NOISE_VORONOI (1 << 16)
#define FLAG_BIT_PARTICLE_1_UIEFFECT_SPRITE_MODE (1 << 17)
#define FLAG_BIT_PARTICLE_1_USE_TEXCOORD1 (1 << 18)
#define FLAG_BIT_PARTICLE_1_USE_TEXCOORD2 (1 << 19)
#define FLAG_BIT_PARTICLE_1_CYLINDER_CORDINATE (1 << 20)
#define FLAG_BIT_PARTICLE_1_UV_FROM_MESH (1 << 21)
#define FLAG_BIT_PARTICLE_1_UIEFFECT_BASEMAP_MODE (1 << 22)
#define FLAG_BIT_PARTICLE_1_IS_PARTICLE_SYSTEM (1 << 23)
#define FLAG_BIT_PARTICLE_1_MAINTEX_CONTRAST (1 << 24)
#define FLAG_BIT_PARTICLE_1_VERTEXOFFSET_START_FROM_ZERO (1 << 25)
#define FLAG_BIT_PARTICLE_1_VERTEXOFFSET_MASKMAP (1 << 26)
#define FLAG_BIT_PARTICLE_1_MAINTEX_COLOR_REFINE (1 << 27)
#define FLAG_BIT_PARTICLE_1_BUMP_TEX_UV_FOLLOW_MAINTEX (1 << 28)
#define FLAG_BIT_PARTICLE_1_SIXWAY_RAMPMAP (1 << 29)
#define FLAG_BIT_PARTICLE_1_MATCAP_MULTY_MODE (1 << 30)
//WrapMode不能够超过16位因为会占用x和x+16两个bit位
#define FLAG_BIT_WRAPMODE_BASEMAP (1 << 0)
#define FLAG_BIT_WRAPMODE_MASKMAP (1 << 1)
#define FLAG_BIT_WRAPMODE_MASKMAP2 (1 << 2)
#define FLAG_BIT_WRAPMODE_NOISEMAP (1 << 3)
#define FLAG_BIT_WRAPMODE_EMISSIONMAP (1 << 4)
#define FLAG_BIT_WRAPMODE_DISSOLVE_MAP (1 << 5)
#define FLAG_BIT_WRAPMODE_DISSOLVE_MASKMAP (1 << 6)
#define FLAG_BIT_WRAPMODE_DISSOLVE_RAMPMAP (1 << 7)
#define FLAG_BIT_WRAPMODE_COLORBLENDMAP (1 << 8)
#define FLAG_BIT_WRAPMODE_VERTEXOFFSETMAP (1 << 9)
#define FLAG_BIT_WRAPMODE_PARALLAXMAPPINGMAP (1 << 10)
#define FLAG_BIT_WRAPMODE_MASKMAP3 (1 << 11)
#define FLAG_BIT_WRAPMODE_NOISE_MASKMAP (1 << 12)
#define FLAG_BIT_WRAPMODE_VERTEXOFFSET_MASKMAP (1 << 13)
#define FLAG_BIT_WRAPMODE_BUMPTEX (1 << 14)
#define FLAG_BIT_WRAPMODE_RAMP_COLOR_MAP (1 << 15)
#define FLAGBIT_POS_0_CUSTOMDATA_MAINTEX_OFFSET_X (0*4)
#define FLAGBIT_POS_0_CUSTOMDATA_MAINTEX_OFFSET_Y (1*4)
#define FLAGBIT_POS_0_CUSTOMDATA_DISSOLVE_INTENSITY (2*4)
#define FLAGBIT_POS_0_CUSTOMDATA_HUESHIFT (3*4)
#define FLAGBIT_POS_0_CUSTOMDATA_MASK_OFFSET_X (4*4)
#define FLAGBIT_POS_0_CUSTOMDATA_MASK_OFFSET_Y (5*4)
#define FLAGBIT_POS_0_CUSTOMDATA_FRESNEL_OFFSET (6*4)
#define FLAGBIT_POS_0_CUSTOMDATA_CHORATICABERRAT_INTENSITY (7*4)
#define FLAGBIT_POS_1_CUSTOMDATA_DISSOLVE_OFFSET_X (0*4)
#define FLAGBIT_POS_1_CUSTOMDATA_DISSOLVE_OFFSET_Y (1*4)
#define FLAGBIT_POS_1_CUSTOMDATA_NOISE_INTENSITY (2*4)
#define FLAGBIT_POS_1_CUSTOMDATA_SATURATE (3*4)
#define FLAGBIT_POS_1_CUSTOMDATA_VERTEX_OFFSET_X (4*4)
#define FLAGBIT_POS_1_CUSTOMDATA_VERTEX_OFFSET_Y (5*4)
#define FLAGBIT_POS_1_CUSTOMDATA_VERTEXOFFSET_INTENSITY (6*4)
#define FLAGBIT_POS_1_CUSTOMDATA_DISSOLVE_MASK_INTENSITY (7*4)
#define FLAGBIT_POS_2_CUSTOMDATA_DISSOLVE_NOISE1_OFFSET_X (0*4)
#define FLAGBIT_POS_2_CUSTOMDATA_DISSOLVE_NOISE1_OFFSET_Y (1*4)
#define FLAGBIT_POS_2_CUSTOMDATA_DISSOLVE_NOISE2_OFFSET_X (2*4)
#define FLAGBIT_POS_2_CUSTOMDATA_DISSOLVE_NOISE2_OFFSET_Y (3*4)
#define FLAGBIT_POS_2_CUSTOMDATA_NOISE_DIRECTION_X (4*4)
#define FLAGBIT_POS_2_CUSTOMDATA_NOISE_DIRECTION_Y (5*4)
#define FLAGBIT_POS_2_CUSTOMDATA_MAINTEX_CONTRAST (6*4)
#define FLAGBIT_POS_2_CUSTOMDATA_VAT_FRAME (7*4)
#define FLAGBIT_POS_3_CUSTOMDATA_VERTEX_OFFSET_MASK_X (0*4)
#define FLAGBIT_POS_3_CUSTOMDATA_VERTEX_OFFSET_MASK_Y (1*4)
#define FLAGBIT_POS_3_CUSTOMDATA_SHARED_UV_OFFSET_X (2*4)
#define FLAGBIT_POS_3_CUSTOMDATA_SHARED_UV_OFFSET_Y (3*4)
#define FLAGBIT_POS_3_CUSTOMDATA_EMISSION_OFFSET_X (4*4)
#define FLAGBIT_POS_3_CUSTOMDATA_EMISSION_OFFSET_Y (5*4)
#define FLAGBIT_POS_3_CUSTOMDATA_COLOR_BLEND_OFFSET_X (6*4)
#define FLAGBIT_POS_3_CUSTOMDATA_COLOR_BLEND_OFFSET_Y (7*4)
#define isCustomDataBit (1 << 3)
#define Data12Bit (1 << 2)
#define DataXYorZWBit (1 << 1)
#define DataXZorYWBit (1 << 0)
#define FLAG_BIT_UVMODE_POS_0_MAINTEX (0*2)
#define FLAG_BIT_UVMODE_POS_0_MASKMAP (1*2)
#define FLAG_BIT_UVMODE_POS_0_MASKMAP_2 (2*2)
#define FLAG_BIT_UVMODE_POS_0_MASKMAP_3 (3*2)
#define FLAG_BIT_UVMODE_POS_0_NOISE_MAP (4*2)
#define FLAG_BIT_UVMODE_POS_0_NOISE_MASK_MAP (5*2)
#define FLAG_BIT_UVMODE_POS_0_EMISSION_MAP (6*2)
#define FLAG_BIT_UVMODE_POS_0_DISSOLVE_MAP (7*2)
#define FLAG_BIT_UVMODE_POS_0_DISSOLVE_MASK_MAP (8*2)
#define FLAG_BIT_UVMODE_POS_0_COLOR_BLEND_MAP (9*2)
#define FLAG_BIT_UVMODE_POS_0_VERTEX_OFFSET_MAP (10*2)
#define FLAG_BIT_UVMODE_POS_0_VERTEX_OFFSET_MASKMAP (11*2)
#define FLAG_BIT_UVMODE_POS_0_BUMPTEX (12*2)
#define FLAG_BIT_UVMODE_POS_0_RAMP_COLOR_MAP (13*2)
#define FLAG_BIT_UVMODE_POS_0_PROGRAM_NOISE (14*2)
#define FLAG_BIT_UVMODE_POS_0_SHAREDUV (15*2)
#define FLAG_BIT_COLOR_CHANNEL_POS_0_MAINTEX_ALPHA (0*2)
#define FLAG_BIT_COLOR_CHANNEL_POS_0_MASKMAP1 (1*2)
#define FLAG_BIT_COLOR_CHANNEL_POS_0_MASKMAP2 (2*2)
#define FLAG_BIT_COLOR_CHANNEL_POS_0_MASKMAP3 (3*2)
#define FLAG_BIT_COLOR_CHANNEL_POS_0_NOISE_MASK (4*2)
#define FLAG_BIT_COLOR_CHANNEL_POS_0_DISSOLVE_MAP (5*2)
#define FLAG_BIT_COLOR_CHANNEL_POS_0_DISSOLVE_MASK_MAP (6*2)
#define FLAG_BIT_COLOR_CHANNEL_POS_0_RAMP_COLOR_MAP (7*2)
float GetCustomData(uint flagProperty,int flagPos,float orignValue,half4 cutstomData1,half4 customData2)
{
uint bit = flagProperty >> flagPos;
// bit &= 15;// binary 1111 这一步可能是没必要的。
UNITY_BRANCH
if((bit & isCustomDataBit) == 0)
{
return orignValue;
}
else
{
half4 customData = 0;
if((bit & Data12Bit))
{
customData = cutstomData1;
}
else
{
customData = customData2;
}
if(bit & DataXYorZWBit)
{
if(bit & DataXZorYWBit)
{
return customData.x;
}
else
{
return customData.y;
}
}
else
{
if(bit & DataXZorYWBit)
{
return customData.z;
}
else
{
return customData.w;
}
}
}
return 999;//提示错误
}
struct BaseUVs
{
float2 defaultUVChannel;
float2 specialUVChannel;
float2 uvAfterTwirlPolar;
float2 cylinderUV;
float2 mainTexUV;
float2 screenUV;
float2 worldPosUV;
float2 objectPosUV;
float2 sharedUV;
};
float2 GetUVByUVMode(uint flagProperty,uint flagTypeProperty,int flagPos,BaseUVs baseUVs)
{
flagProperty = flagProperty >> flagPos;
flagProperty &= 3;
flagTypeProperty = flagTypeProperty >> flagPos;
flagTypeProperty &= 3;
switch (flagTypeProperty)
{
case 0:
switch(flagProperty)
{
case 0:
return baseUVs.defaultUVChannel;
case 1:
return baseUVs.specialUVChannel;
case 2:
return baseUVs.uvAfterTwirlPolar;
case 3:
return baseUVs.cylinderUV;
default:
return baseUVs.defaultUVChannel;
}
case 1:
switch(flagProperty)
{
case 0:
return baseUVs.mainTexUV;
case 1:
return baseUVs.screenUV;
case 2:
return baseUVs.worldPosUV;
case 3:
return baseUVs.objectPosUV;
default:
return baseUVs.defaultUVChannel;
}
case 2:
switch(flagProperty)
{
case 0:
return baseUVs.sharedUV;
default:
return baseUVs.defaultUVChannel;
}
default:
return baseUVs.defaultUVChannel;
}
}
half Blend_HardLight(half Base, half Blend)
{
half result1 = 1.0 - 2.0 * (1.0 - Base) * (1.0 - Blend);
half result2 = 2.0 * Base * Blend;
half zeroOrOne = step(Blend, 0.5);
half Out = result2 * zeroOrOne + (1 - zeroOrOne) * result1;
return Out;
}
#define FLAG_BIT_PNOISE_BLEND_POS_0_BASE_BLEND (0*3)
#define FLAG_BIT_PNOISE_BLEND_POS_0_MASK (1*3)
#define FLAG_BIT_PNOISE_BLEND_POS_0_DISSOLVE (2*3)
#define FLAG_BIT_PNOISE_BLEND_POS_0_DISTORT (3*3)
#define FLAG_BIT_PNOISE_BLEND_POS_0_MAINTEX (4*3)
half BlendPNoise(uint flagProperty,int flagPos,half source,half pNoise,half opacity)
{
flagProperty = flagProperty >> flagPos;
flagProperty &= 7;
switch(flagProperty)
{
case 0:
return source;
case 1:
return lerp(source,pNoise*source,opacity);
case 2:
return lerp(source,min(pNoise,source),opacity);
case 3:
return lerp(source,Blend_HardLight(source,pNoise),opacity);
default:
return source;
}
}
//ForDistort
half2 BlendPNoise(uint flagProperty,int flagPos,half2 source,half2 pNoise,half opacity)
{
flagProperty = flagProperty >> flagPos;
flagProperty &= 7;
switch(flagProperty)
{
case 0:
return source;
case 1:
return lerp(source,pNoise*source,opacity);
case 2:
return lerp(source,min(pNoise,source),opacity);
case 3:
return lerp(source,Blend_HardLight(source,pNoise),opacity);
default:
return source;
}
}
#endif

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 4918b275ae4dce948a5cedc6f3612066
ShaderIncludeImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 9187c1d488f62d9458d6ce67858a43b3
ShaderIncludeImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 03da5256bb8bf0b4496b10ee6b449be4
ShaderIncludeImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 7184a95c20fc1a441a8815af4c795ccd
ShaderImporter:
externalObjects: {}
defaultTextures: []
nonModifiableTextures: []
userData:
assetBundleName:
assetBundleVariant: