SLANG用MAGIC対応グラフィックライブラリ GRAPH.LIB

黒木淳一
 
 GRAPH.LIBは,SLANGでMAGICを簡単においしく利用するためのライブラリです。機能としてはMAGICの機能をフルサポート,そのほかにもゲーム作成に便利な画面切り替え関数,ポリゴン描画関数などかなり充実しています。
 唯一の問題としてパレット機能を使う関数が,パレット機能を持たないMZ-2000/2200では正常に動きません。こればっかりは,ハードの制約ですのでがまんしてください。
 

◆メモリ節約の話

 このライブラリは,ほかのソースプログラムにインクルードして使うことを前提としています。しかし,結構リストが大きいうえにSOROBAN.LIBまで組み込む必要があるため,ライブラリだけでもかなりメモリを消費します(すぺての関数を利用しようとする人はあきらめてください)。
 そこで,このライブラリでは関数をいくつかに区切って,必要な関数だけをコンパイルすることができるようになっています。
 以下に説明する定数をライブラリを呼び出す,メインプログラムの先頭で定義することによって関数を切り離せるのです。定数の値が1のときにその関数を組み込み,0のときには組み込みません。
・_SINCOS
 整数三角関数と整数逆三角関数,そしてこれらの関数を利用している関数の利用を選択します。
・_FLOAT
 SOROBAN.LIBを使用している関数の利用を選択します。
・_PLOTSW
 プロッタプリンタ出力関係の関数の利用を選択します。
・_THREE
 3D関係の関数の利用を選択します。
・_TILESW
 タイリンクーパターンを使用している関数の利用を選択します。
・_GHIN
 上記の定数を利用してもまだメモリが足りない,または使わない関数が多いということがあります。そういうときは,この定数を利用して使用頻度の低い7つの関数を任意に削除することができます。消したい関数に対応するビットを0にしてコンパイルしてください。なお,上位バイトは意味を持ちません。
ビット
0
1
2
3
4
5
6
7
関数名
@SPLINE
@CPOLY
@ROAD
@CFULL
reserve
@TLINE
@CLINE
@CBOX
 具体的にどの関数が切り離されるかは,それぞれの関数中で説明されていますので,そちらを参照してください。
 

◆グローバル変数

 次にGRAPH.LIBで使われているグローパル変数の説明をします。
●_CO[31]
 この配列はMAGICのコマンド列を格納するためのものです。たとえば,LINE関数が呼び出されたときに,MAGICのLINEコマンドを実行するために必要なコマンドが,この配列に生成されます。普段ユーザーが使う必要はありません。
●_ZAHYO[P][I]:$C6B6
 空間図形の項点座標を格納しています。
  P=0〜255(項点番号)
  I=0項点  X座標
   =1頂点  Y座標
   =2頂点  Z座標
●_WIRE[P][I]:$CCB6
 空間図形の線分情報を格納しています。
  P=0〜255(線分番号)
  I=0  頂点1
   =1  頂点2
●_LPCT[1]:$C6B4
 _LPCT[0]には項点の数,_LPCT[1]には線分の数が格納されます。
●_DISP[P][I]:$C2B4(READ ONLY)
 空間図形の2D変換後の座標が絡納されます。
  P=0〜255(変換後の座標番号,_ZAHYOのPと対応)
  I=0  変換後のX座標
   =1  変換後のY座楳
●_PAR[I]:$C203
 3D→2D変換用のパラメータが格納されています。
  I=0:CX
   =1:CY  物体の位置
   =2:CZ  (オフセット)
   =3:DX
   =4:DY  回転の中心座標
   =5:DZ
   =6:HEAD
   =7:PITCH 回転角度
   =8:BANK
 上記の5つの配列は,MAGICの3D表示機能を使うときに利用されるものです。見てのとおり,これらの配列はMAGICの共通ワークエリアにかぶせて定義されているため,これらの配列への代入→MAGICへのデータ定義とすることもできます。当然,配列への定義用関数は用意されています(@SETMOD( ),@SETWD( )参照)。
 また,_PAR[ ]だけはユーザーの手で直接書き込んでやらなくてはなりません。そのほかの配列については,ライブラリ関数やMAGIC側で書き込んでくれます。そして,どの配列もユーザーの手で書き込むことができます。確かに,普通はこれらの配列をアクセスすることはあまりないはずですが,変則的な使い方をするとき,たとえば,アニメーション処理を複数パターンを使わず,配列に格納されている座標の変更だけで行うことができます。
