opengl / opengles / brew /

BREW で OpenGL ES

EZアプリ で OpenGL ES

〜 その4 「BREW でプログラミング - 基本編 -」 〜
OpenGL/OpenGL ES Extension Registry 内の検索:
[検索方法]
OpenGL 拡張 OpenGL ES 拡張 EGL 拡張


「BREW で OpenGL ES」

その1 「BREW SDK Extension for OpenGL ES」
その2 「OpenGL ES Sample 1.0.3」
その3 「BREW シミュレータ」
その4 「BREW でプログラミング - 基本編 -」
その5 「BREW でプログラミング - OpenGL ES 編 -」

<< 前 次 >>

■BREW プログラミング

はじめに

BREW プログラミングについての詳細については、専門書をご覧ください。
ここでは、OpenGL ES を用いたアプリケーションを作成するために必要となる 最小限の BREW プログラミングに関する情報のみを記述するのにとどめます。

以下は BREW 3.X を前提にまとめています。 (BREW 2.X から変更になっている部分もあるのでご注意ください。)

注意点

BREW でプログラミングを行う上で、次の点に注意してください。

  • C 標準ライブラリは使用してはいけません。ヘルパー関数で代用してください。
  • グローバル変数、スタティック変数は使用できません。
  • 浮動小数点演算を演算子で行うことはできません。ヘルパー関数で代用してください。
BREW シミュレータでは動作するので特に注意してください。

ファイル構成

アプリケーション名は、英小文字と数字を用います。 英大文字を使うと BREW シミュレータでリソースファイルが読み込めないという不具合が生じます。

アプリケーション名を例えば simple とすると、 MIF ファイルのファイル名は simple.mif となり、 simple フォルダの下に simple.dll を配置します。


simple.mif
simple\simple.dll
simple\simple.bar (リソースファイルがある場合)

同様に、実機の場合は以下のように配置します。


simple.mif
simple\simple.mod
simple\simple.bar (リソースファイルがある場合)
simple\simple.sig

BREW MIF エディタ

BREW MIF エディタは、BREW SDK Tools 1.1.1.10 SP05 日本語版 に含まれます。

MIF ファイルは、アプリケーションに必要な情報(クラスID, アイコン, 特権レベル等)を保存したファイルです。
MIF ファイルは BREW MIF エディタで作成/編集を行います。

また BREW MIF エディタは BID ファイルの作成も行います。
BID ファイルは クラスID が記述された C のヘッダファイルで、 BREW アプリケーションのソースプログラムにインクルードします。

MIF エディタ

●MIF エディタ起動

起動直後 MIF エディタの起動直後の画面。
既存の MIF ファイルを編集する場合は、ファイルメニューから開きます。


●BID 作成手順

BID作成 「BREW Class ID の指定」ダイアログをこのボタンを押して開きます。


BID作成 「BREW Class ID の指定」ダイアログ

Class ID はアプリケーション固有の一意な値。 ここではシミュレータでのローカルテスト用ということで、Class ID を自分で設定します。
「新規作成」でローカルを選択し、ここでは 88001001 という値を指定しています。
(01010101 以上の値を指定する必要があります。)

クラス名を指定します。 ここでは simple を指定しています。

「OK」を押すと BID ファイルを保存するためのファイルダイアログが表示されるので、 ここでは simple.bid という名前で保存します。


●MIF 編集

アプレット アプレット

アイコンの画像を読み込みます。 アイコンは「大」「中」「小」の3種類あります。 端末により対応している幅、高さ、ビット数に制限があります。 ここでは「大」を 95 x 68 24bpp、「中」「小」を 16 x 16 8bpp の画像を設定しています。

アプレットの種類を選択します。ここでは「ゲーム」を選んでいます。


特権 特権

アプリケーションの実行に必要な特権を設定します。
チェックが増えるほど BREW 認定のテスト項目が増えます。 必要最小限のものを選択するべきですが、シミュレータでテストする目的であれば、 全てチェックしておいても問題ないようです。


全般 全般

作者名、著作権文字列、モジュールのバージョンを設定します。

文字列エンコード形式を S-JIS に設定します。

ここではファイルメニューの「保存」で simple.mif という名前で保存します。


BREW リソース エディタ

BREW リソース エディタは、BREW SDK Tools 1.1.1.10 SP05 日本語版 に含まれます。

リソースファイル(BAR)は、プログラムから参照する文字列、画像、 ダイアログなどのデータをまとめたファイルです。
リソースファイルは BREW リソースエディタで作成/編集を行います。
また、BREW リソースエディタは、リソースヘッダファイル(BRH)の作成も行います。

