К содержанию
fohbook/ TouchDesigner
уверенный

Ссылки, выражения и экспорт

Три способа связать узлы без провода и правила, по которым пишутся пути.

Провода передают данные, но управление чаще ходит мимо проводов: параметр одного узла берёт значение у другого. Способов три.

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

Двусторонняя связь двух параметров: меняете любой — меняются оба. Так связывают ручку на панели управления с реальным параметром в глубине сети.

Пути, которые не ломаются

  1. Внутри компонента — только относительные пути.
  2. Снаружи внутрь лезть не надо: компонент отдаёт данные через Out и принимает через свои параметры.
  3. Общие для проекта вещи — в одном месте (/project1/settings), и на них ссылаются коротким ярлыком.
  4. Никогда не пишите путь, который содержит имя, которое вы собираетесь поменять.
Ярлыки вместо длинных путей

У любого оператора на странице Common есть поле Global OP Shortcut и Internal OP Shortcut. Задали settings — и по всему проекту пишете op.settings или iop.settings вместо /project1/config/settings. Переименовали компонент — ничего не сломалось.

Выражение с поиском по сети — дорого

ops('*/render*') в параметре, который считается 60 раз в секунду, обходит дерево каждый кадр. Такие вещи делают один раз в скрипте и кладут результат в таблицу — Оптимизация.

рядом по смыслу