# N64 CI TextureEditor Plug-In SDK

English

1. プラグインの仕組み

   1. 起動時の初期化処理

      プラグインはDLLのインターフェイスを利用しています。
      テクスチャエディタは、起動時にアプリケーション・ディレクトリにある PlugInsディレクトリ内のDLLを検索し、 プラグインの名前、バージョン、種類を順次チェックしていき、動的にリンクします。

      名前やバージョン情報は、DLLのリソースのVS_VERSION_INFOから得ますので、必ずバージョンリソースをDLLに含めて下さい。
      VS_VERSION_INFOは、日本語リソース(041104b0)と英語リソース(040904e4)を用意して下さい。
      Commentに詳細情報、 CompanyNameに社名、 FileVersionにプラグインのバージョン、 InternalNameにメニュー名が使われます。

      DLL側では最初に、int TEPI_getType()が呼ばれ、そこでプラグインの種類を返します。
      その次に、BOOL TEPI_isAvail(DWORD version)が呼ばれ、 アプリケーションの４バイトのバージョン(1.0.0.15の場合、 0x0100000f)がパラメータとして与えられるので、 そのアプリケーションに対応していれば、TRUEを返します。 対応していなければ、FALSEを返して下さい。

   2. インポート処理

      もし、種類がインポート（TEPIT_IMPORTのフラグが立っている）なら、 ファイルメニューのインポートに名前が登録されているはずです。
      ユーザーがインポート・プラグインを呼び出した場合、対応するDLLの BOOL TEPI_import(Pic* pInput, Pic* pOutput)が呼び出されます。

   3. エクスポート処理

      もし、種類がエクスポート（TEPIT_EXPORTのフラグが立っている）なら、 ファイルメニューのエクスポートに名前が登録されているはずです。
      ユーザーがエクスポート・プラグインを呼び出した場合、対応するDLLの BOOL TEPI_export(Pic* pInput)が呼び出されます。

   4. プレビュー処理

      もし、種類がプレビュー（TEPIT_PREVIEWのフラグが立っている）なら、 表示メニューのプレビューから呼び出される様になっています。
      しかし、古いのテクスチャエディタ(1.0.1.4以前)では、プレビュープラグインは１つのみしかサポートしておりませんので、 他のプレビュープラグインと同時に利用できません。
      ユーザーがプレビュー・プラグインを呼び出した場合、対応するDLLの BOOL TEPI_preview(Pic* pInput)が呼び出されます。

      バージョン1.0.1.5のテクスチャエディタから、2枚までプレビューが可能になりました。
      ユーザーがプレビュー・プラグインを呼び出した場合、対応するDLLの BOOL TEPI_preview2(Pic* pInput, int no)が呼び出されます。

2. プラグイン開発環境

   1. 言語：Ｃ／Ｃ＋＋
   2. 環境：Visual C++5.0
   3. ファイル形式：Windows 32bit DLL

3. プラグインで扱われる型情報

   struct TMF {
     int m_width;
     int m_height;
     int m_bits;
     u32* m_pBitmap;
     };
   m_widthはイメージの幅、 m_heightはイメージの高さ、 m_bitsはイメージのビットの深さ(4 or 8)が入ります。
   m_pBitmapは、BMPと全く同じバイナリのイメージデータです。
   4bitの場合は１バイトに２ピクセル分となり、上位4bitビットが左、下位4bitが右のピクセルになります。
   8bitの場合は１バイト１ピクセルなので、左から右に順次並びます。
   ただし、１ラインは32bitアライメントなので、右端の端数のギャップは０で埋められます。
   サイズは、((((m_width * m_bits / 8) + 3) & ~3) * m_height)バイトになります。
   BMPと同じく、画像の下から上に向って配置してあり、Y軸が逆向きになっておりますので注意して下さい。
   struct TLF {
     u32 m_type;
     s32 m_num;
     u16* m_color_array;
     };
   m_typeはパレットの種類（0 = 16bit RGBA／1 = 16bit IA）
   m_numはパレットの個数（16／256）
   m_color_arrayはパレットの配列です。
   struct Pic {
     TMF* m_pTMF;
     TLF* m_pTLF;
     void* m_pReserved;
     int m_palette;
     };
   m_pTMFはTMFのポインタ。
   m_pTLFはTLFのポインタ。
   m_pReservedは将来的の属性テーブルへのポインタ。
   m_paletteは、4bitイメージ+256パレット時のパレットブロックの番号

