#include "sgl.h" FIXED dist; void slSetScreenDist( dist );
FIXED dist - スクリーンまでの距離定数。
void - 何も返しません。
透視変換をする時に使用する スクリーンまでの距離定数を設定します。
回転スクロールの回転中心Z位置も設定します。
slSetScreenDist( toFIXED( 40.0 ) );
slWindow |
slZdspLevel |
slPerspective |
ComWrPtr |
ComRdPtr |
MsScreenDist |
Resolution |
RotScrParA |
RotScrParB |
#include "sgl.h" void *dist; Uint16 size_x; Uint16 size_y; void slGetFrameData( dist, size_x, size_y );
void *dist - Uint16 size_x - 読み出された後のXサイズ。
Uint16 size_y - 読み出された後のYサイズ。
void - 何も返しません。
フレームバッファの内容(1画面分)を読み出し、指定されたサイズに スケーリング(間引き)してセットします。
4ドット単位で処理しているので、Xサイズは4の倍数とします。
バッファには低解像度の場合2バイト/ドット、高解像度の場合(1バイト/ドット) で、書き込みます。
読み出したデータをスプライトとして表示したい場合、 低解像度: slSpriteColMode( SPR_PAL_RGB ); /* default */ とし、 SPR_ATTRIBUTE( PN_???, No_Palet, No_Gouraud, SPdis|ECdis|CL32KRGB, sprNoflip ); といったアトリビュートでスプライト表示関数を実行します。
高解像度の場合には slSpriteColMode( SPR_PAL ); SPR_ATTRIBUTE( PN_???, No_Palet, No_Gouraud, SPdis|ECdis|CL256Bnk, sprNoflip ); のアトリビュートで表示させます。
この関数ではVDP1の描画終了を待ち、フレームバッファを飛ばし読みして、 バッファにセットしています。フレームバッファの読み出しにはかなりの ウェイトが入るため、32x24(=768)ドットで5msec.程度の時間がかかるので、 処理時間に注意して使用してください。
読み込むバッファをワーク上にとり、ブランキングでVRAMに転送する方が、 直接VRAMに展開するよりはウェイトが少ないようです。
MsScreenSizeX |
MsScreenSizeY |
Resolution |
#include "sgl.h" ANGLE pers; void slPerspective( pers );
ANGLE pers - ビューイングボリウムの角度。
void - 何も返しません。
透視変換をする時に使用する スクリーンまでの距離定数を設定します。
回転スクロールの回転中心Z位置も設定します。
画角はスクリーンの横幅(ウィンドウのサイズではない)に視野が入る角度と して使用します。
slPerspective( DEGtoANG( 60.0 ) );
slWindow |
slZdspLevel |
slSetScreenDist |
ComWrPtr |
ComRdPtr |
MsScreenDist |
SlScreenDist |
MsScreenSizeX |
MsScreenSizeY |
RotScrParA |
RotScrParB |
#include "sgl.h" Uint16 level; Bool slZdspLevel( level );
Uint16 level - 表示レベル。
Bool - 引数に規定値以外を入れた場合FALSE、それ以外TRUE。
スクリーンよりも手前にあるポリゴン(あるいはスプライトデータ)をどこまで 表示するのかを切り替えます。
level は1〜7のいずれかで、それ以外はエラーになります。
1: スクリーンまでの距離の1/2までを表示範囲にします(default)。
2: スクリーンまでの距離の1/4までを表示範囲にします。
3: スクリーンまでの距離の1/8までを表示範囲にします。
4: スクリーンまでの距離の1/16までを表示範囲にします。
5: スクリーンまでの距離の1/32までを表示範囲にします。
6: スクリーンまでの距離の1/64までを表示範囲にします。
7: スクリーンまでの距離の1/128までを表示範囲にします。
レベルを切り替えるとそれ以降に表示するポリゴン(あるいはスプライト)に 対して、slWindowで指定したzlimの基準位置も同様に変化しますので、注意して ください。
表示レベルを7(スクリーンの距離までの1/128)にする。
slZdspLevel( 7 );
slPutPolygon |
slPutPolygonS |
slPutPolygonX |
slDispPolygon |
slPutSprite |
slSetSprite |
slDispSprite |
slDispSpriteHV |
slDispSpriteSZ |
slDispSprite4P |
slWindow |
slPutObject |
ComWrPtr |
ComRdPtr |
SlZlimit |
#include "sgl.h" FIXED pos[ XYZS ]; ATTR *attr; ANGLE z_ang; Bool slDispSprite( pos, atrb, z_ang );
FIXED pos[ XYZS ] - スプライトの位置。
ATTR *attr - スプライトの属性。
ANGLE z_ang - スプライトの回転角。
Bool - エラーコード(後述)。
ポジション、スケール、回転角を指定し、スプライトを表示します。
slPutPolygon() と同様 Z値によりソーティングもします。
スケールにマイナスの値を指定した場合、Zポジションによりスケールを算出し、 スケールの補数を掛け、表示用のスケールとします。
例えば、スケールに-2.0を指定した場合、0.5倍で表示されるような位置 (Zポジション)にあれば、1.0倍になって表示されます。
スケールがゼロ又は、スプライトの表示座標(Z)が遠過ぎるあるいは、最大表示数を 越えたスプライトを表示しようとした場合、エラーコードFALSEを返します。
FIXED pos[ XYZS ] = { toFIXED( 0.0 ), toFIXED( 0.0 ), toFIXED( 110.0 ), toFIXED( ORIGINAL ) }; SPR_ATTR attr = SPR_ATTRIBUTE( 0, 0, No_Gouraud, CL16Bnk, sprNoflip|_ZmCC); slDispSprite( pos, attr, DEGtoANG( 0.0 ) );
この関数は、座標値取得及びソートの決定にスレーブCPUを使用します。
#include "sgl.h" FIXED pos[ XYZSS ]; ATTR *attr; ANGLE z_ang; Bool slDispSpriteHV( pos, attr, z_ang );
FIXED pos[ XYZSS ] - スプライトの位置。
ATTR *attr - スプライトの属性。
ANGLE z_ang - スプライトの回転角。
Bool - エラーコード(後述)。
縦、横の表示スケールを指定して、変形スプライトを表示します。
上記の slDispSprite() 関数と異なり、スケールにマイナスを指定した 場合キャラクターは反転して表示されます。
スケールがゼロ又は、スプライトの表示座標(Z)が遠過ぎるあるいは、表示数を 越えたスプライトを表示しようとした場合エラーFALSEを返します。
#define FX0 toFIXED( 0.0 ) FIXED pos[ XYZSS ] = { FX0, FX0, toFIXED( 110.0 ), toFIXED( ORIGINAL ), toFIXED( 2.0 ) }; SPR_ATTR attr = SPR_ATTRIBUTE( 0, 0, No_Gouraud, CL16Bnk, sprNoflip|_ZmCC); slDispSpriteHV( pos, attr, DEGtoANG( 0.0 ) );
この関数は、座標値取得及びソートの決定にマスターCPUを使用します。
slWindow |
slZdspLevel |
slPutSprite |
slSetSprite |
slDispSprite |
slDispSpriteSZ |
slDispSprite4P |
SpritePtr |
DispPolygons |
DMAEndFlag |
DMASetFlag |
PutCount |
SPR_ATTR |
SPR_ATTRIBUTE |
#include "sgl.h" FIXED pos[ XYZSS ]; ATTR *attr; ANGLE z_ang; Bool slDispSpriteSZ( pos, attr, ang_z );
FIXED pos[ XYZSS ] - スプライトの位置。
ATTR *attr - スプライトの属性。
ANGLE z_ang - スプライトの回転角。
Bool - エラーコード(後述)。
縦、横の表示サイズを指定して、変形スプライトを表示します。
サイズにマイナスが指定された場合には、反転して表示されます。
サイズがゼロ又は、スプライトの表示座標(Z)が遠過ぎるあるいは、表示数を 越えたスプライトを表示しようとした場合エラーFALSEを返します。
#define FX0 toFIXED( 0.0 ) FIXED pos[ XYZSS ] = { toFIXED( 30.0 ), FX0, toFIXED( 110.0 ), toFIXED( 0.5 ), toFIXED( 2.0 ) }; SPR_ATTR attr = SPR_ATTRIBUTE( 0, 0, No_Gouraud, CL16Bnk[a], sprNoflip|_ZmCC); slDispSpriteSZ( pos, attr, DEGtoANG( 0.0 ) );
この関数は、座標値取得及びソートの決定にマスターCPUを使用します。
#include "sgl.h" FIXED pos[ 4 ][ XY ]; FIXED pos_z; SPR_ATTR*attr; Bool slDispSprite4P( pos, pos_z, attr );
FIXED pos[ 4 ][ XY ] - 4頂点の座標。
FIXED pos_z; - ソートの基準値。
SPR_ATTR*attr; - 属性。
Bool - エラーコード(後述)。
画面上の4点を指定して、変形スプライトを表示します。
4点はウィンドウ中心に対するオフセット位置で指定し、全体を代表する Z位置を別に指定します。
4点は左上、右上、右下、左下の順(時計回り)で指定します。
4点の内いずれでも、クリップの範囲を越えた場合エラーコードFALSEを返します。
FIXED pos[ 4 ][ XY ] = { { toFIXED( 0.0 ), toFIXED( 0.0 ) }, { toFIXED( 40.0 ), toFIXED( 10.0 ) }, { toFIXED( 70.0 ), toFIXED( 60.0 ) }, { toFIXED( 10.0 ), toFIXED( 50.0 ) } }; SPR_ATTR attr = SPR_ATTRIBUTE( 2, 0x100, No_Gouraud, CL16Bnk, sprNoflip | _ZmCC ); slDispSprite4P( pos, toFIXED( 150.0 ), attr );
この関数は、座標値取得及びソートの決定にマスターCPUを使用します。
#include "sgl.h" FIXED pos[ XYZS ]; ATTR *attr; ANGLE ang_z; Bool slPutSprite( pos, attr, ang_z );
FIXED pos[ XYZS ]; ATTR *attr; ANGLE ang_z;
Bool - エラーコード(後述)。
カレントマトリクスを使用してポジションを算出し、透視変換に合わせて スケーリングされたスプライトを表示します。
上記の slDispSprite() と同じように 指定されたスケール倍 されますが、マイナスを指定した場合、符号反転してスケーリングされます。
最大ポリゴン数又は最大頂点数を越えた場合、エラーコード'FALSE'を返します。
FIXED pos[ XYZS ] = { toFIXED( 0.0 ), toFIXED( 0.0 ), toFIXED ( 110.0 ), toFIXED( ORIGINAL ) }; SPR_ATTR attr = SPR_ATTRIBUTE( 0, 0, No_Gouraud, CL16Bnk, sprNoflip | _ZmCC ); slPutSprite( pos, attr, DEGtoANG( 0.0 ) );
この関数は、座標値取得及びソートの決定にスレーブCPUを使用します。
#include "sgl.h" SPRITE *spr; FIXED pos_z; Bool slSetSprite( spr, pos_z );
SPRITE *spr - 表示するVDP1のコマンドデータ。
FIXED pos_z - ソートのための基準。
Bool - エラーコード(後述)。
ハードウエアに渡すスプライトコントロールコマンドデータを転送リストに セットします。
ライブラリ関数では作成できないような変形スプライトや、特定のスプライ トにのみ影響するウィンドウの設定をしたい場合などに使用します。
最大ポリゴン数を越えた場合または、Zクリッピング境界を越えて使用した場合 エラーコードFALSEを返します。
SPRITE attr = { FUNC_Sprite, /* Drawing Sprite */ 0, /* Link ( Ignore ) */ ECdis | SPenb | CL16Look | CL_Trans, /* Color mode. */ ( 0x1b000 >> 3 ), /* Color bank number. */ ( 0x12400 >> 3 ), /* Character address. */ ( ( 64 / 8 ) << 8 | 96 ), /* Character size ((x/8)<<8|y) */ 0, /* A(x) */ 0, /* A(y) */ 64, /* B(x) */ 0, /* B(y) */ 64, /* C(x) */ 96, /* C(y) */ 0, /* D(x) */ 96, /* D(y) */ 0, /* Gouraud table address */ 0 /* Dummy. */ }; slSetSprite( attr, toFIXED( 145.0 ) );
この関数は、ソートの決定にスレーブCPUを使用します。
#include "sgl.h" Sint16 left, top, right, bottom; Uint16 zlim; Sint16 cen_x, cen_y; Bool slWindow( left, top, right, bottom, zlim, cen_x, cen_y );
Sint16 left - ウインドウの右端。
Sint16 top - ウインドウの上端。
Sint16 right - ウインドウの左端。
Sint16 bottom - ウインドウの下端。
Uint16 zlim - Z限界。
Sint16 cen_x - 消失点(座標原点)のX座標。
Sint16 cen_y - 消失点(座標原点)のY座標。
Bool - エラーコード(後述)。
スプライト、及びポリゴンの表示を制限する範囲を設定します。
表示範囲は TV 画面上での位置で、表示中に2回まで指定できます。
zlimは これより先が表示されなくなります。
cen_x, cen_y は ポリゴンでは消失点の位置、スプライトでは座標原点に なります。
画面上での位置は左上が( 0, 0 )、右下が( 319, 223 ) <通常画面サイズ> です。
トータルのウインドウ数が3つ以上になったら、関数の戻り値としてFALSEを 返します。成功した場合TRUEが返ります。
ウインドウの左上座標(10,15)、右下座標(300,195)、消失点はこのウインドウの 中央、Z限界値を5000hとするウインドウ。
slWindow( 10, 15, 300, 195, 0x5000, 145, 75 ); 下の注意も見よ。
slWindow() を 呼ぶ前に slPutPolygon(), slPutSprite() 等のスプライト をセットする関数を使用すると、それらには全画面サイズのウィンドウが使 用され、改めて呼ばれた slWindow() で設定されるウィンドウが 二つ目になります。
通常は slWindow(...) ; /* Window 1 */ ... slPutPolygon(...) ; slPutSprite(...) ; ... slWindow(...) ; /* Window 2 */ ... slPutSprite(...) ; slPutPolygon(...) ; のように、処理のはじめにウィンドウをセットし、切替えたい所でもう一度 別のウィンドウをセットするようにします。
#include "sgl.h" Uint8 win; void slCurWindow( win );
Uint8 win - 切替えるウインドウのタイプ(後述)。
void - 何も返しません。
表示するウィンドウを切り替えます。
win には winFar(奥側) , winNear(手前側) のいずれかを指定します。
本関数を実行すると、スクリーン位置、表示領域が設定されますが、 光源ベクトルは変更されませんので、注意してください。
表示するウインドウを奥にする。
slCurWindow( winFar );
#include "sgl.h" Uint8 slSprWinNum( void );
void - 何も与えません。
Uint8 - 表示に使用されているウインドウ番号。
表示に使用されているウィンドウ番号を返します。
Uint8 winno; winno = slSprWinNum();
slWindow |
slCurWindow |
WindowNumber |
#include "sgl.h" Sint16 size_x, size_y; void slFrameClipSize( size_x, size_y );
Sint16 size_x - クリップのXサイズ。
Sint16 size_y - クリップのYサイズ。
void - 何も返しません。
スプライト表示関数slDispSprite、slDispSpriteHV、 slDispSpriteSZ、slDispSprite4P、slPutSpriteと、 UseClipオプションを指定したポリゴンを表示する範囲を設定します。
ウィンドウサイズに対し、上下左右にそれぞれ指定された幅を加えた領域から 外れた点に対し非表示とします。
slFrameClipSize( 10, 5, 190, 200 );
slInitSystem |
slWindow |
WindowNumber |
MsWindowSizeX |
MsWindowSizeY |
FrameSizeX |
FrameSizeY |
SlClipXAdder |
SlClipYAdder |
#include "sgl.h" Bool slCheckSlave( void )
void - 何も与えません。
Bool - スレーブのステータス(後述)。
スレーブの動作状況をチェックします。
スレーブのタスク(ジオメトリの計算)が終了するのを待ってから、 slSynchを呼ぶ。
while ( slCheckSlave() != TRUE ); slSynch();
この関数は、透視変換、ジオメトリ演算を必要とするスプライト/ポリゴン描画 関数の演算が終了しているかを知るもので、ユーザがslSlaveFuncで 設定した関数の動作について調べるものではありません。
slPutPolygon |
slPutPolygonS |
slDispPolygon |
slPutObject |
slPutSprite |
slDispSprite |
slDispSpriteSZ |
slDispSprite4P |
slDispSpriteHV |
slPutPolygonX |