●_TILE1,_TILE2
 これらの変数は,MAGICのCIRCLE,TRIANGLE,BOX,FILL描画するときに必要なタイルパターンを格納しておくためのもので,2つでひと組となっています。特殊な形でなくていいなら@GRAD関数でタイルパターンを生成してくれるため,ユーザーが直接触ることは少ないでしょう。
●_MSCREEN
 この変数には@CRTKN関数を使用するときに,BLUE,REDのどのプレーンに書き込むかという情報を格納しています。
●_SPITCH PITCH角度
●_SHEAD HEAD角度
●_SBANK BANK角度
●_OFSX  オフセットX座標
●_OFSY  オフセットY座標
●_OFSZ  オフセットZ座標
 これらの座標は,ユーザーが定義したときに必要なパラメータ(_PAR[ ])とは違い,@TLINE( ),@CPOLY( ),@WAVE( )などの,直接3Dグラフイツク描画関数を扱う関数を使うときに利用されるパラメータです。
●_DEMODE
 @CLINE( ),@CBOX( )の表示モードを絡納します。0でPRESET,1でXORモード,2でORモードになります。
●_KSTEP
 @WAVE( ),@CPOLY( ),@KYU( )のステップ角度を格納します。デフォルトは15です。
●_SBLUE,_SRED,_SGREEN
 @CPOLY( ),@WAVE( ),@KYU( )のポリゴン描画する商の色の濃度を格納します。範囲は0〜7までです。
●_LX,_LY,_LZ
 @CPOLY( ),@WAVE( ),@KYU( )実行時の光線ベクトルを格納します。
●_GMASK
 @CPOLY,@CFULLが描画する3プレーンにマスクを指定します。_GMASKの下位3ビットがそれぞれのプレーンに対応していて,ビットが1のページをマスクします。
 これはポリゴン関係の関数を使った場合全プレーンに影響するため,画面切り替えを使ったアニメーションをするのが不可能です。そこでこのマスク機能を使って,うまく1プレーンにのみ摘画するようにして実現できるための機能です。
●_WSEL
 これは@CPOLYでの描画モードを指定するものです。指定は下位4ビットで行います。それぞれのビットを立てることにより機能します。
ビット
0
1
2
3
機能
ポリゴンとワイヤープレームします。
ポリゴンの表示をキャンセルします。
陰面処理付きのワイヤフレーム表示にします。
ポリゴンを描画してからポリゴンの輪郭を緑色のワイヤーフレームで描画します。
 

◆関数

 では,ここからGRAPH.LIBで使用できる関数を説明していきます。
●@LINE(X1,Y1,X2,Y2)
 (X1,Y1)-(X2,Y2)を結ぶ直線を単プレーンに書き込みます。
●@SPLINE(X1,Y1,X2,Y2,X3,Y3)
 (X1,Y1),(X2,Y2),(X3,Y3)を結ぶスプライン曲線を単プレーンに書き込みます。_GHINの0ビットを0にしてコンパイルすると削除できます。
●@BOX(X1,Y1,X2,Y2)
 (X1,Y1)を左上,(X2,Y2)を右下にしたボックスを単プレーンに書き込みます。
●@TRIANGLE(X1,Y1,X2,Y2,X3,Y3)
 (X1,Y1),(X2,Y2),(X3,Y3)を結ぶ三角形を_TILE1,_TILE2で定義したタイルパターンで塗り潰します。_TILESWを0にしてコンパイルすると削除できます。
●@FULL(X1,Y1,X2,Y2)
 (X1,Y1)を左上,(X2,Y2)を右下の座標にしたボックスを_TILE1,_TILE2で定義したタイルパターンで塗り潰します。_TILESWを0にしてコンパイルすると削除できます。
●@CIRCLE(X1,Y1,R1)
 (X1,Y1)を中心とした半径R1の円をTILE1,_TILE2で定義したタイルパターンで塗り潰します。TILESWを0にしてコンパイルすると削除できます。
●@WINDOW(X1,Y1,X2,Y2)
 グラフイック描画範囲を(X1,Y1)-(X2,Y2)にします。