4. プラグインのインターフェイス

   - int TEPI_getType()

     種類、(TEPIT_IMPORT | TEPIT_EXPORT | TEPIT_PREVIEW)を返します。
     それぞれのフラグに応じてTEPI_import() | TEPI_export() | TEPI_preview()が呼ばれます。
     この関数は、起動時の最初の１回だけ呼ばれます。

   - BOOL TEPI_isAvail(DWORD version)

     テクスチャエディタのバージョン番号 (例：1.0.0.15＝0x0100000f) から、このプラグインが有効か無効かを返します。
     有効であればTRUE、無効であればFALSEを返して下さい。
     この関数は、起動時の最初の１回だけ呼ばれます。

   - BOOL TEPI_property()

     将来の予約です。
     TRUEで終了して下さい。

   - BOOL TEPI_about()

     将来の予約です。
     AfxMessageBox()などでDLLについての情報のダイアログを出して頂ければ幸いです。 TRUEで終了して下さい。

   - BOOL TEPI_import(Pic* pInput, Pic* pOutput)

     種類でTEPIT_IMPORTフラグを立てている場合に、ユーザーの要求によって呼ばれます。
     pInputにテクスチャエディタ側の現在の画像のコピーが含まれています。
     pOutputにイメージを与える事でテクスチャエディタ側でインポートした画像をペーストする事が出来ます。
     インポートに成功した場合TRUEを返し、 取り消しや失敗した場合はFALSEを返して下さい。

     注意：

     - pInput->m_pTLFは、 NULLの可能性があります。
     - pOutput->m_pTMF、 pOutput->m_pTLFは、 最初NULLですが正常に終了する時は、 newをしてメモリを確保して下さい。
       最終的に呼び出し側で削除されますので、deleteは不要です。
     - pInput->m_pTMFの内容を直接編集する 事で、ペーストモードを行わずにイメージを更新する事が可能です。
   - BOOL TEPI_export(Pic* pInput)

     種類でTEPIT_EXPORTフラグを立てている場合に、ユーザーの要求によって呼ばれます。
     pInputにテクスチャエディタ側の現在の画像のコピーが含まれていますので、これを利用してエクスポート処理を行って下さい。
     エクスポートに成功した場合TRUEを返し、 取り消しや失敗した場合はFALSEを返して下さい。

   - BOOL TEPI_preview(Pic* pInput)

     種類でTEPIT_PREVIEWフラグを立てている場合に、ユーザーの要求によって呼ばれます。
     テクスチャエディタ側でプレビューをONにしていると、イメージやパレットに変更が加わる度に呼ばれます。
     プレビューに成功した場合TRUEを返し、 取り消しや失敗した場合はFALSEを返して下さい。

5. プラグインDLLの為の宣言ヘッダファイル

   <tePlugIn.h>
   #ifndef __tePlugIn_H__ #define __tePlugIn_H__ #ifdef __cplusplus extern "C" { #endif
   #pragma pack(1)
   struct TMF {
     int m_width;
     int m_height;
     int m_bits;
     u32* m_pBitmap;
     };
     struct TLF {
     u32 m_type;
     s32 m_num;
     u16* m_color_array;
     };
     /* Picture */
     struct Pic {
     TMF* m_pTMF;
     TLF* m_pTLF;
     void* m_pReserved;
     int m_palette;
     };
     #pragma pack()
     //// TextureEditor Plug-In Type
     enum TEPIT {
     TEPIT_IMPORT = 1,
     TEPIT_EXPORT = 2,
     TEPIT_PREVIEW = 4,
     };
     #define DLLEXPORT __declspec(dllexport)
     /*
     //// YOU MUST BE IMPLEMENT BELOW FUNCTIONS ////
     // get type of plug-in
     // ex) return TEPIT_IMPORT | TEPIT_EXPORT;
     // caution: preview type plug-in is only one.
     */
     DLLEXPORT int PASCAL EXPORT TEPI_getType();
     /* check an application version. if available then return TRUE. */
     DLLEXPORT BOOL PASCAL EXPORT TEPI_isAvail(DWORD version);
     DLLEXPORT BOOL PASCAL EXPORT TEPI_property();
     DLLEXPORT BOOL PASCAL EXPORT TEPI_about();
     DLLEXPORT BOOL PASCAL EXPORT TEPI_import(Pic* pInput, Pic* pOutput); /* called on import. */
     DLLEXPORT BOOL PASCAL EXPORT TEPI_export(Pic* pInput); /* called on export. */
     DLLEXPORT BOOL PASCAL EXPORT TEPI_preview(Pic* pInput); /* called on update time of TMF/TLF. */
     #ifdef __cplusplus
     };
     #endif

English

| Copyright (C) 1998-1999 NINTENDO Co.,Ltd. Copyright (C) 1998-1999 MONEGI CORPORATION. Copyright (C) 1998-1999 INTELLIGENT SYSTEMS Co.,Ltd. All rights reserved.