CAse3D リファレンス ■ファイル構成とクラス ase3d.cpp / ase3d.h CAse3D 外部インターフェースコア ase3dbitmap.cpp / ase3dbitmap.h CAse3DBitmap 汎用 24 bit BMP → バイト列変換クラス(密かにCAse3D非依存) ase3denum.h CAse3D で使用される定数 ase3dinstancebuffer.cpp / ase3dinstancebuffer.h CAse3DInstanceBuffer 汎用バッファメモリ管理クラス ase3dmatrixstack.h CAse3DMatrixStack マトリクススタッククラス(インライン実装) ase3dtexture.cpp / ase3dtexture.h CAse3DTexture テクスチャ管理クラス ase3dutils.cpp / ase3dutils.h ベクトル/マトリクス計算などの雑用ルーチン ase3dzordertable.cpp / ase3dzordertable.h CAse3DZOrderTable 汎用オーダリングテーブルクラス(CAse3DInstanceBufferのみ必須) d3dhelper.cpp / d3dhelper.h d3dutils をどっかからパチってきてゴミ関数を加えてファイル名を変えたもの ■CAse3D リファレンス 通常は CAse3D のみ知ってれば大丈夫なハズ。 ● bool Begin( ASE3Denum iPrimitive ) プリミティブの開始 プリミティブの登録を開始する。 iPrimitive には ASE3D_POINT, ASE3D_LINE, ASE3D_LINESTRIP, ASE3D_TRIANGLE, ASE3D_TRIANGLESTRIP, ASE3D_TRIANGLEFAN, のいずれかを指定する。 BeginScene 〜 EndScene 間以外で呼び出された場合の動作は保証しない。 ● bool BeginLocalStage( void ) ローカルソーティングステージの開始 SortMode( ASE3D_LOCAL ) を指定した場合の ローカルなオーダリングテーブルを生成し、初期化する。 EndLocalStage でソートされたプリミティブがレンダリングされる。 BeginScene 〜 EndScene 間以外で呼び出された場合の動作は保証しない。 ● bool BeginScene( int r, int g, int b) シーンの開始(プリミティブを積む準備) r,g,b は背景色だが手抜きのため期待した色が得られない。 黒か白は確実に出る。 ● bool BindTexture( int iTextureName ) 指定したテクスチャをバインド iTextureNeme で指定したテクスチャをバインドする。 よーするにカレントテクスチャにする。 以後バインドしたテクスチャで描画し、 テクスチャの読み込みもバインドしているテクスチャに対して行なわれる。 テクスチャに対する属性設定も同様。 ● void BlendFunc(ASE3Denum iSrc, ASE3Denum iDst) アルファブレンディング方式の設定。 iSrc, iDst には以下の値を入れる。 ASE3D_ZERO = D3DBLEND_ZERO, ASE3D_ONE = D3DBLEND_ONE, ASE3D_SRC_COLOR = D3DBLEND_SRCCOLOR, ASE3D_ONE_MINUS_SRC_COLOR = D3DBLEND_INVSRCCOLOR, ASE3D_SRC_ALPHA = D3DBLEND_SRCALPHA, ASE3D_ONE_MINUS_SRC_ALPHA = D3DBLEND_INVSRCALPHA, ASE3D_DST_COLOR = D3DBLEND_DESTCOLOR, ASE3D_ONE_MINUS_DST_COLOR = D3DBLEND_INVDESTCOLOR, ASE3D_DST_ALPHA = D3DBLEND_DESTALPHA, ASE3D_ONE_MINUS_DST_ALPHA = D3DBLEND_INVDESTALPHA, ASE3D_SRC_ALPHA_SATURATE = D3DBLEND_SRCALPHASAT, ● void ClearMatrix( void ) マトリクススタックのクリア マトリクススタックをクリアする。 ● bool Color4f( float r, float g, float b, float a ) bool Color4i( DWORD r, DWORD g, DWORD b, DWORD a ) 頂点カラー登録(ライト無効時) ライト無効時のプリミティブ頂点カラーを設定する。 ただし a だけはライト有効時も有効になる。 むしろアルファ値このインターフェースで設定する。 ● bool DeleteTextures( int nbTextureNames, int iTextureName[] ) テクスチャネームを解放する nbTextureNames にテクスチャネーム配列の個数、 iTextureName[] にその先頭を入れると そのテクスチャネームを解放する。 ついでに読み込んでいたテクスチャイメージも解放する。 ● bool Enable( ASE3Denum iCapability ) bool Disable( ASE3Denum iCapability ) 各種機能の有効化と無効化 以下は iCapability に入れるパラメータと効果。 ASE3D_TINY_LIGHTING 手抜きライト機能 ASE3D_LIGHTING スゴいよライト(未実装)機能 ASE3D_NORMALIZE 法線の自動正規化機能 ASE3D_TEXTURE_2D テクスチャマッピング機能 ASE3D_BLEND アルファブレンディング機能 ASE3D_TEXTURE_GEN_S テクスチャ S 座標(横)自動生成機能(ウソ環境マップのみ実装) ASE3D_TEXTURE_GEN_T テクスチャ T 座標(縦)自動生成機能(ウソ環境マップのみ実装) ASE3D_LIGHT0 〜 ASE3D_LIGHT7 スゴいよライト機能のライト毎の ON / OFF ● bool End( void ) プリミティブの終了 Begin で始めたプリミティブの終了。 BeginScene 〜 EndScene 間以外で呼び出された場合の動作は保証しない。 ● bool EndLocalStage( void ) ローカルソーティングステージの終了 BeginLocalStage で始めたローカルソーティングステージを終了して、 ローカルなオーダリングテーブルの中に積んでたプリミティブをレンダリング。 BeginScene 〜 EndScene 間以外で呼び出された場合の動作は保証しない。 ● bool EndScene( void ) 積み終わったので描画 シーンを終了し、 グローバルソーティングステージに積まれたプリミティブをレンダリングし、 画面をフリップ。 ● void ExitSystem( void ) 終了。 システムを終了させる。 デストラクタで殺した方が楽だと思う。 ● bool GenTextures( int nbTextureNames, int iTextureName[] ) 空きテクスチャネームを得る nbTextureNames に空きテクスチャネームを入れる配列の個数、 iTexuteName[] に空きテクスチャネームを入れる配列の先頭を入れる。 空きがないときは iTextureName の各要素に -1 が入るような気がする。 ● void GetFloatv( ASE3Denum iParamName, float *pParam ) 何か値の取得 iParamName に入れるパラメータと pParam に入れなきゃならない値。 ASE3D_MODELVIEW_MATRIX カレントモデルビュー行列を取得する。 なので pParam は 16 個の float の配列の先頭を仕込んどく。 ASE3D_PROJECTION_MATRIX カレントプロジェクション行列を取得する。 なので pParam は 16 個の float の配列の先頭を仕込んどく。 ● void GetMatrix( float m[] ) カレントマトリクスの取得 何かのマチガイ。そのうち廃止される。 GetFloatv を使用すること。 当然ながら m は float x16 の配列の先頭。 ● bool InitSystem( HWND hWnd, int nWidth, int nHeight, int nbTextures, int nbBufferBytes, int nbPrimBytes ) システムの初期化 DirectXの初期化をして描画できるようにする。 hWnd:描画ターゲットとなるウィンドウ nWidth:オフスクリーンサーフェスの幅 nHeight:オフスクリーンサーフェスの高さ nbTextures: 格納できる最大テクスチャ枚数 nbBufferBytes: 頂点バッファのバイト数 nbPrinBytes: プリミティブバッファのバイト数 nWidth と nHeight はオフスクリーンサーフェスのサイズなので注意。 ターゲットウィンドウがオフスクリーンサーフェスよりも大きい場合は テキトーにウィンドウの真ん中に表示される。 ● void Light4f( ASE3Denum iLightName, ASE3Denum iParamName, float r, float g, float b, float a ) void Lightf( ASE3Denum iLightName, ASE3Denum iParamName, float fParam ) ライトパラメータ設定。 現状では手抜きライトのみ実装。 Light4f では iLightName = ASE3D_TINY_LIGHT iParameName = ASE3D_POSITION で手抜きライトの方向ベクトルを指定。常に内部で正規化する。これしかない。 Lightf では iLightName = ASE3D_TINY_LIGHT iParamName = ASE3D_AMBIENT アンビエントの強さ 0.0 〜 1.0 iParamName = ASE3D_DIFFUSE ディフューズの強さ 0.0 〜 1.0 iParamName = ASE3D_SPECULAR スペキュラーの強さ 0.0 〜 1.0 これしかない。 ● void LoadIdentity( void ) カレントマトリクスに単位行列を読み込み ● void LoadMatrixfv( float *matrix ) カレントマトリクスに読み込み カレントマトリクスに任意のマトリクスを読み込む。 matrix は当然 float x16 の配列の先頭。 ● void Material3f( ASE3Denum iParamName, float r, float g, float b ) マテリアル設定 iParamName には ASE3D_AMBIENT, ASE3D_DIFFUSE, ASE3D_SPECULAR を入れる。 現状で手抜きライトしかないので、ASE3D_DIFFUSE と ASE3D_SPECULAR のみ有効。 ● void MatrixMode( ASE3Denum iMatrixMode ) マトリクスモード変更 カレントマトリクスのマトリクスモードを変更する。 iMatrixMode には ASE3D_MODELVIEW モデルビューモード ASE3D_PROJECTION プロジェクションモード を指定する。 ● void MultMatrixfv( float *matrix ) カレントマトリクスに掛ける カレントマトリクスに任意のマトリクスを掛け算する。 matrix は当然 float x16 の配列の先頭。 ● bool Normal3f( float x, float y, float z ) プリミティブ法線登録 次に来る Vertex3f の法線を指定する。 ● void PopMatrix( void ) void PushMatrix( void ) マトリクスをプッシュ/ポップする。 マトリクススタックからカレントマトリクスへマトリクスをプッシュ/ポップする。 スタックはマトリクスモード毎に独立している。 ● void RotateXf( float fRad ) void RotateYf( float fRad ) void RotateZf( float fRad ) カレントマトリクスを回転する ● void SortMode( ASE3Denum eMode ) 半透明ソーティングモードの設定 半透明ソーティングを以下のように指定する。 ASE3D_GLOBAL グローバルなオーダリングテーブルでソート。低速。 ASE3D_LOCAL BeginLocalStage で始めたオーダリングテーブルでソート。低速。 ASE3D_DIRECT ソートしないで直接描画。高速。 オーダリングテーブルを使用する場合、プリミティブは分割される。 ソーティング用の座標にはプロジェクションマトリクスが適用される。 ● bool TexCoord2d2f( float u, float v ) プリミティブテクスチャ座標登録 次に来る Vertex3f のテクスチャ座標を指定。 ● bool TexEnvi( ASE3Denum iTarget, ASE3Denum iParamName, ASE3Denum iParam ) テクスチャ環境設定 カレントテクスチャにテクスチャブレンド方式を設定する。 iTarget ターゲット名。常に ASE3D_TEXTURE_ENV。 iParamName はパラメータ名。常に ASE3D_TEXTURE_ENV_MODE iParam は以下のものを入れる。 ASE3D_DECAL = D3DTBLEND_DECAL, ASE3D_MODULATE = D3DTBLEND_MODULATE, ASE3D_DECALALPHA = D3DTBLEND_DECALALPHA, ASE3D_MODULATEALPHA = D3DTBLEND_MODULATEALPHA, ASE3D_DECALMASK = D3DTBLEND_DECALMASK, ASE3D_MODULATEMASK = D3DTBLEND_MODULATEMASK, ASE3D_ADD = D3DTBLEND_ADD, ● bool TexImage2d( int nSize, int iDstFormat, int iSrcFormat, void *pPixel, void *pPalette ) テクスチャを読み込む カレントテクスチャにテクスチャイメージを読み込む nSize に画像解像度。 iDstFormat 転送先ピクセルフォーマット。 ASE3D_PF_RGB24 か ASE3D_PF_RGBA32 を指定。ただし現状でこの値は見ていない。 iSrcFormat に転送元ピクセルフォーマット。 ASE3D_PF_RGB24 か ASE3D_PF_RGBA32 を指定。 pPixel にピクセルのバイト列先頭。 pPalette にパレットのバイト列先頭。 ただし現状でパレットには未対応。 テクスチャイメージが既に読み込まれている場合に TexImage2D を実行すると、メモリリークが発生する。 既にテクスチャイメージが存在する場合は DeleteTexture を実行しておく必要がある。 また BeginScene 〜 EndScene 間での動作は保証されない。 シーン描画前にテクスチャを確定しておく必要がある。 また 256x256 よりも大きなテクスチャは勝手に 256x256 に縮小される。 読み込み後は pPixel、pPalette はアプリケーション側で解放できる。 ● bool TexParameteri( ASE3Denum iTarget, ASE3Denum iParamName, ASE3Denum iParam ) テクスチャパラメータ設定 カレントテクスチャに各種パラメータを設定する。 iTarget はパラメータ名。常に ASE3D_TEXTURE_2D を指定。 iParamName パラメータ名。以下のものを入れる。 ASE3D_TEXTURE_MIN_FILTER, ASE3D_TEXTURE_MAG_FILTER テクスチャのフィルタリングモードを設定する。 この場合 iParam には ASE3D_NEAREST = D3DFILTER_NEAREST ASE3D_LINEAR = D3DFILTER_LINEAR を設定する。 ASE3D_TEXTURE_WRAP_U, ASE3D_TEXTURE_WRAP_V テクスチャのラッピングモードを設定する。 こ場合 iParam には ASE3D_REPEAT = D3DTADDRESS_WRAP ASE3D_MIRROR = D3DTADDRESS_MIRROR ASE3D_CLAMP = D3DTADDRESS_CLAMP を設定する。 ● void Translate3f( float x, float y, float z ) カレントマトリクスの平行移動。 カレントマトリクスを平行移動する。 ● bool Vertex3f( float x, float y, float z ) プリミティブ頂点の登録 プリミティブ頂点を登録する。 Begin 〜 End 間以外で呼ばれた場合の動作は保証しない。 ● bool Vertex4f( float x, float y, float z, float weight ) ウェイト付きプリミティブ頂点登録 未実装。 ■ CAse3DBitmap 24 ビットのビットマップを読み込みバイト列に変換する汎用クラス。 CAse3D の TexImage2d で直接使える形式になる。 ●コンストラクタ CAse3DBitmap( const char szRGBImage[] ) ファイルから読み込み。アルファ無し。 CAse3DBitmap( const char szRGBImage[], const char szAlphaImage[] ) ファイルから読み込み。アルファ付き。 CAse3DBitmap( void *pRaw ); メモリ上のビットマップファイルイメージから読み込み。アルファ無し。 CAse3DBitmap( void *pRaw, void *pRawAlpha ); メモリ上のビットマップファイルイメージから読み込み。アルファ付き。 ● char* GetPixels( void ) 変換したバイト列の取得 変換したバイト列を取得する。 アルファ無しならば、RGBRGBRGBRGBRGBRGB...、 アルファ付きならば、RGBARGBARGBARGBARGBA... で格納されている。 ● int GetWidth( void ) int GetHeight( void ) イメージサイズの取得 読み込んだビットマップのサイズを返す。 ■ ase3dutils 内の関数群 DirectX からアプリケーションを分離したいときなどに使用する。 ただし CAse3D が現状で DirectX 用しかないのであんまり意味はない。 とりあえずこの関数群を使っておけば、将来 CAse3D が他のプラットホームに移植された場合、 比較的簡単にアプリケーションをマルチプラットホーム化できる。 ■ 型と定数 ● いろんなπ #ifndef PI #define PI (3.141592654f) #endif #ifndef PI2 #define PI2 (6.283185307f) #endif #ifndef PIH #define PIH (1.570796327f) #endif #ifndef PIQ #define PIQ (0.785398163f) #endif ● ベクトル typedef struct _A3S_VECTOR3 A3S_VECTOR3; struct _A3S_VECTOR3 { float x, y, z; }; 3D の浮動小数点ベクトル。 プラットホームによって w メンバが増えたりするかも。 typedef struct _A3S_IVECTOR2 A3S_IVECTOR2; struct _A3S_IVECTOR2 { int x, y; }; 2D の整数ベクトル。 まだ未使用。 ● マトリクス typedef struct _A3S_MATRIX A3S_MATRIX; struct _A3S_MATRIX { float m[16]; }; 横ベクトルをターゲットにした何の変哲もない 4x4 マトリクス つまり移動成分は m[12] m[13] m[14] に来る。 ● 線分と無限平面 typedef struct _A3S_LINE A3S_LINE; struct _A3S_LINE { A3S_VECTOR3 vcStart; A3S_VECTOR3 vcEnd; }; typedef struct _A3S_FACE A3S_FACE; struct _A3S_FACE { A3S_VECTOR3 vcNormal; A3S_VECTOR3 vcPoint; }; ■ ベクトル操作関数 A3S_VECTOR の中身がプラットホームによって変わる可能性があるので、 このインターフェースを使ってベクトルにアクセスすればポータビリティが上がる。 ● A3S_VECTOR3* ase3duVectorSet( A3S_VECTOR3 *pvcTarget, float x, float y, float z ) 値を設定する。 ● A3S_VECTOR3* ase3duVectorCopy( A3S_VECTOR3 *pvcDst, A3S_VECTOR3 *pvcSrc ) コピー。 ● A3S_VECTOR3* ase3duVectorAdd( A3S_VECTOR3 *pvcResult, A3S_VECTOR3 *pvcTarget, A3S_VECTOR3 *pvcAdd ) 加算。 ● A3S_VECTOR3* ase3duVectorSub( A3S_VECTOR3 *pvcResult, A3S_VECTOR3 *pvcTarget, A3S_VECTOR3 *pvcSub ) 減算。 ● A3S_VECTOR3* ase3duVectorScale( A3S_VECTOR3 *pvcResult, A3S_VECTOR3 *pvcTarget, float fScale ) 拡大。 ● A3S_VECTOR3* ase3duVectorNormalize( A3S_VECTOR3 *pvcTarget ) float ase3duVectorNormalizeLength( A3S_VECTOR3 *pvcTarget ) 正規化。 正規化したベクトルが戻るものと正規化する前の長さを返すもの。 ● float ase3duVectorLength( A3S_VECTOR3 *pvcTarget ) 長さを得る。 ● float ase3duVectorDotProduct( A3S_VECTOR3 *pvcTarget1, A3S_VECTOR3 *pvcTarget2 ) 内積を得る。 ● A3S_VECTOR3* ase3duVectorCrossProduct( A3S_VECTOR3 *pvcResult, A3S_VECTOR3 *pvcTarget1, A3S_VECTOR3 *pvcTarget2 ) 外積を得る。 ■ マトリクス操作関数 プラットホームによって A3S_MATRIX の中身が変わる可能性があるので、 このインターフェースを使ってマトリクスにアクセスするとポータビリティが上がる。 ● A3S_MATRIX* ase3duMatrixIdentity( A3S_MATRIX *pMatrix ) 単位行列を入れる。 ● A3S_MATRIX* ase3duMatrixCopy( A3S_MATRIX *pDst, A3S_MATRIX *pSrc ) コピー。 ● A3S_MATRIX* ase3duMatrixXZShadow( A3S_MATRIX *pDst, float fHeight, float dx, float dy, float dz ) XZ 平面への影を作る行列を入れる。 fHeight は XZ 平面の Y 座標。 dx,dy,dz はライトの方向ベクトル。 ● A3S_VECTOR3* ase3duMatrixGetAt( A3S_MATRIX *pMatrix, A3S_VECTOR3 *pvcAt ) 前方向成分。 ● A3S_VECTOR3* ase3duMatrixGetUp( A3S_MATRIX *pMatrix, A3S_VECTOR3 *pvcUp ) 上方向成分。 ● A3S_VECTOR3* ase3duMatrixGetRight( A3S_MATRIX *pMatrix, A3S_VECTOR3 *pvcRight ) 右?方向成分。 ● A3S_VECTOR3* ase3duMatrixGetTrans( A3S_MATRIX *pMatrix, A3S_VECTOR3 *pvcTrs ) 移動成分。 ● A3S_MATRIX* ase3duMatrixMult( A3S_MATRIX *pResult, A3S_MATRIX *pLeft, A3S_MATRIX *pRight ) 掛け算。当然左のマトリクスがベクトルに近い。 ● A3S_MATRIX* ase3duMatrixRotateX( A3S_MATRIX *pMatrix, float fRad ) X 軸回転を左掛け。ベクトルに近い方から掛ける。 ● A3S_MATRIX* ase3duMatrixRotateY( A3S_MATRIX *pMatrix, float fRad ) Y 軸回転を左掛け。ベクトルに近い方から掛ける。 ● A3S_MATRIX* ase3duMatrixRotateZ( A3S_MATRIX *pMatrix, float fRad ) Z 軸回転を左掛け。ベクトルに近い方から掛ける。 ● A3S_MATRIX* ase3duMatrixTranslate( A3S_MATRIX *pMatrix, float x, float y, float z ) 移動を左掛け。ベクトルに近い方から掛ける。 ● A3S_VECTOR3* ase3duMatrixTransform( A3S_MATRIX *pMatrix, A3S_VECTOR3 *pvcTarget, A3S_VECTOR3 *pvcResult ) なにも考えずにベクトルを変形。 ふつーに変形したいだけのときに使う。 ● float ase3duMatrixTransformEx( A3S_MATRIX *pMatrix, A3S_VECTOR3 *pvcTarget, A3S_VECTOR3 *pvcResult ) ベクトルを変形して同次座標 w でベクトルの各成分を割る。ついでに 1/w が戻る。 投影行列で変形するときとかに使う。 ● A3S_VECTOR3* ase3duMatrixTransformNormal( A3S_MATRIX *pMatrix, A3S_VECTOR3 *pvcTarget, A3S_VECTOR3 *pvcResult ) なにも考えずにベクトルを変形するけど平行移動は加えず回転のみの変形。 法線をまわしたりするときに使う。 ■ そのほかの関数 結構使う関数。 ● float ase3duRad2Deg( float fRad ) ラジアン→角度 ● float ase3duDeg2Rad( float fDeg ) 角度→ラジアン ● float ase3duRoundRad( float fRad ) ラジアンを 0.0f 〜 3.14f*2.0f に丸める。 ■ 線分と無限平面 スクリーンピック用の当たり判定に使うもの。 ● A3S_VECTOR3* ase3duLineGetIntersectionToFace( A3S_LINE *pLine, A3S_FACE *pFace, A3S_VECTOR3 *pResult ) 線分と無限平面との交点を得る。 当たってないときは確か NULL が返る。 pResult に交点を入れて欲しいベクトルのポインタを入れる。 ● A3S_LINE *ase3duGetPickerLine( float fWindowWidth, float fWindowHeight, float fScreenWidth, float fScreenHeight, float fScreenX, float fScreenY, float fNear, float fFar, float fAngle, A3S_LINE *pLine ); スクリーンピック用の線分を計算する。 ニアプレーンからファープレーンまでの線分を返す。 fWindowWidth,fWindowHeight : ウィンドウの幅と高さ(ピクセル単位) fScreenWidth,fScreenHeight : オフスクリーンの幅と高さ(ピクセル単位) fScreenX,fScreenY : ピックするスクリーンの座標(ピクセル単位) fNear,fFar : ニア、ファープレーン(3D 座標) fAngle : 画角(ラジアン) pLine : 結果を格納して欲しい A3S_LINE のポインタ CAse3D ではオフスクリーンよりウィンドウがデカいときに オフスクリーンがウィンドウ真ん中に表示されるので、ウィンドウの幅と高さが必要。 結果はビュー 3D 座標系で返る。