After Effectsの拡張機能を開発しよう

After Effectsの拡張機能を作る上で勉強したことをまとめました．詳しいわけではないので間違いも含まれていると思います．間違いに気づかれましたら，コメントでご指摘いただけると幸いです．

# After Effectsの拡張機能の種類
After Effectsの拡張機能には，

+ ExtendScriptで書かれるScript
+ C++で書かれるPlugin

が存在している．それぞれ出来ることが異なる．
![overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74646/a60e1f25-e86c-7551-bdd1-c55c3b5252be.png)

## Script
ScriptはExtendScript(古いECMAScript 3の拡張，javascriptの亜種)で書かれ，主に操作の自動化を行うものである．UIがあるものと，ないものがある．

UIがあるものは，UIの作り方によってさらに2つに分かれる．
1つ目は，従来から存在する，UIと操作の自動化すべてをjsxで書く方法である．名前がわからないので以降これを単にjsxと言う．
2つ目は，比較的新しい仕組みである，操作の自動化用のスクリプトをjsxで書き，UIをウェブ技術(html,css,javascript)で書く方法である．CEPという名前がついている．

### jsx
`.jsxbin` という拡張子のものもあるが，これは `jsx` を難読化したものにつけられる．`jsx` という拡張子であっても，難読化されているものもある．

UIがないものは，`(After Effectsのインストールフォルダ)/Support Files/Scripts` に `.jsx` の拡張子で保存することで， `Fileメニュー` -> `Scripts` から呼び出せる．
中身は，難読化されていても，されていなくてもいい．ただし，難読化されていても拡張子を `.jsxbin` ではなく`.jsx` にしなければ表示されない．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74646/32246fef-a2f9-7ccc-2466-d5727441ce80.png)


UIがあるものは，`(After Effectsのインストールフォルダ)/Support Files/Scripts/ScriptUI Panels` に保存することで，Windowメニューからパネルとして呼び出せる．
中身は，難読化されていても，されていなあくてもいい．拡張子も `.jsx` でも `.jsxbin` でもいい．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74646/fec207d6-c898-af3d-36ea-1f94cbbb26cd.png)

#### 利点
ファイル1つで実装でき比較的かんたんに作れる．実行できる．

#### 欠点
複雑なUIを作るのが難しい．

