К содержанию
fohbookбета/ TouchDesigner

Репликатор и генерация сети

Replicator COMP размножает мастер по числу или по таблице, но копии становятся клонами, только если мастер клон сам себе. Колбэки, генерация скриптом и почему не во время шоу.

Ветка вашего пульта:
Быстрый выбор:

Двадцать одинаковых блоков, собранных руками, — это двадцать мест, где правку забудут. Нужен один мастер и механизм, который его размножит.

Replicator COMP

Это цикл for для операторов: копии мастера по числу или по строкам таблицы, и удаление лишних, когда таблица меняется. На странице Replicator Replication Method выбирает By Number с Number of Replicants или By Table, где строка таблицы — копия. Таблицу задаёт Template DAT Table, а Ignore First Row пропускает заголовки. Master Operator — что копировать, и это может быть не только компонент, но любой узел, хоть Movie File In TOP. Имена копий складываются из Operator Prefix и номера строки или значения из столбца (Name from Table), Destination решает, куда их класть, Layout — как расставить.

Сами по себе копии не клоны, и правка мастера на уже созданные не влияет. Чтобы они шли за мастером, мастер делают клоном самого себя — в его Clone Master пишут его же путь, — и тогда все копии становятся клонами.

Свои данные у копии

Через колбэки из Callbacks DAT:

def onReplicate(comp, allOps, newOps, template, master):
    for c in newOps:
        row = template.row(c.digits)   # или по имени
        c.par.Universe = int(row[1].val)
        c.par.Address  = int(row[2].val)
    return

def onRemoveReplicant(comp, replicant):
    replicant.destroy()
    return

onRemoveReplicant вызывается, когда копия больше не нужна — скажем, строку убрали из таблицы. Можно и без колбэка: выражение внутри мастера берёт строку по номеру в имени, op('table1')[parent().digits, 'address'] — Ссылки.

Что Таблица описывает
Экраны и выходы Разрешение, положение, монитор
Слои композиции Источник, режим наложения, прозрачность
Приборы света Юниверс, адрес, тип — Патч
Сцены шоу Файл, длительность, переход
Панели интерфейса Подпись, диапазон, адрес параметра

Структура проекта описана данными, и новый экран — это строка в CSV, а не полчаса в сетевом редакторе.

Скриптом

gen = parent().op('gen')
for c in gen.children:          # аккуратно: удаляет всё внутри gen
    c.destroy()
for i, row in enumerate(op('table1').rows()[1:]):
    n = gen.copy(op('master'), name=f'unit_{row[0].val}')
    n.nodeY = -150 * i
    n.par.Address = int(row[2].val)

Генерируют в отдельный контейнер, чтобы очистка не снесла лишнего, запускают кнопкой, а не каждый кадр, и помнят, что сгенерированная сеть сохранится в .toe и на площадке пересобираться не будет.

Не во время шоу

Создание и удаление узлов может занять десятки кадров. Строят заранее, при загрузке, а не когда зритель смотрит.

Одна таблица на проект

Из одной таблицы собираются экраны, приборы и сцены, и на вопрос «сколько у нас выходов» отвечает файл, а не память разработчика.

Нашли в статье ошибку, устаревшее или непонятное место?

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