For openFrameworks Users
oFが好きなあなたなら、TrussCも気に入るはず。
oFユーザーなら、違和感なく書き始められます
クリエイティブコーディングの基本リズム。この構造は不変です。
ofApp
→
tcApp
使い心地を極力変えないように、手に馴染んだメソッド名を踏襲しています。
ofDrawCircle(x, y, r)
→
drawCircle(x, y, r)
あなたの好きなIDEを選べます。もちろんCursorでも。
長年のペインポイントに対するTrussCの回答
AppleがOpenGLを非推奨にし、Metalへ移行。
将来的な動作保証やパフォーマンス最適化が困難に。
いつサポートが切れるかわからない不安。
Metal / DirectX 12 / Vulkan / WebGPU に対応。
OSが推奨する最新のネイティブAPI上で動作するため、高速かつ省電力。
WebAssembly + WebGPU でブラウザへの移植性も高い。
oF本体はMITだが、依存ライブラリにGPLが混在。
FFmpegやFreeTypeなど、ライセンスを確認するのが大変。
クライアントワークで使うときに不安が残る。
GPL汚染ゼロを徹底。
すべての依存ライブラリが商用利用フレンドリー。
安心してクライアントワークに使える。
ofNode はあるが、親子関係の管理が手動。
子ノードの追加・削除でメモリ管理が複雑。
親が消えても子が残ってしまう問題も。
// shared_ptr ベースで自動管理
auto parent = Node::create();
auto child = Node::create();
parent->addChild(child);
// 親を破棄すれば子も自動的に解放される
// 循環参照も weak_ptr で安全に回避
ofThread はデータ競合を起こしやすい。
「3秒後に実行」を安全にやる標準的な方法がなく、
update内で時間計測してif文を書くとコードが汚くなる。
// メインスレッドで安全に遅延実行
node->callAfter(3.0f, []() {
// 3秒後にメインスレッドで実行
// Mutex 不要、データ競合の心配なし
});
// 繰り返し実行も簡単
node->callEvery(1.0f, []() {
// 1秒ごとに実行
});
ofSetLineWidth() はOpenGLの制限で太さ1px以上が保証されない。
macOS / Metal環境では完全に無視される。太い線を描くには自前でメッシュを生成するしかなかった。
beginStroke() / endStroke() を使うだけ。
ラインキャップやジョインも自動で綺麗に処理される。
// beginStroke/endStroke で美しい太線
setStrokeWeight(5.0f); // 5px の太線
beginStroke();
vertex(0, 0);
vertex(100, 50);
vertex(200, 0);
endStroke(); // キャップとジョインは自動
oFユーザーなら、すぐに馴染めるはず
TrussCのディレクトリ構成は、oFとよく似ています。
本体、examples、addonsなど、見覚えのある構成になっているはずです。
of_v0.12.0/ ├── addons/ ├── apps/ │ └── myApps/ │ └── myProject/ ├── examples/ ├── libs/ ├── projectGenerator/ └── scripts/
TrussC/ ├── addons/ ├── apps/ │ └── myApps/ │ └── myProject/ ├── examples/ ├── trussc/ ├── projectGenerator/ └── scripts/
oFと同じように、projectGeneratorでプロジェクトを作成できます。
見た目は昔のoFのようですが、機能は負けていません。
プロジェクトを作ったら、いつもどおり setup / update / draw を書くだけ。
ofApp が tcApp に、ofDrawCircle が drawCircle に変わるくらいで、
書き心地はほとんど同じです。
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でも活きます。
oFの関数、TrussCではこう書く
API対応表を読み込み中...
oFで培った経験は、そのまま活きる。