#### 例
+ [Motion Tools 2](https://motiondesign.school/products/fundamentals-course-on-after-effects)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74646/6f3e5788-b66b-f410-3d92-442b4e5cb66a.png)

+ [Ease and Wizz](https://aescripts.com/ease-and-wizz/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74646/80a016ec-9b00-2eb7-04b8-c23b77c381ed.png)

+ [Duik Bassel.2](https://rainboxlab.org/tools/duik/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74646/8a8119ca-2da6-1fb5-e233-77a5d585d7fa.png)



#### リソース

##### AE操作の自動化について
+ [サカモトのサイト - AfterEffects Scripts](https://sites.google.com/view/youuu4/after-effects-scripts?authuser=0)
+ [After Effects スクリプトリファレンス](http://aejsx.hiroshisaito.net/home)
    + 公式ドキュメントをWeb形式にしたもの．日本語．
+ [After Effects Script Reference](https://after-effects-scripting-guide.readthedocs.io)
    + 公式ドキュメントをWeb形式にしたもの．英語．最新版だと思う．
+ [Duik](https://rainboxlab.org/tools/duik/)
    + オープンソースのリギングScript．この完成度で無料はすごい．しかもソースが難読化されていないので，どのように実装されているか読める． 
+ [rd: scripts](http://www.redefinery.com/ae/rd_scripts/)
    + こちらもオープンソースのAfter Effectsのスクリプト群．やりたいことと似ているScriptがあったら実装を読んでみよう．
    + [50個もあったrd:scriptsの内容を少しわかりやすく説明する件](https://note.com/tukitomoe/n/n398fecfc2e20 )50個もあるスクリプトの概要はこちら

##### UIについて
+ [サカモトのサイト - UIを作ろう！](https://sites.google.com/view/youuu4/HowToWrite?authuser=0)
    + Script UIについて様々なTipsや，Tutorialがある．とてもわかり易い．これだけ読んでいればUIについては事足りる気がする．
+ [ScriptUI Classes](http://jongware.mit.edu/scriptuihtml/Sui/index_1.html)
    + 貴重なScript UIに関するドキュメント．英語．
+ [AE　ScriptUIを綺麗に作ろう！](https://qiita.com/TimeToEdit/items/90f9d8502285327803c0)
    + 実際のScript UIの構成をわかりやすく図示している．また，上のドキュメントが掲載されていた．

### CEP(Common Extensibility Platform)
UIをweb技術を使ってつくる．実際に操作の自動化を行うスクリプトはjsxである．

#### 利点
+ jsxと比べ，グラフやモーション付きのUIなど，web技術を使ったリッチなUIを作ることが出来る
+ 他のソフトとの連携が出来る(ex.OverlordはIllustratorとAfter effectsで連携して動く．Animation ComposerはAfter EffectsとPremiere Proで同じScriptが動く)

#### 例
+ [Adobe Color](https://helpx.adobe.com/jp/after-effects/using/color-themes-libraries.ug.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74646/16883f9c-16ff-076b-8490-a7c5fd6e69d0.png)

+ [Flow](https://aescripts.com/flow/)
    + グラフをマウスで変更できるリッチなUIが特徴的．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74646/f5f0ef9f-8b54-1039-b6e2-05190f0a3d64.png)

+ [After Ease](https://aescripts.com/after-ease/)![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74646/9a58e027-9ac2-0f10-7106-c02f67af9d53.jpeg)

+ [Motion-3](https://www.mtmograph.com/products/motion-3)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74646/46e647eb-ead0-11c1-fffa-9ad496c0c17e.png)

+ [Overlord](https://www.battleaxe.co/overlord)
    + After EffectsとIllustratorの連携を行う．Creative Cloudのソフト間の連携はCEPのみで行える

#### リソース
+ [CEPスーパー メガ ガイド](https://fenomas.com/2014/08/cep-mega-guide/)
    + 古い記事だが，CEPの概要について詳しく書かれている．最初に一通り読むとCEPについての概要が理解できる．開発環境については，情報が古くなっているので次の記事を読むと良い．
+ [CEP の準備](https://ymdsny.com/cep-preparations/)
    + CEPの開発環境の作り方が載っている．VS Codeに，ExtendScript DebuggerとCC Extension Builderを入れて開発するものらしい．
+ [2020年9月版　Adobe CEPの開発環境](https://kawano-shuji.com/justdiary/2020/09/06/2020%E5%B9%B49%E6%9C%88%E7%89%88%E3%80%80adobe-cep%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83/)
    + 同じく開発環境の作り方について，最新の補足．
+ [Adobe-CEP/Samples](https://github.com/Adobe-CEP/Samples)
    + Adobeが公式で出しているCEPで作られたアプリのサンプル．様々なCCのアプリ用のものがある．とりあえず動かしてみたり，コードを読んでみると良いと思う．
+ [CEP-Resources](https://github.com/Adobe-CEP/CEP-Resources)
    + CEPに関するAdobeの公式ドキュメントのまとめ．

## Plugin
Pluginは，

+ Effect
+ AEGP

の2種類がある．併用することも出来る？

C++で書かれているのでScriptと比べ高速で柔軟性が高い．

### Effect
エフェクトとプリセットに表示されているやつ．

画像を受け取って，プロパティに応じた変更を行い，画像を出力するようなプラグインである．

### AEGP
AEGPは，After Effectsのソフト自体に組み込まれ，様々な関数をフックし，AEの機能を拡張する.調べても，情報が少なくてよく分かりませんでした．

例えば，Compositionメニューに表示される[Newton 3](https://aescripts.com/newton/)がその例である．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74646/4165bfa4-d572-fcbc-5e10-03e57d0432d1.png)



### リソース
+ [Adobe Developer Conosole](https://console.adobe.io/downloads/ae)
    + Adobe After Effects SDKがダウンロードできる．WindowsはVisual Studio，MACはX Codeようのプロジェクトになっている．コンパイルすれば動かせるサンプルプログラムが多数収録されている．
+ [AfterEffectsSDK プラグイン開発開始まで](https://qiita.com/kabosu/items/8d65f20d31daa82e6018)
+ Pluginの作り方を動画で解説している．英語．今の所Part.4まである．ところどころコードが間違っているので注意．詳細をあとの章で書きます．
    + [Episode 1](https://youtu.be/hAOoJot0IOk)
    + [Episode 2](https://youtu.be/oAVWwBA2K0U)
    + [Episode 3](https://youtu.be/nB3CvNMKg-w)
    + [Episode 4](https://youtu.be/eTjSJOYRCf4)
+ [Adobe After Effects SDK Guide!](https://ae-plugin-sdk-guide.readthedocs.io)
    + 従来SDK内にPDFで収録されていたドキュメントがweb形式になったもの．英語．公式のSDKに入っているリンクは切れている...．
+ [Smooth](https://github.com/loilo-inc/smooth)
    + オープンソースのAfter Effects Plugin．
+ [F's Plugins](https://github.com/bryful/F-s-PluginsProjects)
    + オープンソースのAfter Effects Plugin集．かなり大量にある．

# jsxbinについて
jsxbinは，ExtendScriptの文字列を置き換えて難読化したものです．Scriptを配布するとき，ソースコードを他人に読まれないようにするために存在します．
[JSXBINってなに？](http://aejsx.hiroshisaito.net/home/tips/jsxbinttenani)

## 難読化の方法
難読化のヘッダーを確認したところ，`@JSXBIN@ES@2.0@`と`@JSXBIN@ES@2.1@`の2種類のバージョンが確認できました．

### バージョン2.0
2.0のバージョンの難読化は，ExtendScript Debuggerを導入したVS Codeでテキストエリアを `右クリック` -> `バイナリとして書き出し...` から行えます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74646/3a0d111b-509e-ae59-89b1-919234b2f1ee.png)

### バージョン2.1
2.1のバージョンの難読化は，ExtendScript Debuggerを導入したVS Codeで，難読化したい箇所を選択した後， `Ctrl+Shift+P`を押し`TextToJSXBIN`を選択することで可能です．
![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74646/26d8b54b-18bc-9320-b47c-d9ffdf542f4f.gif)

参考: https://community.adobe.com/t5/after-effects/how-to-export-jsxbin-es-2-1-from-extendscript/td-p/10610202?page=1

## 難読化の解除
文字列を置き換えているだけなので，以下のように難読化されたコードを読むことが可能です．
[難読化された .jsxbin ファイルを読んでみる](https://shutosg.hatenadiary.com/entry/2016/12/11/074303)

難読化の解除は利用規約等で禁止されている場合があります．***行う際は，利用規約等をよく確認し，自己責任で行ってください．***

難読化を解除するツールも開発されています．バグが有り，完全に難読化を解除することは出来ませんが，どのようなことを行っているかを覗くことが出来ます．`@JSXBIN@ES@2.0@`のみに対応しているようです．
[jsxbin-to-jsx-converter](https://github.com/codecopy/jsxbin-to-jsx-converter)


# Plugin EverythingのPluginの作り方チュートリアル
## Episode 1
After Effects SDKをダウンロードし，Skeletonテンプレートに直線を書くプラグインを実装する．とても素朴なサンプルだが，その分応用範囲が広い．

Adobe After Effects SDKのサンプルをVisual Studio2019でコンパイルする上で，以下の修正が必要だった

```
文字コード関係でエラーが出るので©を消去
```

デバッグ前にスタートアッププロジェクトを変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74646/aa8d2f2d-0d3c-6f14-0883-bec59aeb9027.png)

## Episode 2
2Dグラフィックライブラリ `Cairo` を導入し，それを用いて円を書くプラグインを作る．
Cairoのコンパイル済みバイナリは，https://github.com/preshing/cairo-windows/releases ここから入手できる

cairoCopy8関数内で，longの型のまま除算をしており，小数が切り捨てられているため，色が正しく描画されない．以下のようにキャストをすることで修正した．

```c++:before3.cpp
	for (int x = 0; x < data->output.width; x++) {
		worldPtr->alpha = rowP[x] >> 24;
		if (worldPtr->alpha > 0)
		{
			worldPtr->red	= A_u_char(rowP[x] >> 16)  / worldPtr->alpha * PF_MAX_CHAN8;
			worldPtr->green = A_u_char((rowP[x] >> 8)  / worldPtr->alpha * PF_MAX_CHAN8;
			worldPtr->blue  = A_u_char((rowP[x] >> 0)  / worldPtr->alpha * PF_MAX_CHAN8;
		}
		worldPtr++;
	}
```

```c++:after3.cpp
	for (int x = 0; x < data->output.width; x++) {
		worldPtr->alpha = rowP[x] >> 24;
		if (worldPtr->alpha > 0)
		{
			worldPtr->red	= A_u_char(static_cast<double>((rowP[x] >> 16) & 0xff) / worldPtr->alpha * PF_MAX_CHAN8);
			worldPtr->green = A_u_char(static_cast<double>((rowP[x] >> 8) & 0xff)  / worldPtr->alpha * PF_MAX_CHAN8);
			worldPtr->blue  = A_u_char(static_cast<double>((rowP[x] >> 0) & 0xff)  / worldPtr->alpha * PF_MAX_CHAN8);
		}
		worldPtr++;
	}
```

## Episode 3
Cairoを用いてベジェ曲線を書くプラグインをつくる．途中コードにミスが多く，最後にまとめて修正するので，最後まで見てからコードを写経を行うことをおすすめする．


## Episode 4
GPUの概要と，GPUを用いるライブラリの紹介，そのライブラリ一つであるOpenGLを使ったサンプルのコードの概要をコードを追いながら紹介する．次のエピソードでは実際に実装を行うらしいが，まだ公開されていない．

# 最後に
様々なシェイプを1クリックで導入するScriptを作りました．よろしければお使いください
[Add Shape Layers](https://github.com/Liesegang/liesegangs_aescripts)
![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74646/894c6e08-ae33-26ac-6ac0-eaee88bab971.gif)