🦷

TouchDesigner C++を使う

2022/11/04に公開約8,800字

TouchDesignerで、C++周りのPluginを作るための試行錯誤を日記的に、
つまづくことをどんどんメモしておく。

随時更新
最終編集 : 2022/11/05

環境

環境1 home
macOS Catalina 10.15.7
cmake version 3.19.1
TouchDesigner Non Commercial 2022.29530

環境2 work
macOS Catalina
cmake version

satoruhiga/TouchDesigner-Plugin-Templateを動かす

C++でオリジナルのオペレーターを作る
https://note.com/toyoshimorioka/n/nce76daf98907
より、satoruhigaさんのTD用のC++を作るためのテンプレートのGitHubがあるのでそれを参考に動かそうと試みる。

以下がsatoruhigaさんの諸々のリンク
https://github.com/satoruhiga/TouchDesigner-Plugin-Template

Youtubeに上げてくれているこのTemplateのHow to動画
How to use TouchDesigner-Plugin-Template on Windows

How to use TouchDesigner-Plugin-Template on OSX

CMakeがbuildできない[未解決]

とりえあえず、satoruhigaさんのtutorialにそのまま従って、やるとcmake ..をするときに失敗する。

環境1では以下の文言

$ cmake -build .
CMake Deprecation Warning at CMakeLists.txt:1 (cmake_minimum_required):
  Compatibility with CMake < 2.8.12 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


-- Configuring done
-- Generating done
-- Build files have been written to: /Users/xxxxxxx/xxxxxxx/TouchDesigner/cppOP_storuhiga_test/TouchDesigner-Plugin-Template/build


CMake suite maintained and supported by Kitware (kitware.com/cmake).

cmakeのバージョン周りのエラーっぽい。
githubから撮ってきたまんまのCMakeLists.txtcmake_minimum_required(VERSION 2.8)を使っている。
なんかわからないけどここを参考にしてcmake_minimum_required(VERSION 3.13)にしてみた。

cmake ..からのcmake --build .

Scanning dependencies of target CustomSOP
[  5%] Building CXX object CMakeFiles/CustomSOP.dir/src/SOP_main.cpp.o
[ 10%] Building CXX object CMakeFiles/CustomSOP.dir/derivative/FrameQueue.cpp.o
[ 15%] Building C object CMakeFiles/CustomSOP.dir/derivative/GL/glew.c.o
[ 20%] Building C object CMakeFiles/CustomSOP.dir/derivative/GL/glewinfo.c.o
~~~~~~~~/cppOP_storuhiga_test/TouchDesigner-Plugin-Template/derivative/GL/glewinfo.c:13444:11: warning: 
      implicit declaration of function 'sscanf_s' is invalid in C99
      [-Wimplicit-function-declaration]
      if (sscanf_s(argv[p++], "%d.%d", &params->major, &params->minor) !...
          ^

.
.
.

      'CGLReleasePixelFormat' has been explicitly marked deprecated here
extern void CGLReleasePixelFormat(CGLPixelFormatObj pix) OPENGL_AVAILABL...
4 warnings generated.
[ 25%] Linking CXX CFBundle shared module ../out/CustomSOP.bundle/Contents/MacOS/CustomSOP
make[2]: ../bin/MacOSX/oscer: Permission denied
make[2]: *** [../out/CustomSOP.bundle/Contents/MacOS/CustomSOP] Error 1
make[1]: *** [CMakeFiles/CustomSOP.dir/all] Error 2
make: *** [all] Error 2

sscanf_s周りでなんかエラー出していて、binの中に入っているoscerという謎のもののPermission deniedになっている。oscerを見にいってみる

drwxr-xr-x  3 xxxx  staff       96 11  5 03:03 .
drwxr-xr-x  4 xxxx  staff      128 11  5 03:03 ..
-rw-r--r--  1 xxxx  staff  4096288 11  5 03:03 oscer

確かに実行権限がなさそうなんでchmodで与えてみる。ほんとは良くないんだろうけどめんどくさいから、chmod 777で全権限を与えた。
もう一回 build

4 warnings generated.
[ 25%] Linking CXX CFBundle shared module ../out/CustomSOP.bundle/Contents/MacOS/CustomSOP
ld: warning: directory not found for option '-L/Users/xxxxxx/programming/TouchDesigner/cppOP_storuhiga_test/TouchDesigner-Plugin-Template/libs/lib'
Undefined symbols for architecture x86_64:
  "_sscanf_s", referenced from:
      _glewParseArgs in glewinfo.c.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [../out/CustomSOP.bundle/Contents/MacOS/CustomSOP] Error 1
make[1]: *** [CMakeFiles/CustomSOP.dir/all] Error 2
make: *** [all] Error 2

oscer周りのエラーは消えた。けどdirectory not found ~~~~~~~~~/libs/libってでている。これがlinkできない的なことが書いてありそう。
たしかに現在の作業ディレクトリに/libs/libなんて存在しない。
だけど、CMakeLists.txtではなんかそこからライブラリ周りでなんかしようとしている。

CMakeLists.txt
include_directories(
    "src"
    "derivative"
    "derivative/GL"
    ${CMAKE_CURRENT_SOURCE_DIR}/libs/include
)

link_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/libs/lib
)

libsまわりだけコメントアウトしてみる。

だめ。

            ^
