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 >
C/C++ Source or Header  |  1996-07-23  |  11KB  |  388 lines

  1. /*
  2.         CGA共通規格ファイル入力関数群
  3.  
  4.                 Copyright T.Kobayashi
  5. */
  6.  
  7. #ifndef TRUE
  8. #define FALSE    0
  9. #define TRUE    (!FALSE)
  10. #endif
  11.  
  12. #ifdef FLOAT
  13. #define Float float
  14. #else
  15. #define Float double
  16. #endif
  17.  
  18. #ifdef WINDOWS
  19.     #define MESSAGE
  20. #endif
  21. #ifdef MESSAGE
  22.     #define fprintf crtprintf
  23.     int     crtprintf(FILE * fp, const char * format, ...);
  24. #endif
  25.  
  26. #if defined(X68000)
  27.     #define    HUGE
  28.     #define    FAR
  29.     #define    nomalize_pointer( p )
  30.     #ifdef    GCC
  31.         #define    REGISTER
  32.         #ifdef __HAVE68881__
  33.             #include <math_68881.h>
  34.         #endif
  35.     #else
  36.         #define    REGISTER    register
  37.     #endif
  38.     #define tempfile temp_file
  39. #elif defined(DJ) || defined(UNIX) || defined(__WIN32__)
  40.     #undef HUGE
  41.     #define    HUGE
  42.     #define    FAR
  43.     #define    nomalize_pointer( p )
  44.     #define    REGISTER
  45. #elif defined(MSC)
  46.     #include <dos.h>
  47.     #define    HUGE    huge
  48.     #define    FAR        far
  49.     #define    nomalize_pointer( p ) {    FP_SEG( p ) += FP_OFF( p ) >> 4 ;\
  50.                                     FP_OFF( p ) = FP_OFF( p ) & 15 ; }
  51.     #define    REGISTER
  52.     #define interrupt interrupt_func
  53. #elif defined(__BORLANDC__)
  54.     #include <dos.h>
  55.     #define    HUGE    huge
  56.     #define    FAR        far
  57.     #define nomalize_pointer( p ) {p = (void far *)((char huge *)p + 0);}
  58.     #define    REGISTER
  59.     #define interrupt interrupt_func
  60. #else
  61. #error "MACHINE TYPE UNKNOWN!!"
  62. #endif
  63.  
  64. #ifndef    GCC
  65.     #define    volatile
  66.     #define    const
  67.     #define    inline
  68. #endif
  69.  
  70. #ifdef VIRTUAL
  71. #ifdef EMS
  72.     #include "..\ems\ems.h"
  73. #endif
  74.     typedef    unsigned long    Pointer ;
  75. #define    dataalloc( size )            ( virtualmode ? viralloc( size ) :\
  76.                                                         (Pointer)memalloc( size ) )
  77. #define    dataaryalloc( count, size )    ( virtualmode ? viraryalloc( count, size ) :\
  78.                                                         (Pointer)memaryalloc( count, size ) )
  79. #define    datamark()                    ( virtualmode ? virmark() : (Pointer)memmark() )
  80. #define    datarelease( mark )            {                                        \
  81.                                             if ( virtualmode )                    \
  82.                                                 virrelease( mark );                \
  83.                                             else                                \
  84.                                                 memrelease( (char*)mark );        \
  85.                                         }
  86. #define    datasize()                    ( virtualmode ? virsize() : memsize() )
  87. #define    datacheck                    vircheck
  88. #define    pointer( vp )                ( virtualmode ? virpointer( vp ) : (void*)(vp) )
  89. #define    datalock()                    ( virtualmode ? virlock() : 0 )
  90. #define    dataunlock( a )             { if ( virtualmode ) virunlock( a ); }
  91. #define Pointer(type)                Pointer
  92. #else
  93. /*    typedef    char            *Pointer ;*/
  94. #ifdef X68000
  95. #define    dataalloc        memalloc
  96. #else
  97. #include <assert.h>
  98. #define dataalloc(size) (assert((size)>0),assert(((size)%2)==0), memalloc(size))
  99. #endif
  100. #define    dataaryalloc    memaryalloc
  101. #define    datamark        memmark
  102. #define    datarelease        memrelease
  103. #define    datasize        memsize
  104. #define    datacheck        memcheck
  105. #define    pointer(p)        (p)
  106. #define    datalock()        (-1)
  107. #define    dataunlock( a )
  108. #define Pointer(type)                type
  109. #endif
  110.  
  111. #define MAXWORD            32        /*    1ワードの最長キャラクタ数    */
  112. #ifndef UNIX
  113. # define F_NAME_LEN        256        /*    ファイル名の長さ            */
  114. #else
  115. # include <stdio.h>
  116. # define F_NAME_LEN    FILENAME_MAX
  117. #endif
  118. #define MAX_FILE        64        /*    ファイル数の最大値            */
  119. #define    COLOR_SHIFT        15        /*  色情報のシフト数            */
  120. #define    COLOR_POINT        32768L    /*  色情報の小数点位置            */
  121.  
  122. #define MAXGRAD            20        /*    グラデーションデータの最大    */
  123. #if defined(MSC) || (!defined(__WIN32__) && defined(__BORLANDC__))
  124. #define MAXLIGHT        32        /*    光源の数の最大                */
  125. #else
  126. #define MAXLIGHT        1024        /*    光源の数の最大                */
  127. #endif
  128.  
  129. #define    ALLOC_TYPE_DATA    0
  130. #define    ALLOC_TYPE_TEMP    1
  131.  
  132.  
  133. /*    プリミティブのタイプ  */
  134. #define POLY            0        /*    ビット0:シェディング        */
  135. #define SHADE            1        /*    ビット1:UV座標            */
  136. #define UVPOLY            2
  137. #define UVSHADE            3
  138.  
  139. /*    マッピングのタイプ    */
  140. #define NO_MAP            0        /*    マッピングなし        */
  141. #define COLOR_MAP        1        /*    カラーマッピング    */
  142. #define BUMP_MAP        2        /*    バンプマッピング    */
  143.  
  144. /*    光源のタイプ  */
  145. #define LIGHT_POINT        0        /*    点光源            */
  146. #define LIGHT_PAL        1        /*    平行光線        */
  147. #define LIGHT_SPOT        2        /*    スポットライト    */
  148. #define LIGHT_OBJ        3        /*    発光体            */
  149.  
  150. /*    型の定義  */
  151. typedef Float            Matrix[4][4] ;    /*    行列                */
  152. typedef Float            Vector[3] ;        /*    ベクトル            */
  153. typedef Float            Point[3] ;        /*    座標                */
  154. typedef long            Color[3] ;        /*    色 ( R,G,B )        */
  155.  
  156.  
  157. /*    構造体の定義  */
  158.  
  159. /*    アトリビュート    */
  160. typedef struct    _Atr{
  161.         char        name[MAXWORD] ;            /*    アトリビュート名            */
  162.         Color        col ;                    /*    色                            */
  163.         Color        amb, dif, spc, size ;    /*    アトリビュートのパラメータ    */
  164.         Color        ref, tra, rfr, att ;    /*      (共通規格参照)            */
  165.         long        h ;                        /*    スペキュラーの色相            */
  166.         int            rgbflag ;                /*  パラメータフラグ            */
  167.         int            maptype ;                /*    マッピングのタイプ            */
  168.         char        filename[F_NAME_LEN] ;    /*    マッピング元の画像ファイル名*/
  169.         Float        mapwind[2][2] ;            /*    マッピングパラメータ        */
  170.         Float        mapview[2][2] ;
  171.         Float        mapsize[2][2] ;
  172.         Pointer(struct _Atr *)        next ;                    /*    次へのポインタ                */
  173.     }
  174.         Atr ;
  175.  
  176. typedef char    AtrName[MAXWORD] ;
  177.  
  178. /*    プリミティブ  */
  179. typedef struct    _Poly {
  180.         int                type ;        /*    プリミティブのタイプ    */
  181.         Pointer(Atr*)    atr ;        /*    アトリビュート            */
  182.         int                atrid ;        /*    アトリビュート番号        */
  183.         int                pointnum ;    /*    頂点数                    */
  184.         Pointer(Point*)     point ;        /*    頂点座標配列            */
  185.         Pointer(Vector*) vec ;        /*    法線ベクトル配列        */
  186.         Pointer(Vector*) uv ;        /*    UV座標配列            */
  187.         Float            coe[4] ;    /*    平面方程式の係数        */
  188.         Pointer(struct _Poly*)            next ;        /*    次へのポインタ            */
  189.     }
  190.         Poly ;
  191.  
  192. /*    オブジェクト  */
  193. typedef struct    _Object {
  194.         char        name[MAXWORD] ;        /*    オブジェクト名        */
  195.         int            atrnum ;            /*    アトリビュート数    */
  196.         Pointer(AtrName*)        atrname ;            /*    アトリビュート名    */
  197.         int            polynum ;            /*    ポリゴン数            */
  198.         Pointer(Poly*)        poly ;                /*    ポリゴン配列        */
  199.         Point        max, min ;            /*    座標最大値            */
  200.         Pointer(struct _ObjPos*)        objpos ;            /*    参照形状リスト        */
  201.         Pointer(struct _Object*)        next ;                /*    次のへのポインタ    */
  202.     }
  203.         Object ;
  204.  
  205. /*    オブジェクトの位置    */
  206. typedef struct    _ObjPos {
  207.         Pointer(Object*)        obj ;        /*    オブジェクト    */
  208.         Matrix        mat ;        /*    変換行列        */
  209.         Pointer(struct _ObjPos*)        next ;        /*    次へのポインタ    */
  210.     }
  211.         ObjPos ;
  212.  
  213. /*    グラデーション(環境)    */
  214. typedef struct    _Grad {
  215.         int        gradtype ;            /*    指定がなければ 0        */
  216.         Vector    vec ;                /*    ベクトル                */
  217.         int        colnum ;            /*    グラデーションの色数    */
  218.         Color    col[MAXGRAD] ;        /*    色                        */
  219.         Float    degree[MAXGRAD] ;    /*    角度                    */
  220.     }
  221.         Grad ;
  222.  
  223. /*    環境  */
  224. typedef struct    _Environ {
  225.         Color    back ;                /*    指定がなけれは 黒    */
  226.         int        star ;                /*    指定がなければ 0    */
  227.         Grad    grad ;
  228.         Float    depth ;                /*    指定がなければ 0    */
  229.         Color    depthcol ;
  230.         char    map[MAXWORD] ;        /*    指定がなければ ""    */
  231.     }
  232.         Environ ;
  233.  
  234. /*    視点のデータ  */
  235. typedef struct    _Eye {
  236.         Matrix    mat ;        /*    変換行列                */
  237.         Float    dist ;        /*    スクリーンまでの距離    */
  238.     }
  239.         Eye ;
  240.  
  241. /*    光源のデータ  */
  242. typedef struct    _Light {        /*    必要なパラメータだけセットする。*/
  243.         int        type ;            /*    光源のタイプ    */
  244.         Color    col ;            /*    光源の色        */
  245.         Float    dist ;            /* 距離            */
  246.         Vector    vec ;            /* 光の向き        */
  247.         Float    size ;            /*    光の広がり        */
  248.         Point    point ;            /* 光源の位置        */
  249.         char    name[MAXWORD] ; /*    光源物体        */
  250.     }
  251.         Light ;
  252.  
  253. /*    フレーム  */
  254. typedef struct    _Frame {
  255.         Environ env ;                /* 環境                */
  256.         Eye        eye ;                /*    視点                */
  257.         int        lightnum ;            /*    光源の数            */
  258.         Light    light[MAXLIGHT] ;    /*    光源                */
  259.         Pointer(ObjPos*)    objpos ;            /* オブジェクト位置    */
  260.     }
  261.         Frame ;
  262.  
  263. /*    大域変数  */
  264. #ifndef SCANNER
  265.     extern    int        warninglevel ;        /*    警告レベル            */
  266.     extern    int        end_of_file ;        /*    エンドオブファイル    */
  267.     extern    FILE    *errfp ;            /*    エラー出力ファイル    */
  268.     extern    Float    minscale ;            /*    最小の正数            */
  269. /*    By Taka2    */
  270.     extern    void    (*interrupt)(void);        /*  割り込みルーチン    */
  271. /*    By Taka2    */
  272.     extern    void    (*errorexec)(int);        /*  エラー処理ルーチン    */
  273. #endif
  274.  
  275.     extern    int        virtualmode ;                /*  仮想記憶モード        */
  276. #if 0
  277. #ifdef DJ
  278.     #ifndef SCANNER
  279.         extern    int        virtualmode ;                /*  仮想記憶モード        */
  280.     #endif
  281. #else
  282.     #ifdef    GCC
  283.         register    int        virtualmode asm( "d7" );    /*  仮想記憶モード        */
  284.     #else
  285.         #ifndef SCANNER
  286.             extern    int        virtualmode ;                /*  仮想記憶モード        */
  287.         #endif
  288.     #endif
  289. #endif
  290. #endif
  291.  
  292.  
  293. /*    プロトタイプ宣言    */
  294. /*
  295.     proto -e -f atrread.c objread.c objatr.c temp.c > temp
  296.     proto -e -f framread.c matrix.c alloc.c virtual.c >> temp
  297. */
  298.  
  299. /*  atrread.c  */
  300. extern    Pointer(Atr*)    atrread( char*, Pointer(Atr*) );
  301.  
  302. /*  objread.c  */
  303. extern    Pointer(Object*)    objread( char*, Pointer(Object*) );
  304.  
  305. /*  objatr.c  */
  306. extern    int        objatr( Pointer(Object*), Pointer(Atr*) );
  307.  
  308. /*  temp.c  */
  309. extern    void    tempopen( char* );
  310. extern    Pointer(Object*)    tempread( char*, Pointer(Object*) );
  311. extern    void    tempclose( char* );
  312.  
  313. /*  framread.c  */
  314. extern    int        frameopen( char* );
  315. extern    void    frameclose( void );
  316. extern    int        frameskip( void );
  317. extern    Frame    *frameread( Pointer(Object*) );
  318. #if 1 /* 1995.08.08 */
  319. extern    Frame    *frameread2( int *, char *** );
  320. #endif
  321.  
  322. #ifdef INLINE_MATRIX
  323. #include "matrix.c"
  324. #else
  325. /*  matrix.c  */
  326.     extern    void    m_print( Matrix );
  327.     extern    void    m_unit( Matrix );
  328.     extern    void    m_mov( Matrix, Vector );
  329.     extern    void    m_rot( Matrix, int, Float );
  330.     extern    void    m_scal( Matrix, Point );
  331.     extern    void    m_vec( Matrix, Vector, Vector );
  332.     extern    void    m_copy( Matrix, Matrix );
  333.     extern    void    m_mult( Matrix, Matrix, Matrix );
  334.     extern    void    vec_mult_mat( Vector*, Vector*, Matrix, int, int );
  335.     extern    void    m_trans( Matrix, Matrix );
  336.     extern    int        m_inv( Matrix, Matrix );
  337. #endif
  338. #ifdef INLINE_VECTOR
  339. #include "vector.c"
  340. #else
  341. /*  vector.c  */
  342.     extern    void    v_copy( Vector, Vector );
  343.     extern    void    v_print( char*, Vector );
  344.     extern    void    ftov( Vector, Float, Float, Float );
  345.     extern    Float    v_length( Vector );
  346.     extern    void    v_unit( Vector, Vector );
  347.     extern    Float    s_pro( Vector, Vector );
  348.     extern    void    v_pro( Vector, Vector, Vector );
  349.     extern    void    v_mult( Vector, Vector, Vector );
  350.     extern    void    v_add( Vector, Vector, Vector );
  351.     extern    void    v_sub( Vector, Vector, Vector );
  352.     extern    void    v_s_mult( Vector, Vector, Float );
  353.     extern    void    c_copy( Color, Color );
  354.     extern    void    vtoc( Color, Vector );
  355.     extern    void    c_mult( Color, Color, Color );
  356.     extern    void    c_add( Color, Color, Color );
  357.     extern    void    c_s_mult( Color, Color, long );
  358. #endif
  359. /*  alloc.c  */
  360. extern    void    meminit( long );
  361. extern    void    *memalloc( int );
  362. extern    void    *memaryalloc( int, int );
  363. extern    char    *memmark( void );
  364. extern    void    memrelease( char* );
  365. extern    long    memsize( void );
  366. extern    long    memgetsize(void);
  367. extern    long    memallsize( void );
  368. extern    void    *tempalloc( int );
  369. extern    void    tempfree( void* );
  370. extern    void    *temprealloc( void*, int );
  371. extern    int        memcheck( void*, void*, int );
  372.  
  373. /*  virtual.c  */
  374. #ifdef    VIRTUAL
  375.     extern    void    virinit( char* );
  376.     extern    Pointer    viralloc( int );
  377.     extern    Pointer    viraryalloc( int, int );
  378.     extern    Pointer    virarynext( Pointer, int );
  379.     extern    Pointer    virmark( void );
  380.     extern    void    virrelease( Pointer );
  381.     extern    long    virsize( void );
  382.     extern    int        virlock( void );
  383.     extern    void    virunlock( int );
  384.     extern    void    *virpointer( Pointer );
  385.     extern    int        vircheck( Pointer, Pointer, int );
  386. #endif
  387.  
  388.