For openFrameworks Users

openFrameworks
ジャンキーのための
TrussC入門

oFが好きなあなたなら、TrussCも気に入るはず。

TrussCは、openFrameworksが築き上げた「クリエイティブコーディングの楽しさ」を深くリスペクトしています。

でも、oFが設計された2000年代と今では、ハードウェアもC++も大きく変わりました。
TrussCは、oFの精神を継承しながら、現代の環境に最適化した「次の10年の足場」です。

変わらないもの

oFユーザーなら、違和感なく書き始められます

setup, update, draw

クリエイティブコーディングの基本リズム。この構造は不変です。

ofApp tcApp

見たことあるメソッド名

使い心地を極力変えないように、手に馴染んだメソッド名を踏襲しています。

ofDrawCircle(x, y, r) drawCircle(x, y, r)

XCode / VS / VSCode に対応

あなたの好きなIDEを選べます。もちろんCursorでも。

CMake + clangd

oFで困っていたこと、解決しました

長年のペインポイントに対するTrussCの回答

困っていたこと

OpenGLがmacOSで非推奨に

AppleがOpenGLを非推奨にし、Metalへ移行。
将来的な動作保証やパフォーマンス最適化が困難に。
いつサポートが切れるかわからない不安。

TrussCの解決策

Sokolでネイティブバックエンド

Metal / DirectX 12 / Vulkan / WebGPU に対応。
OSが推奨する最新のネイティブAPI上で動作するため、高速かつ省電力。
WebAssembly + WebGPU でブラウザへの移植性も高い。

困っていたこと

商用利用でのライセンス問題

oF本体はMITだが、依存ライブラリにGPLが混在。
FFmpegやFreeTypeなど、ライセンスを確認するのが大変。
クライアントワークで使うときに不安が残る。

TrussCの解決策

MIT / zlib / Public Domain のみ

GPL汚染ゼロを徹底。
すべての依存ライブラリが商用利用フレンドリー。
安心してクライアントワークに使える。

困っていたこと

親子関係の管理が面倒

ofNode はあるが、親子関係の管理が手動。
子ノードの追加・削除でメモリ管理が複雑。
親が消えても子が残ってしまう問題も。

TrussCの解決策

shared_ptr ベースで自動管理

// shared_ptr ベースで自動管理
auto parent = Node::create();
auto child = Node::create();
parent->addChild(child);

// 親を破棄すれば子も自動的に解放される
// 循環参照も weak_ptr で安全に回避
困っていたこと

「3秒後に実行」を安全にやる方法がない

ofThread はデータ競合を起こしやすい。
「3秒後に実行」を安全にやる標準的な方法がなく、
update内で時間計測してif文を書くとコードが汚くなる。

TrussCの解決策

メインスレッドで安全な同期タイマー

// メインスレッドで安全に遅延実行
node->callAfter(3.0f, []() {
    // 3秒後にメインスレッドで実行
    // Mutex 不要、データ競合の心配なし
});

// 繰り返し実行も簡単
node->callEvery(1.0f, []() {
    // 1秒ごとに実行
});
困っていたこと

太線が描けない問題

ofSetLineWidth() はOpenGLの制限で太さ1px以上が保証されない。
macOS / Metal環境では完全に無視される。太い線を描くには自前でメッシュを生成するしかなかった。

TrussCの解決策

標準で美しい太線

beginStroke() / endStroke() を使うだけ。
ラインキャップやジョインも自動で綺麗に処理される。

// beginStroke/endStroke で美しい太線
setStrokeWeight(5.0f);  // 5px の太線
beginStroke();
vertex(0, 0);
vertex(100, 50);
vertex(200, 0);
endStroke();  // キャップとジョインは自動

開発の流れ

oFユーザーなら、すぐに馴染めるはず

フォルダ構成

TrussCのディレクトリ構成は、oFとよく似ています。
本体、examples、addonsなど、見覚えのある構成になっているはずです。

openFrameworks

of_v0.12.0/
├── addons/
├── apps/
│   └── myApps/
│       └── myProject/
├── examples/
├── libs/
├── projectGenerator/
└── scripts/

TrussC

TrussC/
├── addons/
├── apps/
│   └── myApps/
│       └── myProject/
├── examples/
├── trussc/
├── projectGenerator/
└── scripts/

projectGenerator

oFと同じように、projectGeneratorでプロジェクトを作成できます。
見た目は昔のoFのようですが、機能は負けていません。

TrussC projectGenerator

あとは書くだけ

プロジェクトを作ったら、いつもどおり setup / update / draw を書くだけ。
ofApptcApp に、ofDrawCircledrawCircle に変わるくらいで、
書き心地はほとんど同じです。

void tcApp::setup() {
    // いつもどおりのsetup
}

void tcApp::update() {
    // いつもどおりのupdate
}

void tcApp::draw() {
    clear(0.1, 0.1, 0.1);
    setColor(1, 0.5, 0);
    drawCircle(getWindowWidth()/2, getWindowHeight()/2, 100);
}

結構同じですよね?
oFで培った経験は、そのままTrussCでも活きます。

API対応表

oFの関数、TrussCではこう書く

API対応表を読み込み中...

さあ、始めよう

oFで培った経験は、そのまま活きる。