リソースエディタ

ここではまだ BREW リソース エディタは使いません。

BREW サンプルプログラム

簡単な BREW プログラムを作成してみましょう。
Visual C++ 2005 を起動して新規にプロジェクトを作成します。

Visual C++ 2005 インストール後に BREW SDK Tools 1.1.1.10 SP05 日本語をインストールした場合、 「BREWAppWizard」が利用できます。 ここでは 「BREWAppWizard」を用いてプロジェクトを作成していきます。 (Visual C++ 2008 では利用できません。)

BREWAppWizard プロジェクトの種類「Visual C++」を選び、テンプレート「BREWAppWizard」を選択します。

ここでは C:\BREW\samples ディレクトリに simple プロジェクトを作成します。


BREWAppWizard そのまま「次へ」

BREWAppWizard ここで MIF エディタを起動することもできますが、そのまま「Finish]

BREWAppWizard により、プロジェクトが作成されます。
プロジェクトには simple.c と AEEAppGen.c と AEEModGen.c の 3 つのファイルが含まれます。
このうち、AEEAppGen.c と AEEModGen.c は、SDK 内のファイルですので、この 2 つのファイルは編集してはいけません。 simple.c に手を加えていきましょう。

C:\BREW\samples\ に MIF エディタで作成した simple.mif を置きます。
C:\BREW\samples\simple\ に simple.bid を置きます。

●ヘッダ読み込み部分

simple.c の先頭部分は次のようになっています。


#include "AEEModGen.h"
#include "AEEAppGen.h"
#include "AEEShell.h"


#include "simple.bid"


先ほど置いた simple.bid がインクルードされるようになっています。

simple.bid の中身は次のようになっており、MIF エディタで設定した Class ID が定義されています。


#ifndef SIMPLE_BID
#define SIMPLE_BID

#define AEECLSID_SIMPLE 0x88001001

#endif //SIMPLE_BID


●アプレット構造体

simple.c でこのアプリケーション用のアプレット構造体が定義されています。


/*-------------------------------------------------------------------
Applet structure. All variables in here are reference via "pMe->"
-------------------------------------------------------------------*/
// create an applet structure that's passed around. All variables in
// here will be able to be referenced as static.
typedef struct _simple {
	AEEApplet      a ;	       // 最初のメンバは必ず AEEApplet
	AEEDeviceInfo  DeviceInfo;

    // add your own variables here...


} simple;


最初のメンバは必ず AEEApplet でなければなりません。
BREW ではグローバル変数を使うことができないので、 この構造体に変数を追加して、グローバル変数の代わりに使います。

●関数


/*-------------------------------------------------------------------
Function Prototypes
-------------------------------------------------------------------*/
static  boolean simple_HandleEvent(simple* pMe, 
			AEEEvent eCode, uint16 wParam, uint32 dwParam);
boolean simple_InitAppData(simple* pMe);
void    simple_FreeAppData(simple* pMe);


イベント処理用の simple_HandleEvent と、 アプレットの初期化のための simple_InitAppData、 アプレットのメモリ解放のための simple_FreeAppData が定義されています。

●AEEClsCreateInstance

AEEClsCreateInstance はプログラムの入り口になります。

int AEEClsCreateInstance(AEECLSID ClsId, IShell *pIShell, IModule *po, 
void **ppObj)
{
	*ppObj = NULL;

	if( ClsId == AEECLSID_SIMPLE )
	{
		// Create the applet and make room for the applet structure
		if( AEEApplet_New(sizeof(simple),
			ClsId, pIShell, po, (IApplet**)ppObj,
			(AEEHANDLER)simple_HandleEvent,
			(PFNFREEAPPDATA)simple_FreeAppData) ) 
		{
			if(simple_InitAppData((simple*)*ppObj))
			{
				//Data initialized successfully
				return(AEE_SUCCESS);
			}
			else
			{
				IAPPLET_Release((IApplet*)*ppObj);
				return EFAILED;
			}

		} // end AEEApplet_New

    }

	return(EFAILED);
}


AEEClsCreateInstance では、ClsId が simple.bid で定義されている AEECLSID_SIMPLE と一致するかどうかを調べます。 一致した場合、アプレットを AEEApplet_New で作成します。

AEEAplet_New では、simple_HandleEvent イベントハンドラ関数の設定と、 EVT_APP_STOP イベント処理後に呼び出すアプレットの解放処理用関数 simple_FreeAppData を設定します。