●@MODE(MODE,PLANE)
 単プレーン書き込み関数の書き込むプレーンの設定と,描画モードの設定をします。引数の値は以下のとおりに対応しています。

0:
1:
2:
MODE
PRESET
XOR
OR
PLANE
BLUE
RED
GREEN
●@CLS( )
 単プレーンの画面消去を行います。
●@PALET(A0,A1,A2,A3,A4,A5,A6,A7)
 パレットの変更を行います。
●@INIT( )
 GRAPH.LIBの初期化を行います。必ず最初に実行するようにしてください。
●@SETOD(POSIT,LENGTH)
●@SETWD(POSIT,LENGTH)
 ユーザーが作成した空間図形をMAGICに登録します。@SETODは頂点座標の定義,@SETWDは線分の定義です。_THREEを0にしてコンパイルすると削除できます。
(例)
 ARRAY WORD OBJD0[7][2]=[
   %-50,% 50,%-50,
   %-50,% 50,% 50,
   % 50,% 50,% 50,
   % 50,% 50,%-50,
   %-50,%-50,%-50,
   %-50,%-50,% 50,
   % 50,%-50,% 50,
   % 50,%-50,%-50];
  BYTE OBJW0[11][1]=[
   0,1,1,2,2,3,3,0,
   4,5,5,6,6,7,7,4,
   0,4,1,5,2,6,3,7];
 MAIN()
 [
   @INIT();        (*初期化*)
   @SETOD(&OBJD0,7);   (*線分登録*)
   @SETWD(&OBJW0,11); (*線分登録場*)
   @MAGIC(0);      (*3D→2D*)
   @MAGIC(1);      (*表示*)
 ]
●@MAGIC(COM)
 COM=0のときMAGICに登録された空間図形を3D→2D変換します。COM=1のときは2D変換された空間図形を表示します。
●@CRTKN(COLOR,GR,PRW)
 呼び出されるたびに描画ページをBLUE,REDの2ぺージを交互に切り替えます。画面表示を行ったあとに,この関数を実行してCLS()を使って画面消去することにより,完全に画面のちらつき守なくすことができます。また,余ったGREENプレーンはバックグラウンドとして使うことができます。COLORはキャラクターの色(ただし単色のみ),GRはバックグラウンドの色,PRW=0でキャラクターをバックグラウンドの上に表示,PRW=1でバックグラウンドの下に表示します。
●@GRAD(GR)
 GRの他(0〜7)に従って8段階のタイルパターンを生成し,_TILE1,_TILE2に格納します。_TILESWを0にしてコンパイルすると削除できます。
●@ROAD(AA)
 AAの値(0〜7)に従った濃度で,画面の奥からグラデーションのバックグラウンドを描いていきます。
●@FLASH(C1,C2)
 C1で示されるパレット祷号をC2で示されるパレットコードに変えます。C1のパレットは保持されないことに注意。
●@PLINIT( )
 プロッタプリンタ用の関数を初期化します。動作確認をしたものはMYPLOTです。プリンタポートに桜統してMML風にコマンドを送るものならたぶん大丈夫でしょう。_PLOTSWを0にしてコンパイルすると削除できます。
●@PLINE(X1,Y1,X2,Y2)
 (X1,Y1)-(X2,Y2)を結ぶ直線をプロッタプリンタで印字します。_PLOTSWを0にしてコンパイルすると削除できます。
●@PLOT( )
 2D変換した空間図形をプロッタプリンタに出力します。_PLOTSWを0にしてコンパイルすると削除できます。
●@TLINE(XS,YS,ZS,XE,YE,ZE)
 (XS,YS,ZS)-(XE,YE,ZE)を結ぶ空間を直線で描画します。オフセットなどの座標パラメータは,_SHEAD,_SPITCH,_SBANK,_OFSX,_OFSY,_OFSZで与えてください。_TREE=0かつGHINの第5ビットを0にしてコンパイルすると削除できます。
●@CLINE(X1,Y1,X2,Y2,C)
 (X1,Y1)-(X2,Y2)を結ぶ直線をカラ一コ一ドCで描画します。_GHINの第7ビットを0にしてコンパイルすると削除できます。
