15
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

TouchDesignerAdvent Calendar 2021

Day 15

[ #TouchDesigner ] Replicator COMP を自在に使えるようになりたい記事

Last updated at Posted at 2021-12-14

Replicator COMP

オペレータを複製するために使うオペレータ

image.png

UI構築やデータからのオペレータ自動生成を簡易にするために用いられます

How to Use

  1. 複製したいオペレータ(Master Operater) を設定
  2. 複製方法を選択(TableDAT or 数値入力)
  3. Operator Prefixで複製されるオペレータの名前を指定

image.png

複製方法 (Replication Method)

複製方法は

  • DAT(Table)から指定
  • 数値で指定

の2種類があります

DATから複製する

  • Template DAT Table
    • 複製数などを決めるDATの指定
  • Name from Table
    • 複製されたオペレータの接尾語の付け方の設定
    • デフォルトだとDATの行番号
  • Ignore First Row
    • 最初の行を無視するかどうか、ヘッダーに情報を持っている場合などには無視しないほうが良('name'とか'path'とか持っているとき)

数値で指定

  • Number of Replicants
    • 複製数を整数で指定
    • 特定のCHOPの長さなどを参照すると良
  • Replicant Suffix Start
    • 接尾後の数値の開始番号

Maximun Operators

複製されるオペレータ数の上限値

APIや外部データを元にオペレータを複製する際に、想定以上の大量のデータが来ることは多々ありまう。
そのようなとき時に(例えば、10万行のデータのDAT)全てを複製してしまうとパフォーマンスに甚大な影響が出てしまします。
入力のDATや数値を事前に処理して必要な物だけを抜け出す処理は必要ですが、複製数の上限を設定してあげることで予期せぬ処理落ちやクラッシュなどを防ぐことができます。

Layout

複製したオペレータのレイアウトの設定

  • Off 一箇所に複製される
  • Horizontal 横並び
  • Vertical 縦並び
  • Grid グリッド
  • Layout Origin
    • レイアウトの基準点、最初に複製されるオペレータの位置、この位置からレイアウトがされる

Destination

複製するオペレータのできる階層の指定
特定のCompの中に生成するなどができる
参照切れなどに注意!

Incremental Update

1Frameに複製する数
複製時の処理落ちを回避できる

Callbacks DAT

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

def onReplicate(comp, allOps, newOps, template, master):
	for c in newOps:
		#c.display = True
		#c.render = True
		#c.par.display = 1
		#c.par.clone = comp.par.master
		pass
	return

オペレータが複製される時などに呼び出される関数

onReplicate

オペレータの複製時に呼び出される

arg 中身
comp 複製をするreplicatorCOMP
allOps 複製されたすべてのオペレータ
newOps 新規に複製されたオペレータ
template テンプレートDAT
master 複製元のオペレータ

新規に作り出されたオペレータにだけ処理をかけたりできる

onReplicate.py
def onReplicate(comp, allOps, newOps, template, master):
	for c in newOps:
		c.par.display = 1 # 複製時にDisplayをオン、マスターオペレータは表示させない時とかに
		pass
	return

onRemoveReplicant

templateDATの行数などが変化して複製数が減った際にその分減るオペレータに対しての処理
デフォルトだと行数が減る時は対応する数だけオペレータが削除される
replicant.destroy() を削除することにより、自動的には削除されないようになる

Clone

マスターオペレータを編集するたびにReplicatorCOMPのRecreateAllボタンなどを押すが手間な時などに使用

clone.py
def onReplicate(comp, allOps, newOps, template, master):
	for c in newOps:
		c.par.clone = comp.par.master
		pass

Callback関数をでマスターオペレータをクローンオペレータに設定してあげることによって、マスターオペレータの変更がそのまま複製先でも同じく反映されます
CloneについてはWikiをお読みください
https://docs.derivative.ca/Clone

Replicatorをもっと自在に使う

parent().digits

複製されたオペレータで名前の末尾につく数値を取得することができる
例えばButtonCOMPを複製し、背景となるTextTOPのTextにparent().digitsと入力します
image.png
そうすると背景には複製名の末尾の数字が表示されどのボタンなのかが一目瞭然となります
image.png

select DAT

複製先でテンプレートDATの自分のインデックスの行を取得し、そこのデータを使う際にSelectDATが役に立ちます。
上記のparent().digitsと併用し、行の選択をしてあげることで元となるDATから自分に必要な情報のみを取得できます
image.png

image.png

select CHOP

ButtonCOMPなどを複製した時に全てのオペレータの出力を取得する際にCompのアウトからMergeなどに繋ぐことが多いと思います
↓ こんな感じ
Screen Shot 2021-12-14 at 13.43.53.png

しかし複製ごとに繋ぎ直さなくてはならなかったり、Callback関数でConnectorsをごにょごにょして自動で繋いであげる処理を書いてあげるなど結構手間が掛かってるかと思います。
そんな時に便利なのがSelectChopです
パラメータのCHOPに item*/out1 と記述してあげるだけでitemと名のつくオペレータが持つout1というCHOPを取得することができます

Screen Shot 2021-12-14 at 13.47.56.png

この記述方法などは PatternMatching などを調べてみてください

execute DAT とか

executeDATのonCreate()を記述することにより、複製された際にScriptを走らせることができます。
またそれと同様にExtensionで拡張したCOMPを複製することにより生成時などにより柔軟に複製されたオペレータを扱うことができます

最後に

replicator 使ってこんなツールが作りたいですね、、

結局は細部の作りこみとかなのでそれ以外の部分でいかにreplicatorとかで自動的に生成ししたりして楽ができるかが大事なんじゃないですかね

15
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?