4 warnings generated.
[ 25%] Linking CXX CFBundle shared module ../out/CustomSOP.bundle/Contents/MacOS/CustomSOP
Undefined symbols for architecture x86_64:
  "_sscanf_s", referenced from:
      _glewParseArgs in glewinfo.c.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [../out/CustomSOP.bundle/Contents/MacOS/CustomSOP] Error 1
make[1]: *** [CMakeFiles/CustomSOP.dir/all] Error 2
make: *** [all] Error 2

sscanf_sglewinfo.c.oになんかしようとしている時にエラーだしてる?glewまわりのやつは./derivative/GL/にいる。

というか、CMakeLists.txtでSOPもCHOPもTOPもDATも作ろうとしているけど、やめればいいのでは?CHOPだけにしてみる。

BuiltCustomOp(CustomCHOP "src/CHOP_main.cpp" "")
# BuiltCustomOp(CustomSOP "src/SOP_main.cpp" "")
# BuiltCustomOp(CustomTOP "src/TOP_main.cpp" "")
# BuiltCustomOp(CustomDAT "src/DAT_main.cpp" "")

やりなおす。

[ 20%] Linking CXX CFBundle shared module ../out/CustomCHOP.bundle/Contents/MacOS/CustomCHOP
Undefined symbols for architecture x86_64:
  "_sscanf_s", referenced from:
      _glewParseArgs in glewinfo.c.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [../out/CustomCHOP.bundle/Contents/MacOS/CustomCHOP] Error 1
make[1]: *** [CMakeFiles/CustomCHOP.dir/all] Error 2
make: *** [all] Error 2

結局CustomCHOPをやるときにGLのなんかを使おうとして、エラーを出している。
[ 80%] Building C object CMakeFiles/CustomCHOP.dir/derivative/GL/glewinfo.c.oでエラーを出している。glewinfo.cのエラーが出ているからglewinfo.c.oがリンクできていないっぽい。
clang: error: linker command failed with exit code 1 (use -v to see invocation)リンクするファイルがたりてないということを 言っているらしい。

OpenGLまわりのGLEWまわりのことがさっっぱりわからないので詰んだ。

TD公式 Write a C plusplus Plugin

便利なものを使おうとしたのがわるいということで、一からTD公式のページからスタートする。

https://docs.derivative.ca/Write_a_CPlusPlus_Plugin
https://derivative.ca/UserGuide/Write_a_CPlusPlus_Plugin

TouchDesigner内のSamples/CPlusPlus/にsampleが入っている。
それぞれのsampleの中にvisual studioとxcodeのプロジェクトが入っている。

In general when the CPlusPlus OP cooks it will call some functions in your class which are asking some questions (for example, if the node should cook every frame). It will then call the execute() function where your class should do the actual work.
[引用] https://derivative.ca/UserGuide/Write_a_CPlusPlus_Plugin
C PlusPlus OPはcookするときにexcute()という関数を呼ぶようになっているらしい。

とりあえず、一回XCodeでやってみることにする。

Plugins on macOS are built as a bundle named with a .plugin extension. The sample will open and build with the latest version of Xcode on macOS.

Unlike Visual Studio, Xcode doesn't keep build products alongside project source code.
[引用] https://derivative.ca/UserGuide/Write_a_CPlusPlus_Plugin

bundle, .pluginとは


Bundleについて
https://zenn.dev/yukichi_tech/scraps/495f9828b44c80
.app的なことね。

bundleの構造
https://l-w-i.net/t/macosx/bundle_001.txt
.pluginというのもbundleの一部ということらしい。

プリケーションでアドオン利用可能なモジュール。拡張子は「.plugin」。
例) QuickTimeプラグイン
/Library/Internet Plug-Ins/QuickTime Plugin.plugin
[引用] https://l-w-i.net/t/macosx/bundle_001.txt


とりあえず、CHOP/CPlusPlusCHOPExample.xcodeprojを開いてみる。
基本構造として、CPlusPlus_Commonというのが共通で必要とされていて、OPの種類によって例えば、CHOPの場合は、
CHOP_CPlusPlusBase.hが必要とされるらしい。

とりあえず、訳もわからずBuildすると、succesして、TouchDesignerを開なったと言われる。おそらく、TouchDesignerのアプリの名前をバージョン名に変えているから。
デフォルトでは勝手開くようになっているみたい。

To use a debug build during development and testing, use Product > Build in Xcode, then switch to TouchDesigner and place a CPlusPlus CHOP or TOP and hit the + button beside the Plugin Path parameter, switch back to Xcode, and drag the plugin from the Products group in the left navigation pane to the choose file dialog on-screen from TouchDesigner. You can save the .toe to use for debugging so you don't have to repeat this (see the next section).
[引用] https://derivative.ca/UserGuide/Write_a_CPlusPlus_Plugin

TDのCPlusPlus OPのplugin pathに.dllや.pluginを選ばないといけないんだが、xcodeの左側のフォルダメニューからProductsにある、.pluginを直接ドラッグアンドロップして、TDに投げると動いた。


コード読んでないからまだわからないけどLFOみたいなものが動く。うれしい。

Console OUTPUT

SEEING CONSOLE OUTPUT
Messages sent to std::cout will appear in the console in Xcode's Debug area. Note: printing lines of text to the console has an impact on performance. Be sure to disable all printing when performance testing or shipping a finalized plugin.
[引用] https://derivative.ca/UserGuide/Write_a_CPlusPlus_Plugin

XCodeのdebug areaのコンソールにstd::coutとかするとちゃんと出力されるらしい。

Discussion

ログインするとコメントできます