●@CFULL(X1,Y1,X2,Y2,C1,C2,C3)
 (X1,Y1)を左上,(X2,Y2)を右下の座標にしたボツクスをC1(BLUE),C2(RED),C3(GREEN)の濃度のタイルパターンで塗り潰します。指定の範囲は0〜7までです。_TILESW=0かつGHINの第3ビットを0にしてコンパイルすると削除できます。
●@CPOLY(XV[ ],YV[ ],ZV[ ])
 (XV[0],YV[0],ZV[0])
 (XV[1],YV[1],ZV[1])
 (XV[2],YV[2],ZV[2])
 (XV[3],YV[3],ZV[3])
の4点を頂点とする面(ポリゴン)を描画します。オフセットなどの座標パラメータは,_SHEAD,_SPITCH,_SBANK,_OFSX,_OFSY,_OFSZで与えてください。_TREE=Oかつ_GHINの第1ビットを0にしてコンパイルすると削除できます。
 (例)
 ARRAY WORD POLYX[3]= [
  %-50,%-50,%50,%50],
   WORD POLYY[3]= [
  %-50,%50,%50,%-50],
   WORD POLYZ[3]= [
  %000,%000,%000,%000];
 MAIN()
 [
   @INIT();
   _SBLUE=3;
   _SRED=3;
   _SGREEN=7;
   _OFSX=0;
   _OFSZ=100;
   _OFSY=0;
   @CPOLY(POLYX,POLYY,POLYZ);
 ]
●@KYU(MDX,MDY,MDZ,HNK)
 (MDX,MDY,MDZ)を中心とした半径HNKの球体を描画します。オフセットなどの座標パラメータは,_SHEAD,_SPITCH,_SBANK,_OFSX,_OFSY,_OFSZで与えてくfごさい。_TREE=0かつ_SINCOS=0にしてコンパイルすると削除できます。
 (例)
 MAIN()
 [
   @INIT();
   _SBLUE=3;
   _SRED=3;
   _SGREEN=7;
   _OFSX=0;
   _OFSZ=0;
   _OFSY=0;
   @KYU(0,0,30,10);
 ]
●@ISIN(KAKU,HAN)
●@ICOS(KAKU,HAN)
 半径(HAN)0〜32767に対する角度(KAKU)の三角関数の値を整数で求めます。_SINCOSを0にしてコンパイルすると削除できます。
●@IATN(XX,YY)
 XX,YYからアークタンジェントを求めます。使い道としては,ある物体が特定座標へ向こうとしたときの角度を算出できます。たとえば,AとBの2つの物体があったとします。Aの座標を(AX,AY),Bの座標を(BX,BY)として,R=@IATN(BX-AX,BY-AY)とすればRにAから見たBへの角度を算出できるのです。SINCOS=0にしてコンパイルすると削除できます。
●@WAVE(XSIZE,ZSIZE,POSY,SNP)
 波を描画します。XSIZEはX方向の大きさ,ZSIZEはZ方向の大きさ,POSYはオフセットY座標,SNPは振幅となっています。オフセットなどの座標パラメータは,_SHEAD,_SPITCH,_SBANK,_OFSX,_OFSY,_OFSZで与えてください。TREE=0かつSINCOS=0かつGHINの第1ビットを0にしてコンパイルすると削除できます。
 (例)
 MAIN()
 [
   @INIT();
   _SBLUE=3;
   _SRED=3;
   _SGREEN=7;
   _OFSX=0;
   _OFSZ=0;
   _OFSY=0;
   @WAVE(300,300,0,50)
 ]
注) @HUKUGEN,@SCTLについては,単独で呼び出すことをしないでください。
 

◆ポリゴンについて

 これらのライブラリ関数の中でポリゴンを描画する関数(@CPOLY)があります。
 これはただのポリゴンを描画するものではなく,光線ベクトルと法線ベクトルとの関係を計算して,表而の明るさ(色の濃度)を自動的に計算してくれます。アルゴリズムはフォンシェーデイングというアルゴリズムを使っています。
 ポリゴンを使うときの注意としては,SOROBAN.LIBをインクルードするため,コンパイルするときに_FLOAT=1に設定してください。それほど精度は必要ないため,単精度5バイトで計算しています。
 
(C)1992 Junichi Kuroki(original)
(C)1997 Junji Okazaki(edited)
(C)2024 Oh!Ishi,Nibbles Lab.(formatted)