VisualShaderNodeCustom
C#-ресурс для собственного блока графа Visual Shader.
Объявляет порты и генерирует шейдерные инструкции через переопределения _GetInputPort*(), _GetOutputPort*() и _GetCode(). Для автоматического обнаружения в редакторе используйте [Tool, GlobalClass]. EditorPlugin и plugin.cfg для одного блока не нужны. Узел графа не является игровой Entity.
Строки _GetCode() написаны на шейдерном языке, а не на C#. Используйте переданные inputVars/outputVars и уникальные имена общих функций. Для живого C#-блока не вызывайте Dispose() после передачи графу: это отсоединяет его скриптовое поведение.
Рабочий пример, сохранение и ограничения проверки.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
VisualShaderNodeCustomКонструктор
public VisualShaderNodeCustom();Свойства2
InitializedСвойство
public bool Initialized { get; set; }Внутренний флаг инициализации элемента редактора. Не используйте его как признак GPU-компиляции или готовности материала. При true обычные методы изменения начальных входов пользовательского блока ограничены.
PropertiesСвойство
public string Properties { get; set; }Внутреннее сериализованное представление выбора выпадающих настроек. Для объявления вариантов используйте _GetProperty*(), а для чтения выбора — GetOptionIndex(); не собирайте строку вручную.
Методы22
GetOptionIndexint
public int GetOptionIndex(int option);Читает сохранённый выбор выпадающей настройки для генерации кода. Если для настройки нет сохранённого значения, native-реализация возвращает 0.
| Имя | Тип | По умолчанию |
|---|---|---|
option | int | — |
optionИндекс выпадающей настройки, не номер входного порта.
intИндекс выбранного варианта.
_GetCategorystring
public virtual string _GetCategory();Задаёт путь категории пользовательского блока, например Reckfell/Color. Редактор добавляет префикс Addons; разделитель / создаёт вложенность. Не применяйте ограничения имени блока к всему пути.
stringПуть категории без обязательного префикса Addons.
_GetCodestring
public virtual string _GetCode(Reckfell.Collections.Array<string> inputVars, Reckfell.Collections.Array<string> outputVars, Shader.Mode mode, VisualShader.Type type);Возвращает инструкции на шейдерном языке Reckfell для одного экземпляра блока. Используйте выражения inputVars и присваивайте результаты outputVars; подписи портов не заменяют эти строки. Не объявляйте общую функцию повторно в каждом экземпляре.
| Имя | Тип | По умолчанию |
|---|---|---|
inputVars | Reckfell.Collections.Array<string> | — |
outputVars | Reckfell.Collections.Array<string> | — |
mode | Shader.Mode | — |
type | VisualShader.Type | — |
inputVarsГотовые выражения или имена переменных входов в порядке индексов.
outputVarsИмена переменных выходов, которым нужно присвоить результаты.
modeРежим шейдера: например CanvasItem или Spatial.
typeЭтап графа, например Fragment.
stringТекст тела вычисления, например result = mix(a, b, weight); с фактическими именами из аргументов.
_GetDefaultInputPortint
public virtual int _GetDefaultInputPort(VisualShaderNode.PortType type);Выбирает вход при создании блока протягиванием связи в пустую область графа. Возвращайте подходящий индекс для переданного типа. В native-реализации 1.0.0 без переопределения возвращается 0.
| Имя | Тип | По умолчанию |
|---|---|---|
type | VisualShaderNode.PortType | — |
typeТип протягиваемой связи.
intИндекс входного порта.
_GetDescriptionstring
public virtual string _GetDescription();Задаёт пояснение блока в окне добавления. Кратко укажите вычисление, диапазоны и ограничения режима.
stringТекст описания.
_GetFuncCodestring
public virtual string _GetFuncCode(Shader.Mode mode, VisualShader.Type type);Добавляет общий код в начало функций шейдера для данного типа блока. Порядок вставки кода разных пользовательских типов не определён; не стройте между ними зависимость от порядка.
| Имя | Тип | По умолчанию |
|---|---|---|
mode | Shader.Mode | — |
type | VisualShader.Type | — |
modeРежим шейдера.
typeЭтап, для функции которого генерируется код.
stringИнструкции для начала функции или пустая строка.
_GetGlobalCodestring
public virtual string _GetGlobalCode(Shader.Mode mode);Добавляет общие объявления вне функций шейдера. Для одного использованного C#-скрипта генератор добавляет их один раз, даже при нескольких экземплярах. Используйте уникальные имена и не храните здесь состояние отдельного экземпляра.
| Имя | Тип | По умолчанию |
|---|---|---|
mode | Shader.Mode | — |
modeРежим генерируемого шейдера.
stringГлобальные объявления на шейдерном языке или пустая строка.
_GetInputPortCountint
public virtual int _GetInputPortCount();Задаёт число входных портов блока. Методы имени, типа и значения получают индексы от 0 до этого количества минус один.
intКоличество входов; без переопределения входов нет.
_GetInputPortDefaultValueVariant
public virtual Variant _GetInputPortDefaultValue(int port);Возвращает начальное значение неподключённого входа. Редактор применяет callback при добавлении блока через UI. В 1.0.0 программный VisualShader.AddNode() сам эти значения не записывает: явно вызовите SetInputPortDefaultValue() после добавления.
| Имя | Тип | По умолчанию |
|---|---|---|
port | int | — |
portИндекс порта с нуля.
VariantVariant с типом, соответствующим порту; Nil означает отсутствие заданного значения.
_GetInputPortNamestring
public virtual string _GetInputPortName(int port);Задаёт подпись входного порта. Это не готовое имя переменной GPU: в _GetCode() используйте переданное выражение inputVars[port].
| Имя | Тип | По умолчанию |
|---|---|---|
port | int | — |
portИндекс порта с нуля.
stringПодпись входа.
_GetInputPortTypeVisualShaderNode.PortType
public virtual VisualShaderNode.PortType _GetInputPortType(int port);Задаёт тип данных входа. Согласуйте его со значением по умолчанию и выражениями шейдерного кода; Vector3D соответствует vec3, Scalar — float.
| Имя | Тип | По умолчанию |
|---|---|---|
port | int | — |
portИндекс порта с нуля.
VisualShaderNode.PortTypeТип указанного входа.
_GetNamestring
public virtual string _GetName();Задаёт имя блока в списке добавления и графе. Для регистрации в редакторе используйте допустимый ASCII-идентификатор без пробелов, например BlendTint.
stringИмя блока.
_GetOutputPortCountint
public virtual int _GetOutputPortCount();Задаёт число выходных портов блока. Каждому вычисляемому выходу присвойте значение в _GetCode().
intКоличество выходов; без переопределения выходов нет.
_GetOutputPortNamestring
public virtual string _GetOutputPortName(int port);Задаёт подпись выходного порта. В _GetCode() присваивайте результат outputVars[port], а не строке подписи.
| Имя | Тип | По умолчанию |
|---|---|---|
port | int | — |
portИндекс порта с нуля.
stringПодпись выхода.
_GetOutputPortTypeVisualShaderNode.PortType
public virtual VisualShaderNode.PortType _GetOutputPortType(int port);Задаёт тип данных выхода; генерируемое присваивание должно выдавать совместимое значение.
| Имя | Тип | По умолчанию |
|---|---|---|
port | int | — |
portИндекс порта с нуля.
VisualShaderNode.PortTypeТип указанного выхода.
_GetPropertyCountint
public virtual int _GetPropertyCount();Задаёт число выпадающих настроек пользовательского блока; это не число входных портов. Для каждой задайте имя, список вариантов и при необходимости начальный индекс.
intКоличество выпадающих настроек.
_GetPropertyDefaultIndexint
public virtual int _GetPropertyDefaultIndex(int index);Задаёт начальный индекс выбранного варианта выпадающей настройки. Он должен соответствовать массиву _GetPropertyOptions().
| Имя | Тип | По умолчанию |
|---|---|---|
index | int | — |
indexИндекс выпадающей настройки с нуля.
intИндекс выбранного варианта с нуля.
_GetPropertyNamestring
public virtual string _GetPropertyName(int index);Задаёт подпись выпадающей настройки блока.
| Имя | Тип | По умолчанию |
|---|---|---|
index | int | — |
indexИндекс выпадающей настройки с нуля.
stringПодпись настройки.
_GetPropertyOptionsstring[]
public virtual string[] _GetPropertyOptions(int index);Задаёт упорядоченный список вариантов выпадающей настройки. Выбранный индекс читается через GetOptionIndex().
| Имя | Тип | По умолчанию |
|---|---|---|
index | int | — |
indexИндекс выпадающей настройки с нуля.
string[]Массив подписей вариантов.
_GetReturnIconTypeVisualShaderNode.PortType
public virtual VisualShaderNode.PortType _GetReturnIconType();Выбирает значок типа результата в списке добавления. Это метаданные UI; настоящие типы выходов задаются _GetOutputPortType().
VisualShaderNode.PortTypeТип порта для значка.
_IsAvailablebool
public virtual bool _IsAvailable(Shader.Mode mode, VisualShader.Type type);Фильтрует доступность блока по режиму и этапу графа; по умолчанию true. Не переводит шейдерный код в другой режим и не доказывает его GPU-совместимость.
| Имя | Тип | По умолчанию |
|---|---|---|
mode | Shader.Mode | — |
type | VisualShader.Type | — |
modeПроверяемый режим шейдера.
typeПроверяемый этап графа.
booltrue для допустимого контекста, false для исключения.
_IsHighendbool
public virtual bool _IsHighend();Помечает блок как требующий возможностей Forward+ или Mobile в списке добавления. По умолчанию false. Это подсказка редактора, а не переключение рендерера и не замена проверки GPU-кода.
booltrue для отметки high-end, иначе false.