
概要 📖 – C++ プラグインで高速・低レベルなカスタム DAT を実装
CPlusPlus DATは、コンパイル済の C++ プラグインを読み込み、カスタムロジックでテーブル / テキスト出力を生成する DATです。Plugin Path で .dll / .dylib ファイルを指定すると、プラグイン内のクラスインスタンスが生成されクックごとに execute() 等のコールバックが呼ばれます。
主な用途 🎯
- 高パフォーマンスなカスタム DATをコンパイル済 C++ プラグイン (
.dll/.dylib) として実装 - 独自バイナリプロトコルのパース (シリアル / TCP / UDP の生バイト列をテーブル化)
- C++ ライブラリの統合 (boost / ICU / 既存社内 SDK 等を TouchDesigner に取り込む)
- 大量データの前処理で Python では速度不足な場合の代替実装
- クロスプラットフォーム配布可能な再利用 DAT コンポーネントの作成
データフロー 🔄
入力: 任意 (オプションで入力 DAT)
↓
C++ プラグイン (execute()等のコールバック)
↓
出力: テーブル / テキスト DAT
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Load Page 📋
プラグイン読み込み 📦
Plugin Path .plugin 📂
– 読み込む C++ プラグインのファイルパス (Windows: .dll / macOS: .dylib)
– パスは絶対パスまたは .toe ファイルからの相対パスで指定
– プラグインは DAT_CPlusPlusBase を継承したクラスを CreateDATInstance() でエクスポートする必要がある
Re-Init Class .reinit 🔁
– On (1) にすると、プラグインが作成したクラスのインスタンスを破棄して新規に生成し直す
– 内部状態をリセットしたい時 / プラグインを差し替えた後に使用
Re-Init Class (Pulse) .reinitpulse ⚡
– パルスで即座にクラスインスタンスを再生成
– トグル reinit を保持せず 1 回だけ再初期化したい場合に便利
Unload Plugin .unloadplugin 🚫
– パルスで現在のクラスインスタンスを破棄 + プラグインファイルをアンロード
– 同じプラグインを複数 DAT で読み込んでいる場合は、それら全てがアンロードしないとファイルは解放されない
– 再コンパイルした .dll / .dylib で上書きしたい時に必要 (Windows はロード中ファイル上書き不可)
Common Page 🔧
Language .language 📝
DAT が動作するスクリプト言語の決定方法
| 項目 | 内部名 | 説明 |
|---|---|---|
| Input | .input |
入力 DAT のスクリプト言語を使用 |
| Node | .node |
この DAT 自身のスクリプト言語を使用 |
Edit/View Extension .extension 📄
外部エディタに公開するファイル拡張子の選択
| 項目 | 内部名 | 説明 |
|---|---|---|
| dat | .dat |
汎用的なファイル拡張子 dat を使用 |
| From Language | .language |
DAT のスクリプト言語に応じた拡張子を自動選択 |
| Custom Extension | .custom |
Custom Extension で指定したカスタム拡張子を使用 |
Custom Extension .customext 🔤
Edit/View Extension が Custom Extension のときに適用される拡張子:
- Custom Extension 文字列:
Edit/View Extensionがcustomのときに使用される任意のファイル拡張子
Word Wrap .wordwrap 🔁
ノード表示でのワードラップ (折り返し) の有効化
| 項目 | 内部名 | 説明 |
|---|---|---|
| Input | .input |
入力 DAT の Word Wrap 設定を継承 |
| On | .on |
Word Wrap を有効化 (ノード上の長い行を折り返し表示) |
| Off | .off |
Word Wrap を無効化 (折り返さずそのまま表示) |
実践アイデア 💡
Example 1: 独自バイナリプロトコルをテーブル化 📡
Serial DAT → CPlusPlus DAT (custom parser) → Table DAT
シリアル接続から流れる独自バイナリプロトコルを C++ プラグインでパースし、フィールド毎に列分解したテーブルを後段で利用する典型フロー。Python では速度が足りないバイト列処理を C++ で実装する。
- Visual Studio / Xcode で
DAT_CPlusPlusBaseを継承したクラスを実装し.dll/.dylibをビルド - CPlusPlus DAT の
Plugin Pathにビルド成果物のパスを指定 - 入力に Serial DAT を接続し、
execute()内でinputs[0]からバイト列を取得 - プラグイン内で各フィールドを
appendRow()で出力テーブルに書き込み - 後段の DAT to CHOP で数値列をチャンネル化
Example 2: C++ ライブラリで高速文字列処理を実装 ⚙️
Text DAT → CPlusPlus DAT (regex / ICU) → Table DAT
boost::regex や ICU など Python では扱いづらい C++ ライブラリを取り込み、大量テキストのトークナイズ・正規化結果をテーブルに出力する。Python 実装と比較しクック時間を大幅短縮できる。
- Text DAT でソーステキストを保持し、CPlusPlus DAT の入力に接続
- プラグイン側で boost / ICU をリンクし、
execute()内で入力テキストを取得 - 解析結果 (トークン / マッチ / 正規化済文字列) を行単位で
appendRow()出力 - プラグインの再コンパイル時は
Unload Pluginパルスで上書き可能に
Example 3: プロトタイプから配布用プラグインへの移行 🚀
Script DAT (Python prototype) → CPlusPlus DAT (compiled plugin) → Table DAT
Script DAT の Python 実装でロジックを固めた後、配布性能要件のため C++ プラグインに移植する流れ。Python 版と同じ入出力契約を維持しつつクラスを書き換える。
- Script DAT で
onCookベースの Python 実装を作成し挙動を確定 - 同じ入出力契約 (列構成 / セマンティクス) で C++ プラグインを実装
- CPlusPlus DAT に切り替えて出力テーブルを比較検証
- 差異がないことを確認した上で配布用
.tox/.toeに同梱
関連オペレータ 🔗
類似機能OP 🔍
- Script DAT — Python 版のカスタム DAT。プロトタイプ / 軽量用途で代替
- CPlusPlus TOP — TOP family の C++ プラグイン版
- CPlusPlus CHOP — CHOP family の C++ プラグイン版
- CPlusPlus SOP — SOP family の C++ プラグイン版
組み合わせ推奨OP 🔄
- Table DAT — プラグインが書き出すテーブルの確定先として併用
- DAT to CHOP — プラグイン出力の数値列を CHOP チャンネル化
- Serial DAT — シリアルデバイスからのバイト列を入力ソースとして渡す
- Web Client DAT — HTTP レスポンスをプラグインの入力として整形
- DAT Execute DAT — 入力 DAT の変化をトリガに CPlusPlus DAT を再クック
前処理・後処理DAT 🎯
Info DAT情報 📊
CPlusPlus DAT は Info DAT による詳細情報取得に対応しています (num_rows / num_cols / total_cooks / cook_time 等の標準チャンネルを取得可能)。
DAT 固有情報 📋
num_rows: DAT の行数num_cols: DAT の列数type: DAT の型 (table / text)is_table: テーブル形式の場合 1、テキスト形式の場合 0
汎用オペレータ情報 🔄
total_cooks: プロセス開始からのクック回数cook_time: 最後のクック時間 (ミリ秒)cook_frame: 最後にクックされたフレーム番号warnings: 警告数errors: エラー数
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: プラグインが読み込まれない / Error: could not load plugin
✅ Solution:
Plugin Pathが正しいファイルを指しているか確認 (絶対パスで一度試す)- プラグインのアーキテクチャが TouchDesigner と一致しているか確認 (現行 TouchDesigner は 64bit のみサポート)
- プラグインが依存する DLL (boost / OpenCV 等) がシステム PATH または同フォルダに存在するか確認
❌ Problem: プラグインを差し替えても変更が反映されない
✅ Solution:
Unload Pluginパルスを押してプラグインファイルをアンロードしてから再ビルド・上書き- Windows ではロード中の
.dllは上書き不可。同じプラグインを読んでいる他の CPlusPlus DAT も全て Unload する必要あり Re-Init Classパルスでクラスインスタンスを再生成して状態リセット
❌ Problem: プラグイン内で例外が起きると TouchDesigner ごとクラッシュする
✅ Solution:
- プラグイン側で
try / catchで例外を全捕捉し、戻り値 / エラーログで通知する設計に変更 - デバッグ時は Visual Studio / Xcode から TouchDesigner プロセスにアタッチしてブレークポイントを設定
- クラッシュの原因切り分けは Script DAT の Python 等価実装で先にロジックを検証してから C++ に移植
❌ Problem: 出力テーブルが空 / 期待した行数にならない
✅ Solution:
- プラグインの
execute()内でoutput->clear()を呼んで前回出力をリセットしているか確認 appendRow()の戻り値や引数の型 (OP_DATInput経由のセル取得) をデバッグ出力で確認- Info DAT で
num_rows/num_colsを確認し、書き込みが実際に行われているか検証
参考資料 📚
その他 🔗
- TouchDesigner Wiki — DAT 概要
- TouchDesigner Wiki — Category:DATs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

