home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / REND.LZH / REND / EDGELIST.C < prev    next >
C/C++ Source or Header  |  1996-05-28  |  4KB  |  206 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <assert.h>
  4. #include "reader.h"
  5. #include "glib.h"
  6.  
  7. typedef struct    _Work {
  8.     int            x, y ;
  9.     long        z ;
  10.     AtrTable    *atr ;
  11. }
  12.     Work ;
  13.  
  14. static    int            polyid = 1 ;    /*    ポリゴンのid            */
  15. static    int            bufsize = 0 ;    /*    ワークバッファのサイズ    */
  16. static    Work        *work = NULL ;    /*    ワークバッファ            */
  17. static    ColorCode    code ;            /*    カラーコード            */
  18. #ifdef WIREVIEW
  19. extern    int        wiresize;
  20. #endif
  21.  
  22. /*
  23.     proto edgelist -s > temp
  24. */
  25. static    void    appendedgelist( Work*, Work*, unsigned char[3], int );
  26. static    void    DDAset( DDA*, int, int, int );
  27.  
  28. /*        エッジリストの初期化    */
  29. void    InitEdgeList()
  30. {
  31.     int        i ;
  32.  
  33.     for( i = 0 ; i < MAXLINE ; ++i )
  34.         EdgeBuf[i] = NULL ;
  35.     polyid = 1 ;
  36. }
  37.  
  38. /*        エッジリストの作成        */
  39. void    SetEdgeList( point, atrtable, n, patr )
  40. Point        *point ;    /*    頂点座標                */
  41. AtrTable    *atrtable ;    /*    アトリビュートデータ    */
  42. int            n ;            /*    頂点数                    */
  43. Pointer(Atr*)        patr ;        /*    アトリビュート            */
  44. {
  45.     int        i, mapflag ;
  46.     unsigned char    tra[3] ;
  47.     Work    *wp ;
  48.     Atr        *atr ;
  49.  
  50.     (*interrupt)();
  51.  
  52.     /*    ワークバッファのサイズチェック    */
  53.     if ( n > bufsize )
  54.     {
  55.         if ( bufsize > 0 )
  56.             tempfree( work );
  57.         bufsize = n ;
  58.         work = tempalloc( sizeof( Work ) * bufsize );
  59.     }
  60.  
  61.     /*  ワークバッファにコピー  */
  62.     wp = work ;
  63.     for( i = 0 ; i < n ; ++i )
  64.     {
  65.         wp->x = (int)( point[i][0] + minscale );
  66.         wp->y = (int)( point[i][1] + minscale );
  67.         wp->z = (long)point[i][2] ;
  68. /*        wp->z = (int)((double)(point[i][2])) ;*/
  69.         if ( ShadingModel == GOURAUD_SHADE )
  70.             wp->atr = atrtable + i ;
  71.         wp ++ ;
  72.     }
  73.  
  74.     if ( ShadingModel == FLAT_SHADE )
  75.         code = GetColorCode( &(atrtable->shade), NULL );
  76.  
  77.     /*  アトリビュート  */
  78.     atr = pointer( patr );
  79.     for( i = 0 ; i < 3 ; ++i )
  80.         tra[i] = (unsigned char)( ( atr->tra[i] * 128 ) >> COLOR_SHIFT );
  81.     mapflag = ( atr->maptype != NO_MAP );
  82.  
  83.     for( i = 0 ; i < n-1 ; ++i )
  84.         appendedgelist( work+i, work+i+1, tra, mapflag );
  85.     appendedgelist( work+n-1, work, tra, mapflag );
  86.  
  87.     polyid++ ;
  88. }
  89.  
  90. /*        エッジリストの追加    */
  91. static    void    appendedgelist( w1, w2, tra, mapflag )
  92. REGISTER    Work    *w1, *w2 ;
  93. unsigned char    tra[3] ;
  94. int        mapflag ;
  95. {
  96.     Work        *w ;
  97.     int            i, dx ;
  98.     long        dz ;
  99.     Pointer(EdgeList*)        p ;
  100.     REGISTER    int            dy ;
  101.     REGISTER    EdgeList    *edge ;
  102.  
  103.     /*    表示    */
  104. #ifdef WIREVIEW
  105.     if (wiresize > 0) {
  106.         unsigned short color;
  107.         if (wiresize > 1) {
  108.             color = ColorCodeToX68kcolor(code);
  109.         } else {
  110.             color = 0xfffe;
  111.         }
  112.         wirelineout(w1->x, w1->y, w2->x, w2->y, color);
  113.         return;
  114.     }
  115. #endif
  116.     if ( LineOutput != NULL )
  117.         (*LineOutput)( w1->x, w1->y, w2->x, w2->y );
  118.  
  119.     if ( w1->y == w2->y )
  120.         return ;
  121.  
  122.     /*    w1->y のほうが大きければ入れ替え  */
  123.     if ( w1->y > w2->y )
  124.     {
  125.         w = w1 ;
  126.         w1 = w2 ;
  127.         w2 = w ;
  128.     }
  129.     dx = w2->x - w1->x ;
  130.     dy = w2->y - w1->y ;
  131.     dz = w2->z - w1->z ;
  132.  
  133.     /*    エッジリストの確保    */
  134.     if ( ShadingModel == GOURAUD_SHADE )
  135.     {
  136.         if ( mapflag )
  137.             p = dataalloc( sizeof( EdgeList ) ) ;
  138.         else
  139.             p = dataalloc( sizeof( EdgeList ) - sizeof( MapTable ) );
  140.     }
  141.     else
  142.         p = dataalloc( sizeof( EdgeList ) - sizeof( ShadeTable ) - sizeof( MapTable ) );
  143.     edge = pointer( p );
  144.  
  145.     /*    データセット  */
  146.     edge->n = dy ;
  147.     DDAset( &(edge->dxdy), w1->x, dx, dy );
  148.     edge->z = w1->z ;
  149.     if ( dz > 0 )
  150.         edge->dzdy = ( dz + dy / 2 ) / dy ;
  151.     else
  152.         edge->dzdy = - ( ( - dz + dy / 2 ) / dy );
  153.     edge->polyid = polyid ;
  154.     edge->flag = FALSE ;
  155.     edge->code = code ;
  156.     edge->traflag = (char)( ! ( tra[0] == 0 && tra[1] == 0 && tra[2] == 0 ) );
  157.     for( i = 0 ; i < 3 ; ++i )
  158.         edge->tra[i] = tra[i] ;
  159.     if ( ShadingModel == GOURAUD_SHADE )
  160.     {
  161.         edge->shade = w1->atr->shade ;
  162.         if ( mapflag )
  163.         {
  164.             edge->mapflag = TRUE ;
  165.             edge->map = w1->atr->map ;
  166.             SetAtrStep( &( edge->shade ), &(w2->atr->shade),
  167.                         &( edge->map ), &(w2->atr->map), dy );
  168. #ifdef EXTENDMAP
  169.             SetAtrStepMap(w1->z, w2->z,
  170.                         &( edge->map ),   &(w2->atr->map), dy );
  171. #endif
  172.         }
  173.         else
  174.         {
  175.             edge->mapflag = FALSE ;
  176.             SetAtrStep( &( edge->shade ), &(w2->atr->shade), NULL, NULL, dy );
  177.         }
  178.     }
  179.  
  180.     /*    エッジリストの結合    */
  181.     edge->next = EdgeBuf[w1->y] ;
  182.     EdgeBuf[w1->y] = p ;
  183. }
  184.  
  185. /*    DDA のデータセット    */
  186. static    void    DDAset( dda, x, dx, dy )
  187. REGISTER    DDA     *dda ;
  188. int     x, dx, dy ;
  189. {
  190.     dda->x = x ;
  191.     dda->totalmod = dy / 2 ;
  192.     if ( dx < 0 )
  193.     {
  194.         dda->dxdy = - ( ( - dx ) / dy ) - 1 ;
  195.         dda->mod = dy - ( ( -dx ) % dy ) ;
  196.     }
  197.     else
  198.     {
  199.         dda->dxdy = dx / dy ;
  200.         dda->mod = dx % dy ;
  201.     }
  202.     dda->dy = dy ;
  203.     dda->dx = dx ;
  204. }
  205.  
  206.