初めに…
クリスタのフィルタプラグインを作ってみたいと思い、SDKのドキュメントを読んでみたら、C++一択だったんですよね。
C++は得意なんですが最近はずっとC#畑なので、せっかく作るなら.NETのエコシステムを活用したい。ということで、C++とC#をつなぐブリッジを自作しました。それが CSPBridge です。MITライセンスで公開しているので、興味があればぜひ使ってみてください。 https://github.com/sponsors/sdkikgeneral-spec/card
アーキテクチャの話
仕組みはこんな構造になっています。
CLIP STUDIO PAINT
↓ .cpm ファイル(C++ DLL)を呼び出す
C++ ブリッジレイヤー(BridgeBase)
↓ CoreCLR(.NETランタイム)を動的にロード
C# エフェクトクラス(CSPBridgeEffects.dll)
↓ 実際のピクセル処理
C++が「玄関」で、CoreCLRが「橋」、C#が「本体」という感じです。Microsoftが公開している hostfxr.dll を使ってC++側からCoreCLRを起動する、いわゆる ホスティングAPI を使っています。
effects.jsonを書くだけでプラグインが増える設計
effects.json にエフェクトのIDを追記して meson compile するだけで、C++ブリッジDLL(.cpm)とC#エントリポイントクラスが自動生成されます。
{
"effects": [
{ "id": "Blur", "category": "Bridge Effects", "filterName": "Blur" },
{ "id": "Sharpen", "category": "Bridge Effects", "filterName": "Sharpen" },
{ "id": "Mosaic", "category": "Bridge Effects", "filterName": "Mosaic" },
{ "id": "HSV", "custom": true, "category": "Bridge Effects", "filterName": "HSV" }
]
}
プラグインを追加するたびにボイラープレートを書かなくて済むので、エフェクト実装に集中できます。
技術スタック
| 要素 | 技術 |
|---|---|
| ビルドシステム | Meson + Ninja |
| C++側 | Visual Studio 2022ツールチェーン |
| C#側 | .NET 10、[UnmanagedCallersOnly] 属性 |
| JSON処理 | jq(MesonのJSON未対応を回避) |
| 対応OS | Windows 10/11 x64 のみ |
セットアップ
まず、TriglavPlugIn SDKを CLIP STUDIO公式サイト からダウンロードし、ZIPを展開して CSP_FilterPlugIn/ フォルダとしてプロジェクトルートに配置してください。
meson setup 時に自動ダウンロードも試みますが、利用規約の確認も兼ねて手動配置を推奨します。
# 依存ツールを一括インストール
powershell -ExecutionPolicy Bypass -File .\inst.ps1
# ビルド
meson setup build -Dplugin_path="C:\path\to\CLIP STUDIO PAINT\plug-in"
meson compile -C build
plugin_path を指定しておくと、ビルド後にクリスタのプラグインフォルダへ自動コピーされます。
おわりに
苦労した部分(CoreCLRのホスティング周りや構造体のオフセット合わせなど)はまた別の記事で書こうと思っています。
GitHubリンクはこちら → (リンク)


コメント