WuhuIslandTesting/Library/PackageCache/com.unity.render-pipelines.universal@8148.0.7-4/Editor/ShaderInjector/SILexicon.cs
2025-01-07 02:06:59 +01:00

172 lines
No EOL
3.6 KiB
C#

#if UNITY_EDITOR
using System.Collections.Generic;
namespace SLZ.Bonelab
{
public class SILexicon
{
public enum CmdType : int
{
Invalid = -1,
InjectPoint = 0,
InjectDefault,
InjectBegin,
InjectEnd,
TexcoordCounter
}
public struct InjectorCommand
{
public CmdType command;
public int intParam;
public int cmdStartIndex;
public int cmdEndIndex;
public string strParam;
}
public static string injectorPrefix = "//#!";
public static Dictionary<string, CmdType> Lexicon = new Dictionary<string, CmdType>()
{
{ "INJECT_POINT", CmdType.InjectPoint },
{ "INJECT_DEFAULT", CmdType.InjectDefault },
{ "INJECT_BEGIN", CmdType.InjectBegin },
{ "INJECT_END", CmdType.InjectEnd },
{ "TEXCOORD", CmdType.TexcoordCounter },
};
public static Dictionary<CmdType, string> Lexicon2 = new Dictionary<CmdType, string>()
{
{ CmdType.InjectPoint, "INJECT_POINT" },
{ CmdType.InjectDefault, "INJECT_DEFAULT" },
{ CmdType.InjectBegin, "INJECT_BEGIN" },
{ CmdType.InjectEnd, "INJECT_END" },
{ CmdType.TexcoordCounter, "TEXCOORD" }
};
static SILexicon s_Instance;
public static SILexicon Instance
{
get
{
if (s_Instance == null)
s_Instance = new SILexicon();
return s_Instance;
}
}
SILexicon()
{
generateTree();
}
class TreeNode
{
public char nodeChar;
public CmdType command;
public List<TreeNode> nextNode;
public bool terminalNode;
}
TreeNode LexTreeHeadNode;
void generateTree()
{
string[] cmdArray = new string[Lexicon.Count];
Lexicon.Keys.CopyTo(cmdArray, 0);
List<string> commands = new List<string>(cmdArray);
LexTreeHeadNode = new TreeNode();
populateNode(ref LexTreeHeadNode, commands, 0);
}
void populateNode(ref TreeNode node, List<string> cmds, int index)
{
List<char> nextChars = new List<char>();
//Get list of strings with charact
for (int i = 0; i < cmds.Count; i++)
{
if (index < cmds[i].Length)
{
char idxChar = cmds[i][index];
if (!nextChars.Contains(idxChar))
{
nextChars.Add(idxChar);
}
}
else if (index == cmds[i].Length)
{
node.terminalNode = true;
node.command = Lexicon[cmds[i]];
//Debug.Log("Terminal Node: " + cmds[i] + " " + node.nodeChar);
}
}
if (nextChars.Count > 0)
{
node.nextNode = new List<TreeNode>();
int nextIndex = index + 1;
foreach (char nextChar in nextChars)
{
TreeNode treeNode = new TreeNode();
treeNode.nodeChar = nextChar;
List<string> nextCmds = new List<string>();
foreach (string currCmd in cmds)
{
if (currCmd[index] == nextChar)
{
nextCmds.Add(currCmd);
}
}
populateNode(ref treeNode, nextCmds, nextIndex);
node.nextNode.Add(treeNode);
}
}
}
public CmdType parseCommand(string word)
{
TreeNode CurrentNode = LexTreeHeadNode;
TreeNode nextNode = null;
for (int i = 0; i < word.Length; i++)
{
nextNode = null;
if (CurrentNode.nextNode != null)
{
foreach (TreeNode node in CurrentNode.nextNode)
{
if (node.nodeChar == word[i])
{
nextNode = node;
break;
}
}
}
if (nextNode != null)
{
CurrentNode = nextNode;
}
else
{
//Debug.LogError("Command Longer than tree");
return CmdType.Invalid;
}
}
if (CurrentNode != null && CurrentNode.terminalNode)
{
//Debug.Log("Valid Command " + CurrentNode.command);
return CurrentNode.command;
}
else
{
//Debug.LogError("Reached end of word without finding terminal node");
return CmdType.Invalid;
}
}
}
}
#endif