PR

CLIP STUDIO PAINTのフィルタプラグインをC#で書けるようにした「CSPBridge」を公開しました(前編)

Programming

初めに…

クリスタのフィルタプラグインを作ってみたいと思い、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未対応を回避)
対応OSWindows 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リンクはこちら → (リンク

コメント

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