qmesh.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:6k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /*
  2.  * This file contains routines to support the SGI compatible quad-mesh
  3.  * primitve.
  4.  *
  5.  * Written By Linas Vepstas November 1991 
  6.  */
  7. #include <stdlib.h>
  8. struct _emu_qmesh_vertex_pair {
  9.    float ca[3];
  10.    float na[3];
  11.    float va[4];
  12.    float cb[3];
  13.    float nb[3];
  14.    float vb[4];
  15.    };
  16. #define QMESH 6
  17. static int bgnmode = 0;
  18. struct _emu_qmesh {
  19.    int num_vert;
  20.    struct _emu_qmesh_vertex_pair paira;
  21.    struct _emu_qmesh_vertex_pair pairb;
  22.    struct _emu_qmesh_vertex_pair *first_pair;
  23.    struct _emu_qmesh_vertex_pair *second_pair;
  24.    float defer_color[3];
  25.    float defer_normal[3];
  26. }  * _emu_qmesh_GC;
  27. #define COPY_THREE_WORDS(A,B) {
  28. struct three_words { long a, b, c; };
  29. *(struct three_words *) (A) = *(struct three_words *) (B);
  30. }
  31. #define COPY_FOUR_WORDS(A,B) {
  32. struct four_words { long a, b, c, d; };
  33. *(struct four_words *) (A) = *(struct four_words *) (B);
  34. }
  35. /* ================================================================= */
  36. void _emu_qmesh_InitGC (struct _emu_qmesh * tmp)
  37. {
  38.    tmp -> num_vert = 0;
  39.    tmp -> first_pair = & (tmp ->  paira);
  40.    tmp -> second_pair = & (tmp ->  pairb);
  41.    tmp -> defer_color[0] = 0.0;
  42.    tmp -> defer_color[1] = 0.0;
  43.    tmp -> defer_color[2] = 0.0;
  44.    tmp -> defer_normal[0] = 0.0;
  45.    tmp -> defer_normal[1] = 0.0;
  46.    tmp -> defer_normal[2] = 0.0;
  47. }
  48. /* ================================================================= */
  49. struct _emu_qmesh * _emu_qmesh_CreateGC (void) 
  50. {
  51.    struct _emu_qmesh * tmp;
  52.    tmp = (struct _emu_qmesh *) malloc (sizeof (struct _emu_qmesh));
  53.    _emu_qmesh_InitGC (tmp);
  54.    return (tmp);
  55. }
  56. /* ================================================================= */
  57. void _emu_qmesh_DestroyGC (void) 
  58. {
  59.    free (_emu_qmesh_GC);
  60. }
  61. /* ================================================================= */
  62. void _emu_qmesh_bgnqmesh (void) 
  63. {
  64.    _emu_qmesh_GC = _emu_qmesh_CreateGC ();
  65.    bgnmode = QMESH;
  66. }
  67. /* ================================================================= */
  68. void _emu_qmesh_endqmesh (void)
  69. {
  70.    _emu_qmesh_DestroyGC ();
  71.   bgnmode = 0;
  72. }
  73. /* ================================================================= */
  74. void _emu_qmesh_c3f (float c[3])  
  75. {
  76.    if (bgnmode == QMESH) {
  77.       COPY_THREE_WORDS (_emu_qmesh_GC -> defer_color, c); 
  78.    } else {
  79.       c3f (c);
  80.    }
  81. }
  82. /* ================================================================= */
  83. void _emu_qmesh_n3f (float n[3])  
  84. {
  85.    if (bgnmode == QMESH) {
  86.       COPY_THREE_WORDS (_emu_qmesh_GC -> defer_normal, n); 
  87.    } else {
  88.       n3f (n);
  89.    }
  90. }
  91. /* ================================================================= */
  92. void _emu_qmesh_v3f (float v[3])  
  93. {
  94.    int nv, even_odd, fs;
  95.    struct _emu_qmesh_vertex_pair *tmp;
  96.    if (bgnmode == QMESH) {
  97.       nv = _emu_qmesh_GC -> num_vert;
  98.       even_odd = nv %2;
  99.       fs = (nv %4) / 2;
  100.    
  101.       if (fs) {
  102.          if (even_odd) {
  103.             COPY_THREE_WORDS (_emu_qmesh_GC -> pairb.cb, 
  104.                               _emu_qmesh_GC -> defer_color); 
  105.             COPY_THREE_WORDS (_emu_qmesh_GC -> pairb.nb, 
  106.                               _emu_qmesh_GC -> defer_normal); 
  107.             COPY_THREE_WORDS (_emu_qmesh_GC -> pairb.vb, v); 
  108.             _emu_qmesh_GC -> pairb.vb [3] = 1.0;
  109.          } else {
  110.             COPY_THREE_WORDS (_emu_qmesh_GC -> pairb.ca, 
  111.                               _emu_qmesh_GC -> defer_color); 
  112.             COPY_THREE_WORDS (_emu_qmesh_GC -> pairb.na, 
  113.                               _emu_qmesh_GC -> defer_normal); 
  114.             COPY_THREE_WORDS (_emu_qmesh_GC -> pairb.va, v); 
  115.             _emu_qmesh_GC -> pairb.va [3] = 1.0;
  116.          }
  117.       } else {
  118.          if (even_odd) {
  119.             COPY_THREE_WORDS (_emu_qmesh_GC -> paira.cb, 
  120.                               _emu_qmesh_GC -> defer_color); 
  121.             COPY_THREE_WORDS (_emu_qmesh_GC -> paira.nb, 
  122.                               _emu_qmesh_GC -> defer_normal); 
  123.             COPY_THREE_WORDS (_emu_qmesh_GC -> paira.vb, v); 
  124.             _emu_qmesh_GC -> paira.vb [3] = 1.0;
  125.          } else {
  126.             COPY_THREE_WORDS (_emu_qmesh_GC -> paira.ca, 
  127.                               _emu_qmesh_GC -> defer_color); 
  128.             COPY_THREE_WORDS (_emu_qmesh_GC -> paira.na, 
  129.                               _emu_qmesh_GC -> defer_normal); 
  130.             COPY_THREE_WORDS (_emu_qmesh_GC -> paira.va, v); 
  131.             _emu_qmesh_GC -> paira.va [3] = 1.0;
  132.          }
  133.       }
  134.       
  135.       if (even_odd && (nv >= 3)) {
  136.          bgnpolygon ();
  137.          c3f ( _emu_qmesh_GC -> first_pair -> ca);
  138.          n3f ( _emu_qmesh_GC -> first_pair -> na);
  139.          v4f ( _emu_qmesh_GC -> first_pair -> va);
  140.          c3f ( _emu_qmesh_GC -> first_pair -> cb);
  141.          n3f ( _emu_qmesh_GC -> first_pair -> nb);
  142.          v4f ( _emu_qmesh_GC -> first_pair -> vb);
  143.          c3f ( _emu_qmesh_GC -> second_pair -> cb);
  144.          n3f ( _emu_qmesh_GC -> second_pair -> nb);
  145.          v4f ( _emu_qmesh_GC -> second_pair -> vb);
  146.          c3f ( _emu_qmesh_GC -> second_pair -> ca);
  147.          n3f ( _emu_qmesh_GC -> second_pair -> na);
  148.          v4f ( _emu_qmesh_GC -> second_pair -> va);
  149.          endpolygon ();
  150.    
  151.          /* swap the data buffers */
  152.          tmp = _emu_qmesh_GC -> first_pair;
  153.          _emu_qmesh_GC -> first_pair = _emu_qmesh_GC -> second_pair;
  154.          _emu_qmesh_GC -> second_pair = tmp;
  155.       }
  156.    
  157.       _emu_qmesh_GC -> num_vert ++;
  158.    } else {
  159.       v3f (v);
  160.    }
  161. }
  162. /* ================================================================= */