□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□ MAGIC専用 グラフィック ライブラリ ″GRAPH.LIB″ #156 黒木淳一 □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□  *GRAPH.LIBについての説明   このライブラリは、私がMAGICを使う時に作成したMAGICを使用するサ  ブルーチンを集めたものです。ですから、かなりくせのある関数がいくつかありま  すが、どうか使ってやってください。  *GRAPH.LIBのメモリ節約について   このライブラリは他のソースからインクルードして使うので、ライブラリの部分  だけで4Kbyteぐらいを楽に消費してくれます。しかも′SOROBAN.L− −IB′も読み込むので、かなりのメモリの無駄になります(すべての関数をフルに  使う人は別)。そこで、このライブラリの関数をいくつかに区切って必要な関数だ けコンパイルするようにしました。   次の定数をライブラリを呼び出すMAINプログラムの先頭で、定義してくださ  い。1で使用する。0で使用しないとなっています。 _SINCOS 整数三角関数と整数逆三角関数、そしてその関数を使用する関数が使    えなくなります。 _FLOAT ′SOROBAN.LIB′を使用してる関数が使えなくなります。 _PLOTSW プロッタ出力関数が使えなくなります。これはほとんどキャラメルの    オマケのようなものなので、使うことはない...と思います。 _THREE MAGICの3D表示関数が使えなくなります。 _TILESW タイリング・パターンが無効となり、タイリング・パターンを使用し    ている関数の一部が使えなくなります。 _GHIN 上記の定数を使用してもまだメモリが足りない。又は使わない関数が 多いということがあります。そういうときはこの定数を使用して使用頻 度の低い7つの関数を任意に削除することができます。消したい関数に 対応するビットを0にしてコンパイルしてください。逆にいうと、使う 関数に対応するビットを1にしてコンパイルしてください。 [FEDC BA89 7654 3210] |||| |||| |||| |||+--- : @SPLINE |||| |||| |||| ||+---- : @CPOLY |||| |||| |||| |+----- : @ROAD |||| |||| |||| +------ : @CFULL |||| |||| |||| |||| |||| |||+-------- : -------- |||| |||| ||+--------- : @TLINE |||| |||| |+---------- : @CLINE |||| |||| +----------- : @CBOX |||| |||| |||| |||+------------- : -------- |||| ||+-------------- : -------- |||| |+--------------- : -------- |||| +---------------- : -------- |||| |||+------------------ : -------- ||+------------------- : -------- |+-------------------- : -------- +--------------------- : -------- *定義済みの定数について _HEAD = 6 _PITCH = 7 _BANK = 8 これらの定数はPAR[]をアクセスするとき少しでもソースのわかりやすさ を追及するためにつけました。使い方は PAR[HEAD]++; というふうにお使い下さい。  *グローバル変数についての説明   _CO[31]   この配列はMAGICのコマンドを格納するためのもので、LINE等の関数が  呼び出されたりすると、MAGICのLINEコマンドを実行するためのコマンド  が生成されます。この配列は、普段ユーザーが使うことはありません。   _ZAHYO[255][2]:$C6B6  _WIRE [255][1]:$CCB6   _LPCT [1]     :$C6B4   _DISP [255][1]:$C2B4   _PAR  [8]     :$C203   この5つの配列は、MAGICの3D表示機能を使用するときに使うものです。  どの配列もユーザーの手で直接書き込むことができますが、 _ZAHYO[],  _WIRE[],_LPCT[]_DISP[]の4つには関数とMAGICが書  き込んでくれますが、_PAR[]だけはユーザーの手で直接書き込んでやらなけ  ればいけません。これら5つの配列はMAGICの共通ワークエリアにかぶせて定  義しています。ですからこの配列への代入→MASICへの定義となります。当然  この配列への定義用関数も用意されていますので、SETOD,SETWDの方を  参照してください。   MAGICはX,Y,Zの座標をもつ複数の頂点を2つの頂点番号をもつ線分デ  ータによって管理されています。普通はこの配列に直接アクセスする事はないんで  すが。変則的な使い方をする時、例えばアニメーションを複数パターンをつかわず  に座標の変更だけで行なうときは直接書きかえることができます。 _ZAHYO[P][I]=座標 P=0〜255(座標番号) I=0 :   X 1 :   Y 2 :  Z _WIRE[P][I]=頂点番号 P=0〜255(線分番号) I=0 :   頂点1 1 :   頂点2 _LPCT[0]=頂点の数 _LPCT[1]=線分の数 _DISP[P][I] (READ ONLY) P=0〜255(変換後の座標番号{_ZAHYO[P][I]の             Pと対応}) I=0 :   X 1 :   Y _PAR[I]=パラメータ (物体の位置{オフセット座標}) I=0 : CX 1 : CY 2 : CZ (回転の中心座標) 3 : DX 4 : DY 5 : DZ (回転角度) 6 : HEAD 7 : PITCH 8 : BANK   _TILE1   _TILE2   この変数はMAGICの CIRCLE,TRIAMGLE,BOX FILL  を描画するときに必要なタイリング・パターンを格納しておくためのもので、2つ  で1組となっています。特殊な形でなくてもいいのなら、@GRAD関数でタイリ  グ・パターンを生成してくれるので、これもユーザーが直接さわる事は少ないでし  ょう。   _MSCREEN   この変数は@CRTKN関数を使用するときに blue,redのどのプレー  ンに書き込むかという情報を記憶しています。これもユーザーがさわることはない  でしょうが、なかなかセコイ事をするときには役にたちます。   _SPITCH (PITCH角)   _SHEAD (HEAD角)   _SBANK (BANK角) _OFSZ (オフセット座標X) _OFSY (オフセット座標Y)   _OFSZ (オフセット座標Z) このライブラリでは2つの座標を同時にあつかえます。1つはPAR[]にユ−  ザーが直接セットした座標と上記6つの変数にユーザーがセットした座標です。前   者ではユーザーが定義した空間図形を表示するときに使用し、後者では@TLIN− −E,@CPOLY,@WAVE等の直接3次元のグラフィック描画関数を実行した  ときに使用されます。   _DEMODE   @CLINE,@CBOXの表示モードを格納します。1でXORモード、2で  PSETモードになります。   _KSTEP   @WAVE,@CPOLY,@KYUのステップ角度を格納します。デフォルト  は15です。   _SBLUE   _SRED   _SGREEN @CPOLY,@KYU,@WAVEのポリゴン表示のときの表面の色を格納し  ます。範囲は0から7迄です。   _LX   _LY   _LZ   @CPOLY,@KYU,@WAVE実行時の光線ベクトルを格納します。 *関数の説明   @LINE(X1,Y1,X2,Y2)   (X1,Y1),(X2,Y2)を結ぶ直線を単プレーンに書き込みます。   @SPLINE(X1,Y1,X2,Y2,X3,Y3)   (X1,Y1),(X2,Y2),(X3,Y3)を結ぶなめらかな曲線を単プ  レーンに書き込みます。又_GHINの0bitを0にしてコンパイルすると削除  することができます。   @BOX(X1,Y1,X2,Y2)   (X1,Y1),(X2,Y2)を通る4角形を単プレーンに書き込みます。   @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でPRESET、1でXOR、2でOR、プレーンは0でbl− −ue,1でred,2でgreenになります。   @CLS( )   単プレーンの画面消去を行ないます。   @PALET(A0,A1,A2,A3,A4,A5,A6,A7)   パレットの変更を行ないます。   @INIT( )   GRAPH.LIBの初期化を行ないます。必ず最初に実行してください。   @SETOD(POSIT,LENGTH)   @SETWD(POSIT,LENGTH) ユーザーが作成した空間図形をMAGICに登録します。又、_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に登録された空間図形を3次元変  換し、1にして呼ぶと3次元変換された空間図形を画面に表示します。   @CRTKN(COLOR,GR,PRW)   この関数の実行前に画面表示を行ない、この関数の実行後にCLS( )を実行  すると、完全に画面のちらつきをなくすことができます。このときblue,re− −dを交互に表示するので単色のキャラクターしか表示できません。又、余ったgr− −eenプレーンはバックグラウンドとして使う事ができます。COLORはキャラ  クターの色、GRはバックグラウンドの色、PRWは0でキャラクターをバックグ  ラウンドの上に表示、1でバックグラウンドの下に表示します。   @GRAD(GR)   GRに0から7迄の値をいれて呼びだすことにより、7段階の濃度のタイル・パ  ターンを生成し、_TILE1,_TILE2に格納します。又、_TILESW  を0にしてコンパイルする事により、削除することができます。   @PLINIT( )   プロッタを初期化します。又、_PLOTSW0にしてコンパイルする事により、  削除することができます。使用可能なプロッタは、プリンタのポートにつないで、  MML風にコマンドを送るものならたぶん大丈夫でしょう。ちなみにMYPLOT  での動作は確認しております。(MYPLOTにもいろいろあるかもしれませんが、  プロッタを買う方は注意してください。データの形式が違ったら使えませんから。)   @PLINE(X1,Y1,X2,Y2)   (X1,Y1),(X2,Y2)を結ぶ直線をプロッタでひきます。又、_PL− −OTSWを0にしてコンパイルする事により、削除することができます。   @PLOT( )   3次元変換した空間図形をプロッタに出力します。又、_PLOTSWを0にし  てコンパイルする事により、削除することができます。   @TLINE(XS,YS,ZS,XE,YE,ZE)   (XS,YS,ZS),(XE,YE,ZE)を結ぶ空間を直線で結びます。又、  _THREE又は_GHINの第5bitを0にしてコンパイルする事により、削  除することができます。オフセット座標等のパラメータは,_SHEAD,_SP  ITCH,_SBANK,_SHEAD,_OFSX,_OFSY,_OFSZで  与えてください。   @CLINE(X1,Y1,X2,Y2,C)   (X1,Y1),(X2,Y2)を結ぶ直線をカラーコードCで結びます。又、  _GHINの第7bitを0にしてコンパイルする事により、削除することができ  ます。   @CBOX(X1,Y1,X2,Y2,C)   (X1,Y1),(X2,Y2)を通る四角形をカラ−コードCで塗り潰します。  又、_GHINの第7bitを0にしてコンパイルする事により、削除することが  できます。   @CFULL(X1,Y1,X2,Y2,C1,C2,C3)  (X1,Y1),(X2,Y2)を通る四角形をC1(blue),C2(red)  ,C3(green)の濃度のタイル・パターンで塗り潰します。又、_TILE− −SW又はGHINの第3bitを0にしてコンパイルする事により、削除すること  ができます。濃度の範囲は0から7迄です。   @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点を頂点とする面(ポリゴン)を描画します。又、_THREE  又は_GHINの第1bitを0にしてコンパイルする事により、削除することが  できます。オフセット座標等のパラメータは,_SHEAD,_SPITCH,_  SBANK,_SHEAD,_OFSX,_OFSY,_OFSZで与えてくださ  い。  (例) ARRAY WORD POLYX[3]=[ %-50 , %-50 , % 50 , % 50 ], %000 , %000 , %000 , WORD POLYY[3]=[ %-50 , % 50 , % 50 , %-50 ], %000 , %000 , %000 , WORD POLYZ[3]=[ %000 , %000 , %000 , %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の球体を描画します。又、  _THREE又は_SINCOSを0にしてコンパイルする事により、削除するこ  とができます。オフセット座標等のパラメータは,_SHEAD,_SPITCH,  _SBANK,_SHEAD,_OFSX,_OFSY,_OFSZで与えてくだ さい。  (例) MAIN() [ @INIT(); _SBLUE=3; _SRED=3; _SGREEN=7; _OFSX=0; _OFSZ=0; _OFSY=0; KYU(Y(0,0,300,100); ]   @ISIN(KAKU,HAN)   @ICOS(KAKU,HAN)   半径0から32767迄の三角関数を整数でもとめます。で塗り潰します。又、  _SINCOSを0にしてコンパイルする事により、削除することができます。   @IATN(XX,YY)   XX,YYからアーク・タンジェントを求めます。又、_SINCOSを0にし  てコンパイルする事により、削除することができます。使い道としては、AとBの  2つの物体がいたとします。そして、AがBの方向に(度単位で)向こうとしたと  します。このとき、考えられるアルゴリズムとしては、Aの座標を(AX,AY), Bの座標を(BX,BY)として、R=@IATN(BX−AX,BY−AY)と  いう風に呼びだします。すると、RにAから見たBへの角度がはいります。この角  度を使えば問題は解決します。   @WAVE(XSIZE,ZSIZE,POSY,SNP)   波を描画します。こればっかりは実際にやってもらわないと説明できません。又、  _SINCOS又は_THREE又は_GHINの第1bitを0にしてコンパイ  ルすにより、削除することができます。XSIZEは横方向の大きさ、ZSIZE  はZ方向の大きさ、POSYはオフセットY座標、SNPは振幅となっております。  オフセット座標等のパラメータは,_SHEAD,_SPITCH,_SBANK, _SHEAD,_OFSX,_OFSY,_OFSZで与えてください。  (例) MAIN() [ @INIT(); _SBLUE=3; _SRED=3; _SGREEN=7; _OFSX=0; _OFSZ=0; _OFSY=0; WAVE(300,300,0,50); ]  *ポリゴン描画関数について   このライブラリは、ポリゴンを描画する関数が入っております。しかもただのポ  リゴンではなく、光線ベクトルと法線ベクトルとの関係を計算して、表面の明るさ  によって色の濃度を調節してくれます。はっきりいって僕は頭が悪いので、個人的  に代数の先生に教えてもらったり、先輩の家で夜9時まで教えてもらったりしてな  んとか実現しました(ウルウル)。ポリゴンを使うときの注意としては、コンパイ  ルするときに_FLOATを1に設定してください。′SOROBAN.LIB′  をインクルードします。ちなみにそんなに精度はいらないので単精度5バイトで使  ってます。 * サンプル プログラム   どんなにプログラムを楽にするライブラリでもサンプルがなければ使い慣れるの  に時間がかかります。とりあえず、′GRAPH.LIB′の機能を使用したたの  しい?DEMOをつくりました。′SOROBAN′と′SOROBAN.LIB′  も使うので、用意してください。′SOROBAN.LIB′はCONST命令で  _FLOATを1にしてコンパイルすると自動的にインクルードしてくれます。  SOROBANは$9F00番地からリロケートしてMAGICと一緒にセーブし  てください。コンパイル方法は、SLANGを起動してから ]C TANOSI.SL [CR]  と入力してください。コンパイルが終ると3000番地から格納されるのでアドレ  スをかえてセーブしてください。 ]S 3000 終了番地 3000 9000:TANOSI [CR]  次にSLANGを終えたあと #L SOROBAN [CR] ※$9F00にアロケートしたSOROBAN #L MAGIC [CR] ※各機種用のMAGIC # TANOSI [CR] ※実行  以上です。  *最後に   静止画像から動画までこのライブラリ1本(と′SOROBAN.LIB′)で  なんでもできてしまいます(欲張らなければ)。マシン語ではとっつきにくく、バ  グっても原因をつきとめるのに時間がかかります。そんな時、マシン語のようなス  ピードと、ドキュメントのような言語仕様をもつSLANGでMAGICが手軽に  使えれば...このライブラリがそういう人の役に立ち、X68000以上に8ビ  ットマシンのMAGIC対応ソフトが増えてくれれば嬉しいです。最後にいろいろ  「こうこうこうしてほしい。」と注文してくれた深谷さん、ありがとうございまし   た。 (EOF)