文書の もくじ へ
著者: Peter Eastman
最終更新: 2004/5/5
更新時の対象: ver. 1.7
原版リリース: 2000/10/4
原版の対象: ver. 0.6
もくじ
- 概要
- プラグインのタイプ
- プラグインをパッケージ
- 一般的な指針
概要
Art of Illusion のプラグイン API で、Art of Illusion の機能性をさまざまな方法で拡張する新規のモジュールを記述できます。通常は以下の仕様です。
- コアプログラムの一部ではない、新規の機能を追加
- Java で記述
- Java クラス、データファイルやほかのリソースなど、Java クラスをいくつでも格納できる
- 1つの jar ファイルにパッケージされる
- "Plugins" フォルダ内に jar ファイルを単に置くだけでインストールされる
このチュートリアルでは、記述できるさまざまなタイプのプラグインや、すべてのプラグインタイプで共通の記述方法とパッケージ方法について、一般的な情報を紹介します。プラグインの特定のタイプを記述する詳細情報はありません。プラグインタイプごとの記述方法の詳細については、もう1つのチュートリアルで紹介します。
プラグインのタイプ
現在のところ、Art of Illusion は以下のタイプのプラグインをサポートしています。将来のバージョンでは、タイプがさらに増えるかもしれません。
- Renderer: シーンの画像を作成します。 Art of Illusion はレイトレーサーとラスターレンダラーという、2つのレンダラーを実装して配布しています。これらは1つのプラグインとして一緒にパッケージされています。Renderer は artofillusion.Renderer インターフェイスを実装する Java クラスです。
- Modelling Tool: シーンの一部の作成・編集時に、新規の能力を提供します。これらはツールメニューにリスト表示されます。Modelling Tool は artofillusion.ModellingTool インターフェイスを実装する Java クラスです。
- Translator: Art of Illusion で、ほかのソフトのファイルフォーマットの読み込み・書き出しを可能にします。Translators は artofillusion.Translator インターフェイスを実装する Java クラスです。Art of Illusion は今のところ、VRML, Wavefront, POV-Ray ファイル向けの Translator を実装して配布しています。
- Texture: シーン内で使える手続きテクスチャを定義できます。Texture は artofillusion.texture.Texture をサブクラスする Java クラスです(実際は通常、artofillusion.texture.Texture2D または artofillusion.texture.Texture3D をサブクラスします)。
- Texture Mapping: オブジェクトの表面にテクスチャをマッピングする方法を定義します。Texture Mapping は artofillusion.texture.TextureMapping をサブクラスする Java クラスです(実際は、プラグインで定義された新規のマッピングは通常、artofillusion.texture.NonlinearMapping2D をサブクラスします)。
- Material: シーン内で使える手続き材質を定義します。Material は artofillusion.material.Material をサブクラスする Java クラスです(実際は通常、artofillusion.material.Material3D をサブクラスします)。
- Material Mapping: オブジェクトの内部に材質をマッピングする方法を定義します。Material Mapping は artofillusion.material.MaterialMapping をサブクラスする Java クラスです。
- Image Filter: 画像に適用できる、レンダー後の効果を定義します。フィルタはカメラにいくつでも取り付けられ、調整可能なパラメータがあればそれを定義でき、フィルタの効果の変更やアニメーション化ができます。Image Filter は artofillusion.image.filter.ImageFilter をサブクラスする Java クラスです。
- Procedural Module: 手続き編集機能に新規の機能を追加します。シーン内の手続き要素のどれにでも(テクスチャ、材質、アニメーショントラックなど)使用できます。Procedural Module は artofillusion.procedural.Module をサブクラスする Java クラスです。
- Generic Plugin: 上記のカテゴリに簡単に分けられない新規の機能を実装するとき、一般的な仕組みを提供します。これは artofillusion.Plugin インターフェイスを提供する Java クラスです。このインターフェイスは、さまざまなイベント(プログラム起動、プログラム終了、シーン編集ウインドウを開く、シーン編集ウインドウを閉じる、ファイルの保存など)が発生するときに呼び出される単一のメソッド processMessage() を定義します。
プラグインをパッケージ
Java クラスをプラグインとしてパッケージするには、メインのプラグインクラス(適切なインターフェイスを実装するものや、適切なクラスを拡張するもの)とほかのクラスや必要なファイルを、単一の jar ファイルの中に入れます。jar ファイル中には複数のプラグインを入れられます。
また jar ファイルにはインデックスとして、"plugins"(すべて小文字)という名前のテキストファイルを含める必要があります。このファイルには、プラグインそれぞれについて完全に評価済みのクラス名を、単純に1行に1件でリスト表記します。
クラスファイルそれぞれは、それが入るパッケージに対応する jar ファイルの 中の、適切なディレクトリに格納する必要があります。そうしなければ、クラスローダが適切な場所にファイルを配置できません。
疑問をなくすため、2つのプラグインを1つの jar ファイルにパッケージする例を考えてみましょう。この2つの完全に評価済みのプラグイン名はそれぞれ com.mycompany.GoodPlugin と com.mycompany.BetterPlugin とします。
この jar ファイルに格納されるエントリは(このプラグインで使われる可能性のある、ほかのクラスやファイルに加えて)3つということになります。
com/mycompany/GoodPlugin.class
com/mycompany/BetterPlugin.class
plugins
"plugins" ファイルはテキストファイルで、その内容は以下です。
com.mycompany.GoodPlugin
com.mycompany.BetterPlugin
一般的な指針
起動した Art of Illusion がまずすることのひとつは、Plugins ディレクトリ内のすべてのファイルに目を通すことです。それぞれについて、まず zip ファイルか jar ファイルかを判断します。どちらかなら、"plugin" という名前のエントリを探します。そのエントリを読み込み、このファイルのメインのプラグインクラスを確認するのにそのエントリを使います。
そして各プラグインクラスを読み込み、クラスオブジェクト上で newInstance() を呼び出して、そのインスタンスを作成します。Renderer のように、プラグインのタイプによっては、一度そのインスタンスが作成されると、繰り返しそれを使います。Texture のようなほかのタイプでは、後でほかのインスタンスがたくさん作られます。
この手続きには、心に留めておくべきいくつかの結果があります。最初に、これは、すべてのプラグインクラスが argument を取らないコンストラクタを持つ必要があることを意味します。これで Class.newInstance() を呼び出してインスタンス化できます。
2番目に、たくさんのプラグインが存在するとき、そのすべての読み込みとインスタンス化に要求される時間がとてもかかります。つまり、たとえユーザがそのプラグインを実際に使わないとしても、メモリはすべてのプラグインクラスを蓄えるのに使われるということです。この2つの問題を軽減するいい方法は、メインのプラグインクラスの容量を最小化することです。コードの大部分を、プラグインが実際に使われるまで読み込まれないヘルパークラスに置くと、メモリを節約でき、起動の時間も減ります。
すべてのプラグインは、クラスパスを自動で設定する、それとは別のクラスローダで読み込まれます。このクラスローダは以下を含みます。
- システムのクラスパス内のすべて(つまり java.* パッケージ内のすべて)
- ArtOfIllusion.jar 内のクラス(artofillusion.* パッケージ内のクラスを格納している)
- プラグイン自身の jar ファイル内のすべて
これは、ほかのプラグインはそれ自身の jar ファイル内のほかのクラスと同じように、標準のシステムとアプリケーションクラスすべてにアクセスでき、しかしほかのプラグインに属するクラスにはアクセスできないことを意味します(あなた自身のクラスローダで明示的に読み込まない限りは)。このため普通は、関係のないプラグイン同士でクラス名のコンフリクトを気にする必要はありません。
|