Ссылки, выражения и экспорт
Три способа связать узлы без провода и правила, по которым пишутся пути.
Провода передают данные, но управление чаще ходит мимо проводов: параметр одного узла берёт значение у другого. Способов три.
op(), me, parent
op('noise1') # узел в этой же сети
op('../audio/analysis') # относительный путь вверх и вниз
op('/project1/scene/cam1') # абсолютный путь
me # сам узел, где написано выражение
me.par.Speed # свой параметр
me.parent() # компонент, внутри которого он лежит
parent().par.Intensity # параметр родителя — самая частая связка
parent(2) # на два уровня вверх
iop.settings # «внутренний» ярлык, заданный на компоненте
Относительные пути важнее, чем кажется. Компонент, внутри которого всё
написано через parent() и относительные пути, можно скопировать, склонировать
и вынести в .tox. Компонент с абсолютными путями сломается при первом же
копировании.
Что можно достать
op('lfo1')['chan1'] # значение канала (последний сэмпл)
op('lfo1')['chan1'].eval() # то же явно
op('table1')[2, 'name'] # ячейка таблицы
op('moviefilein1').width # свойство оператора
op('moviefilein1').par.file # параметр как объект
op('geo1').par.tx.eval() # вычисленное значение параметра
op('audio1').numSamples
me.time.frame # кадр локального таймлайна
absTime.seconds # секунды с запуска, не зависит от таймлайна
me.digits # число в конце имени узла: null7 → 7
me.digits — приём для клонов: двадцать одинаковых компонентов, у каждого
свой номер, и одно выражение раздаёт им разные строки таблицы.
Export: CHOP толкает значение
Обратное направление. На CHOP есть страница Export, где указывается, куда
уходят каналы. Или проще: перетащить канал из вьюера CHOP на параметр.
Когда что использовать:
| Expression | Export | |
|---|---|---|
| Кто инициирует | Параметр тянет | CHOP толкает |
| Где видно | В параметре | В CHOP и по зелёному цвету параметра |
| Массово | Неудобно | Удобно: сотни параметров одной таблицей |
| Гибкость | Любая логика | Только значение канала |
| Стоимость | Считается каждый кадр | Дешевле |
Для света и для интерфейсов почти всегда правильный ответ — Export.
Bind
Двусторонняя связь двух параметров: меняете любой — меняются оба. Так связывают ручку на панели управления с реальным параметром в глубине сети.
Пути, которые не ломаются
- Внутри компонента — только относительные пути.
- Снаружи внутрь лезть не надо: компонент отдаёт данные через
Outи принимает через свои параметры. - Общие для проекта вещи — в одном месте (
/project1/settings), и на них ссылаются коротким ярлыком. - Никогда не пишите путь, который содержит имя, которое вы собираетесь поменять.
У любого оператора на странице Common есть поле Global OP Shortcut и
Internal OP Shortcut. Задали settings — и по всему проекту пишете
op.settings или iop.settings вместо /project1/config/settings.
Переименовали компонент — ничего не сломалось.
ops('*/render*') в параметре, который считается 60 раз в секунду, обходит
дерево каждый кадр. Такие вещи делают один раз в скрипте и кладут результат
в таблицу — Оптимизация.