home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
REND.LZH
/
READER
/
READER.H
< prev
next >
Wrap
C/C++ Source or Header
|
1996-07-23
|
11KB
|
388 lines
/*
CGA共通規格ファイル入力関数群
Copyright T.Kobayashi
*/
#ifndef TRUE
#define FALSE 0
#define TRUE (!FALSE)
#endif
#ifdef FLOAT
#define Float float
#else
#define Float double
#endif
#ifdef WINDOWS
#define MESSAGE
#endif
#ifdef MESSAGE
#define fprintf crtprintf
int crtprintf(FILE * fp, const char * format, ...);
#endif
#if defined(X68000)
#define HUGE
#define FAR
#define nomalize_pointer( p )
#ifdef GCC
#define REGISTER
#ifdef __HAVE68881__
#include <math_68881.h>
#endif
#else
#define REGISTER register
#endif
#define tempfile temp_file
#elif defined(DJ) || defined(UNIX) || defined(__WIN32__)
#undef HUGE
#define HUGE
#define FAR
#define nomalize_pointer( p )
#define REGISTER
#elif defined(MSC)
#include <dos.h>
#define HUGE huge
#define FAR far
#define nomalize_pointer( p ) { FP_SEG( p ) += FP_OFF( p ) >> 4 ;\
FP_OFF( p ) = FP_OFF( p ) & 15 ; }
#define REGISTER
#define interrupt interrupt_func
#elif defined(__BORLANDC__)
#include <dos.h>
#define HUGE huge
#define FAR far
#define nomalize_pointer( p ) {p = (void far *)((char huge *)p + 0);}
#define REGISTER
#define interrupt interrupt_func
#else
#error "MACHINE TYPE UNKNOWN!!"
#endif
#ifndef GCC
#define volatile
#define const
#define inline
#endif
#ifdef VIRTUAL
#ifdef EMS
#include "..\ems\ems.h"
#endif
typedef unsigned long Pointer ;
#define dataalloc( size ) ( virtualmode ? viralloc( size ) :\
(Pointer)memalloc( size ) )
#define dataaryalloc( count, size ) ( virtualmode ? viraryalloc( count, size ) :\
(Pointer)memaryalloc( count, size ) )
#define datamark() ( virtualmode ? virmark() : (Pointer)memmark() )
#define datarelease( mark ) { \
if ( virtualmode ) \
virrelease( mark ); \
else \
memrelease( (char*)mark ); \
}
#define datasize() ( virtualmode ? virsize() : memsize() )
#define datacheck vircheck
#define pointer( vp ) ( virtualmode ? virpointer( vp ) : (void*)(vp) )
#define datalock() ( virtualmode ? virlock() : 0 )
#define dataunlock( a ) { if ( virtualmode ) virunlock( a ); }
#define Pointer(type) Pointer
#else
/* typedef char *Pointer ;*/
#ifdef X68000
#define dataalloc memalloc
#else
#include <assert.h>
#define dataalloc(size) (assert((size)>0),assert(((size)%2)==0), memalloc(size))
#endif
#define dataaryalloc memaryalloc
#define datamark memmark
#define datarelease memrelease
#define datasize memsize
#define datacheck memcheck
#define pointer(p) (p)
#define datalock() (-1)
#define dataunlock( a )
#define Pointer(type) type
#endif
#define MAXWORD 32 /* 1ワードの最長キャラクタ数 */
#ifndef UNIX
# define F_NAME_LEN 256 /* ファイル名の長さ */
#else
# include <stdio.h>
# define F_NAME_LEN FILENAME_MAX
#endif
#define MAX_FILE 64 /* ファイル数の最大値 */
#define COLOR_SHIFT 15 /* 色情報のシフト数 */
#define COLOR_POINT 32768L /* 色情報の小数点位置 */
#define MAXGRAD 20 /* グラデーションデータの最大 */
#if defined(MSC) || (!defined(__WIN32__) && defined(__BORLANDC__))
#define MAXLIGHT 32 /* 光源の数の最大 */
#else
#define MAXLIGHT 1024 /* 光源の数の最大 */
#endif
#define ALLOC_TYPE_DATA 0
#define ALLOC_TYPE_TEMP 1
/* プリミティブのタイプ */
#define POLY 0 /* ビット0:シェディング */
#define SHADE 1 /* ビット1:UV座標 */
#define UVPOLY 2
#define UVSHADE 3
/* マッピングのタイプ */
#define NO_MAP 0 /* マッピングなし */
#define COLOR_MAP 1 /* カラーマッピング */
#define BUMP_MAP 2 /* バンプマッピング */
/* 光源のタイプ */
#define LIGHT_POINT 0 /* 点光源 */
#define LIGHT_PAL 1 /* 平行光線 */
#define LIGHT_SPOT 2 /* スポットライト */
#define LIGHT_OBJ 3 /* 発光体 */
/* 型の定義 */
typedef Float Matrix[4][4] ; /* 行列 */
typedef Float Vector[3] ; /* ベクトル */
typedef Float Point[3] ; /* 座標 */
typedef long Color[3] ; /* 色 ( R,G,B ) */
/* 構造体の定義 */
/* アトリビュート */
typedef struct _Atr{
char name[MAXWORD] ; /* アトリビュート名 */
Color col ; /* 色 */
Color amb, dif, spc, size ; /* アトリビュートのパラメータ */
Color ref, tra, rfr, att ; /* (共通規格参照) */
long h ; /* スペキュラーの色相 */
int rgbflag ; /* パラメータフラグ */
int maptype ; /* マッピングのタイプ */
char filename[F_NAME_LEN] ; /* マッピング元の画像ファイル名*/
Float mapwind[2][2] ; /* マッピングパラメータ */
Float mapview[2][2] ;
Float mapsize[2][2] ;
Pointer(struct _Atr *) next ; /* 次へのポインタ */
}
Atr ;
typedef char AtrName[MAXWORD] ;
/* プリミティブ */
typedef struct _Poly {
int type ; /* プリミティブのタイプ */
Pointer(Atr*) atr ; /* アトリビュート */
int atrid ; /* アトリビュート番号 */
int pointnum ; /* 頂点数 */
Pointer(Point*) point ; /* 頂点座標配列 */
Pointer(Vector*) vec ; /* 法線ベクトル配列 */
Pointer(Vector*) uv ; /* UV座標配列 */
Float coe[4] ; /* 平面方程式の係数 */
Pointer(struct _Poly*) next ; /* 次へのポインタ */
}
Poly ;
/* オブジェクト */
typedef struct _Object {
char name[MAXWORD] ; /* オブジェクト名 */
int atrnum ; /* アトリビュート数 */
Pointer(AtrName*) atrname ; /* アトリビュート名 */
int polynum ; /* ポリゴン数 */
Pointer(Poly*) poly ; /* ポリゴン配列 */
Point max, min ; /* 座標最大値 */
Pointer(struct _ObjPos*) objpos ; /* 参照形状リスト */
Pointer(struct _Object*) next ; /* 次のへのポインタ */
}
Object ;
/* オブジェクトの位置 */
typedef struct _ObjPos {
Pointer(Object*) obj ; /* オブジェクト */
Matrix mat ; /* 変換行列 */
Pointer(struct _ObjPos*) next ; /* 次へのポインタ */
}
ObjPos ;
/* グラデーション(環境) */
typedef struct _Grad {
int gradtype ; /* 指定がなければ 0 */
Vector vec ; /* ベクトル */
int colnum ; /* グラデーションの色数 */
Color col[MAXGRAD] ; /* 色 */
Float degree[MAXGRAD] ; /* 角度 */
}
Grad ;
/* 環境 */
typedef struct _Environ {
Color back ; /* 指定がなけれは 黒 */
int star ; /* 指定がなければ 0 */
Grad grad ;
Float depth ; /* 指定がなければ 0 */
Color depthcol ;
char map[MAXWORD] ; /* 指定がなければ "" */
}
Environ ;
/* 視点のデータ */
typedef struct _Eye {
Matrix mat ; /* 変換行列 */
Float dist ; /* スクリーンまでの距離 */
}
Eye ;
/* 光源のデータ */
typedef struct _Light { /* 必要なパラメータだけセットする。*/
int type ; /* 光源のタイプ */
Color col ; /* 光源の色 */
Float dist ; /* 距離 */
Vector vec ; /* 光の向き */
Float size ; /* 光の広がり */
Point point ; /* 光源の位置 */
char name[MAXWORD] ; /* 光源物体 */
}
Light ;
/* フレーム */
typedef struct _Frame {
Environ env ; /* 環境 */
Eye eye ; /* 視点 */
int lightnum ; /* 光源の数 */
Light light[MAXLIGHT] ; /* 光源 */
Pointer(ObjPos*) objpos ; /* オブジェクト位置 */
}
Frame ;
/* 大域変数 */
#ifndef SCANNER
extern int warninglevel ; /* 警告レベル */
extern int end_of_file ; /* エンドオブファイル */
extern FILE *errfp ; /* エラー出力ファイル */
extern Float minscale ; /* 最小の正数 */
/* By Taka2 */
extern void (*interrupt)(void); /* 割り込みルーチン */
/* By Taka2 */
extern void (*errorexec)(int); /* エラー処理ルーチン */
#endif
extern int virtualmode ; /* 仮想記憶モード */
#if 0
#ifdef DJ
#ifndef SCANNER
extern int virtualmode ; /* 仮想記憶モード */
#endif
#else
#ifdef GCC
register int virtualmode asm( "d7" ); /* 仮想記憶モード */
#else
#ifndef SCANNER
extern int virtualmode ; /* 仮想記憶モード */
#endif
#endif
#endif
#endif
/* プロトタイプ宣言 */
/*
proto -e -f atrread.c objread.c objatr.c temp.c > temp
proto -e -f framread.c matrix.c alloc.c virtual.c >> temp
*/
/* atrread.c */
extern Pointer(Atr*) atrread( char*, Pointer(Atr*) );
/* objread.c */
extern Pointer(Object*) objread( char*, Pointer(Object*) );
/* objatr.c */
extern int objatr( Pointer(Object*), Pointer(Atr*) );
/* temp.c */
extern void tempopen( char* );
extern Pointer(Object*) tempread( char*, Pointer(Object*) );
extern void tempclose( char* );
/* framread.c */
extern int frameopen( char* );
extern void frameclose( void );
extern int frameskip( void );
extern Frame *frameread( Pointer(Object*) );
#if 1 /* 1995.08.08 */
extern Frame *frameread2( int *, char *** );
#endif
#ifdef INLINE_MATRIX
#include "matrix.c"
#else
/* matrix.c */
extern void m_print( Matrix );
extern void m_unit( Matrix );
extern void m_mov( Matrix, Vector );
extern void m_rot( Matrix, int, Float );
extern void m_scal( Matrix, Point );
extern void m_vec( Matrix, Vector, Vector );
extern void m_copy( Matrix, Matrix );
extern void m_mult( Matrix, Matrix, Matrix );
extern void vec_mult_mat( Vector*, Vector*, Matrix, int, int );
extern void m_trans( Matrix, Matrix );
extern int m_inv( Matrix, Matrix );
#endif
#ifdef INLINE_VECTOR
#include "vector.c"
#else
/* vector.c */
extern void v_copy( Vector, Vector );
extern void v_print( char*, Vector );
extern void ftov( Vector, Float, Float, Float );
extern Float v_length( Vector );
extern void v_unit( Vector, Vector );
extern Float s_pro( Vector, Vector );
extern void v_pro( Vector, Vector, Vector );
extern void v_mult( Vector, Vector, Vector );
extern void v_add( Vector, Vector, Vector );
extern void v_sub( Vector, Vector, Vector );
extern void v_s_mult( Vector, Vector, Float );
extern void c_copy( Color, Color );
extern void vtoc( Color, Vector );
extern void c_mult( Color, Color, Color );
extern void c_add( Color, Color, Color );
extern void c_s_mult( Color, Color, long );
#endif
/* alloc.c */
extern void meminit( long );
extern void *memalloc( int );
extern void *memaryalloc( int, int );
extern char *memmark( void );
extern void memrelease( char* );
extern long memsize( void );
extern long memgetsize(void);
extern long memallsize( void );
extern void *tempalloc( int );
extern void tempfree( void* );
extern void *temprealloc( void*, int );
extern int memcheck( void*, void*, int );
/* virtual.c */
#ifdef VIRTUAL
extern void virinit( char* );
extern Pointer viralloc( int );
extern Pointer viraryalloc( int, int );
extern Pointer virarynext( Pointer, int );
extern Pointer virmark( void );
extern void virrelease( Pointer );
extern long virsize( void );
extern int virlock( void );
extern void virunlock( int );
extern void *virpointer( Pointer );
extern int vircheck( Pointer, Pointer, int );
#endif