見出し画像

After Effects エフェクトプラグインをゼロから作って見よう 2回目 "プラグインの概要"

この記事ではAfter Effectsのプラグインがどうやって動いているかの説明を行います。知っておかないと駄目な最低限な内容です。
でも、はっきり言って眠くなる内容なので軽く読み飛ばすことを推奨します。
詳細はhttps://ae-plugins.docsforadobe.dev/index.htmlにあります。(英語だけど)




大まかなEffectsプラグインの動き

  1. ホスト(After Effects :AfterFX)起動時にプラグインフォルダを調べ、ファイルのPiPLリソースの情報を獲得。メニューの構築を行う

  2. プラグインがレイヤに適応された時、PiPLリソースで指定されたエントリーポイントをセレクター付きで呼び出す。

  3. プラグインはセレクタに応じた様々な処理を行い、結果をホストに返す。

  4. 最後にホストはレンダリングを行うための内部画面を2個プラグインに渡し、プラグインは入力画面を読み画像処理を行った結果を出力画面に返し描画が完成される。

って感じになります。プラグインと言ってもWindowsでは普通のDLL(ダイナミックリンクライブラリ)でエントリー関数のセレクタ引数に応じた処理を行っているだけです。

リソースファイル

リソースファイル(拡張子r)はリビルドされた時にSDK付属のPiPLtool.exeを呼び出しrcファイルにコンパイルされます。リソースファイルを右クリックして表示されるかすダムビルドツールにその詳細があります。

以下にリソースの項目で主に使う物です。

Name
メニューに表示される文字列。プラグイン名
Category 
 カテゴリ名 サブメニューの文字列
AE_PROC_INTELx64 
 Windowsのエントリー関数
AE_Effect_Version 
 
このプラグインのバージョンナンバー
AE_Effect_Global_OutFlags/AE_Effect_Global_OutFlags_2
 
このプラグインの動作フラグの設定。
 8/16/32bit対応やら様々な設定フラグ
AE_Effect_Match_Name
 MatchNameの指定。レイヤに表示される文字列が変更されても
 この文字は変更されない。識別用
AE_Effect_Support_URL
 いつの間にか追加されてた項目。


リソースの項目についてはヘッダーファイル”AE_Effect.h"に詳細があります。
https://ae-plugins.docsforadobe.dev/intro/pipl-resources.html と併せて確認する必要があります。

エントリー関数

EffectsMain関数がエントリー、Cでいうmain関数です。
引数のcmdがセレクタでかなりの種類ありますが、通常のEffectsプラグインでは以下のswitch分岐の分だけあれば十分に動きます。
その他の引数は、AfterEffectsホストが用意した入力画像の情報(PF_InData)とプラグインが処理した画像の情報(PF_OutData)とそのデータ2個分のポインターになります。

エントリー関数の説明

コマンドセレクタの解説

PF_Err
EffectMain(
	PF_Cmd			cmd,
	PF_InData		*in_dataP,
	PF_OutData		*out_data,
	PF_ParamDef		*params[],
	PF_LayerDef		*output,
	void			*extra)
{
	PF_Err		err = PF_Err_NONE;
	
	try {
		switch (cmd) 
		{
			case PF_Cmd_ABOUT:
				err = About(in_dataP,out_data,params,output);
				break;
			case PF_Cmd_GLOBAL_SETUP:
				err = GlobalSetup(in_dataP,out_data,params,output);
				break;
			case PF_Cmd_PARAMS_SETUP:
				err = ParamsSetup(in_dataP,out_data,params,output);
				break;
			case PF_Cmd_RENDER:
				err = Render(in_dataP,out_data,params,output);
				break;
			case PF_Cmd_SMART_PRE_RENDER:
				err = PreRender(in_dataP, out_data, (PF_PreRenderExtra*)extra);
				break;
			case PF_Cmd_SMART_RENDER:
				err = SmartRender(in_dataP, out_data, (PF_SmartRenderExtra*)extra);
				break;
		}
	} catch(PF_Err &thrown_err) {
		// Never EVER throw exceptions into AE.
		err = thrown_err;
	}
	return err;
}

PF_Cmd_ABOUT

プラグインについて説明するダイアログを表示します。

PF_Cmd_GLOBAL_SETUP

プラグインの動作を記述するために必要なフラグとフィールド (out_data>my_version を含む) を設定します。PiPLリソースに記述した物と同じ物です。違うとAfter Effectsはエラーを表示します。

PF_Cmd_PARAM_SETUP

プラグインのパラメータの設定を行います。ここで設定した物がエフェクトコントロールに表示されます。

PF_Cmd_RENDER

SmarkFX未対応時のレンダリングを行うときに呼び出されます。ここでプラグインは実際の描画を行います。8bit/16bitまでの対応になります。

PF_Cmd_SMART_PRE_RENDER

SmartFX時のレンダリングの前準備時に呼び出されます。8/16/32bit対応です。レンダリングに必要なデータを準備します。複数回呼び出される事もあります。

PF_Cmd_SMART_RENDER

SmartFX時の実際のレンダリングに呼び出されます。

コマンドセレクタには他にもありますが、大抵のエフェクトプラグインは上記のコードのみ対応していれば大丈夫です。

最後に

知らないと駄目だけど特に面白くない知識ばかりでした。
DLLのプログラミングの経験があれば特に読まなくてもなんとなく分かる内容だと思います。

C#の記事ですがプラグインがどんな感じにホストのアプリから呼び出されているか説明しているので呼んでおくとイメージがわくと思います。

次は簡単なエフェクトを作って見て、PF_Cmd_GLOBAL_SETUPあたりの説明と簡単な画像処理についての記事を書きたいと思います。

この記事が気に入ったらサポートをしてみませんか?