CPlusPlus DAT 完全ガイド | 使い方・パラメータ解説【TouchDesigner】

※当サイトにはプロモーションリンクが含まれます。

CPlusPlus DAT の C++ プラグイン読み込み機能を示す図

記事更新の通知はXでアナウンス٩(๑❛ᴗ❛๑)
@maru6o6をフォロー

概要 📖 – 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

Tips

初心者の方は、以下日本語書籍も手元にあると安心です。

まる。
まる。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!


パラメータ解説 ⚙️

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 ExtensionCustom Extension のときに適用される拡張子:

  • Custom Extension 文字列: Edit/View Extensioncustom のときに使用される任意のファイル拡張子

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++ で実装する。

  1. Visual Studio / Xcode で DAT_CPlusPlusBase を継承したクラスを実装し .dll / .dylib をビルド
  2. CPlusPlus DAT の Plugin Path にビルド成果物のパスを指定
  3. 入力に Serial DAT を接続し、execute() 内で inputs[0] からバイト列を取得
  4. プラグイン内で各フィールドを appendRow() で出力テーブルに書き込み
  5. 後段の DAT to CHOP で数値列をチャンネル化

Example 2: C++ ライブラリで高速文字列処理を実装 ⚙️

Text DAT → CPlusPlus DAT (regex / ICU) → Table DAT

boost::regex や ICU など Python では扱いづらい C++ ライブラリを取り込み、大量テキストのトークナイズ・正規化結果をテーブルに出力する。Python 実装と比較しクック時間を大幅短縮できる。

  1. Text DAT でソーステキストを保持し、CPlusPlus DAT の入力に接続
  2. プラグイン側で boost / ICU をリンクし、execute() 内で入力テキストを取得
  3. 解析結果 (トークン / マッチ / 正規化済文字列) を行単位で appendRow() 出力
  4. プラグインの再コンパイル時は Unload Plugin パルスで上書き可能に

Example 3: プロトタイプから配布用プラグインへの移行 🚀

Script DAT (Python prototype) → CPlusPlus DAT (compiled plugin) → Table DAT

Script DAT の Python 実装でロジックを固めた後、配布性能要件のため C++ プラグインに移植する流れ。Python 版と同じ入出力契約を維持しつつクラスを書き換える。

  1. Script DAT で onCook ベースの Python 実装を作成し挙動を確定
  2. 同じ入出力契約 (列構成 / セマンティクス) で C++ プラグインを実装
  3. CPlusPlus DAT に切り替えて出力テーブルを比較検証
  4. 差異がないことを確認した上で配布用 .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 DATnum_rows / num_cols を確認し、書き込みが実際に行われているか検証

参考資料 📚

その他 🔗

公式リソース 📖

この記事はLLMと共に内容を執筆、更新しています。
最新バージョンとの項目差異など、情報の不一致を見つけた心優しい方はXもしくはInsta、メールなどよりサイト管理者までご連絡ください😎


まる。

お仕事のご依頼はDM又はメールにて。
━━━━━━━━━━━━━━━━━
Python/Touchdesigner/M5Stackをこよなく愛すフルスタックエンジニア。
専門は生理心理学、趣味はヨガやサウナ、EMS電気風呂などヘルスケア全般。
脳波や筋電、心拍を中心とした生体情報のセンシング&インタラクティブアートづくりがライフワーク。

普段はワントゥーテンという会社で空間演出エンジニアをしています。
リファラル採用お繋ぎできますので、我こそはという尖った方は経歴と希望職種添えてDMください(エンジニア以外、営業職等もOK)。
ご飯行きましょう。

↓日常垢
Instagram:@malmal0v0

まる。をフォローする
その他の記事はこちら
Math Combine POP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
ZED Select TOP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
ZED POP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
Window COMP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
Widget COMP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】

タイトルとURLをコピーしました