您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
64 行
1.8 KiB
64 行
1.8 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEditor.Graphing;
|
|
|
|
namespace UnityEditor.ShaderGraph
|
|
{
|
|
public class ShaderSourceMap
|
|
{
|
|
// Indicates where a new node begins
|
|
List<int> m_LineStarts;
|
|
List<INode> m_Nodes;
|
|
int m_LineCount;
|
|
|
|
internal ShaderSourceMap(string source, List<ShaderStringMapping> mappings)
|
|
{
|
|
m_LineStarts = new List<int>();
|
|
m_Nodes = new List<INode>();
|
|
|
|
var line = 0;
|
|
var currentIndex = 0;
|
|
foreach (var mapping in mappings)
|
|
{
|
|
var stopIndex = mapping.startIndex + mapping.count;
|
|
if (currentIndex >= stopIndex)
|
|
continue;
|
|
|
|
m_LineStarts.Add(line);
|
|
m_Nodes.Add(mapping.node);
|
|
|
|
while (currentIndex < stopIndex && currentIndex != -1)
|
|
{
|
|
currentIndex = source.IndexOf('\n', currentIndex+1);
|
|
line++;
|
|
}
|
|
|
|
if (currentIndex == -1)
|
|
break;
|
|
}
|
|
|
|
m_LineCount = line;
|
|
}
|
|
|
|
public INode FindNode(int line)
|
|
{
|
|
if (line >= m_LineCount || line < 0)
|
|
return null;
|
|
var l = 0;
|
|
var r = m_LineStarts.Count - 1;
|
|
while (l <= r)
|
|
{
|
|
var m = (l + r) / 2;
|
|
var lineStart = m_LineStarts[m];
|
|
var lineStop = m == m_LineStarts.Count ? m_LineCount : m_LineStarts[m + 1];
|
|
if (line >= lineStop)
|
|
l = m + 1;
|
|
else if (line < lineStart)
|
|
r = m - 1;
|
|
else
|
|
return m_Nodes[m];
|
|
}
|
|
throw new Exception("Something went wrong in binary search");
|
|
}
|
|
}
|
|
}
|