アプレット作成後、simple_InitAppData 関数でアプレットの初期化を行い、 AEE_SUCCESS を返します。
この後、EVT_APP_START イベントが発生します。

simple_InitAppData がエラーを返した場合には、アプレットを IAPPLET_Release でリリースします。

●HandleEvent

各種イベントの処理を行います。

EVT_APP_START は、アプリケーション起動時に1度発生するイベントです。 ここには最初に1回実行する処理を記述しましょう。
ここでは OnAppStart という関数を用意して、それを呼び出しています。
(赤字が追加した箇所)


static void simple_OnAppStart(simple* pMe);

static boolean simple_HandleEvent(simple* pMe, AEEEvent eCode, 
uint16 wParam, uint32 dwParam)
{  

	switch (eCode) 
	{
		// App is told it is starting up
		case EVT_APP_START:                        
			// Add your code here...
			simple_OnAppStart(pMe);
			return(TRUE);

		// App is told it is exiting
		case EVT_APP_STOP:
			// Add your code here...

			return(TRUE);

				:
				:

		// If nothing fits up to this point then we'll just break out
		default:
			break;
	}

	return FALSE;
}


●InitAppData

アプレットのメンバ変数のメモリ割り当て、初期化等を行います。 グローバル変数の代用にユーザが定義した変数の初期化をここで行ってください。
それ以外のアプリケーション起動時に1回処理するものは EVT_APP_START イベント処理で行ってください。


// this function is called when your application is starting up
boolean simple_InitAppData(simple* pMe)
{
    // Get the device information for this handset.
    // Reference all the data by looking at the pMe->DeviceInfo structure
    // Check the API reference guide for all the handy device info you can get
    pMe->DeviceInfo.wStructSize = sizeof(pMe->DeviceInfo);
    ISHELL_GetDeviceInfo(pMe->a.m_pIShell,&pMe->DeviceInfo);

    // Insert your code here for initializing or allocating resources...



    // if there have been no failures up to this point then return success
    return TRUE;
}


●FreeAppData

InitAppData でメモリを割り当てたアプレットのメンバ変数があれば、ここで解放してください。


// this function is called when your application is exiting
void simple_FreeAppData(simple* pMe)
{
	// insert your code here for freeing any resources you have allocated...

	    // example to use for releasing each interface:
	// if ( pMe->pIMenuCtl != NULL )
	// {
	//    IMENUCTL_Release(pMe->pIMenuCtl)
	//    pMe->pIMenuCtl = NULL;
	// }
	//
}


●simple_OnAppStart

ここでは単純に画面クリアを行うプログラムを示します。
simple_OnAppStart を simple.c に追加します。


static void simple_OnAppStart(simple* pMe)
{
	// 画面クリア
	IDISPLAY_ClearScreen(pMe->a.m_pIDisplay);

	// 更新された画面ビットマップを表示
	IDISPLAY_Update(pMe->a.m_pIDisplay);
}


●実行

simple のビルドを行い、「デバッグ」「デバッグの開始」でプログラムを実行します。
実行プログラムには C:\Program Files\BREW SDK 3.1.2 Ja\sdk\bin\BREW_Simulator.exe を指定します。

simple BREW シミュレータの「アプレットディレクトリの変更」で、C:\BREW\samples に変更します。

携帯の画面のアプレットの一覧に simple が表示されます。
(MIF エディタで設定したアイコンが表示されます。)


simple simple を起動します。
画面をクリアし、白色表示となります。


非常にシンプルなアプリケーションの例ですが、以上がプログラム作成の手順となります。
より複雑なアプリケーションを作成するには、 文字の描画に IDisplay インターフェイス、 図形の描画に IGraphics インターフェイスを用いることになります。
詳細は BREW の専門書をご覧ください。

●サンプルプログラム

sample.zip
画面をクリアする BREW サンプルプログラムのプロジェクトです。
(上記サンプルと同じものです。)

helloworld.zip
「Hello World」と表示する BREW サンプルプログラムのプロジェクトです。


■BREW 関係の書籍

BREWプログラミング実践バイブル

BREW サンプルプログラム



詳解EZアプリ(BREW)プログラミング



■リンク


「BREW で OpenGL ES」

その1 「BREW SDK Extension for OpenGL ES」
その2 「OpenGL ES Sample 1.0.3」
その3 「BREW シミュレータ」
その4 「BREW でプログラミング - 基本編 -」
その5 「BREW でプログラミング - OpenGL ES 編 -」

<< 前 次 >>