プラグインの仕組み


プラグインの仕組み

ここではAfterEffectsがどんな感じにプラグインを呼び出しているか簡単に説明する。
詳細はドキュメントを読むこと(かなり重要)
AfterEffectsのバージョン・SDKによって動作が変わっていることがあるので注意。

AfterEffects起動時
プラグインフォルダ内にある拡張子aexのファイルにPiPLリソースがあるか確認。あれば読み込む。
PiPLリソース内にはプラグインの情報が記録されていて、メニューに登録する。
この時点ではプラグインは呼び出されない。
プラグイン実行前
AfterEffectsはプラグイン処理用として2個のPF_EffectsWorld画像構造体を用意する。
一つは処理する画像そのもので、もう一つは空の構造体(この時点では初期化されていない)

プラグイン実行
AfterEffectsはプラグインを実行する時は、entry pointと呼ばれる関数ポインタを呼び出す。
SDK7より前はmain、以後はEntryPointFuncとなっている。

引数にSelector(PF_Cmd)があり、それによりプラグイン側は処理を切り替える。

重要なものは以下のもの。
PF_Cmd_ABOUT
エフェクトコントロールの情報をクリックしたときに呼び出される。
文字通りAboutダイアログを表示する。
PF_Cmd_GLOBAL_SETUP
GLOBAL_SETUPはプラグインがはじめて実行された時に実行される。
GLOBAL_SETUPでは、プラグインからAfterEffectsへ自分自身の情報を通達する。
情報は、my_versionとout_flagsの二つ。 内容はPiPLリソースと同じもので、違った場合はエラーを表示する。
PF_Cmd_PARAMS_SETUP
PF_Cmd_PARAMS_SETUPもはじめて実行された時に実行される。
エフェクトコントロールに表示するパラメータをAfter側に通達する。
Afterはコントロールを作成し表示する。
PF_Cmd_SEQUENCE_SETUP
PF_Cmd_SEQUENCE_SETUPは最初の描画の前に実行される。
グローバルなメモリーの確保等はここで行う。

サンプルのGamma_Tableにメモリ確保の実例がある。
PF_Cmd_SEQUENCE_SHUTDOWN
プラグインが削除されたときやAfterEffects自体が終了した時に呼び出される。
PF_Cmd_SEQUENCE_SETUPで確保したメモリ等はここで開放する。
グローバルなメモリーの確保等はここで行う。
PF_Cmd_RENDER
このセレクタが呼ばれたときに、プラグインは描画処理を行う。
パラメータが確定するのもこのタイミング。
AfterEfefctsが用意した二つの画像(inData/outData)を使い処理を行う。
inDataには処理前の画像が入っていて、処理後の画像をoutDataに描く。基本的にinDataへの書き込みは禁止されている。 inDataはAfterEffectsのキャッシュイメージそのものなので、描画がおかしくなる。ただし、out_flagsの指定で書き込みを許可すれば可能。 ただしキャッシュをクリアしてしまうので、非効率になる。

上記以外にも多くのセレクタがあるので、必要に応じてプラグインは処理する。
プラグインに必要のないセレクタが呼び出されたら、とりあえず PF_Err_NONを返せば問題ない。

注意点

上記のイベントは基本的にユーザーのアクションに応じて呼び出されるが、それは1回とは限らない。
AfterEffectsは状況に応じて同じセレクタを複数回呼び出す場合が良くある。

特にPF_Cmd_RENDERは何故か複数回呼び出されるときがある。
PF_Cmd_SEQUENCE_SETUPにメモリ確保を行っている時は、必ずエラーチェックを行う事。

-index-