home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
REND.LZH
/
RENDSRC.DOC
< prev
Wrap
Text File
|
1996-08-02
|
12KB
|
364 lines
REND ver.2.25+T8.2.8 ソースファイル
対応機種
・X68000 (GCC)
・X68000+68881/2(GCC + FPPP)
・X68030+68882 (GCC)
・PC-9801 (DJGPP)
・DOS/V (DJGPP)
・MS-WINDOWS (Borland C++)
・UNIX(X-Window)(GCC)
・UNIX(端末) (GCC)
実行ファイルの生成には基本的に gcc, gnu-make が必要です。
1.生成方法
1.1 読み込みライブラリ reader.a の生成
% cd reader
% make <- X680x0の場合
% make -f makefile.dj <- MS-DOS+djgccの場合
% make -f makefile.unx <- UNIXの場合
1.2 画像入出力ライブラリ piclib.a の生成
% cd ../pic1600
% make <- X680x0の場合
% make -f makefile.dj <- MS-DOS+djgccの場合
% make -f makefile.unx <- UNIXの場合
1.3 レンダラーの生成
% cd ../rend
% make <- X680x0の場合
% make -f makefile.dj <- MS-DOS+djgccの場合
% make -f makefile.x11 <- UNIX, X-Windowの場合
% make -f makefile.unx <- UNIXの場合
で生成できるはずです。
2. カスタマイズ
カスタマイズは基本的に、makefileの修正で行なってください。
2.1 読み込みライブラリ reader
以下の3種類のカスタマイズが可能です。
-DBUFFERING ファイル読み込みをバッファリングして高速化する
-DVIRTUAL 仮想記憶を可能にする
-DFLOAT 浮動小数点を float で行なう
-DINLINE_VECTOR ベクトル演算をインライン関数にする
-DINLINE_MATRIX 行列演算をインライン関数にする
-DBUFFERING以外は同じオプションを rend でも付加する必要があります。
-DWINDOWS WINDOWSであることを示す。
-DUNIX UNIXであることを示す。
-DX68000 X680x0であることを示す。
-DDJ DJGCCであることを示す。
2.2 画像入出力ライブラリ piclib
-DLittleEndian バイトオーダが Little Endian である (86系)
2.3 レンダラー rend
-DFULLCOLOR 内部処理をフルカラーにしてディザリングを可能に
-DHIVISION 解像度の種類を増やす
(320x240,640x480,1024x1024,2048x2048, etc)
-DEXTENDMAP マッピングの歪みを減少
-DSPEC マッピング、半透明体にスペキュラーを生成可能
-DEDGEANTI 背景とのアンチエイリアスを消去可能
-DWIREVIEW ワイヤーフレーム画像生成可能(X680x0専用)
-DSTAR 背景星生成可能
-DMAPANTI マッピングにアンチエイリアスが可能
-DBACKFACE 表面(左回り)のみ作画可能
-DREFMAP 環境マッピングが可能
-DBGMAKE 背景球生成可能
-DFLOAT 浮動小数点を float で行なう
-DINLINE_VECTOR ベクトル演算をインライン関数にする
-DINLINE_MATRIX 行列演算をインライン関数にする
-DWINDOWS WINDOWSであることを示す。
-DUNIX UNIXであることを示す。
-DX68000 X680x0であることを示す。
-DDJ DJGCCであることを示す。
3. ソースファイル
3.1 読み込みライブラリ reader
コンパイルするとreader.a(X68000の場合、68.a, 681.a, 030.a) が生成されます
X68000でコンパイルする時はディレクトリ 68, 681, 030 が必要です
reader.h 読み込みライブラリ用ヘッダファイル
alloc.c メモリ管理
objread.c 形状ファイル読み込み
atrread.c アトリビュートファイル読み込み
objatr.c 形状、アトリビュート照合
framread.c フレームファイル読み込み
matrix.c 行列演算(-DINLINE_MATRIX時はreader.hにインクルード)
vector.c ベクトル演算(-DINLINE_VECTOR時はreader.hにインクルード)
temp.c 形状データのダンプ
virtual.c 仮想記憶
scanner.c トークン切り出し
word.c 語彙解析
strcmpi.c strcmpi()関数
makefile X680x0+gcc用makefile(68000, +68881, 68030)
makefile.68 X680x0+gcc用makefile(makefileから呼び出される)
makefile.dj MS-DOS+djgcc用makefile
makefile.unx UNIX+gcc用makefile
3.2 画像入出力ライブラリ piclib
piclib.c ライブラリ本体
token.c トークン読み込み処理
string.c 文字列処理
file.c ファイル入出力
sequence.c 連番処理
reduce.c 減色(誤差拡散など)処理
f_16_16.c 3万色 DoGA PIC 入出力
f_25_7.c 1600万色 DoGA PIC 入出力
f_rgbt8.c 1ピクセル4バイトのベタファイル入力
f_rgb8.c 1ピクセル3バイトのベタファイル入力
f_pic.c 3万色 柳沢 PIC 入力
f_bmp.c Windows BMP 入出力
f_disp.c X680x0 画面入出力
version.c バージョン管理
3.3 レンダラー rend
X68000でコンパイルする時はディレクトリ 68, 681, 030 が必要
rend.c メインルーチン、引数解析など
dir.c ワイルドカード展開
command.c コマンド呼びだし
star.c 背景星生成
map.c テクスチャマッピング
back.c 背景読み込み
viewconv.c 透視変換
color.c 色計算
glib.c 変数定義
display.c スキャンラインコンバージョン
edgelist.c エッジリスト処理
picout.c 画像ファイル出力
version.c バージョン管理
crtx68k.c X68000用表示ルーチン
crt98.c PC-9801用表示ルーチン
crtwin.c Windows用表示ルーチン
crtnone.c 何も表示しない表示ルーチン
makefile X680x0+gcc用makefile(68000, +68881, 68030)
makefile.68 X680x0+gcc用makefile(makefileから呼び出される)
makefile.dj MS-DOS+djgcc用makefile
makefile.unx UNIX+gcc用makefile
makefile.x11 X-Window対応版用makefile
4. 移植
4.1 読み込みライブラリ
基本的に機種依存部はほとんどありません。
(1) 互換性のないテンポラリファイルのため、IDを埋め込んでいるので、
temp.c 中に新たに ID を定義してください。
(2) 機種によってはメモリ確保量が確定できないので、alloc.c 中のメモリ取得
ルーチンは機種依存しています。新たに追加してください。
(3) strcmpi関数がない場合は、strcmpi.c も入れてください。
4.2 画像入出力ライブラリ piclib
基本的に機種依存部はありません。
(1) f_disp.c は X680x0 専用です。
(2) 一応、新しい画像フォーマットに対応させることも可能です。
1ピクセル 3 バイトのベタファイル入力ルーチンもあるので、
ヘッダ入力ルーチンさえ作れば ppm にも対応可能でしょう。
4.3 レンダラー
基本的に機種依存部は画面表示ルーチン crt???.c だけです。
1つの変数と4つの関数を用意する必要があります。
char *program = "Do-GA C.G.A System Rendering Program" ;
プログラム名です。起動時に表示されます。
void crtinit( int line );
画面表示の初期化ルーチンです。起動時に一度だけ呼ばれます。
line は表示する縦のドット数です。
void crtclr( void );
画面消去ルーチンです。各画像の作画直前に呼び出されます。
void crtout( short *framebuf, int xlen, int y );
1ライン出力ルーチンです。X68000型の色コードの長さ xlenの 配列 framebuf
の内容を上からyドット目に作画してください。
void crtout24( short *framebuf, int xlen, int y );
1ライン出力ルーチンです。ColorCode型の色コードの長さ xlenの 配列 framebuf
の内容を上からyドット目に作画してください。-DCRTFULLCOLOR 指定時のみ有効
です。
void crtline( int x1, int y1, int x2, int y2 );
直線描画ルーチンです。(x1,y1)-(x2,y2)へのラインを引いてください。
5. reader ライブラリ使用方法
reader ライブラリではアトリビュートファイル、形状ファイル、フレームファイルの
読み込み関数を提供します。提供する関数は以下の通りです。
5.1 atrread.c
書式 Atr *atrread( filename, atr )
char *filename ; /* アトリビュートファイル名 */
Atr *atr ; /* アトリビュート構造体 */
機能 アトリビュートファイルから入力します。
アトリビュート構造体( READER.H 参照 ) を確保し、入力されたデータ
をその中の各フィールドに格納します。
同一ファイル内にアトリビュートが複数ある場合や、それまでに別のファ
イルから読み込んだアトリビュートがある時は線形リストとして連結しま
す。
atr はそれまでに読み込んだアトリビュート構造体を指定します。
最初に読み込む時は NULL を指定します。
戻り値 atr に入力されたアトリビュートを連結し、返します。
エラーの時は NULL を返します。
5.2 objread.c
書式 Object *objread( filename, obj )
char *filename ; /* 形状ファイル名 */
Object *obj ; /* オブジェクト構造体 */
機能 形状ファイルから入力します。
オブジェクト構造体( READER.H 参照 ) を確保し、入力されたデータを
その中の各フィールドに格納します。
オブジェクト構造体の内部で参照しているプリミティブ構造体も確保し、
データを格納します。
同一ファイル内にオブジェクトが複数ある場合や、それまでに別のファイ
ルから読み込んだオブジェクトがある時は線形リストとして連結します。
obj はそれまでに読み込んだオブジェクト構造体を指定します。
最初に読み込む時は NULL を指定します。
戻り値 obj に入力されたオブジェクトを連結し、返します。
5.3 objatr.c
書式 int objatr( obj, atr )
Object *obj ;
Atr *atr ;
機能 atrread, objread 関数で読み取ったデータからアトリビュート名を対応
付けます
戻り値 obj 内で参照されているアトリビュート名が atr 内になければエラーと
なります。エラーの時は FALSE を返します。正常終了すると TRUE を返
します。
5.4 framread.c
書式 int frameopen( framefile )
char *framefile ; /* フレームファイル名 */
機能 フレームファイルをオープンします。
戻り値 正常にオープンできた時は1、できなかった時は0を返します。
書式 void frameclose()
機能 frameopen でオープンしたフレームファイルをクローズします。
書式 Frame *frameread( obj )
Object *obj ; /* オブジェクト構造体 */
機能 フレームファイルから入力します。
フレーム構造体( READER.H 参照 ) を確保し、入力されたデータをその
中の各フィールドに格納します。
フレーム構造体の内部で参照している環境、視点、光源などの構造体も確
保し、データを格納します。
obj は objread で得たオブジェクト構造体を指定します。
フレームファイル内で参照されているオブジェクト名がオブジェクト構造
体になければエラーを出します。
戻り値 フレーム構造体を返します。
書式 void framefree( frame )
Frame *frame ; /* フレーム構造体 */
機能 frameread で確保したフレーム構造体のメモリを開放します。
書式 int frameskip()
機能 フレームファイルを1フレーム分読み飛ばします。
戻り値 正常読めた時は1、読めなかった時は0を返します。
5.5 matrix.c
以下の関数すべて使用できます。
使い方は、関数名から想像するか、ソースファイル内のコメントを見てください。
void m_print( Matrix );
void m_unit( Matrix );
void m_mov( Matrix, Vector );
void m_rot( Matrix, int, double );
void m_scal( Matrix, Point );
void m_vec( Matrix, Vector, Vector );
void m_copy( Matrix, Matrix );
void m_mult( Matrix, Matrix, Matrix );
void vec_mult_mat( Vector*, Vector*, Matrix, int, int );
void m_trans( Matrix, Matrix );
int m_inv( Matrix, Matrix );
void v_copy( Vector, Vector );
void v_print( char*, Vector );
void ftov( Vector, double, double, double );
double v_length( Vector );
void v_unit( Vector, Vector );
double s_pro( Vector, Vector );
void v_pro( Vector, Vector, Vector );
void v_mult( Vector, Vector, Vector );
void v_add( Vector, Vector, Vector );
void v_sub( Vector, Vector, Vector );
void v_s_mult( Vector, Vector, double );
5.6 alloc.c
メモリの管理関数、ライブラリの内部で確保するデータ領域の管理をします。
このライブラリの関数を使う時は最初に meminit 関数を実行してください。
書式 void meminit( memsize )
long memsize ; /* 使用メモリのサイズ */
機能 使用メモリ量をバイト単位で設定します。
0を指定すると取れるだけ取ります。
6. 今後の予定
(1) 各種画像フォーマットへの対応
7. 配布規定
不特定多数への再配布(ネットへのアップロード)は禁止とします。
バグを発見したり、新しい機種に移植した時はソースの差分を
知らせてくれると嬉しいですが、強制はしません。
1996.6.13 高津/Project Team DoGA
taka2@doga.higashiyodogawa.osaka.jp